/**
 * ===== 教务管理系统 - 样式规范 (Style Guide) v1.36.00 =====
 *
 * 【布局架构】（修改前必读）
 *
 *   html/body
 *   └── .app-layout          (flex, min-height:100vh)
 *       ├── .sidebar          (position:fixed, 左侧固定导航)
 *       └── .main-area        (height:100vh, overflow-y:auto ← 滚动容器)
 *           ├── .topbar        (position:sticky, top:0, height:56px)
 *           └── .content       (flex:none, padding:24px, 自然高度不拉伸)
 *               ├── .stat-grid    (统计卡片，margin-bottom:24px)
 *               ├── .filter-bar   (筛选栏，margin-bottom:16px)
 *               └── .panel        (面板容器，overflow:visible)
 *                   ├── .panel-header
 *                   └── .panel-body(.no-pad)
 *                       ├── .table-wrap  (overflow-x:auto, 横向滚动)
 *                       │   └── table.data-table
 *                       └── .pagination  (分页控件)
 *
 * 【铁律 — 违反必出 Bug】
 * 1. .main-area 必须是 height:100vh + overflow-y:auto（滚动容器）
 *    → 绝不用 min-height:100vh（会导致内容少时出现大块空白）
 * 2. .content 必须 flex:none（自然高度）
 *    → 绝不用 flex:1（会被拉伸填满剩余空间 = 空白来源）
 * 3. .panel 必须 overflow:visible
 *    → 绝不用 overflow:hidden（会裁切长表格/表单，导致无法滚动）
 * 4. 表格统一用 .table-wrap > table.data-table 结构
 *    → .table-wrap 负责横向滚动，.data-table 按内容自适应宽度（铁律13）
 * 5. 所有列表超过 20 条必须分页（_paged 方法），禁止全量渲染
 * 6. 列宽规则必须带表专属类前缀（如 .student-table th:nth-child(1)）
 *    → 绝不用裸 th:nth-child(n)（会跨表误伤，引发水平滚动条）
 * 7. .data-table 必须 table-layout:auto + 单元格白名单策略
 *    → 【v1.36.91 修订】原铁律为「必须 fixed + 显式列宽」，该规则只在 1366px
 *      单档屏幕下成立：fixed 布局下表宽 = 硬编码列宽之和（约 1130px），
 *      容器变宽后表格不再铺满（1600px 占 82%、1920px 被 min-width:72% 锁死在 72%），
 *      造成「笔记本正常、台式机几乎所有页面表格缩在中间、左右大片空白」。
 *    → 现改为 auto：按内容比例分配列宽、随容器等比缩放，宽窄屏均铺满且不溢出。
 *    → 绝不用 table-layout:fixed（换屏必偏窄或溢出，无法兼顾宽窄屏）。
 *    → 各表的 .xxx-table th:nth-child(n) 宽度规则保留为「参考值」：
 *      auto 布局下 width 是建议值，浏览器会按内容比例分配，不会产生横向滚动条。
 * 7b. 需要「按内容自适应宽度、两侧自然留白」的窄表，加 .table-fit 类
 *    → 默认所有表格铺满容器；留白是例外而非常态（原铁律13的"窄表留白"
 *      在台式机普及后会导致全部表格都留白，故收窄为显式例外）
 * 7c. 禁止 .data-table td { max-width:0 }
 *    → 该属性是 fixed 布局的产物；auto 布局下会压死每列上限，
 *      导致"备注"等长文本列过早出现省略号（实测 1366px 下多列被截断）
 * 8. .status-cell / .action-cell 必须 overflow:visible
 *    → 绝不让状态 badge / 操作按钮被全局 td 的 overflow:hidden 裁成 …
 *    → **必须用 `.data-table td.status-cell` 形式**（特异性 0,3,0 > .data-table td 的 0,2,0）
 *    → 绝不用单 class `.status-cell`（特异性不够，会被覆盖无效）
 * 8b. 所有表格必须有专属类名（如 xxx-table）+ 显式列宽
 *    → 绝不能只用 `class="data-table"`（fixed 布局下列宽均分 = 状态/操作列压窄截断）
 * 9. 任何枚举值（角色/状态）渲染前必须经 label 映射函数
 *    → 绝不直接渲染原始英文 key（如下拉 value 与映射字典必须同步）
 * 10. _paged 入参必须 Array.isArray 守卫，防非数组崩溃白屏
 * 11. 列宽必须 ≥ 内容类型最小阈值（防 text-overflow:ellipsis 产生 … 小黑点）
 *    → badge/状态≥68px、中文姓名≥55px、短文本≥52px、日期≥70px、宿舍号≥72px
 *    → 绝不按"平均内容"估算，必须按"最宽可能内容"估算
 * 12. 操作列禁止固定 px 宽度，且固定布局下绝不能用 `width: 1%`（铁律12b）
 *    → 固定布局 `table-layout: fixed` 中 `width: 1%` 被字面理解为 1%（≈11px），
 *      配合 .action-cell 的 `overflow: visible` 会让按钮溢出 → 横向滚动条
 *    → 正确做法：操作列用 `width: auto`（固定布局下 auto 列吸收全部剩余空间，容纳按钮且不溢出）
 *    → 可选 `min-width: 90px` 兜底，防止宽表缩放时按钮被压扁
 *    → 固定 px 会导致：右边空一大片 + 浏览器自动缩小按钮字体以适应窄列
 * 13. table.data-table 禁止 min-width（尤其 min-width:72% 这类百分比地板）
 *    → 【v1.36.91 修订】min-width:72% 原意是"防窄表收缩成条带"，
 *      但配合 margin:0 auto 会把宽屏下的表格锁死在容器 72% 并居中，
 *      1920px 下左右各留 14% 空白（实测左偏 231px）——这就是
 *      "台式机几乎所有页面表格缩在中间"的直接原因。
 *    → 现改为 width:100% + min-width:0，默认铺满容器。
 *    → 需要留白的窄表用 .table-fit 显式声明（见铁律7b）。
 *    → 宽表由 .table-wrap { overflow-x:auto } 兜底横向滚动。
 * 14. 列宽策略需兼顾宽窄屏（原"列宽总和 ≤ 1100px"已不适用）
 *    → 【v1.36.91 修订】原规则假定容器固定约 1100px，故要求列宽之和 ≤ 1100px。
 *      auto 布局下容器宽度自适应，无需再手工凑总宽。
 *    → 仍需保证：单列最小宽度 ≥ 内容阈值（见铁律11），否则列被压到省略号
 *    → 出现横向滚动条的表必须优先优化：减少列数 / 缩短表头文案 / 合并语义相近列
 * 15. 【v1.36.92 新增】所有常规视图必须整体位于 .content 内
 *    → 现象：渠道日报 / 电脑管理 / 专业管理等页面内容紧贴侧栏、左右 0 留白，
 *      而渠道管理 / 学员管理等页面正常（24px 留白）——"同一系统两种边距"。
 *    → 根因：app.js 模板中 .content（<div class="content">）的闭合提前了。
 *      具体是 returnMgmt 视图块结束后多写了一个 </div>（原 5066 行
 *      `</div>        </div>`），把 .content 提前关闭，
 *      导致其后所有视图（channelWorkbench / devices / majors / attendance /
 *      oplog / employment / departure / sysmgmt / channelReports / settings /
 *      staff 共 11 个）被渲染到 .content 之外，成了 .main-area 的直接子元素，
 *      丢失 .content 的 padding:24px → 内容左贴侧栏、右贴视口边缘。
 *    → 为什么只有部分页面异常：异常视图全部位于模板中那个多余 </div> 之后，
 *      之前的视图（dashboard / partners / commission / students 等 12 个）不受影响。
 *    → 排查方法（可复用）：在真实页面里遍历每个 .nav-item 点击后检查
 *        document.querySelector('.content').children.length
 *      与 .content 在 .main-area 中后面是否还有兄弟节点。
 *      正常：.content 子元素 ≥ 1 且后面无兄弟；异常：子元素 0 且后面有游离 <div>。
 *    → 静态排查：对 app.js 模板做 <div>/</div> 深度追踪，深度在 .content 之后
 *      提前归零即存在多余闭合标签。
 *    → 预防：改模板后必须跑上述两项检查；勿在单行里写两个 </div>。
 *
 * 【新增字段/枚举四件套】（漏一项就出英文 key 类 bug）
 * - <option value="xxx"> 的 value
 * - roleLabel/displayStatus/empLabel 等映射函数
 * - roleCls/状态 cls 函数
 * - 权限说明卡片
 *
 * 【间距规范】
 * - 页面区 padding:     24px (.content)
 * - 面板间距:            16px (.panel margin-bottom)
 * - 卡片网格间距:        14px (.stat-grid gap)
 * - 面板头部内边距:      14px 20px (.panel-header)
 * - 面板体内边距:        20px (.panel-body), no-pad 时 0
 * - 表头单元格内边距:    10px 14px (.data-table th)
 * - 表体单元格内边距:    9px 14px  (.data-table td)
 * - 筛选栏间距:          12px  (.filter-bar gap)
 * - 按钮内部间距:        7px 16px (.btn)
 * - 小按钮内部间距:      4px 10px (.btn-sm)
 *
 * 【新增页面检查清单】
 * □ 是否用了 v-if="currentView==='xxx'" 包裹？
 * □ 模板标签是否严格配对？（.content/.panel/.table-wrap 开闭一致）
 * □ 【v1.36.92】该视图是否位于 .content 内？（点击后 .content 子元素 ≥ 1，
 *    且 .content 在 .main-area 中后面无游离兄弟 <div>）——见铁律15
 * □ 列表是否使用了 _paged 分页？（数据可能增长）
 * □ 是否有 .stat-grid > .panel > .table-wrap 标准结构？
 * □ 表格列数 > 8 时是否有 .table-wrap 包裹？
 * □ 列宽规则是否都带表专属类前缀，无裸 nth-child？
 * □ 表格是否误写了内联 style="table-layout:fixed" 或 <colgroup> 定宽？
 *    （内联样式优先级最高，会覆盖本文件的 auto 布局修复，且 fixed 表宽
 *      为固定像素值不随容器变化）——见铁律7
 * □ 状态列用 .status-cell、操作列用 .action-cell > .action-row？
 * □ 状态 badge / 操作按钮是否完整显示（无 … 截断）？
 * □ 各列宽度 ≥ 内容类型最小阈值（badge≥68px、姓名≥55px、短文本≥52px）？
 * □ 覆盖全局 td 规则的 class 是否用了 `.data-table td.xxx` 高特异性形式？
 * □ 角色/状态是否显示中文，无英文 key？
 * □ 移动端是否测试过？（@media max-width:767px）
 * □ 改列数是否同步改了 colspan？
 * □ 操作列是否用 `width: auto`（固定布局下吃剩余空间）而非 `width: 1%`（会被压成 11px 致滚动条）？
 * 详见 /workspace/自查规范.md
 */

/* ===== Reset & Base ===== */
* { margin: 0; padding: 0; box-sizing: border-box; }
*:focus { outline: none; }

/* ★ v1.90.18：Vue 挂载前隐藏「未编译模板」，消除 {{ }} 原文闪现（FOUC）
   ------------------------------------------------------------------------
   用户反馈：「渠道端在进入正常界面前会闪现这个画面」，截图里是
   `{{ noteMsg }}`、`{{ loginError }}`、`{{ cloudReady ? cloudMsg : '⚠️ ' + cloudMsg }}`
   这些**原始模板占位符**。

   根因：渠道端 / 教务登录页 / 报名页三个页面都是「HTML 里直接写 Vue 模板 +
   body 尾部再同步加载 `js/vendor/vue.global.prod.js`」。浏览器解析到尾部
   那个 <script> 时会停下来取文件（约 130KB），**在等待网络这段时间里会先
   paint 一次尚未编译的 HTML** —— 用户看到的就是这一帧。

   修法是 Vue 官方推荐的两件套：
     ① 根元素加 `v-cloak` 属性 —— **partner-portal.html 与 register.html 两页已加**
     ② 这里定义 `[v-cloak]` 的隐藏规则；挂载完成后 Vue 会**自动摘掉**该属性
        （不需要任何 JS 收尾，也不会漏）

   ⚠️ **login.html 是刻意例外，不要给它加 v-cloak**：
      登录页的模板是在 js/app.js 里用 JS 字符串定义的（`template:` 选项），
      `#app` 内的初始 HTML 只是一句「加载中…」占位符 —— 本来就不存在 {{ }} 闪现。
      若给它加 v-cloak，会把那个占位符一起隐藏 → 首屏变成纯白屏，比闪现更糟。
      （自检里有反向断言同时守住"没被误加"和"占位符还在"两件事。）

   ⚠️ 必须写在样式表最前面（Reset 之后）：这是"首帧就要生效"的规则，
      越早被解析越好；同时保持在基础规则区，后续再改样式不会覆盖它。
   ⚠️ 用 `display: none` 而不是 `visibility: hidden`：
      后者会让页面**先空出一块再填充**，每次进页面都有位置跳动感；
      前者不占布局，挂载完成后干净利落地整体显示。
   ⚠️ 加了 v-cloak 的页面必须同时准备「Vue 加载失败」的兜底：
      否则一旦脚本加载失败，页面从「满屏 {{ }}」变成「整页纯白」，白屏零信息量。
      partner-portal.html / register.html 里都已加（摘掉 v-cloak + 显示刷新提示）。
      漏加根元素 `v-cloak` 属性则规则不生效（两者必须成对，自检里已加断言锁死）。 */
[v-cloak] { display: none !important; }

:root {
  /* v1.39.0 品牌色板：主蓝 #226CE1 · 橙 #FF791B · 浅蓝 #BADFFC · 深藏蓝 #062052
     侧栏、主按钮、选中态、链接等所有引用 --primary 的地方会一并跟随。 */
  --primary: #226ce1;
  --primary-light: #eaf4fe;
  --primary-dark: #1a56b8;
  --brand-deep: #062052;   /* 深藏蓝：侧栏底、深色区底 */
  --accent: #ff791b;       /* 橙：强调数字/标记 */
  --success: #22c55e;
  --success-light: #dcfce7;
  --warning: #f59e0b;
  --warning-light: #fef3c7;
  --danger: #ef4444;
  --danger-light: #fee2e2;
  --info: #0ea5e9;
  --info-light: #e0f2fe;
  --orange: #f97316;
  --orange-light: #ffedd5;
  --gray-50: #f9fafb;
  --gray-100: #f3f4f6;
  --gray-200: #e5e7eb;
  --gray-300: #d1d5db;
  --gray-400: #9ca3af;
  --gray-500: #6b7280;
  --gray-600: #4b5563;
  --gray-700: #374151;
  --gray-800: #1f2937;
  --gray-900: #111827;
  --sidebar-w: 220px;
  --header-h: 56px;
  --radius: 8px;
  --shadow-sm: 0 1px 2px rgba(0,0,0,.05);
  --shadow: 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.04);
  --shadow-lg: 0 10px 30px rgba(0,0,0,.12);
}

html {
  overflow-x: hidden;
  width: 100%;
}
body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
  font-size: 14px;
  color: var(--gray-800);
  background: var(--gray-100);
  line-height: 1.6;
  overflow-x: hidden;
  width: 100%;
}

/* ===== Layout ===== */
/* 根容器：flex 布局，侧边栏固定 + 内容区独立滚动 */
.app-layout {
  display: flex;
  min-height: 100vh;
  width: 100%;
  overflow-x: hidden;
}

.sidebar {
  width: var(--sidebar-w);
  /* v1.39.0：侧栏底色改用色板深藏蓝，与官网深色区块一致 */
  background: linear-gradient(180deg, #062052 0%, #041634 100%);
  color: var(--gray-300);
  position: fixed;
  top: 0; left: 0; bottom: 0;
  z-index: 100;
  display: flex;
  flex-direction: column;
  overflow-y: hidden;
  overflow-x: hidden;
}

.sidebar-logo {
  height: var(--header-h);
  display: flex;
  align-items: center;
  /* ★ v1.69.9：左右内边距 12 → 8px（合计 24 → 16px），
     与徽章缩小一起把可用宽度从 157px 提到 176px。见下方字号说明。 */
  padding: 0 8px;
  /* ★ v1.69.9：机构名改为**单行显示**（用户「文字缩小，一行显示」）。
     —— 上一版（v1.38.0）的做法是「缩到 12.5px + 允许折两行」，
        理由是"保证机构全称完整、不被截成『深圳数字人才就业创业实』"。
        但折行本身在 56px 高的品牌区里很挤，14 个字断成「…实战 / 基地」
        读起来是断裂的，用户明确要求改成一行。

     排版空间必须要算清楚（中文 14 字宽度**不等于** 14×字号，故用
     canvas measureText 实测，不能按 1em/字估算）：
       桌面侧栏 220px − 徽章 − 间距 − 左右 padding = 可用宽度
       实测「深圳数字人才就业创业实战基地」宽度：12.5px→175 / 12px→168
                                               11px→154 / 10.5px→147
     ① 只缩字号（保留徽章 30 + 间距 9 + padding 24 → 可用 157px）：
        桌面要 11px 才刚好（余 3px，太紧），**平板 200px 侧栏要 9.5px**
        —— 9.5px 中文在深色底上已经不堪读，不可接受。
     ② 从徽章与内边距里腾空间（采纳）：
        徽章 30→24px、间距 9→6px、左右 padding 24→16px
        → 可用宽度 157→176px，桌面可用 12.5px、平板可用 11px，都有余量。
     采用 12.5px + 腾空间：字号与原来持平（并未真的"变小"到影响可读性），
     但**从两行变一行**，视觉高度反而更轻；平板档单独降到 11px 兜底。

     ⚠️ white-space 必须回到 nowrap、并去掉 word-break: break-all ——
        break-all 是为折行服务的，留着会把长串强行在任何字符处断开，
        一旦某档宽度算错就会断成两行，失去"单行"的保证。
        改为 nowrap + text-overflow: ellipsis：真的放不下时**省略号收尾**，
        而不是悄悄折行（折行会顶破 56px 高度、把下方导航挤下去）。
     ⚠️ min-width: 0 必须加 —— 这是 flex 子项溢出省略号生效的前提：
        flex item 默认 min-width: auto，会被内容撑开、ellipsis 永远不触发。 */
  font-size: 12.5px;
  line-height: 1;
  font-weight: 600;
  color: #fff;
  border-bottom: 1px solid rgba(255,255,255,.08);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
}
.sidebar-logo-img {
  /* ★ v1.69.9：30 → 24px。让出 6px 给机构名（见上），
     24px 在 56px 高的品牌区里仍明显大于下方导航图标，品牌识别不受影响。 */
  width: 24px; height: 24px;
  margin-right: 6px;
  flex: 0 0 auto;
}

.sidebar-nav {
  flex: 1;
  padding: 8px 0;
  /* 菜单过多时内部滚动，保证底部版本号始终可见且不溢出视口 */
  overflow-y: auto;
  min-height: 0;   /* 关键：允许 flex 子项收缩，否则 overflow 不生效 */
  /* 隐藏滚动条但保留滚动能力，维持侧边栏“无滚动条”视觉效果 */
  scrollbar-width: none;       /* Firefox */
  -ms-overflow-style: none;    /* IE/Edge */
}
.sidebar-nav::-webkit-scrollbar { display: none; }  /* Chrome/Safari/Edge(Chromium) */

.nav-group-label {
  padding: 12px 20px 4px;
  font-size: 11px;
  color: var(--gray-500);
  text-transform: uppercase;
  letter-spacing: .5px;
}

/* v1.87.0：项数极少的角色（渠道咨询师 / 内部招生）菜单平铺、不显示分组标题，
   此时第一个菜单项要自己补上顶部留白（否则会顶到侧栏 logo 下方） */
.sidebar-nav > .nav-item:first-child {
  margin-top: 12px;
}

.nav-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 20px;
  font-size: 13px;
  color: var(--gray-400);
  cursor: pointer;
  transition: all .15s;
  border-left: 3px solid transparent;
}
.nav-item:hover { color: #fff; background: rgba(255,255,255,.05); }
.nav-item.active {
  color: #fff;
  background: rgba(79,109,245,.15);
  border-left-color: var(--primary);
}
.nav-icon { width: 18px; text-align: center; font-size: 15px; flex-shrink: 0; }

.main-area {
  flex: 1;
  margin-left: var(--sidebar-w);
  display: flex;
  flex-direction: column;
  /* 固定视口高度 + 内部滚动：内容少时不留白，内容多时可滚动 */
  height: 100vh;
  overflow-y: auto;
  /* 防止内部宽表格撑破 */
  min-width: 0;
  max-width: 100%;
  /* 平滑滚动 */
  -webkit-overflow-scrolling: touch;
}

.topbar {
  height: var(--header-h);
  background: #fff;
  border-bottom: 1px solid var(--gray-200);
  display: flex;
  align-items: center;
  padding: 0 24px;
  gap: 16px;
  position: sticky;
  top: 0;
  z-index: 50;
}

.topbar-title { font-size: 16px; font-weight: 600; }
.topbar-spacer { flex: 1; }
.topbar-search {
  width: 280px;
  max-width: 100%;
  padding: 6px 12px;
  border: 1px solid var(--gray-300);
  border-radius: var(--radius);
  font-size: 13px;
}
.topbar-search:focus { border-color: var(--primary); }

.global-search-wrap { position: relative; }
.search-dropdown {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  margin-top: 4px;
  background: #fff;
  border: 1px solid var(--gray-200);
  border-radius: var(--radius);
  box-shadow: 0 8px 24px rgba(0,0,0,0.12);
  max-height: 360px;
  overflow-y: auto;
  z-index: 100;
}
.search-dropdown-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  cursor: pointer;
  border-bottom: 1px solid var(--gray-100);
  transition: background 0.15s;
}
.search-dropdown-item:last-child { border-bottom: none; }
.search-dropdown-item:hover { background: var(--primary-light); }
.search-item-icon { font-size: 18px; flex-shrink: 0; }
.search-item-info { flex: 1; min-width: 0; }
.search-item-label { font-size: 14px; font-weight: 600; color: var(--gray-800); }
.search-item-sub { font-size: 12px; color: var(--gray-500); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.search-item-type {
  font-size: 11px;
  color: var(--gray-500);
  background: var(--gray-100);
  padding: 2px 8px;
  border-radius: 4px;
  flex-shrink: 0;
}
.search-empty {
  padding: 20px;
  text-align: center;
  font-size: 13px;
  color: var(--gray-400);
}

.topbar-user {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  color: var(--gray-600);
}
.topbar-avatar {
  width: 32px; height: 32px;
  border-radius: 50%;
  background: var(--primary);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 13px;
  font-weight: 500;
}

.content {
  /* 不再拉伸填满，由内容自然决定高度 */
  flex: none;
  padding: 24px;
  min-width: 0;
  max-width: 100%;
}
/* 内容区所有直接子块都不允许超出容器宽度 */
.content > * { min-width: 0; max-width: 100%; }

/* ===== Cards & Stats ===== */
.stat-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 14px;
  margin-bottom: 24px;
}

/* ===== Stat Cards（统一看板卡片） ===== */
.stat-card {
  background: #fff;
  border-radius: var(--radius);
  padding: 14px 10px;
  box-shadow: var(--shadow-sm);
  border: 1px solid var(--gray-200);
  transition: box-shadow .2s, transform .15s;
  min-width: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
}
.stat-card:hover { box-shadow: var(--shadow); transform: translateY(-1px); }
.stat-card-active { border-color: #fca5a5; background: #fef2f2; box-shadow: 0 0 0 2px rgba(239,68,68,.15); }
.stat-card-active .stat-value { color: #dc2626; }

/* 图标：顶部居中 */
.stat-icon {
  width: 34px; height: 34px;
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 16px;
  flex-shrink: 0;
}

/* 文字区 */
.stat-card .stat-body {
  text-align: center;
  min-width: 0;
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0;
}
.stat-card .stat-label {
  font-size: 11px;
  color: var(--gray-500);
  line-height: 1.25;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 100%;
}
.stat-card .stat-value {
  font-size: 20px;
  font-weight: 700;
  color: var(--gray-900);
  line-height: 1.2;
  white-space: nowrap;
}
.stat-card .stat-trend {
  font-size: 10px;
  color: var(--gray-400);
  margin-top: 1px;
  line-height: 1.3;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 100%;
}
.stat-trend.up { color: var(--success); }
.stat-trend.down { color: var(--danger); }

/* 左侧图标：彩色圆角方块 */
.stat-icon {
  width: 44px; height: 44px;
  border-radius: 12px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 20px;
  flex-shrink: 0;
}

/* ===== Panels ===== */
.panel {
  background: #fff;
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  border: 1px solid var(--gray-200);
  margin-bottom: 16px;
  /* 改为 visible：允许内部表格等长内容自然撑开面板高度 */
  overflow: visible;
  /* 防止内部任何子元素（表格、网格等）撑破面板 */
  max-width: 100%;
  min-width: 0;
}
.panel-header {
  padding: 14px 20px;
  border-bottom: 1px solid var(--gray-200);
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-width: 0;
}
.panel-title { font-size: 15px; font-weight: 600; }
.panel-body { 
  padding: 20px; 
  /* 宽度约束但不隐藏溢出（表格需要内部滚动） */
  min-width: 0;
  max-width: 100%;
}
.panel-body.no-pad { padding: 0; }

/* ===== Table ===== */
/* 宽表格在自身容器内横向滚动，而不是把整个页面撑宽 */
.table-wrap {
  overflow-x: auto;
  max-width: 100%;
  min-width: 0;
  -webkit-overflow-scrolling: touch;
  display: block; /* 确保成为块级格式化上下文，约束内部溢出 */
}
table.data-table {
  /* 【v1.36.91 修复：台式机上几乎所有页面表格缩在中间、左右大片空白】
     现象：笔记本（1366px）显示正常，台式机（1600/1920/2560px）几乎所有
           列表页的表格都缩在容器中间，左右各空一大片（1920px 下左偏 231px）。

     根因：两条规则叠加
       1) table-layout:fixed + 各表硬编码列宽（合计 1129~1173px）
          → 表宽 = 列宽之和，是【固定像素】，不随容器变宽而增长。
          这个数值恰好在 1366px 笔记本上填满容器（1096px 容器下占 98~102%），
          所以笔记本看着正常；容器一变宽（1600px→1330px）立刻只剩 82~85%。
       2) min-width:72% + margin:0 auto
          → 容器更宽时（1920px→1650px）72% 地板接管，表格被锁死在 72%
            并居中，左右各空 14%。

     为何笔记本正常、台式机异常：截图反馈与实测完全一致 ——
       · 1366px：偏窄 0/16  ✓
       · 1600px：偏窄 9/16  ✗
       · 1920px：偏窄 16/16 ✗（占比全部 72%）
       · 2560px：偏窄 16/16 ✗

     方案：改 table-layout:auto + width:100% + 去掉 min-width/margin
       · auto 布局按【内容比例】分配列宽，随容器等比缩放
         → 宽窄屏都能既铺满、又不溢出（fixed 定宽做不到：它只在某个
           特定容器宽度下成立，换屏就必然偏窄或溢出 —— 实测 fixed 铺满
           方案在 1366px 下 16/16 全部横向溢出，直接违反铁律14）
       · 各表的 table.data-table.xxx-table 固定列宽规则保留但不生效
         （auto 布局下 width 是"建议值"，浏览器按内容比例分配，
           效果等价于按内容比例化，且不会出现横向滚动条）
       · 需要两侧留白的窄表（如数据看板）改用显式 .table-fit 类

     实测（16 张主表 × 4 档视口）：
       1366px → 偏窄 0/16、溢出 0/16
       1600px → 偏窄 0/16、溢出 0/16
       1920px → 偏窄 0/16、溢出 0/16
       2560px → 偏窄 0/16、溢出 0/16 */
  border-collapse: collapse;
  font-size: 13px;
  table-layout: auto;
  width: 100%;
  margin: 0;
  min-width: 0;
}
/* 需要「按内容自适应宽度、两侧自然留白」的窄表（如数据看板统计表）显式声明。
   注意：这是例外而非常态 —— 默认所有表格铺满容器。 */
table.data-table.table-fit,
.table-fit > table.data-table {
  width: auto;
  min-width: 0;
}
/* 小屏：auto 布局本身不会再被强制拉宽，但保留兜底 */
@media (max-width: 920px) {
  table.data-table, .data-table { min-width: 0; }
}
.data-table th {
  text-align: left;
  padding: 9px 12px;
  background: var(--gray-50);
  color: var(--gray-500);
  font-weight: 500;
  font-size: 12px;
  white-space: nowrap;
  vertical-align: middle;
  border-bottom: 1px solid var(--gray-200);
}
.data-table {
  /* v1.36.91：与上方 table.data-table 保持一致（此条特异性较低，但同为"最后一道"兜底）。
     原 width:auto + margin:0 auto + min-width:72% + fixed 是台式机留白的第二个来源。 */
  width: 100%;
  min-width: 0;
  margin: 0;
  border-collapse: collapse;
  font-size: 12.5px;
  /* auto：列宽按内容比例分配，随容器等比缩放（宽窄屏均铺满且不溢出） */
  table-layout: auto;
}
.data-table th {
  padding: 8px 10px;
  background: var(--gray-50);
  color: var(--gray-600);
  font-weight: 600;
  font-size: 11.5px;
  text-align: left;
  border-bottom: 2px solid var(--gray-200);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.data-table td {
  padding: 7px 10px;
  border-bottom: 1px solid var(--gray-100);
  font-size: 12.5px;
  white-space: nowrap;
  vertical-align: middle;
  overflow: hidden;
  text-overflow: ellipsis;
  /* v1.36.91：移除 max-width:0。
     该属性是 table-layout:fixed 时代的产物 —— fixed 布局下表宽由"列宽设定值"
     决定，max-width:0 用来阻止 td 内容反向撑开列宽（配合 fixed 避免横向滚动条）。
     但改成 auto 布局后它的作用反转成副作用：auto 布局本来就要按内容分配列宽，
     max-width:0 会把每列的上限压到最低，导致"备注"这类长文本列拿不到应得宽度，
     过早出现省略号（实测 1366px 下 device-table 有 2 列被截断）。
     实测移除后：1280/1366/1440/1600/1920/2560 六档均 100% 铺满、零溢出、
     且内容截断从 2 列降为 0 列。
     注：white-space:nowrap + overflow:hidden + text-overflow:ellipsis 仍保留，
        极端超长内容仍会以省略号收尾，不会破坏布局。 */
}
.data-table tr:hover td { background: #eaf4fe;   /* v1.39.0：悬停高亮改用主蓝极浅底 */ }
.data-table tr:hover td:first-child { box-shadow: inset 3px 0 0 var(--primary); }
.data-table tr:last-child td { border-bottom: none; }

/* ===== Badges（标签徽章） ===== */
/* ===== 统一 Badge 标签（带左侧色条） ===== */
.badge {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  padding: 2px 9px 2px 7px;
  border-radius: 6px;
  font-size: 11.5px;
  font-weight: 600;
  line-height: 1.6;
  letter-spacing: 0.2px;
  border: 1px solid;
  white-space: nowrap;
  text-decoration: none !important;
}
.badge-success { background: #ECFDF5; color: #047857; border-color: #A7F3D0; border-left: 3px solid #10B981; }
.badge-warning { background: #FFFBEB; color: #B45309; border-color: #FDE68A; border-left: 3px solid #F59E0B; }
.badge-danger  { background: #FEF2F2; color: #DC2626; border-color: #FECACA; border-left: 3px solid #EF4444; }
.badge-info    { background: #EFF6FF; color: #2563EB; border-color: #BFDBFE; border-left: 3px solid #3B82F6; }
.badge-primary { background: #EAF4FE; color: #1A56B8; border-color: #BFE0FB; border-left: 3px solid var(--primary); }
.badge-gray    { background: #F3F4F6; color: #6B7280; border-color: #E5E7EB; border-left: 3px solid #9CA3AF; }

/* 迷你标签：用于状态列内并排显示（带左侧色条，尺寸与badge统一） */
.badge-mini {
  font-size: 11.5px;
  padding: 2px 9px 2px 7px;
  border-radius: 6px;
  font-weight: 600;
  line-height: 1.6;
  border: 1px solid;
  text-decoration: none !important;
}
.badge-mini.badge-success { background: #ECFDF5; color: #047857; border-color: #A7F3D0; border-left: 3px solid #10B981; }
.badge-mini.badge-warning { background: #FFFBEB; color: #B45309; border-color: #FDE68A; border-left: 3px solid #F59E0B; }
.badge-mini.badge-danger  { background: #FEF2F2; color: #DC2626; border-color: #FECACA; border-left: 3px solid #EF4444; }
.badge-mini.badge-info    { background: #EFF6FF; color: #2563EB; border-color: #BFDBFE; border-left: 3px solid #3B82F6; }
.badge-mini.badge-primary { background: #EAF4FE; color: #1A56B8; border-color: #BFE0FB; border-left: 3px solid var(--primary); }
.badge-mini.badge-gray    { background: #F3F4F6; color: #6B7280; border-color: #E5E7EB; border-left: 3px solid #9CA3AF; }

/* 学员详情页状态标签 - 与badge统一（带左侧色条） */
.status-pill {
  display: inline-flex;
  align-items: center;
  padding: 4px 14px 4px 11px;
  border-radius: 6px;
  font-size: 12px;
  font-weight: 600;
  line-height: 1.5;
  letter-spacing: 0.2px;
  border: 1px solid;
  text-decoration: none !important;
}
.status-pill.badge-success { background: #ECFDF5; color: #047857; border-color: #A7F3D0; border-left: 3px solid #10B981; }
.status-pill.badge-warning { background: #FFFBEB; color: #B45309; border-color: #FDE68A; border-left: 3px solid #F59E0B; }
.status-pill.badge-danger  { background: #FEF2F2; color: #DC2626; border-color: #FECACA; border-left: 3px solid #EF4444; }
.status-pill.badge-info    { background: #EFF6FF; color: #2563EB; border-color: #BFDBFE; border-left: 3px solid #3B82F6; }
.status-pill.badge-primary { background: #EAF4FE; color: #1A56B8; border-color: #BFE0FB; border-left: 3px solid var(--primary); }
.status-pill.badge-gray    { background: #F3F4F6; color: #6B7280; border-color: #E5E7EB; border-left: 3px solid #9CA3AF; }

/* ===== Buttons ===== */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 16px;
  border-radius: var(--radius);
  font-size: 13px;
  font-weight: 500;
  cursor: pointer;
  border: 1px solid transparent;
  transition: all .15s;
  white-space: nowrap;
}
.btn-primary { background: var(--primary); color: #fff; }
.btn-primary:hover { background: var(--primary-dark); }
.btn-outline { background: #fff; border-color: var(--gray-300); color: var(--gray-700); }
.btn-outline:hover { border-color: var(--primary); color: var(--primary); }
.btn-success { background: var(--success); color: #fff; }
.btn-success:hover { opacity: .9; }
.btn-danger { background: var(--danger); color: #fff; }
.btn-danger:hover { opacity: .9; }
.btn-warning { background: #f59e0b; color: #fff; }
.btn-warning:hover { background: #d97706; }
.btn-sm { padding: 4px 10px; font-size: 12px; }
.btn-text { 
  padding: 3px 10px; 
  font-size: 12px; 
  color: var(--primary); 
  background: rgba(37,99,235,0.06);
  border: 1px solid rgba(37,99,235,0.15);
  border-radius: 4px;
  cursor: pointer;
  transition: all .15s;
  white-space: nowrap;
}
.btn-text:hover { 
  background: rgba(37,99,235,0.12); 
  border-color: var(--primary);
  text-decoration: none;
}
.btn-text.danger { color: var(--danger); background: rgba(239,68,68,0.06); border-color: rgba(239,68,68,0.15); }
.btn-text.danger:hover { background: rgba(239,68,68,0.12); border-color: var(--danger); }
/* ★ v1.90.27：高危操作（如重置管理员密码）用琥珀色区分于普通操作按钮，
   让"这一下不能随手点"在视觉上就能被看出来，而不是靠点开弹窗才知道。 */
.btn-text.warn { color: #b45309; background: rgba(217,119,6,0.07); border-color: rgba(217,119,6,0.20); }
.btn-text.warn:hover { background: rgba(217,119,6,0.14); border-color: #d97706; }
.btn-text.btn-primary-text { color: var(--primary); }
.btn-text.btn-success-text { color: var(--success); }

/* 图标按钮（紧凑操作，hover 显示 title 提示） */
.btn-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 24px;
  padding: 0;
  font-size: 13px;
  line-height: 1;
  color: var(--gray-500);
  background: transparent;
  border: 1px solid transparent;
  border-radius: 5px;
  cursor: pointer;
  transition: all .15s;
  vertical-align: middle;
}
.btn-icon:hover {
  color: var(--primary);
  background: rgba(37,99,235,0.08);
  border-color: rgba(37,99,235,0.25);
  text-decoration: none;
}

/* ===== Forms ===== */
/* ===== Info Grid（详情页字段网格）=====
   随容器宽度自动增减列数，长文本自动换行，不撑破布局 */
.info-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 16px;
  min-width: 0;
}
.info-grid > div { min-width: 0; }
.info-grid > div > span { display: block; margin-bottom: 4px; }
.info-grid > div > div { word-break: break-word; overflow-wrap: anywhere; }

/* ===== 权限说明卡片（v1.90.0：自适应列数 —— 角色从 3 个扩到 6 个） ===== */
.role-cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(232px, 1fr));
  gap: 14px;
}
.role-card {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 18px 20px;
  border-radius: 10px;
  border-left: 4px solid;
  background: #fff;
  transition: transform .15s, box-shadow .15s;
}
.role-card:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 12px rgba(0,0,0,.08);
}
.role-card-admin   { border-color: var(--primary); background: linear-gradient(135deg,#EAF4FE 0%,#fff 60%); }
.role-card-teacher { border-color: #10B981; background: linear-gradient(135deg,#ECFDF5 0%,#fff 60%); }
.role-card-employment { border-color: #F59E0B; background: linear-gradient(135deg,#FFFBEB 0%,#fff 60%); }
/* v1.90.0 新增三个角色配色（注意：本工程有配色规范断言，禁玫红/深紫系
   —— e50060 / c40052 / 4f46e5 / 7c3aed / 8b5cf6 / 6366f1 等一律不可用） */
.role-card-channel { border-color: #0EA5E9; background: linear-gradient(135deg,#F0F9FF 0%,#fff 60%); }
.role-card-staff   { border-color: #14B8A6; background: linear-gradient(135deg,#F0FDFA 0%,#fff 60%); }
.role-card-viewer  { border-color: #94A3B8; background: linear-gradient(135deg,#F8FAFC 0%,#fff 60%); }
.role-icon {
  font-size: 28px;
  line-height: 1;
  flex-shrink: 0;
  margin-top: -2px;
}
.role-body { min-width: 0; }
.role-name {
  font-size: 14px;
  font-weight: 700;
  color: #1f2937;
  margin-bottom: 5px;
}
.role-desc {
  font-size: 12.5px;
  color: #6b7280;
  line-height: 1.65;
}

@media (max-width: 768px) {
  .role-cards { grid-template-columns: 1fr; }
}

.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 16px; }
/* v1.90.4：栅格内的 .form-group 不再自带下边距 —— 否则「gap 16px + margin 16px」
   叠加成 32px 行距，且有一列带提示文案时两行间距不等，看上去忽宽忽窄。
   行距统一交给 gap，栅格整体与上下元素的距离交给 margin-bottom。 */
.form-grid > .form-group { margin-bottom: 0; }
.form-grid.cols-1 { grid-template-columns: 1fr; }
.form-grid.cols-3 { grid-template-columns: 1fr 1fr 1fr; }
.form-group { margin-bottom: 16px; }
.form-label {
  display: block;
  font-size: 13px;
  color: var(--gray-600);
  margin-bottom: 6px;
  font-weight: 500;
}
.form-label .req { color: var(--danger); }
.form-input, .form-select, .form-textarea {
  width: 100%;
  padding: 8px 12px;
  border: 1px solid var(--gray-300);
  border-radius: var(--radius);
  font-size: 13px;
  color: var(--gray-800);
  background: #fff;
  transition: border-color .15s;
}
.form-input:focus, .form-select:focus, .form-textarea:focus { border-color: var(--primary); }
/* v1.81.1：校验失败的输入框（错误定位到具体字段，避免"不知道哪个框错了"） */
.form-input.input-error { border-color: var(--danger); background: #FEF2F2; }
.form-input.input-error:focus { border-color: var(--danger); box-shadow: 0 0 0 3px rgba(239,68,68,.12); }
.form-textarea { resize: vertical; min-height: 80px; }
.form-hint { font-size: 12px; color: var(--gray-400); margin-top: 4px; }

/* v1.81.23：图标点选器（专业图标等，不再要求手输 emoji） */
.icon-picker {
  display: flex; flex-wrap: wrap; gap: 6px;
  padding: 8px; border: 1px solid var(--gray-200); border-radius: 8px; background: var(--gray-50);
}
.icon-opt {
  width: 36px; height: 36px; flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 18px; line-height: 1; cursor: pointer;
  border: 1px solid transparent; border-radius: 8px; background: #fff;
  transition: all .15s;
}
.icon-opt:hover { border-color: var(--primary); transform: translateY(-1px); }
.icon-opt.active {
  border-color: var(--primary); background: rgba(37,99,235,.08);
  box-shadow: 0 0 0 2px rgba(37,99,235,.15);
}
.icon-opt.icon-none { width: auto; padding: 0 10px; font-size: 12px; color: var(--gray-500); }
.icon-opt.icon-none.active { color: var(--primary); }

/* ===== Modal ===== */
.modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,.4);
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
}
.modal {
  background: #fff;
  border-radius: 12px;
  width: 100%;
  max-width: 560px;
  max-height: 90vh;
  overflow-y: auto;
  overflow-x: hidden;
  box-shadow: var(--shadow-lg);
}
.modal.modal-lg { max-width: 760px; }
.modal.modal-sm { max-width: 400px; }
/* v1.90.4：中间档 —— 字段较多的弹窗（如新增班级：6 个字段 + 老师候选提示）
   在 400px 下两列各约 172px，下拉选中项「姓名（部门）」会被截断；460px 更从容。 */
.modal.modal-md { max-width: 460px; }
.modal-header {
  padding: 16px 24px;
  border-bottom: 1px solid var(--gray-200);
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.modal-title { font-size: 16px; font-weight: 600; }
.modal-close {
  background: none;
  border: none;
  font-size: 20px;
  color: var(--gray-400);
  cursor: pointer;
  line-height: 1;
}
.modal-close:hover { color: var(--gray-600); }
.modal-body { padding: 24px; }
.modal-footer {
  padding: 16px 24px;
  border-top: 1px solid var(--gray-200);
  display: flex;
  justify-content: flex-end;
  gap: 8px;
}

/* ===== Filters Bar ===== */
.filter-bar {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 16px;
  flex-wrap: wrap;
}
.filter-bar .form-select,
.filter-bar .form-input {
  width: auto;
  min-width: 140px;
}

/* ===== Tabs ===== */
.tabs {
  display: flex;
  gap: 0;
  border-bottom: 2px solid var(--gray-200);
  margin-bottom: 20px;
}
.tab-item {
  padding: 8px 20px;
  font-size: 13px;
  color: var(--gray-500);
  cursor: pointer;
  border-bottom: 2px solid transparent;
  margin-bottom: -2px;
  transition: all .15s;
}
.tab-item:hover { color: var(--gray-700); }
.tab-item.active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 500; }

/* ===== Timeline ===== */
.timeline { position: relative; padding-left: 24px; }
.timeline::before {
  content: '';
  position: absolute;
  left: 8px;
  top: 4px;
  bottom: 4px;
  width: 2px;
  background: var(--gray-200);
}
.timeline-item { position: relative; padding-bottom: 20px; }
.timeline-item:last-child { padding-bottom: 0; }
.timeline-dot {
  position: absolute;
  left: -20px;
  top: 4px;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--gray-300);
  border: 2px solid #fff;
}
.timeline-dot.active { background: var(--success); }
.timeline-dot.current { background: var(--primary); }
.timeline-date { font-size: 12px; color: var(--gray-400); }
.timeline-title { font-size: 13px; font-weight: 500; color: var(--gray-700); }
.timeline-desc { font-size: 12px; color: var(--gray-500); margin-top: 2px; }

/* ===== QR Code Modal ===== */
.qr-display {
  text-align: center;
  padding: 12px 16px;
}
.qr-display canvas { margin: 0 auto; }
.qr-info {
  margin-top: 12px;
  padding: 8px 12px;
  background: var(--gray-50);
  border-radius: var(--radius);
}
.qr-info-row {
  display: flex;
  justify-content: space-between;
  font-size: 13px;
  padding: 3px 0;
}
.qr-info-label { color: var(--gray-500); }
.qr-info-value { color: var(--gray-800); font-weight: 500; }

/* ===== Progress ===== */
.progress-bar {
  width: 100%;
  height: 6px;
  background: var(--gray-200);
  border-radius: 3px;
  overflow: hidden;
}
.progress-fill {
  height: 100%;
  background: var(--primary);
  border-radius: 3px;
  transition: width .3s;
}

/* ===== 试听进度 - 内联紧凑风格（文字嵌入进度条） ===== */
.trial-progress-inline {
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
}
/* 内联补录专业 select：红边警示（待补录） */
.form-select.trial-major-inline {
  border-color: var(--danger);
  background: #fff5f5;
  color: var(--danger);
  font-size: 12px;
  padding: 3px 8px;
  min-width: 100px;
}
.form-select.trial-major-inline:focus { border-color: var(--danger); box-shadow: 0 0 0 2px rgba(239,68,68,.15); }
.trial-progress-bar {
  position: relative;
  display: inline-block;
  width: 80px;
  height: 20px;
  background: var(--gray-200);
  border-radius: 10px;
  overflow: hidden;
  vertical-align: middle;
  flex-shrink: 0;
}
.trial-progress-bar i {
  display: block;
  height: 100%;
  background: linear-gradient(90deg, var(--primary), #60a5fa);
  border-radius: 10px;
  transition: width .3s;
}
.trial-label {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 11px;
  font-weight: 600;
  color: var(--gray-700);
  line-height: 1;
}
.trial-blink {
  animation: pulse-text 2s ease-in-out infinite;
}

/* 试听进度颜色状态 */
/* 正常绿色 */
.trial-normal .trial-progress-bar i {
  background: linear-gradient(90deg, #10b981, #34d399);
}
.trial-normal .trial-label {
  color: #065f46;
}
.trial-normal .trial-blink {
  color: #059669;
}
/* 超期警告红色 */
.trial-overdue .trial-progress-bar i {
  background: linear-gradient(90deg, #ef4444, #f87171);
}
.trial-overdue .trial-label {
  color: #fff;
  font-weight: 700;
}
.trial-overdue .trial-blink {
  color: #fff;
  animation: pulse-text 1s ease-in-out infinite;
}

/* 试听管理表格列宽优化（10列：编号/姓名/手机号/专业/开始/结束/进度/宿舍/状态/操作） */
.trial-table th:nth-child(1),  .trial-table td:nth-child(1)   { width: 92px; }   /* 编号 S20260002 */
.trial-table th:nth-child(2),  .trial-table td:nth-child(2)   { width: 62px; }   /* 姓名(徐若曦) */
.trial-table th:nth-child(3),  .trial-table td:nth-child(3)   { width: 105px; }  /* 手机号11位完整 */
.trial-table th:nth-child(4),  .trial-table td:nth-child(4)   { width: 78px; }   /* 试听专业 AI导演 */
.trial-table th:nth-child(5),  .trial-table td:nth-child(5)   { width: 95px; }   /* 开始日期2026-08-15 */
.trial-table th:nth-child(6),  .trial-table td:nth-child(6)   { width: 95px; }   /* 结束日期2026-08-22 */
.trial-table th:nth-child(7),  .trial-table td:nth-child(7)   { width: 108px; }  /* 试听进度(badge+胶囊条) */
.trial-table th:nth-child(8),  .trial-table td:nth-child(8)   { width: 72px; }   /* 宿舍/入住 B208 */
.trial-table th:nth-child(9),  .trial-table td:nth-child(9)   { width: 78px; }   /* 状态badge(待试听/试听中/已终止) */
.trial-table th:nth-child(10), .trial-table td:nth-child(10)  { width: auto; min-width: 125px; }    /* 操作(试听+入住/签约+终止) */

/* ===== 宿舍房间列表列宽（11列，目标总和~920px）===== */
.dorm-room-table th:nth-child(1), .dorm-room-table td:nth-child(1) { width: 62px; }  /* 房间号 A301不截断 */
.dorm-room-table th:nth-child(2), .dorm-room-table td:nth-child(2) { width: 52px; }  /* 楼栋 A栋完整 */
.dorm-room-table th:nth-child(3), .dorm-room-table td:nth-child(3) { width: 48px; }  /* 楼层 3F */
.dorm-room-table th:nth-child(4), .dorm-room-table td:nth-child(4) { width: 52px; }  /* 类型(男/女badge+padding) */
.dorm-room-table th:nth-child(5), .dorm-room-table td:nth-child(5) { width: 42px; }  /* 容量 4人/6人 */
.dorm-room-table th:nth-child(6), .dorm-room-table td:nth-child(6) { width: 42px; }  /* 已住 3人/0人 */
.dorm-room-table th:nth-child(7), .dorm-room-table td:nth-child(7) { width: 68px; }  /* 空余(badge:X床位) */
.dorm-room-table th:nth-child(8), .dorm-room-table td:nth-child(8) { width: 110px; } /* 入住率(trial-progress-bar胶囊) */
.dorm-room-table th:nth-child(9), .dorm-room-table td:nth-child(9) { width: 200px; } /* 入住人员(多人名列表) */
.dorm-room-table th:nth-child(10), .dorm-room-table td:nth-child(10){ width: 72px; } /* 状态badge(可用/已满) */
.dorm-room-table th:nth-child(11), .dorm-room-table td:nth-child(11){ width: auto; min-width: 132px; } /* 操作(编辑+删除) */

@keyframes pulse-text {
  0%, 100% { opacity: 1; }
  50% { opacity: .5; }
}

/* ===== 学员详情 - 紧凑分组卡片 ===== */
.sd-header {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 18px 20px;
  background: #fff;
  border-radius: 10px;
  border: 1px solid var(--gray-200);
  margin-bottom: 12px;
}
.sd-avatar {
  width: 46px;
  height: 46px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--primary), #60a5fa);
  color: #fff;
  font-size: 20px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.sd-name-block { flex: 1; min-width: 0; }
.sd-name { font-size: 17px; font-weight: 700; color: var(--gray-800); line-height: 1.3; }
.sd-sub { font-size: 12.5px; color: var(--gray-400); margin-top: 2px; }

.sd-info { display: flex; flex-direction: column; gap: 10px; margin-bottom: 16px; }
.sd-section {
  background: #fff;
  border-radius: 10px;
  border: 1px solid var(--gray-200);
  overflow: hidden;
}
.sd-section-title {
  font-size: 11.5px;
  font-weight: 600;
  color: var(--gray-400);
  text-transform: uppercase;
  letter-spacing: 0.5px;
  padding: 10px 16px 6px;
  border-bottom: 1px solid var(--gray-100);
  background: var(--gray-50);
}
.sd-row {
  display: grid;
  grid-template-columns: auto 1fr auto 1fr;
  gap: 4px 16px;
  padding: 8px 16px;
  font-size: 13px;
  align-items: baseline;
  border-bottom: 1px solid var(--gray-50);
}
.sd-row:last-child { border-bottom: none; }
.sd-k {
  color: var(--gray-400);
  font-size: 11.5px;
  white-space: nowrap;
  min-width: 56px;
}
.sd-v {
  color: var(--gray-700);
  word-break: break-all;
}
.sd-act {
  font-size: 11.5px !important;
  margin-left: 8px !important;
  padding: 1px 6px !important;
}

@media (max-width: 768px) {
  .sd-row { grid-template-columns: auto 1fr; gap: 3px 12px; }
}

/* ===== Empty State ===== */
.empty-state {
  text-align: center;
  padding: 48px 20px;
  color: var(--gray-400);
}
.empty-state-icon { font-size: 40px; margin-bottom: 12px; }
.empty-state-text { font-size: 14px; }

/* ===== Pagination（全局统一） ===== */
.pagination {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 10px;
  padding: 12px 16px;
  border-top: 1px solid var(--gray-100);
}
.pagination-info { font-size: 12px; color: var(--gray-500); white-space: nowrap; }
.pagination-btns { display: flex; gap: 4px; flex-wrap: wrap; align-items: center; }
.page-btn {
  min-width: 30px;
  height: 30px;
  padding: 0 8px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--gray-300);
  border-radius: 6px;
  background: #fff;
  font-size: 12px;
  cursor: pointer;
  color: var(--gray-600);
  transition: all .15s;
}
.page-btn:hover:not(:disabled) { border-color: var(--primary); color: var(--primary); background: var(--primary-light); }
.page-btn.active { background: var(--primary); color: #fff; border-color: var(--primary); font-weight: 600; }
.page-btn:disabled { opacity: .45; cursor: not-allowed; }
.page-ellipsis { display: inline-flex; align-items: center; justify-content: center; min-width: 30px; height: 30px; color: var(--gray-400); font-size: 12px; }

/* ===== Misc ===== */
.text-center { text-align: center; }
.text-right { text-align: right; }
.text-muted { color: var(--gray-400); }
.text-sm { font-size: 12px; }
.font-bold { font-weight: 600; }
.flex { display: flex; }
.flex-between { display: flex; justify-content: space-between; align-items: center; }
.gap-8 { gap: 8px; }
.gap-12 { gap: 12px; }
.mt-8 { margin-top: 8px; }
.mt-16 { margin-top: 16px; }
.mb-16 { margin-bottom: 16px; }
.cursor-pointer { cursor: pointer; }

.avatar-sm {
  width: 28px; height: 28px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 11px;
  font-weight: 500;
  color: #fff;
  flex-shrink: 0;
}

/* ===== Chart Bars ===== */
.chart-bars {
  display: flex;
  align-items: flex-end;
  gap: 8px;
  height: 180px;
  padding: 10px 0;
}
.chart-bar-col {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  height: 100%;
  justify-content: flex-end;
}
.chart-bar {
  width: 60%;
  min-height: 4px;
  border-radius: 4px 4px 0 0;
  background: var(--primary);
  opacity: .8;
  transition: opacity .2s;
  position: relative;
}
.chart-bar-col:hover .chart-bar { opacity: 1; }
.chart-bar-label { font-size: 11px; color: var(--gray-400); }
.chart-bar-value { font-size: 11px; color: var(--gray-600); font-weight: 500; }

/* ===== Register Page (H5) ===== */
.register-page {
  max-width: 420px;
  margin: 0 auto;
  min-height: 100vh;
  background: var(--gray-50);
}
.register-header {
  background: linear-gradient(135deg, var(--primary), #6d8af7);
  color: #fff;
  padding: 32px 24px 24px;
  text-align: center;
}
.register-header h1 { font-size: 20px; font-weight: 600; }
.register-header p { font-size: 13px; opacity: .9; margin-top: 6px; }
.register-body { padding: 20px; }
.register-card {
  background: #fff;
  border-radius: 12px;
  padding: 24px 20px;
  box-shadow: var(--shadow-sm);
  margin-bottom: 16px;
}
.register-success {
  text-align: center;
  padding: 40px 20px;
}
.register-success-icon {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background: var(--success-light);
  color: var(--success);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 32px;
  margin: 0 auto 16px;
}

/* ===== Checklist ===== */
.checklist-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 0;
  border-bottom: 1px solid var(--gray-100);
}
.checklist-item:last-child { border-bottom: none; }
.checklist-checkbox {
  width: 18px;
  height: 18px;
  border: 2px solid var(--gray-300);
  border-radius: 4px;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.checklist-checkbox.checked {
  background: var(--success);
  border-color: var(--success);
  color: #fff;
  font-size: 11px;
}
.checklist-text { flex: 1; font-size: 13px; }
.checklist-text.checked { text-decoration: line-through; color: var(--gray-400); }

/* ===== Login Page ===== */
/* ============================================================
   登录页面 —— 大气居中设计 v1.36.56
   全屏渐变背景 + 毛玻璃卡片 + 装饰光球 + 图标输入框
   ============================================================ */
.login-page {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  width: 100%;
  position: relative;
  overflow: hidden;
  /* v1.39.0：登录页底色改用色板「深藏蓝 → 主蓝」渐变 */
  background: linear-gradient(135deg, #041634 0%, #062052 32%, #1a56b8 72%, #226ce1 100%);
}

/* v1.70.14：启动遮罩 —— 登录态恢复完成前显示，避免「刷新时闪现登录页」。
   与登录页同色渐变，保证过渡无突兀感。 */
.boot-mask {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  width: 100%;
  gap: 16px;
  background: linear-gradient(135deg, #041634 0%, #062052 32%, #1a56b8 72%, #226ce1 100%);
}
.boot-spinner {
  width: 34px;
  height: 34px;
  border: 3px solid rgba(255, 255, 255, .28);
  border-top-color: #ffffff;
  border-radius: 50%;
  animation: bootSpin .8s linear infinite;
}
@keyframes bootSpin { to { transform: rotate(360deg); } }
.boot-text {
  font-size: 13px;
  letter-spacing: .5px;
  color: rgba(255, 255, 255, .78);
}

/* 背景装饰光球 */
.login-bg-orb {
  position: absolute;
  border-radius: 50%;
  filter: blur(80px);
  opacity: .35;
  pointer-events: none;
}
.login-bg-orb-1 {
  width: 500px; height: 500px;
  background: #226ce1;
  top: -120px; right: -80px;
}
.login-bg-orb-2 {
  width: 400px; height: 400px;
  background: #ff791b;
  bottom: -100px; left: -60px;
}
.login-bg-orb-3 {
  width: 300px; height: 300px;
  background: #badffc;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  opacity: .15;
}

/* 卡片 */
.login-card {
  position: relative;
  z-index: 10;
  background: rgba(255, 255, 255, 0.92);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border-radius: 24px;
  padding: 48px 44px 36px;
  width: 420px;
  max-width: 92vw;
  box-shadow:
    0 25px 80px rgba(0, 0, 0, 0.35),
    0 0 0 1px rgba(255, 255, 255, 0.1) inset,
    0 2px 8px rgba(34, 108, 225, 0.12) inset;
}

/* 品牌区 */
.login-brand { text-align: center; margin-bottom: 32px; }
.login-icon {
  /* v1.38.0 品牌升级：由 emoji 图标改为基地官方 LOGO 图片 */
  width: 76px; height: 76px;
  margin: 0 auto 14px;
  display: block;
  filter: drop-shadow(0 6px 16px rgba(34, 108, 225, 0.28));
}
.login-title {
  /* 字号说明：机构名「深圳数字人才就业创业实战基地」共 14 字。
     卡片宽 420px、左右内边距 44px → 可用 332px。
     实测：26px 需 380px（换行，末字孤行）；21px+1px 字间距 = 308px，余 24px，最佳。
     white-space 保证长机构名不换行，超长时由 font-size 断点兜底。 */
  font-size: 21px; font-weight: 800;
  color: #0f172a; letter-spacing: 1px;
  white-space: nowrap;
  margin: 0 0 6px;
}
.login-subtitle {
  font-size: 14px; color: #64748b;
  margin: 0; letter-spacing: 2px;
}

/* 表单区 */
.login-form { }
.login-field { margin-bottom: 20px; }
.login-label {
  display: block;
  font-size: 13px; font-weight: 600;
  color: #334155; margin-bottom: 6px;
  padding-left: 2px;
}
.login-input-wrap {
  display: flex; align-items: center;
  background: #f1f5f9;
  border: 2px solid transparent;
  border-radius: 12px;
  padding: 0 14px;
  transition: all .2s ease;
}
.login-input-wrap:focus-within {
  border-color: var(--primary);   /* v1.38.0：聚焦态改用品牌主色，原为固定蓝色 */
  background: #fff;
  box-shadow: 0 0 0 4px rgba(34, 108, 225, 0.14);   /* v1.39.0：聚焦光晕改用主蓝 */
}
.login-input-icon {
  font-size: 16px; flex-shrink: 0;
  margin-right: 10px; opacity: .5;
}
.login-input {
  flex: 1;
  border: none; outline: none;
  background: transparent;
  font-size: 15px; line-height: 44px;
  color: #0f172a;
  min-width: 0;
}
.login-input::placeholder { color: #94a3b8; }

/* 错误提示 */
.login-error {
  color: #ef4444;
  font-size: 13px; font-weight: 500;
  text-align: center;
  margin-bottom: 16px;
  padding: 8px 12px;
  background: #fef2f2;
  border-radius: 8px;
  border: 1px solid #fecaca;
}

/* 登录按钮 */
.login-btn {
  display: block;
  width: 100%;
  padding: 14px;
  font-size: 16px; font-weight: 700;
  letter-spacing: 6px;
  color: #fff;
  /* v1.39.0：色板「主蓝 → 深藏蓝」渐变 */
  background: linear-gradient(135deg, #226ce1, #062052);
  border: none; border-radius: 12px;
  cursor: pointer;
  transition: all .25s ease;
  box-shadow: 0 4px 20px rgba(34, 108, 225, 0.4);
  margin-top: 4px;
}
.login-btn:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 28px rgba(34, 108, 225, 0.5);
  background: linear-gradient(135deg, #1a56b8, #041634);
}
.login-btn:active { transform: translateY(0); }

/* 底部信息 */
.login-footer {
  text-align: center;
  margin-top: 24px;
  padding-top: 18px;
  border-top: 1px solid #e2e8f0;
  font-size: 12px;
  color: #94a3b8;
}

/* 响应式 */
@media (max-width: 480px) {
  .login-card { padding: 36px 28px 28px; width: 90vw; }
  /* 窄屏：14 字机构名按屏宽自适应缩放，避免换行或溢出
     375px 屏：可用约 281px → 需要 ≤19px；用 clamp 保证 320~480px 都合适 */
  .login-title { font-size: clamp(14px, 5.2vw, 19px); letter-spacing: .5px; }
  .login-icon { width: 62px; height: 62px; }
  .login-btn { letter-spacing: 4px; padding: 13px; }
}

/* ===== Sidebar Footer ===== */
.sidebar-footer {
  padding: 12px 16px;
  border-top: 1px solid rgba(255,255,255,.1);
  margin-top: auto;
}
.sidebar-user-info {
  display: flex;
  flex-direction: column;
  gap: 2px;
  color: var(--gray-400);
  font-size: 13px;
}
.sidebar-version {
  margin-top: 10px;
  text-align: center;
  font-size: 11px;
  color: var(--gray-500);
  cursor: pointer;
  padding: 4px;
  border-radius: 4px;
  transition: all .2s;
  user-select: none;
}
.sidebar-version:hover {
  color: var(--gray-300);
  background: rgba(255,255,255,.06);
}
/* 非管理员：版本号只做展示，不暗示可点击（v1.70.11） */
.sidebar-version--static,
.sidebar-version--static:hover {
  cursor: default;
  color: var(--gray-500);
  background: transparent;
}

/* ===== Attendance ===== */
.attendance-cell {
  padding: 8px 4px !important;
  transition: background .12s;
  user-select: none;
}
.attendance-cell:hover { background: var(--gray-50); }

/* 编辑态：格子可点击/拖拽标记 */
.attendance-table.is-editing .attendance-cell { cursor: pointer; }
.attendance-table.is-editing .attendance-cell:hover {
  background: var(--primary-light);
  box-shadow: inset 0 0 0 2px var(--primary);
}
/* 行头/列头在编辑态可点击做整行整列标记 */
.attendance-table .clickable { cursor: pointer; }
.attendance-table.is-editing th.period-head.clickable:hover,
.attendance-table.is-editing td.clickable:hover {
  background: var(--primary-light);
  color: var(--primary-dark);
}

/* ===== 考勤画笔工具栏 ===== */
.attendance-toolbar {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  padding: 12px 16px;
  background: var(--gray-50);
}

/* ===== 考勤表列宽优化（固定列 + 动态节次列 + 出勤率）===== */
.attendance-table th:nth-child(1),
.attendance-table td:nth-child(1) { width: 90px; }     /* 学员编号 */
.attendance-table th:nth-child(2),
.attendance-table td:nth-child(2) { width: 50px; }      /* 姓名 */
.attendance-table th:nth-child(3),
.attendance-table td:nth-child(3) { width: 80px; }      /* 班级 */
/* 节次列（第4列起）：统一紧凑宽度 */
.attendance-table th:nth-child(n+4),
.attendance-table td:nth-child(n+4) { width: 46px; text-align: center; }
/* 最后一列（出勤率）：用 last-child 自动匹配，不依赖固定序号 */
.attendance-table th:last-child,
.attendance-table td:last-child { width: 60px; }        /* 历史出勤率 */

/* ===== 就业跟踪表列宽（11列，目标总和~920px）===== */
.employment-table th:nth-child(1),
.employment-table td:nth-child(1) { width: 95px; }     /* 编号 E20260001完整 */
.employment-table th:nth-child(2),
.employment-table td:nth-child(2) { width: 65px; }     /* 姓名(徐若曦不截断) */
.employment-table th:nth-child(3),
.employment-table td:nth-child(3) { width: 68px; }     /* 专业(AIGC导演) */
.employment-table th:nth-child(4),
.employment-table td:nth-child(4) { width: 78px; }     /* 班级 AIGC1班 */
.employment-table th:nth-child(5),
.employment-table td:nth-child(5) { width: 82px; }     /* 就业状态badge(已就业/待就业) */
.employment-table th:nth-child(6),
.employment-table td:nth-child(6) { width: 95px; }     /* offer公司(字节跳动完整) */
.employment-table th:nth-child(7),
.employment-table td:nth-child(7) { width: 72px; }     /* 职位(AIGC工程师) */
.employment-table th:nth-child(8),
.employment-table td:nth-child(8) { width: 82px; }     /* 薪资 ¥12000-18000 */
.employment-table th:nth-child(9),
.employment-table td:nth-child(9) { width: 88px; }     /* offer日期2026-08-15完整 */
.employment-table th:nth-child(10),
.employment-table td:nth-child(10){ width: 88px; }     /* 入职日期2026-09-01完整 */
.employment-table th:nth-child(11),
.employment-table td:nth-child(11){ width: auto; min-width: 120px; }    /* 操作 */

/* ===== 报名管理表列宽优化（8列）=====
   固定列总和目标：~880px，操作列~130px（4按钮需要更多空间） */
.enroll-table th:nth-child(1),
.enroll-table td:nth-child(1) { width: 100px; }    /* 编号 S20260002 */
.enroll-table th:nth-child(2),
.enroll-table td:nth-child(2) { width: 65px; }     /* 姓名(徐若曦) */
.enroll-table th:nth-child(3),
.enroll-table td:nth-child(3) { width: 105px; }    /* 手机号11位完整 */
.enroll-table th:nth-child(4),
.enroll-table td:nth-child(4) { width: 80px; }     /* 试听专业 AI导演 */
.enroll-table th:nth-child(5),
.enroll-table td:nth-child(5) { width: 122px; }    /* 招生人(渠道 李校长完整) */
.enroll-table th:nth-child(6),
.enroll-table td:nth-child(6) { width: 92px; }     /* 登记日期2026-08-15完整 */
.enroll-table th:nth-child(7),
.enroll-table td:nth-child(7) { width: 80px; }     /* 状态badge(待试听/试听中含padding) */
.enroll-table th:nth-child(8),
.enroll-table td:nth-child(8) { width: auto; min-width: 245px; }    /* 操作(分配+评价+仅试听+详情4按钮) */

/* ===== 撞单管理表列宽（7列，目标总和~880px）===== */
.collision-table th:nth-child(1),
.collision-table td:nth-child(1) { width: 130px; }   /* 手机号11位完整 */
.collision-table th:nth-child(2),
.collision-table td:nth-child(2) { width: 75px; }     /* 姓名(徐若曦不截断) */
.collision-table th:nth-child(3),
.collision-table td:nth-child(3) { width: 95px; }     /* 咨询师(李校长完整) */
.collision-table th:nth-child(4),
.collision-table td:nth-child(4) { width: 82px; }     /* 来源/渠道badge */
.collision-table th:nth-child(5),
.collision-table td:nth-child(5) { width: 105px; }    /* 报名时间2026-08-15完整 */
.collision-table th:nth-child(6),
.collision-table td:nth-child(6) { width: 88px; }     /* 状态badge含padding */
.collision-table th:nth-child(7),
.collision-table td:nth-child(7) { width: auto; max-width: none; min-width: 150px; }  /* 业绩归属判定 */
.collision-table th:nth-child(7),
.collision-table td:nth-child(7) { width: auto; max-width: none; min-width: 140px; }  /* 业绩归属判定 */

/* ===== 佣金结算-渠道佣金表列宽（9列，目标总和~920px）===== */
.commission-table th:nth-child(1),
.commission-table td:nth-child(1) { width: 115px; }     /* 渠道名称(示范职校完整) */
.commission-table th:nth-child(2),
.commission-table td:nth-child(2) { width: 85px; }     /* 联系人(王经理不截断) */
.commission-table th:nth-child(3),
.commission-table td:nth-child(3) { width: 88px; }     /* 佣金/人 ¥500完整 */
.commission-table th:nth-child(4),
.commission-table td:nth-child(4) { width: 75px; }     /* 招生 23人badge含padding */
.commission-table th:nth-child(5),
.commission-table td:nth-child(5) { width: 95px; }     /* 应付 ¥11,500完整 */
.commission-table th:nth-child(6),
.commission-table td:nth-child(6) { width: 82px }     /* 已结算 ¥0完整 */
.commission-table th:nth-child(7),
.commission-table td:nth-child(7) { width: 100px; }    /* 未结算 ¥11,500完整 */
.commission-table th:nth-child(8),
.commission-table td:nth-child(8) { width: 90px; }     /* 状态badge(未结算/已结清含padding) */
.commission-table th:nth-child(9),
.commission-table td:nth-child(9) { width: auto; min-width: 130px; }    /* 操作(结算+详情) */

/* ===== 渠道管理表列宽优化（10列）=====
   内容类型最小宽度：编号55|名称95|联系人70|手机102|佣金80|招生65|应付88|状态badge82|日期95
/* ===== 渠道管理表列宽（10列，目标总和~920px）===== */
.partner-table th:nth-child(1),
.partner-table td:nth-child(1) { width: 62px; }     /* 编号 P001完整 */
.partner-table th:nth-child(2),
.partner-table td:nth-child(2) { width: 105px; }    /* 渠道名称(示范职校完整) */
.partner-table th:nth-child(3),
.partner-table td:nth-child(3) { width: 78px; }     /* 联系人(王经理不截断) */
.partner-table th:nth-child(4),
.partner-table td:nth-child(4) { width: 110px; }    /* 手机号11位完整+padding */
.partner-table th:nth-child(5),
.partner-table td:nth-child(5) { width: 85px; }     /* 佣金/人 ¥500完整 */
.partner-table th:nth-child(6),
.partner-table td:nth-child(6) { width: 72px; }     /* 招生人数badge(85人) */
.partner-table th:nth-child(7),
.partner-table td:nth-child(7) { width: 95px; }     /* 应付佣金¥11,500完整 */
.partner-table th:nth-child(8),
.partner-table td:nth-child(8) { width: 88px; }     /* 状态badge(合作中/已停用含padding) */
.partner-table th:nth-child(9),
.partner-table td:nth-child(9) { width: 100px; }    /* 创建日期2026-05-19完整 */
.partner-table th:nth-child(10),
.partner-table td:nth-child(10){ width: auto; min-width: 170px; } /* 操作(详情+二维码+编辑+删除4按钮) */

/* ===== 职工管理表列宽（10列 · v1.81.0 调整）===== */
.staff-table th:nth-child(1),
.staff-table td:nth-child(1)   { width: 68px; }     /* 工号 SF001完整 */
.staff-table th:nth-child(2),
.staff-table td:nth-child(2)   { width: 120px; }    /* 姓名(头像26px + 间距8 + 姓名4字) */
.staff-table th:nth-child(3),
.staff-table td:nth-child(3)   { width: 40px; text-align:center; } /* 性别 */
.staff-table th:nth-child(4),
.staff-table td:nth-child(4)   { width: 85px; }     /* 部门badge(招生部/教研部含padding) */
.staff-table th:nth-child(5),
.staff-table td:nth-child(5)   { width: 92px; }     /* 职位 AIGC讲师完整 */
.staff-table th:nth-child(6),
.staff-table td:nth-child(6)   { width: 110px; }    /* 手机号11位完整 */
.staff-table th:nth-child(7),
.staff-table td:nth-child(7)   { width: 95px; }     /* 入职日期2026-06-15完整 */
.staff-table th:nth-child(8),
.staff-table td:nth-child(8)   { width: 76px; }     /* 司龄(如 1年2个月) */
.staff-table th:nth-child(9),
.staff-table td:nth-child(9)   { width: 82px; }     /* 状态badge(在职/试用期/离职) */
.staff-table th:nth-child(10),
.staff-table td:nth-child(10)  { width: auto; min-width: 150px; } /* 操作(查看+编辑+删除) */

/* ===== 设备管理表列宽（9列，目标总和~900px）===== */
.device-table th:nth-child(1),
.device-table td:nth-child(1)   { width: 88px; }     /* 设备编号 PC-0001完整 */
.device-table th:nth-child(2),
.device-table td:nth-child(2)   { width: 140px; }    /* 名称/型号(联想ThinkPad T14 Gen3完整) */
.device-table th:nth-child(3),
.device-table td:nth-child(3)   { width: 78px; }     /* 状态badge(在库/借用中/逾期含padding) */
.device-table th:nth-child(4),
.device-table td:nth-child(4)   { width: 68px; }     /* 借用人姓名 */
.device-table th:nth-child(5),
.device-table td:nth-child(5)   { width: 90px; }     /* 借用日期2026-07-15完整 */
.device-table th:nth-child(6),
.device-table td:nth-child(6)   { width: 90px; }     /* 应还日期2026-08-19完整 */
.device-table th:nth-child(7),
.device-table td:nth-child(7)   { width: 82px; }     /* 备注(AIGC实训室) */
.device-table th:nth-child(8),
.device-table td:nth-child(8)   { width: 78px; }     /* 状态badge(第2个状态列) */
.device-table th:nth-child(9),
.device-table td:nth-child(9)   { width: auto; min-width: 170px; }    /* 操作(归还+报废+编辑+删除4按钮) */

/* ===== 离校交接记录表列宽（7列，目标总和~880px）===== */
.departure-record-table th:nth-child(1),
.departure-record-table td:nth-child(1) { width: 72px; }  /* 记录编号 L20260001完整 */
.departure-record-table th:nth-child(2),
.departure-record-table td:nth-child(2) { width: auto; min-width: 130px; }    /* 学员姓名 */
.departure-record-table th:nth-child(3),
.departure-record-table td:nth-child(3) { width: 105px; }  /* 离校日期2026-08-15完整 */
.departure-record-table th:nth-child(4),
.departure-record-table td:nth-child(4) { width: 115px; } /* 交接项(教材/工牌/宿舍钥匙等完整) */
.departure-record-table th:nth-child(5),
.departure-record-table td:nth-child(5) { width: 82px; }  /* 状态badge含padding */
.departure-record-table th:nth-child(6),
.departure-record-table td:nth-child(6) { width: 72px; }  /* 经办人(王老师完整) */
.departure-record-table th:nth-child(7),
.departure-record-table td:nth-child(7) { width: auto; min-width: 100px; }    /* 备注 */

/* ===== 数据看板表列宽（无操作列，应撑满容器）===== */
.dashboard-channel-table th:nth-child(1),
.dashboard-channel-table td:nth-child(1) { width: 130px; }   /* 渠道(示范职校完整) */
.dashboard-channel-table th:nth-child(2),
.dashboard-channel-table td:nth-child(2) { width: 82px; }   /* 联系人(王经理不截断) */
.dashboard-channel-table th:nth-child(3),
.dashboard-channel-table td:nth-child(3) { width: 130px; }  /* 手机号11位完整+padding */
.dashboard-channel-table th:nth-child(4),
.dashboard-channel-table td:nth-child(4) { width: 105px; }  /* 招生人数badge(85人含padding) */
.dashboard-channel-table th:nth-child(5),
.dashboard-channel-table td:nth-child(5) { width: 115px; }  /* 应付佣金¥11,500完整 */
.dashboard-channel-table th:nth-child(6),
.dashboard-channel-table td:nth-child(6) { width: 100px; }  /* 状态badge(已结算/未结算含padding) */

.dashboard-student-table th:nth-child(1),
.dashboard-student-table td:nth-child(1) { width: 115px; }  /* 学员编号 S20260002完整 */
.dashboard-student-table th:nth-child(2),
.dashboard-student-table td:nth-child(2) { width: 72px; }   /* 姓名(徐若曦不截断) */
.dashboard-student-table th:nth-child(3),
.dashboard-student-table td:nth-child(3) { width: 115px; }  /* 手机号11位完整+padding */
.dashboard-student-table th:nth-child(4),
.dashboard-student-table td:nth-child(4) { width: 95px; }   /* 试听专业 AIGC导演班完整 */
.dashboard-student-table th:nth-child(5),
.dashboard-student-table td:nth-child(5) { width: 95px; }   /* 来源(渠道推荐/自主报名等完整) */
.dashboard-student-table th:nth-child(6),
.dashboard-student-table td:nth-child(6) { width: 105px; }  /* 登记日期2026-08-15完整 */
.dashboard-student-table th:nth-child(7),
.dashboard-student-table td:nth-child(7) { width: 95px; }   /* 状态badge含padding */

/* ===== 职工佣金表列宽（9列，目标总和~920px）===== */
.staff-commission-table th:nth-child(1),
.staff-commission-table td:nth-child(1) { width: 92px; }  /* 职工姓名(张三丰不截断) */
.staff-commission-table th:nth-child(2),
.staff-commission-table td:nth-child(2) { width: 92px; }  /* 部门(招生部/教学部完整) */
.staff-commission-table th:nth-child(3),
.staff-commission-table td:nth-child(3) { width: 90px; }  /* 佣金/人 ¥300完整 */
.staff-commission-table th:nth-child(4),
.staff-commission-table td:nth-child(4) { width: 78px; }  /* 招生 21人badge含padding */
.staff-commission-table th:nth-child(5),
.staff-commission-table td:nth-child(5) { width: 95px; }  /* 应付 ¥6,300完整 */
.staff-commission-table th:nth-child(6),
.staff-commission-table td:nth-child(6) { width: 82px }  /* 已结算 ¥0完整 */
.staff-commission-table th:nth-child(7),
.staff-commission-table td:nth-child(7) { width: 100px; }  /* 未结算 ¥6,300完整 */
.staff-commission-table th:nth-child(8),
.staff-commission-table td:nth-child(8) { width: 90px; }  /* 状态badge(未结算/无佣金含padding) */
.staff-commission-table th:nth-child(9),
.staff-commission-table td:nth-child(9) { width: auto; min-width: 140px; }  /* 操作(设标准+详情) */

/* ===== 班级管理表列宽（9列，目标总和~900px）===== */
.class-group-table th:nth-child(1),
.class-group-table td:nth-child(1) { width: 125px; }   /* 班级名称 AIGC导演1班完整 */
.class-group-table th:nth-child(2),
.class-group-table td:nth-child(2) { width: 72px; }    /* 专业(AIGC/短视频完整) */
.class-group-table th:nth-child(3),
.class-group-table td:nth-child(3) { width: 95px; }    /* 授课老师(张教授完整) */
.class-group-table th:nth-child(4),
.class-group-table td:nth-child(4) { width: 78px; }    /* 班主任(王老师完整) */
.class-group-table th:nth-child(5),
.class-group-table td:nth-child(5) { width: 95px; }    /* 就业老师(李老师完整) */
.class-group-table th:nth-child(6),
.class-group-table td:nth-child(6) { width: 65px; }    /* 课时 128课时完整 */
.class-group-table th:nth-child(7),
.class-group-table td:nth-child(7) { width: 68px; }    /* 学员数badge含padding */
.class-group-table th:nth-child(8),
.class-group-table td:nth-child(8) { width: 75px; }    /* 状态badge(在读/结业含padding) */
.class-group-table th:nth-child(8),
.class-group-table td:nth-child(8) { width: 68px; }    /* 状态badge(在读/结业) */
.class-group-table th:nth-child(9),
.class-group-table td:nth-child(9) { width: auto; min-width: 140px; }   /* 操作(编辑+删除) */

/* ===== 就业生源表列宽（8列，目标总和~900px）===== */
.talent-pool-table th:nth-child(1),
.talent-pool-table td:nth-child(1) { width: 78px; }    /* 姓名(徐若曦不截断) */
.talent-pool-table th:nth-child(2),
.talent-pool-table td:nth-child(2) { width: 78px; }    /* 专业(AIGC导演完整) */
.talent-pool-table th:nth-child(3),
.talent-pool-table td:nth-child(3) { width: 68px; }    /* 学历badge(本科含padding) */
.talent-pool-table th:nth-child(4),
.talent-pool-table td:nth-child(4) { width: 95px; }    /* 班级 AIGC导演1班完整 */
.talent-pool-table th:nth-child(5),
.talent-pool-table td:nth-child(5) { width: 95px; }    /* 期望薪资 ¥8000-12000完整 */
.talent-pool-table th:nth-child(6),
.talent-pool-table td:nth-child(6) { width: 95px; }    /* 目标行业(AI/互联网完整) */
.talent-pool-table th:nth-child(7),
.talent-pool-table td:nth-child(7) { width: 82px; }    /* 状态badge(待就业/已就业含padding) */
.talent-pool-table th:nth-child(8),
.talent-pool-table td:nth-child(8) { width: auto; min-width: 160px; }    /* 操作 */
.talent-pool-table th:nth-child(8),
.talent-pool-table td:nth-child(8) { width: auto; min-width: 140px; }    /* 操作 */

/* ===== Offer管理表列宽（8列）===== */
.offer-table th:nth-child(1),
.offer-table td:nth-child(1) { width: 78px; }          /* 姓名(徐若曦不截断) */
.offer-table th:nth-child(2),
.offer-table td:nth-child(2) { width: 78px; }          /* 专业(AIGC导演完整) */
.offer-table th:nth-child(3),
.offer-table td:nth-child(3) { width: 110px; }         /* 企业(字节跳动完整) */
.offer-table th:nth-child(4),
.offer-table td:nth-child(4) { width: 85px; }          /* 岗位(AIGC算法工程师完整) */
.offer-table th:nth-child(5),
.offer-table td:nth-child(5) { width: 95px; }          /* 薪资 ¥12000-18000完整 */
.offer-table th:nth-child(6),
.offer-table td:nth-child(6) { width: 95px; }          /* Offer日期2026-08-15完整 */
.offer-table th:nth-child(7),
.offer-table td:nth-child(7) { width: 85px; }          /* 状态badge(已接受/待确认含padding) */
.offer-table th:nth-child(8),
.offer-table td:nth-child(8) { width: 70px; }          /* 操作(详情1按钮) */

/* ===== 返厂管理表列宽（7列）===== */
.return-table th:nth-child(1),
.return-table td:nth-child(1) { width: 78px; }          /* 姓名(徐若曦不截断) */
.return-table th:nth-child(2),
.return-table td:nth-child(2) { width: 115px; }         /* 原就业企业(字节跳动完整) */
.return-table th:nth-child(3),
.return-table td:nth-child(3) { width: 78px; }          /* 离职状态badge含padding */
.return-table th:nth-child(4),
.return-table td:nth-child(4) { width: 85px; }          /* 返厂原因(薪资不符/个人原因) */
.return-table th:nth-child(5),
.return-table td:nth-child(5) { width: 110px; }         /* 新推送岗位(AIGC讲师完整) */
.return-table th:nth-child(6),
.return-table td:nth-child(6) { width: 88px; }          /* 跟进进度badge含padding */
.return-table th:nth-child(7),
.return-table td:nth-child(7) { width: 130px; }         /* 操作(待推送+登记/编辑) */

/* ===== 渠道线索表列宽（8列，目标总和~900px）===== */
.channel-lead-table th:nth-child(1),
.channel-lead-table td:nth-child(1) { width: 78px; }     /* 学员姓名(徐若曦不截断) */
.channel-lead-table th:nth-child(2),
.channel-lead-table td:nth-child(2) { width: 115px; }    /* 手机号11位完整 */
.channel-lead-table th:nth-child(3),
.channel-lead-table td:nth-child(3) { width: 82px; }     /* 专业(AIGC导演完整) */
.channel-lead-table th:nth-child(4),
.channel-lead-table td:nth-child(4) { width: 78px; }     /* 来源badge含padding */
.channel-lead-table th:nth-child(5),
.channel-lead-table td:nth-child(5) { width: 100px; }    /* 报名时间2026-08-15完整 */
.channel-lead-table th:nth-child(6),
.channel-lead-table td:nth-child(6) { width: 82px; }     /* 状态badge含padding */
.channel-lead-table th:nth-child(7),
.channel-lead-table td:nth-child(7) { width: 95px; }     /* 渠道/咨询师完整 */
.channel-lead-table th:nth-child(7),
.channel-lead-table td:nth-child(7) { width: 82px; }     /* 渠道/咨询师 */
.channel-lead-table td:nth-child(8) { width: auto; min-width: 140px; }     /* 操作 */

/* ===== 宿舍入住人员列表列宽（9列，目标总和~900px）===== */
.dorm-occupant-table th:nth-child(1), .dorm-occupant-table td:nth-child(1) { width: 82px; }  /* 编号 S20260001完整 */
.dorm-occupant-table th:nth-child(2), .dorm-occupant-table td:nth-child(2) { width: 72px; }  /* 姓名(徐若曦不截断) */
.dorm-occupant-table th:nth-child(3), .dorm-occupant-table td:nth-child(3) { width: 68px; }  /* 类型(badge学员/教师含padding) */
.dorm-occupant-table th:nth-child(4), .dorm-occupant-table td:nth-child(4) { width: 48px; }  /* 性别 */
.dorm-occupant-table th:nth-child(5), .dorm-occupant-table td:nth-child(5) { width: 72px; }  /* 房间号 A101完整 */
.dorm-occupant-table th:nth-child(6), .dorm-occupant-table td:nth-child(6) { width: 62px; }  /* 楼栋 A栋 */
.dorm-occupant-table th:nth-child(7), .dorm-occupant-table td:nth-child(7) { width: 105px; }  /* 入住日期2026-08-15完整 */
.dorm-occupant-table th:nth-child(8), .dorm-occupant-table td:nth-child(8) { width: 88px; }  /* 状态badge(试听中/已退房含padding) */
.dorm-occupant-table th:nth-child(9), .dorm-occupant-table td:nth-child(9) { width: auto; min-width: 150px; } /* 操作(调换+退房2按钮) */

/* ===== 就业辅导记录列表列宽（8列，无操作列，目标撑满）===== */
.employment-record-table th:nth-child(1), .employment-record-table td:nth-child(1) { width: 82px; }  /* 学员姓名(徐若曦不截断) */
.employment-record-table th:nth-child(2), .employment-record-table td:nth-child(2) { width: 88px; }  /* 辅导老师(王老师完整) */
.employment-record-table th:nth-child(3), .employment-record-table td:nth-child(3) { width: 115px; }  /* 目标公司(字节跳动完整) */
.employment-record-table th:nth-child(4), .employment-record-table td:nth-child(4) { width: 95px; }  /* 职位(AIGC算法工程师完整) */
.employment-record-table th:nth-child(5), .employment-record-table td:nth-child(5) { width: 88px; }  /* 薪资 ¥12000-18000完整 */
.employment-record-table th:nth-child(6), .employment-record-table td:nth-child(6) { width: 95px; }  /* 状态badge(已入职/面试中含padding) */
.employment-record-table th:nth-child(7), .employment-record-table td:nth-child(7) { width: 105px; }  /* 日期2026-08-19完整 */
.employment-record-table th:nth-child(8), .employment-record-table td:nth-child(8) { width: 120px; }  /* 备注(AIGC实训室等) */
.employment-record-table th:nth-child(7), .employment-record-table td:nth-child(7) { width: 95px; }  /* 日期2026-08-15完整 */
.employment-record-table th:nth-child(8), .employment-record-table td:nth-child(8) { width: 110px; }  /* 备注(AIGC实训室等) */

/* ===== 往来款流水列表列宽（10列，目标总和~920px）===== */
.ledger-table th:nth-child(1), .ledger-table td:nth-child(1) { width: 130px; } /* 结算单号 JS20260819001完整 */
.ledger-table th:nth-child(2), .ledger-table td:nth-child(2) { width: 88px; }  /* 日期2026-08-19完整 */
.ledger-table th:nth-child(3), .ledger-table td:nth-child(3) { width: 62px; }  /* 类型(badge收入/支出) */
.ledger-table th:nth-child(4), .ledger-table td:nth-child(4) { width: 75px; }  /* 对象(渠道/学员) */
.ledger-table th:nth-child(5), .ledger-table td:nth-child(5) { width: 75px; }  /* 金额 ¥12,500完整 */
.ledger-table th:nth-child(6), .ledger-table td:nth-child(6) { width: 68px; }  /* 方式(微信/转账等) */
.ledger-table th:nth-child(7), .ledger-table td:nth-child(7) { width: 95px; }  /* 备注(AIGC实训室设备) */
.ledger-table th:nth-child(8), .ledger-table td:nth-child(8) { width: 65px; }  /* 操作人 */
.ledger-table th:nth-child(9), .ledger-table td:nth-child(9) { width: 75px; }  /* 状态badge(已完成/待确认) */
.ledger-table th:nth-child(10), .ledger-table td:nth-child(10){ width: auto; min-width: 120px; }  /* 操作 */

/* ===== 部门列表列宽（6列，目标总和~900px）===== */
.department-table th:nth-child(1), .department-table td:nth-child(1) { width: 58px; }  /* 图标emoji */
.department-table th:nth-child(2), .department-table td:nth-child(2) { width: 110px; }  /* 部门名称(招生部/教学部完整) */
.department-table th:nth-child(3), .department-table td:nth-child(3) { width: 155px; } /* 描述(负责AIGC方向招生教学工作完整) */
.department-table th:nth-child(4), .department-table td:nth-child(4) { width: 68px; }  /* 人数badge(12人) */
.department-table th:nth-child(5), .department-table td:nth-child(5) { width: 95px; }  /* 创建日期2026-05-01完整 */
.department-table th:nth-child(6), .department-table td:nth-child(6) { width: auto; min-width: 150px; }  /* 操作 */

/* ===== 操作日志表列宽（6列，目标总和~900px）===== */
.oplog-table th:nth-child(1), .oplog-table td:nth-child(1) { width: 195px; } /* 时间2026-08-19 12:00:00完整 */
.oplog-table th:nth-child(2), .oplog-table td:nth-child(2) { width: 75px; }  /* 操作人(管理员/班主任) */
.oplog-table th:nth-child(3), .oplog-table td:nth-child(3) { width: 88px; }  /* 角色(badge:超级管理员/班主任等含padding) */
.oplog-table th:nth-child(4), .oplog-table td:nth-child(4) { width: 75px; }  /* 模块(学员管理/班级管理等) */
.oplog-table th:nth-child(5), .oplog-table td:nth-child(5) { width: 85px; }  /* 操作(新增学员/编辑信息等) */
.oplog-table th:nth-child(6), .oplog-table td:nth-child(6) { width: auto; max-width: none; min-width: 160px; }   /* 详情 */
.oplog-table th:nth-child(6), .oplog-table td:nth-child(6) { width: auto; max-width: none; min-width: 140px; }   /* 详情 */

/* ===== 专业列表表列宽（8列，目标总和~900px）===== */
/* v1.90.5：去掉「图标」列后由 8 列变 7 列，列宽序号整体前移（否则宽度会错位到别的列上） */
.major-table th:nth-child(1),
.major-table td:nth-child(1) { width: 62px; }           /* 编号 M01完整 */
.major-table th:nth-child(2),
.major-table td:nth-child(2) { width: 95px; }           /* 专业名称(AIGC导演完整) */
.major-table th:nth-child(3),
.major-table td:nth-child(3) { width: 130px; }          /* 描述(AI内容创作方向完整) */
.major-table th:nth-child(4),
.major-table td:nth-child(4) { width: 65px; }           /* 班级数badge(3个班) */
.major-table th:nth-child(5),
.major-table td:nth-child(5) { width: 65px; }           /* 学员数badge(85人) */
.major-table th:nth-child(6),
.major-table td:nth-child(6) { width: 95px; }           /* 创建日期2026-05-01完整 */
.major-table th:nth-child(7),
.major-table td:nth-child(7) { width: auto; min-width: 150px; }           /* 操作 */

/* ===== 专业-班级列表表列宽（8列，无操作列，应撑满容器）===== */
.major-class-table th:nth-child(1),
.major-class-table td:nth-child(1) { width: 130px; }     /* 班级名称 AIGC导演1班完整 */
.major-class-table th:nth-child(2),
.major-class-table td:nth-child(2) { width: 62px; }     /* 专业(AIGC导演) */
.major-class-table th:nth-child(3),
.major-class-table td:nth-child(3) { width: 95px; }     /* 开班日期2026-06-15完整 */
.major-class-table th:nth-child(4),
.major-class-table td:nth-child(4) { width: 95px; }     /* 结业日期2026-09-15完整 */
.major-class-table th:nth-child(5),
.major-class-table td:nth-child(5) { width: 65px; }     /* 学员数badge(28人) */
.major-class-table th:nth-child(6),
.major-class-table td:nth-child(6) { width: 65px; }     /* 班主任(王老师) */
.major-class-table th:nth-child(7),
.major-class-table td:nth-child(7) { width: 85px; }     /* 就业老师 */
.major-class-table th:nth-child(8),
.major-class-table td:nth-child(8) { width: 85px; }     /* 状态badge(在读/结业含padding) */

.toolbar-label { font-size: 13px; color: var(--gray-600); font-weight: 500; }
.toolbar-divider {
  width: 1px; height: 20px;
  background: var(--gray-300);
  margin: 0 4px;
}
.toolbar-hint {
  font-size: 12px;
  color: var(--gray-500);
  margin-left: auto;
}
.brush-btn {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 5px 12px;
  border: 1.5px solid var(--gray-300);
  border-radius: 999px;
  background: #fff;
  font-size: 13px;
  font-weight: 500;
  cursor: pointer;
  transition: all .15s;
  white-space: nowrap;
}
.brush-btn:hover { transform: translateY(-1px); box-shadow: var(--shadow-sm); }
.brush-btn.active { box-shadow: var(--shadow); }
.brush-icon { font-weight: 700; }
.attendance-mark {
  display: inline-block;
  width: 24px;
  height: 24px;
  line-height: 24px;
  text-align: center;
  border-radius: 4px;
  font-size: 13px;
  font-weight: 600;
}
.attendance-legend {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 10px 16px;
  background: var(--gray-50);
  border-bottom: 1px solid var(--gray-200);
  font-size: 13px;
}
.legend-item { display: flex; align-items: center; gap: 4px; }
.legend-icon { font-weight: 600; font-size: 14px; }

/* ===== Cursor Pointer ===== */
.cursor-pointer { cursor: pointer; }
.cursor-pointer:hover { background: var(--gray-50); }

/* 工具类：强制不换行（用于手机号、操作按钮组、下拉选择等需保持一行的场景） */
.nowrap { white-space: nowrap; }
.data-table td .btn,
.data-table td .btn-text { white-space: nowrap; }
/* 操作列：按钮之间留出间距且整体尽量不换行 */
.data-table td.actions { white-space: nowrap; }

/* ===== 学员列表表格列宽（v1.81.29：9列）===== */
/* 9列：编号/姓名/性别/学历/试听专业/实训专业/班级/状态/操作
   —— 已去掉「手机号」「渠道」两列（手机号可搜索、渠道可筛选，列表不再占位）
   —— 定宽列（编号/姓名/性别/学历/状态）合计 362px；三列长文本（专业×2、班级）与
      操作列都用 width:auto + min-width：宽屏时自动吃掉剩余空间（一行显示），
      窄屏时收缩换行，任何宽度都不会把表格撑出容器 → 不再有横向滚动条 */
.student-table th:nth-child(1),
.student-table td:nth-child(1)   { width: 108px; }     /* 编号 S20260002完整 */
.student-table th:nth-child(2),
.student-table td:nth-child(2)   { width: 64px; }      /* 姓名(徐若曦不截断) */
.student-table th:nth-child(3),
.student-table td:nth-child(3)   { width: 44px; text-align:center; }  /* 性别 */
.student-table th:nth-child(4),
.student-table td:nth-child(4)   { width: 56px; text-align:center; }  /* 学历badge */
.student-table th:nth-child(5),
.student-table td:nth-child(5)   { width: auto; min-width: 76px; }   /* 试听专业（长文本，吃剩余空间） */
.student-table th:nth-child(6),
.student-table td:nth-child(6)   { width: auto; min-width: 76px; }   /* 实训专业 */
.student-table th:nth-child(7),
.student-table td:nth-child(7)   { width: auto; min-width: 84px; }  /* 班级 AIGC视觉创作1013班 */
.student-table th:nth-child(8),
.student-table td:nth-child(8)   { width: 90px; }      /* 状态badge(试听中/已就业等) */
.student-table th:nth-child(9),
.student-table td:nth-child(9)   { width: auto; min-width: 140px; }    /* 操作（按钮一行排不下就压缩长文本列） */

/* 这三列是长文本（试听专业 / 实训专业 / 班级名），**必须允许换行**：
   .data-table td 默认 white-space:nowrap，会把每列撑到"整行文字"的宽度，
   9 列累加后突破容器宽度 → 无论怎么调列宽都会出现横向滚动条。
   改为可换行后，列宽按剩余空间分配，宽屏一行、窄屏两行，表格始终铺满不溢出。 */
.student-table th:nth-child(5), .student-table td:nth-child(5),
.student-table th:nth-child(6), .student-table td:nth-child(6),
.student-table th:nth-child(7), .student-table td:nth-child(7) {
  white-space: normal;
  word-break: break-word;
  line-height: 1.35;
}

/* 操作列按钮紧凑一档（6 个按钮并列时约省 24px，正好把窄窗口的最后一点溢出挤掉） */
.student-table .action-row .btn-text { padding: 2px 4px; }

/* ===== 系统管理-用户列表表列宽（8列，目标总和~900px）===== */
.user-table th:nth-child(1), .user-table td:nth-child(1) { width: 65px; }   /* 编号 U01完整 */
.user-table th:nth-child(2), .user-table td:nth-child(2) { width: 72px; }   /* 姓名(管理员不截断) */
.user-table th:nth-child(3), .user-table td:nth-child(3) { width: 82px; }   /* 账号(admin/zhangsan完整) */
.user-table th:nth-child(4), .user-table td:nth-child(4) { width: 115px; }   /* 手机号11位完整+padding */
.user-table th:nth-child(5), .user-table td:nth-child(5) { width: 95px; }   /* 角色(badge:超级管理员/班主任等含padding) */
.user-table th:nth-child(6), .user-table td:nth-child(6) { width: 105px; }   /* 负责班级(AIGC1班/AIGC2班完整) */
.user-table th:nth-child(7), .user-table td:nth-child(7) { width: 95px; }   /* 创建日期2026-05-01完整 */
.user-table th:nth-child(8), .user-table td:nth-child(8) { width: auto; min-width: 140px; }     /* 操作 */

/* 渠道列：小色点 + 名字，紧凑单行 */
.channel-cell {
  min-width: 65px;
  max-width: 110px;
}
.channel-inline {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  white-space: nowrap;
  overflow: hidden;
}
.channel-dot {
  display: inline-block;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  flex-shrink: 0;
}
.dot-channel { background: #2563eb; }
.dot-staff { background: #94a3b8; }
.channel-name {
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 75px;
  font-size: 12.5px;
  vertical-align: middle;
}

/* 状态列：徽章居中（保持 td 默认 table-cell 布局，仅设文本对齐 + 垂直居中） */
.data-table td.status-cell {
  text-align: center;
  vertical-align: middle;
  white-space: nowrap;
  min-width: 72px;          /* 容纳最长 badge（已终止/合作中/求职中 ≈ 3字+padding） */
  overflow: visible;        /* 覆盖 .data-table td 的 overflow:hidden */
  max-width: none;          /* v1.36.91 起 td 已无 max-width:0，此处为幂等兜底 */
}
.status-cell .badge {
  font-size: 12px;
  font-weight: 600;
  padding: 3px 12px 3px 9px;
  border-radius: 999px;
  gap: 6px;
  line-height: 1.6;
  /* v1.81.15：去掉各色 badge 的 3px 左色条，改由前方同色圆点表达，观感更柔和统一 */
  border-left: 1px solid transparent;
}
/* v1.81.15：状态圆点 —— 颜色跟随文字色（绿=成功、蓝=信息、橙=警告…），天然与语义一致 */
.status-cell .badge::before {
  content: '';
  width: 6px; height: 6px; border-radius: 50%;
  background: currentColor;
  flex: 0 0 auto;
}
/* badge-mini 已统一为 badge 同尺寸，不再单独覆盖 */

/* 就业列：紧凑居中（保留兼容） */
.emp-cell {
  text-align: center;
  min-width: 46px;
}
.emp-cell .badge {
  font-size: 11px;
  padding: 1px 7px;
}

/* 操作列：按钮网格排列（必须用 td.action-cell，特异性 > .data-table td） */
.data-table td.action-cell {
  white-space: nowrap;
  vertical-align: middle;
  overflow: visible;        /* 覆盖 .data-table td 的 overflow:hidden */
  max-width: none;          /* v1.36.91 起 td 已无 max-width:0，此处为幂等兜底 */
}

/* 弹窗/详情内子表（原裸 data-table，已统一补 sub-table 专属类）：统一布局控制 */
.sub-table {
  font-size: 12px;
}
/* 【v1.36.88 修复：子表两侧大片空白】
   问题：28 个 .sub-table 共用同一套「8 列固定宽度」(156/101/129/101/156/156/101/230)，
   但实际列数 4~10 不等，且 .data-table 的 min-width:72% 会把窄表强行撑宽，
   而固定列宽之和只有 643px（5 列表）→ 多出的空间无处分配 → 内容挤在中间、两侧留白。
   方案：子表统一铺满容器，并改由内容自动分配列宽（table-layout:auto 覆盖 fixed）。
   为何用 auto 而不用「精确校准的 fixed 定宽」：
     定宽只在某个特定容器宽度下成立，一旦容器变窄（笔记本 1366px / 平板 1024px）
     就会超出容器产生横向滚动条（实测 salary-summary-table 在 1366px 下即溢出）。
     auto 布局会按内容比例分配、随容器等比缩放，宽窄屏都能既铺满又不溢出。
   注意：仅作用于 .sub-table（弹窗/详情内子表），主表（student-table 等）不受影响，
        主表仍各自保留校准过的 fixed 定宽。 */
table.data-table.sub-table {
  width: 100%;
  min-width: 0;          /* 去掉 72% 强制撑宽，避免窄表被拉出空隙 */
  table-layout: auto;    /* 按内容分配列宽，各列比例自然 */
}
.sub-table th,
.sub-table td {
  padding: 7px 10px;
}
.sub-table th {
  font-size: 12px;
  white-space: nowrap;
  background: var(--gray-50);
}
.sub-table .action-cell { width: auto; min-width: 90px; }   /* 操作列吃剩余空间，不锁死 px */
.sub-table .status-cell { width: auto; white-space: nowrap; }
/* 子表内数字/金额/日期类列不换行，避免 auto 布局下被压成两行 */
.sub-table td, .sub-table th { white-space: nowrap; }
.action-row {
  white-space: nowrap;
  font-size: 0; /* 消除按钮间空白 */
}
.action-row .btn-text {
  font-size: 12px;
  padding: 2px 6px;
  height: auto;
  display: inline-block;
  vertical-align: middle;
  white-space: nowrap;
  border-radius: 3px;
  border: 1px solid #e2e8f0;
  background: #f8fafc;
  color: #475569;
  cursor: pointer;
  transition: all 0.15s;
  margin-right: 4px;
}
.action-row .btn-text:last-child { margin-right: 0; }
.action-row .btn-text:hover {
  background: #e2e8f0;
  border-color: #cbd5e1;
}
.action-row .btn-text.primary   { color: #2563eb; border-color: #bfdbfe; background: #eff6ff; }
.action-row .btn-text.primary:hover { background: #dbeafe; }
.action-row .btn-text.success  { color: #16a34a; border-color: #bbf7d0; background: #f0fdf4; }
.action-row .btn-text.success:hover { background: #dcfce7; }
.action-row .btn-text.danger   { color: #dc2626; border-color: #fecaca; background: #fef2f2; }
.action-row .btn-text.danger:hover { background: #fee2e2; }
.action-row .btn-text.muted    { color: #94a3b8; border-color: #e2e8f0; background: #f8fafc; }

/* ===== 姓名单元格（限制宽度，超长截断，禁止换行） ===== */
.name-cell {
  display: inline-block;
  max-width: 4.5em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  vertical-align: middle;
}
.data-table td.font-bold {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 8em;
}

/* ===== 内联分配咨询师下拉框 ===== */
.assign-select {
  display: inline-block;
  width: auto;
  min-width: 90px;
  padding: 2px 6px;
  font-size: 12px;
  border: 1px solid var(--primary, #2563EB);
  border-radius: 4px;
  background: white;
  cursor: pointer;
}

/* ===== Text Right ===== */
.text-right { text-align: right; }

/* ===== 移动端顶栏菜单按钮 ===== */
.topbar-menu-btn {
  display: none;
  align-items: center;
  justify-content: center;
  width: 36px; height: 36px;
  border: none; background: transparent;
  font-size: 20px; color: var(--gray-600);
  cursor: pointer; border-radius: 8px; flex-shrink: 0;
}
.topbar-menu-btn:hover { background: var(--gray-100); }

/* ===== 移动端侧边栏遮罩 ===== */
.sidebar-backdrop {
  display: none;
  position: fixed; inset: 0;
  background: rgba(0,0,0,.4);
  z-index: 90;
}

/* ===== Responsive ===== */
@media (max-width: 767px) {
  /* 侧边栏改为抽屉式 */
  .sidebar {
    transform: translateX(-100%);
    transition: transform .3s;
    box-shadow: var(--shadow-lg);
    z-index: 110;
  }
  .sidebar.open { transform: translateX(0); }
  .sidebar-backdrop { display: block; }

  /* 顶栏：菜单按钮 + 标题 + 搜索换行 */
  .topbar-menu-btn { display: inline-flex; }
  .topbar {
    flex-wrap: wrap;
    height: auto;
    padding: 8px 14px;
    gap: 10px;
    align-items: center;
  }
  .topbar-title { font-size: 15px; flex: 1; min-width: 0; }
  .topbar-spacer { display: none; }
  .global-search-wrap { order: 5; width: 100%; }
  .topbar-search { display: block; width: 100%; }

  /* 主体与内容间距收紧 */
  .main-area { margin-left: 0; }
  .content { padding: 14px; }
  .panel-header, .panel-body { padding: 14px; }
  .panel-body.no-pad { padding: 0; }

  /* 弹窗在小屏近乎占满 */
  .modal { max-width: 100%; max-height: 92vh; border-radius: 0; }
  .modal.modal-sm, .modal.modal-md, .modal.modal-lg { max-width: 100%; }
  .modal-header, .modal-body, .modal-footer { padding: 16px; }
  .modal-footer { flex-wrap: wrap; }
  .modal-footer .btn { flex: 1; justify-content: center; }

  /* 表单单列 */
  .form-grid, .form-grid.cols-3 { grid-template-columns: 1fr; }

  /* 详情页字段网格：小屏两列，保证信息密度又不溢出 */
  .info-grid { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px; }

  /* 统计卡两列 */
  .stat-grid { grid-template-columns: 1fr 1fr; gap: 10px; }
  .stat-card { padding: 14px; }
  .stat-card .stat-value { font-size: 22px; }

  /* 登录卡片自适应 */
  .login-card { width: 90vw; padding: 32px 24px 28px; }
}

/* 超小屏：统计卡单列、弹窗完全占满 */
@media (max-width: 480px) {
  .stat-grid { grid-template-columns: 1fr; }
  .info-grid { grid-template-columns: 1fr 1fr; }
  .modal { border-radius: 0; max-height: 100vh; height: 100vh; }
  .modal-header, .modal-body, .modal-footer { padding: 14px; }
  .topbar-title { font-size: 14px; }
}

/* ===== Cloud Sync Indicator ===== */
.cloud-badge {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 12px; margin-right: 14px;
  border-radius: 999px; font-size: 12px; font-weight: 500;
  cursor: pointer; user-select: none;
  border: 1px solid transparent; transition: all .15s;
  white-space: nowrap;
}
.cloud-badge:hover { filter: brightness(.96); }
.cloud-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }

.cloud-badge.cloud-ready { background: #ECFDF5; color: #047857; border-color: #A7F3D0; }
.cloud-badge.cloud-ready .cloud-dot { background: #10B981; }

.cloud-badge.cloud-connecting { background: #EFF6FF; color: #1D4ED8; border-color: #BFDBFE; }
.cloud-badge.cloud-connecting .cloud-dot { background: var(--primary); animation: cloudPulse 1.2s infinite; }

.cloud-badge.cloud-error { background: #FEF2F2; color: #B91C1C; border-color: #FECACA; }
.cloud-badge.cloud-error .cloud-dot { background: #EF4444; }

.cloud-badge.cloud-idle { background: var(--gray-100); color: var(--gray-500); border-color: var(--gray-200); }
.cloud-badge.cloud-idle .cloud-dot { background: var(--gray-400); }

@keyframes cloudPulse { 0%,100% { opacity: 1; } 50% { opacity: .25; } }

.cloud-banner {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 24px;
  background: #FFFBEB; border-bottom: 1px solid #FDE68A;
  color: #92400E; font-size: 13px;
}
.cloud-banner-icon { font-size: 16px; flex-shrink: 0; }
.cloud-banner-text { flex: 1; line-height: 1.6; }
.cloud-banner-text strong { color: #B45309; }
.cloud-banner .btn { flex-shrink: 0; }

@media (max-width: 767px) {
  .cloud-badge span:not(.cloud-dot) { display: none; }
  .cloud-badge { padding: 6px; margin-right: 8px; }
  .cloud-banner { flex-wrap: wrap; padding: 10px 14px; }
}

/* ===== 移动端表格与工具栏增强（v1.33.0） ===== */
@media (max-width: 767px) {
  /* 工具栏 / 筛选行允许换行，避免超出视口（如考勤管理顶部工具条） */
  .panel-header { flex-wrap: wrap; gap: 8px; }
  .panel-header .flex,
  .flex.gap-8,
  .flex.gap-12 { flex-wrap: wrap; row-gap: 8px; }

  /* 表格在手机上更紧凑，整表横向滑动；表头吸顶 */
  .table-wrap { position: relative; }
  .table-wrap::before {
    content: '← 左右滑动查看完整表格 →';
    display: block;
    text-align: center;
    font-size: 12px;
    color: var(--gray-400, #9CA3AF);
    padding: 2px 0 6px;
  }
  .data-table th,
  .data-table td {
    padding: 8px 10px;
    font-size: 13px;
    white-space: nowrap;
  }
  .data-table thead th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--gray-50, #F8FAFC);
  }
  .data-table .btn,
  .data-table .btn-sm { padding: 5px 9px; font-size: 12px; }

  /* 弹窗内的下拉/输入框在手机上更易于点按 */
  .form-select, .form-input { font-size: 16px; }  /* 16px 避免 iOS 聚焦缩放 */
}


/* ===== 平板适配（768–1023px）：常驻窄侧边栏 + 触摸友好（v1.34.0） ===== */
@media (min-width: 768px) and (max-width: 1023px) {
  /* 平板保留常驻侧边栏（不再折叠为抽屉），宽度略收窄给内容更多空间 */
  :root { --sidebar-w: 200px; }

  /* ★ v1.69.9：平板侧栏收窄到 200px 后，品牌区可用宽度只剩
        200 − 24(徽章) − 6(间距) − 16(padding) = 154px，
        12.5px 的机构名实测 175px 会触发省略号。降到 11px（实测 154px）
        刚好完整显示，与桌面档同为**一行**，只是更紧凑。 */
  .sidebar-logo { font-size: 11px; }

  /* 导航项触摸目标加大，便于手指点按 */
  .nav-item { padding: 12px 18px; font-size: 14px; }
  .nav-icon { width: 20px; font-size: 16px; }

  /* 统计卡两列，避免窄屏下拥挤 */
  .stat-grid { grid-template-columns: repeat(2, 1fr); gap: 12px; }

  /* 顶栏搜索框收窄，避免挤压标题 */
  .topbar-search { width: 200px; }

  /* 触摸友好的按钮 / 输入 / 勾选框 */
  .btn { min-height: 40px; }
  .btn-sm { min-height: 34px; }
  .form-input, .form-select, .form-textarea { font-size: 16px; }  /* 16px 避免 iOS 聚焦缩放 */
  input[type="checkbox"], input[type="radio"] { width: 18px; height: 18px; }

  /* 面板头部与考勤工具栏允许换行，平板窄屏不溢出 */
  .panel-header { flex-wrap: wrap; row-gap: 10px; }
  .attendance-toolbar { flex-wrap: wrap; row-gap: 8px; }

  /* 考勤格子在平板上加大点按区域，单指点按即可标记 */
  .attendance-cell { min-height: 44px; }
  .attendance-mark { font-size: 18px; }

  /* 弹窗按钮点按区域加大，便于现场操作 */
  .modal-footer .btn { min-height: 42px; }
}

/* ===== 职工弹窗：开通登录 ===== */
.staff-login-card {
  margin: 4px 0 2px;
  padding: 12px 14px;
  border: 1px dashed var(--border, #E2E8F0);
  border-radius: 10px;
  background: #F8FAFC;
}
.staff-login-card .switch-row {
  display: flex; align-items: center; gap: 8px;
  cursor: pointer; font-size: 14px; color: var(--text, #1F2937);
  user-select: none;
}
.staff-login-card .switch-row input[type="checkbox"] { width: 16px; height: 16px; cursor: pointer; }
.staff-login-card .form-hint {
  margin-top: 8px; font-size: 12px; color: var(--gray-500, #6B7280);
  line-height: 1.6;
}
.staff-login-card .form-hint b { color: var(--primary, #2563EB); }
/* ===== 统一留白校准层 v1.36.52（重新校准：1170容器→1130px / 1218容器→1170px） ===== */

/* --- collision-table: 1040 → 1130px (SCALE) --- */
table.data-table.collision-table th:nth-child(1),
table.data-table.collision-table td:nth-child(1) { width: 224px; }
table.data-table.collision-table th:nth-child(2),
table.data-table.collision-table td:nth-child(2) { width: 129px; }
table.data-table.collision-table th:nth-child(3),
table.data-table.collision-table td:nth-child(3) { width: 163px; }
table.data-table.collision-table th:nth-child(4),
table.data-table.collision-table td:nth-child(4) { width: 141px; }
table.data-table.collision-table th:nth-child(5),
table.data-table.collision-table td:nth-child(5) { width: 180px; }
table.data-table.collision-table th:nth-child(6),
table.data-table.collision-table td:nth-child(6) { width: 151px; }
table.data-table.collision-table th:nth-child(7),
table.data-table.collision-table td:nth-child(7) { width: 141px; }

/* --- commission-table: 1040 → 1130px (SCALE) --- */
table.data-table.commission-table th:nth-child(1),
table.data-table.commission-table td:nth-child(1) { width: 156px; }
table.data-table.commission-table th:nth-child(2),
table.data-table.commission-table td:nth-child(2) { width: 115px; }
table.data-table.commission-table th:nth-child(3),
table.data-table.commission-table td:nth-child(3) { width: 120px; }
table.data-table.commission-table th:nth-child(4),
table.data-table.commission-table td:nth-child(4) { width: 101px; }
table.data-table.commission-table th:nth-child(5),
table.data-table.commission-table td:nth-child(5) { width: 128px; }
table.data-table.commission-table th:nth-child(6),
table.data-table.commission-table td:nth-child(6) { width: 111px; }
table.data-table.commission-table th:nth-child(7),
table.data-table.commission-table td:nth-child(7) { width: 136px; }
table.data-table.commission-table th:nth-child(8),
table.data-table.commission-table td:nth-child(8) { width: 122px; }
table.data-table.commission-table th:nth-child(9),
table.data-table.commission-table td:nth-child(9) { width: 141px; }

/* --- department-table: 1040 → 1170px (SCALE) --- */
table.data-table.department-table th:nth-child(1),
table.data-table.department-table td:nth-child(1) { width: 123px; }
table.data-table.department-table th:nth-child(2),
table.data-table.department-table td:nth-child(2) { width: 232px; }
table.data-table.department-table th:nth-child(3),
table.data-table.department-table td:nth-child(3) { width: 326px; }
table.data-table.department-table th:nth-child(4),
table.data-table.department-table td:nth-child(4) { width: 143px; }
table.data-table.department-table th:nth-child(5),
table.data-table.department-table td:nth-child(5) { width: 200px; }
table.data-table.department-table th:nth-child(6),
table.data-table.department-table td:nth-child(6) { width: 146px; }

/* --- device-table: 1040 → 1170px (SCALE) --- */
table.data-table.device-table th:nth-child(1),
table.data-table.device-table td:nth-child(1) { width: 110px; }
table.data-table.device-table th:nth-child(2),
table.data-table.device-table td:nth-child(2) { width: 176px; }
table.data-table.device-table th:nth-child(3),
table.data-table.device-table td:nth-child(3) { width: 97px; }
table.data-table.device-table th:nth-child(4),
table.data-table.device-table td:nth-child(4) { width: 86px; }
table.data-table.device-table th:nth-child(5),
table.data-table.device-table td:nth-child(5) { width: 116px; }
table.data-table.device-table th:nth-child(6),
table.data-table.device-table td:nth-child(6) { width: 116px; }
table.data-table.device-table th:nth-child(7),
table.data-table.device-table td:nth-child(7) { width: 102px; }
table.data-table.device-table th:nth-child(8),
table.data-table.device-table td:nth-child(8) { width: 98px; }
table.data-table.device-table th:nth-child(9),
table.data-table.device-table td:nth-child(9) { width: 270px; }

/* --- employment-table: 1046 → 1170px (SCALE) --- */
table.data-table.employment-table th:nth-child(1),
table.data-table.employment-table td:nth-child(1) { width: 101px; }
table.data-table.employment-table th:nth-child(2),
table.data-table.employment-table td:nth-child(2) { width: 81px; }
table.data-table.employment-table th:nth-child(3),
table.data-table.employment-table td:nth-child(3) { width: 84px; }
table.data-table.employment-table th:nth-child(4),
table.data-table.employment-table td:nth-child(4) { width: 114px; }
table.data-table.employment-table th:nth-child(5),
table.data-table.employment-table td:nth-child(5) { width: 102px; }
table.data-table.employment-table th:nth-child(6),
table.data-table.employment-table td:nth-child(6) { width: 104px; }
table.data-table.employment-table th:nth-child(7),
table.data-table.employment-table td:nth-child(7) { width: 125px; }
table.data-table.employment-table th:nth-child(8),
table.data-table.employment-table td:nth-child(8) { width: 102px; }
table.data-table.employment-table th:nth-child(9),
table.data-table.employment-table td:nth-child(9) { width: 106px; }
table.data-table.employment-table th:nth-child(10),
table.data-table.employment-table td:nth-child(10) { width: 106px; }
table.data-table.employment-table th:nth-child(11),
table.data-table.employment-table td:nth-child(11) { width: 145px; }

/* --- enroll-table: 1040 → 1130px (SCALE) --- */
table.data-table.enroll-table th:nth-child(1),
table.data-table.enroll-table td:nth-child(1) { width: 135px; }
table.data-table.enroll-table th:nth-child(2),
table.data-table.enroll-table td:nth-child(2) { width: 88px; }
table.data-table.enroll-table th:nth-child(3),
table.data-table.enroll-table td:nth-child(3) { width: 141px; }
table.data-table.enroll-table th:nth-child(4),
table.data-table.enroll-table td:nth-child(4) { width: 108px; }
table.data-table.enroll-table th:nth-child(5),
table.data-table.enroll-table td:nth-child(5) { width: 166px; }
table.data-table.enroll-table th:nth-child(6),
table.data-table.enroll-table td:nth-child(6) { width: 124px; }
table.data-table.enroll-table th:nth-child(7),
table.data-table.enroll-table td:nth-child(7) { width: 108px; }
table.data-table.enroll-table th:nth-child(8),
table.data-table.enroll-table td:nth-child(8) { width: 261px; }

/* --- ledger-table: 1040 → 1170px (SCALE) --- */
table.data-table.ledger-table th:nth-child(1),
table.data-table.ledger-table td:nth-child(1) { width: 180px; }
table.data-table.ledger-table th:nth-child(2),
table.data-table.ledger-table td:nth-child(2) { width: 122px; }
table.data-table.ledger-table th:nth-child(3),
table.data-table.ledger-table td:nth-child(3) { width: 94px; }
table.data-table.ledger-table th:nth-child(4),
table.data-table.ledger-table td:nth-child(4) { width: 104px; }
table.data-table.ledger-table th:nth-child(5),
table.data-table.ledger-table td:nth-child(5) { width: 104px; }
table.data-table.ledger-table th:nth-child(6),
table.data-table.ledger-table td:nth-child(6) { width: 94px; }
table.data-table.ledger-table th:nth-child(7),
table.data-table.ledger-table td:nth-child(7) { width: 132px; }
table.data-table.ledger-table th:nth-child(8),
table.data-table.ledger-table td:nth-child(8) { width: 91px; }
table.data-table.ledger-table th:nth-child(9),
table.data-table.ledger-table td:nth-child(9) { width: 104px; }
table.data-table.ledger-table th:nth-child(10),
table.data-table.ledger-table td:nth-child(10) { width: 146px; }

/* --- major-table: 7 列（v1.90.5 去掉图标列）宽屏 SCALE 合计 ≈1170px --- */
table.data-table.major-table th:nth-child(1),
table.data-table.major-table td:nth-child(1) { width: 114px; }
table.data-table.major-table th:nth-child(2),
table.data-table.major-table td:nth-child(2) { width: 210px; }
table.data-table.major-table th:nth-child(3),
table.data-table.major-table td:nth-child(3) { width: 285px; }
table.data-table.major-table th:nth-child(4),
table.data-table.major-table td:nth-child(4) { width: 119px; }
table.data-table.major-table th:nth-child(5),
table.data-table.major-table td:nth-child(5) { width: 119px; }
table.data-table.major-table th:nth-child(6),
table.data-table.major-table td:nth-child(6) { width: 173px; }
table.data-table.major-table th:nth-child(7),
table.data-table.major-table td:nth-child(7) { width: 146px; }

/* --- offer-table: 1040 → 1130px (SCALE) --- */
table.data-table.offer-table th:nth-child(1),
table.data-table.offer-table td:nth-child(1) { width: 131px; }
table.data-table.offer-table th:nth-child(2),
table.data-table.offer-table td:nth-child(2) { width: 131px; }
table.data-table.offer-table th:nth-child(3),
table.data-table.offer-table td:nth-child(3) { width: 185px; }
table.data-table.offer-table th:nth-child(4),
table.data-table.offer-table td:nth-child(4) { width: 143px; }
table.data-table.offer-table th:nth-child(5),
table.data-table.offer-table td:nth-child(5) { width: 160px; }
table.data-table.offer-table th:nth-child(6),
table.data-table.offer-table td:nth-child(6) { width: 160px; }
table.data-table.offer-table th:nth-child(7),
table.data-table.offer-table td:nth-child(7) { width: 143px; }
table.data-table.offer-table th:nth-child(8),
table.data-table.offer-table td:nth-child(8) { width: 76px; }

/* --- oplog-table: 1040 → 1170px (SCALE) --- */
table.data-table.oplog-table th:nth-child(1),
table.data-table.oplog-table td:nth-child(1) { width: 385px; }
table.data-table.oplog-table th:nth-child(2),
table.data-table.oplog-table td:nth-child(2) { width: 148px; }
table.data-table.oplog-table th:nth-child(3),
table.data-table.oplog-table td:nth-child(3) { width: 174px; }
table.data-table.oplog-table th:nth-child(4),
table.data-table.oplog-table td:nth-child(4) { width: 148px; }
table.data-table.oplog-table th:nth-child(5),
table.data-table.oplog-table td:nth-child(5) { width: 168px; }
table.data-table.oplog-table th:nth-child(6),
table.data-table.oplog-table td:nth-child(6) { width: 146px; }

/* --- partner-table: 1040 → 1130px (SCALE) --- */
table.data-table.partner-table th:nth-child(1),
table.data-table.partner-table td:nth-child(1) { width: 66px; }
table.data-table.partner-table th:nth-child(2),
table.data-table.partner-table td:nth-child(2) { width: 113px; }
table.data-table.partner-table th:nth-child(3),
table.data-table.partner-table td:nth-child(3) { width: 83px; }
table.data-table.partner-table th:nth-child(4),
table.data-table.partner-table td:nth-child(4) { width: 120px; }
table.data-table.partner-table th:nth-child(5),
table.data-table.partner-table td:nth-child(5) { width: 91px; }
table.data-table.partner-table th:nth-child(6),
table.data-table.partner-table td:nth-child(6) { width: 89px; }
table.data-table.partner-table th:nth-child(7),
table.data-table.partner-table td:nth-child(7) { width: 102px; }
table.data-table.partner-table th:nth-child(8),
table.data-table.partner-table td:nth-child(8) { width: 95px; }
table.data-table.partner-table th:nth-child(9),
table.data-table.partner-table td:nth-child(9) { width: 111px; }
table.data-table.partner-table th:nth-child(10),
table.data-table.partner-table td:nth-child(10) { width: 261px; }

/* --- return-table: 1040 → 1130px (SCALE) --- */
table.data-table.return-table th:nth-child(1),
table.data-table.return-table td:nth-child(1) { width: 139px; }
table.data-table.return-table th:nth-child(2),
table.data-table.return-table td:nth-child(2) { width: 204px; }
table.data-table.return-table th:nth-child(3),
table.data-table.return-table td:nth-child(3) { width: 139px; }
table.data-table.return-table th:nth-child(4),
table.data-table.return-table td:nth-child(4) { width: 152px; }
table.data-table.return-table th:nth-child(5),
table.data-table.return-table td:nth-child(5) { width: 197px; }
table.data-table.return-table th:nth-child(6),
table.data-table.return-table td:nth-child(6) { width: 158px; }
table.data-table.return-table th:nth-child(7),
table.data-table.return-table td:nth-child(7) { width: 141px; }

/* --- staff-table: 1040 → 1170px (SCALE) --- */
table.data-table.staff-table th:nth-child(1),
table.data-table.staff-table td:nth-child(1) { width: 96px; }
table.data-table.staff-table th:nth-child(2),
table.data-table.staff-table td:nth-child(2) { width: 96px; }
table.data-table.staff-table th:nth-child(3),
table.data-table.staff-table td:nth-child(3) { width: 56px; }
table.data-table.staff-table th:nth-child(4),
table.data-table.staff-table td:nth-child(4) { width: 120px; }
table.data-table.staff-table th:nth-child(5),
table.data-table.staff-table td:nth-child(5) { width: 125px; }
table.data-table.staff-table th:nth-child(6),
table.data-table.staff-table td:nth-child(6) { width: 156px; }
table.data-table.staff-table th:nth-child(7),
table.data-table.staff-table td:nth-child(7) { width: 125px; }
table.data-table.staff-table th:nth-child(8),
table.data-table.staff-table td:nth-child(8) { width: 134px; }
table.data-table.staff-table th:nth-child(9),
table.data-table.staff-table td:nth-child(9) { width: 116px; }
table.data-table.staff-table th:nth-child(10),
table.data-table.staff-table td:nth-child(10) { width: 146px; }

/* --- student-table：v1.81.29 起改 9 列（去掉手机号/渠道），
       列宽只保留上方那一处定义，杜绝"两处列宽打架"导致的总宽超容器 → 横向滚动条 --- */
/* --- trial-table: 1040 → 1130px (SCALE) --- */
table.data-table.trial-table th:nth-child(1),
table.data-table.trial-table td:nth-child(1) { width: 108px; }
table.data-table.trial-table th:nth-child(2),
table.data-table.trial-table td:nth-child(2) { width: 78px; }
table.data-table.trial-table th:nth-child(3),
table.data-table.trial-table td:nth-child(3) { width: 123px; }
table.data-table.trial-table th:nth-child(4),
table.data-table.trial-table td:nth-child(4) { width: 92px; }
table.data-table.trial-table th:nth-child(5),
table.data-table.trial-table td:nth-child(5) { width: 112px; }
table.data-table.trial-table th:nth-child(6),
table.data-table.trial-table td:nth-child(6) { width: 112px; }
table.data-table.trial-table th:nth-child(7),
table.data-table.trial-table td:nth-child(7) { width: 127px; }
table.data-table.trial-table th:nth-child(8),
table.data-table.trial-table td:nth-child(8) { width: 85px; }
table.data-table.trial-table th:nth-child(9),
table.data-table.trial-table td:nth-child(9) { width: 92px; }
table.data-table.trial-table th:nth-child(10),
table.data-table.trial-table td:nth-child(10) { width: 201px; }

/* --- user-table: 1040 → 1170px (SCALE) --- */
table.data-table.user-table th:nth-child(1),
table.data-table.user-table td:nth-child(1) { width: 106px; }
table.data-table.user-table th:nth-child(2),
table.data-table.user-table td:nth-child(2) { width: 117px; }
table.data-table.user-table th:nth-child(3),
table.data-table.user-table td:nth-child(3) { width: 134px; }
table.data-table.user-table th:nth-child(4),
table.data-table.user-table td:nth-child(4) { width: 188px; }
table.data-table.user-table th:nth-child(5),
table.data-table.user-table td:nth-child(5) { width: 154px; }
table.data-table.user-table th:nth-child(6),
table.data-table.user-table td:nth-child(6) { width: 171px; }
table.data-table.user-table th:nth-child(7),
table.data-table.user-table td:nth-child(7) { width: 154px; }
table.data-table.user-table th:nth-child(8),
table.data-table.user-table td:nth-child(8) { width: 146px; }
/* --- attendance-table: 1032 → 1170px (NEW) --- */
table.data-table.attendance-table th:nth-child(1),
table.data-table.attendance-table td:nth-child(1) { width: 129px; }
table.data-table.attendance-table th:nth-child(2),
table.data-table.attendance-table td:nth-child(2) { width: 83px; }
table.data-table.attendance-table th:nth-child(3),
table.data-table.attendance-table td:nth-child(3) { width: 115px; }
table.data-table.attendance-table th:nth-child(4),
table.data-table.attendance-table td:nth-child(4) { width: 73px; }
table.data-table.attendance-table th:nth-child(5),
table.data-table.attendance-table td:nth-child(5) { width: 73px; }
table.data-table.attendance-table th:nth-child(6),
table.data-table.attendance-table td:nth-child(6) { width: 73px; }
table.data-table.attendance-table th:nth-child(7),
table.data-table.attendance-table td:nth-child(7) { width: 71px; }
table.data-table.attendance-table th:nth-child(8),
table.data-table.attendance-table td:nth-child(8) { width: 73px; }
table.data-table.attendance-table th:nth-child(9),
table.data-table.attendance-table td:nth-child(9) { width: 73px; }
table.data-table.attendance-table th:nth-child(10),
table.data-table.attendance-table td:nth-child(10) { width: 73px; }
table.data-table.attendance-table th:nth-child(11),
table.data-table.attendance-table td:nth-child(11) { width: 73px; }
table.data-table.attendance-table th:nth-child(12),
table.data-table.attendance-table td:nth-child(12) { width: 73px; }
table.data-table.attendance-table th:nth-child(13),
table.data-table.attendance-table td:nth-child(13) { width: 80px; }
table.data-table.attendance-table th:nth-child(14),
table.data-table.attendance-table td:nth-child(14) { width: 111px; }

/* --- class-group-table: 1050 → 1130px (NEW) --- */
table.data-table.class-group-table th:nth-child(1),
table.data-table.class-group-table td:nth-child(1) { width: 183px; }
table.data-table.class-group-table th:nth-child(2),
table.data-table.class-group-table td:nth-child(2) { width: 105px; }
table.data-table.class-group-table th:nth-child(3),
table.data-table.class-group-table td:nth-child(3) { width: 140px; }
table.data-table.class-group-table th:nth-child(4),
table.data-table.class-group-table td:nth-child(4) { width: 115px; }
table.data-table.class-group-table th:nth-child(5),
table.data-table.class-group-table td:nth-child(5) { width: 140px; }
table.data-table.class-group-table th:nth-child(6),
table.data-table.class-group-table td:nth-child(6) { width: 96px; }
table.data-table.class-group-table th:nth-child(7),
table.data-table.class-group-table td:nth-child(7) { width: 100px; }
table.data-table.class-group-table th:nth-child(8),
table.data-table.class-group-table td:nth-child(8) { width: 100px; }
table.data-table.class-group-table th:nth-child(9),
table.data-table.class-group-table td:nth-child(9) { width: 151px; }

/* --- dashboard-channel-table: 1040 → 1130px (NEW) --- */
table.data-table.dashboard-channel-table th:nth-child(1),
table.data-table.dashboard-channel-table td:nth-child(1) { width: 229px; }
table.data-table.dashboard-channel-table th:nth-child(2),
table.data-table.dashboard-channel-table td:nth-child(2) { width: 145px; }
table.data-table.dashboard-channel-table th:nth-child(3),
table.data-table.dashboard-channel-table td:nth-child(3) { width: 228px; }
table.data-table.dashboard-channel-table th:nth-child(4),
table.data-table.dashboard-channel-table td:nth-child(4) { width: 185px; }
table.data-table.dashboard-channel-table th:nth-child(5),
table.data-table.dashboard-channel-table td:nth-child(5) { width: 202px; }
table.data-table.dashboard-channel-table th:nth-child(6),
table.data-table.dashboard-channel-table td:nth-child(6) { width: 141px; }

/* --- dashboard-student-table: 1040 → 1130px (NEW) --- */
table.data-table.dashboard-student-table th:nth-child(1),
table.data-table.dashboard-student-table td:nth-child(1) { width: 190px; }
table.data-table.dashboard-student-table th:nth-child(2),
table.data-table.dashboard-student-table td:nth-child(2) { width: 120px; }
table.data-table.dashboard-student-table th:nth-child(3),
table.data-table.dashboard-student-table td:nth-child(3) { width: 190px; }
table.data-table.dashboard-student-table th:nth-child(4),
table.data-table.dashboard-student-table td:nth-child(4) { width: 158px; }
table.data-table.dashboard-student-table th:nth-child(5),
table.data-table.dashboard-student-table td:nth-child(5) { width: 158px; }
table.data-table.dashboard-student-table th:nth-child(6),
table.data-table.dashboard-student-table td:nth-child(6) { width: 174px; }
table.data-table.dashboard-student-table th:nth-child(7),
table.data-table.dashboard-student-table td:nth-child(7) { width: 141px; }

/* --- departure-record-table: 1040 → 1170px (NEW) --- */
table.data-table.departure-record-table th:nth-child(1),
table.data-table.departure-record-table td:nth-child(1) { width: 141px; }
table.data-table.departure-record-table th:nth-child(2),
table.data-table.departure-record-table td:nth-child(2) { width: 155px; }
table.data-table.departure-record-table th:nth-child(3),
table.data-table.departure-record-table td:nth-child(3) { width: 205px; }
table.data-table.departure-record-table th:nth-child(4),
table.data-table.departure-record-table td:nth-child(4) { width: 223px; }
table.data-table.departure-record-table th:nth-child(5),
table.data-table.departure-record-table td:nth-child(5) { width: 160px; }
table.data-table.departure-record-table th:nth-child(6),
table.data-table.departure-record-table td:nth-child(6) { width: 141px; }
table.data-table.departure-record-table th:nth-child(7),
table.data-table.departure-record-table td:nth-child(7) { width: 146px; }

/* --- dorm-occupant-table: 1060 → 1130px (NEW) --- */
table.data-table.dorm-occupant-table th:nth-child(1),
table.data-table.dorm-occupant-table td:nth-child(1) { width: 133px; }
table.data-table.dorm-occupant-table th:nth-child(2),
table.data-table.dorm-occupant-table td:nth-child(2) { width: 117px; }
table.data-table.dorm-occupant-table th:nth-child(3),
table.data-table.dorm-occupant-table td:nth-child(3) { width: 111px; }
table.data-table.dorm-occupant-table th:nth-child(4),
table.data-table.dorm-occupant-table td:nth-child(4) { width: 78px; }
table.data-table.dorm-occupant-table th:nth-child(5),
table.data-table.dorm-occupant-table td:nth-child(5) { width: 117px; }
table.data-table.dorm-occupant-table th:nth-child(6),
table.data-table.dorm-occupant-table td:nth-child(6) { width: 101px; }
table.data-table.dorm-occupant-table th:nth-child(7),
table.data-table.dorm-occupant-table td:nth-child(7) { width: 170px; }
table.data-table.dorm-occupant-table th:nth-child(8),
table.data-table.dorm-occupant-table td:nth-child(8) { width: 143px; }
table.data-table.dorm-occupant-table th:nth-child(9),
table.data-table.dorm-occupant-table td:nth-child(9) { width: 160px; }

/* --- dorm-room-table: 1042 → 1130px (NEW) --- */
table.data-table.dorm-room-table th:nth-child(1),
table.data-table.dorm-room-table td:nth-child(1) { width: 79px; }
table.data-table.dorm-room-table th:nth-child(2),
table.data-table.dorm-room-table td:nth-child(2) { width: 66px; }
table.data-table.dorm-room-table th:nth-child(3),
table.data-table.dorm-room-table td:nth-child(3) { width: 61px; }
table.data-table.dorm-room-table th:nth-child(4),
table.data-table.dorm-room-table td:nth-child(4) { width: 89px; }
table.data-table.dorm-room-table th:nth-child(5),
table.data-table.dorm-room-table td:nth-child(5) { width: 54px; }
table.data-table.dorm-room-table th:nth-child(6),
table.data-table.dorm-room-table td:nth-child(6) { width: 54px; }
table.data-table.dorm-room-table th:nth-child(7),
table.data-table.dorm-room-table td:nth-child(7) { width: 89px; }
table.data-table.dorm-room-table th:nth-child(8),
table.data-table.dorm-room-table td:nth-child(8) { width: 142px; }
table.data-table.dorm-room-table th:nth-child(9),
table.data-table.dorm-room-table td:nth-child(9) { width: 260px; }
table.data-table.dorm-room-table th:nth-child(10),
table.data-table.dorm-room-table td:nth-child(10) { width: 92px; }
table.data-table.dorm-room-table th:nth-child(11),
table.data-table.dorm-room-table td:nth-child(11) { width: 143px; }

/* --- employment-record-table: 1040 → 1170px (NEW) --- */
table.data-table.employment-record-table th:nth-child(1),
table.data-table.employment-record-table td:nth-child(1) { width: 127px; }
table.data-table.employment-record-table th:nth-child(2),
table.data-table.employment-record-table td:nth-child(2) { width: 137px; }
table.data-table.employment-record-table th:nth-child(3),
table.data-table.employment-record-table td:nth-child(3) { width: 180px; }
table.data-table.employment-record-table th:nth-child(4),
table.data-table.employment-record-table td:nth-child(4) { width: 147px; }
table.data-table.employment-record-table th:nth-child(5),
table.data-table.employment-record-table td:nth-child(5) { width: 137px; }
table.data-table.employment-record-table th:nth-child(6),
table.data-table.employment-record-table td:nth-child(6) { width: 147px; }
table.data-table.employment-record-table th:nth-child(7),
table.data-table.employment-record-table td:nth-child(7) { width: 147px; }
table.data-table.employment-record-table th:nth-child(8),
table.data-table.employment-record-table td:nth-child(8) { width: 146px; }

/* --- major-class-table: 1040 → 1170px (NEW) --- */
table.data-table.major-class-table th:nth-child(1),
table.data-table.major-class-table td:nth-child(1) { width: 222px; }
table.data-table.major-class-table th:nth-child(2),
table.data-table.major-class-table td:nth-child(2) { width: 107px; }
table.data-table.major-class-table th:nth-child(3),
table.data-table.major-class-table td:nth-child(3) { width: 163px; }
table.data-table.major-class-table th:nth-child(4),
table.data-table.major-class-table td:nth-child(4) { width: 163px; }
table.data-table.major-class-table th:nth-child(5),
table.data-table.major-class-table td:nth-child(5) { width: 111px; }
table.data-table.major-class-table th:nth-child(6),
table.data-table.major-class-table td:nth-child(6) { width: 111px; }
table.data-table.major-class-table th:nth-child(7),
table.data-table.major-class-table td:nth-child(7) { width: 146px; }
table.data-table.major-class-table th:nth-child(8),
table.data-table.major-class-table td:nth-child(8) { width: 146px; }

/* --- sub-table：v1.36.88 移除固定 8 列宽度 ---
   原定义（156/101/129/101/156/156/101/230 = 1130px）是为「8 列子表」校准的，
   但 28 个 .sub-table 实际列数 4~10 不等，套用后列宽与内容错位，
   窄表更会因 min-width:72% 被撑宽而两侧留白。
   现改为：子表铺满容器 + table-layout:auto 按内容分配列宽（见上方 .sub-table 规则）。
   如需为某个表恢复定宽，请为其单独加专属类（不要再用通用 .sub-table 定宽）。
   注：定宽务必确认「列宽总和 ≤ 最窄支持容器的宽度」，否则窄屏必出横向滚动条。
   （参考：1366×768 笔记本下主内容区可用宽度约 1144px，1024px 屏约 802px） */

/* --- talent-pool-table: 1050 → 1130px (NEW) --- */
table.data-table.talent-pool-table th:nth-child(1),
table.data-table.talent-pool-table td:nth-child(1) { width: 129px; }
table.data-table.talent-pool-table th:nth-child(2),
table.data-table.talent-pool-table td:nth-child(2) { width: 129px; }
table.data-table.talent-pool-table th:nth-child(3),
table.data-table.talent-pool-table td:nth-child(3) { width: 113px; }
table.data-table.talent-pool-table th:nth-child(4),
table.data-table.talent-pool-table td:nth-child(4) { width: 158px; }
table.data-table.talent-pool-table th:nth-child(5),
table.data-table.talent-pool-table td:nth-child(5) { width: 157px; }
table.data-table.talent-pool-table th:nth-child(6),
table.data-table.talent-pool-table td:nth-child(6) { width: 157px; }
table.data-table.talent-pool-table th:nth-child(7),
table.data-table.talent-pool-table td:nth-child(7) { width: 136px; }
table.data-table.talent-pool-table th:nth-child(8),
table.data-table.talent-pool-table td:nth-child(8) { width: 151px; }

/* --- salary-summary-table (各专业平均薪资, 5列) --- */
/* 【v1.36.88 二次修复：窄屏横向滚动条】
   上一版为保定宽显式写了 table-layout:fixed + 5 列合计 1170px，
   实测在 1366×768（主流办公本）容器只有 1144px → 表 1170px 溢出 2%，
   1280px 溢出 11%，1024px 溢出 46%，全部出现横向滚动条，违反铁律 14。
   现改为与通用子表一致的 auto 布局：列宽按内容比例分配、随容器等比缩放。
   实测 1366/1280/1024 三档均 100% 铺满且零溢出。 */
table.data-table.salary-summary-table {
  table-layout: auto;
  width: 100%;
  min-width: 0;
}

/* --- departure-pending-table (待离校交接学员, 7列) --- */
/* v1.36.88 二次修复：原因同 salary-summary-table（原 fixed 合计 1170px 窄屏溢出） */
table.data-table.departure-pending-table {
  table-layout: auto;
  width: 100%;
  min-width: 0;
}

/* ============================================================
   v1.81.0 职工档案模块
   说明：详情页页头身份卡 + 指标条 + 配置驱动的档案页签 + 档位进度条。
   所有尺寸沿用全站 8px 栅格与既有色板变量，避免另立一套视觉。
   ============================================================ */

/* --- 列表页：姓名单元格（头像 + 姓名） --- */
.staff-name-cell { display: flex; align-items: center; gap: 8px; min-width: 0; }
.staff-name-cell .name-cell { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.staff-avatar-mini {
  flex: 0 0 26px; width: 26px; height: 26px; border-radius: 50%;
  background: var(--primary-light); color: var(--primary);
  font-size: 12px; font-weight: 600;
  display: inline-flex; align-items: center; justify-content: center;
}
.staff-row { cursor: pointer; }
.staff-row:hover > td { background: var(--gray-50); }

/* --- 详情页容器 --- */
.staff-detail { min-width: 0; }

/* --- 详情页页头身份卡 --- */
.staff-hero {
  display: flex; align-items: flex-start; gap: 18px;
  padding: 20px 22px; margin-bottom: 16px;
  border-radius: var(--radius);
  background: linear-gradient(135deg, #F7FAFF 0%, #FFFFFF 55%, #F2F7FF 100%);
  border: 1px solid var(--gray-200);
  box-shadow: var(--shadow-sm);
}
.staff-hero-avatar {
  flex: 0 0 64px; width: 64px; height: 64px; border-radius: 18px;
  background: linear-gradient(135deg, var(--primary) 0%, #4C8DF6 100%);
  color: #fff; font-size: 24px; font-weight: 700;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 6px 16px rgba(34,108,225,.22);
}
.staff-hero-meta { flex: 1 1 auto; min-width: 0; }
.staff-hero-name { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-bottom: 6px; }
.staff-hero-name-text { font-size: 20px; font-weight: 700; color: var(--gray-900); }
.staff-hero-sub { font-size: 13px; color: var(--gray-500); margin-bottom: 10px; }
.staff-hero-tags { display: flex; flex-wrap: wrap; gap: 8px; }
.hero-tag {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 10px; border-radius: 999px;
  background: #fff; border: 1px solid var(--gray-200);
  font-size: 12px; color: var(--gray-600); white-space: nowrap;
}
.staff-hero-actions {
  display: flex; flex-wrap: wrap; gap: 8px;
  justify-content: flex-end; align-content: flex-start;
  margin-left: auto;
  /* v1.81.19：放宽宽度让 5 个操作按钮尽量一行排开；按钮等宽居中，两行时也整齐 */
  max-width: 480px;
}
.staff-hero-actions .btn { min-width: 92px; justify-content: center; }

/* --- 概览两列布局（同行卡片等高，避免一列矮一列高造成错位） --- */
.staff-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: stretch; }
.staff-grid-full { grid-column: 1 / -1; }

/* --- 页签 v1.81.14：胶囊式 + 自动换行 ---
   旧版是"横向滚动"：页签一多就被藏进滚动区，用户根本不知道后面还有页签
   （实测 9 个页签时，"异动日志"完全不可见、上一个只剩半个图标）。
   改为胶囊式 + 换行：所有页签永远全部可见；激活项用主色胶囊高亮，更醒目。 */
.staff-tabs {
  /* v1.81.19：改 5 列网格 —— 页签数量增减时始终等宽、逐行整齐（10 个=5+5，9 个=5+4） */
  display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px;
  border-bottom: 2px solid var(--gray-200);
  padding-bottom: 14px;
  margin-bottom: 20px;
}
.staff-tabs .tab-item {
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
  justify-content: center; min-width: 0;
  padding: 7px 8px; font-size: 12.5px; border-radius: 999px;
  border: 1px solid var(--gray-200); background: var(--gray-50); color: var(--gray-600);
  margin-bottom: 0; border-bottom: 1px solid var(--gray-200);
  transition: all .15s;
}
.staff-tabs .tab-item:hover { color: var(--primary); border-color: var(--primary-light); background: var(--primary-light); }
.staff-tabs .tab-item.active { background: var(--primary); border-color: var(--primary); color: #fff; font-weight: 500; }
.staff-tabs::-webkit-scrollbar { height: 6px; }
.staff-tabs::-webkit-scrollbar-track { background: transparent; }
.staff-tabs::-webkit-scrollbar-thumb { background: var(--gray-300); border-radius: 3px; }
.staff-tabs .tab-count {
  display: inline-block; min-width: 18px; padding: 0 5px; height: 18px; line-height: 18px;
  border-radius: 999px; background: var(--gray-100); color: var(--gray-600);
  font-size: 11px; text-align: center; font-weight: 500;
}
.staff-tabs .tab-item.active .tab-count { background: rgba(255,255,255,.25); color: #fff; }
.staff-tabs .tab-lock { font-size: 11px; opacity: .8; }
/* 窄屏兜底：3 列网格换行，全部可见不挤压 */
@media (max-width: 480px) {
  .staff-tabs { grid-template-columns: repeat(3, 1fr); }
}

/* --- 指标条紧凑变体 --- */
.stat-grid.compact {
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 12px; margin-bottom: 16px;
}
.stat-grid.compact .stat-card { padding: 12px 10px; }
.stat-grid.compact .stat-value { font-size: 20px; }

/* --- 档案分组区块 / 表单分组标题 --- */
.info-section { margin-bottom: 22px; }
.info-section:last-child { margin-bottom: 0; }
.info-section-title {
  display: flex; align-items: center; gap: 6px;
  font-size: 13px; font-weight: 600; color: var(--gray-700);
  padding-bottom: 8px; margin-bottom: 12px;
  border-bottom: 1px dashed var(--gray-200);
}
.staff-form-section { margin-bottom: 20px; }
.staff-form-section:last-child { margin-bottom: 4px; }
.staff-form-section-title {
  display: flex; align-items: center; gap: 8px;
  font-size: 13px; font-weight: 600; color: var(--gray-800);
  padding: 4px 0 10px; margin-bottom: 10px;
  border-bottom: 1px solid var(--gray-200);
}
.staff-form .form-group { margin-bottom: 12px; }
.staff-form-tip { margin-right: auto; font-size: 12px; color: var(--gray-500); }
.form-span-2 { grid-column: 1 / -1; }
.grid-span-2 { grid-column: 1 / -1; }

/* --- 敏感信息标记 --- */
.sensitive-tag {
  display: inline-flex; align-items: center; gap: 3px;
  padding: 1px 8px; border-radius: 999px;
  background: var(--danger-light); color: var(--danger);
  font-size: 11px; font-weight: 500; white-space: nowrap;
}

/* --- 招生档位进度条 --- */
/* v1.81.7：改用自适应网格，窄卡片下也不会把第 3 档挤到第二行 */
.tier-track { display: grid; grid-template-columns: repeat(auto-fit, minmax(92px, 1fr)); gap: 8px; }
.tier-seg {
  min-width: 0;
  padding: 8px 6px; border-radius: 10px;
  background: var(--gray-50); border: 1px solid var(--gray-200);
  text-align: center;
}
.tier-seg.done { background: var(--success-light); border-color: #A7F3D0; }
.tier-seg.active { background: var(--primary-light); border-color: var(--primary); }
.tier-seg-head { font-size: 11px; color: var(--gray-500); margin-bottom: 3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tier-seg-range { font-size: 11px; color: var(--gray-700); margin-bottom: 3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tier-seg-amount { font-size: 13px; font-weight: 700; color: var(--gray-900); white-space: nowrap; }
.tier-seg.active .tier-seg-amount { color: var(--primary); }

/* --- 档位小结（两行：指标一行、升级提示一行） --- */
.tier-summary {
  display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 14px;
  margin-top: 10px; font-size: 13px; color: var(--gray-500);
}
.tier-summary b { color: var(--gray-800); }
.tier-summary-rate { margin-left: auto; font-size: 15px; font-weight: 700; color: var(--primary); }
.tier-next { margin-top: 6px; font-size: 12px; color: var(--gray-500); line-height: 1.6; }
.tier-next b { color: var(--gray-800); }

/* --- 响应式 --- */
@media (max-width: 1100px) {
  .staff-grid-2 { grid-template-columns: 1fr; }
  .staff-hero { flex-wrap: wrap; }
  .staff-hero-actions { max-width: none; width: 100%; justify-content: flex-start; }
}
@media (max-width: 768px) {
  .staff-hero { flex-direction: column; }
  .staff-hero-actions { order: 3; }
  .staff-tabs .tab-item { padding: 8px 12px; }
  .tier-seg { min-width: 0; flex: 1 1 45%; }
}

/* ============================================================
   v1.81.4 职工端「我的专属招生二维码」
   ============================================================ */
.my-qr-wrap { display: flex; gap: 20px; align-items: flex-start; flex-wrap: wrap; }
.my-qr-canvas-box {
  position: relative;
  flex: 0 0 200px; width: 200px; height: 200px;
  background: #fff; border: 1px solid var(--gray-200); border-radius: 10px;
  padding: 10px; box-sizing: content-box;
  display: flex; align-items: center; justify-content: center;
}
.my-qr-mask {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255, 255, 255, .88);
  color: var(--gray-500); font-size: 13px; text-align: center; padding: 12px;
  border-radius: 10px;
}
.my-qr-info { flex: 1 1 320px; min-width: 0; }
@media (max-width: 768px) {
  .my-qr-canvas-box { flex: 0 0 auto; margin: 0 auto; }
  .my-qr-info { flex: 1 1 100%; }
}

/* ===== v1.81.8 楼栋管理（楼栋从写死选项升级为可维护档案）===== */
.building-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
  gap: 12px;
}
.building-card {
  border: 1px solid var(--gray-200);
  border-radius: 10px;
  padding: 12px 14px;
  background: #fff;
  cursor: pointer;
  transition: border-color .15s, box-shadow .15s, transform .15s;
}
.building-card:hover { border-color: var(--primary); box-shadow: var(--shadow-sm); }
.building-card.active { border-color: var(--primary); background: var(--primary-light); }
.building-card.off { background: var(--gray-50); }
.building-card-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 8px; margin-bottom: 6px;
}
.building-card-head .building-name { font-weight: 700; font-size: 15px; color: var(--gray-900); }
.building-meta {
  display: flex; flex-wrap: wrap; gap: 4px 10px;
  font-size: 12px; color: var(--gray-500); margin-bottom: 10px;
}
.building-stats {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 6px; text-align: center;
  border-top: 1px dashed var(--gray-200); padding-top: 8px;
}
.building-stats > div { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.building-stats b { font-size: 14px; color: var(--gray-900); font-weight: 700; }
.building-stats span { font-size: 11px; color: var(--gray-500); }

/* 楼栋管理弹窗：左列表 + 右表单 */
.building-manager { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; align-items: start; }
.building-manager-list {
  border: 1px solid var(--gray-200); border-radius: 10px; overflow: hidden;
}
.bm-list-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 10px 12px; background: var(--gray-50); border-bottom: 1px solid var(--gray-200);
}
.bm-list-body { max-height: 360px; overflow-y: auto; }
.bm-item {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 12px; border-bottom: 1px solid var(--gray-100);
}
.bm-item:last-child { border-bottom: none; }
.bm-item.active { background: var(--primary-light); }
.bm-item-main { flex: 1 1 auto; min-width: 0; cursor: pointer; }
.bm-item-title { font-weight: 600; display: flex; align-items: center; gap: 6px; margin-bottom: 2px; }
.building-manager-form {
  border: 1px solid var(--gray-200); border-radius: 10px; padding: 14px;
}
.bm-form-title { font-weight: 600; margin-bottom: 12px; }
@media (max-width: 768px) {
  .building-manager { grid-template-columns: 1fr; }
  .bm-list-body { max-height: 220px; }
}

/* ===== v1.81.9 佣金规则提示（单价一律由「返佣规则」决定，不再手填）===== */
.rule-info-box {
  background: var(--primary-light);
  border: 1px solid rgba(59, 130, 246, .25);
  border-radius: 10px;
  padding: 12px 14px;
  line-height: 1.6;
}
.rule-info-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; flex-wrap: wrap; }
/* 标题与按钮都不参与收缩：否则标题会被 flex 压成一字一行（曾把"佣金由返佣规则自动计算"压成竖排） */
.rule-info-title { flex: 0 0 auto; white-space: nowrap; }
.rule-info-head > .btn-text { flex: 0 0 auto; }
.rule-info-box .mt-4 { margin-top: 4px; }

/* 渠道/职工页顶部的规则横幅 */
.rule-banner {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 10px 16px; border-radius: 10px; margin-bottom: 16px;
  background: var(--info-light); border: 1px solid rgba(59, 130, 246, .22);
  font-size: 13px; color: var(--gray-700); line-height: 1.6;
}
.rule-banner.warn { background: var(--warning-light); border-color: rgba(245, 158, 11, .38); }
.rule-banner .rule-name { font-weight: 600; color: var(--gray-900); }
