/* AI生成 */ /* cache-bust 2026-08-24-08-55 */
:root {
  --bg: #f4f6f9;
  --panel: #ffffff;
  --border: #e3e8ef;
  --text: #1f2937;
  --muted: #6b7280;
  --primary: #2563eb;
  --primary-dark: #1d4ed8;
  --green: #16a34a;
  --red: #dc2626;
  --amber: #d97706;
  --shadow: 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.04);
  /* 流式自适应：不再使用固定画布尺寸变量。整体改用 100vw × 100vh + flex/grid，
     自动铺满显示器。侧栏固定 131px、顶栏 56px、内容区按剩余空间自适应。 */
}

* { box-sizing: border-box; }
html, body { height: 100%; }
body { margin: 0; font-family: -apple-system, "Segoe UI", "Microsoft YaHei", sans-serif; background: var(--bg); color: var(--text); font-size: 12.5px; }
.hidden { display: none !important; }

/* ============ 流式自适应布局（替代旧版 16:9 固定画布 + transform scale） ============
   整页占满视口：顶栏 56px + 下方 layout（侧栏 131px + 内容区 flex:1）。
   内容区按需内部滚动；面板/卡片/驾驶舱 grid 全部用真实像素 + fr + minmax 自适应。
   改显示器分辨率或浏览器窗口大小：自动重新排版，零 letterbox 浪费。 */
#stage {
  position: fixed; top: 0; left: 0;
  width: 100vw; height: 100vh;
  background: var(--bg);
  display: flex; flex-direction: column;
  overflow: hidden;
}
/* 应用区填满舞台：顶栏固定 56px，下方 .layout 占满剩余高度，内容区可内部滚动 */
#app { display: flex; flex-direction: column; height: 100%; min-height: 0; }
.layout { flex: 1; min-height: 0; display: flex; }
.content { flex: 1; min-width: 0; overflow-y: auto; }

/* 登录 */
#login-screen { position: fixed; inset: 0; background: linear-gradient(135deg, #2563eb, #1e40af); display: flex; align-items: center; justify-content: center; z-index: 100; }
.login-card { background: #fff; padding: 40px; border-radius: 14px; width: 340px; box-shadow: 0 20px 50px rgba(0,0,0,.25); text-align: center; }
.login-card h1 { margin: 0 0 6px; color: var(--primary-dark); }
.login-sub { color: var(--muted); margin: 0 0 24px; font-size: 12.5px; }
.login-card input { width: 100%; padding: 11px 12px; margin-bottom: 12px; border: 1px solid var(--border); border-radius: 8px; font-size: 12.5px; }
.login-card button { width: 100%; padding: 11px; background: var(--primary); color: #fff; border: none; border-radius: 8px; font-size: 12.5px; cursor: pointer; }
.login-card button:hover { background: var(--primary-dark); }
.login-hint { color: var(--muted); font-size: 12px; margin-top: 14px; }
.login-divider { display: flex; align-items: center; margin: 16px 0 12px; color: var(--muted); font-size: 12px; }
.login-divider::before, .login-divider::after { content: ''; flex: 1; height: 1px; background: var(--border); }
.login-divider span { padding: 0 12px; }
.feishu-login-btn { display: block; width: 100%; padding: 10px; background: #fff; color: #3370ff; border: 1px solid #3370ff; border-radius: 8px; font-size: 12.5px; text-decoration: none; text-align: center; box-sizing: border-box; transition: background .2s; }
.feishu-login-btn:hover { background: #3370ff; color: #fff; }

/* 顶栏 */
.topbar { height: 56px; background: var(--primary); color: #fff; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; }
.topbar-left { display: flex; align-items: center; gap: 12px; }
.brand { font-weight: 600; font-size: 23px; line-height: 1.2; }   /* 字号调到 23px */
.topbar-right { display: flex; align-items: center; gap: 12px; }
.user-tag { font-size: 12.5px; opacity: .9; }
.btn-ghost { background: rgba(255,255,255,.15); color: #fff; border: none; padding: 6px 12px; border-radius: 6px; cursor: pointer; }
.btn-ghost:hover { background: rgba(255,255,255,.28); }

/* 布局 */
.layout { display: flex; min-width: 0; flex: 1; min-height: 0; }
/* flex:1 + min-height:0 让 .layout 在 #app 列布局里撑满可视区高度（顶部 56px 之下全占）
   min-height:0 防止默认 min-height:auto 把内容撑高，破坏下方 .content 的 100% 链路
   —— 之前只写了 display:flex; min-width:0，漏了 flex:1 + min-height:0
   导致 .layout 高度 = 内容自然高，往下所有 height:100% / flex:1 链路全断 */
/* 默认态：侧栏显示 emoji 图标 + 文字（emoji 由 app.js 在运行时拆分为 .nav-item-emoji / .nav-item-text） */
/* 2026-10-01 SBAR131：侧栏 133→131px（SBAR133 之后再收窄一档，本轮仍只改宽度、留白不动）。
   【下面这段留白压缩是 SBAR140 做的，后续沿用，别再改回去】
   162→140px 那轮腾出 19px：侧栏 padding 7→3（−8）、条目 padding 11→5（−12）、
   图标列 20→18（−2）、图标右距 6→5（−1）、徽标左距 6→4（−2）、徽标内距 3→2（−2）;
   active 态同步：胶囊左起 3+2=5px = 非 active 的 padding-left 5px，切换页面文字不跳位。
   ⚠️ 其中那个 emoji 的 margin-left:2px 是「左对齐时代」的补偿项 —— SBARCTR 改居中后已多余，
      SBARZERO 已删（居中本身对称，补偿项反而把内容推偏）。详见本块末尾 SBARZERO 段。
   【131px 的可放性：真实站点注入 + 逐 px 扫描实测，不是算出来的】
   最宽条目仍是「💸 预支垫付 99+」= 109.11px（emoji 18 + 间距 5 + 文字 50 + 徽标间距 4 + 徽标 22.11）；
   131px 扣掉 padding 6px 与 scrollbar-gutter 16px 后条目可用宽 109px；
   实测该条目内容右缘距侧栏 clientWidth 尚有 7.89px、距 overflow-x:hidden 的裁切边界 22.89px ⇒ 零裁字。
   实测硬下界：侧栏 ≥125px 时无横向滚动；≤124px 立刻冒横向滚动条（sw 恒 109 = 最宽条目自然宽）。
   侧栏宽度沿革：130(原始) → 162(SBAR) → 140(SBAR140) → 133(SBAR133) → 131(SBAR131)。
   ⚠️ 131px 距硬下界只剩 6px；若新增更宽条目、或徽标涨成「999+」，会先顶到 125px 那条线。
   【2026-10-01 SBARCTR：宽度保持 131px 不变，把条目内容（表情+文字+角标）整体居中】
   做法：.nav-item 加 text-align:center（条目内容是行内流，无需改 flex；留白一个字节没动）。
   实测（1920×1080 真实站点注入）：21 条左右空差 ≤0.11px；最宽条目「💸 预支垫付 99+」内容 99.11px，
   active 态条目盒 103px ⇒ 余量 3.89px；非 active 态条目盒 99px ⇒ −0.11px（亚像素，基线原本就是 −0.11px）。
   代价：emoji 列不再对齐 —— 无角标行 emoji 左缘 13px、带角标行 2px（差 11px），这是「按各行内容居中」的必然结果。
   【2026-10-01 SBARZERO：把上面两处副作用双双归零（老板拍板「归零」；分组标题仍保持左对齐，未纳入居中）】
   根因：SBAR140 的 .nav-item.active .nav-item-emoji{margin-left:2px} 是「左对齐时代」为补偿
     active 的 padding-left:3px（比非 active 的 5px 少 2px）而加的；但居中本身是对称的，
     该补偿项在居中体系下不再需要，反而把内容整体推偏 ⇒ 成为两处偏差的唯一来源。
   推导：设 emoji 的 margin-left=M、badge 的 margin-right=B，content box 宽 W、内容总宽 C：
     leftGap = M + (W−C)/2，rightGap = (W−C)/2 + B ⇒ 左右空差 ≡ M − B。
     ⇒ 无角标行（无 badge）差 = M = 2px；有角标行差 = M − B = 2−2 = 0（实测 0.11px 亚像素）。
     ⇒ 切页位移 = active 与 inactive 的 emoji 左缘之差，亦由 M 单独决定（M=2 时右移 1px）。
     ★ 结论：两个补偿项必须同时归零 —— 只删 M 会让有角标行反向右偏 2px。
   做法：删 .nav-item.active .nav-item-emoji 的 margin-left:2px、.nav-item.active .nav-badge 的 margin-right:2px。
   ⚠️ 胶囊缩进未动：.nav-item.active 的 padding 3px、.nav-item-emoji 的 width 18px + margin-right 5px 原样保留
     ⇒ 胶囊（浅灰底 + border-radius 6px 0 0 6px + text 的 box-shadow 补缝）外观不变。
   实测（1920×1080 真实站点注入，同一页面同一数据，未注入 vs 注入归零方案）：
     · active 无角标行（数据中心）左右空  16 / 14（差 2px）  →  15 / 15（差 0px）
     · active 有角标行（预支垫付 99+）左右空 2 / 1.89（差 0.11px） →  1.94 / 1.95（差 −0.01px）
     · 切页位移（active↔非 active）：无角标行 1px → 0px；有角标行 0px → −0.06px（亚像素）
     · 21 条最大左右空差 0.11px → 0.01px
   侧栏仍 131px、无横滚、最宽条目余量仍 3.89px（零裁字）；分组标题（.nav-group-title / .nav-sub-title）
   保持左对齐（实测 textAlign=start、左缘 @8 与改前逐字节相同），未纳入居中。 */
.sidebar {
  width: 131px; background: var(--panel); border-right: 1px solid var(--border);
  padding: 12px 3px; flex: 0 0 auto;          /* SBAR140：7px→3px，省下的横向空间让给导航条目 */
  overflow-x: hidden; overflow-y: auto; scrollbar-gutter: stable;   /* SBAR：横向锁死（内容已按实测留足宽）；竖向仍可滚 */
}
.nav-group-title { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: .05em; margin: 8px 5px 4px; }       /* 2026-08-24 高度压缩：12/5→8/4 */
.nav-sub-title { font-size: 11px; color: var(--muted); margin: 6px 5px 2px; padding-left: 2px; opacity: .78; letter-spacing: .02em; }  /* 2026-09-15 FIN 批：财务管理组二级分组标题（钱出去/算钱/记账），与一级大组标题区分 */
.nav-item { display: block; text-align: center; padding: 4px 5px; border-radius: 6px; color: var(--text); text-decoration: none; cursor: pointer; margin-bottom: 1px; white-space: nowrap; font-size: 12.5px; line-height: 1.4; }   /* 2026-08-24 高度再压20%：padding 7→4、line-height 1.5→1.4、高度 33.5→26.2px（-21.8%）*/   /* 2026-10-01 SBARCTR：加 text-align:center —— 131px 宽度写死不变，把「表情+文字+角标」整体居中；实测 21 条左右空差 ≤0.11px、最宽条目（💸预支垫付 99+，内容 99.11px）active 余量 3.89px；代价：emoji 列不再对齐（无角标行 13px / 带角标行 2px）；SBARZERO 已把「active 无角标行左右空差 2px」与「切页 1px 位移」双双归零（删 active 的 emoji ml 与 badge mr 这对补偿项）。详见下方批次注释块 */
.nav-item .nav-item-emoji { display: inline-block; width: 18px; text-align: center; vertical-align: middle; line-height: 1; margin-right: 5px; }  /* 2026-09-05 图标对齐：固定宽 20px 居中，消除不同 emoji 字形宽窄导致的文字错位；vertical-align 中线对齐解决 🗓 等字形偏上 */
.nav-item .nav-item-text { display: inline; }
.nav-item:hover { background: #eef2ff; }
.nav-item.active { background: transparent; color: #334155; padding-left: 3px; padding-right: 3px; }
.nav-item.active .nav-item-emoji { background: #f1f5f9; border-radius: 6px 0 0 6px; }        /* 2026-10-01 SBARZERO：删 margin-left:2px —— SBAR140 在「左对齐时代」加的补偿项，居中后多余且是偏差源，详见上方注释块 */
.nav-item.active .nav-item-text { background: #f1f5f9; box-shadow: -6px 0 0 0 #f1f5f9; }
.nav-item.active .nav-badge { background: #ef4444; border-radius: 8px; }                              /* 2026-10-01 SBARZERO：删 margin-right:2px —— 与上一行 emoji 的 ml 成对，只删其一会让有角标行反向右偏 2px */
.content { flex: 1; min-width: 0; padding: 22px 20px; overflow-y: auto; background: var(--bg); display: flex; flex-direction: column; /* 让顶层 view（如 .todo-page）作为 flex item 可用 flex:1 拉满可视区，不再受 height:100% 在滚动容器里失效问题影响 */ }

/* 视图头 */
.view-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
.view-head h2 { margin: 0; font-size: 22px; font-weight: 700; color: #0f172a; letter-spacing: -0.3px; }
/* 主按钮（页面"+新增"等）：克制纯色蓝 + 轻阴影，跟整体白底灰边风格一致；不再用渐变，避免抢眼 */
.btn-primary { background: #2563eb; color: #fff; border: 0; padding: 8px 16px; border-radius: 8px; cursor: pointer; font-size: 12.5px; font-weight: 500; box-shadow: 0 1px 3px rgba(37,99,235,.18); transition: all .15s; }
.btn-primary:hover { background: #1d4ed8; box-shadow: 0 2px 8px rgba(37,99,235,.3); }
.btn-danger { background: #fff; color: var(--red); border: 1px solid #fecaca; padding: 3px 8px; border-radius: 6px; cursor: pointer; font-size: 12.5px; }
.btn-danger:hover { background: #fef2f2; }
.btn-reject { color: #111; }
.btn-sm { padding: 3px 8px; border-radius: 6px; border: 1px solid var(--border); background: #fff; cursor: pointer; font-size: 12.5px; transition: all .15s; }
.btn-sm:hover { background: #f8fafc; border-color: #cbd5e1; transform: translateY(-1px); box-shadow: 0 2px 6px rgba(15,23,42,.06); }
/* 2026-09-20 待购框「＋ 一键投保」（class="btn-sm btn-primary"）——同下面 .btn-approve 的层叠问题：
   .btn-sm 定义在 .btn-primary **之后**且同为单类选择器 ⇒ .btn-sm 的 background:#fff 会盖掉品牌蓝，
   只剩 .btn-primary 的 color:#fff，形成「白底白字」——真浏览器实测对比度 1.00:1（等于看不见，老板截图反馈）。
   这里改用**双类选择器 .btn-sm.btn-primary**（特异性更高，不依赖先后顺序）恢复蓝底白字；
   hover 用三选择器 .btn-sm.btn-primary:hover 压过 .btn-sm:hover。
   ⚠️ 若日后要改成「白底蓝字」与「联动退保」同型，只把这 2 行的 background/color 对调即可。 */
.btn-sm.btn-primary { background: #2563eb; color: #fff; border: 1px solid #2563eb; font-weight: 500; box-shadow: 0 1px 2px rgba(37,99,235,.2); }
.btn-sm.btn-primary:hover { background: #1d4ed8; border-color: #1d4ed8; color: #fff; box-shadow: 0 2px 8px rgba(37,99,235,.3); }
/* 表格内"通过"按钮：必须在 .btn-sm 之后定义（class="btn-sm btn-approve"），否则 .btn-sm 的 background:#fff 会覆盖绿色渐变 */
.btn-approve { background: linear-gradient(135deg, #10b981, #059669); color: #fff; border: 1px solid #10b981; box-shadow: 0 2px 6px rgba(16,185,129,.22); font-weight: 500; }
.btn-approve:hover { background: linear-gradient(135deg, #059669, #047857); border-color: #047857; box-shadow: 0 4px 12px rgba(16,185,129,.35); }
.btn-dark { background: #fff; color: #111827; border: 1px solid var(--border); }
.btn-dark:hover { background: #f1f5f9; }
.btn-sm.active { background: var(--primary); color: #fff; border-color: var(--primary); }
.btn-sm.active:hover { background: var(--primary-dark); }
/* 设备审批（权限管控页底部）：批准（绿）/拒绝（红边） */
.btn-ok { border: 0; background: #16a34a; color: #fff; }
.btn-ok:hover { background: #15803d; }
.btn-no { border: 1px solid #fecaca; background: #fff; color: #dc2626; }
.btn-no:hover { background: #fef2f2; }
.btn-supplement { background: #fff7ed; color: var(--amber); border-color: #fdba74; font-weight: 500; font-size: 12px; padding: 3px 7px; border-radius: 5px; }
.btn-supplement:hover { background: #fef3c7; }

/* ============ 标准 Box Pattern（所有「立体浮雕」风框体共用） ============
   .table-wrap（表格）/ .card（数据卡）/ .cal-wrap（日历）等都遵循同一套：
   白底渐变 + 多层柔阴影 + 1px 描边 + 顶部高光线 + 圆角 12px
   任何新增面板/卡片请加 .box-panel 类以自动继承；不要单独另写一套阴影。 */
.box-panel,
.table-wrap,
.card,
.cal-wrap,
.sup-approval-wrap {
  border: 1px solid rgba(15, 23, 42, 0.18);
  border-radius: 12px;
  background: linear-gradient(180deg, #ffffff 0%, #fafbfc 100%);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.9) inset,
    0 -1px 0 rgba(15, 23, 42, 0.04) inset,
    0 16px 32px -12px rgba(15, 23, 42, 0.20),
    0 6px 12px -4px rgba(15, 23, 42, 0.10),
    0 2px 4px rgba(15, 23, 42, 0.05);
  position: relative;
}
/* .card 顶部高光线（视觉锚定） */
.box-panel::before,
.card::before,
.cal-wrap::before {
  content: '';
  position: absolute;
  left: 16px; right: 16px; top: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.95) 50%, transparent 100%);
  pointer-events: none;
}
/* .card 自身属性（padding / overflow）—— 共享 Box Pattern 之后各自定制 */
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 14px; margin-bottom: 20px; }
.card { padding: 16px 18px; overflow: hidden; }
.card .label { color: var(--muted); font-size: 12.5px; line-height: 1.4; min-height: 36px; } /* 36px ≈ 2 行 13px 字号，确保长短标签都能撑到同一高度、卡片数字对齐 */
.card .value { font-size: 26px; font-weight: 700; margin-top: 6px; }
.card .value.green { color: var(--green); }
.card .value.red { color: var(--red); }
.card .value.blue { color: var(--primary); }
.card .value.yellow { color: var(--amber); }
.card .value.gray { color: var(--muted); }
/* 员工台账顶部 6 张统计卡：整体高度缩小约 40%（保持浮雕风） */
.cards .card { padding: 12px 14px; }
.cards .card .label { font-size: 12.5px; line-height: 1.3; min-height: 28px; }
.cards .card .value { font-size: 20px; margin-top: 6px; }
/* 员工台账汇总卡片：可点击筛选 */
.card.clickable { cursor: pointer; transition: transform .08s ease, box-shadow .12s ease, border-color .12s ease; }
.card.clickable:hover { transform: translateY(-2px); box-shadow: 0 6px 18px rgba(30,64,175,.12); }
.card.clickable.active { border-color: var(--primary); box-shadow: 0 0 0 2px var(--primary) inset; background: var(--accent-soft, #eef4ff); }
.card.clickable.active .label { color: var(--primary); font-weight: 600; }

/* 表格 */
/* 表格框体：Box Pattern 已在上方共用选择器中定义，这里只补 .table-wrap 的滚动属性 */
.table-wrap { overflow-x: auto; overflow-y: hidden; max-width: 100%; }
.table-wrap > table { max-width: 100%; }
table { width: 100%; border-collapse: collapse; border-spacing: 0; }

/* ===== .table-wrap 滚动条美化（2026-09-08 老板反馈）：
   滚动条缩窄到 8px、轨道完全透明、thumb 缩窄到 4px 并两端各留 2px 透明边，
   视觉上像独立漂浮的细条，不再紧贴右边圆角边框，保留 Box Pattern 对称性。
   各页面（员工/供方/工伤/合同等）的滚动条统一一套样式。 */
.table-wrap {
  scrollbar-width: thin;                          /* Firefox：thin 模式 */
  scrollbar-color: rgba(148,163,184,.55) transparent;
}
.table-wrap::-webkit-scrollbar { width: 8px; height: 8px; background: transparent; }
.table-wrap::-webkit-scrollbar-track { background: transparent; }
.table-wrap::-webkit-scrollbar-button { display: none; height: 0; width: 0; background: transparent; }  /* 去掉上下两个箭头按钮（美化） */
.table-wrap::-webkit-scrollbar-thumb {
  background: rgba(148,163,184,.55);
  border-radius: 4px;
  border: 2px solid transparent;
  background-clip: padding-box;                   /* thumb 实色 = 4px，两端各 2px 透明 margin */
}
.table-wrap:hover::-webkit-scrollbar-thumb { background-color: rgba(100,116,139,.85); }
.table-wrap::-webkit-scrollbar-thumb:hover { background-color: rgba(71,85,105,.95); }
.table-wrap::-webkit-scrollbar-corner { background: transparent; }
/* ===== PC 端列表页通用美化模板（适用所有 .table-wrap 页面：供方管理/员工/合同/预支/工伤等） ===== */
/* 行 hover：左侧蓝色高亮条 + 背景柔和（专业感，不花哨） */
.table-wrap table tbody tr { transition: background .12s, box-shadow .12s; }
.table-wrap table tbody tr:hover { background: #f8fafc; }
.table-wrap table tbody tr:hover td:first-child { box-shadow: inset 4px 0 0 #2563eb; }
/* 表头：压缩（灰底 + 字重 600 + padding 10px + 字号 13px 紧凑） */
.table-wrap table thead th { background: #f1f5f9; color: #334155; font-weight: 600; font-size: 12.5px; letter-spacing: 0.3px; padding: 10px 14px; border-bottom: 1px solid #e2e8f0; white-space: nowrap; }
/* td：压缩 40%（padding 8px + line-height 1.3 + 字号 12.5px → 每行 ~30px，原 ~45px） */
.table-wrap table tbody td { padding: 8px 14px; font-size: 12.5px; color: #1e293b; border-bottom: 1px solid #f1f5f9; line-height: 1.3; }
/* 表内字号同步压缩：所有 chip / badge / 状态徽章 与 td 一致 = 12.5px；字重 400（与普通文字一致，靠徽章背景色区分） */
.table-wrap .badge,
.table-wrap .conclusion-badge,
.table-wrap .extra-chip { font-size: 12.5px; font-weight: 400; letter-spacing: 0; text-transform: none; padding: 1px 8px; }
.table-wrap table tbody tr:last-child td { border-bottom: 0; }
/* 表格右侧「操作列」吸附——表格横向滚动时，操作按钮始终可见（飞书小窗/窄屏刚需） */
.table-wrap table th:last-child,
.table-wrap table td:last-child { position: sticky; right: 0; background: var(--panel, #fff); box-shadow: -6px 0 6px -5px rgba(15,23,42,.12); z-index: 1; }
.table-wrap table thead th:last-child { background: #f8fafc; z-index: 2; }
.table-wrap table tbody tr:hover td:last-child { background: #f9fafb; }
/* 考勤矩阵表：横排日期 1~31，每天一格（含星期几），填满整页宽度 */
.att-matrix-table { width: 100%; table-layout: fixed; border-collapse: collapse; font-size: 12.5px; }
.att-matrix-table th, .att-matrix-table td { padding: 9px 2px; border: 1px solid #e5e7eb; font-size: 12.5px; word-break: break-all; text-align: center; vertical-align: middle; }
.att-matrix-table thead th { background: #f1f5f9; font-weight: 600; position: sticky; top: 0; z-index: 2; }
.att-matrix-table tbody tr:nth-child(even) td { background: #fafbfc; }
.att-matrix-table tbody tr:hover td { background: #eef2ff; }

/* 表头列 */
.att-th-name { width: 90px; text-align: center; vertical-align: middle; }
.att-th-pos { width: 70px; text-align: center; vertical-align: middle; font-size: 12px; color: #666; }
.att-th-d { text-align: center; font-weight: 700; font-size: 12.5px; position: relative; }
.att-th-stat { width: 56px; text-align: center; }

/* 周日列：淡红底 + 红字，便于区分 */
.att-th-d.att-sun { background: #fee2e2; color: #dc2626; }
.att-cell.att-sun { background: #fff7f7; }
.att-cell.att-sun.att-hit { background: #fcefee; }

/* 日期下的星期几 */
.att-dow { display: block; font-size: 10px; color: #94a3b8; font-weight: 400; margin-top: 2px; }
.att-th-d.att-sun .att-dow { color: #dc2626; }

/* 单格单元格 */
.att-cell { text-align: center; vertical-align: middle; padding: 6px 2px !important; line-height: 1.8; }
.att-cell.att-hit { background: #f0fdf4; }
.att-cell.att-abs { background: #fef2f2; color: #dc2626; font-size: 12px; font-weight: 600; }
.att-cell.att-miss { color: #d1d5db; }
.att-tm { font-size: 11px; color: #374151; line-height: 1.4; }
.att-addr { font-size: 9px; color: #9ca3af; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: 1.2; }

/* 打卡率颜色 */
.att-rate { font-size: 10px; font-weight: 600; }
.att-rate.rg { color: #16a34a; }
.att-rate.rw { color: #ca8a04; }
.att-rate.rb { color: #dc2626; }

/* 统计列 */
.att-td-name { text-align: center; }
.att-td-pos { font-size: 11px; color: #666; text-align: center; }
.att-td-stat { text-align: center; }

/* 考勤筛选栏美化 */
.att-filter-card { padding: 16px 20px 12px; border-radius: 10px; }
.att-filter-row { display: flex; align-items: center; justify-content: flex-end; gap: 12px; flex-wrap: wrap; }
.att-sel { padding: 8px 12px; border: 1px solid #cbd5e1; border-radius: 8px; font-size: 12.5px; background: #fff; min-width: 100px; cursor: pointer; outline: none; transition: border-color .15s, box-shadow .15s; }
.att-sel:focus { border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,.15); }
.att-btn-load { padding: 8px 24px; border-radius: 8px; font-size: 12.5px; height: auto; }
/* 权限管控矩阵表：8 个勾选横向均衡排列 */
.perm-table { table-layout: fixed; width: 100%; }
.perm-table th, .perm-table td { padding: 10px 4px; text-align: center; }
.perm-table th:first-child, .perm-table td:first-child { width: 220px; white-space: nowrap; font-weight: 600; }
.perm-table thead th { font-weight: 600; }
.fin-bank-table { min-width: 1290px; white-space: nowrap; }
.fin-bank-table th, .fin-bank-table td { padding: 9px 11px; }
.fin-bank-table th:first-child, .fin-bank-table td.seq { width: 48px; text-align: center; color: var(--muted); font-variant-numeric: tabular-nums; }
.fin-bank-table th.row-op-head, .fin-bank-table td.row-op { width: 168px; }
.fin-bank-table td.row-op .row-actions { white-space: nowrap; }
.fin-bank-table td.row-op .btn-sm { padding: 3px 7px; font-size: 12px; border-radius: 5px; }
.subject-tag { display: inline-block; background: #eef2ff; color: #4f46e5; padding: 2px 8px; border-radius: 12px; font-size: 12px; font-weight: 600; }
.disburse-type-toggle { cursor: pointer; color: #4f46e5; font-weight: 600; user-select: none; white-space: nowrap; }
.disburse-type-toggle:hover { text-decoration: underline; }
.disburse-type-toggle.need-import { color: #b45309; }
.remark-clip { cursor: default; border-bottom: 1px dotted var(--muted); }
.remark-tip { display: none; position: fixed; z-index: 9999; max-width: 340px; padding: 6px 10px; background: #1f2937; color: #fff; border-radius: 7px; font-size: 12.5px; line-height: 1.55; box-shadow: 0 8px 22px rgba(0,0,0,.28); white-space: normal; word-break: break-all; }
.remark-tip mark { background: #fbbf24; color: #1f2937; padding: 0 1px; border-radius: 2px; }
.fin-bank-table mark { background: #fff3a0; color: inherit; padding: 0 1px; border-radius: 2px; font-weight: 600; }
.fin-detail-table mark { background: #fff3a0; color: inherit; padding: 0 1px; border-radius: 2px; font-weight: 600; }
.bank-badge { display: inline-block; min-width: 18px; text-align: center; font-size: 12px; font-weight: 700; line-height: 18px; border-radius: 4px; margin-right: 6px; color: #fff; }
.bank-badge.cmb { background: #e8543f; }   /* 招商银行：红 */
.bank-badge.icbc { background: #c8102e; }  /* 工商银行：红（深） */
th, td { padding: 11px 14px; text-align: center; border-bottom: 1px solid var(--border); }
th { background: #f8fafc; color: var(--muted); font-weight: 600; font-size: 12.5px; }
tbody tr:hover { background: #f9fafb; }
.row-actions { display: flex; gap: 6px; }

/* 2026-08-14：用工单位表格的字号 / 行高改为与「员工入离职管理」一致（默认全局 th/td：padding 11/14、字号 13、th 浅灰底 #f8fafc），不再单独放大字号 14 / 压紧行高 8/9 */
/* 2026-09-02 晚：整表压缩到一屏——表头改「开票/发薪」短文案、撤中间列一刀切 110px、padding 14→8、
   驻厂管理员 340→300（3 标签仍一行）、名称列 180→150、min-width 1260→1000（消除人为拉伸出的空白） */
.tbl-client_companies table { white-space: nowrap; min-width: 1000px; }
.tbl-client_companies th, .tbl-client_companies td { padding: 11px 8px; font-size: 12.5px; text-align: center; vertical-align: middle; }
/* 2026-09-02 晚：撤掉中间列一刀切 min-width:110px——派驻/定位/合作协议/员工合同/开票/发薪等窄列按内容收缩，消除红框空白 */
/* 2026-09-14（SADM）🔴 位置定位 → 语义定位。
   本段原有 :nth-child(7) / (2) / (11) 三条，在上一批（CS）加「状态」列后【整体错位】：
   min-width:300px 打到了「状态」列（真浏览器实测 374px）、max-width:140px 打到了「操作」列
   （把 编辑/删除/其他 挤成一团）—— 这正是老板本轮说的「页面项的间隔均匀点」。
   现改为按列 key 生成的 .c-<key> 类定位（thead/tbody 生成时输出 class="c-<key>"），
   以后在任何位置加列都不会再连锁错位。原有 :nth-child 列宽规则已删除。
   列序（现状）：序号|单位名称|单位简称|我司抬头|主驻厂|副驻厂|在职人数|状态|定位管理|合作协议|员工合同|操作 */
.tbl-client_companies th.c-sidx, .tbl-client_companies td.c-sidx { width: 40px; min-width: 38px; max-width: 50px; }
.tbl-client_companies th.c-name, .tbl-client_companies td.c-name { width: 190px; max-width: 200px; min-width: 120px; }
.tbl-client_companies td.c-name { overflow: hidden; text-overflow: ellipsis; } /* 单位名称列超长时省略，仍居中显示 */
.tbl-client_companies th.c-short_name, .tbl-client_companies td.c-short_name { width: 132px; max-width: 150px; }
.tbl-client_companies th.c-affiliated_company, .tbl-client_companies td.c-affiliated_company { width: 96px; max-width: 110px; }
.tbl-client_companies th.c-__sa_main, .tbl-client_companies td.c-__sa_main,
.tbl-client_companies th.c-__sa_deputy, .tbl-client_companies td.c-__sa_deputy { width: 132px; min-width: 120px; max-width: 168px; padding-left: 4px; padding-right: 4px; } /* 主/副驻厂：两列等宽 */
.tbl-client_companies th.c-__empact, .tbl-client_companies td.c-__empact { width: 88px; min-width: 84px; max-width: 110px; }
.tbl-client_companies th.c-__coop_status, .tbl-client_companies td.c-__coop_status { width: 86px; min-width: 82px; max-width: 100px; } /* 状态：合作中 三字 + 徽标内边距 */
.tbl-client_companies th.c-__clockin_locations, .tbl-client_companies td.c-__clockin_locations { width: 108px; max-width: 124px; }
.tbl-client_companies th.c-__contract_file, .tbl-client_companies td.c-__contract_file { width: 128px; max-width: 150px; }
.tbl-client_companies th:last-child, .tbl-client_companies td:last-child { width: 1%; white-space: nowrap; text-align: center; } /* 操作列按内容收缩、表头居中对齐下方按钮组中心 */
.tbl-client_companies td.c-__contract_qr { width: 150px; max-width: 160px; overflow: hidden; text-overflow: ellipsis; } /* 员工合同列：已上传文件名过长时省略，防撑宽 */

/* 2026-09-17 EMPCOL：用工单位管理新增两个独立列「开票信息」「评分」（老板要求：放在「预支区间」列右边）。
   这两列是**数据列**，不随「操作」列折叠（折叠隐藏的是 td.col-ops-td），故始终可见。
   宽度按内容收缩：4 字按钮 + 单元格内边距；表格整体更宽，由 .table-wrap 横向滚动承载。 */
.tbl-client_companies th.c-__billing, .tbl-client_companies td.c-__billing,
.tbl-client_companies th.c-__rating, .tbl-client_companies td.c-__rating { width: 92px; min-width: 88px; max-width: 104px; }
.tbl-client_companies .conclusion-badge { white-space: nowrap; }

/* 2026-08-15：员工入离职管理表格文字错行修复。
   原因：默认 table 未禁止换行，长单位名/供方名在窄列自动换行，把整行撑高、与上行不对齐。
   修正：单元格内禁止换行，长文字由 .table-wrap 横向滚动承载；操作列按钮组也 nowrap，避免按钮错位。 */
.tbl-employees table th,
.tbl-employees table td { white-space: nowrap; }
.tbl-employees .row-actions { white-space: nowrap; }
.tbl-client_companies .btn-sm, .tbl-client_companies .btn-danger, .tbl-client_companies .sa-tag, .tbl-client_companies .sa-empty, .tbl-client_companies .conclusion-badge { font-size: 12.5px; } /* 与表格内文字保持同号 */
/* 用工单位「合同二维码」列按钮：蓝底白字；字号/padding 继承 .btn-sm / .tbl-client_companies .btn-sm，与同行其他按钮同型 */
.btn-qr { background: #eff6ff !important; color: #2563eb !important; border: 1px dashed #93c5fd !important; border-radius: 6px !important; font-size: 12px !important; font-weight: 500; cursor: pointer; }
.btn-qr:hover { background: #dbeafe !important; border-style: solid !important; }
/* 用工单位管理：未指定驻厂管理员的提醒横幅 */
.site-admin-warn { background: #fff7ed; color: #9a3412; border: 1px solid #fed7aa; border-radius: 10px; padding: 10px 14px; margin: 0 0 12px; font-size: 12.5px; line-height: 1.6; }
.site-admin-warn b { color: #c2410c; }
.site-admin-warn .warn-names { color: #b91c1c; font-weight: 600; }
/* 用工单位列表「驻厂管理员」列：多选标签 + 弹出勾选 */
/* 2026-08-14：flex-wrap 改为 nowrap — 上一版 nowrap 在 td 较窄时（< 120px）会把 + 按钮挤到第二行，与「点击上传」上下错位。*/
/* 保留 max-width: 220px 作为多 tag 场景的硬上限；溢出 td 时不换行，向右溢出比上下错位视觉更友好。*/
.sa-cell { position: relative; display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; max-width: 300px; min-height: 28px; } /* 2026-09-02 280→360→300：跟随驻厂管理员列宽 340→300，主+2副+按钮一行排3个标签不错行 */
.sa-empty { color: #94a3b8; font-size: 12px; white-space: nowrap; }
.sa-tag { display: inline-flex; align-items: center; gap: 3px; padding: 1px 4px 1px 3px; background: #eff6ff; color: #334155; border: 1px solid #bfdbfe; border-radius: 5px; font-size: 12px; line-height: 1.6; white-space: nowrap; } /* 2026-09-02 名字文字改正文色（同我司抬头列），框体收窄 */
.sa-rm { border: 0; background: transparent; color: #1d4ed8; cursor: pointer; padding: 0 3px; font-size: 12px; line-height: 1; border-radius: 3px; }
.sa-rm:hover { background: #dbeafe; color: #b91c1c; }
.sa-add { width: 22px; height: 22px; border: 0; background: transparent; color: #2563eb; opacity: 0.4; border-radius: 50%; cursor: pointer; font-size: 12.5px; line-height: 1; padding: 0; flex-shrink: 0; transition: all .15s; font-weight: 400; display: inline-flex; align-items: center; justify-content: center; }
.sa-add:hover { opacity: 1; background: rgba(37, 99, 235, .08); transform: scale(1.1); }
.sa-empty-add { display: inline-flex; align-items: center; gap: 4px; padding: 3px 10px 3px 8px; border: 1px dashed #93c5fd; background: linear-gradient(135deg, #f0f7ff 0%, #fff 100%); color: #2563eb; border-radius: 6px; font-size: 12px; cursor: pointer; transition: all .15s; font-weight: 500; font-family: inherit; line-height: 1.6; white-space: nowrap; }
.sa-empty-add:hover { border-color: #2563eb; border-style: solid; background: linear-gradient(135deg, #dbeafe, #eff6ff); color: #1d4ed8; box-shadow: 0 4px 12px rgba(37,99,235,.15); transform: translateY(-1px); }
.sa-empty-add-plus { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 50%; background: linear-gradient(135deg, #2563eb, #1d4ed8); color: #fff; font-size: 12px; line-height: 1; font-weight: 600; flex-shrink: 0; box-shadow: 0 1px 3px rgba(37,99,235,.3); }
.sa-pop { display: none; position: fixed; z-index: 1000; background: #fff; border: 1px solid var(--border, #e5e7eb); border-radius: 8px; box-shadow: 0 8px 24px rgba(15, 23, 42, .18); padding: 6px; min-width: 140px; max-height: 240px; overflow-y: auto; }
.sa-pop.show { display: block; }
.sa-pop-item { display: flex; align-items: center; gap: 6px; padding: 4px 6px; border-radius: 6px; font-size: 12.5px; cursor: pointer; }
.sa-pop-item:hover { background: #f1f5f9; }
.sa-pop-item input { margin: 0; }
.sa-tag-primary { background:#fef3c7; color:#334155; border-color:#fcd34d; font-weight:400; } /* 2026-09-02 文字改正文色/常规字重，仅徽章保留彩色 */
.sa-tag-primary b { background:#f59e0b; color:#fff; border-radius:3px; padding:0 4px; margin-right:3px; font-size:12px; }
.sa-tag-deputy { background:#ecfdf5; color:#334155; border-color:#a7f3d0; font-weight:400; }
.sa-tag-deputy b { background:#10b981; color:#fff; border-radius:3px; padding:0 4px; margin-right:3px; font-size:12px; }
.sa-pop-empty { padding: 6px 8px; color: #94a3b8; font-size: 12px; }
/* 合并后的「驻厂」列：整格可点击 */
.sa-merged { cursor: pointer; padding: 2px 4px; min-width: 80px; transition: background .15s; border-radius: 4px; }
.sa-merged:hover { background: #f0f7ff; }
.sa-merged .sa-add { font-size: 12px; width: 20px; height: 20px; line-height: 20px; }

/* ================= 驻厂管理员两步选择模态框（v4） ================= */
/* 步骤指示器 */
.sa-stepbar { display: flex; align-items: center; margin: 0 4px 18px; padding: 4px 6px; }
.sa-step { display: flex; align-items: center; gap: 8px; color: #94a3b8; font-size: 12.5px; font-weight: 500; }
.sa-step-num { width: 26px; height: 26px; border-radius: 50%; background: #e5e7eb; color: #94a3b8; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; flex-shrink: 0; }
.sa-step-active { color: #2563eb; }
.sa-step-active .sa-step-num { background: linear-gradient(135deg, #2563eb, #1d4ed8); color: #fff; box-shadow: 0 4px 10px rgba(37,99,235,.3); }
.sa-step-done { color: #10b981; }
.sa-step-done .sa-step-num { background: linear-gradient(135deg, #10b981, #059669); color: #fff; }
.sa-step-line { flex: 1; height: 2px; background: #e5e7eb; margin: 0 10px; border-radius: 1px; min-width: 20px; }
.sa-step-line-done { background: linear-gradient(90deg, #10b981, #2563eb); }
/* 用户选择列表卡片 */
.sa-list-card { background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%); border: 1px solid #e5e7eb; border-radius: 12px; padding: 12px 12px; margin-bottom: 12px; }
.sa-list-title { font-size: 12.5px; color: #334155; margin-bottom: 8px; padding-bottom: 6px; border-bottom: 1px dashed #e5e7eb; }
.sa-list-subtitle { font-size: 12.5px; color: #64748b; margin-bottom: 10px; padding: 6px 10px; background: #fff; border-radius: 8px; border: 1px solid #e5e7eb; }
.sa-list-empty { padding: 18px; color: #94a3b8; text-align: center; font-size: 12.5px; }
.sa-list-hint { font-size: 12px; color: #64748b; margin-top: 10px; text-align: right; font-weight: 500; }
/* 用户选择条目 */
.sa-pick { display: flex; align-items: center; gap: 9px; padding: 9px 12px; border-radius: 10px; cursor: pointer; border: 1.5px solid #e5e7eb; background: #fff; transition: all .15s; margin-bottom: 5px; }
.sa-pick:hover { border-color: #93c5fd; background: #f0f7ff; }
.sa-pick-selected { border-color: #2563eb; background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%); box-shadow: 0 4px 12px rgba(37,99,235,.15); }
.sa-pick-selected.sa-pick-deputy { border-color: #10b981; background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5 100%); box-shadow: 0 4px 12px rgba(16,185,129,.15); }
.sa-pick-disabled { opacity: .5; cursor: not-allowed; }
.sa-pick-disabled:hover { border-color: #e5e7eb; background: #fff; }
.sa-pick-radio { margin: 0; width: 20px; height: 20px; accent-color: #2563eb; cursor: pointer; flex-shrink: 0; }
.sa-pick-check { width: 22px; height: 22px; border: 1.5px solid #cbd5e1; border-radius: 6px; background: #fff; display: flex; align-items: center; justify-content: center; font-size: 12.5px; color: transparent; flex-shrink: 0; transition: all .15s; font-weight: 700; }
.sa-pick-selected .sa-pick-check { border-color: #10b981; background: #10b981; color: #fff; }
.sa-pick-main { flex: 1; min-width: 0; }
.sa-pick-name { font-size: 12.5px; font-weight: 600; color: #0f172a; line-height: 1.3; }
.sa-pick-name small { font-weight: normal; margin-left: 4px; }
.sa-pick-role { font-size: 12px; color: #94a3b8; margin-top: 2px; }
.sa-pick-badge { background: linear-gradient(135deg, #2563eb, #1d4ed8); color: #fff; font-size: 11px; padding: 4px 12px; border-radius: 999px; font-weight: 600; white-space: nowrap; flex-shrink: 0; box-shadow: 0 2px 6px rgba(37,99,235,.25); }
.sa-pick-badge-deputy { background: linear-gradient(135deg, #10b981, #059669); box-shadow: 0 2px 6px rgba(16,185,129,.25); }
.sa-pick-empty { font-size: 11px; color: #cbd5e1; padding: 4px 12px; border: 1px dashed #cbd5e1; border-radius: 999px; white-space: nowrap; flex-shrink: 0; background: #fff; }
/* 底部按钮 */
.sa-foot { border-top: 1px solid #e5e7eb; padding-top: 16px; display: flex; justify-content: flex-end; gap: 10px; }
.sa-btn { padding: 9px 22px; border-radius: 10px; font-size: 12.5px; font-weight: 500; cursor: pointer; border: 0; transition: all .15s; font-family: inherit; }
.sa-btn-cancel { background: #f1f5f9; color: #475569; border: 1px solid #e5e7eb; }
.sa-btn-cancel:hover { background: #e2e8f0; }
.sa-btn-next { background: linear-gradient(135deg, #2563eb, #1d4ed8); color: #fff; font-weight: 600; box-shadow: 0 4px 12px rgba(37,99,235,.28); padding: 9px 26px; }
.sa-btn-next:hover:not(:disabled) { background: linear-gradient(135deg, #1d4ed8, #1e40af); transform: translateY(-1px); box-shadow: 0 6px 18px rgba(37,99,235,.4); }
.sa-btn-next:disabled { background: #cbd5e1; cursor: not-allowed; box-shadow: none; transform: none; }
.sa-btn-save { background: linear-gradient(135deg, #10b981, #059669); color: #fff; font-weight: 600; box-shadow: 0 4px 12px rgba(16,185,129,.28); padding: 9px 26px; }
.sa-btn-save:hover { background: linear-gradient(135deg, #059669, #047857); transform: translateY(-1px); box-shadow: 0 6px 18px rgba(16,185,129,.4); }
/* 驻厂弹窗内副管理员复选框组 */
#sa-pick-deputy-wrap { display: flex; flex-wrap: wrap; gap: 8px 16px; padding: 6px 0; max-height: 160px; overflow-y: auto; }
.sa-dep-check { display: flex; align-items: center; gap: 4px; font-size: 12.5px; cursor: pointer; white-space: nowrap; }
.sa-dep-check input { margin: 0; }
/* 弹窗表单里的多选复选框组 */
.cb-multi-wrap { display: flex; flex-wrap: wrap; gap: 6px; padding: 6px 0; }
.cb-multi-item { display: inline-flex; align-items: center; gap: 5px; padding: 4px 10px; background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 999px; font-size: 12.5px; cursor: pointer; }
.cb-multi-item:hover { border-color: #93c5fd; background: #eff6ff; }
.cb-multi-item input { margin: 0; }

/* 状态徽章 */
.badge { display: inline-block; padding: 2px 9px; border-radius: 999px; font-size: 12px; font-weight: 500; }
.badge.在职, .badge.生效中, .badge.正常, .badge.收入, .badge.普通 { background: #dcfce7; color: #15803d; }
.badge.重要, .badge.迟到, .badge.待缴纳 { background: #fef9c3; color: #a16207; }
.badge.待入职, .badge.请假 { background: #dbeafe; color: #1d4ed8; }
.badge.离职, .badge.已到期, .badge.已终止, .badge.缺勤, .badge.支出, .badge.紧急, .badge.暂停 { background: #fee2e2; color: #b91c1c; }
.badge.早退, .badge.未缴纳 { background: #f1f5f9; color: #475569; }
.badge.已缴纳, .badge.公司代缴, .badge.挂靠代缴 { background: #dcfce7; color: #15803d; }
.badge.直接跑路 { background: #f1f5f9; color: #475569; }
.badge.待审核, .badge.审批中 { background: #dbeafe; color: #1d4ed8; }
.badge.已驳回, .badge.未提交 { background: #f1f5f9; color: #64748b; }
.badge.未扣回 { background: #fef9c3; color: #a16207; }
.badge.已扣回 { background: #dcfce7; color: #15803d; }
/* 待办事项：类别 / 状态 / 阶段 徽章配色 */
.badge.日常工作 { background: #e0f2fe; color: #0369a1; }
.badge.项目任务 { background: #ede9fe; color: #6d28d9; }
.badge.临时待办 { background: #ffedd5; color: #c2410c; }
.badge.待处理 { background: #dbeafe; color: #1d4ed8; }
.badge.进行中 { background: #dbeafe; color: #1d4ed8; }
.badge.已完成 { background: #dcfce7; color: #15803d; }
.badge.已取消 { background: #f1f5f9; color: #475569; }
.badge.未开始 { background: #f1f5f9; color: #475569; }
.badge.已申报 { background: #dbeafe; color: #1d4ed8; }
/* 2026-10-17 INJFOLLOW：工伤「同意」后的状态色（绿 = 已通过） */
.badge.已同意 { background: #dcfce7; color: #15803d; }
.badge.补资料 { background: #fef3c7; color: #a16207; }
.badge.审核中 { background: #e0f2fe; color: #0369a1; }
.badge.赔付中 { background: #ede9fe; color: #6d28d9; }
.badge.已赔付 { background: #dcfce7; color: #15803d; }
.badge.已完结 { background: #bbf7d0; color: #166534; }

/* 待办事项阶段分解编辑器 */
.phase-row { border: 1px solid #e3e8ef; border-radius: 10px; padding: 10px 12px; margin-bottom: 10px; background: #fafbfc; }
.phase-row .ph-grid { display: grid; grid-template-columns: 1.4fr 1fr 0.9fr 1fr auto; gap: 8px; align-items: center; }
.phase-row .ph-grid input, .phase-row .ph-grid select { padding: 7px 8px; border: 1px solid #d6dde6; border-radius: 8px; font-size: 12.5px; }
.phase-row .ph-note { width: 100%; margin-top: 8px; padding: 7px 8px; border: 1px solid #d6dde6; border-radius: 8px; font-size: 12.5px; }
.phase-row .ph-del { padding: 6px 10px; border-radius: 8px; }
.ph-tip { font-size: 12.5px; color: #64748b; margin: 0 0 12px; }
#phase-summary { color: #6d28d9; font-weight: 600; }
.todo-title { color: #1e3a8a; cursor: pointer; font-weight: 500; }
.todo-title:hover { text-decoration: underline; }
.todo-date-cell { white-space: nowrap; font-variant-numeric: tabular-nums; color: #334155; font-size: 12.5px; }
.todo-date-cell .muted, .muted { color: var(--muted); }
.th-sort { cursor: pointer; user-select: none; white-space: nowrap; }
.th-sort:hover { color: #1e3a8a; }
.th-sort::after { content: ''; }
.tbl-todos th.th-sort { background: #eef2f7; }
.todo-add-group { display: flex; gap: 8px; flex-wrap: wrap; }
.todo-add-group .btn-primary { border-radius: 8px; }

/* 弹窗 */
.modal-overlay { position: fixed; inset: 0; background: rgba(15,23,42,.45); display: flex; align-items: center; justify-content: center; z-index: 50; }
.modal { background: #fff; border-radius: 12px; width: 540px; max-width: 92%; max-height: 86%; overflow-y: auto; box-shadow: 0 20px 50px rgba(0,0,0,.3); }
.modal-head { display: flex; justify-content: space-between; align-items: center; padding: 14px 18px; border-bottom: 1px solid var(--border); font-weight: 600; font-size: 12.5px; }
.modal-close { background: none; border: none; font-size: 22px; cursor: pointer; color: var(--muted); }
.modal-body { padding: 18px; }

/* ── 自定义确认弹窗（替代原生 confirm / prompt，与系统 modal 风格统一） ── */
/* 2026-09-17 ZIDX1：确认框（confirmDialog）必须永远盖在最上层。
   原值 200 低于「打款批次」面板的内联 z-index:9998（#adv-batch-mask），
   导致点「确认放款」时确认框被面板压住、必须先关掉面板才看得见。
   抬到 10050 —— 高于应用内最高层 .ap-recur-overlay(10000) 与各类 9999 浮层。
   注：作废用的 #adv-batch-prompt 内联 9999 > 9998 故一直正常，此为其反证。 */
.cfm-overlay { position: fixed; inset: 0; background: rgba(15,23,42,.45); display: flex; align-items: center; justify-content: center; z-index: 10050; animation: cfm-in .18s ease-out; }
@keyframes cfm-in { from{opacity:0} to{opacity:1} }
.cfm-card { background: #fff; border-radius: 14px; width: 400px; max-width: 88%; box-shadow: 0 20px 60px rgba(0,0,0,.22); overflow: hidden; }
.cfm-icon { width: 48px; height: 48px; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 12px; font-size: 24px; }
.cfm-icon--warn { background: #fef3c7; color: #d97706; }
.cfm-icon--danger { background: #fee2e2; color: #dc2626; }
.cfm-icon--info { background: #dbeafe; color: #2563eb; }
.cfm-icon--approve { background: linear-gradient(135deg, #d1fae5, #a7f3d0); color: #059669; box-shadow: inset 0 0 0 1px rgba(5,150,105,.15); }
.cfm-body { padding: 4px 28px 24px; text-align: center; }
.cfm-title { font-size: 17px; font-weight: 600; color: #1e293b; margin-bottom: 8px; line-height: 1.4; }
.cfm-desc { font-size: 12.5px; color: #64748b; line-height: 1.55; }
.cfm-input { width: 100%; margin-top: 14px; padding: 10px 14px; border: 1.5px solid #e2e8f0; border-radius: 10px; font-size: 12.5px; outline: none; transition: border-color .2s; box-sizing: border-box; }
.cfm-input:focus { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(74,117,240,.15); }
.cfm-foot { display: flex; gap: 10px; padding: 16px 28px 20px; justify-content: flex-end; }
.cfm-btn { padding: 9px 22px; border-radius: 10px; font-size: 12.5px; font-weight: 500; cursor: pointer; border: none; transition: all .15s; }
.cfm-btn--cancel { background: #f1f5f9; color: #475569; }
.cfm-btn--cancel:hover { background: #e2e8f0; }
.cfm-btn--ok { background: var(--primary); color: #fff; min-width: 80px; }
.cfm-btn--ok:hover { background: var(--primary-dark); }
.cfm-btn--danger { background: #ef4444; color: #fff; }
.cfm-btn--danger:hover { background: #dc2626; }
.cfm-btn--approve { background: linear-gradient(135deg, #10b981, #059669); color: #fff; min-width: 110px; padding: 10px 24px; font-weight: 600; box-shadow: 0 4px 14px rgba(16,185,129,.28); }
.cfm-btn--approve:hover { background: linear-gradient(135deg, #059669, #047857); transform: translateY(-1px); box-shadow: 0 8px 22px rgba(16,185,129,.4); }

/* ── 「确认放款」专用弹窗（2026-09-16 STLCFM 结清补发 / 2026-09-18 ALLCFM1 员工预支） ──
 * 背景：两个弹窗的说明段都是带 <b>/<br> 的富文本，被 confirmDialog 的 CK.esc 转义后
 *       以源码形式显示，视觉上是乱码，故整段移除；改由顶部渐变条 + 居中排版撑起版式，
 *       核对信息交由弹窗下方已有的详情面板承担（批次号/打款日/单位/笔数·金额）。
 * 作用域：只在显式传了 cardClass 的那两个弹窗上生效 ——
 *       'cfm-card--settle'（结清补发）、'cfm-card--advance'（员工预支）；
 *       其余 cfm 弹窗（含 promptDialog）外观零变化。
 * 注 1：宽度 400 → 344，是因为说明段移除后内容变少，窄一点比例更稳。
 * 注 2：两个模块共用同一组规则，避免日后美化只改一侧、又造成两端不一致。
 * ----------------------------------------------------------------------- */
.cfm-card--settle, .cfm-card--advance { width: 344px; border-radius: 16px; box-shadow: 0 24px 64px rgba(15,23,42,.26); }
.cfm-card--settle::before, .cfm-card--advance::before { content: ''; display: block; height: 4px; background: linear-gradient(90deg, #34d399, #059669); }
.cfm-card--settle .cfm-icon, .cfm-card--advance .cfm-icon { margin: 26px auto 14px; width: 54px; height: 54px; font-size: 26px;
  box-shadow: 0 8px 20px rgba(16,185,129,.22), inset 0 0 0 1px rgba(5,150,105,.18); }
.cfm-card--settle .cfm-body, .cfm-card--advance .cfm-body { padding: 0 26px 22px; }
.cfm-card--settle .cfm-title, .cfm-card--advance .cfm-title { font-size: 18px; margin-bottom: 0; letter-spacing: .3px; }
.cfm-card--settle .cfm-foot, .cfm-card--advance .cfm-foot { justify-content: center; padding: 18px 26px 22px; border-top: 1px solid #f1f5f9; }
.cfm-card--settle .cfm-btn--cancel, .cfm-card--advance .cfm-btn--cancel { min-width: 96px; }
.cfm-card--settle .cfm-btn--approve, .cfm-card--advance .cfm-btn--approve { min-width: 132px; }

.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 16px; }
.form-field { display: flex; flex-direction: column; }
.form-field.full { grid-column: 1 / -1; }
.form-field label { font-size: 12.5px; color: var(--muted); margin-bottom: 4px; }
.form-field input, .form-field select, .form-field textarea { padding: 9px 10px; border: 1px solid var(--border); border-radius: 7px; font-size: 12.5px; font-family: inherit; }
.form-field textarea { resize: vertical; min-height: 64px; }
.form-field input.disabled-field, .form-field select.disabled-field { background: #f1f5f9; color: #94a3b8; cursor: not-allowed; border-style: dashed; }
.form-field .field-hint { font-size: 12px; color: #2563eb; margin-top: 4px; }
/* 收支记录编辑：只读字段（仅科目/摘要可改） */
.form-tip { font-size: 12.5px; line-height: 1.6; color: #92400e; background: #fffbeb; border: 1px solid #fde68a; border-radius: 8px; padding: 8px 12px; margin-bottom: 14px; }
.form-tip b { color: #b45309; }
.form-field.is-readonly label { color: #9ca3af; }
.form-field input.ro-input { background: #f8fafc; color: #6b7280; border-color: #e5e7eb; cursor: default; user-select: text; }
.form-field input.ro-input:focus { outline: none; box-shadow: none; }
.edit-dot { color: #2563eb; font-weight: 700; }
.form-field input.req-error, .form-field select.req-error { border: 2px solid #ef4444 !important; background: #fef2f2; animation: req-shake 0.3s ease; }
@keyframes req-shake { 0%,100%{transform:translateX(0)} 25%{transform:translateX(-4px)} 75%{transform:translateX(4px)} }
/* 人员选择器（责任人 / 涉及到的人，从公司名册筛选） */
.emp-picker { position: relative; }
.emp-pick-wrap { position: relative; }
.emp-search { width: 100%; padding: 9px 10px; border: 1px solid var(--border); border-radius: 7px; font-size: 12.5px; font-family: inherit; box-sizing: border-box; }
.emp-drop { position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 50; max-height: 220px; overflow: auto; background: #fff; border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 8px 24px rgba(15,23,42,.14); padding: 4px; }
.emp-opt { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 10px; border-radius: 6px; cursor: pointer; font-size: 12.5px; }
.emp-opt:hover { background: #f1f5f9; }
.emp-opt-st { font-size: 11px; color: #64748b; background: #f1f5f9; border-radius: 10px; padding: 1px 8px; }
.emp-empty { padding: 10px; color: #94a3b8; font-size: 12.5px; text-align: center; }
.emp-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.emp-chip { display: inline-flex; align-items: center; gap: 4px; background: #e0edff; color: #1d4ed8; border-radius: 14px; padding: 3px 10px; font-size: 12.5px; }
.emp-chip-x { border: none; background: transparent; color: #1d4ed8; cursor: pointer; font-size: 12.5px; line-height: 1; padding: 0 2px; }
.emp-chip-x:hover { color: #dc2626; }
.contact-group { border: 1px solid var(--border); border-radius: 10px; padding: 10px; background: #fafbfc; }
.contact-group-title { font-size: 12.5px; color: var(--muted); margin-bottom: 6px; font-weight: 600; }
.contact-row { display: grid; grid-template-columns: 1fr 1fr 1fr 1.4fr; gap: 8px; margin-bottom: 6px; }
.contact-row:last-child { margin-bottom: 0; }
.cg-field { display: flex; flex-direction: column; min-width: 0; }
.cg-field label { font-size: 12px; color: var(--muted); margin-bottom: 3px; }
.cg-field input { padding: 6px 8px; border: 1px solid var(--border); border-radius: 7px; font-size: 12.5px; font-family: inherit; }

/* 用工单位评级结论徽标 */
.conclusion-badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 12px; font-weight: 600; white-space: nowrap; }
.conclusion-badge.c-good { background: #dcfce7; color: #166534; border: 1px solid #86efac; }
.conclusion-badge.c-ok { background: #dbeafe; color: #1e40af; border: 1px solid #93c5fd; }
.conclusion-badge.c-warn { background: #fef3c7; color: #92400e; border: 1px solid #fcd34d; }
.conclusion-badge.c-bad { background: #fee2e2; color: #991b1b; border: 1px solid #fca5a5; }
.modal-foot { display: flex; justify-content: flex-end; gap: 10px; margin-top: 18px; }
.modal-foot button { padding: 9px 18px; border-radius: 8px; cursor: pointer; font-size: 12.5px; border: none; }
.btn-cancel { background: #f1f5f9; color: var(--text); }
.btn-save { background: var(--primary); color: #fff; }
.btn-save:hover { background: var(--primary-dark); }

/* 过滤条 */
.filter-bar { display: flex; gap: 10px 14px; margin-bottom: 14px; align-items: center; flex-wrap: wrap; }
.filter-bar .spacer { margin-left: auto; }
.filter-bar .fgrp { display: inline-flex; align-items: center; gap: 6px; }
.filter-bar .fgrp label { font-size: 12.5px; color: var(--muted); white-space: nowrap; }
.filter-bar .fsep { font-style: normal; color: var(--muted); font-size: 12.5px; }
.filter-bar .ie-account-label { font-size: 12.5px; color: var(--muted); }
.filter-bar .ie-account-sel { min-width: 160px; }
.filter-bar select, .filter-bar input { padding: 7px 10px; border: 1px solid var(--border); border-radius: 7px; font-size: 12.5px; font-family: inherit; }
.filter-bar .fl { display: inline-flex; align-items: center; gap: 8px; padding: 6px 12px; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; }
.filter-bar .fl label, .filter-bar .fl > span:first-child { font-size: 12.5px; color: #475569; font-weight: 600; white-space: nowrap; }
.filter-bar .fl select { padding: 5px 10px; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 12.5px; background: #fff; min-width: 140px; cursor: pointer; }
.filter-bar .fl select:hover { border-color: #94a3b8; }
.filter-bar .fl select:focus { border-color: #2563eb; outline: 2px solid #bfdbfe; outline-offset: -1px; }
.filter-bar .fgrp.btns { gap: 8px; }
.filter-bar .ie-date { min-width: 150px; }
/* 代发明细展开/收起 */
.dt-row > td { background: #f8fafc; padding: 0 !important; }
.dt-wrap { padding: 10px 14px; }
.dt-title { font-size: 12.5px; color: #2563eb; margin-bottom: 8px; font-weight: 600; }
.fin-detail-table { border-collapse: collapse; width: 100%; max-width: 880px; font-size: 12.5px; }
.fin-detail-table th, .fin-detail-table td { border: 1px solid var(--border); padding: 6px 10px; text-align: center; white-space: nowrap; }
.fin-detail-table th { background: #eef2f7; color: #334155; font-weight: 600; }
/* 权限管控页底部设备审批表格 */
.tbl-device { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.tbl-device th, .tbl-device td { padding: 11px 14px; text-align: center; border-bottom: 1px solid var(--border); vertical-align: middle; }
.tbl-device th { background: #f8fafc; color: #64748b; font-weight: 600; font-size: 12.5px; }
.tbl-device td .name { font-weight: 600; }
.tbl-device td .sub { color: #94a3b8; font-size: 12px; }
.fin-detail-table td.num { text-align: right; }
.filter-summary { margin: 0 0 12px; padding: 9px 14px; background: var(--accent-soft, #eef4ff); border: 1px solid var(--accent, #bcd2ff); border-radius: 8px; font-size: 12.5px; color: var(--text); }
.filter-summary b { color: var(--accent-strong, #1d4ed8); font-size: 12.5px; }

/* 列表/分块 */
.section-title { font-size: 12.5px; font-weight: 600; margin: 22px 0 10px; }
.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; }
.bar-panel { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 16px 18px; box-shadow: var(--shadow); }
.ann-item { border: 1px solid var(--border); border-radius: 10px; padding: 14px; margin-bottom: 10px; background: #fff; }
.ann-item h4 { margin: 0 0 6px; font-size: 12.5px; }
.ann-meta { color: var(--muted); font-size: 12px; margin-bottom: 6px; }
.empty { padding: 40px; text-align: center; color: var(--muted); }

/* toast */
.toast { position: fixed; bottom: 26px; left: 50%; transform: translateX(-50%); background: #111827; color: #fff; padding: 11px 20px; border-radius: 8px; z-index: 200; font-size: 12.5px; box-shadow: 0 8px 24px rgba(0,0,0,.25); }

/* 只读信息区（台账补录：扫码录入信息不可改） */
.ro-box { border: 1px dashed var(--border); background: #f8fafc; border-radius: 10px; padding: 12px 14px; margin-bottom: 16px; }
.ro-title { font-size: 12px; color: var(--muted); margin-bottom: 8px; }
.ro-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 6px 18px; }
.ro-item { font-size: 12.5px; }
.ro-label { color: var(--muted); margin-right: 6px; }
.ro-val { font-weight: 600; color: var(--text); }
.ro-na { color: var(--muted); font-weight: 400; }

/* 用工单位「开票信息」弹窗：竖向排列，一个一行 */
.bi-list { display: flex; flex-direction: column; gap: 8px; }
.bi-row { display: flex; align-items: baseline; gap: 12px; font-size: 12.5px; }
.bi-row .ro-label { flex: 0 0 auto; min-width: 72px; text-align: right; white-space: nowrap; }
.bi-row .ro-val { white-space: normal; word-break: break-all; }

/* 用工单位「联系方式」弹窗：三位联系人竖向排列，每位一行 */
.contact-list { display: flex; flex-direction: column; gap: 10px; }
.contact-view { border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; background: #fafbfc; }
.contact-view-title { font-size: 12px; color: var(--muted); font-weight: 600; margin-bottom: 4px; }
.contact-view-line { display: flex; flex-direction: row; flex-wrap: wrap; align-items: baseline; gap: 4px 18px; font-size: 12.5px; }
.cv-item b { color: var(--muted); font-weight: 400; margin-right: 4px; }
.cv-item { white-space: nowrap; }
.contact-email { display: flex; align-items: baseline; gap: 12px; font-size: 12.5px; padding-top: 4px; border-top: 1px dashed var(--border); margin-top: 2px; }
.contact-email .ro-label { flex: 0 0 64px; text-align: right; }

/* ============ 侧栏手动折叠（不依赖视口，仅用户点击 ☰ 触发） ============ */
/* 折叠 = 整列侧栏彻底隐藏，主页面占满 100%；再次点击 ☰ 恢复。 */
.sidebar-toggle {
  background: rgba(255,255,255,.18); color: #fff; border: none; padding: 6px 10px;
  border-radius: 6px; cursor: pointer; font-size: 12.5px; line-height: 1; margin-right: 10px;
}
.sidebar-toggle:hover { background: rgba(255,255,255,.32); }

/* 折叠态：整列侧栏消失，主页面占满 */
.layout.sidebar-collapsed .sidebar { display: none; }
/* 折叠态：顶部 ☰ 按钮加视觉提示（侧栏已收起，点我可再展开） */
.layout.sidebar-collapsed .sidebar-toggle { background: rgba(255,255,255,.36); box-shadow: 0 0 0 2px rgba(255,255,255,.18) inset; }

/* 以下为「响应式重排版」媒体查询——在固定 16:9 舞台模式下全部停用，
   改为由 #stage 的 transform: scale 统一等比缩放，避免布局被拉伸/挤压。
   如需在手机直接用 index.html（不经过舞台），可恢复这些断点。 */
@media (max-width: 1px) {
  /* 侧边栏改为顶部横向滚动导航（原始移动端逻辑，已停用） */
  .layout { flex-direction: column; }
  .sidebar {
    width: auto; border-right: none; border-bottom: 1px solid var(--border);
    display: flex; gap: 6px; overflow-x: auto; white-space: nowrap; padding: 8px 10px;
    -webkit-overflow-scrolling: touch;
  }
  .nav-group-title, .nav-sub-title { display: none; }   /* 2026-09-15 FIN 批：二级分组标题在移动端同样隐藏 */
  .nav-item { margin-bottom: 0; flex: 0 0 auto; }
  .content { padding: 14px 20px 30px; }

  /* 标题栏按钮竖排、可换行、触控友好 */
  .view-head { flex-direction: column; align-items: stretch; gap: 10px; }
  .view-head > div { display: flex; flex-wrap: wrap; gap: 8px; }
  .view-head .btn-primary, .view-head .btn-sm { flex: 1 1 auto; }

  /* 表格横向滚动，避免被裁切 */
  .table-wrap { overflow-x: auto; }
  table { min-width: 780px; }

  /* 弹窗在手机上全屏 */
  .modal { width: 100%; max-width: 100%; max-height: 100%; height: 100%; border-radius: 0; }
  .modal-body { padding: 16px; }

  /* 汇总卡片在窄屏两列 */
  .cards { grid-template-columns: repeat(2, 1fr); }

  /* 操作按钮可换行 */
  .row-actions { flex-wrap: wrap; }

  /* 登录卡片自适应 */
  .login-card { width: auto; max-width: 1472px; padding: 28px 20px; }
}

/* ---------------- 财务管理子模块 ---------------- */
.fin-tabs { display: flex; gap: 8px; flex-wrap: wrap; margin: 14px 0 8px; border-bottom: 1px solid var(--border); padding-bottom: 10px; }
.fin-tab { background: var(--panel); border: 1px solid var(--border); color: var(--text); padding: 8px 16px; border-radius: 8px; cursor: pointer; font-size: 12.5px; font-weight: 600; transition: all .15s; }
.fin-tab:hover { border-color: var(--primary); color: var(--primary); }
.fin-tab.active { background: var(--primary); color: #fff; border-color: var(--primary); }
.fin-note { background: #eff6ff; border: 1px solid #bfdbfe; color: #1e40af; padding: 10px 14px; border-radius: 8px; font-size: 12.5px; margin: 6px 0 10px; line-height: 1.6; }
/* 工资计算：底部公式说明 */
.sal-formula { margin-top: 8px; padding: 8px 12px; background: #f8fafc; border: 1px dashed #cbd5e1; border-radius: 6px; font-size: 12px; color: #475569; line-height: 1.9; }
.sal-formula b { color: #1e293b; margin-right: 4px; }
.sal-formula span { display: inline-block; margin-right: 18px; white-space: nowrap; }
td.num, .num { text-align: right; font-variant-numeric: tabular-nums; }

/* 员工预支表格：表头与单元格文字居中（不影响其他表格） */
#ad-table table th, #ad-table table td { text-align: center; }
#ad-table table td.num { text-align: center; }
#ad-table table .row-actions { justify-content: center; }
.t-green { color: var(--green); }
.t-red { color: var(--red); }
.badge.green { background: #dcfce7; color: #16a34a; }
.badge.red { background: #fee2e2; color: #dc2626; }
.badge.yellow { background: #fef3c7; color: #d97706; }
.sa-in { width: 100%; height: 100%; box-sizing: border-box; padding: 4px 4px; border: none; font-size: 12px; text-align: center; background: transparent; }
.sa-in:focus { outline: none; background: #eef2ff; }
.sa-in::-webkit-outer-spin-button,
.sa-in::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.sa-in[type="number"] { -moz-appearance: textfield; }


/* ---------------- 仪表盘提醒面板 ---------------- */
.rem-panel { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 16px 18px; margin: 0 0 16px; }
.rem-panel-empty { text-align: center; }
.rem-panel-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; flex-wrap: wrap; gap: 8px; }
.rem-panel-head h3 { margin: 0; font-size: 12.5px; color: var(--text); display: flex; align-items: center; gap: 8px; }
.rem-count-badge { background: var(--primary); color: #fff; font-size: 12.5px; font-weight: 700; border-radius: 10px; padding: 2px 10px; min-width: 24px; text-align: center; }
.rem-summary { display: flex; gap: 6px; flex-wrap: wrap; }
.rem-sum-badge { font-size: 12px; font-weight: 600; border-radius: 6px; padding: 3px 8px; }
.rem-sum-badge.urgent { background: #fee2e2; color: #dc2626; }
.rem-sum-badge.warning { background: #fef3c7; color: #d97706; }
.rem-sum-badge.info { background: #dbeafe; color: #2563eb; }
.rem-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 10px; }
.rem-card { border-radius: 10px; padding: 12px 14px; border-left: 4px solid; transition: transform .12s, box-shadow .12s; }
.rem-card:hover { transform: translateY(-1px); box-shadow: 0 3px 12px rgba(0,0,0,.06); }
.rem-urgent { background: #fef2f2; border-left-color: #dc2626; }
.rem-warning { background: #fffbeb; border-left-color: #d97706; }
.rem-info { background: #eff6ff; border-left-color: #2563eb; }
.rem-card-head { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; }
.rem-icon { font-size: 12.5px; }
.rem-tag { font-size: 12px; color: var(--muted); background: rgba(0,0,0,.04); border-radius: 4px; padding: 2px 6px; }
.rem-level-badge { font-size: 11px; font-weight: 700; border-radius: 4px; padding: 2px 6px; margin-left: auto; }
.rem-level-badge.urgent { background: #dc2626; color: #fff; }
.rem-level-badge.warning { background: #d97706; color: #fff; }
.rem-level-badge.info { background: #2563eb; color: #fff; }
.rem-title { font-size: 12.5px; font-weight: 600; color: var(--text); line-height: 1.4; }
.rem-detail { font-size: 12px; color: var(--muted); margin-top: 4px; line-height: 1.5; }
.rem-ok { font-size: 12.5px; color: #16a34a; padding: 8px 0; }

/* ---------------- 运营监控条形图 ---------------- */
.bar-row { display: flex; align-items: center; gap: 12px; margin: 6px 0; }
.bar-label { min-width: 180px; font-size: 12.5px; color: var(--text); white-space: nowrap; flex-shrink: 0; }
.bar-track { flex: 1; height: 20px; background: rgba(0,0,0,.05); border-radius: 4px; overflow: hidden; }
.bar-fill { height: 100%; border-radius: 4px; transition: width .3s; }
.bar-fill.blue { background: linear-gradient(90deg, #3b82f6, #60a5fa); }
.bar-fill.green { background: linear-gradient(90deg, #16a34a, #4ade80); }
.bar-val { width: 30px; text-align: right; font-size: 12.5px; font-weight: 600; color: var(--text); flex-shrink: 0; margin-right: 10px; }
.badge.orange { background: #fef3c7; color: #d97706; }
.badge.gray { background: #f3f4f6; color: #6b7280; }

/* ---- 垂直柱状图 ---- */
.vbar-chart { display: flex; align-items: flex-end; gap: 12px; height: 200px; padding: 10px 0; overflow-x: auto; }
.vbar-group { display: flex; flex-direction: column; align-items: center; gap: 4px; min-width: 60px; }
.vbar-pair { display: flex; gap: 4px; align-items: flex-end; height: 160px; }
.vbar-col { display: flex; flex-direction: column; align-items: center; justify-content: flex-end; height: 100%; gap: 2px; }
.vbar { width: 20px; border-radius: 3px 3px 0 0; min-height: 2px; transition: height .3s; }
.vbar.green { background: #16a34a; }
.vbar.red { background: #dc2626; }
.vbar.blue { background: #2563eb; }
.vbar.orange { background: #f97316; }
.vbar-num { font-size: 11px; color: var(--muted); }
.vbar-label { font-size: 12px; color: var(--muted); }
.legend-dot { display: inline-block; width: 10px; height: 10px; border-radius: 2px; vertical-align: middle; margin-right: 2px; }
.legend-dot.green { background: #16a34a; }
.legend-dot.red { background: #dc2626; }
.legend-dot.blue { background: #2563eb; }
.legend-dot.orange { background: #f97316; }

/* ================= 数据中心（数据大屏） ================= */
.cockpit {
  background: #f1f5f9;
  background-image: radial-gradient(1200px 500px at 20% -10%, rgba(56,189,248,.06), transparent 60%),
                    radial-gradient(900px 400px at 100% 0%, rgba(167,139,250,.05), transparent 55%);
  border-radius: 12px; padding: 14px 16px 16px; margin: -4px 0 0;
  color: #334155; font-size: 12.5px;
  /* 流式自适应：去掉固定 792px；按内容 + 视口高度两者取大，保证面板内容铺满但超界可滚 */
  min-height: calc(100vh - 110px);
}
.ck-loading { padding: 60px 0; text-align: center; color: var(--muted); font-size: 12.5px; }

.ck-head { display: flex; align-items: center; justify-content: space-between; padding: 2px 2px 12px; border-bottom: 1px solid rgba(148,163,184,.20); margin-bottom: 12px; }
.ck-title { font-size: 18px; font-weight: 600; letter-spacing: .5px; color: #0f172a; display: flex; align-items: center; gap: 9px; }
.ck-title .dot { width: 8px; height: 8px; border-radius: 50%; background: #0891b2; box-shadow: 0 0 0 4px rgba(8,145,178,.12); }
.ck-meta { font-size: 12px; color: #64748b; display: flex; align-items: center; gap: 10px; }
.ck-refresh { background: rgba(56,189,248,.08); border: 1px solid rgba(56,189,248,.25); color: #0284c7; border-radius: 6px; padding: 4px 10px; cursor: pointer; font-size: 12px; }
.ck-refresh:hover { background: rgba(56,189,248,.15); }

.ck-kpis { display: grid; grid-template-columns: repeat(6, 1fr); gap: 10px; margin-bottom: 12px; }
.ck-kpi { background: #fff; border: 1px solid #e2e8f0; border-radius: 10px; padding: 11px 13px; position: relative; overflow: hidden; box-shadow: 0 1px 3px rgba(15,23,42,.04); }
.ck-kpi::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: #0284c7; }
.ck-kpi.violet::before { background: #7c3aed; } .ck-kpi.green::before { background: #059669; }
.ck-kpi.red::before { background: #e11d48; } .ck-kpi.cyan::before { background: #0891b2; }
.ck-kpi.amber::before { background: #d97706; } .ck-kpi.orange::before { background: #ea580c; }
.ck-kpi .lb { font-size: 12px; color: #64748b; margin-bottom: 5px; }
.ck-kpi .vl { font-size: 20px; font-weight: 600; color: #0f172a; line-height: 1.15; letter-spacing: .3px; }
.ck-kpi .sb { font-size: 11px; color: #94a3b8; margin-top: 4px; }
.ck-kpi.green .vl { color: #059669; } .ck-kpi.red .vl { color: #e11d48; }

.ck-grid { display: grid; grid-template-columns: 1fr 1.72fr 1fr; gap: 10px; align-items: start; }
.ck-col { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.ck-row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }

.ck-panel { background: #fff; border: 1px solid #e2e8f0; border-radius: 10px; overflow: hidden; min-width: 0; box-shadow: 0 1px 3px rgba(15,23,42,.04); }
.ck-panel > header { display: flex; align-items: center; justify-content: space-between; padding: 8px 12px; border-bottom: 1px solid #eef0f3; background: #f8fafc; }
.ck-panel h3 { margin: 0; font-size: 12.5px; font-weight: 500; color: #475569; letter-spacing: .3px; }
.ck-panel h3::before { content: ''; display: inline-block; width: 3px; height: 11px; background: #0284c7; border-radius: 2px; margin-right: 7px; vertical-align: -1px; }
.ck-panel .bd { font-size: 11px; color: #64748b; background: #f1f5f9; padding: 2px 7px; border-radius: 4px; }
.ck-panel .bd-body { padding: 8px 10px 10px; }
.ck-empty { padding: 26px 0; text-align: center; color: #94a3b8; font-size: 12px; }

.ck-svg { width: 100%; display: block; overflow: visible; }
.ck-grid line, line.ck-grid { stroke: rgba(148,163,184,.20); stroke-width: .7; }
text.ck-ax { fill: #64748b; font-size: 9.5px; }
text.ck-cn { fill: #0f172a; font-size: 12.5px; font-weight: 600; }
text.ck-cs { fill: #64748b; font-size: 9.5px; }
text.ck-fl { fill: #fff; font-size: 10.5px; font-weight: 500; }
text.ck-bn { fill: #0f172a; font-size: 12.5px; font-weight: 600; }
text.ck-bc { fill: #64748b; font-size: 10px; }
text.ck-rl { fill: #64748b; font-size: 10px; }
text.ck-rv { fill: #0284c7; font-size: 10px; font-weight: 500; }

.ck-legend { display: flex; gap: 14px; justify-content: center; margin-top: 4px; font-size: 11px; color: #64748b; }
.ck-legend span { display: flex; align-items: center; gap: 5px; }
.ck-legend i { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }

.ck-donut-wrap { display: flex; align-items: center; gap: 6px; }
.ck-legend-v { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.ck-li { display: flex; align-items: center; gap: 6px; font-size: 11px; }
.ck-li i { width: 8px; height: 8px; border-radius: 2px; flex: none; }
.ck-li .k { flex: 1; color: #475569; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ck-li .v { color: #64748b; font-variant-numeric: tabular-nums; }

.ck-region { display: flex; flex-direction: column; gap: 8px; }
.ck-bubble { max-height: 210px; }
.ck-rank { display: flex; flex-direction: column; gap: 5px; padding-top: 6px; border-top: 1px solid #eef0f3; }
.ck-rk { display: flex; align-items: center; gap: 8px; font-size: 11.5px; }
.ck-rk .no { width: 17px; height: 17px; border-radius: 4px; background: #f1f5f9; color: #64748b; display: flex; align-items: center; justify-content: center; font-size: 10px; flex: none; }
.ck-rk .no.top { background: rgba(56,189,248,.12); color: #0284c7; }
.ck-rk .nm { width: 46px; color: #475569; flex: none; }
.ck-rk .bar { flex: 1; height: 6px; background: #f1f5f9; border-radius: 3px; overflow: hidden; }
.ck-rk .bar i { display: block; height: 100%; background: linear-gradient(90deg, #0ea5e9, #38bdf8); border-radius: 3px; }
.ck-rk .vl { width: 40px; text-align: right; color: #334155; font-variant-numeric: tabular-nums; flex: none; }
.ck-rk .pc { width: 32px; text-align: right; color: #94a3b8; flex: none; }

.ck-row { display: flex; align-items: center; gap: 8px; padding: 5px 2px; border-bottom: 1px dashed #eef0f3; font-size: 11.5px; }
.ck-row:last-child { border-bottom: none; }
.ck-row .tg { font-size: 10px; padding: 1.5px 6px; border-radius: 4px; flex: none; }
.ck-row .tg-b { background: rgba(56,189,248,.10); color: #0284c7; }
.ck-row .tg-g { background: rgba(52,211,153,.10); color: #059669; }
.ck-row .tg-a { background: rgba(251,191,36,.10); color: #d97706; }
.ck-row .tg-r { background: rgba(251,113,133,.10); color: #e11d48; }
.ck-row .nm { flex: 1; color: #475569; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ck-row .dt { color: #94a3b8; flex: none; font-variant-numeric: tabular-nums; }
.ck-row .am { flex: none; font-variant-numeric: tabular-nums; margin-right: 4px; }
.ck-row .am.up { color: #059669; } .ck-row .am.down { color: #e11d48; }
.ck-row.ck-over { background: rgba(239,68,68,.06); border-radius: 4px; }
.ck-row .dt.over { color: #e11d48; font-weight: 600; }


.ck-alert { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; margin-bottom: 5px; font-size: 11.5px; background: #f8fafc; }
.ck-alert:last-child { margin-bottom: 0; }
.ck-alert i { width: 6px; height: 6px; border-radius: 50%; flex: none; }
.ck-alert span { color: #475569; line-height: 1.4; }
.ck-alert.lv-high { background: rgba(251,113,133,.06); } .ck-alert.lv-high i { background: #e11d48; box-shadow: 0 0 0 3px rgba(225,29,72,.10); }
.ck-alert.lv-mid { background: rgba(251,191,36,.06); } .ck-alert.lv-mid i { background: #d97706; }
.ck-alert.lv-low i { background: #94a3b8; }

.ck-foot { margin-top: 10px; }
.ck-wide .bd-body { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0 20px; }

@media (max-width: 1px) {
  .ck-kpis { grid-template-columns: repeat(3, 1fr); }
  .ck-grid { grid-template-columns: 1fr 1.5fr; }
  .ck-col:last-child { grid-column: 1 / -1; flex-direction: row; }
  .ck-col:last-child .ck-panel { flex: 1; }
}
/* 手机端「我的待办」 */
.todo-mobile-list { padding: 10px; display: flex; flex-direction: column; gap: 10px; }
.todo-mobile-card { background: #fff; border: 1px solid #e6ebf1; border-left: 4px solid #94a3b8; border-radius: 12px; padding: 12px 14px; box-shadow: 0 1px 3px rgba(15,23,42,.06); }
.todo-mobile-card.open { border-left-color: #2563eb; }
.todo-mobile-card.done { border-left-color: #22c55e; opacity: .72; }
.todo-mobile-card.cancel { border-left-color: #cbd5e1; opacity: .6; }
.todo-mc-top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; }
.todo-cat { font-size: 12px; font-weight: 600; padding: 2px 8px; border-radius: 999px; }
.todo-cat.cat-日常工作 { background: #e0f2fe; color: #0369a1; }
.todo-cat.cat-项目任务 { background: #ede9fe; color: #6d28d9; }
.todo-cat.cat-临时待办 { background: #ffedd5; color: #c2410c; }
.todo-st { font-size: 12px; padding: 2px 8px; border-radius: 999px; background: #f1f5f9; color: #475569; }
.todo-st.st-待处理 { background: #dbeafe; color: #1d4ed8; }
.todo-st.st-进行中 { background: #dbeafe; color: #1d4ed8; }
.todo-st.st-已完成 { background: #dcfce7; color: #15803d; }
.todo-st.st-已取消 { background: #f1f5f9; color: #475569; }
.todo-mc-title { font-size: 12.5px; font-weight: 600; color: #1e293b; margin-bottom: 6px; }
.todo-mc-meta { font-size: 12.5px; color: #64748b; line-height: 1.6; }
.todo-phase { display: inline-block; margin-top: 4px; font-size: 12px; color: #6d28d9; background: #ede9fe; padding: 2px 8px; border-radius: 999px; }
/* 详情弹层 */
.td-row { display: flex; gap: 10px; padding: 7px 2px; border-bottom: 1px dashed #eef0f3; font-size: 12.5px; }
.td-l { width: 84px; color: #94a3b8; flex: none; }
.td-v { flex: 1; color: #334155; word-break: break-word; }
.td-sep { margin: 12px 0 8px; font-size: 12.5px; font-weight: 700; color: #6d28d9; }
.td-phase { border: 1px solid #e6ebf1; border-radius: 10px; padding: 8px 10px; margin-bottom: 8px; background: #fafbfc; }
.td-phase.done { background: #f0fdf4; border-color: #bbf7d0; }
.td-phase-head { display: flex; align-items: center; justify-content: space-between; }
.td-phase-name { font-weight: 600; color: #334155; font-size: 12.5px; }
.td-phase-st { font-size: 11px; padding: 1px 7px; border-radius: 999px; background: #f1f5f9; color: #475569; }
.td-phase-meta { font-size: 12px; color: #64748b; margin-top: 3px; }
.td-phase-note { font-size: 12px; color: #475569; margin-top: 3px; }

/* ========== 苹果日历风格 · 新增待办事项 ========== */
.ap-modal-card {
  background: #fff;
  border-radius: 16px !important;
  max-width: 420px !important;
  width: 100% !important;
  margin: 0 auto !important;
  max-height: 810px !important;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  box-shadow: 0 10px 40px rgba(0,0,0,0.18) !important;
}
.ap-modal-card .modal-head {
  position: relative;
  padding: 14px 48px !important;
  border-bottom: 1px solid #e5e7eb !important;
  justify-content: center !important;
  font-size: 12.5px !important;
  font-weight: 600 !important;
  color: #1c1c1e !important;
  flex: none;
}
.ap-modal-card .modal-head #modal-title {
  text-align: center;
  width: 100%;
}
.ap-modal-card .modal-close {
  position: absolute;
  top: 50%;
  right: 12px;
  transform: translateY(-50%);
  width: 32px;
  height: 32px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 22px;
  color: #8e8e93;
  cursor: pointer;
  background: none;
  border: none;
  transition: background .15s;
  padding: 0;
}
.ap-modal-card .modal-close:hover { background: #f2f2f7; }
.ap-modal-card .modal-body {
  padding: 0 !important;
  overflow-y: auto;
  flex: 1;
}
.ap-body { padding: 14px 16px 6px; }
.ap-title-input, .ap-url-input {
  width: 100%;
  border: 1px solid #d1d5db;
  border-radius: 10px;
  padding: 10px 14px;
  font-size: 12.5px;
  outline: none;
  box-sizing: border-box;
  background: #fff;
  font-family: inherit;
  transition: border-color .15s;
  color: #1c1c1e;
}
.ap-title-input { margin-bottom: 14px; }
.ap-url-input { margin: 12px 0 8px; }
.ap-title-input:focus, .ap-url-input:focus { border-color: #007aff; }
.ap-list {
  background: #fff;
  border-radius: 10px;
  border: 1px solid #e5e7eb;
  overflow: hidden;
}
.ap-row {
  display: flex;
  align-items: center;
  padding: 11px 14px;
  border-bottom: 1px solid #f1f1f4;
  font-size: 12.5px;
  cursor: pointer;
  position: relative;
  min-height: 44px;
  background: #fff;
}
.ap-row:last-child { border-bottom: none; }
.ap-row.is-static { cursor: default; }
.ap-row-label { color: #1c1c1e; flex: none; min-width: 72px; }
.ap-row-right {
  display: flex;
  align-items: center;
  gap: 6px;
  color: #8e8e93;
  flex: 1;
  justify-content: flex-end;
  text-align: right;
  min-width: 0;
}
.ap-row-value {
  color: #8e8e93;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 220px;
}
.ap-row-value.has-value { color: #1c1c1e; }
.ap-row-chevron { font-size: 18px; color: #c7c7cc; line-height: 1; }
.ap-row-plus { color: #ff3b30; font-size: 22px; font-weight: 300; line-height: 1; }
/* 全天开关 */
.ap-toggle-row { cursor: default; }
.ap-switch { position: relative; width: 50px; height: 30px; flex: none; }
.ap-switch input { opacity: 0; width: 0; height: 0; }
.ap-slider {
  position: absolute; inset: 0;
  background: #e5e5ea; border-radius: 15px;
  transition: background .2s; cursor: pointer;
}
.ap-slider::before {
  content: '';
  position: absolute;
  width: 26px; height: 26px;
  background: #fff; border-radius: 50%;
  top: 2px; left: 2px;
  transition: transform .2s;
  box-shadow: 0 1px 3px rgba(0,0,0,0.2);
}
.ap-switch input:checked + .ap-slider { background: #34c759; }
.ap-switch input:checked + .ap-slider::before { transform: translateX(20px); }
/* 日期 + 时间行 */
.ap-time-row .ap-row-right { gap: 8px; flex-wrap: wrap; justify-content: flex-end; }
.ap-time-row input[type=date],
.ap-time-row input[type=time] {
  border: none; background: transparent;
  text-align: right; font-size: 12.5px;
  color: #8e8e93; outline: none;
  font-family: inherit;
  padding: 2px 0;
}
.ap-time-row input[type=date].has-value,
.ap-time-row input[type=time].has-value { color: #1c1c1e; }
.ap-time-row input:focus { color: #007aff; }
/* "+ 添加时间" 链接（默认全天状态下出现） */
.ap-time-toggle {
  font-size: 12.5px; color: #007aff;
  text-decoration: none; padding: 2px 4px;
  cursor: pointer;
  white-space: nowrap;
}
.ap-time-toggle:hover { text-decoration: underline; }
.ap-time-clear {
  display: inline-flex; align-items: center; justify-content: center;
  width: 20px; height: 20px; line-height: 18px;
  font-size: 12.5px; color: #8e8e93; background: #e5e5ea;
  border-radius: 50%; text-decoration: none;
  cursor: pointer; user-select: none;
  flex: none;
}
.ap-time-clear:hover { background: #d1d1d6; color: #3c3c43; }
/* 类别 chip（只读） */
.ap-cat-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 10px; border-radius: 999px;
  font-size: 12.5px; font-weight: 500;
  background: #e0eaff; color: #1d4ed8;
}
.ap-cat-chip.cat-daily   { background:#dcfce7; color:#15803d; }
.ap-cat-chip.cat-project { background:#ede9fe; color:#6d28d9; }
.ap-cat-chip.cat-temp    { background:#ffedd5; color:#c2410c; }
/* 行内展开 */
.ap-expand {
  padding: 10px 14px 14px;
  background: #f9fafb;
  border-bottom: 1px solid #f1f1f4;
}
.ap-expand:last-of-type { border-bottom: none; }
.ap-expand-input {
  width: 100%; border: 1px solid #d1d5db; border-radius: 8px;
  padding: 7px 10px; font-size: 12.5px; outline: none;
  font-family: inherit; box-sizing: border-box; background: #fff;
}
.ap-expand-input:focus { border-color: #007aff; }
.ap-expand textarea.ap-expand-input { min-height: 60px; resize: vertical; }
/* 受邀人/多选 chips */
.ap-chips {
  display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px;
}
.ap-chips .ap-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 9px; border-radius: 999px;
  background: #e0eaff; color: #1d4ed8; font-size: 12.5px;
}
.ap-chips .ap-chip-x { cursor: pointer; color: #6b7280; font-size: 12.5px; line-height: 1; }
.ap-chips .ap-chip-x:hover { color: #1d4ed8; }
.ap-emp-search {
  width: 100%; border: 1px solid #d1d5db; border-radius: 8px;
  padding: 7px 10px; font-size: 12.5px; outline: none;
  box-sizing: border-box;
}
.ap-emp-search:focus { border-color: #007aff; }
.ap-emp-drop {
  margin-top: 4px; max-height: 180px; overflow-y: auto;
  border: 1px solid #e5e7eb; border-radius: 8px;
  background: #fff;
}
.ap-emp-drop:empty { display: none; }
.ap-emp-opt {
  padding: 7px 12px; cursor: pointer; font-size: 12.5px;
  display: flex; justify-content: space-between; align-items: center;
}
.ap-emp-opt:hover { background: #f2f2f7; }
.ap-emp-opt-st { font-size: 11px; color: #8e8e93; }
/* 阶段分解行内编辑器 */
.ap-phases { display: flex; flex-direction: column; gap: 8px; }
.ap-phase {
  background: #fff; border: 1px solid #e5e7eb; border-radius: 8px;
  padding: 8px 10px; display: flex; flex-direction: column; gap: 6px;
}
.ap-phase-row1 { display: flex; gap: 6px; align-items: center; }
.ap-phase-name { flex: 1; border: 1px solid #e5e7eb; border-radius: 6px; padding: 5px 8px; font-size: 12.5px; outline: none; min-width: 0; }
.ap-phase-name:focus { border-color: #007aff; }
.ap-phase-plan { border: 1px solid #e5e7eb; border-radius: 6px; padding: 5px 8px; font-size: 12px; outline: none; width: 130px; }
.ap-phase-status { border: 1px solid #e5e7eb; border-radius: 6px; padding: 5px 6px; font-size: 12.5px; outline: none; }
.ap-phase-del {
  background: none; border: none; color: #ef4444;
  font-size: 18px; cursor: pointer; line-height: 1; padding: 0 4px;
}
.ap-phase-note { border: 1px solid #e5e7eb; border-radius: 6px; padding: 5px 8px; font-size: 12px; outline: none; }
.ap-phase-add {
  align-self: flex-start; margin-top: 4px;
  background: none; border: 1px dashed #cbd5e1; color: #3b82f6;
  padding: 6px 14px; border-radius: 6px; cursor: pointer; font-size: 12.5px;
}
.ap-phase-add:hover { background: #eff6ff; }
.ap-phase-summary { font-size: 12px; color: #15803d; margin-top: 4px; }
/* Popup 下拉 —— position: fixed 以避开 modal 的 overflow:hidden / .modal-body 的 overflow:auto 裁剪 */
.ap-popup {
  position: fixed;
  background: #fff;
  border-radius: 12px;
  box-shadow: 0 8px 28px rgba(0,0,0,0.22);
  z-index: 9999;
  min-width: 200px;
  max-width: 320px;
  max-height: 540px;
  overflow-y: auto;
  border: 1px solid #e5e7eb;
}
.ap-popup.flip-up {
  transform-origin: bottom right;
}
.ap-popup-item {
  padding: 11px 18px;
  cursor: pointer;
  font-size: 12.5px;
  text-align: center;
  border-bottom: 1px solid #f1f1f4;
}
.ap-popup-item:last-child { border-bottom: none; }
.ap-popup-item:hover { background: #f2f2f7; }
.ap-popup-item.selected { color: #007aff; font-weight: 500; }
/* 底部按钮 */
.ap-footer {
  display: flex;
  border-top: 1px solid #e5e7eb;
  flex: none;
}
.ap-footer button {
  flex: 1;
  padding: 14px;
  border: none;
  font-size: 12.5px;
  cursor: pointer;
  background: #fff;
  font-family: inherit;
  transition: background .15s;
}
.ap-cancel {
  color: #1c1c1e;
  border-right: 1px solid #e5e7eb !important;
  border-radius: 0 0 0 16px;
  font-weight: 400;
}
.ap-cancel:hover { background: #f9fafb; }
.ap-add {
  color: #ff3b30;
  font-weight: 600;
  border-radius: 0 0 16px 0;
}
.ap-add:hover { background: #fff5f5; }
.ap-add:disabled { color: #c7c7cc; cursor: not-allowed; }

@media (max-width: 1px) {
  .ck-grid { grid-template-columns: 1fr; }
  .ck-col:last-child { flex-direction: column; }
  .ck-kpis { grid-template-columns: repeat(2, 1fr); }
  .ck-wide .bd-body { grid-template-columns: 1fr; }
}

/* ========== 苹果日历 · 待办事项月历视图 ========== */
.todo-viewbar {
  display: flex; align-items: center; gap: 14px; margin: 0 0 12px; padding: 0 4px;
}
.todo-viewbar .seg {
  display: inline-flex; align-items: center;
  background: rgba(120,120,128,0.12);
  border-radius: 8px;
  padding: 2px;
  gap: 0;
}
.todo-viewbar .seg button {
  background: transparent; border: none;
  font-size: 12.5px; font-weight: 500;
  padding: 4px 14px; border-radius: 6px;
  color: #1c1c1e; cursor: pointer;
  transition: background .15s;
  font-family: inherit;
}
.todo-viewbar .seg button.active {
  background: #fff;
  box-shadow: 0 1px 3px rgba(0,0,0,0.1);
  font-weight: 600;
}
.todo-viewbar .seg button:hover:not(.active) { color: #007aff; }
.cal-nav {
  display: flex; align-items: center; justify-content: space-between;
  padding: 4px 4px 10px;
  border-bottom: 1px solid #e5e5ea;
  margin: 0 0 6px;
}
.cal-nav-left, .cal-nav-right {
  display: flex; align-items: center; gap: 6px;
}
.cal-title {
  font-size: 22px; font-weight: 600; color: #1c1c1e;
  min-width: 200px; text-align: center;
  font-feature-settings: 'tnum';
}
.cal-nav button {
  background: transparent; border: none;
  color: #ff3b30; font-size: 12.5px; font-weight: 400;
  padding: 4px 10px; border-radius: 6px; cursor: pointer;
  font-family: inherit;
}
.cal-nav button:hover { background: rgba(255,59,48,0.08); }
.cal-nav .cal-nav-primary {
  font-weight: 500;
}
.cal-weekrow, .cal-grid {
  display: grid; grid-template-columns: repeat(7, 1fr);
}
.cal-weekrow {
  background: #f1f5f9;       /* V6 浅灰表头（默认风格） */
  color: #334155;
  border-bottom: 1px solid #e2e8f0;
  padding: 10px 0;
  font-size: 12.5px;
  text-align: center;
  font-weight: 600;
}
.cal-wk-weekend { color: #ff3b30; }
.cal-grid {
  grid-auto-rows: minmax(78px, 1fr);   /* +20% 高度（64→78），保留 1fr 让可视区更大时仍能撑满 */
  min-height: 0;
  border-left: 1px solid #e2e8f0;
  border-top: 1px solid #e2e8f0;
}
.cal-cell {
  border-right: 1px solid #e2e8f0;     /* V6 边框色（默认风格） */
  border-bottom: 1px solid #e2e8f0;
  padding: 6px 8px 8px;                /* +2px 垂直 padding，让 cal-num 与边框留白，整体 +20% 高度 */
  position: relative;
  display: flex; flex-direction: column;
  background: #fff;
  cursor: pointer;
  overflow: hidden;
  transition: background .12s;
}
.cal-cell:hover { background: #f9f9fb; }
.cal-cell.is-weekend { background: #fafafc; }
.cal-cell.is-weekend:hover { background: #f3f3f6; }
.cal-cell.is-other-month { background: #fafafc; color: #b8b8bf; }
.cal-cell.is-other-month .cal-num { color: #b8b8bf; }
.cal-cell.is-other-month:hover { background: #f3f3f6; }
.cal-cell.is-today .cal-num {
  background: #007aff;
  color: #fff;
  width: 26px; height: 26px;
  border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  font-weight: 600;
}
.cal-cell.is-selected { box-shadow: inset 0 0 0 2px #007aff; background: #fff; }
.cal-num {
  font-size: 12.5px; font-weight: 500;
  color: #1c1c1e;
  align-self: flex-end;
  font-feature-settings: 'tnum';
  line-height: 28px;
  margin-bottom: 2px;
}
.cal-cell.is-weekend .cal-num { color: #ff3b30; }
.cal-cell.is-other-month .cal-num { color: #b8b8bf; }
.cal-items {
  display: flex; flex-direction: column; gap: 2px;
  overflow: hidden;
  flex: 1;
}
.cal-item {
  font-size: 12.5px;
  color: #1c1c1e;
  display: flex; align-items: flex-start; gap: 5px;
  line-height: 1.35;
  padding: 1px 4px;
  cursor: pointer;
  border-radius: 4px;
  background: #e8f0fe;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  transition: background .12s;
}
/* 按类别区分底色（日常工作=浅蓝，项目任务=浅绿，临时待布=浅杏；深浅一致仅换色相） */
.cal-item.cat-daily { background: #e8f0fe; }
.cal-item.cat-daily:hover { background: #d0e1fc; }
.cal-item.cat-project { background: #e3f6ea; }
.cal-item.cat-project:hover { background: #c6ecd5; }
.cal-item.cat-temp { background: #fdeede; }
.cal-item.cat-temp:hover { background: #fbd9b8; }
.cal-item .cal-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: #8e8e93; margin-top: 6px; flex: none;
}
.cal-item.prio-紧急 { color: #ff3b30; }
.cal-item.prio-紧急 .cal-dot { background: #ff3b30; }
.cal-item.prio-重要 { color: #ff9500; }
.cal-item.prio-重要 .cal-dot { background: #ff9500; }
.cal-item.prio-普通 { color: #1c1c1e; }
.cal-item.prio-普通 .cal-dot { background: #8e8e93; }
.cal-item.status-已完成 { color: #b8b8bf; text-decoration: line-through; }
.cal-item.status-已完成 .cal-dot { background: #b8b8bf; }
.cal-item.status-已取消 { color: #c7c7cc; text-decoration: line-through; }
.cal-item.status-已取消 .cal-dot { background: #c7c7cc; }
.cal-item-title {
  overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0;
}
/* 重复系列入口（2026-08-26：母事件不在列表/月历显示，子事件加 🔁 编辑系列） */
.cal-series-btn, .todo-series-link {
  display: inline-block; flex: none; cursor: pointer; margin-left: 4px;
  font-size: 10.5px; color: #3b82f6; background: #eff6ff; border: 1px solid #bfdbfe;
  border-radius: 4px; padding: 0 4px; line-height: 1.5;
}
.cal-series-btn:hover, .todo-series-link:hover { background: #dbeafe; }
/* 待办完成确认流程（2026-08-26） */
.todo-stat-chip {
  border: 1px solid #e2e8f0; background: #fff; border-radius: 8px;
  padding: 5px 12px; font-size: 12.5px; color: #334155; cursor: pointer;
}
.todo-stat-chip b { font-weight: 700; }
.todo-stat-chip.active { background: #eff6ff; border-color: #3b82f6; color: #1d4ed8; }
.todo-stat-chip.s-today b { color: #2563eb; }
.todo-stat-chip.s-done b { color: #059669; }
.todo-stat-chip.s-rate b { color: #7c3aed; }
.todo-stat-chip.s-over b { color: #dc2626; }
.todo-cf-badge {
  display: inline-block; font-size: 11px; border-radius: 4px; padding: 1px 7px; font-weight: 600;
}
.todo-cf-badge.cf-none { background: #f1f5f9; color: #64748b; }
.todo-cf-badge.cf-pend { background: #fef9c3; color: #a16207; }
.todo-cf-badge.cf-ok { background: #dcfce7; color: #15803d; }
.todo-cf-badge.cf-rej { background: #fee2e2; color: #b91c1c; }
.todo-overdue { color: #dc2626; font-weight: 600; }
.todo-att-item {
  display: flex; align-items: center; gap: 10px; padding: 6px 4px; border-bottom: 1px solid #f1f5f9;
}
.todo-att-item:last-child { border-bottom: none; }
.todo-att-ic {
  width: 52px; height: 52px; flex: none; display: flex; align-items: center; justify-content: center;
  background: #f1f5f9; border-radius: 6px; font-size: 22px; cursor: pointer;
}
.todo-att-meta { flex: 1; min-width: 0; }
.todo-att-name { font-size: 12.5px; color: #1e293b; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.todo-att-sub { font-size: 11px; color: #94a3b8; margin-top: 2px; }
/* 开发日志\uff082026-08-26\uff09 */
.devlog-miss { background: #fffbeb; border: 1px solid #fcd34d; border-radius: 8px; padding: 8px 12px; font-size: 12.5px; color: #92400e; margin-bottom: 10px; }
.devlog-miss.ok { background: #f0fdf4; border-color: #bbf7d0; color: #166534; }
.devlog-label { font-size: 12.5px; font-weight: 700; color: #1e293b; margin-bottom: 6px; }
.devlog-kind { display: inline-block; padding: 1px 8px; border-radius: 9px; font-size: 11px; line-height: 18px; }
.devlog-kind.daily { background: #dcfce7; color: #15803d; }
.devlog-kind.change { background: #dbeafe; color: #1d4ed8; }
.devlog-day-head { display: flex; align-items: center; gap: 10px; padding: 8px 12px; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 6px; cursor: pointer; user-select: none; font-size: 12.5px; margin-bottom: 4px; }
.devlog-day-head:hover { background: #f1f5f9; }
.devlog-day-arrow { color: #64748b; font-size: 12px; width: 14px; display: inline-block; text-align: center; }
.devlog-day-count { color: #64748b; font-size: 12px; }
.devlog-day-row > td { padding: 4px 0 !important; border-bottom: 0 !important; }
.devlog-table td { font-size: 12.5px; }
.nav-badge { display: inline-flex; min-width: 18px; height: 17px; padding: 0 2px; margin-left: 4px; margin-top: -4px; background: #ef4444; color: #fff; border-radius: 8px; font-size: 10px; font-weight: 600; line-height: 17px; justify-content: center; align-items: center; vertical-align: middle; white-space: nowrap; }
/* 资金流向跟踪一览表（2026-08-26） */
.fund-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 10px; }
.fund-title { font-size: 12.5px; font-weight: 700; color: #1e293b; }
.fund-tip { font-size: 12px; color: #94a3b8; flex: 1; }
.fund-table { width: 100%; border-collapse: collapse; }
.fund-table th {
  background: #f1f5f9; color: #334155; font-weight: 600; font-size: 12.5px;
  letter-spacing: 0.3px; padding: 10px 14px; border-bottom: 1px solid #e2e8f0;
  white-space: nowrap; text-align: center;
}
.fund-table td { padding: 8px 14px; font-size: 12.5px; color: #1e293b; line-height: 1.3; text-align: center; border-bottom: 1px solid #f1f5f9; }
.fund-company { white-space: nowrap; }
.fund-cell { cursor: pointer; transition: background .12s; }
.fund-cell:hover { background: #f8fafc; }
.fund-company-name { font-weight: 600; font-size: 12.5px; color: #1e293b; line-height: 1.3; }
.fund-company-count { font-size: 10.5px; color: #94a3b8; margin-top: 2px; }
.fund-cell-meta { font-size: 11px; color: #64748b; margin-top: 3px; display: flex; gap: 6px; align-items: center; }
.fund-cell.fund-note { padding: 8px 10px; font-size: 12px; color: #475569; max-width: 220px; vertical-align: middle; }
.fund-cell.fund-note-empty { background: #fafafa; }
.fund-cell.fund-ok { background: #f0fdf4; }
.fund-cell.fund-pend { background: #fffbeb; }
.fund-cell.fund-empty { color: #cbd5e1; font-size: 18px; background: #fafafa; }
.fund-cell-amt { font-size: 12.5px; font-weight: 700; color: #0f172a; }
.fund-cell-date { font-size: 11px; color: #64748b; margin-top: 2px; }
.fund-num {
  display: inline-block; background: #3b82f6; color: #fff; font-size: 10.5px;
  border-radius: 9px; padding: 0 6px; line-height: 1.6; margin-top: 3px;
}
.fund-pending-badge {
  display: inline-block; background: #f59e0b; color: #fff; font-size: 10.5px;
  border-radius: 9px; padding: 0 6px; line-height: 1.6; margin-left: 4px;
}
.fund-empty-row { color: #94a3b8; font-size: 12.5px; padding: 24px !important; }
.fund-row {
  display: flex; align-items: flex-start; gap: 12px; padding: 10px 8px;
  border-bottom: 1px solid #f1f5f9; font-size: 12.5px;
}
.fund-row:last-child { border-bottom: none; }
.fund-row-ok { background: #f8fafc; }
.fund-row-main { flex: 1; min-width: 0; }
.fund-row-amt { font-size: 12.5px; font-weight: 700; color: #0f172a; }
.fund-row-date { font-size: 12px; color: #64748b; margin-top: 2px; }
.fund-row-att { margin-top: 4px; font-size: 12px; }
.fund-att-link {
  color: #2563eb; text-decoration: none; margin-right: 8px; display: inline-block;
}
.fund-att-link:hover { text-decoration: underline; }
.fund-row-side { text-align: right; flex: none; min-width: 140px; }
/* 跟踪表-纯日期矩阵（2026-08-26） */
.fund-cell.fund-date { padding: 10px 8px; }
.fund-date-text { font-size: 12.5px; color: #0f172a; font-weight: 500; }
.fund-cell.fund-empty.fund-date { background: #fafafa; }
.fund-stat { font-size: 12px; color: #64748b; }
.fund-stat b { color: #2563eb; font-weight: 700; padding: 0 2px; }
.cal-item-time {
  color: #1c1c1e;
  font-size: 12.5px;
  font-weight: 400;
  flex: none;
  margin-left: 2px;
}

/* ================= 工伤处理（申请 / 审核 / 台账） ================= */
.subtitle { font-size: 12.5px; color: #8e8e93; margin-top: 4px; }

/* ================= 供应商审核（嵌入「供方管理」页下方） ================= */
/* 框体 Box Pattern 已在共用选择器中定义，这里只补 sup-approval 专属属性 */
.sup-approval-wrap { margin-top: 26px; padding: 0;
  overflow: hidden;
}
/* 嵌在审批框里的表格去掉自带外框/阴影/圆角，避免双重框体 */
.sup-approval-wrap .table-wrap {
  background: transparent; border: none; border-radius: 0; box-shadow: none; margin: 0;
}
/* 头部：跟上面 .table-wrap 表头同款（灰底 #f1f5f9 + 14px 字重 600），整体风格统一 */
.sup-approval-wrap .sup-approval-head {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  padding: 14px 16px; border-bottom: 1px solid #e2e8f0;
  border-top-left-radius: 12px; border-top-right-radius: 12px;
  background: #f1f5f9; margin-bottom: 0;
}
.sup-approval-wrap .sup-approval-head h3 { margin: 0; font-size: 12.5px; color: #334155; font-weight: 600; letter-spacing: 0.3px; }
.sup-approval-wrap .sup-approval-head .subtitle { margin-top: 0; flex-basis: auto; color: #64748b; font-size: 12.5px; margin-left: 4px; font-weight: 400; letter-spacing: 0; text-transform: none; }
.sup-approval-wrap .sup-approval-head .fgrp {
  position: static; margin-left: auto; display: inline-flex; align-items: center; gap: 6px;
}
.sup-approval-wrap .sup-approval-head .fgrp label { font-size: 12.5px; color: #475569; white-space: nowrap; font-weight: 500; }
.sup-approval-wrap .sup-approval-head .fgrp select { padding: 6px 12px; border: 1px solid var(--border); border-radius: 8px; font-size: 12.5px; font-family: inherit; background: #fff; color: #1e293b; cursor: pointer; outline: none; }
.sup-approval-wrap .sup-approval-head .fgrp select:focus { border-color: #cbd5e1; box-shadow: 0 0 0 3px rgba(15,23,42,.04); }
.sup-approval-wrap .supapp-summary { font-size: 12.5px; color: #475569; margin: 12px 16px 0; padding: 6px 12px; background: #f1f5f9; border: 1px solid #e2e8f0; border-radius: 6px; display: inline-block; }
.table-wrap table tbody tr:nth-child(even) td { background: #f8fafc; }
.sup-approval-wrap .badge { padding: 3px 10px; font-size: 12px; font-weight: 600; border-radius: 999px; }

.row-actions { display: inline-flex; gap: 6px; align-items: center; }
.tbl-work_injuries table { width: 100%; border-collapse: collapse; }

/* ================= 供方管理页布局（2026-09-02） ================= */
/* 老板需求：整页控制在一屏以内，上方供应商列表框内嵌上下滚动条，下方待审核申请框压缩 30% */
/* 用 :has() 限定仅在 contracts 页（包含 #sup-approval-host）生效，不污染其他页面 */
#view:has(#sup-approval-host) {
  display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0;
}
/* view-head 固定不参与拉伸 */
#view:has(#sup-approval-host) > .view-head { flex-shrink: 0; }
/* 列表区：flex 拉满剩余空间；非表格子元素（统计卡/警示）固定不压缩，多余高度全给表格框 */
#view:has(#sup-approval-host) #list-area {
  flex: 1 1 auto; min-height: 0;
  display: flex; flex-direction: column;
}
#view:has(#sup-approval-host) #list-area > *:not(.table-wrap) { flex-shrink: 0; }
/* 表格框：保留共用 Box Pattern 外框（白底渐变 + 12px 圆角 + 描边 + 多层阴影，勿剥掉），
   上下滚动条做在框体内部：flex 压缩限定高度 + overflow-y:auto 内滚 */
#view:has(#sup-approval-host) #list-area > .table-wrap {
  flex: 1 1 auto; min-height: 0;
  overflow-y: auto;  /* 纵向滚动条在 V6 框体内 */
  overflow-x: auto;  /* 横向滚动保留（sticky 末列依赖 overflow-x 容器） */
}
/* 待审核框：固定不参与拉伸；先后两次压缩（13:18 首压 30%，13:50 再压 20%），
   padding/spacing/按钮高度再减一档——空状态 padding 从全局 40px 收紧到 16px */
#view:has(#sup-approval-host) .sup-approval-wrap { flex-shrink: 0; margin-top: 8px; }
#view:has(#sup-approval-host) .sup-approval-wrap .sup-approval-head { padding: 6px 8px; gap: 6px; }
#view:has(#sup-approval-host) .sup-approval-wrap .sup-approval-head h3 { font-size: 12px; }
#view:has(#sup-approval-host) .sup-approval-wrap .sup-approval-head .subtitle { font-size: 11px; }
#view:has(#sup-approval-host) .sup-approval-wrap .sup-approval-head .fgrp select { padding: 3px 6px; font-size: 11px; }
#view:has(#sup-approval-host) .sup-approval-wrap .supapp-summary { font-size: 11px; margin: 4px 8px 0; padding: 3px 6px; }
#view:has(#sup-approval-host) .sup-approval-wrap table { font-size: 12px; }
#view:has(#sup-approval-host) .sup-approval-wrap table th,
#view:has(#sup-approval-host) .sup-approval-wrap table td { padding: 3px 6px; }
#view:has(#sup-approval-host) .sup-approval-wrap .badge { padding: 2px 8px; font-size: 11px; }
#view:has(#sup-approval-host) .sup-approval-wrap .row-actions .btn-sm { padding: 2px 8px; font-size: 11px; height: 20px; min-height: 20px; }
/* 空状态：全局 .empty padding:40px 过大，收紧到 16px；icon 字号限 18px */
/* 2026-09-02 框体高度 +15%：16→28px（整框约 +24px ≈ +15%，此规则特异性高于 .sup-approval-wrap .empty，实际生效处） */
#view:has(#sup-approval-host) .sup-approval-wrap .empty { padding: 28px; }
#view:has(#sup-approval-host) .sup-approval-wrap .empty .icon { font-size: 18px; }
/* 供方管理表头首行固定（红框内，滚动时不要动）：thead th sticky top，
   显式设背景避免露出 .table-wrap 渐变底；末列（操作列）同时 sticky top+right 需更高 z-index */
#view:has(#sup-approval-host) #list-area > .table-wrap thead th {
  position: sticky; top: 0;
  z-index: 2;
  background: #f1f5f9;
  box-shadow: inset 0 -1px 0 #e2e8f0;  /* 替代 border-bottom，避免 sticky 时 1px 缝隙 */
  border-bottom: 0;                    /* 边框改 box-shadow 实现，避免与 sticky 渲染冲突 */
}
#view:has(#sup-approval-host) #list-area > .table-wrap thead th:last-child {
  z-index: 3;                           /* 同时 sticky right 的末列：z-index 高于普通 th(2) */
  background: #f8fafc;                  /* 与全局 L185 末列表头色一致 */
}
/* 工伤处理 V6 化（2026-09-02）：
   - 表头背景/字色对齐 V6 通用（#f1f5f9 / #334155），不再被原浅色（#f7f8fa/#64748b）覆盖
   - 删除 td font-size: 12.5px 死代码（特异性 0,1,1 < 通用 0,1,3，一直由通用 12.5px 生效）
   - 选择器升级到 .table-wrap.tbl-work_injuries，特异性 (0,2,1) > 通用 (0,1,3)，保证 text-align:center 真正生效（工伤表全列居中）
*/
.table-wrap.tbl-work_injuries th,
.table-wrap.tbl-work_injuries td { padding: 9px 12px; text-align: center; border-bottom: 1px solid #eef0f3; }
.tbl-work_injuries th { background: #f1f5f9; color: #334155; font-weight: 600; white-space: nowrap; }
.tbl-work_injuries td.wi-desc { max-width: 320px; white-space: normal; word-break: break-word; color: #334155; line-height: 1.5; text-align: left; }
/* 2026-10-17 INJFOLLOW：工伤处理操作列 2 → 4 个按钮（同意 / 后续资料 / 编辑 / 删除）后表格被挤窄，
   实测「已申报」「无等级」徽章与「编辑/删除」都被折成一列一个字 ⇒ 单元格一律不折行。
   事故经过列有自己的 .wi-desc（max-width 320 + white-space:normal，特异性更高）不受影响。 */
.tbl-work_injuries td { white-space: nowrap; }
.tbl-work_injuries .money { font-variant-numeric: tabular-nums; font-weight: 600; color: #0f172a; }
.tbl-work_injuries .loss-pos { color: #dc2626; }   /* 亏损（赔付>协商）：红 */
.tbl-work_injuries .loss-neg { color: #16a34a; }   /* 盈余（赔付<协商）：绿 */
.btn-pass { background: #2563eb; color: #fff; border: none; }
.btn-pass:hover { background: #1d4ed8; }
.btn-close { background: #16a34a; color: #fff; border: none; }
.btn-close:hover { background: #15803d; }
.cal-more {
  font-size: 11px;
  color: #8e8e93;
  padding: 1px 4px;
  cursor: pointer;
  border-radius: 3px;
}
.cal-more:hover { background: #f2f2f7; color: #007aff; }
.cal-legend {
  display: flex; gap: 14px; padding: 10px 4px 4px; font-size: 12px; color: #6c6c70;
}
.cal-legend-item { display: inline-flex; align-items: center; gap: 5px; }
.cal-legend-item .cal-dot { margin: 0; }
.cal-popup {
  position: fixed;
  z-index: 9999;
  background: #fff;
  border-radius: 12px;
  box-shadow: 0 8px 28px rgba(0,0,0,0.22);
  border: 1px solid #e5e7eb;
  padding: 6px 0;
  max-width: 320px;
  max-height: 630px;
  overflow-y: auto;
  min-width: 220px;
}
.cal-popup .pop-date {
  text-align: center; padding: 8px 16px 6px;
  font-size: 12.5px; color: #6c6c70;
  border-bottom: 1px solid #f1f1f4;
  font-weight: 500;
}
.cal-popup .pop-item {
  padding: 8px 16px;
  cursor: pointer;
  font-size: 12.5px;
  border-bottom: 1px solid #f1f1f4;
}
.cal-popup .pop-item:last-child { border-bottom: none; }
.cal-popup .pop-item:hover { background: #f2f2f7; }
.cal-popup .pop-empty { padding: 18px 16px; color: #8e8e93; text-align: center; font-size: 12.5px; }
.cal-popup .pop-foot {
  padding: 6px 16px 8px;
  border-top: 1px solid #f1f1f4;
  text-align: center;
}
.cal-popup .pop-foot button {
  background: #007aff; color: #fff; border: none;
  padding: 5px 14px; border-radius: 6px;
  font-size: 12.5px; cursor: pointer; font-family: inherit;
}

/* ---------------- 待办事项：仅月历容器立体浮雕 ---------------- */
/* 月历容器（红框内）：保留浮雕立体边框 */
.todo-page {
  /* 关键：去掉 height:100%（父级 .content 是 overflow:auto 滚动容器，100% 无效）
     改用 flex:1 + min-height:0，让 .todo-page 在 .content 这个 flex 列里拉满到可视区
     （与 .cal-wrap / .cal-grid 的 flex 链路保持一致） */
  flex: 1 1 auto;
  min-height: 0;
  display: flex; flex-direction: column;
}
/* #todo-list 是 .todo-page 内的实际渲染容器；要让月历拉满 .todo-page，
   必须先让它成为 flex:1 项（.todo-page 的剩余空间）。注意：列表/看板/甘特视图下，
   内部若自身有滚动，也仍可正常工作，因为 .todo-page 是 flex 列容器。 */
#todo-list { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
/* 月历视图下：让 .cal-wrap 占满 #todo-list 剩余高度 */
#todo-list:has(> .cal-wrap) { /* 仅当直接子元素是 .cal-wrap 时启用 */ }
/* 兼容无 :has 的浏览器：直接给 .cal-wrap 也补一份（它自身已是 flex 列容器）。 */
.todo-page .cal-wrap {
  border: 1px solid rgba(15, 23, 42, 0.18);
  border-radius: 12px;
  padding: 10px;
  background: linear-gradient(180deg, #ffffff 0%, #fafbfc 100%);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.9) inset,
    0 -1px 0 rgba(15, 23, 42, 0.04) inset,
    0 16px 32px -12px rgba(15, 23, 42, 0.20),
    0 6px 12px -4px rgba(15, 23, 42, 0.10),
    0 2px 4px rgba(15, 23, 42, 0.05);
  position: relative;
  overflow: hidden;
  flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column;       /* 占满 todo-page 剩余高度 */
}
/* 顶部一条柔和的金属高光线（仅月历） */
.todo-page .cal-wrap::before {
  content: '';
  position: absolute;
  left: 16px; right: 16px; top: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.95) 50%, transparent 100%);
  pointer-events: none;
}
.todo-page .cal-nav {
  border-bottom: 1px solid rgba(15, 23, 42, 0.06);
  padding-bottom: 8px;
}
/* 「待办事项」月历：让 grid 占满 cal-wrap 剩余空间，把月历拉伸到适配整个 content 可视区
   （2026-08-16 用户反馈：红框框体太矮，下方大片留白，要求撑满整页到底部任务栏上方）
   - flex:1 1 auto 让 .cal-grid 在 .cal-wrap 这个 flex 列容器里吃掉 nav/weekrow/legend 之外的剩余高度
   - min-height:0 配合 .cal-wrap 已有的 min-height:0，让 grid 真正被允许收缩到 0，再被 flex:1 反推拉满
   - grid-auto-rows: minmax(64px, 1fr)（原样式）保留 → 6 行在拉满的高度里等分 */
.todo-page .cal-grid {
  flex: 1 1 auto;
  min-height: 0;
}
.todo-page .cal-grid .cal-cell {
  border-right: 1px solid rgba(15, 23, 42, 0.04);
  border-bottom: 1px solid rgba(15, 23, 42, 0.04);
  background: #ffffff;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.9);
}
.todo-page .cal-grid .cal-cell:nth-child(7n) { border-right: none; }
.todo-page .cal-grid > .cal-cell.is-today {
  box-shadow:
    inset 0 0 0 2px #007aff,
    0 0 0 1px rgba(0, 122, 255, 0.15);
}
.todo-page .cal-weekrow {
  background: linear-gradient(180deg, #fafbfc 0%, #f1f3f7 100%);
  border-radius: 8px 8px 0 0;
}
.todo-page .cal-legend {
  border-top: 1px solid rgba(15, 23, 42, 0.06);
  padding-top: 8px;
}

/* ---------------- 重复（苹果日历二级面板） ---------------- */
.ap-recur-overlay {
  position: fixed; inset: 0; background: rgba(0,0,0,0.4);
  z-index: 10000;
  display: flex; align-items: flex-start; justify-content: center;
  overflow-y: auto; padding: 40px 12px;
  animation: ap-fade-in 0.15s ease-out;
}
@keyframes ap-fade-in { from { opacity: 0; } to { opacity: 1; } }
.ap-recur-panel {
  position: relative;
  background: #f2f2f7;
  border-radius: 14px;
  width: 100%; max-width: 420px;
  padding: 50px 24px 24px;
  box-shadow: 0 12px 32px rgba(0,0,0,0.25);
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
}
.ap-recur-close {
  position: absolute; top: 12px; left: 12px;
  background: none; border: none; cursor: pointer;
  width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 50%;
}
.ap-recur-close:hover { background: rgba(0,0,0,0.06); }
.ap-recur-title {
  text-align: center; font-size: 18px; font-weight: 600;
  color: #1c1c1e; margin: 0 0 20px;
}
.ap-recur-body { margin-bottom: 26px; }
.ap-recur-pill {
  display: flex; align-items: center; justify-content: space-between;
  width: 200px; margin: 0 auto 22px;
  padding: 9px 14px; background: #e5e5ea;
  border: none; border-radius: 10px;
  font-size: 12.5px; color: #1c1c1e; cursor: pointer;
  font-family: inherit;
}
.ap-recur-pill:hover { background: #dedee5; }
.ap-recur-pill-chev { flex: none; margin-left: 8px; }
.ap-recur-section { text-align: center; }
.ap-recur-empty {
  font-size: 12.5px; color: #8e8e93; padding: 14px 0 22px;
}
.ap-recur-interval {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 12.5px; color: #1c1c1e;
  margin-bottom: 18px;
}
.ap-recur-num {
  width: 52px; padding: 6px 8px; text-align: center;
  border: 1px solid #c7c7cc; border-radius: 8px;
  font-size: 12.5px; font-family: inherit;
  -moz-appearance: textfield;
}
.ap-recur-num::-webkit-outer-spin-button,
.ap-recur-num::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.ap-recur-weekdays {
  display: flex; justify-content: center; gap: 8px;
  margin-top: 10px;
}
.ap-recur-wdbtn {
  width: 38px; height: 38px; border-radius: 10px;
  border: 1px solid #e5e5ea; background: #fff;
  font-size: 12.5px; color: #1c1c1e; cursor: pointer;
  font-family: inherit;
}
.ap-recur-wdbtn.selected {
  background: #ff3b30; color: #fff; border-color: #ff3b30;
}
.ap-recur-segmented {
  display: flex; width: 280px; margin: 16px auto 14px;
  background: #e5e5ea; border-radius: 9px; padding: 2px;
}
.ap-recur-seg {
  flex: 1; padding: 8px 0; background: none;
  border: none; cursor: pointer;
  font-size: 12.5px; color: #1c1c1e;
  border-radius: 7px;
  font-family: inherit;
}
.ap-recur-seg.selected { background: #fff; box-shadow: 0 1px 4px rgba(0,0,0,0.08); font-weight: 500; }
.ap-recur-mini-cal {
  display: grid; grid-template-columns: repeat(7, 1fr);
  gap: 6px; max-width: 280px; margin: 0 auto;
}
.ap-recur-cday {
  height: 36px; background: none;
  border: none; cursor: pointer;
  font-size: 12.5px; color: #1c1c1e; border-radius: 8px;
  font-family: inherit;
}
.ap-recur-cday.selected { background: #ff3b30; color: #fff; }
.ap-recur-stack {
  display: flex; flex-direction: column; gap: 10px;
  max-width: 240px; margin: 14px auto 0;
}
.ap-recur-select {
  display: flex; align-items: center; justify-content: space-between;
  padding: 10px 14px; background: #e5e5ea;
  border-radius: 10px; cursor: pointer;
  font-size: 12.5px; color: #1c1c1e;
}
.ap-recur-select:hover { background: #dedee5; }
.ap-recur-months {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 8px; max-width: 320px; margin: 8px auto 14px;
}
.ap-recur-month {
  padding: 10px 0; background: #fff;
  border: 1px solid #e5e5ea; border-radius: 10px;
  font-size: 12.5px; color: #1c1c1e; cursor: pointer;
  font-family: inherit;
}
.ap-recur-month.selected { background: #ff3b30; color: #fff; border-color: #ff3b30; }
.ap-recur-check {
  display: flex; align-items: center; justify-content: center;
  gap: 6px; cursor: pointer;
  font-size: 12.5px; color: #1c1c1e;
  margin: 14px 0 10px;
}
.ap-recur-check input[type=checkbox] { width: 16px; height: 16px; }
.ap-recur-yearly-by {
  display: flex; flex-direction: column; gap: 10px;
  max-width: 240px; margin: 0 auto;
  transition: opacity 0.15s ease;
}
.ap-recur-confirm {
  display: block; width: 100%; max-width: 240px; margin: 0 auto;
  padding: 13px 0; background: #ff3b30; color: #fff;
  border: none; border-radius: 10px;
  font-size: 12.5px; font-weight: 500;
  cursor: pointer; font-family: inherit;
}
.ap-recur-confirm:hover { background: #e3342a; }

/* 重复（日常工作）行内展开面板 — 替代原顶部 modal 弹窗 */
.ap-recur-inline { background: #f7f7f8; padding: 10px 14px 12px; border-radius: 8px; margin: 4px 0; }
.ap-recur-inline-row { margin: 8px 0; }
.ap-recur-inline-label { font-size: 12px; color: #6e6e73; margin-bottom: 4px; }
.ap-recur-inline-hint { font-size: 12px; color: #6e6e73; margin-top: 6px; line-height: 1.4; }
.ap-recur-inline-interval { display: flex; align-items: center; gap: 6px; font-size: 12.5px; color: #1c1c1e; }
.ap-recur-inline-num { width: 56px; padding: 6px 8px; border: 1px solid #d1d1d6; border-radius: 6px; font-size: 12.5px; text-align: center; }
.ap-recur-inline-date { padding: 6px 8px; border: 1px solid #d1d1d6; border-radius: 6px; font-size: 12.5px; }
/* 内联面板里的分段控件撑满宽度，去掉原 modal 的固定 280px/居中 */
.ap-recur-inline .ap-recur-segmented { width: 100%; margin: 6px 0; }
.ap-recur-inline-done { display: block; margin: 8px auto 0; background: none; border: none; color: #007aff; font-size: 12.5px; cursor: pointer; font-family: inherit; }
.ap-recur-inline-done:hover { color: #0056b3; }
.cal-popup .pop-foot button:hover { background: #0066d6; }

/* ==================== 项目任务：里程碑 / 看板 / 甘特 ==================== */

/* —— 月历里程碑圆点 —— */
.cal-ms { display: inline-flex; align-items: center; margin: 1px 3px 0 0; cursor: pointer; vertical-align: middle; }
.cal-ms-dot {
  display: block; width: 7px; height: 7px; border-radius: 50%;
  background: #0066d6; box-shadow: 0 0 0 2px rgba(0, 102, 214, .15);
  transition: transform .15s ease;
}
.cal-ms:hover .cal-ms-dot { transform: scale(1.35); }
.cal-ms.status-进行中 .cal-ms-dot { background: #ff9500; box-shadow: 0 0 0 2px rgba(255, 149, 0, .18); }
.cal-ms.status-已完成 .cal-ms-dot { background: #16a34a; box-shadow: 0 0 0 2px rgba(22, 163, 74, .15); }
.cal-ms.status-已取消 .cal-ms-dot { background: #c7c7cc; box-shadow: none; }

/* —— 看板：顶部项目进度条 —— */
.kanban-wrap { padding: 4px 2px 12px; }
.kb-projects {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 10px; margin-bottom: 14px;
}
.kb-proj { background: #fff; border: 1px solid #e5e5ea; border-radius: 10px; padding: 10px 12px; }
.kb-proj-top { display: flex; justify-content: space-between; align-items: center; gap: 8px; margin-bottom: 8px; }
.kb-proj-name {
  font-size: 12.5px; font-weight: 600; color: #1c1c1e;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.kb-prog { font-size: 12px; color: #64748b; flex-shrink: 0; font-variant-numeric: tabular-nums; }
.kb-bar { height: 6px; border-radius: 3px; background: #f0f0f3; overflow: hidden; }
.kb-bar-fill {
  height: 100%; border-radius: 3px;
  background: linear-gradient(90deg, #0066d6, #3b9dff);
  transition: width .3s ease;
}

/* —— 看板：四列 —— */
.kb-board { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; align-items: start; }
.kb-col {
  background: #f7f7f9; border: 1px solid #e5e5ea; border-radius: 10px;
  display: flex; flex-direction: column; min-height: 120px;
}
.kb-col-head {
  padding: 9px 12px; font-size: 12.5px; font-weight: 600; color: #1c1c1e;
  border-bottom: 1px solid #e5e5ea; display: flex; align-items: center; gap: 6px;
}
.kb-count {
  background: #e5e5ea; color: #64748b; border-radius: 9px;
  padding: 0 7px; font-size: 11px; font-weight: 500; line-height: 17px;
}
.kb-col-body { padding: 8px; display: flex; flex-direction: column; gap: 8px; max-height: 540px; overflow-y: auto; }
.kb-card {
  background: #fff; border: 1px solid #e5e5ea; border-radius: 8px; padding: 9px 10px;
  cursor: pointer; transition: box-shadow .15s ease, transform .15s ease;
}
.kb-card:hover { box-shadow: 0 2px 10px rgba(0, 0, 0, .08); transform: translateY(-1px); }
.kb-card.kb-over { border-color: #ff3b30; background: #fff5f5; }
.kb-phase { font-size: 12.5px; font-weight: 600; color: #1c1c1e; margin-bottom: 3px; word-break: break-all; }
.kb-meta { font-size: 11.5px; color: #8e8e93; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kb-plan { font-size: 11.5px; color: #64748b; margin-top: 5px; }
.kb-plan.over { color: #ff3b30; font-weight: 600; }
.kb-empty { text-align: center; color: #c7c7cc; font-size: 12px; padding: 14px 0; }

@media (max-width: 1px) { .kb-board { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 1px) { .kb-board { grid-template-columns: 1fr; } }

/* —— 甘特 / 时间轴 —— */
.gantt-wrap { padding: 4px 2px 12px; overflow-x: auto; }
.gt-head {
  display: flex; margin-left: 180px; min-width: 520px;
  border-bottom: 1px solid #e5e5ea; padding-bottom: 4px; margin-bottom: 6px;
}
.gt-hcell { flex: 1 1 0; min-width: 0; text-align: center; font-size: 10.5px; color: #8e8e93; }
.gt-hcell.gt-wk { color: #0066d6; font-weight: 600; }
.gt-row { display: flex; align-items: center; margin-bottom: 6px; min-width: 700px; }
.gt-label {
  width: 180px; flex-shrink: 0; padding-right: 10px; font-size: 12.5px; color: #1c1c1e;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.gt-track {
  position: relative; flex: 1; display: flex; height: 22px;
  background: #f7f7f9; border-radius: 5px; overflow: hidden;
}
.gt-cell { flex: 1 1 0; min-width: 0; border-right: 1px solid rgba(0, 0, 0, .04); }
.gt-cell.gt-wk { background: rgba(0, 102, 214, .05); }
.gt-cell.gt-past { background: rgba(0, 0, 0, .03); }
.gt-cell.gt-wk.gt-past { background: rgba(0, 102, 214, .07); }
.gt-bar {
  position: absolute; top: 3px; height: 16px; border-radius: 4px; cursor: pointer;
  background: #0066d6; box-shadow: 0 1px 3px rgba(0, 102, 214, .35);
}
.gt-bar:hover { filter: brightness(1.12); }
.gt-bar.gt-done { background: #16a34a; box-shadow: 0 1px 3px rgba(22, 163, 74, .35); }
.gt-bar.gt-over { background: #ff3b30; box-shadow: 0 1px 3px rgba(255, 59, 48, .4); }
.gt-out { position: absolute; left: 8px; top: 3px; font-size: 11px; line-height: 16px; color: #c7c7cc; }

/* —— 阶段编辑器：逾期高亮 —— */
.ap-phase.ap-phase-over { border-color: #ff3b30; background: #fff5f5; }
.ap-phase.ap-phase-over .ap-phase-plan { color: #ff3b30; font-weight: 600; }


/* ====== 用工单位操作栏下拉菜单 ====== */
.action-dropdown { position:relative; display:inline-block; vertical-align:middle; }
.action-drop-btn { cursor:pointer; font-size:12px; background:#f8fafc; border:1px solid #d1d5db; padding:4px 10px; border-radius:6px; transition:all .15s; }
.action-drop-btn:hover { background:#e2e8f0; border-color:#94a3b8; }
.action-drop-menu { display:none; position:fixed; min-width:130px; background:#fff; border:1px solid #e5e7eb; border-radius:8px; box-shadow:0 8px 24px rgba(15,23,42,.18); z-index:9999; padding:6px 0; }
.action-drop-menu.show { display:block; }
.action-drop-menu a { display:block; padding:8px 14px; font-size: 12.5px; color:#374151; cursor:pointer; text-decoration:none; transition:background .12s; }
.action-drop-menu a:hover { background:#f1f5f9; color:#111827; }

/* 驻厂管理员欢迎页：背景图铺满整个内容区，页面不滚动 */
.content.welcome-active { overflow: hidden; padding: 0; background: #eef2f7 url(/assets/welcome-bg.jpg) center/cover no-repeat; }
.content.welcome-active #view { flex: 1; min-height: 0; display: flex; align-items: center; justify-content: center; }

/* 驻厂管理员模式：隐藏侧栏与折叠按钮 */
body.site-admin-mode .sidebar { display: none; }
body.site-admin-mode .sidebar-toggle { display: none; }

/* 员工台账顶部汇总卡片（复用 ck-kpi 样式，5 列；点击筛选 + active 高亮） */
/* ===== 员工台账顶部汇总卡片（模板：紧凑型 KPI 卡片，总高约 56px） ===== */
/* 2026-09-02：新增「合同暂缺」卡，5→6 列等宽 */
.emp-stats { display: grid; grid-template-columns: repeat(7, 1fr); gap: 10px; margin-bottom: 12px; }
.emp-stats .ck-kpi { padding: 7px 12px; cursor: pointer; transition: transform .12s, box-shadow .12s; }
.emp-stats .ck-kpi:hover { transform: translateY(-1px); box-shadow: 0 3px 8px rgba(15,23,42,.1); }
.emp-stats .ck-kpi.active { box-shadow: 0 0 0 2px #2563eb inset; }
.emp-stats .ck-kpi.active::before { width: 4px; }
/* 统计卡片排版：自然高度（原77px×80%≈62px）；标签13px加粗 / 数字22px加粗 / 说明12px右对齐 */
.emp-stats .ck-kpi { padding: 3px 12px 5px 12px; display: flex; flex-direction: column; justify-content: flex-start; }
.emp-stats .ck-kpi .lb { font-size: 12.5px; font-weight: 700; margin-bottom: 1px; }
.emp-stats .ck-kpi .vl { font-size: 22px; font-weight: 700; line-height: 1; }
.emp-stats .ck-kpi .sb { font-size: 12px; margin-top: 1px; text-align: right; }
.emp-stats .ck-kpi .row2 { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.emp-stats .ck-kpi .row2 .vl { flex: 0 0 auto; min-width: 48px; }
@media (max-width: 1280px) { .emp-stats { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 800px) { .emp-stats { grid-template-columns: repeat(3, 1fr); } }

/* ===== 员工管理页三段固定布局（2026-09-08 老板截图反馈）：
   顶部按钮+筛选固定 / 6 个汇总卡固定 / 表头固定 / 数据行内滚 =====
   仅在员工管理页（含 .tbl-employees）生效，不污染其他 .table-wrap 页面 */
#view:has(.tbl-employees) {
  display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0;
}
#view:has(.tbl-employees) > .view-head { flex-shrink: 0; }
/* 列表区 flex 拉满剩余空间：emp-stats 与 siteAdminWarn 不压缩，高度全给 table-wrap */
#view:has(.tbl-employees) #list-area {
  flex: 1 1 auto; min-height: 0;
  display: flex; flex-direction: column;
}
#view:has(.tbl-employees) #list-area > .emp-stats { flex-shrink: 0; }
#view:has(.tbl-employees) #list-area > .site-admin-warn { flex-shrink: 0; }
/* 表格框：保留共用 Box Pattern（白底渐变 + 12px 圆角 + 描边 + 多层阴影），内嵌上下滚动 */
#view:has(.tbl-employees) #list-area > .table-wrap.tbl-employees {
  flex: 1 1 auto; min-height: 0;
  overflow-y: auto;
  overflow-x: auto;  /* 横向滚动保留（sticky 末列依赖 overflow-x 容器） */
}
/* 表头 sticky：显式设背景避免露出 .table-wrap 渐变底；末列 z-index 高于普通 th */
#view:has(.tbl-employees) #list-area > .table-wrap.tbl-employees thead th {
  position: sticky; top: 0; z-index: 2;
  background: #f1f5f9;
  box-shadow: inset 0 -1px 0 #e2e8f0;  /* 替代 border-bottom，避免 sticky 时 1px 缝隙 */
  border-bottom: 0;
}
#view:has(.tbl-employees) #list-area > .table-wrap.tbl-employees thead th:last-child { z-index: 3; }

/* 2026-09-08 老板截图反馈：操作列折叠/展开按钮（表头「操作」右侧 ⊟ 按钮） */
.tbl-employees th.col-ops-th { position: relative; padding-right: 28px; }
.tbl-employees th.col-ops-th .col-ops-toggle {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  width: 20px; height: 20px; padding: 0; line-height: 1; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #475569;
  font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center;
  transition: background .12s, border-color .12s, color .12s;
}
.tbl-employees th.col-ops-th .col-ops-toggle:hover { background: #f1f5f9; border-color: #94a3b8; color: #1e293b; }
.tbl-employees th.col-ops-th .col-ops-toggle:active { background: #e2e8f0; }
/* 2026-09-24 EMPFOLD2：折叠只藏「编辑/删除/补差/备注」，「操作记录」按钮常驻可见（老板 09-24 指示）；
   表头「操作」文字与列宽恢复正常（td 有常驻按钮，整列不再消失） */
.tbl-employees.col-collapsed td.col-ops-td .row-actions > *:not([data-editlog]) { display: none !important; }
.tbl-employees.col-collapsed td.col-ops-td { padding-right: 2px; }
/* 折叠态时按钮变 +（提示点击展开）；按钮缩到 14×14 + 紧贴右边 */
.tbl-employees.col-collapsed th.col-ops-th .col-ops-toggle { background: #2563eb; color: #fff; border-color: #2563eb; width: 14px; height: 14px; right: 1px; font-size: 10.5px; line-height: 1; }
/* 2026-10-18 DEPTCOL（老板要求）：「部门 / 科室 / 班组 / 工号」四列默认折叠，点「▸ 部门信息」展开。
   折叠开关是框体上的 .dept-collapsed（05-list.js 在 render 时按 empDeptOpen 挂/不挂）。
   🔴 与操作列的 .col-collapsed **互不相干**：员工页那张表一进来就带着 .col-collapsed（操作列默认折叠），
      若这里也写 .col-collapsed，展开部门信息会顺带把操作列一起放开。
   ⚠️ 必须 !important：th 带 .etf-th（列筛选 ▾），display 不能被别的规则抢回去。 */
.tbl-employees.dept-collapsed th.c-department,
.tbl-employees.dept-collapsed td.c-department,
.tbl-employees.dept-collapsed th.c-section,
.tbl-employees.dept-collapsed td.c-section,
.tbl-employees.dept-collapsed th.c-team,
.tbl-employees.dept-collapsed td.c-team,
.tbl-employees.dept-collapsed th.c-emp_no,
.tbl-employees.dept-collapsed td.c-emp_no { display: none !important; }

/* ===== 员工预支页操作列折叠：与 .tbl-employees 完全同款（2026-09-08 老板反馈）===== */
.tbl-advances th.col-ops-th { position: relative; padding-right: 28px; }
.tbl-advances th.col-ops-th .col-ops-toggle {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  width: 20px; height: 20px; padding: 0; line-height: 1; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #475569;
  font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center;
  transition: background .12s, border-color .12s, color .12s;
}
.tbl-advances th.col-ops-th .col-ops-toggle:hover { background: #f1f5f9; border-color: #94a3b8; color: #1e293b; }
.tbl-advances th.col-ops-th .col-ops-toggle:active { background: #e2e8f0; }
.tbl-advances.col-collapsed th.col-ops-th .col-ops-th-label { display: none; }
.tbl-advances.col-collapsed th.col-ops-th { padding-right: 2px; min-width: 16px; }
.tbl-advances.col-collapsed td.col-ops-td { display: none; }
.tbl-advances.col-collapsed th.col-ops-th .col-ops-toggle { background: #2563eb; color: #fff; border-color: #2563eb; width: 14px; height: 14px; right: 1px; font-size: 10.5px; line-height: 1; }

/* ===== 记账凭证页操作列折叠：与 .tbl-employees 逐字同款（2026-09-23 老板截图，第 4 个同款页）===== */
.tbl-vouchers th.col-ops-th { position: relative; padding-right: 28px; }
.tbl-vouchers th.col-ops-th .col-ops-toggle {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  width: 20px; height: 20px; padding: 0; line-height: 1; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #475569;
  font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center;
  transition: background .12s, border-color .12s, color .12s;
}
.tbl-vouchers th.col-ops-th .col-ops-toggle:hover { background: #f1f5f9; border-color: #94a3b8; color: #1e293b; }
.tbl-vouchers th.col-ops-th .col-ops-toggle:active { background: #e2e8f0; }
.tbl-vouchers.col-collapsed th.col-ops-th .col-ops-th-label { display: none; }
.tbl-vouchers.col-collapsed th.col-ops-th { padding-right: 2px; min-width: 16px; }
.tbl-vouchers.col-collapsed td.col-ops-td { display: none; }
.tbl-vouchers.col-collapsed th.col-ops-th .col-ops-toggle { background: #2563eb; color: #fff; border-color: #2563eb; width: 14px; height: 14px; right: 1px; font-size: 10.5px; line-height: 1; }

/* ===== 报销管理页操作列折叠：与 .tbl-employees 逐字同款（2026-09-11 老板截图）=====
   原样式只写了 .tbl-employees / .tbl-advances，报销页（.tbl-reimbursements）无任何规则，
   表头 ⊟ 按钮落回浏览器默认按钮外观（蓝框方块），与员工管理页不一致 */
.tbl-reimbursements th.col-ops-th { position: relative; padding-right: 28px; }
.tbl-reimbursements th.col-ops-th .col-ops-toggle {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  width: 20px; height: 20px; padding: 0; line-height: 1; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #475569;
  font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center;
  transition: background .12s, border-color .12s, color .12s;
}
.tbl-reimbursements th.col-ops-th .col-ops-toggle:hover { background: #f1f5f9; border-color: #94a3b8; color: #1e293b; }
.tbl-reimbursements th.col-ops-th .col-ops-toggle:active { background: #e2e8f0; }
.tbl-reimbursements.col-collapsed th.col-ops-th .col-ops-th-label { display: none; }
.tbl-reimbursements.col-collapsed th.col-ops-th { padding-right: 2px; min-width: 16px; }
.tbl-reimbursements.col-collapsed td.col-ops-td { display: none; }
.tbl-reimbursements.col-collapsed th.col-ops-th .col-ops-toggle { background: #2563eb; color: #fff; border-color: #2563eb; width: 14px; height: 14px; right: 1px; font-size: 10.5px; line-height: 1; }

/* ===== 报销管理页「事由」列：固定宽度 + 长文本自动换行（2026-09-18 老板截图要求）=====
   口径：按「目前实际渲染宽度」压缩 25% ⇒ 设为固定值。
   当前实际宽度实测 ≈ 461px（本机 chrome-headless 同款渲染对标：容器 1868px、截图缩放
   1.8585 下 td.c-reason 实宽 460.9px；该结论与「14px 折叠按钮」和「表头字宽步进 24px/字」
   两条独立比例尺互证）。⇒ 461 × 75% ≈ 346px，取 345px。
   - width + max-width 必须双写：只写 width 时，auto 布局会把剩余空间按 max-content 比例
     再分配，该列会被撑大（实测 2000px 容器下曾到 566px）；补 max-width 后恒为 345px。
   - 刻意不写 min-width：窄屏（<1600px）下允许自然压缩，避免整表横向溢出出现滚动条。
   - white-space: normal 显式申明允许换行（本页本来就未像员工页那样设 nowrap）；
     word-break: break-word 兜住超长无空格串，防撑破单元格。
   作用域：只在 .tbl-reimbursements 生效，其余列表页（员工/预支/结清/供方/用工单位/合同）零影响。
   回滚：删除本段即可。
* --------------------------------------------------------------------------------------- */
.tbl-reimbursements th.c-reason,
.tbl-reimbursements td.c-reason {
  width: 345px;
  max-width: 345px;
  white-space: normal;
  word-break: break-word;
}

/* ===== 员工预支页：完全按员工管理晨格 V6 三段布局（2026-09-08 老板截图反馈）=====
   顶部 + 4 个 ck-kpi 汇总 + 表头固定 / 数据行内滚 / 8px 自定义滚动条 / 紧凑行高
   仅在员工预支页（含 .tbl-advances）生效，不污染其他 .table-wrap 页面 */
#view:has(.tbl-advances) {
  display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0;
}
#view:has(.tbl-advances) > .view-head { flex-shrink: 0; }
/* 财务子页容器 #fin-sub：flex 拉满剩余空间，KPI 固定，高度全给表格 */
#view:has(.tbl-advances) > #fin-sub {
  flex: 1 1 auto; min-height: 0;
  display: flex; flex-direction: column;
}
#view:has(.tbl-advances) > #fin-sub > #ad-cards { flex-shrink: 0; }
/* 表格框：保留共用 Box Pattern（白底渐变 + 12px 圆角 + 描边 + 多层阴影），内嵌上下滚动 */
#view:has(.tbl-advances) > #fin-sub > #ad-table.table-wrap.tbl-advances {
  flex: 1 1 auto; min-height: 0;
  overflow-y: auto;
  overflow-x: auto;
}
/* 表头 sticky：显式设背景避免露出 .table-wrap 渐变底；末列 z-index 高于普通 th */
#view:has(.tbl-advances) > #fin-sub > #ad-table.table-wrap.tbl-advances thead th {
  position: sticky; top: 0; z-index: 2;
  background: #f1f5f9;
  box-shadow: inset 0 -1px 0 #e2e8f0;
  border-bottom: 0;
}
#view:has(.tbl-advances) > #fin-sub > #ad-table.table-wrap.tbl-advances thead th:last-child { z-index: 3; }
/* 员工预支行高压 20%（2026-09-08 老板反馈）：仅本页生效——通用 th padding 10px 14px → 8px，td 8px 14px → 6px（水平 14px 不动，列宽不变）
   ⚠️ 必须用 .tbl-advances.table-wrap 提升特异性到 (0,2,3) > 通用 .table-wrap table thead th (0,1,4)，否则会被通用规则覆盖 */
.tbl-advances.table-wrap table thead th { padding: 8px 14px; }
.tbl-advances.table-wrap table tbody td { padding: 6px 14px; }

/* 员工台账：标题行横排（标题 | 筛选 | 按钮） */
.view-head { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.view-head > h2 { margin: 0; flex-shrink: 0; }
.view-head #inline-filters { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; }
.view-head #inline-filters .fl { margin: 0; }
.view-head .head-btns { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
/* 员工管理页：按钮组 V6 工具栏（白底 + 浅灰边框 + 圆角 + 紧凑 padding） */
.view-head .head-btns.v6-toolbar { background: #fff; border: 1px solid #e2e8f0; border-radius: 8px; padding: 3px 5px; gap: 4px; box-shadow: 0 1px 2px rgba(15,23,42,0.04); }
.view-head .head-btns.v6-toolbar .btn-sm { height: 26px; min-height: 26px; max-height: 26px; padding: 0 9px; font-size: 12.5px; }
.btn-green { background: #16a34a !important; color: #fff !important; font-weight: 600; border: none !important; border-radius: 6px; }
.btn-blue { background: #2563eb !important; color: #fff !important; font-weight: 600; border: none !important; border-radius: 6px; }


/* 员工台账：筛选/按钮一行统一样式 */
.view-head #inline-filters { padding-left: 24px; }
.view-head #inline-filters .fl,
.view-head #inline-filters > span { display: inline-flex; align-items: center; gap: 4px; font-size: 12.5px; color: #334155; white-space: nowrap; }
.view-head #inline-filters select,
.view-head #inline-filters input[type="date"],
.view-head #inline-filters input[type="search"],
.view-head #inline-filters input.filter-search {
  height: 28px; padding: 2px 8px; font-size: 12px; font-family: inherit; border: 1px solid #cbd5e1; border-radius: 6px;
  background: #fff; color: #0f172a; min-width: 125px; max-width: 170px;
  box-sizing: border-box; outline: none;
  transition: border-color .15s, box-shadow .15s;
  -webkit-appearance: none; appearance: none;
}
.view-head #inline-filters input[type="search"]::-webkit-search-cancel-button,
.view-head #inline-filters input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; appearance: none; }
.view-head #inline-filters input[type="search"]::placeholder,
.view-head #inline-filters input.filter-search::placeholder { color: #94a3b8; }
.view-head #inline-filters input[type="search"]:hover,
.view-head #inline-filters input.filter-search:hover { border-color: #94a3b8; }
.view-head #inline-filters input[type="search"]:focus,
.view-head #inline-filters input.filter-search:focus { border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37, 99, 235, .12); }
.view-head #inline-filters input[type="date"]::-webkit-calendar-picker-indicator { font-size: 12px; opacity: 0.65; }
.view-head #inline-filters .spacer { flex: 1; }

/* 2026-08-28 下拉多选（checkbox）组件 */
.ms-wrap { display: inline-flex; align-items: center; gap: 4px; }
.ms-label { font-size: 12.5px; color: #334155; white-space: nowrap; }
.ms-box { position: relative; display: inline-block; }
.ms-trigger {
  display: inline-flex; align-items: center; gap: 6px;
  height: 28px; padding: 2px 8px; font-size: 12px; font-family: inherit;
  border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; color: #0f172a;
  min-width: 105px; max-width: 170px; cursor: pointer; user-select: none; white-space: nowrap;
}
.ms-trigger:hover { border-color: #94a3b8; }
.ms-value { flex: 1; overflow: hidden; text-overflow: ellipsis; }
.ms-value.placeholder { color: #94a3b8; }
.ms-caret { color: #64748b; font-size: 11px; flex-shrink: 0; }
.ms-drop {
  position: absolute; top: calc(100% + 4px); left: 0; z-index: 300;
  min-width: 240px; max-width: 320px; background: #fff;
  border: 1px solid #e2e8f0; border-radius: 8px; box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);
  display: none;
}
.ms-box.open .ms-drop { display: block; }
.ms-actions { display: flex; gap: 6px; padding: 6px 8px; border-bottom: 1px solid #f1f5f9; }
.ms-actions button {
  flex: 1; height: 24px; font-size: 12px; font-family: inherit;
  border: 1px solid #e2e8f0; background: #f8fafc; border-radius: 4px; cursor: pointer; color: #334155;
}
.ms-actions button:hover { background: #eef2ff; border-color: #c7d2fe; color: #1d4ed8; }
.ms-list { max-height: 220px; overflow-y: auto; padding: 4px 0; }
.ms-item { display: flex; align-items: center; gap: 8px; padding: 5px 12px; font-size: 12.5px; color: #0f172a; cursor: pointer; white-space: nowrap; }
.ms-item:hover { background: #f1f5f9; }
.ms-item input[type="checkbox"] { margin: 0; width: 14px; height: 14px; accent-color: #2563eb; cursor: pointer; }
.ms-item span { overflow: hidden; text-overflow: ellipsis; }


/* 统一按钮基础：所有按钮同等高 28px、统一圆角、统一字号 */
.btn-light { background: #f1f5f9 !important; color: #334155 !important; border: 1px solid #e2e8f0 !important; border-radius: 6px !important; }
.btn-green { background: #16a34a !important; color: #fff !important; font-weight: 600; border: none !important; border-radius: 6px !important; }
.btn-blue { background: #2563eb !important; color: #fff !important; font-weight: 600; border: none !important; border-radius: 6px !important; }
.btn-primary-sm { background: #1d4ed8 !important; color: #fff !important; font-weight: 600; border: none !important; border-radius: 6px !important; }
.view-head .head-btns button,
.view-head #inline-filters button { 
  height: 28px; min-height: 28px; max-height: 28px; 
  padding: 0 10px; font-size: 12px; font-weight: 500; 
  line-height: 1; vertical-align: middle; 
  box-sizing: border-box;
}
.view-head .head-btns .spacer { display: none; }
.view-head .head-btns .btn-green,
.view-head .head-btns .btn-blue,
.view-head .head-btns .btn-primary-sm { font-weight: 600; }


/* 用工单位：合作合同列 */
.cf-link { display: inline-flex; align-items: center; gap: 4px; color: #2563eb; font-size: 12px; text-decoration: none; padding: 2px 6px; border-radius: 5px; border: 1px solid #bfdbfe; background: #eff6ff; max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: 1.6; }
.cf-link:hover { background: #dbeafe; border-color: #93c5fd; }
.btn-cf-upload { background: #eff6ff !important; color: #2563eb !important; border: 1px dashed #93c5fd !important; border-radius: 6px !important; font-size: 12px !important; font-weight: 500; cursor: pointer; }
.btn-cf-upload:hover { background: #dbeafe !important; border-style: solid !important; }


/* 工伤处理 / 其他复用页面：标题行筛选框（与员工入离职管理同型） */
.view-head #wi-inline-filters { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; padding-left: 24px; }
.view-head #wi-inline-filters .fl { display: inline-flex; align-items: center; gap: 4px; font-size: 12.5px; color: #334155; white-space: nowrap; margin: 0; }
.view-head #wi-inline-filters select {
  height: 28px; padding: 2px 6px; font-size: 12px; font-family: inherit; border: 1px solid #cbd5e1; border-radius: 6px;
  background: #fff; color: #0f172a; min-width: 110px;
}


/* 员工预支页：复用 ck-kpi 紧凑样式（标签+数字+说明 3 行） */
.ad-stats { grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 12px; }
.ad-stats .card { padding: 7px 12px; display: flex; flex-direction: column; justify-content: flex-start; position: relative; overflow: hidden; }
.ad-stats .card::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: #94a3b8; }
.ad-stats .card:nth-child(1)::before { background: #7c3aed; } /* 未扣回笔数 - 紫 */
.ad-stats .card:nth-child(2)::before { background: #e11d48; } /* 未扣回总额 - 红 */
.ad-stats .card:nth-child(3)::before { background: #059669; } /* 已扣回总额 - 绿 */
.ad-stats .card:nth-child(4)::before { background: #d97706; } /* 今日预支 - 橙 */
.ad-stats .card .lb { font-size: 12.5px; font-weight: 700; color: #475569; margin-bottom: 1px; }
.ad-stats .card .row2 { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.ad-stats .card .vl { font-size: 22px; font-weight: 700; line-height: 1; flex: 0 0 auto; min-width: 48px; }
.ad-stats .card .sb { font-size: 12px; color: #94a3b8; margin-top: 1px; text-align: right; }

/* ══ 2026-10-08 ADVSBNOWRAP（老板口径）═══════════════════════════════════════
   预支垫付页 KPI 副标题改为「单行 + 超宽省略号」，与收支明细页完全同款。
   起因：「需从工资扣回合计」「441 笔上月未扣回」在窄卡里换行占两行；
        老板要求「跟收支明细页一样隐藏掉，而不是换行」。
   做法：本页 KPI 容器 #ad-cards 复用员工页的 .emp-stats 类，而员工页那条 .sb 是短词
        （在职 / 离职 / 今日 …）从不超宽 ⇒ 本段一律用 **#ad-cards 前缀**限定，
        既有员工页规则一字不改（员工管理页 / 其他复用页零影响）。
        优先级：带 id 前缀那条 (1,2,0) 高于员工页三条纯类的 (0,3,0)，恒生效、无需 !important。
   ⚠️ 不改 .vl 的既有宽度规则（员工页给的是 flex:0 0 auto; min-width:48px，本页金额够用）。
   ⚠️ 悬停兜底：卡片 title 里本就写着完整说明，截断不丢信息（与收支明细页同一约定）。
   ══════════════════════════════════════════════════════════════════════════ */
#ad-cards .ck-kpi { min-width: 0; }
#ad-cards .ck-kpi .row2 { min-width: 0; }
#ad-cards .ck-kpi .sb {
  flex: 1 1 auto; min-width: 0;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
@media (max-width: 1280px) { .ad-stats { grid-template-columns: repeat(2, 1fr); } }


/* ══════════════════════════════════════════════════════════════════════════
   ===== UI-STD 第 6 批 · 2026-10-02 =====
   收支明细 KPI 换成「员工管理同款 7 格卡」
   老板口径：「收支明细KPI页完全参考[员工管理]」；另拍板两处：
     ① 栅格 7 格（第 7 格留空位）；② 可点范围保持现有 3 张科目卡（不扩到收入/支出/总资产）。

   做法与第 4 批 .fc-stats（财务总览）完全同源：改用 .ck-kpi 基类 + 新建选择器 .ie-stats，
   **既有选择器一条不改** ⇒ 员工台账 / 预支页 / 保险页共用的 .ck-kpi 基类不受任何影响。
   ⚠️ 不复用 .emp-stats 类名：2045 行 `#view:has(.tbl-employees) #list-area > .emp-stats`
      是员工页专属选择器，复用会让两页互相牵连。
   ⚠️ 视觉规格逐条照抄员工页实际生效值（白底 / 1px #e2e8f0 / 12px 圆角 / 左侧 3px 彩条
      / 标签 12.5px·700 / 数字 22px·700·行高 1 / 说明右对齐），**一个新数值都没造**。
   ⚠️ 与员工页有**三处有意的**差异，逐条写在对应规则上方：
      ① 内距取本页原有的 3px 9px 5px 9px（员工页 3/12/5/12）与 .row2 gap 6px（员工页 10px）；
      ② .sb 用本页原有的 11px（员工页 12px）；
      ③ .sb 单行 + 超宽省略号（员工页是短词，本页说明更长）。
      三条同因：7 格下每卡内宽只有 221px（员工页 215px），而本页数字是带 ¥ 与千分位的长串
      （¥2,074,801.31 ≈ 142px），不收紧「总资产」的说明会被省略号吃掉（实测缺 6.8px）。
      完整说明同时写进卡片 title（悬停可见，信息不丢）—— 同第 4 批 .fc-stats 的做法。
   ══════════════════════════════════════════════════════════════════════════ */
.ie-stats {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: 10px; margin-bottom: 12px;      /* 与 .emp-stats / .fc-stats 对齐；本页最终值由文末 IECOMPACT 段覆盖为 8px（该段保持不动） */
}
.ie-stats .ck-kpi {
  padding: 3px 9px 5px 9px;
  border-radius: 12px;                 /* 员工页实际生效值（4997 行把 .ck-kpi 从 10px 覆盖为 12px） */
  display: flex; flex-direction: column; justify-content: flex-start;
  min-width: 0;
  transition: transform .12s, box-shadow .12s;
}
/* 可点态：本页只有 3 张科目卡可点（员工页整排可点 ⇒ 那三条写在 .emp-stats 上）。
   沿用本页既有约定：可点的卡加 .clickable 类。 */
.ie-stats .ck-kpi.clickable { cursor: pointer; }
.ie-stats .ck-kpi.clickable:hover { transform: translateY(-1px); box-shadow: 0 3px 8px rgba(15,23,42,.1); }
.ie-stats .ck-kpi.clickable.active { box-shadow: 0 0 0 2px #2563eb inset; }
.ie-stats .ck-kpi.clickable.active::before { width: 4px; }
.ie-stats .ck-kpi .lb { font-size: 12.5px; font-weight: 700; margin-bottom: 1px; }
.ie-stats .ck-kpi .row2 { display: flex; align-items: baseline; justify-content: space-between; gap: 6px; min-width: 0; }
.ie-stats .ck-kpi .vl { font-size: 22px; font-weight: 700; line-height: 1; letter-spacing: -.2px; }
.ie-stats .ck-kpi .row2 .vl { flex: 0 0 auto; min-width: 0; }
.ie-stats .ck-kpi .sb { flex: 1 1 auto; min-width: 0; font-size: 11px; margin-top: 1px; text-align: right;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* 空位（第 7 格）：淡虚线空框，只占位不填假数据 —— 同第 4 批 .fc-stats 的 .is-empty。
   ⇒ 想要完全留白：把下面两条删掉即可（一行改动，无需动 JS）。 */
.ie-stats .ck-kpi.is-empty { background: transparent; border-style: dashed; border-color: #e8eef5; box-shadow: none; cursor: default; }
.ie-stats .ck-kpi.is-empty::before { display: none; }
/* ══════ 2026-09-28 SUBJKPI：KPI 3→6 张 + 未标注提示 + 批量补标面板 ══════ */
/* 未标注科目提示条（红） */
.ie-unsubj-bar { display: flex; align-items: center; gap: 8px; margin: -2px 0 10px; padding: 6px 10px;
  border: 1px solid #fecaca; border-left: 3px solid #dc2626; border-radius: 6px; background: #fef2f2;
  font-size: 12.5px; color: #7f1d1d; }
.ie-unsubj-bar .dot { width: 7px; height: 7px; border-radius: 50%; background: #dc2626; flex: 0 0 auto; }
.ie-unsubj-bar .ie-hint { color: #b91c1c; opacity: .8; }
.ie-unsubj-bar button { margin-left: auto; }
/* 未标注科目的行：浅黄底（表格选择器多带一层 .tbl-fin_bank，压过斑马纹） */
.tbl-fin_bank .fin-bank-table tbody tr.subj-missing > td { background: #fffbeb; }
.tbl-fin_bank .fin-bank-table tbody tr.subj-missing > td:nth-child(7) { color: #b45309; font-weight: 600; }
/* 2026-09-28 IEMONTH ①：摘要列左对齐（老板口径：「摘要 左对齐」）。
   根因：全局 th, td 的 text-align: center（本文件上方通用表格规则）⇒ 摘要列内容居中；
        表头「摘要」与数据行的「摘要」单元格必须同时改，否则表头居中、内容居左会错位。
        🔁 2026-10-02 IEVERIFY：本页在「余额」「摘要」之间插入了「验证」列 ⇒
           摘要列由第 11 列右移到第 12 列，下方两条选择器已同步 11 → 12。
   作用域：.tbl-fin_bank 是收支明细页独有包装（05-income-expense.js 渲染时加），
        内嵌「代发明细」表 fin-detail-table 不在 .fin-bank-table 内 ⇒ 零影响。
   回滚：删除本段即可（本批为纯新增规则，不覆盖任何既有声明）。 */
.tbl-fin_bank .fin-bank-table thead th:nth-child(12),
.tbl-fin_bank .fin-bank-table tbody td:nth-child(12) { text-align: left; }
/* 2026-10-02 IEVERIFY：新增「验证」列（第 11 列）—— 余额勾稽 3 = 1 ± 2 的结论。
   列位：借方(8) 贷方(9) 余额(10) **验证(11)** 摘要(12) 收(付)方名称(13) 收(付)方账号(14) 操作(15)。
   呈现：结论 + 差额 —— 对得上 → 绿色 ✓；对不上 → 红色「差 ¥N」，完整算式放 title 悬停。
   等宽数字让上下行的数字对齐；nowrap 防差额被折成两行抬高行高（本页一屏恰好 25 行）。
   回滚：删除本段并把上方两条选择器的 12 改回 11 即可（纯新增规则，不覆盖任何既有声明）。 */
.tbl-fin_bank .fin-bank-table thead th.ie-vth,
.tbl-fin_bank .fin-bank-table tbody td.ie-vtd { text-align: center; white-space: nowrap; font-variant-numeric: tabular-nums; }
.tbl-fin_bank .fin-bank-table td.ie-vtd .ie-v-ok { color: #16a34a; font-weight: 700; }
.tbl-fin_bank .fin-bank-table td.ie-vtd .ie-v-bad { color: #dc2626; font-weight: 700; font-size: 11.5px; }
.tbl-fin_bank .fin-bank-table td.ie-vtd .ie-v-na { color: #94a3b8; }
/* 2026-10-02 IEDETCHK：验证列拆**两个槽位**（老板口径：「左边是明细核对，右边是现在逻辑的勾」）。
   左槽 Σ代发明细 == 本行金额（仅代发付款类）→ 绿 ✓；不等/未导入明细 → 红 ✗；不适用 → 灰 —。
   用 inline-flex + gap 让两槽在单元格内并排且整体居中；.ie-v-cell 是新增包裹层，
   下方三条既有 .ie-v-* 规则是**后代选择器**，包一层后依然命中 ⇒ 老规则零改动。
   颜色沿用右槽同款绿 #16a34a / 红 #dc2626，保证两个勾视觉一致。
   回滚：删除本段（含注释）即可，无任何既有声明被覆盖。 */
.tbl-fin_bank .fin-bank-table tbody td.ie-vtd .ie-v-cell { display: inline-flex; align-items: center; justify-content: center; gap: 7px; }
.tbl-fin_bank .fin-bank-table tbody td.ie-vtd .ie-v-det { color: #16a34a; font-weight: 700; }
.tbl-fin_bank .fin-bank-table tbody td.ie-vtd .ie-v-detbad { color: #dc2626; font-weight: 700; }
/* 批量补标面板 */
.subjb-wrap { max-height: 460px; overflow: auto; border: 1px solid #e2e8f0; border-radius: 6px; }
.subjb-tbl { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.subjb-tbl th, .subjb-tbl td { border-bottom: 1px solid #eef2f7; padding: 6px 8px; text-align: left; }
.subjb-tbl th { position: sticky; top: 0; background: #f8fafc; z-index: 1; font-weight: 600; color: #475569; }
.subjb-tbl td.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.subjb-tbl select { height: 28px; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 12px; padding: 0 6px;
  background: #fff; color: #0f172a; max-width: 160px; }
.subjb-tbl .sg { color: #b45309; }
.subjb-prog { font-size: 12.5px; color: #64748b; margin-right: auto; }
@media (max-width: 1280px) { .ie-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 800px)  { .ie-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); } }


/* 收支明细：标题行内嵌筛选（与员工入离职管理同型） */
.view-head #ie-inline-filters { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; padding-left: 24px; flex-wrap: wrap; }
.view-head #ie-inline-filters .fl { display: inline-flex; align-items: center; gap: 4px; font-size: 12.5px; color: #334155; white-space: nowrap; margin: 0; }
.view-head #ie-inline-filters select,
.view-head #ie-inline-filters input[type="date"],
.view-head #ie-inline-filters input[type="text"] {
  height: 28px; padding: 2px 6px; font-size: 12px; font-family: inherit; border: 1px solid #cbd5e1; border-radius: 6px;
  background: #fff; color: #0f172a; min-width: 110px;
}
.view-head #ie-inline-filters input[type="date"] { min-width: 130px; }
.view-head #ie-inline-filters input[type="text"] { min-width: 160px; }

/* ==========================================================================
   2026-09-24 FINTAB：收支明细页筛选栏收窄（本页专属 id #ie-inline-filters）
   背景：右上角工具栏新增「工资计算 / 政府报税 / 供方费用」三个页签按钮（同批移走「⚖️ 每日对账」）后，
         按钮组多占约 130px ⇒ 筛选栏被从 1147px 压到 1017px 而折成两行（真浏览器实测 28px → 64px），
         正好把「本页不再渲染页签行」省下的约 45px 吃掉 —— 实测 KPI 卡片 top 仅上移 6px（164 → 158），
         与老板「页面整体移上去」的诉求相反。
   做法：本页控件 min-width 适度下调 + 去掉左侧 24px 内缩 ⇒ 筛选栏回到一行（实测 28px），页面真正上移一行。
        日期框 118px 仍完整显示 yyyy/mm/dd；下拉 92px 仍完整显示「全部科目」；搜索 120px 仍显示占位文字。
   影响面：仅 #ie-inline-filters（收支明细页独有 id）—— 其它页面 / 其它 id 零影响。
   ========================================================================== */
.view-head #ie-inline-filters { padding-left: 0; row-gap: 6px; }
.view-head #ie-inline-filters select { min-width: 92px; }
.view-head #ie-inline-filters input[type="date"] { min-width: 118px; }
.view-head #ie-inline-filters input[type="text"] { min-width: 120px; }
/* 2026-09-28 IEMONTH ②：给月度选择按钮腾位置。
   结构/配色照搬财务总览的 .fc-month-*（本文件 :3793 起），只把尺寸收窄。
   依据（真渲染实测）：改前本页页头一行总需 1701.8px；新增控件 118px(+gap8) ⇒ 1828px，
     多出的 126px 会把筛选栏挤折行（本页筛选栏折行史见上方 FINTAB 注释）。
     故逐项腾出等量：搜索 147.5→104（-43.5）· date 125→118 ×2（-14）· 科目 select 118→104（-14）
     · 筛选栏 gap 8→6（-8）· 按钮组 gap 6→4（-12）· 按钮 padding 10→8（-16）= -107.5，
     加上控件本身收窄 118→102（-16），合计 ≈ -123.5 ⇒ 改后总需 ≈1702px = 改前水平。
   影响面：前 5 条限定 #ie-inline-filters（本页独有 id）/ .view-head:has(#ie-inline-filters)
     ⇒ 其它页面（含财务总览的月份控件）零影响。 */
.view-head #ie-inline-filters { gap: 6px; }
.view-head #ie-inline-filters input[type="text"] { width: 104px; min-width: 0; }
.view-head #ie-inline-filters input[type="date"] { width: 118px; min-width: 0; }
.view-head #ie-inline-filters select { max-width: 104px; }
.view-head:has(#ie-inline-filters) .head-btns { gap: 4px; }
.view-head:has(#ie-inline-filters) .head-btns button { padding: 0 8px; }
.view-head #ie-inline-filters .fc-month-switch { gap: 4px; }
.view-head #ie-inline-filters .fc-month-btn { min-width: 22px; padding: 0 3px; font-size: 12px; height: 28px; }
.view-head #ie-inline-filters .fc-month-label { min-width: 50px; font-size: 12px; }
.view-head #ie-inline-filters .fc-month-back { font-size: 11.5px; padding: 0 6px; }



/* 黑名单状态：徽章 + 行高亮（移动端与 PC 通用） */
.badge.黑名单, .tag.黑名单 { background: #000 !important; color: #fff !important; border: 2px solid #f43f5e !important; font-weight: 700; padding: 2px 8px; }
.tbl-employees tr.row-blacklist { background: linear-gradient(90deg, #fff1f2 0%, #ffe4e6 100%) !important; box-shadow: inset 4px 0 0 #f43f5e; }
.tbl-employees tr.row-blacklist td:first-child { box-shadow: inset 4px 0 0 #f43f5e !important; }
.tbl-employees tr.row-blacklist:hover { background: linear-gradient(90deg, #ffe4e6 0%, #fecdd3 100%) !important; }

/* ==================== 经营大纲 ==================== */
.bo-stats { grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 12px; }
.bo-stats .card { padding: 7px 12px; display: flex; flex-direction: column; justify-content: flex-start; position: relative; overflow: hidden; }
.bo-stats .card::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: #94a3b8; }
.bo-stats .card:nth-child(1)::before { background: #7c3aed; }
.bo-stats .card:nth-child(2)::before { background: #059669; }
.bo-stats .card:nth-child(3)::before { background: #0284c7; }
.bo-stats .card:nth-child(4)::before { background: #d97706; }
.bo-stats .card .lb { font-size: 12.5px; font-weight: 700; color: #475569; margin-bottom: 1px; }
.bo-stats .card .row2 { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.bo-stats .card .vl { font-size: 22px; font-weight: 700; line-height: 1; flex: 0 0 auto; min-width: 48px; }
.bo-stats .card .sb { font-size: 12px; color: #94a3b8; margin-top: 1px; text-align: right; }
@media (max-width: 1280px) { .bo-stats { grid-template-columns: repeat(2, 1fr); } }

/* 差距提示条 */
.bo-gap-warn { background: #fff7ed; color: #9a3412; border: 1px solid #fed7aa; border-radius: 8px; padding: 9px 14px; margin: 0 0 12px; font-size: 12.5px; line-height: 1.6; }
.bo-gap-ok { background: #ecfdf5; color: #065f46; border: 1px solid #a7f3d0; border-radius: 8px; padding: 9px 14px; margin: 0 0 6px; font-size: 12.5px; line-height: 1.6; }
.bo-gap-remain { background: #eff6ff; color: #1e40af; border: 1px solid #bfdbfe; border-radius: 8px; padding: 9px 14px; margin: 0 0 12px; font-size: 12.5px; line-height: 1.6; }
.bo-gap-warn b, .bo-gap-ok b, .bo-gap-remain b { font-size: 12.5px; }

/* 月度计划/实际对比表 */
.table-wrap.tbl-bo table thead th { text-align: center; font-size: 12px; padding: 10px 6px; }
.table-wrap.tbl-bo table tbody td { text-align: center; padding: 7px 6px; font-size: 12.5px; }
.tbl-bo .bo-mn { font-weight: 600; color: #334155; white-space: nowrap; }
.tbl-bo .bo-edit { min-width: 92px; }
.tbl-bo .bo-edit input { width: 82px; height: 26px; padding: 2px 6px; font-size: 12px; text-align: right; border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; color: #0f172a; }
.tbl-bo .bo-edit input:focus { border-color: #2563eb; outline: 2px solid #bfdbfe; outline-offset: -1px; }
.tbl-bo .bo-unit-btn { width: 22px; height: 22px; margin-left: 3px; border: 1px solid #cbd5e1; background: #f8fafc; color: #64748b; border-radius: 5px; cursor: pointer; font-size: 12px; line-height: 1; vertical-align: middle; }
.tbl-bo .bo-unit-btn:hover { background: #eef2ff; color: #2563eb; border-color: #93c5fd; }
.tbl-bo .bo-profit { font-weight: 600; }
.tbl-bo tr.bo-total { background: #f8fafc; }
.tbl-bo tr.bo-total td { font-weight: 700; color: #0f172a; border-top: 2px solid #e2e8f0; }
.tbl-bo .t-green { color: #059669; }
.tbl-bo .t-red { color: #e11d48; }
.tbl-bo .t-amber { color: #d97706; }
.bo-hint { margin-top: 8px; font-size: 12px; color: #94a3b8; line-height: 1.6; }

/* 单位分解弹窗 */
.bo-unit-row { display: flex; align-items: center; gap: 8px; padding: 7px 4px; border-bottom: 1px solid #f1f5f9; font-size: 12.5px; color: #334155; }
.bo-unit-name { flex: 1; font-weight: 500; }
.bo-unit-inp { width: 80px; height: 28px; padding: 2px 8px; font-size: 12.5px; text-align: right; border: 1px solid #cbd5e1; border-radius: 6px; }

/* 经营大纲：人员计划二维表（单位×月份分页） */
.bo-section { margin: 14px 0 16px; }
.bo-section-title { font-size: 12.5px; font-weight: 700; color: #1e293b; margin-bottom: 8px; }
.bo-section-sub { font-size: 12px; font-weight: 400; color: #94a3b8; margin-left: 8px; }
.bo-unit-table-wrap { overflow-x: auto; max-width: 100%; border: 1px solid #e2e8f0; border-radius: 10px; }
.bo-unit-table { width: 100%; border-collapse: collapse; min-width: 900px; }
.bo-unit-table th, .bo-unit-table td { border: 1px solid #eef2f7; padding: 5px 4px; text-align: center; font-size: 12px; }
.bo-unit-table thead th { background: #f1f5f9; color: #334155; font-weight: 600; position: sticky; top: 0; z-index: 1; }
.bo-unit-th { min-width: 100px; font-weight: 700; }
.bo-year-th { font-size: 12.5px; font-weight: 700; color: #0f172a; }
.bo-month-th { min-width: 54px; }
.bo-sum-th { min-width: 76px; color: #7c3aed; }
.bo-unit-name-cell { text-align: left !important; padding-left: 12px !important; font-weight: 600; color: #0f172a; min-width: 100px; white-space: nowrap; }
.bo-cell input { width: 52px; height: 26px; padding: 2px 4px; font-size: 12px; text-align: center; border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; color: #0f172a; }
.bo-cell input:focus { border-color: #2563eb; outline: 2px solid #bfdbfe; outline-offset: -1px; background: #f0f7ff; }
.bo-sum-cell { font-weight: 700; color: #7c3aed; background: #faf5ff; }
.bo-tfoot td { background: #f8fafc; font-weight: 700; color: #0f172a; border-top: 2px solid #e2e8f0; }
.bo-grand-total { color: #7c3aed; font-size: 12.5px; }

/* 经营大纲：大弹窗（用于月度分解、人员分解等大表格） */
.modal.modal-xl .modal { width: 92vw; max-width: 1400px; max-height: 90vh; }
.modal.modal-xl .modal-body { max-height: calc(90vh - 110px); overflow: auto; padding: 16px 20px; }
.modal.modal-xl .modal-head { padding: 12px 20px; }
.bo-modal-tip { background: #eff6ff; color: #1e40af; border: 1px solid #bfdbfe; border-radius: 8px; padding: 8px 12px; margin-bottom: 12px; font-size: 12px; line-height: 1.6; }

/* 经营大纲：月度分解大弹窗（更宽 + 高度自适应） */
.modal.modal-xl .modal { width: 98vw; max-width: none; max-height: 95vh; }
.modal.modal-xl .modal-body { max-height: calc(95vh - 120px); padding: 14px 18px; overflow-x: hidden; }

/* 弹窗工具栏 */
.bo-modal-toolbar { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 10px; padding: 8px 12px; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; font-size: 12.5px; }
.bo-toolbar-left { color: #475569; }
.bo-toolbar-left b { color: #0f172a; font-size: 12.5px; }
.bo-toolbar-right { display: flex; align-items: center; gap: 8px; }
.bo-avg-label { color: #475569; font-weight: 500; white-space: nowrap; }
#bo-upm-avg { width: 110px; height: 28px; padding: 2px 8px; font-size: 12.5px; border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; color: #0f172a; text-align: right; }
#bo-upm-avg:focus { border-color: #2563eb; outline: 2px solid #bfdbfe; outline-offset: -1px; }
#bo-upm-add { height: 28px; padding: 2px 8px; font-size: 12.5px; border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; color: #2563eb; font-weight: 500; cursor: pointer; }

/* 表格列宽调整（去掉横向滚动） */
.bo-unit-table { width: 100%; min-width: 0; }
.bo-unit-th { min-width: 90px; }
.bo-month-th { min-width: 46px; }
.bo-sum-th { min-width: 100px; }
.bo-cell input { width: 48px; }

/* 单位名 + 删除按钮 */
.bo-unit-name-cell { display: flex; align-items: center; gap: 4px; padding-left: 8px !important; }
.bo-unit-remove { width: 18px; height: 18px; padding: 0; border: none; background: #fee2e2; color: #b91c1c; border-radius: 4px; cursor: pointer; font-size: 12px; line-height: 16px; font-weight: 700; }
.bo-unit-remove:hover { background: #fca5a5; color: #fff; }

/* 年度合计/总合计/单位合计两行（人数 + 开票数） */
.bo-sum-cell { padding: 4px 6px !important; vertical-align: middle; }
.bo-sum-line { font-size: 11px; line-height: 1.4; }
.bo-sum-hc { color: #7c3aed; font-weight: 700; font-size: 12px; }
.bo-sum-inv { color: #059669; font-weight: 600; font-size: 11px; }
.bo-grand-total .bo-sum-hc { color: #7c3aed; font-size: 12.5px; }
.bo-grand-total .bo-sum-inv { color: #059669; font-size: 12px; }

/* 空状态 */
.bo-empty-cell { color: #94a3b8; font-style: italic; padding: 30px !important; text-align: center; }

/* 二维表横向滚动（仅在弹窗确实不够宽时） */
.bo-unit-table-wrap { overflow-x: auto; }

/* 经营大纲：月度分解 V2 - 每家单位独立均工资 */
.modal.modal-xl { padding: 8px !important; }
.modal.modal-xl .modal { width: 100vw !important; max-width: none !important; max-height: 96vh !important; border-radius: 8px !important; }
.modal.modal-xl .modal-body { max-height: calc(96vh - 120px) !important; padding: 14px 20px !important; overflow-x: hidden !important; }
.modal.modal-xl .modal-head { padding: 12px 20px !important; }

/* 单位名 cell：两行布局（单位名 + 均工资） */
.bo-unit-name-cell { display: table-cell !important; padding: 6px 10px !important; text-align: left !important; min-width: 140px; }
.bo-unit-row1 { display: flex; align-items: center; gap: 5px; margin-bottom: 4px; }
.bo-unit-name-text { font-weight: 600; color: #0f172a; font-size: 12.5px; }
.bo-unit-row2 { display: flex; align-items: center; gap: 4px; padding-left: 22px; }
.bo-avg-label { font-size: 11px; color: #94a3b8; }
.bo-unit-avg { width: 80px; height: 22px; padding: 1px 6px; font-size: 12px; text-align: right; border: 1px solid #cbd5e1; border-radius: 5px; background: #fff; color: #0f172a; }
.bo-unit-avg:focus { border-color: #2563eb; outline: 2px solid #bfdbfe; outline-offset: -1px; }

/* 单位名 cell 内的删除按钮调整 */
.bo-unit-name-cell .bo-unit-remove { width: 16px; height: 16px; font-size: 10px; line-height: 14px; padding: 0; flex-shrink: 0; }

/* 表格列宽微调 */
.bo-unit-th { min-width: 140px; }
.bo-cell input { width: 50px; height: 28px; }
.bo-month-th { min-width: 48px; }
.bo-sum-th { min-width: 110px; }

/* 隐藏空的工具栏左侧标签，只留新增按钮（无全局均工资） */
.bo-toolbar-right { gap: 10px; }

/* 经营大纲：月度分解弹窗完全铺满（V3） */
.modal.modal-xl { padding: 0 !important; margin: 0 !important; }
.modal.modal-xl .modal { width: 100vw !important; max-width: 100vw !important; min-width: 100vw !important; margin: 0 !important; border-radius: 0 !important; max-height: 100vh !important; }
.modal.modal-xl .modal-body { max-height: calc(100vh - 130px) !important; }

/* ===== 修正：外层是 .modal-overlay + .modal-xl，内层才是 .modal（之前选择器写错） ===== */
.modal-overlay.modal-xl { padding: 0 !important; margin: 0 !important; }
.modal-overlay.modal-xl .modal {
  width: 100vw !important;
  min-width: 100vw !important;
  max-width: 100vw !important;
  margin: 0 !important;
  border-radius: 0 !important;
  max-height: 100vh !important;
  height: auto !important;
  box-shadow: none !important;
}
.modal-overlay.modal-xl .modal-head { padding: 16px 28px !important; }
.modal-overlay.modal-xl .modal-body {
  max-height: calc(100vh - 130px) !important;
  padding: 16px 28px !important;
  overflow-x: hidden !important;
  overflow-y: auto !important;
}

/* ===== 经营大纲：月度分解 V4（弹窗缩窄 + 单位名/均工资同行 + 合计并排） ===== */
/* 1) 弹窗宽度约 2/3 屏幕，居中显示 */
.modal-overlay.modal-xl { padding: 16px !important; }
.modal-overlay.modal-xl .modal {
  width: 88vw !important;
  max-width: 1500px !important;
  min-width: 1000px !important;
  margin: 0 auto !important;
  border-radius: 10px !important;
  max-height: 92vh !important;
  box-shadow: 0 20px 50px rgba(0,0,0,.3) !important;
}
.modal-overlay.modal-xl .modal-head { padding: 14px 20px !important; }
.modal-overlay.modal-xl .modal-body {
  max-height: calc(92vh - 110px) !important;
  padding: 14px 20px !important;
}

/* 2) 单位名 + 均工资 同行横排（不再换行） */
.bo-unit-name-cell { white-space: nowrap !important; padding: 6px 10px !important; min-width: 220px; }
.bo-unit-name-cell .bo-unit-row1,
.bo-unit-name-cell .bo-unit-row2 {
  display: inline-flex !important;
  align-items: center !important;
  gap: 4px !important;
  margin: 0 6px 0 0 !important;
  padding: 0 !important;
}
.bo-unit-row2 { padding-left: 0 !important; }

/* 3) 总人数 / 总开票数 左右并排 */
.bo-sum-cell { padding: 6px 8px !important; white-space: nowrap; }
.bo-sum-cell .bo-sum-line { display: inline-block !important; margin: 0 5px !important; }

/* ===== 经营大纲表格 V5：深蓝表头 + 浅蓝紫单元格 + 无圆角 ===== */
.table-wrap.tbl-bo table { border-collapse: collapse; border-spacing: 0; }
.table-wrap.tbl-bo table thead th { background: #1e3a8a !important; color: #fff !important; font-weight: 700 !important; font-size: 12.5px !important; padding: 12px 8px !important; border: 1px solid #1e3a8a !important; text-align: center !important; border-radius: 0 !important; }
.table-wrap.tbl-bo table tbody td { background: #e0e7ff !important; padding: 10px 6px !important; font-size: 12.5px !important; border: 1px solid #c7d2fe !important; text-align: center !important; color: #1e293b !important; border-radius: 0 !important; }
.tbl-bo .bo-edit input { width: 82px !important; height: 30px !important; padding: 2px 6px !important; font-size: 12px !important; text-align: right !important; border: 1px solid #c7d2fe !important; border-radius: 0 !important; background: #fff !important; color: #0f172a !important; }
.tbl-bo .bo-edit input:focus { border-color: #2563eb !important; outline: 2px solid #bfdbfe !important; outline-offset: -1px; }
.tbl-bo .bo-mn { font-weight: 700 !important; color: #1e3a8a !important; }
.tbl-bo .bo-profit { font-weight: 700 !important; color: #0f172a !important; }
.tbl-bo .num.t-green { background: #d1fae5 !important; color: #059669 !important; font-weight: 700 !important; }
.tbl-bo .num.t-red { background: #fee2e2 !important; color: #e11d48 !important; font-weight: 700 !important; }
.tbl-bo tr.bo-total td { background: #f1f5f9 !important; font-weight: 700 !important; color: #0f172a !important; border-top: 2px solid #94a3b8 !important; }
.bo-unit-table { border-collapse: collapse; border-spacing: 0; border-radius: 0 !important; }
.bo-unit-table thead th { background: #1e3a8a !important; color: #fff !important; font-weight: 700 !important; font-size: 12px !important; padding: 8px 6px !important; border: 1px solid #1e3a8a !important; text-align: center !important; border-radius: 0 !important; }
.bo-unit-table tbody td { background: #e0e7ff !important; padding: 5px 4px !important; font-size: 12px !important; border: 1px solid #c7d2fe !important; text-align: center !important; color: #1e293b !important; border-radius: 0 !important; }
.bo-unit-table .bo-cell input { width: 52px !important; height: 28px !important; padding: 2px 4px !important; font-size: 12px !important; text-align: center !important; border: 1px solid #c7d2fe !important; border-radius: 0 !important; background: #fff !important; color: #0f172a !important; }
.bo-unit-table .bo-cell input:focus { border-color: #2563eb !important; outline: 2px solid #bfdbfe !important; outline-offset: -1px; background: #f0f7ff; }
.bo-unit-table .bo-unit-name-cell { background: #e0e7ff !important; text-align: left !important; padding: 6px 10px !important; min-width: 200px; white-space: nowrap !important; }
.bo-unit-table .bo-unit-name-text { font-weight: 700 !important; color: #1e3a8a !important; font-size: 12.5px; }
.bo-unit-table .bo-unit-avg { width: 80px !important; height: 22px !important; padding: 1px 6px !important; font-size: 12px !important; text-align: right !important; border: 1px solid #c7d2fe !important; border-radius: 0 !important; background: #fff !important; color: #0f172a !important; }
.bo-unit-table .bo-sum-hc { color: #1e3a8a !important; font-weight: 700 !important; font-size: 12px; }
.bo-unit-table .bo-sum-inv { color: #059669 !important; font-weight: 600 !important; font-size: 11px; }
.bo-unit-table tr.bo-tfoot td { background: #f1f5f9 !important; font-weight: 700 !important; color: #0f172a !important; border-top: 2px solid #94a3b8 !important; }
.bo-unit-table .bo-grand-total .bo-sum-hc { color: #1e3a8a !important; font-size: 12.5px !important; }

/* ===== 经营大纲表格 V5：深蓝表头 + 浅蓝紫单元格 + 无圆角 ===== */
.table-wrap.tbl-bo table { border-collapse: collapse; border-spacing: 0; }
.table-wrap.tbl-bo table thead th { background: #1e3a8a !important; color: #fff !important; font-weight: 700 !important; font-size: 12.5px !important; padding: 12px 8px !important; border: 1px solid #1e3a8a !important; text-align: center !important; border-radius: 0 !important; }
.table-wrap.tbl-bo table tbody td { background: #e0e7ff !important; padding: 10px 6px !important; font-size: 12.5px !important; border: 1px solid #c7d2fe !important; text-align: center !important; color: #1e293b !important; border-radius: 0 !important; }
.tbl-bo .bo-edit input { width: 82px !important; height: 30px !important; padding: 2px 6px !important; font-size: 12px !important; text-align: right !important; border: 1px solid #c7d2fe !important; border-radius: 0 !important; background: #fff !important; color: #0f172a !important; }
.tbl-bo .bo-edit input:focus { border-color: #2563eb !important; outline: 2px solid #bfdbfe !important; outline-offset: -1px; }
.tbl-bo .bo-mn { font-weight: 700 !important; color: #1e3a8a !important; }
.tbl-bo .bo-profit { font-weight: 700 !important; color: #0f172a !important; }
.tbl-bo .num.t-green { background: #d1fae5 !important; color: #059669 !important; font-weight: 700 !important; }
.tbl-bo .num.t-red { background: #fee2e2 !important; color: #e11d48 !important; font-weight: 700 !important; }
.tbl-bo tr.bo-total td { background: #f1f5f9 !important; font-weight: 700 !important; color: #0f172a !important; border-top: 2px solid #94a3b8 !important; }
.bo-unit-table { border-collapse: collapse; border-spacing: 0; border-radius: 0 !important; }
.bo-unit-table thead th { background: #1e3a8a !important; color: #fff !important; font-weight: 700 !important; font-size: 12px !important; padding: 8px 6px !important; border: 1px solid #1e3a8a !important; text-align: center !important; border-radius: 0 !important; }
.bo-unit-table tbody td { background: #e0e7ff !important; padding: 5px 4px !important; font-size: 12px !important; border: 1px solid #c7d2fe !important; text-align: center !important; color: #1e293b !important; border-radius: 0 !important; }
.bo-unit-table .bo-cell input { width: 52px !important; height: 28px !important; padding: 2px 4px !important; font-size: 12px !important; text-align: center !important; border: 1px solid #c7d2fe !important; border-radius: 0 !important; background: #fff !important; color: #0f172a !important; }
.bo-unit-table .bo-cell input:focus { border-color: #2563eb !important; outline: 2px solid #bfdbfe !important; outline-offset: -1px; background: #f0f7ff; }
.bo-unit-table .bo-unit-name-cell { background: #e0e7ff !important; text-align: left !important; padding: 6px 10px !important; min-width: 200px; white-space: nowrap !important; }
.bo-unit-table .bo-unit-name-text { font-weight: 700 !important; color: #1e3a8a !important; font-size: 12.5px; }
.bo-unit-table .bo-unit-avg { width: 80px !important; height: 22px !important; padding: 1px 6px !important; font-size: 12px !important; text-align: right !important; border: 1px solid #c7d2fe !important; border-radius: 0 !important; background: #fff !important; color: #0f172a !important; }
.bo-unit-table .bo-sum-hc { color: #1e3a8a !important; font-weight: 700 !important; font-size: 12px; }
.bo-unit-table .bo-sum-inv { color: #059669 !important; font-weight: 600 !important; font-size: 11px; }
.bo-unit-table tr.bo-tfoot td { background: #f1f5f9 !important; font-weight: 700 !important; color: #0f172a !important; border-top: 2px solid #94a3b8 !important; }
.bo-unit-table .bo-grand-total .bo-sum-hc { color: #1e3a8a !important; font-size: 12.5px !important; }

/* ===== 经营大纲表格 V6：参考员工管理页（白底 + 浅灰表头 + 简洁） ===== */
.table-wrap.tbl-bo table thead th {
  background: #f1f5f9 !important;
  color: #334155 !important;
  font-weight: 600 !important;
  font-size: 12.5px !important;
  padding: 13px 8px !important;
  border: 1px solid #e2e8f0 !important;
  text-align: center !important;
  border-radius: 0 !important;
}
.table-wrap.tbl-bo table tbody td {
  background: #fff !important;
  padding: 12px 6px !important;
  font-size: 12.5px !important;
  border: 1px solid #f1f5f9 !important;
  text-align: center !important;
  color: #1e293b !important;
  border-radius: 0 !important;
}
.tbl-bo .bo-edit input {
  background: #fff !important;
  border: 1px solid #cbd5e1 !important;
  border-radius: 0 !important;
  color: #0f172a !important;
  height: 30px !important;
  font-size: 12px !important;
  text-align: right !important;
  padding: 2px 6px !important;
  width: 82px !important;
}
.tbl-bo .bo-edit input:focus { border-color: #2563eb !important; outline: 2px solid #bfdbfe !important; outline-offset: -1px; }
.tbl-bo .bo-mn { font-weight: 600 !important; color: #334155 !important; }
.tbl-bo .bo-profit { font-weight: 700 !important; color: #0f172a !important; }
.tbl-bo .num.t-green { background: #f0fdf4 !important; color: #059669 !important; font-weight: 700 !important; }
.tbl-bo .num.t-red { background: #fef2f2 !important; color: #e11d48 !important; font-weight: 700 !important; }
.tbl-bo tr.bo-total td {
  background: #f8fafc !important;
  font-weight: 700 !important;
  color: #0f172a !important;
  border-top: 2px solid #cbd5e1 !important;
}
.tbl-bo tr:hover td { background: #f8fafc !important; }

/* 弹窗里月度分解表（bo-unit-table）：同风格 */
.bo-unit-table thead th {
  background: #f1f5f9 !important;
  color: #334155 !important;
  font-weight: 600 !important;
  font-size: 12px !important;
  padding: 8px 6px !important;
  border: 1px solid #e2e8f0 !important;
  text-align: center !important;
  border-radius: 0 !important;
}
.bo-unit-table tbody td {
  background: #fff !important;
  padding: 6px 4px !important;
  font-size: 12px !important;
  border: 1px solid #f1f5f9 !important;
  text-align: center !important;
  color: #1e293b !important;
  border-radius: 0 !important;
}
.bo-unit-table .bo-cell input {
  background: #fff !important;
  border: 1px solid #cbd5e1 !important;
  border-radius: 0 !important;
  color: #0f172a !important;
  width: 52px !important;
  height: 28px !important;
  padding: 2px 4px !important;
  font-size: 12px !important;
  text-align: center !important;
}
.bo-unit-table .bo-cell input:focus { border-color: #2563eb !important; outline: 2px solid #bfdbfe !important; outline-offset: -1px; background: #f0f7ff; }
.bo-unit-table .bo-unit-name-cell { background: #fff !important; text-align: left !important; padding: 6px 10px !important; min-width: 200px; white-space: nowrap !important; }
.bo-unit-table .bo-unit-name-text { font-weight: 700 !important; color: #0f172a !important; font-size: 12.5px; }
.bo-unit-table .bo-unit-avg {
  background: #fff !important;
  border: 1px solid #cbd5e1 !important;
  border-radius: 0 !important;
  color: #0f172a !important;
  width: 80px !important;
  height: 22px !important;
  padding: 1px 6px !important;
  font-size: 12px !important;
  text-align: right !important;
}
.bo-unit-table .bo-sum-hc { color: #334155 !important; font-weight: 700 !important; font-size: 12px; }
.bo-unit-table .bo-sum-inv { color: #059669 !important; font-weight: 600 !important; font-size: 11px; }
.bo-unit-table tr.bo-tfoot td {
  background: #f8fafc !important;
  font-weight: 700 !important;
  color: #0f172a !important;
  border-top: 2px solid #cbd5e1 !important;
}
.bo-unit-table .bo-grand-total .bo-sum-hc { color: #334155 !important; font-size: 12.5px !important; }

/* ===== 经营大纲：去掉数字输入框的上下箭头（覆盖所有 .bo-unit-table / CP / EX 表） ===== */
.tbl-bo .bo-edit input::-webkit-outer-spin-button,
.tbl-bo .bo-edit input::-webkit-inner-spin-button,
.bo-unit-table input[type="number"]::-webkit-outer-spin-button,
.bo-unit-table input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none !important;
  -moz-appearance: textfield !important;
  appearance: none !important;
  margin: 0 !important;
}
.tbl-bo .bo-edit input,
.bo-unit-table .bo-cell input,
.bo-unit-table .bo-unit-avg {
  -moz-appearance: textfield !important;
  appearance: textfield !important;
}

/* ===== 经营大纲 V7：去掉"均工资"标签，输入框紧跟单位名（inline 横排） ===== */
.bo-unit-table .bo-unit-name-cell { white-space: nowrap !important; padding: 6px 10px !important; min-width: 240px; vertical-align: middle; }
.bo-unit-table .bo-unit-name-text { font-weight: 700 !important; color: #0f172a !important; font-size: 12.5px; margin-right: 6px; }
.bo-unit-table .bo-unit-name-cell .bo-unit-avg { width: 78px !important; height: 24px !important; padding: 1px 6px !important; font-size: 12px !important; text-align: right !important; border: 1px solid #cbd5e1 !important; border-radius: 0 !important; background: #fff !important; color: #0f172a !important; vertical-align: middle; }
.bo-unit-table .bo-unit-name-cell .bo-unit-avg:focus { border-color: #2563eb !important; outline: 2px solid #bfdbfe !important; outline-offset: -1px; background: #f0f7ff; }
/* 取消之前的 row2 强制两行布局 */
.bo-unit-name-cell .bo-unit-row1 { display: inline-flex !important; align-items: center !important; gap: 4px !important; margin: 0 !important; padding: 0 !important; }
.bo-unit-name-cell .bo-unit-row2 { display: contents !important; }  /* 让 row2 子元素直接参与横向布局 */
.bo-unit-name-cell .bo-avg-label { display: none !important; }

/* ===== 经营大纲弹窗 V8：块标题 + 公司人员/费用开销表格 ===== */
.bo-section-title {
  font-size: 12.5px;
  font-weight: 700;
  color: #1e3a8a;
  margin: 16px 0 8px;
  padding-left: 10px;
  border-left: 4px solid #2563eb;
  background: #f8fafc;
  padding: 8px 10px;
  border-radius: 4px;
}
/* cp/ex 表格的列宽（更紧凑） */
.bo-unit-table.bo-cp-table .bo-cell input { width: 60px !important; }
.bo-unit-table.bo-cp-table .bo-month-th { min-width: 48px !important; }
.bo-unit-table.bo-cp-table .bo-unit-th { min-width: 110px !important; }
.bo-unit-table.bo-cp-table .bo-sum-th { min-width: 80px !important; }

/* ===== 经营大纲弹窗 V9：CP/EX 表配置列加副标题 ===== */
.bo-cp-row-label { font-size: 12.5px; font-weight: 700; color: #0f172a; line-height: 1.4; }
.bo-cp-row-sub { font-size: 10px; color: #94a3b8; margin-top: 2px; line-height: 1.2; }

/* ===== 经营大纲弹窗 V10：CP 表配置列宽对齐用人单位分解表 ===== */
.bo-cp-table .bo-unit-th { min-width: 220px !important; }
.bo-cp-table .bo-cell input { width: 50px !important; }

/* ===== 经营大纲 V11（最高优先级）：CP/EX 表 input 强制统一样式 ===== */
/* 1) spinner 隐藏（覆盖所有可能的选择器） */
.bo-cp-table input[type="number"]::-webkit-outer-spin-button,
.bo-cp-table input[type="number"]::-webkit-inner-spin-button,
.bo-unit-table input[type="number"]::-webkit-outer-spin-button,
.bo-unit-table input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none !important;
  -moz-appearance: textfield !important;
  appearance: none !important;
  margin: 0 !important;
  display: none !important;
}
/* 2) CP 表配置列内嵌 input（驻厂/招聘 平均工资） */
.bo-cp-table .bo-unit-name-cell input[type="number"],
.bo-cp-table td.bo-unit-name-cell input {
  width: 78px !important; min-width: 78px !important; max-width: 78px !important;
  height: 22px !important; min-height: 22px !important; max-height: 22px !important;
  padding: 1px 6px !important; font-size: 12px !important;
  text-align: right !important;
  border: 1px solid #cbd5e1 !important; border-radius: 0 !important;
  background: #fff !important; color: #0f172a !important;
  box-sizing: border-box !important;
}

/* ===== 经营大纲 view-head：年度筛选用员工筛选条风格 ===== */
#bo-inline { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
#bo-inline .fl {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 12px;
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  font-size: 12.5px; color: #475569; font-weight: 600; white-space: nowrap;
}
#bo-inline .fl select {
  height: 28px; padding: 2px 10px; font-size: 12.5px;
  border: 1px solid #cbd5e1; border-radius: 6px;
  background: #fff; color: #0f172a; min-width: 110px;
  font-weight: 400;
}
#bo-inline .fl select:hover { border-color: #94a3b8; }
#bo-inline .fl select:focus { border-color: #2563eb; outline: 2px solid #bfdbfe; outline-offset: -1px; }


/* dev log files block (2026-08-26) */
.devlog-files-wrap { margin-top: 6px; }
.devlog-files-toggle { cursor: pointer; color: #475569; font-size: 12px; padding: 4px 10px; border: 1px solid #e2e8f0; border-radius: 4px; background: #f8fafc; display: inline-block; user-select: none; }
.devlog-files-toggle:hover { background: #e2e8f0; }
.devlog-files { margin: 6px 0 0; padding: 10px 12px; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 4px; font-size: 12px; color: #475569; line-height: 1.55; font-family: Menlo, Consolas, monospace; white-space: pre-wrap; word-break: break-all; max-height: 320px; overflow-y: auto; }



/* ============ 开发日志页面美化（V6 风格 + Box Pattern 2026-08-26）============ */
.devlog-panel { padding: 14px 16px; }
.devlog-section-title {
  display: flex; align-items: center; gap: 8px;
  font-size: 12.5px; font-weight: 700; color: #1e293b;
  padding: 8px 0 10px;
  border-bottom: 1px dashed #e2e8f0;
  margin-bottom: 10px;
}
.devlog-section-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 24px; height: 24px;
  background: linear-gradient(180deg, #eef4ff 0%, #dbeafe 100%);
  border-radius: 6px;
  font-size: 12.5px;
}
.devlog-section-date {
  margin-left: auto;
  font-size: 12px; font-weight: 500; color: #64748b;
  background: #f1f5f9; padding: 2px 8px; border-radius: 10px;
  font-family: Menlo, Consolas, monospace;
}
.devlog-miss {
  display: flex; align-items: center; gap: 8px;
  background: linear-gradient(180deg, #fffbeb 0%, #fef3c7 100%);
  border: 1px solid #fcd34d;
  border-radius: 8px;
  padding: 8px 12px;
  font-size: 12.5px; color: #92400e;
  margin-bottom: 12px;
  box-shadow: 0 1px 2px rgba(252, 211, 77, 0.15);
}
.devlog-miss b { color: #b45309; font-size: 12.5px; margin: 0 2px; }
.devlog-miss.ok {
  background: linear-gradient(180deg, #f0fdf4 0%, #dcfce7 100%);
  border-color: #86efac;
  color: #15803d;
  box-shadow: 0 1px 2px rgba(134, 239, 172, 0.15);
}
.devlog-miss.ok::before {
  content: '\2705'; margin-right: 2px;
}
.devlog-miss:not(.ok)::before {
  content: '\26a0\ufe0f'; margin-right: 2px;
}

.devlog-today { padding: 4px 0 4px; }
.devlog-textarea {
  width: 100%; box-sizing: border-box;
  padding: 10px 12px;
  font-size: 12.5px; line-height: 1.55;
  border: 1px solid #cbd5e1;
  border-radius: 8px;
  background: linear-gradient(180deg, #ffffff 0%, #fafbfc 100%);
  resize: vertical;
  font-family: inherit;
  outline: none;
  transition: border-color .12s, box-shadow .12s;
  color: #1e293b;
}
.devlog-textarea:focus {
  border-color: #3b82f6;
  box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.12);
}
.devlog-textarea::placeholder { color: #94a3b8; }
.devlog-textarea-second { margin-top: 8px; }

.devlog-actions {
  display: flex; align-items: center; gap: 10px;
  margin-top: 12px;
  padding-top: 10px;
  border-top: 1px dashed #e2e8f0;
}
.devlog-actions-tip {
  font-size: 12px; color: #94a3b8;
}

/* 变更记录分组表头 (V6 风格) */
.devlog-table { width: 100%; border-collapse: collapse; }
.devlog-table thead th {
  background: #f1f5f9;
  color: #334155;
  font-weight: 600;
  font-size: 12.5px;
  padding: 10px 14px;
  border-bottom: 1px solid #e2e8f0;
  text-align: left;
  letter-spacing: 0.3px;
}
.devlog-table tbody td {
  padding: 10px 14px;
  font-size: 12.5px;
  color: #1e293b;
  line-height: 1.5;
  border-bottom: 1px solid #f1f5f9;
  vertical-align: top;
}
.devlog-table tbody tr:hover td { background: #f8fafc; }
.devlog-table code {
  font-family: Menlo, Consolas, monospace;
  background: #f1f5f9;
  padding: 1px 6px;
  border-radius: 4px;
  font-size: 12px;
  color: #475569;
}



/* devlog 6 列布局（2026-08-26）：表头与数据居中 */
.devlog-table thead th,
.devlog-table tbody td {
  text-align: center !important;
}
.devlog-table tbody td:first-child { text-align: left; }   /* 编号 code 左对齐 */
/* 具体修改内容：默认居中，内部内容（title + commit hash）也采用 inline-block 保证中心 */
.devlog-time {
  font-family: Menlo, Consolas, monospace;
  font-size: 12px;
  color: #475569;
  background: #f1f5f9;
  padding: 1px 6px;
  border-radius: 4px;
  display: inline-block;
  min-width: 44px;
}



/* devlog 编辑按钮（2026-08-26 第 7 列） */
.devlog-edit-btn {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 4px 12px;
  font-size: 12px;
  color: #1d4ed8;
  background: linear-gradient(180deg, #eff6ff 0%, #dbeafe 100%);
  border: 1px solid #93c5fd;
  border-radius: 6px;
  cursor: pointer;
  font-weight: 500;
  transition: all .12s ease;
  font-family: inherit;
}
.devlog-edit-btn:hover {
  background: linear-gradient(180deg, #dbeafe 0%, #bfdbfe 100%);
  border-color: #3b82f6;
  color: #1e3a8a;
  transform: translateY(-1px);
  box-shadow: 0 2px 4px rgba(59, 130, 246, 0.15);
}
.devlog-edit-btn:active { transform: translateY(0); }
.devlog-edit-btn::before {
  content: '✏️';
  font-size: 12px;
}



/* devlog detail cell (inline-block wrapper for vertical centering, 2026-08-26) */
.devlog-detail-cell {
  display: inline-block;
  text-align: center;
  max-width: 540px;
}
.devlog-detail-cell > div { text-align: left; }  /* title left-aligned within cell */
.devlog-detail-cell details { text-align: left; }



/* ============ devlog 编辑弹窗（2026-08-26 美化）============ */
.devlog-edit-modal {
  display: flex; flex-direction: column;
  padding: 4px 6px 0;
  min-height: 380px;
}
.devlog-edit-header {
  display: flex; align-items: center; gap: 12px;
  padding: 0 4px 16px;
  border-bottom: 1px dashed #e2e8f0;
  margin-bottom: 16px;
}
.devlog-edit-icon {
  display: flex; align-items: center; justify-content: center;
  width: 44px; height: 44px;
  border-radius: 12px;
  font-size: 22px;
  background: linear-gradient(180deg, #eef4ff 0%, #dbeafe 100%);
  border: 1px solid #93c5fd;
  box-shadow: 0 2px 6px rgba(59, 130, 246, 0.15);
  flex-shrink: 0;
}
.devlog-edit-meta {
  display: flex; flex-direction: column; gap: 4px;
  flex: 1; min-width: 0;
}
.devlog-edit-title-h {
  font-size: 12.5px; font-weight: 700; color: #1e293b;
  letter-spacing: 0.3px;
}
.devlog-edit-sub {
  display: flex; align-items: center; gap: 8px;
  font-size: 12px;
}
.devlog-edit-code {
  font-family: Menlo, Consolas, monospace;
  background: #f1f5f9;
  color: #475569;
  padding: 2px 8px;
  border-radius: 4px;
  font-weight: 600;
}
.devlog-edit-date {
  color: #64748b;
  font-family: Menlo, Consolas, monospace;
}

.devlog-edit-field {
  display: flex; flex-direction: column;
  margin-bottom: 14px;
}
.devlog-edit-label {
  display: flex; align-items: center; gap: 6px;
  font-size: 12.5px; font-weight: 600; color: #334155;
  margin-bottom: 6px;
}
.devlog-edit-label-dot {
  display: inline-block;
  width: 4px; height: 14px;
  background: linear-gradient(180deg, #3b82f6, #1d4ed8);
  border-radius: 2px;
}
.devlog-edit-textarea {
  width: 100%; box-sizing: border-box;
  padding: 10px 12px;
  font-size: 12.5px; line-height: 1.6;
  font-family: inherit;
  border: 1px solid #cbd5e1;
  border-radius: 8px;
  background: linear-gradient(180deg, #ffffff 0%, #fafbfc 100%);
  color: #1e293b;
  resize: vertical;
  outline: none;
  transition: border-color .12s, box-shadow .12s;
}
.devlog-edit-textarea:focus {
  border-color: #3b82f6;
  box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.12);
}
.devlog-edit-textarea::placeholder { color: #94a3b8; }

.devlog-edit-foot {
  display: flex; align-items: center; justify-content: space-between;
  margin-top: auto;
  padding: 14px 4px 4px;
  border-top: 1px dashed #e2e8f0;
}
.devlog-edit-tip {
  font-size: 12px; color: #94a3b8;
}
.devlog-edit-btns {
  display: flex; gap: 8px;
}
.devlog-edit-cancel-btn,
.devlog-edit-save-btn {
  padding: 8px 22px;
  font-size: 12.5px;
  font-weight: 600;
  border-radius: 8px;
  cursor: pointer;
  font-family: inherit;
  transition: all .12s ease;
}
.devlog-edit-cancel-btn {
  background: #fff;
  color: #475569;
  border: 1px solid #cbd5e1;
}
.devlog-edit-cancel-btn:hover {
  background: #f1f5f9;
  color: #1e293b;
  border-color: #94a3b8;
}
.devlog-edit-save-btn {
  background: linear-gradient(180deg, #3b82f6 0%, #2563eb 100%);
  color: #fff;
  border: 1px solid #2563eb;
  box-shadow: 0 2px 4px rgba(37, 99, 235, 0.2);
}
.devlog-edit-save-btn:hover {
  background: linear-gradient(180deg, #2563eb 0%, #1d4ed8 100%);
  box-shadow: 0 4px 8px rgba(37, 99, 235, 0.3);
  transform: translateY(-1px);
}
.devlog-edit-save-btn:active { transform: translateY(0); }



/* ============ 开票管理·月度闭环矩阵（2026-08-26 重做）============ */
.inv-toolbar {
  display: flex; align-items: center; gap: 14px;
  padding: 12px 14px; margin-bottom: 12px;
  background: #fff; border: 1px solid #e2e8f0; border-radius: 10px;
  flex-wrap: wrap;
}
.inv-month-switch { display: flex; align-items: center; gap: 8px; }
.inv-month-btn {
  width: 30px; height: 30px; border-radius: 7px;
  border: 1px solid #cbd5e1; background: #f8fafc; color: #334155;
  cursor: pointer; font-size: 12.5px; line-height: 1;
  transition: all .12s ease;
}
.inv-month-btn:hover { background: #eef2ff; border-color: #93c5fd; color: #1d4ed8; }
.inv-month-label {
  font-size: 12.5px; font-weight: 700; color: #1e293b;
  font-family: Menlo, Consolas, monospace;
  min-width: 84px; text-align: center;
}
.inv-stats { display: flex; align-items: center; gap: 8px; }
.inv-stat {
  padding: 4px 12px; border-radius: 14px; font-size: 12.5px; font-weight: 600;
}
.inv-stat-green { background: #dcfce7; color: #15803d; }
.inv-stat-red { background: #fee2e2; color: #b91c1c; }
.inv-copy-btn {
  padding: 7px 14px; border-radius: 8px; cursor: pointer;
  border: 1px solid #93c5fd; background: linear-gradient(180deg, #eff6ff 0%, #dbeafe 100%);
  color: #1d4ed8; font-size: 12.5px; font-weight: 600;
  transition: all .12s ease;
}
.inv-copy-btn:hover { background: linear-gradient(180deg, #dbeafe 0%, #bfdbfe 100%); transform: translateY(-1px); }

.inv-alert {
  display: flex; align-items: flex-start; flex-wrap: wrap; gap: 6px;
  padding: 10px 14px; margin-bottom: 12px;
  background: linear-gradient(180deg, #fffbeb 0%, #fef3c7 100%);
  border: 1px solid #fcd34d; border-radius: 10px;
}
.inv-alert-title { font-size: 12.5px; font-weight: 700; color: #92400e; margin-right: 4px; }
.inv-alert-tag {
  font-size: 12px; color: #92400e; background: #fff;
  padding: 2px 8px; border-radius: 4px; border: 1px solid #fcd34d;
}

/* 矩阵表格 */
.inv-table { width: 100%; border-collapse: collapse; }
.inv-table thead th {
  background: #f1f5f9; color: #334155; font-weight: 600; font-size: 12.5px;
  padding: 7px 8px; border-bottom: 1px solid #e2e8f0; text-align: center;
  letter-spacing: 0.3px; white-space: nowrap;
}
.inv-table .inv-th-company { text-align: center; }
.inv-table tbody td { border-bottom: 1px solid #f1f5f9; padding: 0; }
.inv-company {
  padding: 7px 10px !important; font-size: 12px; font-weight: 400; color: #1e293b;
  white-space: nowrap; vertical-align: middle;
}

/* 环节格子：绿=完成 红=未完成 */
.inv-cell {
  cursor: pointer; text-align: center; vertical-align: middle;
  min-width: 108px; height: 40px; padding: 5px 4px !important;
  border-left: 1px solid #f1f5f9;
  transition: filter .12s ease, transform .08s ease;
}
.inv-cell:hover { filter: brightness(0.96); }
.inv-cell.inv-done { background: #dcfce7; }
.inv-cell.inv-pend { background: #fee2e2; }
.inv-cell-amt { font-size: 12.5px; font-weight: 400; color: #1e293b; }
.inv-cell.inv-done .inv-cell-amt { color: #166534; }
.inv-cell.inv-pend .inv-cell-amt { color: #b91c1c; }
.inv-cell-date { font-size: 11.5px; color: #64748b; margin-top: 2px; }
.inv-cell-pend { font-size: 12px; font-weight: 400; color: #b91c1c; }
.inv-cell-att { font-size: 11px; color: #475569; margin-top: 2px; }
.inv-note-cell {
  text-align: center; vertical-align: middle; padding: 4px 6px !important;
  cursor: pointer; border-bottom: 1px solid #f1f5f9;
  background: #f8fafc; transition: background .12s;
  min-width: 80px;
}
.inv-note-cell:hover { background: #e2e8f0; }
.inv-note-preview {
  font-size: 12px; color: #334155; display: inline-block;
  max-width: 100px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.inv-note-empty {
  font-size: 12px; color: #94a3b8; cursor: pointer;
}
.inv-note-empty:hover { color: #3b82f6; text-decoration: underline; }
.inv-empty-row { text-align: center; padding: 24px !important; color: #94a3b8; font-size: 12.5px; }

/* 编辑弹窗 */
.inv-edit-panel {
  background: #fff; border-radius: 14px; width: 480px; max-width: 94vw;
  padding: 0; overflow: hidden; box-shadow: 0 24px 60px rgba(15,23,42,.35);
}
.inv-edit-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 18px; border-bottom: 1px solid #e2e8f0;
}
.inv-edit-title { font-size: 12.5px; font-weight: 700; color: #1e293b; }
.inv-edit-close { border: none; background: none; font-size: 18px; cursor: pointer; color: #94a3b8; }
.inv-edit-close:hover { color: #334155; }
.inv-edit-hint {
  padding: 10px 18px; font-size: 12.5px; color: #92400e;
  background: #fffbeb; border-bottom: 1px solid #fde68a;
}
.inv-edit-form { padding: 16px 18px; display: flex; flex-direction: column; gap: 8px; }
.inv-edit-label { font-size: 12.5px; font-weight: 600; color: #334155; margin-top: 4px; }
.inv-edit-form input[type="number"], .inv-edit-form textarea {
  width: 100%; box-sizing: border-box; padding: 9px 12px;
  font-size: 12.5px; border: 1px solid #cbd5e1; border-radius: 8px;
  font-family: inherit; color: #1e293b; outline: none;
  transition: border-color .12s, box-shadow .12s;
}
.inv-edit-form input[type="number"]:focus, .inv-edit-form textarea:focus {
  border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,.12);
}
.inv-done-toggle { display: flex; gap: 8px; }
.inv-done-opt {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 6px;
  padding: 9px 12px; border-radius: 8px; cursor: pointer; font-size: 12.5px; font-weight: 600;
  border: 1px solid #cbd5e1; background: #fff; color: #475569;
  transition: all .12s ease;
}
.inv-done-opt input { display: none; }
.inv-done-opt.on { border-color: #93c5fd; background: #eff6ff; color: #1d4ed8; }
.inv-att-list { display: flex; flex-wrap: wrap; gap: 6px; font-size: 12.5px; }
.inv-att-link { color: #1d4ed8; text-decoration: none; background: #eff6ff; padding: 3px 8px; border-radius: 5px; }
.inv-att-link:hover { background: #dbeafe; }
.inv-att-btn {
  align-self: flex-start; padding: 7px 14px; border-radius: 7px; cursor: pointer;
  border: 1px dashed #93c5fd; background: #f8fafc; color: #1d4ed8; font-size: 12.5px; font-weight: 600;
}
.inv-att-btn:hover { background: #eff6ff; }
.inv-edit-foot {
  display: flex; justify-content: flex-end; gap: 8px;
  padding: 14px 18px; border-top: 1px solid #e2e8f0;
}
.inv-cancel-btn {
  padding: 9px 20px; border-radius: 8px; cursor: pointer; font-size: 12.5px; font-weight: 600;
  background: #fff; color: #475569; border: 1px solid #cbd5e1;
}
.inv-cancel-btn:hover { background: #f1f5f9; }
.inv-save-btn {
  padding: 9px 22px; border-radius: 8px; cursor: pointer; font-size: 12.5px; font-weight: 600;
  background: linear-gradient(180deg, #3b82f6 0%, #2563eb 100%); color: #fff; border: 1px solid #2563eb;
  box-shadow: 0 2px 4px rgba(37,99,235,.2);
}
.inv-save-btn:hover { background: linear-gradient(180deg, #2563eb 0%, #1d4ed8 100%); transform: translateY(-1px); }
/* 2026-09-22 INVTAX：开票价税分离（发票类别 / 税率 / 生成） */
.inv-edit-form select {
  padding: 9px 12px; font-size: 12.5px; border: 1px solid #cbd5e1; border-radius: 8px;
  font-family: inherit; color: #1e293b; background: #fff; outline: none;
  transition: border-color .12s, box-shadow .12s;
}
.inv-edit-form select:focus { border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,.12); }
#inv-gen { align-self: center; }



/* 开票管理·未完成格子·具体到期日（2026-08-26） */
.inv-cell-due {
  font-size: 11px; font-weight: 500; color: #94a3b8;
  font-family: Menlo, Consolas, monospace;
  background: rgba(255, 255, 255, 0.6);
  padding: 2px 8px; border-radius: 4px;
  margin-bottom: 3px;
  display: inline-block;
}

/* 2026-08-29 员工操作列·备注气泡按钮 */
.btn-remark-tip {
  background: #f0fdf4; color: #16a34a; border: 1px solid #bbf7d0;
  font-size: 11.5px; padding: 2px 7px; border-radius: 4px; cursor: pointer;
  font-weight: 600; white-space: nowrap;
}
.btn-remark-tip:hover { background: #dcfce7; border-color: #86efac; }
.remark-pop {
  position: absolute; z-index: 9999; pointer-events: none;
}
.remark-pop-inner {
  background: #1e293b; color: #e2e8f0; font-size: 12.5px; line-height: 1.6;
  padding: 8px 12px; border-radius: 8px; max-width: 280px; word-break: break-all;
  box-shadow: 0 4px 16px rgba(0,0,0,.25); pointer-events: auto;
}
.remark-pop-text { white-space: pre-wrap; }
.remark-pop-arrow {
  position: absolute; top: -5px; left: 50%; transform: translateX(-50%);
  width: 10px; height: 10px; background: #1e293b; transform: translateX(-50%) rotate(45deg);
  border-left: 1px solid rgba(255,255,255,.1); border-top: 1px solid rgba(255,255,255,.1);
}

/* ================= 2026-09-02：核心业务表格「数据行」整体压缩 10% ==============
   覆盖模块：员工管理 / 用工单位 / 供方管理(合同) / 工作日志(含内嵌变更记录)
             / 收支明细 / 工伤处理      —— 均位于 .table-wrap 内
   实现：不写死 height，只在既有 .table-wrap table tbody td 基础上把纵向三要素各 ×0.9
           padding 上下  8px  → 7.2px
           line-height   1.3  → 1.16
         行高 33.25px → 29.9px（−10.1%）
   优点：内容换行时仍可自然撑开，不会像 height 硬约束那样溢出/裁切；左右 padding 一律不动。
   天然豁免：.dt-row(padding:0 !important)、.devlog-day-row(padding:4px 0 !important)
             tbl-bo / bo-unit-table(!important) —— 非 !important 规则压不过它们，保持原样。
   回滚：删除本段，或还原 styles.css.bak_rown10_20260902_XXXXXX
   ========================================================================== */
.table-wrap table tbody td {
  padding-top: 7.2px;
  padding-bottom: 7.2px;
  line-height: 1.16;
}

/* ================= 2026-09-02：业务表「表头行」同步压缩 10% ==================
   背景：上一轮只压了数据行（padding 8→7.2 / line-height 1.3→1.16，
        32.25px → 28.9px，−10.4%），表头未动 → 表头占比越来越突兀，
        且整个「框体」并没有真的压缩 10%。本次补齐表头，使每条（含表头）一致下降。
   算法：表头字号 13px + 默认行高约 15.6px 属不可压缩部分（压了会挤字），
        故只压纵向 padding，按各表自身基准 −10%：
          通用 10px → 8.2px   （36.6px → 33.0px，−9.8%）
          专属  9px → 7.3px   （34.6px → 31.1px，−10.1%）
   覆盖：员工管理 / 用工单位 / 供方管理(合同) / 工作日志(含内嵌变更记录)
        / 收支明细 / 考勤管理 / 工伤处理
   注意：收支明细(fin-bank-table)表头是裸 <tr><th>，浏览器自动包进 <tbody>，
        通用 thead th 选择器管不到，必须单独按 (0,2,2) 覆盖。
   回滚：删除本段，或还原 styles.css.bak_headn10_XXXXXX
   ======================================================================== */
.table-wrap table thead th { padding-top: 8.2px; padding-bottom: 8.2px; }
.table-wrap table.fin-bank-table th { padding-top: 7.3px; padding-bottom: 7.3px; }
.table-wrap.tbl-work_injuries th { padding-top: 7.3px; padding-bottom: 7.3px; }
.devlog-table thead th { padding-top: 8.2px; padding-bottom: 8.2px; }

/* ========================================================================
   2026-09-03 数据行统一 32px：员工管理 / 供方管理 / 用工单位管理
   原来：通用 td padding 8px+12.5px*1.3+1px 线 = 33.25px；
        用工单位表 padding 11px+13px = ~41px（自有规则）
   现在：固定 height 33px（2026-09-03 32→32.5→33，并加入工伤处理）、纵向 padding 归零，内容垂直居中，横向 padding 沿用原表
   ======================================================================== */
.tbl-employees table tbody td,
.tbl-contracts table tbody td,
.tbl-work_injury_apply table tbody td { height: 33px; padding: 0 14px; vertical-align: middle; }
.tbl-client_companies table tbody td { height: 33px; padding: 0 8px; vertical-align: middle; }
/* 驻厂管理员单元格：给 33px 行留余量，3 个标签仍一行排开 */
.tbl-client_companies .sa-cell { min-height: 26px; }

/* ========================================================================
   2026-09-03 顶部按钮扁平化（head-btns 一排：删除记录/员工使用/驻厂操作/
   导出台账/一键缴纳/当日投保/合同签署刷新/新增）
   去叠加感：工具条容器去掉自带白底+边框+阴影（按钮自己有边框，套一层=叠了两层）；
   去掉 hover 上浮 translateY + 投影，hover 只做轻微加深底色
   ======================================================================== */
.view-head .head-btns.v6-toolbar { background: transparent; border: none; box-shadow: none; padding: 0; gap: 6px; }
.view-head .head-btns.v6-toolbar .btn-sm { height: 28px; min-height: 28px; max-height: 28px; padding: 0 10px; }
.view-head .head-btns .btn-sm { box-shadow: none; transform: none; transition: background .12s, border-color .12s; }
.view-head .head-btns .btn-sm:hover,
.view-head .head-btns .btn-sm:active { box-shadow: none; transform: none; }
.view-head .head-btns .btn-sm:hover { background: #e2e8f0; border-color: #cbd5e1; }
.view-head .head-btns .btn-light:hover { background: #e2e8f0 !important; border-color: #cbd5e1 !important; }
.view-head .head-btns .btn-green:hover { background: #15803d !important; }
.view-head .head-btns .btn-blue:hover { background: #1d4ed8 !important; }
.view-head .head-btns .btn-primary-sm:hover { background: #1e40af !important; }

/* ========================================================================
   2026-09-03 顶部按钮颜色宽度统一（head-btns 一排）
   颜色：全部统一为浅灰扁平（#f1f5f9 底 / #334155 字 / #e2e8f0 边），不再区分绿/蓝；
   宽度：固定 110px、文字居中（最长标签「合同签署刷新」6 字+图标也能放下）；
   hover：统一加深为 #e2e8f0
   ======================================================================== */
.view-head .head-btns .btn-sm { width: 110px; justify-content: center; text-align: center; white-space: nowrap; }
.view-head .head-btns .btn-green,
.view-head .head-btns .btn-blue,
.view-head .head-btns .btn-primary-sm { background: #f1f5f9 !important; color: #334155 !important; border: 1px solid #e2e8f0 !important; font-weight: 500; }
.view-head .head-btns .btn-green:hover,
.view-head .head-btns .btn-blue:hover,
.view-head .head-btns .btn-primary-sm:hover,
.view-head .head-btns .btn-sm:hover { background: #e2e8f0 !important; color: #1e293b !important; border-color: #cbd5e1 !important; }

/* ========================================================================
   2026-09-03 按钮宽 92 + 删除记录不换行
   按钮文案统一为 4 字后，宽度 110 -> 92px；「删除记录」在筛选行容器里，
   不受 head-btns 宽度规则管，但会被 flex 挤压换行，补 nowrap
   ======================================================================== */
.view-head .head-btns .btn-sm { width: 92px; padding: 0 8px; }
.view-head #inline-filters .btn-sm { white-space: nowrap; flex-shrink: 0; }

/* ========================================================================
   2026-09-03 新增/编辑弹窗 V6 化（#modal 内的 form-grid 表单）
   统一 V6 Box Pattern：输入框 28px 高 / 6px 圆角 / #cbd5e1 边框 / 12px 字号；
   标签 12px；栅格与弹窗内边距同步收紧；底部按钮同规格
   ======================================================================== */
#modal .modal-head { padding: 10px 14px; font-size: 12.5px; }
#modal .modal-body { padding: 12px 14px; }
#modal .form-grid { gap: 8px 12px; }
#modal .form-field label { font-size: 12px; margin-bottom: 3px; }
#modal .form-field input,
#modal .form-field select,
#modal .form-field textarea { height: 28px; padding: 0 8px; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 12px; line-height: 26px; box-sizing: border-box; background: #fff; color: #1e293b; }
#modal .form-field textarea { height: auto; min-height: 56px; line-height: 1.5; padding: 6px 8px; resize: vertical; }
#modal .form-field input:focus, #modal .form-field select:focus, #modal .form-field textarea:focus { outline: none; border-color: #94a3b8; }
#modal .form-field .field-hint { font-size: 11px; margin-top: 2px; line-height: 1.45; }
#modal .form-field input.disabled-field, #modal .form-field select.disabled-field { background: #f1f5f9; color: #94a3b8; }
#modal .form-field input.req-error, #modal .form-field select.req-error { height: 28px; }
/* 2026-09-28 INREC：只读展示字段（如内部招聘员工的「供应商名称」= 内部-招聘人）——
   与同栏输入框逐像素同规格（28px 高 / 6px 圆角 / #cbd5e1 边框 / 12px 字号），仅底色变灰表示不可编辑。 */
#modal .form-field .form-static { height: 28px; padding: 0 8px; border: 1px solid #cbd5e1; border-radius: 6px;
  font-size: 12px; line-height: 26px; box-sizing: border-box; background: #f1f5f9; color: #334155; font-weight: 600; }
#modal .modal-foot { margin-top: 12px; gap: 8px; }
#modal .modal-foot button { height: 28px; padding: 0 16px; border-radius: 6px; font-size: 12px; line-height: 28px; }
/* 浏览器 autofill 底色覆盖（截图中的绿色底为 autofill/护眼类着色，非系统样式；此处强制回白） */
#modal .form-field input:-webkit-autofill { -webkit-box-shadow: 0 0 0 1000px #fff inset; -webkit-text-fill-color: #1e293b; transition: background-color 9999s; }


/* 2026-09-04：入职台账「用工单位分配」chip（对齐驻厂管理员列交互；类名独立 oa-* 避免与 sa-* 事件绑定冲突） */
.oa-cell { position: relative; display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; max-width: 300px; min-height: 26px; }
.oa-tag { display: inline-flex; align-items: center; gap: 3px; padding: 1px 4px 1px 7px; background: #eff6ff; color: #334155; border: 1px solid #bfdbfe; border-radius: 5px; font-size: 12px; line-height: 1.6; white-space: nowrap; }
.oa-rm { border: 0; background: transparent; color: #1d4ed8; cursor: pointer; padding: 0 3px; font-size: 12px; line-height: 1; border-radius: 3px; }
.oa-rm:hover { background: #dbeafe; color: #b91c1c; }
.oa-add { width: 22px; height: 22px; border: 0; background: transparent; color: #2563eb; opacity: 0.4; border-radius: 50%; cursor: pointer; font-size: 12.5px; line-height: 1; padding: 0; flex-shrink: 0; transition: all .15s; font-weight: 400; display: inline-flex; align-items: center; justify-content: center; }
.oa-add:hover { opacity: 1; background: rgba(37, 99, 235, .08); transform: scale(1.1); }
.oa-empty-add { display: inline-flex; align-items: center; gap: 4px; padding: 3px 10px 3px 8px; border: 1px dashed #93c5fd; background: linear-gradient(135deg, #f0f7ff 0%, #fff 100%); color: #2563eb; border-radius: 6px; font-size: 12.5px; cursor: pointer; transition: all .15s; line-height: 1.6; white-space: nowrap; }

/* oe-empty-add-unyhui — 2026-09-05：移除 .oa-empty-add 雅黑 + font-weight:500，与「面试记录」.btn-sm 视觉一致（继承 body 字体/normal 字重/12.5px） */
.oa-empty-add:hover { border-color: #2563eb; border-style: solid; background: linear-gradient(135deg, #dbeafe, #eff6ff); color: #1d4ed8; box-shadow: 0 4px 12px rgba(37,99,235,.15); transform: translateY(-1px); }
.oa-empty-add-plus { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 50%; background: linear-gradient(135deg, #2563eb, #1d4ed8); color: #fff; font-size: 12px; line-height: 1; font-weight: 600; flex-shrink: 0; box-shadow: 0 1px 3px rgba(37,99,235,.3); }
/* 分配弹窗：候选单位卡片列表限高滚动，避免单位多时弹窗过长 */
.oa-pick-list { display: flex; flex-direction: column; gap: 5px; padding: 2px 0; }

/* oe-assign-compact — 2026-09-05：分配单位弹窗压缩卡片高度 + 去掉内层 max-height/overflow（避免双滚动条） */

/* 2026-09-04：招聘需求「加急」行——整个框体四边边缘加红（对齐黑名单行 row-blacklist 的高亮思路） */
.tbl-recruit_demands tr.row-urgent > td { background: linear-gradient(90deg, #fff5f5 0%, #ffecec 100%) !important; border-top: 1px solid #f87171 !important; border-bottom: 1px solid #f87171 !important; }
.tbl-recruit_demands tr.row-urgent > td:first-child { border-left: 3px solid #dc2626 !important; }
.tbl-recruit_demands tr.row-urgent > td:last-child { border-right: 2px solid #f87171 !important; }

/* ══════════ 2026-10-17 WIROW：工伤台账整行三色（老板口径）══════════
   已申报（待审批）= 红 · 已同意/补资料/审核中/赔付中/已赔付 = 黄 · 已完结 = 绿
   写法与 row-blacklist / row-urgent 同源（> td + !important + 左侧色条），
   只为压过表格自身的斑马纹与 hover 底色；不新增任何布局属性。 */
.tbl-work_injuries tr.wi-row-pending > td { background: linear-gradient(90deg, #fff1f2 0%, #ffe4e6 100%) !important; }
.tbl-work_injuries tr.wi-row-pending > td:first-child { box-shadow: inset 3px 0 0 #dc2626 !important; }
.tbl-work_injuries tr.wi-row-pending:hover > td { background: #ffe4e6 !important; }

.tbl-work_injuries tr.wi-row-doing > td { background: linear-gradient(90deg, #fffbeb 0%, #fef3c7 100%) !important; }
.tbl-work_injuries tr.wi-row-doing > td:first-child { box-shadow: inset 3px 0 0 #d97706 !important; }
.tbl-work_injuries tr.wi-row-doing:hover > td { background: #fef3c7 !important; }

.tbl-work_injuries tr.wi-row-done > td { background: linear-gradient(90deg, #f0fdf4 0%, #dcfce7 100%) !important; }
.tbl-work_injuries tr.wi-row-done > td:first-child { box-shadow: inset 3px 0 0 #16a34a !important; }
.tbl-work_injuries tr.wi-row-done:hover > td { background: #dcfce7 !important; }

/* 2026-09-04：招聘需求「招聘优势」右侧「详情」按钮 + 单位基本信息说明页（V6） */
.rd-adv { vertical-align: middle; }
.rd-detail-btn { display: inline-flex; align-items: center; gap: 3px; margin-left: 6px; padding: 2px 9px; border: 1px solid #cbd5e1; background: linear-gradient(180deg, #ffffff, #f8fafc); color: #2563eb; border-radius: 6px; font-size: 12px; font-family: inherit; cursor: pointer; line-height: 1.6; white-space: nowrap; transition: all .15s; vertical-align: middle; }
.rd-detail-btn:hover { border-color: #2563eb; background: #eff6ff; box-shadow: 0 2px 8px rgba(37, 99, 235, .15); }
.rd-dt-mask { position: fixed; inset: 0; background: rgba(15, 23, 42, .45); z-index: 2100; display: flex; align-items: center; justify-content: center; padding: 24px; animation: rdDtIn .18s ease; }
@keyframes rdDtIn { from { opacity: 0; } to { opacity: 1; } }
.rd-dt-modal { font-family: -apple-system, "Segoe UI", "Microsoft YaHei", sans-serif; font-size: 12.5px; color: #1e293b; background: #fff; border-radius: 10px; border: 1px solid #cbd5e1; width: 760px; max-width: 94vw; max-height: 86vh; display: flex; flex-direction: column; box-shadow: 0 18px 50px rgba(15, 23, 42, .25); overflow: hidden; }
.rd-dt-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 12px 16px; background: linear-gradient(135deg, #eff6ff, #f8fafc); border-bottom: 1px solid #cbd5e1; flex-shrink: 0; }
.rd-dt-title { font-size: 15px; font-weight: 700; color: #1e293b; display: flex; align-items: center; gap: 8px; }
.rd-dt-badge { display: inline-flex; align-items: center; padding: 2px 9px; background: linear-gradient(135deg, #2563eb, #1d4ed8); color: #fff; border-radius: 999px; font-size: 11px; font-weight: 600; white-space: nowrap; }
.rd-dt-close { border: 1px solid #cbd5e1; background: #fff; color: #64748b; width: 26px; height: 26px; border-radius: 6px; cursor: pointer; font-size: 15px; line-height: 1; flex-shrink: 0; transition: all .15s; }
.rd-dt-close:hover { color: #dc2626; border-color: #fca5a5; background: #fef2f2; }
.rd-dt-body { padding: 12px 16px 16px; overflow-y: auto; font-size: 12.5px; line-height: 1.3; }
.rd-dt-head-row { display: flex; border: 1px solid #cbd5e1; border-bottom: 0; background: #fff; }
.rd-dt-head-row:last-of-type { border-bottom: 1px solid #cbd5e1; }
.rd-dt-hl { flex: 1; padding: 6px 10px; background: #f1f5f9; color: #334155; font-weight: 600; border-right: 1px solid #cbd5e1; white-space: nowrap; }
.rd-dt-hv { flex: 1; padding: 6px 10px; color: #1e293b; font-weight: 600; border-right: 1px solid #cbd5e1; }
.rd-dt-hv:last-child { border-right: 0; }
.rd-dt-group { display: flex; border: 1px solid #cbd5e1; border-top: 0; }
.rd-dt-group:first-of-type { border-top: 1px solid #cbd5e1; margin-top: 10px; }
.rd-dt-gname { width: 84px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; text-align: center; padding: 8px 6px; background: #eff6ff; color: #1d4ed8; font-weight: 700; border-right: 1px solid #cbd5e1; line-height: 1.5; }
.rd-dt-grows { flex: 1; min-width: 0; }
.rd-dt-row { display: flex; border-bottom: 1px solid #e2e8f0; }
.rd-dt-row:last-child { border-bottom: 0; }
.rd-dt-row.odd { background: #fdf2f2; }
.rd-dt-k { width: 190px; flex-shrink: 0; padding: 6px 10px; color: #1e293b; font-weight: 600; border-right: 1px solid #e2e8f0; }
.rd-dt-v { flex: 1; padding: 6px 10px; color: #1e293b; line-height: 1.3; word-break: break-all; }
/* 2026-09-04：详情页可编辑（填空 input / 少选项 select + 保存按钮） */
.rd-dt-save { display: inline-flex; align-items: center; gap: 4px; padding: 4px 14px; border: 1px solid #2563eb; background: linear-gradient(135deg, #2563eb, #1d4ed8); color: #fff; border-radius: 6px; font-size: 12px; font-family: inherit; font-weight: 600; cursor: pointer; line-height: 1.6; white-space: nowrap; transition: all .15s; }
.rd-dt-save:hover { box-shadow: 0 3px 10px rgba(37, 99, 235, .35); transform: translateY(-1px); }
.rd-dt-input { width: 100%; box-sizing: border-box; border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; color: #1e293b; font-size: 12.5px; font-family: inherit; padding: 4px 8px; line-height: 1.6; outline: none; transition: border-color .15s, box-shadow .15s; }
.rd-dt-input:focus { border-color: #2563eb; box-shadow: 0 0 0 2px rgba(37, 99, 235, .12); }
select.rd-dt-input { cursor: pointer; }
/* 2026-09-04：招聘广告 / 面试位置——双击格内文字复制全文 */
.rd-copy { cursor: copy; border-bottom: 1px dashed transparent; }
.rd-copy:hover { border-bottom-color: #93c5fd; color: #1d4ed8; }
/* 2026-09-04：招聘周期四格输入（cycle4） */
.cycle4-wrap { display: flex; align-items: center; gap: 5px; flex-wrap: wrap; }
.cycle4-in { width: 64px; padding: 5px 8px; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 13px; font-family: inherit; text-align: center; outline: none; transition: border-color .15s, box-shadow .15s; }
.cycle4-in:focus { border-color: #2563eb; box-shadow: 0 0 0 2px rgba(37, 99, 235, .12); }
.cycle4-in::-webkit-outer-spin-button, .cycle4-in::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.cycle4-unit { color: #64748b; font-size: 12px; }
.cycle4-tilde { color: #94a3b8; font-weight: 600; margin: 0 2px; }
.cycle4-preview { margin-left: 8px; padding: 3px 10px; background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; border-radius: 6px; font-size: 12px; font-weight: 600; white-space: nowrap; }
/* 2026-09-04：详情页只读展示（企业名称自动带用人单位全称） */
.rd-dt-ro { display: inline-block; width: 100%; color: #1e293b; line-height: 1.7; word-break: break-all; }
.rd-dt-ro-strong { font-weight: 600; color: #1d4ed8; }
/* 2026-09-04：详情页行高压缩（覆盖上面基础规则，后写优先） */
.rd-dt-body { padding: 8px 12px 12px; }
.rd-dt-head-row .rd-dt-hl, .rd-dt-head-row .rd-dt-hv { padding: 3px 10px; }
.rd-dt-row .rd-dt-k, .rd-dt-row .rd-dt-v { padding: 2px 10px; line-height: 1.5; }
.rd-dt-gname { padding: 3px 6px; }
.rd-dt-input { padding: 2px 8px; }
.rd-dt-head { padding: 8px 14px; }

/* 2026-09-04：招聘需求列宽分配——招聘广告/面试位置/招聘优势三列加宽，其余列压缩 */
.tbl-recruit_demands { table-layout: fixed; }
.tbl-recruit_demands th:nth-child(1), .tbl-recruit_demands td:nth-child(1) { width: 44px; text-align: center; }
.tbl-recruit_demands th:nth-child(2), .tbl-recruit_demands td:nth-child(2) { width: 150px; }
.tbl-recruit_demands th:nth-child(3), .tbl-recruit_demands td:nth-child(3) { width: auto; }
.tbl-recruit_demands th:nth-child(4), .tbl-recruit_demands td:nth-child(4) { width: 62px; text-align: center; }
.tbl-recruit_demands th:nth-child(5), .tbl-recruit_demands td:nth-child(5) { width: 92px; }
.tbl-recruit_demands th:nth-child(6), .tbl-recruit_demands td:nth-child(6) { width: auto; }
.tbl-recruit_demands th:nth-child(7), .tbl-recruit_demands td:nth-child(7) { width: auto; }
.tbl-recruit_demands th:nth-child(8), .tbl-recruit_demands td:nth-child(8) { width: 56px; text-align: center; }
.tbl-recruit_demands th:nth-child(9), .tbl-recruit_demands td:nth-child(9) { width: 158px; }
.tbl-recruit_demands td:nth-child(9) { white-space: nowrap; padding: 4px 6px; }
.tbl-recruit_demands td:nth-child(9) .row-actions { gap: 4px; }
.tbl-recruit_demands td:nth-child(9) .btn-sm, .tbl-recruit_demands td:nth-child(9) .btn-danger { padding: 2px 7px; font-size: 11px; }
/* 2026-09-04：详情页下拉化（select + 自定义切换） */
.rd-dt-field { display: flex; align-items: center; gap: 5px; }
.rd-dt-field .rd-dt-input { flex: 1; min-width: 0; }
select.rd-dt-input.rd-dt-sel { appearance: none; -webkit-appearance: none; background-image: linear-gradient(45deg, transparent 50%, #64748b 50%), linear-gradient(135deg, #64748b 50%, transparent 50%); background-position: calc(100% - 14px) 52%, calc(100% - 9px) 52%; background-size: 5px 5px, 5px 5px; background-repeat: no-repeat; padding-right: 24px; }
.rd-dt-back { flex-shrink: 0; padding: 2px 7px; border: 1px solid #cbd5e1; background: #fff; color: #64748b; border-radius: 6px; font-size: 11px; font-family: inherit; cursor: pointer; white-space: nowrap; line-height: 1.6; }
.rd-dt-back:hover { color: #2563eb; border-color: #93c5fd; background: #eff6ff; }

/* 2026-09-04：招聘需求行高统一（对齐序号3行）+ 用人单位不换行省略 (rd-rows-uniform) */
.tbl-recruit_demands tbody > tr > td { height: 60px; }
.tbl-recruit_demands td:nth-child(2) { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* 2026-09-04：招聘广告/面试位置/招聘优势完整换行显示，不再截断隐藏 (rd-cols-wrap) */
.tbl-recruit_demands td:nth-child(3), .tbl-recruit_demands td:nth-child(6), .tbl-recruit_demands td:nth-child(7) { white-space: normal; word-break: break-word; overflow-wrap: anywhere; }
.tbl-recruit_demands td:nth-child(3) .rd-copy, .tbl-recruit_demands td:nth-child(6) .rd-copy, .tbl-recruit_demands td:nth-child(7) .rd-copy { cursor: copy; }

/* 2026-09-04：企业详情弹窗字体对齐表格 td：12.5px 微软雅黑 #1e293b 行高1.3 (rd-dt-font-125) */

/* oe-add-big：招聘台账底部大号新增按钮（居中、随行数下移、不受权限影响） */
#oe-add-big{display:block;margin:14px auto 7px;width:39px;height:39px;border-radius:50%;border:1px dashed #94a3b8;background:#fff;color:#2563eb;font-size:21px;line-height:1;cursor:pointer;padding:0}
#oe-add-big:hover{background:#eff6ff;border-color:#2563eb}

/* ================= 以下为 2026-09-08 恢复段（来源：git 33d4821 权威基底，事故丢失后找回） ================= */
/* ================= 科目体系全景（2026-09-07 · 账户管理页下方） ================= */
.subject-pano { margin-top: 14px; padding: 0 2px 10px; }
.sp-loading, .sp-empty { color: #6b7280; font-size: 12.5px; padding: 18px 4px; }
.sp-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; margin: 4px 0 8px; }
.sp-title-row { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.sp-title { font-size: 14px; font-weight: 700; color: #0f172a; }
.sp-sub { font-size: 11.5px; color: #94a3b8; }
.sp-head-btns { display: flex; gap: 6px; }
.sp-kpis { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 10px; }
.sp-kpi { border: 1px solid #e2e8f0; background: #f8fafc; border-radius: 7px; padding: 3px 10px; font-size: 12px; color: #475569; }
.sp-kpi b { color: #0f172a; font-size: 13px; margin-left: 3px; }
.sp-kpi.empty { opacity: .55; }
.sp-cats { display: flex; flex-direction: column; gap: 6px; }
.sp-cat { border: 1px solid #e2e8f0; border-radius: 9px; background: #fff; }
.sp-cat summary { cursor: pointer; padding: 7px 12px; display: flex; align-items: center; justify-content: center; gap: 8px; list-style: none; }
.sp-cat summary::-webkit-details-marker { display: none; }
.sp-cat summary::before { content: '▸'; color: #94a3b8; font-size: 11px; transition: transform .15s; }
.sp-cat[open] summary::before { transform: rotate(90deg); }
.sp-cat-name { font-size: 13px; font-weight: 600; color: #334155; }
.sp-cat-count { font-size: 11.5px; color: #94a3b8; }
.sp-table { width: 100%; border-collapse: collapse; border-top: 1px solid #f1f5f9; table-layout: fixed; }
.sp-table th:nth-child(1) { width: 78px; }
.sp-table th:nth-child(3) { width: 180px; }
.sp-table th { font-size: 11px; color: #94a3b8; font-weight: 400; text-align: center; padding: 5px 12px; background: #f8fafc; }
.sp-table td { font-size: 12.5px; color: #334155; padding: 5px 12px; border-top: 1px solid #f8fafc; vertical-align: middle; text-align: center; }
.sp-table tr.sp-l1 td { font-weight: 600; color: #0f172a; }
.sp-code { white-space: nowrap; font-family: Consolas, Menlo, monospace; overflow: hidden; text-overflow: clip; }
.sp-table td:nth-child(2) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sp-ind { display: inline-block; width: 22px; }
.sp-dir { color: #64748b; font-size: 11.5px; }
.sp-tag { display: inline-block; font-size: 10px; color: #0f6e56; background: #e1f5ee; border-radius: 5px; padding: 1px 5px; margin-left: 6px; vertical-align: 1px; }
.sp-tag.gray { color: #64748b; background: #f1f5f9; }
.sp-ops { white-space: nowrap; text-align: center; }
.sp-ops .btn-sm { margin-left: 4px; }
.sp-formulas { margin-top: 12px; }
.sp-block-head { display: flex; align-items: baseline; gap: 8px; margin: 0 0 6px; }
.sp-block-head b { font-size: 13px; color: #0f172a; }
.sp-formula { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; border: 1px solid #e2e8f0; border-radius: 8px; background: #fff; padding: 8px 12px; margin-bottom: 6px; }
.sp-formula-main { display: flex; align-items: baseline; gap: 10px; flex: 1 1 auto; min-width: 0; flex-wrap: wrap; }
.sp-formula-name { font-size: 12.5px; font-weight: 600; color: #1e40af; background: #eff6ff; border-radius: 6px; padding: 1px 8px; }
.sp-formula-expr { font-size: 12.5px; color: #334155; }
.sp-tok { font-weight: 700; color: #b45309; background: #fef3c7; border-radius: 3px; padding: 0 2px; }
.sp-formula-note { font-size: 11px; color: #94a3b8; flex-basis: 100%; }
.sp-demo { margin-top: 14px; border: 1px dashed #cbd5e1; border-radius: 9px; background: #fbfdff; padding: 10px 12px; }
.sp-demo-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 6px; }
.sp-demo-subj { max-width: 320px; }
.badge.启用 { background: #e1f5ee; color: #0f6e56; }
.badge.停用 { background: #f1f5f9; color: #64748b; }
/* 轻量弹层 */
.sp-popup-mask { position: fixed; inset: 0; background: rgba(15,23,42,.45); z-index: 2000; display: flex; align-items: center; justify-content: center; }
.sp-popup-card { width: min(440px, 92vw); max-height: 86vh; overflow: auto; background: #fff; border-radius: 12px; padding: 14px 16px; box-shadow: 0 10px 40px rgba(15,23,42,.2); }
.sp-popup-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }
.sp-popup-head b { font-size: 14px; color: #0f172a; }
.sp-x { cursor: pointer; color: #94a3b8; font-size: 14px; padding: 2px 6px; }
.sp-x:hover { color: #475569; }
.sp-frow { margin-bottom: 9px; }
.sp-frow label { display: block; font-size: 12px; color: #64748b; margin-bottom: 3px; }
.sp-fval input, .sp-fval select, .sp-fval textarea { width: 100%; box-sizing: border-box; font-size: 13px; padding: 6px 9px; border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; color: #0f172a; }
.sp-fval input:focus, .sp-fval select:focus, .sp-fval textarea:focus { outline: none; border-color: #3b82f6; }
.sp-fnote { font-size: 11px; color: #94a3b8; margin: 6px 0 10px; line-height: 1.5; }
.sp-fbtns { display: flex; justify-content: flex-end; gap: 8px; }

/* ================= 科目体系左右分栏（2026-09-07 · 按借/贷方向） ================= */
.sp-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 8px; }
@media (max-width: 1180px) { .sp-grid { grid-template-columns: 1fr; } }
.sp-col { border-radius: 10px; padding: 8px 10px 12px; background: #fbfdff; }
.sp-col-credit { border: 1.5px solid #0F6E56; }
.sp-col-debit { border: 1.5px solid #A32D2D; }
.sp-col-head { font-size: 12.5px; font-weight: 500; padding: 2px 4px 8px; text-align: center; }
.sp-col-credit .sp-col-head { color: #0F6E56; }
.sp-col-debit .sp-col-head { color: #A32D2D; }
.sp-col-sub { display: block; font-size: 11px; font-weight: 400; color: #64748b; margin-top: 3px; line-height: 1.4; }
.sp-col .sp-cats { gap: 5px; }
.sp-col .sp-cat { background: #fff; }
.sp-col .sp-table th, .sp-col .sp-table td { padding: 4px 8px; font-size: 12px; }
.sp-th-ops { text-align: right; }
.sp-ops { white-space: nowrap; text-align: center; }
.sp-ops .btn-sm { margin-left: 3px; padding: 1px 7px; }
.sp-dot-on, .sp-dot-off { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 4px; vertical-align: middle; }
.sp-dot-on { background: #0f6e56; box-shadow: 0 0 0 1px #9FE1CB; }
.sp-dot-off { background: #94a3b8; box-shadow: 0 0 0 1px #e2e8f0; }

/* ============ 科目体系全景 V6 Box Pattern 统一（2026-09-08）============
   规格：控件 28px 高 / 6px 圆角 / #cbd5e1 边框 / 12px 字号 / 表头 #f1f5f9+#334155 */
/* 顶部：标题行与 KPI chips */
.subject-pano .sp-head { margin: 2px 0 6px; }
.subject-pano .sp-title { font-size: 17px; font-weight: 700; color: #0f172a; letter-spacing: -0.3px; }
.subject-pano .sp-sub { font-size: 11px; color: #94a3b8; }
.subject-pano .sp-head-btns .btn-sm { height: 26px; min-height: 26px; padding: 0 9px; font-size: 12px; }
.subject-pano .sp-kpis { gap: 5px; margin: 0 0 8px; }
.subject-pano .sp-kpi { height: 26px; display: inline-flex; align-items: center; border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; padding: 0 9px; font-size: 12px; color: #334155; }
.subject-pano .sp-kpi b { font-size: 12px; font-weight: 600; margin-left: 4px; color: #0f172a; }
.subject-pano .sp-kpi.empty { opacity: .45; }
/* 左右栏：V6 边框 + 3px 方向色条（保留借贷红绿语义） */
.subject-pano .sp-grid { gap: 8px; margin-top: 6px; }
.subject-pano .sp-col { border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; padding: 6px 8px 10px; }
.subject-pano .sp-col-credit { border: 2px solid #0F6E56; }
.subject-pano .sp-col-debit { border: 2px solid #A32D2D; }
.subject-pano .sp-col-head { font-size: 12px; font-weight: 600; padding: 2px 2px 6px; text-align: center; }
.subject-pano .sp-col-credit .sp-col-head { color: #0F6E56; }
.subject-pano .sp-col-debit .sp-col-head { color: #A32D2D; }
.subject-pano .sp-col-sub { font-size: 11px; font-weight: 400; color: #94a3b8; margin-top: 2px; }
/* 折叠面板：28px 高摘要行 + V6 圆角 */
.subject-pano .sp-cats { gap: 5px; }
.subject-pano .sp-cat { border: 1px solid #e2e8f0; border-radius: 6px; background: #fff; }
.subject-pano .sp-col-credit .sp-cat { border: 1.5px solid #7FC2B0; }
.subject-pano .sp-col-debit .sp-cat { border: 1.5px solid #E0A9A9; }
.subject-pano .sp-cat summary { min-height: 28px; padding: 0 9px; gap: 7px; }
.subject-pano .sp-cat summary::before { color: #94a3b8; font-size: 10px; }
.subject-pano .sp-cat-name { font-size: 12px; font-weight: 600; color: #334155; }
.subject-pano .sp-cat-count { font-size: 11px; color: #94a3b8; }
/* 表格：V6 表头 #f1f5f9/#334155 + 12px 字号 + 紧凑行高 */
.subject-pano .sp-table th { background: #f1f5f9; color: #334155; font-size: 11px; font-weight: 500; padding: 4px 8px; text-align: center; }
.subject-pano .sp-table td { font-size: 12px; color: #334155; padding: 3px 8px; text-align: center; }
.subject-pano .sp-table tr.sp-l1 td { font-weight: 600; color: #0f172a; }
.subject-pano .sp-code { font-size: 12px; color: #475569; }
.subject-pano .sp-tag { font-size: 10px; border-radius: 4px; padding: 0 4px; }
/* 操作按钮：V6 26px */
.subject-pano .sp-ops .btn-sm { height: 22px; min-height: 22px; padding: 0 7px; font-size: 11.5px; border-radius: 5px; }
/* 勾稽公式卡片 V6 化 */
.subject-pano .sp-formula { border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; padding: 6px 10px; }
.subject-pano .sp-formula-name { font-size: 12px; font-weight: 600; padding: 1px 7px; }
.subject-pano .sp-formula-expr { font-size: 12px; }
.subject-pano .sp-formula-note { font-size: 11px; }
.subject-pano .sp-block-head b { font-size: 12.5px; }
/* 演示区 V6 化 */
.subject-pano .sp-demo { border: 1px dashed #cbd5e1; border-radius: 6px; background: #f8fafc; padding: 8px 10px; }
/* 弹层 V6：输入 28px / 6px 圆角 / #cbd5e1 边框 / 12px 字号 */
.sp-popup-card { width: min(420px, 92vw); border-radius: 8px; padding: 12px 14px; }
.sp-popup-head b { font-size: 13px; }
.sp-frow label { font-size: 11.5px; }
.sp-fval input, .sp-fval select, .sp-fval textarea { height: 28px; min-height: 28px; font-size: 12px; padding: 0 8px; border: 1px solid #cbd5e1; border-radius: 6px; }
.sp-fval textarea { height: auto; min-height: 52px; padding: 6px 8px; }
.sp-fnote { font-size: 11px; }
.sp-fbtns .btn-sm { height: 28px; min-height: 28px; padding: 0 12px; font-size: 12px; }

/* 科目大白话解释（科目名后小灰字） */
.subject-pano .sp-explain { font-size: 11px; color: #94a3b8; font-weight: 400; margin-left: 6px; }

/* ================= 记账凭证（2026-09-08 · 财务管理 → 记账凭证） ================= */
/* 记账凭证页头已并入通用 .view-head / #inline-filters / .v6-toolbar（对齐员工管理，2026-09-08） */
#inline-filters .btn-sm { height: 28px; min-height: 28px; padding: 0 10px; font-size: 12px; flex-shrink: 0; }
.vch-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.vch-table th { background: #f1f5f9; color: #334155; font-weight: 600; padding: 7px 8px; border-bottom: 1px solid #e2e8f0; white-space: nowrap; }
.vch-table td { padding: 7px 8px; border-bottom: 1px solid #f1f5f9; color: #334155; }
.vch-table td.r, .vch-table th.r { text-align: right; }
.vch-table tbody tr:hover { background: #f8fafc; }
.vch-table tfoot .vch-sum td { background: #f8fafc; font-weight: 600; color: #0f172a; }
.vch-table .tag-mini { border: 1px solid #e2e8f0; background: #f8fafc; border-radius: 4px; padding: 1px 6px; font-size: 11.5px; color: #475569; }
/* 录入弹窗（2026-09-08 二次调整：在放大版基础上整体上下左右压缩 20%；V6：白底 / #cbd5e1 / 6px / 焦点蓝环；显式白底压 autofill 绿底） */
.modal:has(.vch-form) .modal-head { padding: 14px 21px; font-size: 14.5px; }
.modal:has(.vch-form) .modal-body { padding: 16px 21px 19px; }
.vch-form { font-size: 12.5px; }
.vch-form input, .vch-form select, .vch-form textarea { background: #fff; }
.vch-form input:-webkit-autofill { -webkit-box-shadow: 0 0 0 1000px #fff inset; -webkit-text-fill-color: #0f172a; transition: background-color 9999s; }
.vch-form-head { display: flex; gap: 14px; flex-wrap: wrap; align-items: flex-end; margin-bottom: 11px; }
.vch-form-head .fgrp { display: flex; flex-direction: column; gap: 4px; }
.vch-form-head .fgrp.grow { flex: 1 1 260px; }
.vch-form-head .fgrp label { font-size: 12px; color: #64748b; }
.vch-form-head input { height: 32px; border: 1px solid #cbd5e1; border-radius: 6px; padding: 0 10px; font-size: 12.5px; color: #0f172a; }
.vch-form-head input:focus, .vch-entry-table input:focus, .vch-entry-table select:focus { border-color: #2563eb; outline: 2px solid #bfdbfe; outline-offset: -1px; }
.vch-entry-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.vch-entry-table th { background: #f1f5f9; color: #334155; font-weight: 600; padding: 8px 8px; border: 1px solid #e2e8f0; }
.vch-entry-table td { padding: 4px 6px; border: 1px solid #eef2f7; }
.vch-entry-table input, .vch-entry-table select { width: 100%; height: 30px; border: 1px solid #cbd5e1; border-radius: 6px; padding: 0 8px; font-size: 12.5px; color: #334155; background: #fff; }
.vch-entry-table input.r { text-align: right; }
.vch-entry-table td.c, .vch-entry-table th.c { text-align: center; }
.modal:has(.vch-form) .modal-foot button { height: 32px; padding: 0 21px; font-size: 12.5px; border-radius: 6px; }
.vch-foot { display: flex; align-items: center; gap: 13px; margin-top: 11px; }
.vch-balance { font-size: 13px; color: #475569; }
.vch-balance .ok { color: #0F6E56; font-weight: 600; }
.vch-balance .bad { color: #A32D2D; font-weight: 600; }
.vch-tip { font-size: 12px; color: #64748b; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 6px; padding: 8px 10px; margin-top: 6px; }
/* 打印凭证 */
.vch-print { padding: 6px 4px; }
.vch-print-title { text-align: center; font-size: 18px; font-weight: 700; letter-spacing: 3px; color: #0f172a; margin-bottom: 6px; }
.vch-print-meta { text-align: center; font-size: 12px; color: #475569; margin-bottom: 10px; }
.vch-print-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.vch-print-table th { background: #f8fafc; border: 1px solid #cbd5e1; padding: 6px 8px; font-weight: 600; color: #334155; }
.vch-print-table td { border: 1px solid #cbd5e1; padding: 6px 8px; color: #334155; }
.vch-print-table td.r, .vch-print-table th.r { text-align: right; }
.vch-print-table tfoot td { background: #f8fafc; font-weight: 700; }
.vch-print-sign { display: flex; gap: 20px; justify-content: flex-end; font-size: 12px; color: #64748b; margin-top: 12px; }
.vch-print-void { margin-top: 8px; font-size: 12px; color: #A32D2D; }
@media print {
  body * { visibility: hidden; }
  #vch-print-area, #vch-print-area * { visibility: visible; }
  #vch-print-area { position: absolute; left: 0; top: 0; width: 100%; }
}

/* ============== 晨格 V6 配套文本工具（2026-09-08 员工预支页美化） ============== */
/* .t-bold  : 700 字重（表格/单元格关键数值加粗） */
/* .t-faint : 占位灰（"—"等无数据占位，#cbd5e1 不抢主色） */
/* .t-link  : 行内链接蓝字 12px（截图链接/资料链接） */
.t-bold  { font-weight: 700; }
.t-faint { color: #cbd5e1; }
.t-link  { color: var(--primary); font-size: 12px; }

/* 2026-09-08 移动端预支登记新增「银行户名 本人/非本人」后，列表户名 cell 与员工姓名不一致时（说明是他人银行卡）用浅黄背景提醒 */
/* 特异性层匹配 .tbl-advances.table-wrap table（0,2,3 == 0,2,3，避免被通用 .table-wrap 压过） */
.tbl-advances.table-wrap table tbody tr td.hu-warn {
  background: #fef3c7 !important;
  color: #92400e !important;
  font-weight: 600;
}

/* ============ 云服务器监控（运营监控页，2026-09-09 新增） ============ */
.svr-box {
  background: #fff;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  padding: 10px 12px;
  margin-bottom: 14px;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
}
.svr-head { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }
.svr-title { font-size: 14px; font-weight: 600; color: #1e293b; }
.svr-live { font-size: 11px; color: #94a3b8; white-space: nowrap; }
.svr-live.on { color: #16a34a; }
.svr-ts { font-size: 11px; color: #64748b; }
.svr-cards { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; margin-bottom: 10px; }
.svr-card {
  border: 1px solid #e2e8f0; border-radius: 6px; padding: 8px 10px;
  display: flex; gap: 8px; background: #f8fafc; min-width: 0;
}
.svr-card-ic { font-size: 17px; line-height: 1.3; }
.svr-card-bd { flex: 1; min-width: 0; }
.svr-card-label { font-size: 11px; color: #64748b; }
.svr-card-val { font-size: 19px; font-weight: 700; color: #0f172a; line-height: 1.25; white-space: nowrap; }
.svr-card-val.svr-warn { color: #b45309; }
.svr-card-val.svr-crit { color: #dc2626; }
.svr-card-val.svr-na  { color: #94a3b8; }
.svr-card-sub { font-size: 11px; color: #475569; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.svr-card-thr { font-size: 10px; color: #94a3b8; margin-top: 1px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.svr-chart { border: 1px solid #e2e8f0; border-radius: 6px; padding: 8px 10px 4px; background: #fff; margin-bottom: 8px; }
.svr-chart-empty { text-align: center; color: #94a3b8; padding: 20px 8px; font-size: 12px; }
.svr-svg { width: 100%; height: 116px; display: block; }
.svr-legend { display: flex; align-items: center; gap: 16px; font-size: 11px; color: #475569; padding: 3px 2px 0; flex-wrap: wrap; }
.svr-legend i { display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-right: 4px; vertical-align: baseline; }
.svr-legend-r { margin-left: auto; color: #94a3b8; }
.svr-foot { display: flex; justify-content: space-between; gap: 10px; font-size: 11px; color: #64748b; padding: 0 2px; flex-wrap: wrap; }
.svr-foot b { color: #1e293b; }
.svr-alerts { margin-top: 8px; border-top: 1px dashed #e2e8f0; padding-top: 6px; }
.svr-alerts-title { font-size: 11px; color: #94a3b8; margin-bottom: 4px; }
.svr-alert { display: flex; gap: 8px; align-items: baseline; font-size: 12px; color: #334155; padding: 2px 2px; line-height: 1.55; }
.svr-alert-k { font-weight: 600; min-width: 34px; flex-shrink: 0; }
.svr-alert-m { flex: 1; word-break: break-all; }
.svr-alert-t { color: #94a3b8; font-size: 11px; white-space: nowrap; flex-shrink: 0; }
.svr-empty { padding: 12px; text-align: center; color: #94a3b8; font-size: 12px; }
@media (max-width: 1200px) {
  .svr-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* ===== 供方管理页操作列折叠：与 .tbl-employees 逐字同款（2026-09-12 SUP3 老板截图）=====
   原样式只写了 .tbl-employees / .tbl-advances / .tbl-reimbursements，供方管理页（.tbl-contracts）
   无任何规则 → 表头 ⊟ 按钮落回浏览器默认按钮外观（灰底方块），且点不动。与 2026-09-11 报销页
   那次是同一个遗漏。此处补齐；追加在文件末尾，不插队、不影响既有规则优先级。 */
.tbl-contracts th.col-ops-th { position: relative; padding-right: 28px; }
.tbl-contracts th.col-ops-th .col-ops-toggle {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  width: 20px; height: 20px; padding: 0; line-height: 1; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #475569;
  font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center;
  transition: background .12s, border-color .12s, color .12s;
}
.tbl-contracts th.col-ops-th .col-ops-toggle:hover { background: #f1f5f9; border-color: #94a3b8; color: #1e293b; }
.tbl-contracts th.col-ops-th .col-ops-toggle:active { background: #e2e8f0; }
.tbl-contracts.col-collapsed th.col-ops-th .col-ops-th-label { display: none; }
.tbl-contracts.col-collapsed th.col-ops-th { padding-right: 2px; min-width: 16px; }
.tbl-contracts.col-collapsed td.col-ops-td { display: none; }
.tbl-contracts.col-collapsed th.col-ops-th .col-ops-toggle { background: #2563eb; color: #fff; border-color: #2563eb; width: 14px; height: 14px; right: 1px; font-size: 10.5px; line-height: 1; }

/* ══════════════════════════════════════════════════════════════════
   资金闭环「开票 → 回款 → 分账 → 毛利」（2026-09-13 新增）
   全部为新增类名（fc- 前缀），不改动任何既有选择器 → 零回归风险。
   状态色：done 绿 / doing 灰蓝 / due 橙 / overdue 红 / unset 浅灰
   ══════════════════════════════════════════════════════════════════ */
.fc-toolbar {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; margin: 0 0 10px; flex-wrap: wrap;
}
.fc-month-switch { display: flex; align-items: center; gap: 8px; }
.fc-month-btn {
  min-width: 30px; height: 28px; padding: 0 8px; border: 1px solid var(--border);
  background: var(--panel); border-radius: 6px; cursor: pointer; font-size: 13px; color: var(--text);
}
.fc-month-btn:hover { border-color: var(--primary); color: var(--primary); }
.fc-month-back { font-size: 12px; color: var(--primary); border-color: #bfdbfe; background: #eff6ff; }
.fc-month-label { font-size: 15px; font-weight: 700; letter-spacing: .3px; min-width: 76px; text-align: center; font-variant-numeric: tabular-nums; }
.fc-toolbar-right { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }

/* 2026-09-20 FIN-SPLIT L：.fc-dot* 整组下线 —— ③分账 合计格的状态排已删（状态改由整格底色表达），
   _fcDot() 与这 6 条规则一并成为死代码。
   ⚠️ 引用面已核（现役资源 js/*.js + css/styles.css + index.html）：只此一处用过；
      public/ 下同名 .bak-* 是历史备份，不算引用面。 */

/* ---- KPI 卡 ---- */
/* 2026-09-13 老板要求：整体高度压缩 50%。
   旧高 = padding 20 + border 2 + (12+19+11.5)×line-height 1.33 + margin 7 = 85.5px
   新高 = padding 8 + border 2 + 18×1.1 + 1 + 11×1.2 = 44.0px（-48.5%）
   手法：① label 与金额同排一行（三行 → 两行，这是压到一半的关键，光缩字号最多只能到 -31%）
         ② padding 10→4、字号 19→18 / 12→11.5 / 11.5→11、行高显式收紧 */
.fc-kpis { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; margin-bottom: 10px; }
.fc-kpi {
  background: var(--panel); border: 1px solid var(--border); border-radius: 8px;
  padding: 7px 11px; min-height: 50px; border-left: 3px solid var(--border); box-shadow: var(--shadow);
  display: flex; flex-wrap: wrap; align-items: baseline;
  justify-content: space-between; column-gap: 8px;
}
.fc-kpi-label { font-size: 11.5px; line-height: 1.2; color: var(--muted); }
.fc-kpi-val { font-size: 18px; line-height: 1.1; font-weight: 700; letter-spacing: -.2px; font-variant-numeric: tabular-nums; }
.fc-kpi-sub { font-size: 11px; line-height: 1.2; color: var(--muted); margin-top: 1px; flex: 1 0 100%; }
.fc-tone-blue   { border-left-color: #2563eb; } .fc-tone-blue   .fc-kpi-val { color: #1d4ed8; }
.fc-tone-green  { border-left-color: #16a34a; } .fc-tone-green  .fc-kpi-val { color: #15803d; }
.fc-tone-amber  { border-left-color: #d97706; } .fc-tone-amber  .fc-kpi-val { color: #b45309; }
.fc-tone-purple { border-left-color: #7c3aed; } .fc-tone-purple .fc-kpi-val { color: #6d28d9; }
.fc-tone-red    { border-left-color: #dc2626; } .fc-tone-red    .fc-kpi-val { color: #b91c1c; }

/* ---- 数据缺口横幅 ---- */
.fc-gaps { display: flex; flex-direction: column; gap: 6px; margin-bottom: 10px; }
.fc-gap {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 7px 11px; border-radius: 6px; font-size: 12.5px; border: 1px solid;
}
.fc-gap-warn { background: #fffbeb; border-color: #fde68a; color: #92400e; }
.fc-gap-info { background: #f0f9ff; border-color: #bae6fd; color: #075985; }
.fc-gap-btn {
  flex: 0 0 auto; height: 24px; padding: 0 10px; border-radius: 5px; cursor: pointer;
  border: 1px solid currentColor; background: rgba(255,255,255,.7); font-size: 12px; color: inherit;
}
.fc-gap-btn:hover { background: #fff; }

/* ---- 今日待办 ---- */
.fc-todos { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 9px 12px; margin-bottom: 10px; box-shadow: var(--shadow); }
.fc-todos-head { font-size: 12.5px; font-weight: 700; margin-right: 10px; }
.fc-todos-head b { color: #dc2626; }
.fc-todos-list { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 7px; }
.fc-todo {
  display: inline-flex; align-items: center; gap: 5px; padding: 4px 9px; border-radius: 999px;
  font-size: 12px; cursor: pointer; border: 1px solid; white-space: nowrap;
}
.fc-todo b { font-weight: 700; }
.fc-todo em { font-style: normal; font-size: 11px; opacity: .8; }
.fc-todo-urgent { background: #fef2f2; border-color: #fecaca; color: #b91c1c; }
.fc-todo-warn   { background: #fffbeb; border-color: #fde68a; color: #92400e; }
.fc-todo:hover { filter: brightness(.96); box-shadow: 0 1px 4px rgba(0,0,0,.10); }
.fc-todos-empty { display: flex; align-items: center; gap: 10px; }
.fc-todos-none { font-size: 12.5px; color: #15803d; }

/* ---- 未匹配桶 ---- */
.fc-unmatched { margin-bottom: 10px; border-left: 3px solid #d97706; padding: 9px 12px; }
.fc-unmatched-head { font-size: 12.5px; font-weight: 700; color: #92400e; }
.fc-unmatched-list { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 7px; }
.fc-unmatched-item { font-size: 12px; background: #fffbeb; border: 1px solid #fde68a; color: #92400e; padding: 4px 9px; border-radius: 6px; }

/* ---- 主表 ---- */
.fc-table-panel { padding: 0; overflow: hidden; }
.fc-table { width: 100%; border-collapse: collapse; table-layout: fixed; }
/* 2026-09-13 老板要求：表格行高适当压缩。
   ⚠️ 原来这两条写作 .fc-table th / .fc-table td（特异性 0,1,1），被
   `.table-wrap table thead th` / `.table-wrap table tbody td`（0,1,3）压过，
   从来没生效过 —— 实际一直在用 .table-wrap 那套：padding 8px/14px、字号 12.5px、居中。
   现改用 .fc-table-panel .fc-table th / td（0,2,1）真正接管本表，只压上下 padding 与行高，
   左右 14px、居中、字号 12.5px 与压缩前的实际视觉保持一致（不引入额外视觉变化）。 */
.fc-table-panel .fc-table th {
  background: #f1f5f9; color: #334155; font-weight: 600; font-size: 12.5px; letter-spacing: .3px;
  padding: 6px 14px; text-align: center; border-bottom: 1px solid #e2e8f0; white-space: nowrap;
}
.fc-th-unit { width: auto; }   /* E 批：列宽一律由 <colgroup> 决定；
   原写 width:17% 在展开态与 col 的 15% 互相矛盾（col 赢，但留雷） */
.fc-th-pay { width: 22%; }

/* ===== 2026-09-19 FIN-SPLIT：财务总览 ③ 分账 细拆 6 子列 + 序号列 + 公司本级行 ===== */
.fc-table .fc-th-pay { width: auto; }
.fc-table thead .fc-h2 th { font-size: 11px; padding: 3px 6px; font-weight: 600; }
.fc-seq, .fc-th-seq { width: 42px; min-width: 42px; text-align: center; color: #6b7280; font-size: 12px; }
.fc-pay-sub { text-align: center; vertical-align: middle; padding: 4px 6px; white-space: nowrap; }
.fc-pay-sub .fc-pay-v { font-size: 12px; font-weight: 700; color: #9ca3af; line-height: 1.5; }
.fc-pay-sub.fc-pay-on .fc-pay-v { color: #15803d; }
/* 2026-09-28 FCGOSAL：③分账「员工工资」格 = 入口（点一下跳该单位的「工资计算」）。
   ⚠️ 只这一格带 .fc-pay-go（10-misc.js 的 sub() 只在传了第 4 参时才加），其余 4 个子列不受影响。
   ⚠️ hover 底色必须**带满作用域**：.fc-pay-sub.fc-pay-on 的绿底是
      `.fc-table-panel .fc-table tbody td.fc-pay-sub.fc-pay-on`（0,4,2），
      裸写 `.fc-pay-go:hover`（0,2,0）压不过它 ⇒ 有钱的格子 hover 不变色、没钱的变，观感不齐。
      下面这条是 (0,5,2)，两类格子都压得住。 */
.fc-table-panel .fc-table tbody td.fc-pay-sub.fc-pay-go { cursor: pointer; }
.fc-table-panel .fc-table tbody td.fc-pay-sub.fc-pay-go:hover { background: #dbeafe; }
/* 2026-09-20 FIN-SPLIT N（老板口径「底色铺『合计格 + 有钱的分项格』」）：
   分项格里**有金额**的格子也铺浅绿底 —— 让「钱在哪一格」一眼可见。
   改前 .fc-pay-on 只染字色、底色只铺「合计」格 ⇒ 观感是「色在合计、钱在分项」，老板判为「颜色标反」。
   本批把底色跟着钱走。
   ⚠️ 只对有金额的格生效（app.js 的 sub() 只在 amt > 0 时加 .fc-pay-on）；「—」格一律保持原底。
   ⚠️ 特异性 (0,4,2) 与 ③分账「合计格」那组写法一致：压过
      .table-wrap table tbody tr:nth-child(even) td 的 (0,2,4) 与 .fc-row:hover td 的 (0,2,1)。
   ⚠️ 色值取 #dcfce7（= 老板口径里的「同色浅底」）。若日后要区分「状态绿 / 有值绿」，
      只改这一行即可（纯静态件、零重启）。 */
.fc-table-panel .fc-table tbody td.fc-pay-sub.fc-pay-on { background: #dcfce7; }
/* ===== 2026-09-20 FINSPLIT-F：公司本级汇总卡（老板口径「公司本级 单独分出来」）=====
   ← 原 .fc-row-company（表内最后一行）三条规则已随行移出主表一并删除，避免死规则留雷。 */
.fc-company-card { margin-top: 10px; border: 1px solid #e2e8f0; border-radius: 8px; background: #fff; overflow: hidden; }
.fc-cc-head { display: flex; align-items: center; gap: 8px; padding: 9px 14px; background: #f8fafc; border-bottom: 1px solid #e2e8f0; }
.fc-cc-title { font-size: 13.5px; font-weight: 700; color: #0f172a; }
.fc-cc-tag { font-size: 11px; line-height: 1.5; color: #475569; background: #e2e8f0; border-radius: 10px; padding: 0 8px; white-space: nowrap; }
.fc-cc-total { margin-left: auto; font-size: 12px; color: #64748b; white-space: nowrap; }
.fc-cc-total b { font-size: 15px; color: #b45309; font-variant-numeric: tabular-nums; }
.fc-cc-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px; background: #eef2f7; }
.fc-cc-item { background: #fff; padding: 9px 14px; min-width: 0; }
.fc-cc-lb { font-size: 11px; color: #6b7280; line-height: 1.3; margin-bottom: 3px; }
.fc-cc-v { font-size: 14px; font-weight: 700; color: #9ca3af; line-height: 1.4; font-variant-numeric: tabular-nums; }
.fc-cc-item.fc-cc-on .fc-cc-v { color: #15803d; }
.fc-cc-foot { padding: 7px 14px; font-size: 11px; line-height: 1.5; color: #64748b; background: #f8fafc; border-top: 1px solid #e2e8f0; }

/* ══════════════════════════════════════════════════════════════════
   2026-09-20 FINSPLIT-K：公司本级卡 → 税费台账（三层分类 + 默认折叠 + 就地录入）
   ⚠️ 折叠是**整卡重渲染**（不是 CSS 藏）：与右侧明细列折叠同一套语言，
      且折叠后高度**真的回收**（CSS 藏只是让内容不可见、高度还在）。
   ⚠️ 绿值沿用系统既有「已完成」绿 #15803d（同 G/J 批），不另造色。
   ⚠️ .fc-cc-grid 由 4 列改 3 列（「月度税费」已升级为上方台账 + 另三项并列保留）——
      用 (0,2,0) 特异性压过 F 批的 (0,1,0)，且源码顺序在其后。
   ══════════════════════════════════════════════════════════════════ */
.fc-company-card .fc-cc-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.fc-cc-foldbtn { width: 20px; height: 20px; line-height: 1; padding: 0; flex: none; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #475569; font-size: 12px; }
.fc-cc-foldbtn:hover { background: #eff6ff; border-color: #93c5fd; }
.fc-cc-collapsed { padding: 7px 14px; font-size: 11px; color: #94a3b8; background: #fff; }
.fc-cc-body { background: #fff; }
.fc-cc-sec { padding: 7px 14px 5px; font-size: 11px; color: #475569; background: #f8fafc; border-top: 1px solid #e2e8f0; }
.fc-cc-body > .fc-cc-sec:first-child { border-top: 0; }
.fc-cc-warn { color: #b45309; }
.fc-cc-groups { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1px; background: #eef2f7; }
.fc-cc-grp { background: #fff; padding: 8px 12px 10px; min-width: 0; }
.fc-cc-gh { font-size: 11.5px; font-weight: 700; color: #1d4ed8; line-height: 1.4;
  margin-bottom: 4px; padding-bottom: 3px; border-bottom: 1px dashed #e2e8f0; }
.fc-cc-row { display: flex; align-items: center; gap: 6px; padding: 2px 0; }
.fc-cc-rk { font-size: 11.5px; color: #475569; flex: 1 1 auto; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fc-cc-cv { display: inline-block; flex: none; min-width: 78px; text-align: right;
  padding: 1px 6px; border-radius: 4px; }
.fc-cc-cv-v { font-size: 12px; font-weight: 700; color: #9ca3af; font-variant-numeric: tabular-nums; }
.fc-cc-cv-on .fc-cc-cv-v { color: #15803d; }
.fc-cc-cv-edit { cursor: pointer; }
.fc-cc-cv-edit:hover { background: #eff6ff; box-shadow: inset 0 0 0 1px #93c5fd; }
.fc-cal-btn { width: 100%; padding: 4px 6px; }
.fc-cal-btn-off { opacity: .72; }
.fc-settle-cell .fc-cell-sub { white-space: nowrap; }
.fc-table-panel .fc-table tbody td {
  padding: 4px 14px; font-size: 12.5px; color: #1e293b;
  border-bottom: 1px solid #f1f5f9; line-height: 1.25;
}
.fc-row { border-left: 3px solid transparent; }
.fc-row:hover td { background: #f8fafc; }
.fc-row-overdue { border-left-color: #dc2626; }
.fc-row-due     { border-left-color: #d97706; }
.fc-row-doing   { border-left-color: #94a3b8; }
.fc-row-done    { border-left-color: #16a34a; }
.fc-row-unset   { border-left-color: #cbd5e1; }

.fc-unit-name { font-size: 13px; font-weight: 600; line-height: 1.3; }
.fc-unit-tags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 3px; }
.fc-tag { font-size: 10.5px; line-height: 1.25; color: var(--muted); background: #f1f5f9; border-radius: 4px; padding: 0 6px; }
.fc-tag-warn { background: #fffbeb; color: #92400e; }

.fc-cell { font-size: 12px; }
/* 2026-09-20 FIN-SPLIT L：.fc-cell-top / .fc-badge 下线（同上的状态排删除，双双成死规则）。 */
.fc-cell-val { font-size: 13px; line-height: 1.2; font-weight: 700; font-variant-numeric: tabular-nums; }
.fc-cell-sub { font-size: 10.5px; line-height: 1.2; color: var(--muted); margin-top: 1px; }

/* 2026-09-20 FIN-SPLIT O：④毛利 格第一排 =「毛利金额 + 毛利率」（老板截图小红框位置）。
   老板口径：**只保留数字**（不写「毛利率」三个字）+ 字号**加大、加粗**。
   ⚠️ 只加在 .fc-profit-cell 下，**不动** ①开票/②回款/预支垫付/结清补发 的 .fc-cell-val。
   ⚠️ 必须是**内联**元素、跟在金额同一排（不换行、不占新排）：本格 td 是 text-align:center，
      内联元素直接跟着居中排；改成 flex / 独占一排会分别导致「金额跳到左侧」与
      「行高 42px→54px」两种回归（均已实测）。
   ⚠️ nowrap 是**兜底**：保证任何金额长度下这一格都只有一排 ⇒ **行高永不因本批改变**
      （J 批「一屏恒 25 条」）。极端长值时最多是内容略微溢出，绝不顶高整行。
   ⚠️ 12.5px 是实测档位：老板屏 1785 下折叠态与展开态都不换行（内容区 143px / 需要 123px）。 */
.fc-table-panel .fc-table tbody td.fc-profit-cell .fc-cell-val { white-space: nowrap; }
.fc-table-panel .fc-table tbody td.fc-profit-cell .fc-profit-rate {
  margin-left: 6px; font-size: 12.5px; font-weight: 700; line-height: 1.2;
  color: #475569; white-space: nowrap; font-variant-numeric: tabular-nums;
}
/* 2026-09-20 FIN-SPLIT L：.fc-st-*.fc-badge 三条下线（.fc-badge 已无人用）。
   ⚠️ **下面那条 .fc-st-overdue .fc-cell-val 不能删** —— .fc-cell-val 是 ①开票 / ②回款 的主值元素，
      两列的状态格（app.js:7988 _fcInvCell）至今仍带 fc-st-* 类名，本条是活规则。 */
.fc-st-overdue .fc-cell-val { color: #b91c1c; }
.fc-cell-click { cursor: pointer; }
.fc-cell-click:hover { background: #eff6ff !important; }

/* ── FIN-SPLIT G（2026-09-20 老板口径）───────────────────────────────────
   ①开票 / ②回款 两列：完成态**不写「已完成」文字**，改整格浅绿底；未完成态的状态文字
   并进日期行（「未到期 · 9月28日」）⇒ 两列都只剩 2 排，行高 52px → 约 40px。
   ⚠️ 上面这句描述的是 **G 批当时**的历史形态；**M 批起这两列的副文字排已整个下线**（每格只剩 1 排），
      现状请看下方 M 批那组规则与 app.js 的 `_fcStageCell`。
   ⚠️ 状态色语义必须补到 .fc-cell-sub 上：原来是 .fc-badge 着色，文字搬到 sub 后不补规则，
      「即将到期 / 已逾期」的橙 / 红会**静默丢失**（取值类改动要读回真值，别只看声明）。
   ⚠️ 绿值**不另造**：沿用本系统既有的「已完成」绿 #dcfce7 —— 既有的
      `.badge.已完成{background:#dcfce7}`、开票管理页 `.inv-cell.inv-done{background:#dcfce7}`
      用的是同一个绿，财务总览这一列改成同色，全站「已完成 = 这个绿」口径一致。hover 用绿-200。
   ⚠️ 特异性核对：底色规则 (0,4,2) 要压过 .table-wrap table tbody tr:nth-child(even) td
      的 (0,2,4)，以及 .fc-row:hover td 的 (0,2,1)；而 .fc-cell-click:hover 带 !important，
      所以完成格的 hover 覆盖也必须带 !important，否则鼠标一上去就闪回蓝色。 */
.fc-table-panel .fc-table tbody td.fc-invoice-cell.fc-cell-done,
.fc-table-panel .fc-table tbody td.fc-collect-cell.fc-cell-done { background: #dcfce7; }
.fc-table-panel .fc-table tbody td.fc-cell-done.fc-cell-click:hover { background: #bbf7d0 !important; }

/* ── FIN-SPLIT H/I（2026-09-20 老板口径：「红框（③分账）的设置都按绿框（①开票/②回款）来」
       → 随后「上一部按 V1 重做」把浅绿收回到**只有状态格**）──
   完成行的 ③分账：**浅绿只铺「状态格」这一格**；员工工资/内部工资/供方费用/员工保险/内部报销/月度税费
   六个子列**一律白底**（H 批的 V3「整行 7 格全绿」已作废，本批 V1）。
   格内不再写「● 发薪 已完成」，也不重复印列名 —— 与 ①开票 的「完成 = 浅绿、无文字」同一口径。
   ⚠️ 绿值沿用系统既有「已完成」绿 #dcfce7（同 G 批），不另造色。
   ⚠️ 特异性 (0,4,2) 压过 .table-wrap table tbody tr:nth-child(even) td 的 (0,2,4)
      与 .fc-row:hover td 的 (0,2,1)；③分账 格**不可点**（无 .fc-cell-click），故无需 !important。
   ⚠️ 未完成行**保持原样**：状态格仍「● 发薪 未到期」+「合计」，子列只留金额 —— 只有完成行的状态格铺绿。
   🧹 死规则清理：`.fc-pay-sub .fc-pay-lb`（列名，H 批删）＋ `.fc-legend`/`.fc-lg`（页头图例，I 批删）——
      两者全站引用面均已核：只有 js/app.js 与 css/styles.css，无第三方页面依赖。 */
.fc-table-panel .fc-table tbody td.fc-payst-cell.fc-cell-done { background: #dcfce7; }
/* 2026-09-20 FIN-SPLIT L（老板口径「即将到期的用淡黄色标记 不要出现文字」）：
   ③分账 合计格的状态**只靠底色说话**，格内不再有任何状态文字（状态排已删）——
     未到期（doing） → 无色（默认，不写规则）
     即将到期（due） → 淡黄 #fffbeb  ← 与既有 .fc-tag-warn 同一个黄，全站「待办黄」口径一致
     已逾期（overdue）→ 淡红 #fef2f2
     已完成（done）  → 浅绿 #dcfce7（沿用，未动）
   ⚠️ 只铺「合计格」这一格（.fc-payst-cell），子列依旧白底 —— I 批 V1 口径不变。
   ⚠️ 特异性 (0,4,2)：压过 .table-wrap table tbody tr:nth-child(even) td 的 (0,2,4) 与
      .fc-row:hover td 的 (0,2,1) ⇒ 偶数行的斑马纹 / 悬停灰不会盖掉这个黄。
   ⚠️ 与 .fc-cell-done 同为 (0,4,2) 但状态互斥（一格只有一个 fc-st-*），不会打架。
   ⚠️ 2026-09-20 FIN-SPLIT M 起：①开票 / ②回款 **也改成同一口径**（老板新红框指的正是这两列）
      —— 见紧接在下面的 M 批那组规则。 */
.fc-table-panel .fc-table tbody td.fc-payst-cell.fc-st-due     { background: #fffbeb; }
.fc-table-panel .fc-table tbody td.fc-payst-cell.fc-st-overdue { background: #fef2f2; }
/* 2026-09-20 FIN-SPLIT M（老板口径「未到期 这三个字不用提示了 / 平时显示 — 就行了 / 即将到期标黄」）：
   ①开票 / ②回款 两列的第二排（状态 · 日期）已整排下线 ⇒ 状态**只靠底色说话**：
     未到期（doing）  → 无色（默认，不写规则）
     即将到期（due）  → 淡黄 #fffbeb   ← 与 ③分账 / .fc-tag-warn 同一个黄，全站「待办黄」口径一致
     已逾期（overdue）→ 淡红 #fef2f2
     已完成（done）   → 浅绿 #dcfce7（**沿用上面那条 .fc-cell-done，未动**）
   ⚠️ 特异性 (0,4,2)：压过 .table-wrap table tbody tr:nth-child(even) td 的 (0,2,4) 与
      .fc-row:hover td 的 (0,2,1) —— 与 ③分账 那条写法一致，不另造特异性。
   🧹 死规则清理：原 `.fc-st-due .fc-cell-sub` / `.fc-st-overdue .fc-cell-sub` 两条**已删** ——
      它们只可能命中 ①② 的副文字排，副文字排下线后全站再无匹配元素。
      （`.fc-cell-sub` 本身**仍在用**：预支垫付 / 结清补发 两列各有一排；④毛利 列**只剩未回款行**
       的「待回款」一排 —— 2026-10-09 FCPROFIT2 起已回款行的公式说明整排下线。这几列均不带 fc-st-*。）
   ⚠️ `.fc-st-overdue .fc-cell-val { color: #b91c1c }` **仍保留** —— ①② 主值元素仍带 fc-st-*，
      已逾期行的「—」/金额依旧走红字。 */
.fc-table-panel .fc-table tbody td.fc-invoice-cell.fc-st-due,
.fc-table-panel .fc-table tbody td.fc-collect-cell.fc-st-due     { background: #fffbeb; }
.fc-table-panel .fc-table tbody td.fc-invoice-cell.fc-st-overdue,
.fc-table-panel .fc-table tbody td.fc-collect-cell.fc-st-overdue { background: #fef2f2; }
.fc-val-warn { color: #b45309; }
.fc-val-good { color: #15803d; }
.fc-val-bad  { color: #b91c1c; }

/* 2026-10-09 FCPROFIT2（老板口径，附截图：「待回款 整个框体标黄」）——
   ④实际利润 格：**未回款单位**（collect.done=false）整格浅黄底，色值 #fffbeb
   （与 ①开票 / ②回款 / ③分账 的「待办黄」、.fc-tag-warn **同一个黄**，全站口径一致）。
   ⚠️ 特异性 (0,4,2)：与同段 .fc-cell-done / .fc-st-due 组**同级**，压过
      .fc-row:hover td 的 (0,2,1) 与表格偶数行斑马纹的 (0,2,4) ⇒ 悬停/斑马纹都不会盖掉这个黄。
   ⚠️ 本格**不可点**（无 .fc-cell-click）⇒ 无需 !important（对照上面 .fc-cell-done 那条）。
   ⚠️ 类名刻意不用 fc-st-due：fc-st-* 是 ①②③ 的**状态机**语义（doing/due/overdue），
      ④ 没有状态机；且 .fc-st-due 的规则全部绑定在 .fc-payst-cell / .fc-invoice-cell /
      .fc-collect-cell 上，加到 ④ 根本不会命中（写了等于没写）。 */
.fc-table-panel .fc-table tbody td.fc-profit-cell.fc-profit-pending { background: #fffbeb; }

.fc-pay-chips { display: grid; grid-template-columns: 1fr 1fr; gap: 1px 6px; }
.fc-chip {
  font-size: 10.5px; line-height: 1.2; color: var(--muted); background: #f8fafc; border: 1px solid #eef2f7;
  border-radius: 4px; padding: 0 5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  font-variant-numeric: tabular-nums;
}
.fc-chip-on { background: #f0fdf4; border-color: #bbf7d0; color: #15803d; }
.fc-pay-total { font-size: 11.5px; line-height: 1.2; font-weight: 700; margin-top: 1px; font-variant-numeric: tabular-nums; }

.fc-cal-tags { display: flex; flex-wrap: wrap; gap: 4px; }
.fc-cal-tag { font-size: 11px; line-height: 1.25; background: #eff6ff; color: #1d4ed8; border-radius: 4px; padding: 0 6px; font-variant-numeric: tabular-nums; }
.fc-cal-off { background: #f1f5f9; color: #94a3b8; }
.fc-cal-edit {
  margin-top: 3px; height: 20px; padding: 0 8px; font-size: 11.5px; cursor: pointer;
  border: 1px solid var(--border); background: var(--panel); border-radius: 5px; color: var(--muted);
}
.fc-cal-edit:hover { border-color: var(--primary); color: var(--primary); background: #eff6ff; }

.fc-empty, .fc-loading { padding: 28px; text-align: center; color: var(--muted); font-size: 13px; }
.fc-empty-row { text-align: center; color: var(--muted); padding: 24px !important; }

/* ---- 按钮 ---- */
.fc-btn {
  height: 28px; padding: 0 12px; border-radius: 6px; cursor: pointer; font-size: 12.5px;
  border: 1px solid var(--border); background: var(--panel); color: var(--text);
}
.fc-btn:hover { border-color: #94a3b8; }
.fc-btn-primary { background: var(--primary); border-color: var(--primary); color: #fff; }
.fc-btn-primary:hover { background: var(--primary-dark); border-color: var(--primary-dark); }
.fc-btn:disabled { opacity: .6; cursor: not-allowed; }

.fc-busy {
  position: fixed; left: 50%; top: 20px; transform: translateX(-50%); z-index: 2000;
  background: rgba(31,41,55,.92); color: #fff; padding: 8px 16px; border-radius: 8px; font-size: 13px;
  box-shadow: 0 6px 20px rgba(0,0,0,.25);
}

/* ---- 结算日历弹窗 ---- */
.fc-cal-panel {
  background: var(--panel); border-radius: 12px; width: 420px; max-width: 94vw;
  box-shadow: 0 20px 60px rgba(0,0,0,.3); overflow: hidden;
}
.fc-cal-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid var(--border); }
.fc-cal-title { font-size: 14px; font-weight: 700; }
.fc-cal-close { background: none; border: none; font-size: 18px; cursor: pointer; color: var(--muted); }
.fc-cal-hint { padding: 10px 16px 0; font-size: 12px; color: var(--muted); line-height: 1.6; }
.fc-cal-form { padding: 12px 16px 4px; display: flex; flex-direction: column; gap: 5px; }
.fc-cal-form label { font-size: 12.5px; color: var(--muted); margin-top: 6px; }
.fc-cal-form input {
  height: 30px; border: 1px solid var(--border); border-radius: 6px; padding: 0 9px; font-size: 13px;
  font-variant-numeric: tabular-nums;
}
.fc-cal-form input:focus { outline: none; border-color: var(--primary); }
.fc-cal-foot { display: flex; justify-content: flex-end; gap: 8px; padding: 14px 16px; border-top: 1px solid var(--border); margin-top: 10px; }

/* ---- 发票导入弹窗 ---- */
.fc-imp-panel {
  background: var(--panel); border-radius: 12px; width: 480px; max-width: 94vw; max-height: 90vh;
  overflow: auto; box-shadow: 0 20px 60px rgba(0,0,0,.3);
}
.fc-imp-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid var(--border); }
.fc-imp-title { font-size: 14px; font-weight: 700; }
.fc-imp-close { background: none; border: none; font-size: 18px; cursor: pointer; color: var(--muted); }
.fc-imp-file { padding: 10px 16px 0; font-size: 12.5px; color: var(--text); }
.fc-imp-size { color: var(--muted); font-size: 11.5px; }
.fc-imp-ocr { margin: 10px 16px 0; background: #f8fafc; border: 1px solid var(--border); border-radius: 8px; padding: 9px 11px; }
.fc-imp-ocr-head { font-size: 11.5px; color: var(--muted); margin-bottom: 6px; }
.fc-imp-row { display: flex; justify-content: space-between; gap: 10px; font-size: 12.5px; padding: 2px 0; }
.fc-imp-k { color: var(--muted); flex: 0 0 auto; }
.fc-imp-v { font-weight: 600; text-align: right; word-break: break-all; }
.fc-imp-hit { margin: 10px 16px 0; padding: 7px 10px; border-radius: 6px; font-size: 12.5px; background: #f0fdf4; border: 1px solid #bbf7d0; color: #15803d; }
.fc-imp-miss { background: #fffbeb; border-color: #fde68a; color: #92400e; }
.fc-imp-form { padding: 12px 16px 0; display: flex; flex-direction: column; gap: 5px; }
.fc-imp-form label { font-size: 12.5px; color: var(--muted); margin-top: 6px; }
.fc-imp-form input, .fc-imp-form select {
  height: 30px; border: 1px solid var(--border); border-radius: 6px; padding: 0 9px; font-size: 13px; background: #fff;
}
.fc-imp-form input:focus, .fc-imp-form select:focus { outline: none; border-color: var(--primary); }
.fc-imp-tip { margin: 12px 16px 0; font-size: 11.5px; color: var(--muted); line-height: 1.6; }
.fc-imp-foot { display: flex; justify-content: flex-end; gap: 8px; padding: 14px 16px; border-top: 1px solid var(--border); margin-top: 12px; }

/* 窄屏（<1280px）降级：KPI 两行、分账 chip 单列 */
@media (max-width: 1280px) {
  .fc-kpis { grid-template-columns: repeat(3, 1fr); }
  .fc-pay-chips { grid-template-columns: 1fr; }
}

/* ==========================================================================
   2026-09-13 用工单位管理：「合作状态」徽标 + 「已暂停用人单位」折叠区
   —— 加在文件末尾，同特异性下靠源码顺序覆盖上方通用按钮样式。
   —— 选择器一律锚在 .coop-badge / .cc-paused-* 上，不碰通用 .badge / .btn-sm，
      因此不会波及其他页面（供方管理、员工台账等沿用原样式）。
   —— 2026-09-14 订正：折叠区表头原为 text-align:left、数据为 center，两行错位
      （实测文字中心最大偏差 198.7px）；现表头与数据一律居中，且 td 也显式声明，
      不再依赖上游全局规则，防其变动时又错位。
   ========================================================================== */

/* 状态徽标：既是展示（无 edit 权限时）也是按钮（可点击切换） */
.coop-badge {
  display: inline-block; padding: 2px 10px; border-radius: 999px;
  font-size: 12px; font-weight: 500; white-space: nowrap; line-height: 1.6;
  border: 1px solid transparent; font-family: inherit;
}
button.coop-badge { cursor: pointer; }
button.coop-badge:hover { filter: brightness(0.96); }
.coop-badge.coop-active { background: #dcfce7; color: #15803d; border-color: #bbf7d0; }
.coop-badge.coop-paused { background: #f1f5f9; color: #475569; border-color: #e2e8f0; }
button.coop-badge.coop-paused:hover { background: #e2e8f0; }

/* 「已暂停用人单位」折叠区：原生 details，不写 open 即默认折叠 */
.cc-paused-box {
  margin-top: 16px; border: 1px solid var(--border); border-radius: 8px;
  background: #fff; overflow: hidden;
}
.cc-paused-box > summary {
  cursor: pointer; padding: 10px 14px; font-size: 13px; font-weight: 600;
  color: #334155; display: flex; align-items: center; gap: 8px;
  list-style: none; user-select: none;
}
.cc-paused-box > summary::-webkit-details-marker { display: none; }
.cc-paused-box > summary::before {
  content: '▸'; font-size: 11px; color: #94a3b8;
  display: inline-block; transition: transform .15s;
}
.cc-paused-box[open] > summary::before { transform: rotate(90deg); }
.cc-paused-box > summary:hover { background: #f8fafc; }
.cc-paused-cnt {
  display: inline-block; min-width: 18px; padding: 0 6px; border-radius: 999px;
  background: #e2e8f0; color: #475569; font-size: 11.5px; font-weight: 700; text-align: center;
}
.cc-paused-hint { margin-left: auto; font-weight: 400; font-size: 11.5px; color: var(--muted); }
.cc-paused-body { border-top: 1px solid var(--border); }
.cc-paused-tbl { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.cc-paused-tbl th {
  text-align: center; padding: 8px 14px; background: #f8fafc; color: #475569;
  font-weight: 600; font-size: 12px; border-bottom: 1px solid var(--border);
}
.cc-paused-tbl td { text-align: center; padding: 8px 14px; border-bottom: 1px solid #f1f5f9; color: #334155; }
.cc-paused-tbl tr:last-child td { border-bottom: none; }
.cc-paused-tbl .empty { text-align: center; color: var(--muted); padding: 14px; }
.btn-coop-resume { font-size: 12.5px; background: #dbeafe; color: #1d4ed8; border-color: #bfdbfe; }
.btn-coop-resume:hover { background: #bfdbfe; }

/* ==========================================================================
   2026-09-14（SADM）用工单位管理页：
     ① 驻厂管理员拆「主 / 副」两列 —— 副列 1-2 人【上下叠放】，两个标签【宽度一致】
     ② 表头「操作」右侧 ⊟ 折叠按钮补齐（此前只渲染了按钮，CSS 没覆盖 → 看得见点不动）
   追加在文件末尾：同特异性下靠源码顺序覆盖上方规则；选择器一律锚在
   .tbl-client_companies / .sa-* 上，不碰通用 .badge / .btn-sm / .col-ops-*（员工管理页沿用原样式）。
   ========================================================================== */

/* ---- 主/副驻厂单元格：横向「标签 + 加号」，不换行 ---- */
.tbl-client_companies .sa-cell-main,
.tbl-client_companies .sa-cell-deputy { flex-wrap: nowrap; max-width: none; gap: 4px; }
/* 副驻厂 2 人上下叠放；align-items:stretch 让两个标签宽度一致（都撑到最宽那个）*/
.tbl-client_companies .sa-stack { display: flex; flex-direction: column; align-items: stretch; gap: 3px; }
.tbl-client_companies .sa-stack .sa-tag { justify-content: center; }
/* 只有主、没有副时副列占位的独立加号（弱化，不抢视觉）*/
.tbl-client_companies .sa-add-solo { opacity: 0.28; }
.tbl-client_companies .sa-add-solo:hover { opacity: 1; }
/* 主副全空时副列占位符 */
.tbl-client_companies .sa-none { color: #cbd5e1; font-size: 12px; }

/* ===== 用工单位管理页操作列折叠：与 .tbl-employees 逐字同款（2026-09-14 SADM 老板截图）=====
   同款遗漏第三次复发（报销 09-11 / 供方 09-12 / 用工单位 09-14）：都只渲染了表头 ⊟ 按钮，
   而 CSS 与点击事件都没覆盖该资源类 → 按钮「看得见点不动」。此处补齐 CSS，
   事件绑定见 app.js 的 .tbl-client_companies .col-ops-toggle 白名单，两者必须成对维护。 */
.tbl-client_companies th.col-ops-th { position: relative; padding-right: 28px; }
.tbl-client_companies th.col-ops-th .col-ops-toggle {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  width: 20px; height: 20px; padding: 0; line-height: 1; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #475569;
  font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center;
  transition: background .12s, border-color .12s, color .12s;
}
.tbl-client_companies th.col-ops-th .col-ops-toggle:hover { background: #f1f5f9; border-color: #94a3b8; color: #1e293b; }
.tbl-client_companies th.col-ops-th .col-ops-toggle:active { background: #e2e8f0; }
.tbl-client_companies.col-collapsed th.col-ops-th .col-ops-th-label { display: none; }
.tbl-client_companies.col-collapsed th.col-ops-th { padding-right: 2px; min-width: 16px; }
.tbl-client_companies.col-collapsed td.col-ops-td { display: none; }
.tbl-client_companies.col-collapsed th.col-ops-th .col-ops-toggle { background: #2563eb; color: #fff; border-color: #2563eb; width: 14px; height: 14px; right: 1px; font-size: 10.5px; line-height: 1; }

/* ===== PAUSE（2026-09-14）：用工单位管理「驻厂管理员」列叠放标签框压缩 =====
   老板反馈：1-2 个「副驻厂」标签上下叠放时，整行被撑高（红框处）。
   口径：只压 .tbl-client_companies 内的 sa-tag / sa-stack；**不动全局 .sa-tag**
        （表外与 .sa-merged 等场景沿用原尺寸），也不动字号（保持 12px 可读）。
   数值：sa-tag 纵向 padding 1px→0、line-height 1.6→1.3；sa-stack 间距 3px→2px。
   说明：本规则在文件末尾，特异性与前面同（.tbl-client_companies .sa-tag），后者胜。
   实测（真浏览器，见交付卡）：单标签 ~23.2px → ~18.0px；两标签叠放 ~49.4px → ~38.0px。 */
.tbl-client_companies .sa-stack { gap: 2px; }
.tbl-client_companies .sa-tag { padding: 0 4px 0 3px; line-height: 1.3; }
.tbl-client_companies .sa-tag b { line-height: 1.3; }

/* 2026-09-14 SAW 驻厂管理员标签「姓名区统一三字宽」
   需求：不是三个汉字（或 6 个字符）的姓名，都拉到三个汉字一样的宽度（12.5px 字号下 1 汉字 = 1em = 12.5px，
   故 3 汉字 = 3em = 37.5px，6 个英文字符约同宽）；不足者居中补齐，超过三字的名字自然撑开、不截断、不省略号。
   口径：只作用于 .tbl-client_companies 表内 .sa-tag 的 .sa-name；
   不动全局 .sa-tag / 不动徽标 b / 不动 .sa-add / .sa-rm / .sa-stack 的等宽拉伸逻辑。 */
.tbl-client_companies .sa-tag .sa-name { display: inline-block; min-width: 3em; text-align: center; }

/* ===== 2026-09-15 ADV-FILTER：员工预支页顶部筛选栏（借款时间 + 搜索）=====
   老板口径「跟员工管理上一样」⇒ **逐条照抄员工管理 #inline-filters 的取值**
   （高度 28px / padding 2px 8px / 12px 字号 / #cbd5e1 边框 / 6px 圆角 /
     min-width 125px · max-width 170px / hover · focus / placeholder / 去掉原生外观 / 去掉搜索框 ×）。
   ⚠️ 刻意**不**照抄本页系的 #wi-/#ie-inline-filters —— 那两个是「同型」的轻量版
      （padding 2px 6px、min-width 110px、无 hover/focus），看起来会比员工管理页略糙。
   独立 id 的写法沿用本文件已有惯例（#wi-inline-filters / #ie-inline-filters）：
   #inline-filters 这个名字由 app.js 的 renderList 独占，两页同时存在同名 id 会串味。
   ⚠️ 改任一侧请两边一起改（见 _af_check.py 的 E 组机检），否则两页筛选栏会长得不一样。 */
.view-head #ad-filters { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; padding-left: 24px; }
.view-head #ad-filters .fl { display: inline-flex; align-items: center; gap: 4px; font-size: 12.5px; color: #334155; white-space: nowrap; margin: 0; }
.view-head #ad-filters input[type="date"],
.view-head #ad-filters input[type="search"] {
  height: 28px; padding: 2px 8px; font-size: 12px; font-family: inherit; border: 1px solid #cbd5e1; border-radius: 6px;
  background: #fff; color: #0f172a; min-width: 125px; max-width: 170px;
  box-sizing: border-box; outline: none;
  transition: border-color .15s, box-shadow .15s;
  -webkit-appearance: none; appearance: none;
}
.view-head #ad-filters input[type="search"]::-webkit-search-cancel-button,
.view-head #ad-filters input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; appearance: none; }
.view-head #ad-filters input[type="search"]::placeholder { color: #94a3b8; }
.view-head #ad-filters input[type="date"]:hover,
.view-head #ad-filters input[type="search"]:hover { border-color: #94a3b8; }
.view-head #ad-filters input[type="date"]:focus,
.view-head #ad-filters input[type="search"]:focus { border-color: #2563eb; box-shadow: 0 0 0 3px rgba(37, 99, 235, .12); }
.view-head #ad-filters input[type="date"]::-webkit-calendar-picker-indicator { font-size: 12px; opacity: 0.65; }

/* ============================================================================
   2026-09-17（第 2 版）老板反馈：表格框下方露出一片空白（红框处），要求框体占满
   ----------------------------------------------------------------------------
   现象：上一版（emp25 段）用 max-height 把表格框封顶在「25 行 + 表头」的高度。
        本机 1000 高的视口下正好填满；换成更高的视口（≈1150）时可用高度 942px
        > 封顶 796px ⇒ 框体下方露出 146px 空白，屏幕越高空白越大（1310 高时 306px）。
   根因：本页是「流式自适应布局」（#stage 100vh + .content 与 #view 逐级 flex:1），
        表格可用高度随视口变化，而封顶高度是常量 —— 二者必然错配。
   改法：① 撤掉 max-height 封顶，让表格框回到 flex:1 撑满     ⇒ 框体占满，无空白
         ② 行高改为按可用高度反推：(框体内高 − 表头) ÷ 25
            ⇒ 一屏恒为 25 条（无论视口多高），且恰好铺满、不留残高
   实现：.table-wrap 加 container-type: size，行高用容器查询单位 cqh 计算。
         cqh 相对框体内容盒高度，随 flex 撑满实时跟随，零 JS、零重排、零 resize 监听。
         实测（真浏览器 1920 宽）：视口 1000 → 行高 30.3px；1150 → 36.3px；1310 → 42.7px；
         三档底部空白均为 0、可见行数均为 25。
   调参（改完 F5 即生效，免重启；只动下列变量即可，无需改选择器）：
         --emp-rows      想每屏 30 条就写 30（行高自动跟着变）
         --emp-head-h    表头高，实测 32.38px，取整 32
         --emp-row-min   行高下限（防挤压，30px）
         --emp-row-max   行高上限（防超大屏行距过大，46px）
   降级：视口太矮（可用 < 25×30 + 表头）时行高触 30px 下限，一屏显示
         floor((可用−表头)/30) 条（880 高 ⇒ 21 条）—— 宁可行数少，也不挤压行内容。
         cqh 不被支持时整条 height 声明失效，回落 2026-09-03 的 33px，行为安全。
   兼容：选择器全部带 #view:has(.tbl-employees) 前缀 ⇒ 仅员工管理页；
        用工单位 / 合同 / 工伤 / 供方 / 收支明细等表格完全不受影响。
   回滚：删除本段并还原上一版 emp25 段，或还原 erp_backups 下本批目录里的 .bak 文件。
       （注意：本段注释内不要出现星号加斜杠的字符组合，否则会提前闭合注释块，
         把后面整段规则静默吃掉且不报错 —— 本批已用机器断言守住这条。）
   ========================================================================== */
#view:has(.tbl-employees) {
  --emp-rows: 25;         /* 每屏行数 */
  --emp-head-h: 32px;     /* 表头高（实测 32.38px） */
  --emp-row-min: 30px;    /* 行高下限 */
  --emp-row-max: 46px;    /* 行高上限 */
}
#view:has(.tbl-employees) #list-area > .table-wrap.tbl-employees {
  max-height: none;       /* 撤掉上一版封顶，恢复 flex:1 撑满 */
  container-type: size;   /* 使后代可用 cqh 读到框体高度 */
  min-height: 120px;      /* 极端矮视口下不塌成 0 */
}
/* 行高 = (框体内高 − 表头) ÷ 每屏行数 ⇒ 一屏恰好 25 条、恰好铺满 */
#view:has(.tbl-employees) .tbl-employees table tbody td {
  height: clamp(var(--emp-row-min, 30px), calc((100cqh - var(--emp-head-h, 32px)) / var(--emp-rows, 25)), var(--emp-row-max, 46px));
}

/* ============================================================================
   2026-09-17 ADV25 老板要求：员工预支台账「框体高度不变，显示条数调整为 25 条」
   ----------------------------------------------------------------------------
   背景：本页是流式自适应布局（#stage 100vh → .content → #view → #fin-sub 逐级 flex:1），
        表格框 #ad-table 撑满剩余高度 ⇒ 框体高度随视口变化。
        改造前数据行高由内容决定（列多且窄 ⇒ 单元格文字折行），
        行高实测在 37 ~ 85px 之间乱跳，一屏可见行数 4 / 9 / 14 / 17 / 31 条（视口不同差几倍）。
        🔴 2026-09-17 ADVCOL 修正：折行的主因是**操作列按钮文字折行**（.row-actions 未设
        nowrap，实测把整行撑到 85px），批次号折行是同因的另一表现 —— 见本文件末尾 ADVCOL 段。
   改法：与员工管理页的 emp25 段完全同构 ——
        ① 框体维持 flex:1 撑满 ⇒ 框体高度不变
        ② 行高改为按可用高度反推：(框体内高 − 表头) ÷ 25
           ⇒ 一屏恒为 25 条，且恰好铺满、不留残高
   实现：.table-wrap 加 container-type: size，行高用容器查询单位 cqh 计算。
         cqh 相对框体内容盒高度，随 flex 撑满实时跟随：零 JS、零重排、零 resize 监听。
   调参（改完 F5 即生效，免重启；只动下面 4 个变量即可，无需改选择器）：
         --adv-rows      每屏行数，想 30 条就写 30（行高自动跟着变）
         --adv-head-h    表头高，本段已把表头固定成这个值以便公式扣减准确
         --adv-row-min   行高下限（防挤压）
         --adv-row-max   行高上限（防超大屏行距过大）
   降级：视口太矮（可用高度撑不下 25 行）时行高触下限，一屏显示
         floor((可用 − 表头) ÷ 行高下限) 条 —— 宁可行数少，也不挤压行内容。
         cqh 不被支持时整条 height 声明失效，回落内容自然行高，行为安全。
   兼容：选择器全部带 #view:has(.tbl-advances) 前缀 ⇒ 仅员工预支页；
         行高只作用于「按笔」视图 —— 用「表头有操作列 th.col-ops-th」+「表头 17 列」
         两个条件锁定。注意：仅凭 col-ops-th 不够，「按人」视图（一行一人）的表头
         同样带 col-ops-th，会一并命中；17 列是按笔视图独有的（按人视图 10 列）。
         ⚠️ 列数是硬编码判据：**按笔视图增删列时必须同步改这里的 nth-child**。
            2026-09-17 ADVCOL 批删掉「考勤截图 / 日额数据」两列（19 → 17），本处已随之
            由 19 改为 17；改漏的后果是行高规则整条不命中、「一屏 25 条」静默退回乱跳。
         空态行（td 带 colspan）也不受影响。
   回滚：删除本段即可（纯新增，不修改任何既有规则）。
         注意：本注释块内不得出现星号加斜杠的字符组合，否则会提前闭合注释
         并把后面整段规则静默吃掉且不报错（本批已用机器断言守住这条）。
   ========================================================================== */
#view:has(.tbl-advances) {
  --adv-rows: 25;      /* 每屏行数 */
  --adv-head-h: 40px;  /* 表头高（由下方 th 规则固定） */
  --adv-row-min: 30px; /* 行高下限 */
  --adv-row-max: 80px; /* 行高上限 */
}
/* 表头固定高 + 不换行 —— 让公式里的「表头高」成为确定值，25 行才可能精确。
   预支台账的表头是裸 tr-th，没有 thead 包裹，通用规则 .table-wrap table thead th
   命中不到它（这也是改造前列窄时表头换行、表头高从 38px 变 86px 的原因），
   故这里显式指定；顺带把表头高度稳定下来。 */
#view:has(.tbl-advances) > #fin-sub > #ad-table.table-wrap.tbl-advances table th {
  height: var(--adv-head-h, 40px);
  white-space: nowrap;
}
/* 框体：保留 Box Pattern 与 flex:1 撑满，加容器查询上下文供后代读 cqh */
#view:has(.tbl-advances) > #fin-sub > #ad-table.table-wrap.tbl-advances {
  container-type: size;
  min-height: 120px;   /* 极端矮视口下不塌成 0 */
}
/* 行高 = (框体内高 − 表头) ÷ 每屏行数 ⇒ 一屏恰好 25 条、恰好铺满。
   只作用于「按笔」视图：表头 17 列且末列为操作列（按人视图 10 列）。
   2026-09-17 ADVCOL：按笔视图由 19 列改为 17 列 ⇒ nth-child(19) 改 nth-child(17)，
   否则本规则整条不命中、「一屏 25 条」会静默退回改造前的乱跳状态。 */
#view:has(.tbl-advances) .tbl-advances table:has(th.col-ops-th):has(th:nth-child(17)) tbody td:not([colspan]) {
  height: clamp(var(--adv-row-min, 30px), calc((100cqh - var(--adv-head-h, 40px)) / var(--adv-rows, 25)), var(--adv-row-max, 80px));
}

/* ============================================================================
   2026-09-17 ADVCOL 老板要求：员工预支台账「考勤截图移到操作里 / 删掉日额数据 /
   批次·凭证做成紧凑按钮 / 整表适配屏幕」
   ----------------------------------------------------------------------------
   ① 单元格与操作列按钮不折行（本页此前一直缺这条）
      老板看到的现象：行很高、表格很挤。实测根因是【操作列按钮文字折行】——
      .btn-sm 的「操作记录」四个字在 140px 宽的 .row-actions 里装不下，按钮内部
      折成两行，.row-actions 被撑到 72px，整行 85px（当批 54 行全部如此）。
      批次号 P20260917-路桥02（14 字符、列宽仅 91px）折行是同一原因的另一表现。
      对照实验已排除【批次号本身】：把 _batch_no 清空后行高仍是 85px。
      同款规则员工管理页早有（.tbl-employees 那两条），本页漏了，现补上，两页一致。
      取舍：不折行后长内容由 .table-wrap 的横向滚动承载（员工页既有做法）。
   ② 批次 / 凭证改为紧凑 chip（.adv-chip）：文案短、状态色仍一眼可辨；
      全文（批次号 / 凭证号 / 日期 / 摘要）进 title，鼠标悬停可读；点击行为不变
      （仍是 data-adv-batchopen / data-vchopen，绑定代码一行没动）。
   ③ 与 ADV25 段的联动：ADVCOL 删掉两列（19 → 17），ADV25 的行高选择器已同步由
      nth-child(19) 改为 nth-child(17)。两段必须同进同退 —— 只改一处会让
      「一屏 25 条」静默失效（规则不命中时不报错，只是行为退回改造前）。
   回滚：删除本段，并把 ADV25 段的 nth-child(17) 改回 (19)。
   ========================================================================== */
/* ① 不折行：与 .tbl-employees 同款 */
.tbl-advances table th,
.tbl-advances table td { white-space: nowrap; }
.tbl-advances .row-actions { white-space: nowrap; }
/* ② 批次 / 凭证紧凑 chip：统一成「按钮样」小色块（原来的内联样式不再使用）。
   2026-09-17 STLCHIP：结清补发台账（#stl-table）也换成同款 chip ⇒ 选择器一并覆盖它，
   两个台账的批次 / 凭证列外观从此外观完全一致（老板：「也跟员工预支页面中的一样」）。 */
.tbl-advances .adv-chip,
#stl-table .adv-chip {
  display: inline-block;
  padding: 1px 6px;
  border-radius: 4px;
  font-size: 11.5px;
  line-height: 1.45;
  white-space: nowrap;
  cursor: pointer;
  border: 1px solid transparent;
}
.tbl-advances .adv-chip-batch,
#stl-table .adv-chip-batch { background: #eff6ff; color: #1d4ed8; border-color: #bfdbfe; }
.tbl-advances .adv-chip-ok,
#stl-table .adv-chip-ok { background: #ecfdf5; color: #065f46; border-color: #6ee7b7; }
.tbl-advances .adv-chip-draft,
#stl-table .adv-chip-draft { background: #fef2f2; color: #b91c1c; border-color: #fecaca; font-weight: 600; }
.tbl-advances .adv-chip-void,
#stl-table .adv-chip-void { background: #f1f5f9; color: #64748b; border-color: #e2e8f0; }
/* 2026-10-04 PAYRESULT：银行代发结果徽标（预支台账 .tbl-advances + 结清补发台账 #stl-table 共用同款，
   挂在「批次」列尾部，**不新增列**）。三态：
     payok    已打款   —— 绿，与批次 chip 的蓝并列不抢眼；
     payfail  打款失败 —— 红加粗，是本批要让人**一眼看见**的那一态；
     nomatch  无法匹配 —— 灰（弱化），表示「在财务明细里没查到」，**不是**成功。
   图标极简（✅/❌/?）⇒ 列宽几乎不变，金额/日期/匹配方式全在 title 里。
   cursor:default 覆盖 .adv-chip 的 pointer（这三个徽标本体不可点，重打在操作列）。 */
.tbl-advances .adv-chip-payok,
#stl-table .adv-chip-payok { background: #ecfdf5; color: #047857; border-color: #a7f3d0; cursor: default; }
.tbl-advances .adv-chip-payfail,
#stl-table .adv-chip-payfail { background: #fef2f2; color: #b91c1c; border-color: #fecaca; font-weight: 700; cursor: default; }
.tbl-advances .adv-chip-nomatch,
#stl-table .adv-chip-nomatch { background: #f8fafc; color: #94a3b8; border-color: #e2e8f0; cursor: default; }
/* 打款失败行操作列的「重打 / 待重打」按钮：复用 .btn-sm 尺寸，只与相邻按钮留一点间距。 */
.tbl-advances .adv-payretry-btn,
#stl-table .adv-payretry-btn { margin-right: 4px; white-space: nowrap; }
/* 操作列里的「截图」按钮是 a 标签，去掉下划线、尺寸与同行 button 保持一致 */
.tbl-advances .row-actions .adv-shot-btn { text-decoration: none; display: inline-block; line-height: normal; }
/* ③ 整表适配屏幕：水平内边距 14px → 10px（**只动水平，上下 8px/6px 不动 ⇒ 行高不受影响**）。
   实测：不折行后 17 列的内容自然宽 = 1799px，而 1920 宽屏的框体只有 1736px ⇒ 会冒出
   横向滚动条。17 列 × 每列省 8px ≈ 省 136px ⇒ 降到约 1663px，1920 屏不再横滚。
   特异性必须写成 .tbl-advances.table-wrap table thead th (0,2,3) ——
   与 2087/2088 行的既有规则同特异性，靠「本段在文件末尾」取胜；
   若写成 .tbl-advances table th (0,1,2) 会被既有规则压过、静默无效。 */
.tbl-advances.table-wrap table thead th { padding: 8px 10px; }
.tbl-advances.table-wrap table tbody td { padding: 6px 10px; }

/* ===== 权限管理 · 操作×模块矩阵（PERMUI 批 段A，2026-09-17）===== */
.pm-wrap { overflow-x:auto; }
.pm-matrix { width:100%; border-collapse:collapse; font-size:12px; table-layout:fixed; }
.pm-matrix th, .pm-matrix td { border:1px solid #e5e7eb; padding:4px 3px; text-align:center; vertical-align:middle; }
.pm-matrix thead th { background:#f1f5f9; font-weight:600; color:#334155; }
.pm-matrix .pm-opcol { width:82px; text-align:left; padding-left:8px; white-space:nowrap; background:#f8fafc; font-weight:600; }
.pm-matrix .pm-grp { background:#f1f5f9; }
.pm-matrix .pm-grp-res { background:#e6f1fb; color:#185fa5; }
.pm-matrix .pm-res { background:#f7fbff; }
.pm-matrix .pm-res.pm-head { background:#e6f1fb; color:#185fa5; }
.pm-matrix .pm-ro input[type=checkbox] { opacity:.55; cursor:not-allowed; }
.pm-matrix .pm-na { color:#94a3b8; font-size:11.5px; }
.pm-matrix input[type=checkbox] { margin:0; cursor:pointer; }
.pm-matrix select { font-size:11.5px; padding:1px 2px; max-width:88px; }


/* ============================================================================
   2026-09-18 STLBOX —— PC 端「结清补发」台账框体改造（老板截图反馈批）
   ----------------------------------------------------------------------------
   背景：本页台账此前是**裸 table**（内联 width:100% / font-size:12px / 每格内联
   padding:5px 8px，表头更是裸 tr、没有 thead 包裹）⇒ 既吃不到共用 Box Pattern 框体，
   也吃不到 thead th 表头规则，观感是「贴边硬边表格」；而员工管理 / 员工预支都走
   .table-wrap 框体。本批把 #stl-table 改成 .table-wrap.tbl-settle：
     · 框体：白底渐变 + 12px 圆角 + 1px 描边 + 多层柔阴影（Box Pattern，与员工管理同一套）
     · 表头：#f1f5f9 灰底 + 600 字重 + 12.5px + sticky（表内滚动时钉住）
     · 行：td 12.5px + 下边框 #f1f5f9 + hover 浅底与左蓝条（.table-wrap 通用规则）
     · 滚动条：与其它列表页同一套细滚动条样式（通用规则）
   单元格间距：纵向取员工管理的 10px / 8px；横向**保持原 8px 不变**——
     本表 17 列（展开 25 列），横向由 8px 提到员工管理的 14px 会让表宽多出约
     200px，在当前窗口下可能把「操作」列挤出可视区、凭空多出横向滚动条。
     故此处只对齐框体与纵向节奏，宽度零变化。要改成 14px，改下面两行的 8px 即可。
   作用域：#view:has(.tbl-settle) —— .tbl-settle 只在结清补发页出现，
     其它财务子页（报税 / 供方费用 / 收支明细 / 预支）不受影响。
   回滚：删掉本段 + 用 gen_pc.py 的反建校验还原 app-finance.js。
   ========================================================================== */
#view:has(.tbl-settle) { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
#view:has(.tbl-settle) > .view-head { flex-shrink: 0; }
#view:has(.tbl-settle) > #fin-sub { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
#view:has(.tbl-settle) > #fin-sub > :not(#stl-table) { flex-shrink: 0; }
#view:has(.tbl-settle) > #fin-sub > #stl-table.table-wrap.tbl-settle {
  flex: 1 1 auto; min-height: 0;
  overflow-y: auto;
  overflow-x: auto;
}
#view:has(.tbl-settle) > #fin-sub > #stl-table thead th {
  position: sticky; top: 0; z-index: 2;
  background: #f1f5f9;
  box-shadow: inset 0 -1px 0 #e2e8f0;
  border-bottom: 0;
}
#view:has(.tbl-settle) > #fin-sub > #stl-table thead th:last-child { z-index: 3; }
/* 单元格：不折行（原来靠 table 上的内联 white-space，已随内联样式一并摘除）+
   员工管理同款纵向间距。特异性 (0,2,3) > 通用 .table-wrap table thead th (0,1,4)，
   与 .tbl-advances 同一手法。 */
.tbl-settle.table-wrap table thead th { padding: 10px 8px; }
.tbl-settle.table-wrap table tbody td { padding: 8px 8px; }
.tbl-settle.table-wrap table th,
.tbl-settle.table-wrap table td { white-space: nowrap; }

/* ============================================================================
   2026-09-18 STLHEAD —— PC 端「结清补发」把筛选栏放进标题行（老板截图反馈批）
   ----------------------------------------------------------------------------
   老板原话：「红框中的筛选 放到绿框的位置，另外加上序号」。
   绿框 = 标题行「结清补发」右侧空白带；红框 = 标题行下面那一整条筛选栏。
   配套的 JS 改动（public/js/app-finance.js，同批上线）：
     · renderFinanceHub 的 .view-head 里新增 <div id="stl-filters"></div>
       —— 与员工预支 <div id="ad-filters"></div> 同款位置：h2 与右侧按钮之间；
     · renderSettleList 把筛选栏写进该宿主，#fin-sub 只留「统计行 + 台账框体」；
     · 台账最左新增「序号」列（不展开 18 列 / 展开 26 列，colspan 同步 17→18）。
   本段只加 1 条规则，**不动任何既有选择器**：
     #stl-filters 在 .view-head 里要「吃掉中间空档」（flex:1）——
     .view-head 是 justify-content:space-between，不给 flex:1 时这第三个子元素会被
     摆到标题与按钮的**正中间**（不是紧贴标题）；同时把 .filter-bar 自带的
     margin-bottom:14px 归零，否则标题行会凭空高 14px。
   特异性：.view-head #stl-filters (0,1,1) > .filter-bar (0,1,0)，故两个属性都能覆盖。
   作用域：id 唯一、只在本页出现；其它财务子页与其它模块零影响。
   回滚：删掉本段 + 用 gen_head.py 的反建校验还原 app-finance.js / index.html。
   ========================================================================== */
.view-head #stl-filters { flex: 1 1 auto; min-width: 0; margin-bottom: 0; }


/* ══════════════════════════════════════════════════════════════════
   财务总览工具条上移页头（2026-09-19 FINBAR 老板截图：蓝框整行移到绿框位）
   仅新增 .fc-head-slot / 作用域限定的 .fc-toolbar 规则，不碰任何既有选择器。
   _fcMonthBar() 原第二行位置不再渲染；挂载点由 app.js renderFundControl 注入。
   ══════════════════════════════════════════════════════════════════ */
.view-head .fc-head-slot { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; margin: 0 6px; }
.view-head .fc-head-slot .fc-toolbar { flex: 1 1 auto; margin: 0; gap: 10px; }
.view-head .fc-head-slot .fc-toolbar-right { gap: 10px; }

/* ══════════════════════════════════════════════════════════════════════
   2026-09-19 FIN-SPLIT-B：内部工资分配表 + 保险明细表 弹窗样式
   纯新增选择器（ial-* / fid-*），不改动任何既有规则。
   ══════════════════════════════════════════════════════════════════════ */
.ial-hint { padding:10px 12px; margin:0 0 10px; background:#f1f5f9; border-left:3px solid #94a3b8; border-radius:4px; font-size:12px; color:#475569; line-height:1.7; }
.ial-sum { padding:8px 12px; margin-bottom:8px; font-size:12px; color:#334155; background:#f8fafc; border:1px solid #e2e8f0; border-radius:6px; }
.ial-ok, .fid-ok-txt { color:#059669; }
.ial-bad, .fid-err { color:#dc2626; }
.ial-tblwrap, .fid-tblwrap { max-height:432px; overflow:auto; border:1px solid #e2e8f0; border-radius:6px; }
.ial-tbl, .fid-tbl { width:100%; border-collapse:collapse; font-size:12px; }
.ial-tbl th, .fid-tbl th { position:sticky; top:0; background:#f1f5f9; color:#334155; font-weight:500; text-align:left; padding:7px 8px; border-bottom:1px solid #e2e8f0; z-index:1; }
.ial-tbl td, .fid-tbl td { padding:6px 8px; border-bottom:1px solid #f1f5f9; vertical-align:top; }
.ial-who .ial-nm { font-weight:500; color:#0f172a; }
.ial-role { font-size:11px; color:#94a3b8; margin-top:2px; }
.ial-tot-td { text-align:right; }
.ial-total { width:104px; padding:4px 6px; border:1px solid #cbd5e1; border-radius:4px; font-size:12px; text-align:right; }
.ial-uc { color:#64748b; }
.ial-cells { display:flex; flex-wrap:wrap; gap:6px; }
.ial-cell { display:flex; align-items:center; gap:4px; padding:3px 5px; background:#f8fafc; border:1px solid #e2e8f0; border-radius:5px; }
.ial-cn { font-size:11px; color:#475569; white-space:nowrap; }
.ial-k { display:inline-block; margin-left:3px; padding:0 3px; border-radius:3px; font-size:10px; font-style:normal; }
.ial-k-main { background:#fde68a; color:#92400e; }
.ial-k-dep { background:#dbeafe; color:#1e40af; }
.ial-amt { width:84px; padding:3px 5px; border:1px solid #cbd5e1; border-radius:4px; font-size:12px; text-align:right; }
.ial-diff { font-size:12px; }
.ial-diff-ok { color:#059669; }
.ial-diff-bad { color:#dc2626; font-weight:500; }
.ial-foot { display:flex; align-items:center; gap:8px; margin-top:12px; padding-top:10px; border-top:1px solid #e2e8f0; }
.ial-foot-tip { flex:1 1 auto; font-size:11px; color:#94a3b8; }
.fid-top { display:flex; align-items:center; gap:10px; margin-bottom:10px; }
.fid-fname { font-size:12px; color:#475569; }
.fid-rep { margin-left:auto; font-size:12px; color:#475569; cursor:pointer; }
.fid-hint { padding:9px 12px; margin-bottom:10px; background:#eff6ff; border-left:3px solid #93c5fd; border-radius:4px; font-size:12px; color:#1e40af; line-height:1.7; }
.fid-msg { min-height:18px; margin-bottom:8px; font-size:12px; }
.fid-loading { color:#64748b; }
.fid-sum { padding:8px 12px; margin-bottom:8px; font-size:12px; color:#334155; background:#f8fafc; border:1px solid #e2e8f0; border-radius:6px; }
.fid-bad { background:#fef2f2; }
.fid-idc { font-family:monospace; letter-spacing:.5px; }
.fid-money { text-align:right; font-variant-numeric:tabular-nums; }
.fid-unit { width:100%; padding:3px 4px; border:1px solid #cbd5e1; border-radius:4px; font-size:12px; }
.fid-bad .fid-unit { border-color:#fca5a5; background:#fff1f2; }
/* 2026-09-19 B2：已暂停单位在「内部工资分配表」里的只读标记（不参与分配） */
.ial-paused { background:#f8fafc; border-style:dashed; border-color:#cbd5e1; }
.ial-paused .ial-cn { color:#94a3b8; }
.ial-paused-tag { font-size:11px; color:#94a3b8; white-space:nowrap; }
.ial-paused-amt { font-size:11px; color:#b45309; white-space:nowrap; }
.ial-paused-n { font-size:10px; color:#b45309; margin-top:2px; }
.ial-none { font-size:11px; color:#94a3b8; }

/* ==========================================================================
   2026-09-19 FINSPLIT-D：财务总览主表「列宽适配 + 右侧明细列折叠 + 视觉整理」
   —— 老板截图口径：🟩绿框＝表头右上角加一枚折叠按钮（跟员工管理页那枚 ⊟ 一样）；
      🟥红框＝各列宽按内容适配、适当美化、看上去整洁。
      原症结两条：① 14/15 列在 table-layout:fixed 下**平分**剩余宽度 ⇒ 6 个多数格子只有「—」的
      分账子列也被撑到 ~316px（老板窗口内容区实测 ≈2200px），满屏空框 ⇒「乱」；
      ② 表头 ③分账 写成 colspan=6，而表体是「状态/合计 + 6 子列」7 格 ⇒ **表头整体比表体左移一列**
      （老板截图实测：表体「工资」正落在表头「内部」下方），本批一并修正为 colspan=7。
   —— 折叠对象（老板选定）：预支垫付 / 结清补发 / 结算日历 三列，**默认折叠**。
      折叠 = 按 13 列重渲染表格（不是 CSS 藏列）—— table-layout:fixed 下藏列会留列宽残影。
   —— 全部选择器锚在 .fc-table / .fc-table-panel 下，其它页面零影响。
   —— 回滚：删除本段 = 样式部分回到 FIN-SPLIT B2（app.js 侧另有按钮/列数改动）。
   ========================================================================== */

/* ---- 1) 列宽：一律走 <colgroup> ------------------------------------------
   🔴 为什么不能写 th/td 的 width：本表 table-layout:fixed，列宽只认**第一行**的单元格；
      「③ 分账」是第一行的一个 colspan 单元格，无法给它的 7 个子列分别定宽 —— 只有 <col> 能。
   口径：内容驱动的比例宽（非等分）—— 窄列（内部/费用/保险/报销）只留两位数量级金额的位置，
   宽列（用人单位 / ③分账状态 / 结清补发）留给最长的文字；总和恒 = 100%，随容器自适应。
   实测基准：老板窗口内容区 ≈2200px（由截图上 5 张 KPI 卡左边框间距 697px 反推，
   与主表左右边界 ~3475px 互证，两法相差 <1%）。下列 px 注释按 2250px 标注。 */
.fc-table { min-width: 1740px; }               /* 窄屏兜底：宁可横向滚动（末列已 sticky 吸附），也不把列压扁 */
/* —— 展开态（16 列）—— E 批：unit 15.0%→8.0%，余量按现宽等比摊给其余 14 列 ——
   ⚠️ unit 取 8.0% 而非机械的一半 7.5%：真浏览器实测 7.5% 在 min-width 1600px 下
      只剩 103.9px 内容宽，最长单位名「路桥塞达（老厂）」(8 全角字 ≈104px) 会被挤折行；
      8.0% ⇒ 112px 内容宽，全档屏宽零折行（0.5pp 从最宽的 settle 借）。
   ⚠️ base 段旧规则 .fc-th-unit{width:17%} 曾在此**抢赢 colgroup**（实测 16.7% ≠ 15%），
      E-3 已改为 width:auto，本条才真正生效。 */
/* 2026-09-20 FIN-SPLIT L（老板口径「框体宽度重新适配下 尽量均分 画面好看一点」）：
   15 列宽**整组重排**，口径 = 「尽量均分」—— 除序号 / 折叠按钮两个功能窄列外，
   其余 13 列全部压进 **6.9% ~ 8.2%**（改前是 5.1% ~ 10.2%，极差 5.1pp；改后极差 1.3pp）。
   改前病根：⑤个子列被压到 5.1% 挤成一条，而结清补发独占 10.2% —— 一宽一窄落差太大。
   ⚠️ 合计**恰好 100.0%**（校验脚本逐列相加已核）：合计 100 是硬要求 —— 不满 100 时余量由
      浏览器按比例隐式摊掉，宽度就成了「看不出来源」的魔数（K 批踩过）；超 100 会撑破表宽。
   ⚠️ 改列宽**必须真浏览器实测**（内容换行 / 溢出 / 行高变化看不见字符串断言）——
      见 verify 阶段的 playwright 量宽。历史上踩过「只压公式不压自然地板 = 白改」。
   ⚠️ 展开 15 列 / 折叠 12 列各一组，两组都要满足 100.0%；折叠态另见下方那段。 */
.fc-table .fc-col-seq      { width: 2.2%; }    /* 序号（窄列 · 固定） */
.fc-table .fc-col-unit     { width: 5.74%; }    /* 用人单位（@FCW 2026-10-01：8.2% → 5.74%＝-30%，详见下方 @FCW 段）*/
.fc-table .fc-col-open     { width: 7.3%; }    /* ① 开票 */
.fc-table .fc-col-collect  { width: 7.3%; }    /* ② 回款 */
.fc-table .fc-col-payst    { width: 7.6%; }    /* ③ 分账 合计（要放「合计 ¥43,296.00」） */
.fc-table .fc-col-wage     { width: 7.1%; }    /* 员工工资  ┐ */
.fc-table .fc-col-internal { width: 7.1%; }    /* 内部工资  │ */
.fc-table .fc-col-fee      { width: 7.1%; }    /* 供方费用  ├ ⑤个子列**统一 7.1%**（原 6.0/5.1×4） */
.fc-table .fc-col-ins      { width: 7.1%; }    /* 员工保险  │ */
.fc-table .fc-col-reimb    { width: 7.1%; }    /* 内部报销  ┘ */
.fc-table .fc-col-profit   { width: 7.6%; }    /* ④ 毛利 */
.fc-table .fc-col-adv      { width: 7.1%; }    /* 预支垫付 */
.fc-table .fc-col-settle   { width: 7.5%; }    /* 结清补发（从 10.2% 收窄，均分的主力贡献者） */
.fc-table .fc-col-cal      { width: 6.71%; }    /* 结算日历按钮 */
.fc-table .fc-col-fold     { width: 2.8%; }    /* 折叠按钮列（窄列 · 固定，展开态 ⊟ 常驻） */
/* —— 折叠态（12 列）：省下的三列宽度全部还给留下的列 ——
   E 批：unit 17.0%→8.5%（压半），余量按原宽等比摊给其余各列 —— */
/* 2026-09-20 FIN-SPLIT K：折叠态 13 列 → **12 列**。
   ⚠️ 改前这组**合计只有 91.8%**（余量由浏览器按比例隐式摊掉）⇒ 渲染宽度实际是「各自 ÷ 0.918」。
   本批**把那个隐式结果写成显式数字**（等比放大 100/91.8，末位微调至恰好 100.0）
   ⇒ 渲染宽度与改前**完全一致**，只是不再依赖浏览器兜底。 */
/* 2026-09-20 FIN-SPLIT L：折叠态 12 列同步重排（口径同上：「除两个功能窄列外尽量均分」）。
   改前极差 2.4% ~ 12.7%；改后除序号/按钮两列外全落在 **9.2% ~ 10.4%**（极差 1.2pp）。
   合计**恰好 100.0%**（校验脚本逐列相加已核）。 */
.fc-table-panel.fc-cols-collapsed .fc-col-seq      { width: 2.4%; }   /* 序号 */
.fc-table-panel.fc-cols-collapsed .fc-col-unit     { width: 7.28%; }  /* 用人单位（居中显示） */
.fc-table-panel.fc-cols-collapsed .fc-col-open     { width: 9.6%; }   /* ① 开票 */
.fc-table-panel.fc-cols-collapsed .fc-col-collect  { width: 9.6%; }   /* ② 回款 */
.fc-table-panel.fc-cols-collapsed .fc-col-payst    { width: 9.9%; }   /* ③ 分账 合计 */
.fc-table-panel.fc-cols-collapsed .fc-col-wage     { width: 9.2%; }   /* 员工工资 ┐ */
.fc-table-panel.fc-cols-collapsed .fc-col-internal { width: 9.2%; }   /* 内部工资 │ */
.fc-table-panel.fc-cols-collapsed .fc-col-fee      { width: 9.2%; }   /* 供方费用 ├ ⑤子列统一 */
.fc-table-panel.fc-cols-collapsed .fc-col-ins      { width: 9.2%; }   /* 员工保险 │ */
.fc-table-panel.fc-cols-collapsed .fc-col-reimb    { width: 9.2%; }   /* 内部报销 ┘ */
.fc-table-panel.fc-cols-collapsed .fc-col-profit   { width: 9.5%; }   /* ④ 毛利 */
.fc-table-panel.fc-cols-collapsed .fc-col-fold     { width: 2.6%; }   /* 折叠按钮列 */

/* 2026-09-20 FIN-SPLIT O：④毛利 列加宽 —— 给「毛利金额 + 毛利率」腾地方。
   ⚠️ 必须写在上面两组 col 宽度规则**之后**：同特异性选择器靠**后来者胜**，写前面会被覆盖。
   ⚠️ 让出方是 ③分账 的 5 个子列（内容多为「—」或金额，最宽松），且 5 列仍保持**统一宽度**；
      ③分账「合计」格、①开票、②回款、④毛利右侧各列**一律不动**。
   ⚠️ 加宽是实测刚需：不加宽时「最长金额（¥43,296.00）+ 100.00%」= 136px > 内容区 135px，
      会换行并把行高从 42px 顶到 54px（真浏览器实测）。加宽后内容区 143px，余量 20px。 */
.fc-table .fc-col-wage, .fc-table .fc-col-internal, .fc-table .fc-col-fee,
.fc-table .fc-col-ins,  .fc-table .fc-col-reimb   { width: 6.42%; }   /* 展开态 7.1 → 6.62 */
.fc-table .fc-col-profit                          { width: 10.0%; }   /* 展开态 7.6 → 10.0 */
.fc-table-panel.fc-cols-collapsed .fc-col-wage,
.fc-table-panel.fc-cols-collapsed .fc-col-internal,
.fc-table-panel.fc-cols-collapsed .fc-col-fee,
.fc-table-panel.fc-cols-collapsed .fc-col-ins,
.fc-table-panel.fc-cols-collapsed .fc-col-reimb   { width: 8.76%; }   /* 折叠态 9.2 → 9.1 */
.fc-table-panel.fc-cols-collapsed .fc-col-profit  { width: 10.02%; }   /* 折叠态 9.5 → 10.0 */

/* ══════════ @STLDIFF 2026-10-11 财务总览 ③分账 增第 5 子列「结清差异」 ══════════
   老板 2026-10-11 拍板（方案 A）：③分账 4 子列 → **5 子列**，新增「结清差异」排在
   「内部报销」与「④ 毛利润」之间；列名统一用「结清差异」（老板口径）。
   口径零变动：后端 ④ 毛利润**早已减去**这一项（fund_pipeline.js B6 `gross`），
   本批只是把**已经扣掉的那一项显示出来** ⇒ 5 子列相加 = ③分账 → 表体与表底终于配平。
   🔴 列宽口径（**不让其它列动一个像素**）：新列宽度**从同组的 4 个子列平摊借出** ——
      展开态原 4 × 6.42% = 25.68% ⇒ 改后 5 × 5.136% = 25.68%（合计不变）；
      折叠态原 4 × 8.76% = 35.04% ⇒ 改后 5 × 7.008% = 35.04%（合计不变）。
      ⇒ 全表 col 宽度合计仍是 85.98%（与 B4 之后、本批之前**逐位相同**），
        其余各列（序号/单位/开票/回款/④毛利润/预支/结清补发/日历/折叠）渲染宽度**一像素不变**。
      ⚠️ 本批**不**顺手把 85.98% 补成 100%：那属于另一件事（会同时挪动全表所有列宽），
         且与「改动恰好只有本批那几处」的纪律冲突 —— 留给后续单独一批、单独实测。
   ⚠️ 折叠态那组**必须带 .fc-table-panel.fc-cols-collapsed 前缀**（否则被上面 6.42% 那组抢赢）。
   ⚠️ 原 .fc-col-ins（员工保险，B4 已从 colgroup 下线）**刻意不动**：它已不渲染，
      改它反而会挪动那 6.42% 的隐式余量、波及全表列宽。
   ⚠️ 5 个子列仍保持**统一宽度**（老板 2026-09-20 L 批「尽量均分」口径）。 */
/* ══════════ 2026-10-12 FINOTHER 财务总览 ③分账 增第 6 子列「其他」 ══════════
   老板口径（逐字）：「分账下面再建一个其他，由管理填写，点击后出现框体 两个空格，
     一、金额 二、备注，保存后只显示金额，鼠标一上去才能看到备注」
   🔴 列宽口径（**不让其它列动一个像素**）：新列宽度仍**从同组的子列平摊借出** ——
      展开态原 5 × 5.136% = 25.68% ⇒ 改后 6 × 4.28% = 25.68%（合计不变）；
      折叠态原 5 × 7.008% = 35.04% ⇒ 改后 6 × 5.84% = 35.04%（合计不变）。
      ⇒ 全表 col 宽度合计仍是 85.98%（与 @STLDIFF 之后、本批之前**逐位相同**），
        其余各列（序号/单位/开票/收款/④毛利润/预支/结清补发/日历/折叠）渲染宽度**一像素不变**。
   ⚠️ 折叠态那组**必须带 .fc-table-panel.fc-cols-collapsed 前缀**（否则被上面 6.42% 那组抢赢）。
   ⚠️ 6 个子列仍保持**统一宽度**（老板 2026-09-20 L 批「尽量均分」口径）。
   ⚠️ 悬停/可点样式**零新增**：「其他」格复用既有 .fc-pay-go（cursor:pointer + hover 蓝底），
      与「员工工资」「结清差异」两格同一套观感，不再引入第三套。 */
.fc-table .fc-col-wage, .fc-table .fc-col-internal, .fc-table .fc-col-fee,
.fc-table .fc-col-reimb, .fc-table .fc-col-stlcf, .fc-table .fc-col-other  { width: 4.28%; }   /* @FINOTHER 展开态 5×5.136 → 6×4.28 */
.fc-table-panel.fc-cols-collapsed .fc-col-wage,
.fc-table-panel.fc-cols-collapsed .fc-col-internal,
.fc-table-panel.fc-cols-collapsed .fc-col-fee,
.fc-table-panel.fc-cols-collapsed .fc-col-reimb,
.fc-table-panel.fc-cols-collapsed .fc-col-stlcf,
.fc-table-panel.fc-cols-collapsed .fc-col-other   { width: 5.84%; }   /* @FINOTHER 折叠态 5×7.008 → 6×5.84 */

/* ══════════ 2026-10-12 TAXOFF 财务总览 ③分账 增第 7 子列「税点」 ══════════
   老板口径（逐字）：「星空智联 是专票对方给的税点，算利润的时候必须把 518.40 税点拿掉」
   🔴 列宽口径（**不让其它列动一个像素**）：新列宽度仍**从同组的子列平摊借出** ——
      展开态原 6 × 4.28% = 25.68% ⇒ 改后 7 × 3.6686% = 25.6802%（较 25.68 多 0.0002pp，亚像素级）；
      折叠态原 6 × 5.84% = 35.04% ⇒ 改后 7 × 5.0057% = 35.0399%（较 35.04 少 0.0001pp，同上）。
      ⇒ 全表 col 宽度合计仍 ≈ 85.98%（与 @STLDIFF / @FINOTHER 两批**逐位相同**），
        其余各列（序号/单位/开票/回款/④毛利润/预支/结清补发/日历/折叠）渲染宽度**一像素不变**。
   ⚠️ 折叠态那组**必须带 .fc-table-panel.fc-cols-collapsed 前缀**（否则被上面 4.28% 那组抢赢）。
   ⚠️ 7 个子列仍保持**统一宽度**（老板 2026-09-20 L 批「尽量均分」口径）。
   ⚠️ 新列**只读、不可点** ⇒ 不挂 .fc-pay-go（无 cursor/hover），与「员工工资」「其他」两格观感区分开。
   ⚠️ 本批同样**不**把 ≈85.98% 补成 100% —— 那是另一件事（会同时挪动全表所有列宽）。 */
.fc-table .fc-col-wage, .fc-table .fc-col-internal, .fc-table .fc-col-fee,
.fc-table .fc-col-reimb, .fc-table .fc-col-stlcf, .fc-table .fc-col-other,
.fc-table .fc-col-taxoff  { width: 3.6686%; }   /* @TAXOFF 展开态 6×4.28 → 7×3.6686 */
.fc-table-panel.fc-cols-collapsed .fc-col-wage,
.fc-table-panel.fc-cols-collapsed .fc-col-internal,
.fc-table-panel.fc-cols-collapsed .fc-col-fee,
.fc-table-panel.fc-cols-collapsed .fc-col-reimb,
.fc-table-panel.fc-cols-collapsed .fc-col-stlcf,
.fc-table-panel.fc-cols-collapsed .fc-col-other,
.fc-table-panel.fc-cols-collapsed .fc-col-taxoff   { width: 5.0057%; }   /* @TAXOFF 折叠态 6×5.84 → 7×5.0057 */

/* ---- 2) 横向内边距 14px → 8px：把省下的 12px/列 还给内容 ----
   ⚠️ 只动 padding，**字号一个不缩**（红线见 references/04 坑 493）。
   🔴 2026-09-19 FINSPLIT-E **修正**：原选择器 `.fc-table-panel .fc-table td`（0,2,1）
      **输了**给基础段的 `.fc-table-panel .fc-table tbody td`（0,2,2）⇒ 表体左右一直是
      14px，只有 th 变成 8px。真浏览器实测：th=[8,8,6,6] / td=[14,14,4,4]。
      后果①：表头文字比表体文字靠左 6px（老板截图上「用人单位」表头比单位名靠左
             13px@1.77DPR，正是这 6px）；后果②：D 批确认单里「14→8 已收紧」不成立。
      修法：补 `tbody`/`thead` 把特异性提到 (0,2,2)，靠**源码顺序**（本段在基础段之后）
      压过基础段；只改左右，上下仍由基础段的 4px 管（纵向压缩不受影响）。
   ⚠️ 同族坑：这是「声明写了但被更高特异性压过」第 N 次（见 references/04 坑 379 族）。 */
.fc-table-panel .fc-table thead th,
.fc-table-panel .fc-table tbody td { padding-left: 8px; padding-right: 8px; }

/* ---- 3) 环节分组竖线：把 [序号·单位]｜[开票·回款]｜[③分账]｜[④毛利]｜[明细] 分开 ---- */
.fc-table th.fc-th-open, .fc-table td.fc-invoice-cell,
.fc-table th.fc-th-pay, .fc-table td.fc-payst-cell,
.fc-table th.fc-th-profit, .fc-table td.fc-profit-cell,
.fc-table th.fc-th-adv, .fc-table td.fc-adv-cell { border-left: 1px solid #e3e8f0; }

/* ---- 4) 表头：③ 分账 整块做成一条浅蓝色带（两级表头一起染），一眼看出它是一组 ---- */
.fc-table-panel .fc-table thead tr.fc-h1 th.fc-th-pay { background: #e8effb; color: #1d4ed8; }
.fc-table-panel .fc-table thead tr.fc-h2 th { background: #f2f7fd; color: #475569; }
.fc-table-panel .fc-table thead tr.fc-h2 th.fc-th-blank { color: #94a3b8; font-weight: 600; }
/* 最右折叠列表头：与本表其它表头同色（盖掉 .table-wrap 的 sticky 末列浅灰底），并抬 z-index 保证可点 */
.fc-table-panel .fc-table thead th.fc-th-fold { background: #f1f5f9; z-index: 3; }

/* ---- 5) 用人单位列**居中**；序号列淡一档 ----
   ⚠️ 2026-09-19 FINSPLIT-E **翻转**：D 批此处写的是 text-align:left（注释还写着
      「居中显得散」），那是当列宽 15~17% 时的判断；E 批把该列压到 8.5% 后，左对齐
      会在右侧留出半列空白 —— 老板 2026-09-19 截图要求改居中，以老板口径为准。
   ⚠️ .fc-unit-tags 是 display:flex ⇒ text-align 管不到它的子项，必须配 justify-content。 */
.fc-table-panel .fc-table td.fc-unit,
.fc-table-panel .fc-table th.fc-th-unit { text-align: center; }
.fc-table-panel .fc-table td.fc-unit .fc-unit-tags { justify-content: center; }
.fc-table-panel .fc-table td.fc-seq { color: #94a3b8; }

/* ---- 6) 结清补发副文本允许换行：列宽收窄后 nowrap 会溢出到邻列 ---- */
.fc-table-panel .fc-table .fc-settle-cell .fc-cell-sub { white-space: normal; }

/* ---- 7) 折叠按钮：与员工管理页 .col-ops-toggle 同一套视觉语言 ---- */
.fc-table-panel .fc-table th.fc-th-fold { padding: 0; }
.fc-fold-toggle {
  width: 22px; height: 22px; padding: 0; margin: 0 auto; line-height: 1; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 5px; background: #fff; color: #475569;
  font-size: 13px; font-weight: 700; display: flex; align-items: center; justify-content: center;
  transition: background .12s, border-color .12s, color .12s;
}
.fc-fold-toggle:hover { background: #f1f5f9; border-color: #94a3b8; color: #1e293b; }
.fc-fold-toggle:active { background: #e2e8f0; }
/* 折叠态按钮变蓝（与员工管理页折叠后同款），一眼可辨「点它可展开」 */
.fc-cols-collapsed .fc-fold-toggle { background: #2563eb; border-color: #2563eb; color: #fff; }
.fc-cols-collapsed .fc-fold-toggle:hover { background: #1d4ed8; border-color: #1d4ed8; color: #fff; }

/* ============================================================================
   2026-09-20 STL25 —— 老板要求：结清补发台账「按每页显示 25 条为基准，调整每行高度」
   ----------------------------------------------------------------------------
   目标：一屏恒 25 条，且第 25 行底边贴住框体底边；框体高度本身不变（仍 flex:1 撑满）。
   手法与员工管理（--emp-rows）/ 员工预支（--adv-rows）同一套配方，本批复制到结清补发：
     行高 =（框体内高 − 表头高）÷ 25，用 CSS 容器查询单位 cqh 由浏览器实时反推，
     零 JS、零 resize 监听、零重排。
   为什么本批还要动 td 的 padding / 操作列按钮（与 ADV25 的关键差异）——
     height 对 td 只是「最小高度」语义：内容自然高比它大时压不下去（坑 421-E）。
     实测本表一行自然高 = 40.5px（td 上下各 8px padding + 行内最高控件 .btn-sm 24px），
     而老板屏（截图 3549×1860 除以 DPR 2 ⇒ CSS 视口约 1785×935）框体内高只有 763px，
     25 行只给得起 (763 − 36) / 25 = 29.08px。⇒ 不把「行高地板」压到 29px 以下，
     clamp 再怎么写也压不动，一屏永远到不了 25 条。
     故本批同时压地板：td 上下 padding 8px 到 3px；操作列 .btn-sm 由 24px 收到 20px。
     压后地板实测 27.17px（最高控件变成 .adv-chip 20.67px）⇒ 29.08 目标可达。
   降级（有意）：视口太矮、公式值低于地板时，行高回落地板值，
     一屏显示 floor((可用 − 表头) / 地板) 条 —— 宁可行数少，也不挤压行内容。
     实测 1600×900 起可达 25 条；1366×768 一类矮屏约 20 条。
   cqh 不被支持时整条 height 声明失效，回落自然行高，行为安全。
   作用域：全部规则带 #view:has(.tbl-settle) 或 .tbl-settle 前缀 ⇒ 只本页；
     其它财务子页（预支 / 报税 / 供方费用 / 收支明细）与其它模块零影响。
   调参：只动下面 4 个变量（--stl-rows 改 30 就是每屏 30 条，行高自动跟）。
   回滚：删除本段即可（td padding 与 .btn-sm 两条也都在本段内，删段即恢复原状）。
     注意：本注释块内不得出现「星号加斜杠」的字符组合。
   ========================================================================== */
#view:has(.tbl-settle) {
  --stl-rows: 25;       /* 每屏条数 */
  --stl-head-h: 36px;   /* 表头高（由下方 th 规则固定，实测 36px） */
  --stl-row-min: 26px;  /* 行高地板（低于此值不再压，防挤坏内容） */
  --stl-row-max: 80px;  /* 行高天花板（防超大屏行距过大） */
}
/* 表头固定高 + 不换行：让公式里的「表头高」成为确定值，25 行才可能精确。
   本表表头是 <thead> 里的 tr-th（有 thead 包裹），通用规则 .table-wrap table thead th 命中得到；
   但那个通用规则的 height 不固定，这里显式钉死，顺带保证窄窗口下表头不换行。 */
#view:has(.tbl-settle) > #fin-sub > #stl-table.table-wrap.tbl-settle table th {
  height: var(--stl-head-h, 36px);
  white-space: nowrap;
}
/* 框体保留 flex:1 撑满 Box Pattern，并声明为「尺寸查询容器」——
   没有这句，后代的 100cqh 不生效（cqh 读的是容器内容盒高度，正是我们要的「框体高」）。 */
#view:has(.tbl-settle) > #fin-sub > #stl-table.table-wrap.tbl-settle {
  container-type: size;
  min-height: 120px;
}
/* ① 压「行高地板」：td 上下 padding 8px 到 3px；水平 8px 不变 ⇒ 表宽零变化。
   与既有 .tbl-settle.table-wrap table tbody td (0,3,3) 同特异性，靠本段在文件末尾取胜。 */
.tbl-settle.table-wrap table tbody td { padding: 3px 8px; }
/* ② 操作列按钮由 24px 收到 20px。不压它的话它是行内最高控件，地板仍是 30.5px，
   老板屏（目标 29.08px）就会差一口气、只显示 24 条。 */
.tbl-settle.table-wrap table tbody .btn-sm {
  height: 20px; min-height: 20px; padding: 1px 7px; font-size: 11.5px; line-height: 1.2;
}
/* ③ 行高 =（框体内高 − 表头）÷ 25 ⇒ 一屏恰好 25 条、恰好铺满。
   空态行（td 带 colspan）被 :not([colspan]) 排除，不受影响。 */
#view:has(.tbl-settle) .tbl-settle table tbody td:not([colspan]) {
  height: clamp(var(--stl-row-min, 26px), calc((100cqh - var(--stl-head-h, 36px)) / var(--stl-rows, 25)), var(--stl-row-max, 80px));
}


/* ============================================================================
   2026-09-21 RB24 —— 老板要求：员工预支台账「调整每条的高度，做成一个屏幕正好显示 25 条」。
   ----------------------------------------------------------------------------
   这不是新功能，是修 **ADV25（2026-09-17）段的静默失效**。
   现象：老板截图里一屏只有 20 行（目标 25），实测行高 37px，而公式值只有 29.88px。
   根因：ADV25 写了 height，但 **height 对 td 只是「最小高度」语义** ——
         行内最高控件把行撑破，规则命中却压不动（同一坑结清补发页 STL25 批记作「坑 421-E」）：
           · td 上下 padding 6px（ADV25 未压）                        ⇒ +12px
           · 操作列 .btn-sm 自然高约 24px                              ⇒ 单行地板 37px
           · 「未还金额」列是**双行**（金额 + 「承诺 ¥x/月」小字）      ⇒ 该行地板 42.25px
         框体内高 787px、表头 40px ⇒ 只给得起 (787−40)/25 = 29.88px；
         地板 37px 比它高 ⇒ 一屏 = floor(747/37) = 20 条（与老板截图一致）。
   本批照搬 STL25 三件套（压 td padding / 压行内按钮 / 压行高下限），
   外加**预支页特有的一条**：双行小字的行高必须一起收紧 ——
     真机实测只压到 padding 3px 时双行仍 36.25px、一屏 23 条；padding 0 时双行 30.25px、一屏 24 条；
     把小字收到 10px + line-height:1（配合 app-finance.js 去掉 margin-top:2px）才到 25 条。
   真机实测（Chromium，viewport 1785×912 @DPR2，框体 787px，与老板截图同条件）：
     · 改前                     行高 37 / 42.25      一屏 19~20 条
     · 只加本段 ①               行高 29.86（双行 36.25） 一屏 23 条
     · ①+②+③ + 小字收紧（定稿） 行高**全行统一 29.86**   一屏**恰好 25 条**，第 26 条不露头
   降级：视口太矮时公式值触下限 26px ⇒ 一屏 floor((可用−40)/26) 条，宁可行数少也不挤内容。
   作用域：选择器全带 .tbl-advances / #view:has(.tbl-advances) ⇒ 只本页；
     其它财务子页（结清补发 / 报税 / 供方费用 / 收支明细）与其它模块零影响。
   回滚：删掉本段，并把 app-finance.js 里「承诺 ¥x/月」小字的
     font-size:10px;line-height:1 改回 font-size:11px;margin-top:2px 即可复原。
     注意：本注释块内不得出现「星号加斜杠」的字符组合，否则会提前闭合注释并静默吃掉后续规则。
   ========================================================================== */
/* ③ 行高下限 30px → 26px（与结清补发页对齐）。不改它，矮视口下行高被 30px 托住，
   一屏条数会比目标少 1~2 条。与 ADV25 段同特异性 (1,1,0)，靠本段在文件末尾覆盖。 */
#view:has(.tbl-advances) { --adv-row-min: 26px; }

/* ① 压「行高地板」：td 上下 padding 6px → 0（水平 10px 不动 ⇒ 表宽零变化、不触发横向滚动）。
   为什么是 0 而不是像结清补发页那样 3px：本页「未还金额」是双行单元格，见上方实测。
   排除空态行（td 带 colspan），与 ADV25 的行高规则同口径。 */
.tbl-advances.table-wrap table tbody td:not([colspan]) { padding: 0 10px; }

/* ② 操作列按钮自然高约 24px → 20px（与结清补发页同一套数值）。
   删除按钮同带 .btn-sm 类（class="btn-danger btn-sm"），故一并被压到，无需单独写。 */
.tbl-advances.table-wrap table tbody .btn-sm {
  height: 20px; min-height: 20px; padding: 1px 7px; font-size: 11.5px; line-height: 1.2;
}

/* ============================================================================
   2026-09-21 RB26 老板要求：供方管理页表格框「只显示 20 条」
   ----------------------------------------------------------------------------
   背景：本页表格框 flex:1 撑满（框内 overflow-y:auto），行高是 2026-09-03 那批
        定的固定 33px（见上文「数据行统一 32px」段：.tbl-contracts table tbody td）。
        可用高度不是 33 的整数倍 ⇒ 最后一行常年露半截 —— 老板截图：20 条整
        + 第 21 条露一截。
   改法：行高改为按可用高度反推 (框内高 − 表头) ÷ 20 ⇒ 一屏恒为 20 条、
        恰好铺满、不露半行。与员工管理（--emp-rows）/ 员工预支（--adv-rows）/
        结清补发（--stl-rows）同一套配方（本段是第四份，口径完全一致）。
   实现：.table-wrap 加 container-type: size，行高用容器查询单位 cqh 计算。
         cqh 相对框体内容盒高度，随 flex 撑满实时跟随，零 JS、零重排、零 resize 监听。
   调参：只动下面 4 个变量即可（--sup-rows 改 25 就是每屏 25 条，行高自动跟），
        无需改选择器；改完 F5 即生效，免重启。
   降级：视口太矮（可用 < 20×26 + 表头 ≈ 552px）时行高触 26px 下限，
        一屏显示 floor((可用−表头)/26) 条 —— 宁可行数少，也不挤压行内容。
        （下限取 26 而非 28：本页操作列按钮未做压缩，实测自然高 24.5~25px，
          26 已留 1px 余量；取 28 会让 552~592 这段视口白白少显示 1 条。）
        cqh 不被支持时整条 height 声明失效，自动回落 2026-09-03 的固定 33px，
        行为与改前逐项一致，安全。
   取整：本页行高实测由浏览器向上取整到 1/64px（如公式 30.1315 ⇒ 渲染 30.140625），
        故 20 行合计最多超出可用高度 20/64 = 0.3125px —— 被裁掉的是第 20 行底边
        0.31px，人眼不可见；且第 21 行永远露不出来（这是「只显示 20 条」的关键）。
   兼容：选择器全部带 #view:has(#sup-approval-host) 前缀 ⇒ 仅本页生效；
        员工管理 / 员工预支 / 结清补发 / 用工单位 / 工伤 / 合同等表格完全不受影响。
   ========================================================================== */
#view:has(#sup-approval-host) {
  --sup-rows: 20;        /* 每屏行数（老板指定 20） */
  --sup-head-h: 32px;    /* 表头高（实测 32.38px，取整 32） */
  --sup-row-min: 26px;   /* 行高下限（防挤压：操作列按钮自然高约 24.5~25px，留 1px 余量） */
  --sup-row-max: 80px;   /* 行高上限（防超大屏行距过大） */
}
#view:has(#sup-approval-host) #list-area > .table-wrap.tbl-contracts {
  container-type: size;  /* 使后代可用 cqh 读到框体高度 */
}
/* 行高 = (框体内高 − 表头) ÷ 每屏行数 ⇒ 一屏恰好 20 条、恰好铺满。
   排除空态行（td 带 colspan），与其它三页同口径。 */
#view:has(#sup-approval-host) #list-area > .table-wrap.tbl-contracts table tbody td:not([colspan]) {
  height: clamp(var(--sup-row-min, 26px), calc((100cqh - var(--sup-head-h, 32px)) / var(--sup-rows, 20)), var(--sup-row-max, 80px));
}

/* ===== 2026-09-23 数据中心改版：新增 5 面板的「三格数值条」=====
   数字色 2026-09-23 纠正：原沿用深色主题的 #e2e8f0/#fbbf24/#34d399 在白底上对比度仅 1.14~1.77:1
   （WCAG AA 需 ≥4.5），已改为深色 #0f172a/#b45309/#047857（4.61~16.47:1），白底上清晰可读。 */
.ck-stat { display: flex; flex-direction: column; gap: 6px; padding: 2px 0; }
.ck-stat .ck-st { display: flex; align-items: baseline; gap: 8px; padding: 4px 7px; border-radius: 6px; background: rgba(148,163,184,.10); }
.ck-stat .ck-st .lb { font-size: 11px; color: #94a3b8; flex: none; min-width: 58px; }
.ck-stat .ck-st .vl { font-size: 15px; font-weight: 600; color: #0f172a; }
.ck-stat .ck-st .sb { font-size: 11px; color: #94a3b8; margin-left: auto; text-align: right; }
.ck-stat .ck-st.warn { background: rgba(251,191,36,.14); }
.ck-stat .ck-st.warn .vl { color: #b45309; }
.ck-stat .ck-st.ok { background: rgba(52,211,153,.12); }
.ck-stat .ck-st.ok .vl { color: #047857; }
/* 底部 foot 区改为两行两栏（原只有一个 ck-wide 面板） */
.ck-foot .ck-row2 { margin-top: 10px; }
.ck-foot .ck-row2:first-child { margin-top: 0; }

/* ===== 2026-09-23 数据中心大屏 · 布局收口（LAYFIX）=====
   老板反馈：「中间不要空这么多 突兀的很 整体适配一点 适当美化下」
   根因：三列面板数量不均（左3 / 中5 / 右4），网格高度由最高列决定 ⇒ 左列下方露 467px、
        中列露 360px 的页面背景。修法＝三列等高 + 每列最后一块吸收余量 + 重分配面板。
   另修：DC 批新增的 .ck-stat 数字色 #e2e8f0 是深色主题残留，白底上对比度仅约 1.06:1（几乎看不见）。 */

/* ---------- 1) 三列齐平：不再露出大片空白背景 ---------- */
.ck-grid { align-items: stretch; gap: 12px; }
.ck-col { gap: 12px; }
.ck-col > :last-child { flex: 1 1 auto; min-height: 0; }
.ck-col > .ck-row2:last-child { flex: 1 1 auto; align-items: stretch; }

.ck-col > .ck-panel:last-child,
.ck-col > .ck-row2:last-child > .ck-panel { display: flex; flex-direction: column; }
.ck-col > .ck-panel:last-child > .bd-body,
.ck-col > .ck-row2:last-child > .ck-panel > .bd-body {
  flex: 1; display: flex; flex-direction: column; justify-content: flex-start;
}

/* 被拉伸时让「行 / 格」一起长高，而不是底部留一块死白 */
.ck-col > :last-child .bd-body > .ck-stat { flex: 1; }
.ck-col > :last-child .bd-body > .ck-stat > .ck-st { flex: 1 1 auto; }
.ck-col > :last-child .bd-body > .ck-row { flex: 1 1 auto; }
.ck-col > :last-child .bd-body > .ck-alert { flex: 1 1 auto; }
/* 图表面板被拉伸时把图纵向居中 */
.ck-col > :last-child .bd-body > svg { margin: auto 0; }

/* ---------- 2) 配色纠错：.ck-stat 数字原为近白 #e2e8f0（白底对比度仅 1.14:1）
   已在上方 .ck-stat 原块内就地改为深色（#0f172a / #b45309 / #047857），此处只微调底色 ---------- */
.ck-stat .ck-st.warn { background: rgba(251,191,36,.16); }
.ck-stat .ck-st.ok { background: rgba(52,211,153,.14); }

/* ---------- 3) 整体适配与细节美化 ---------- */
.ck-head { padding: 2px 2px 14px; margin-bottom: 14px; }
.ck-kpis { gap: 12px; margin-bottom: 14px; }
.ck-kpi { border-radius: 12px; box-shadow: 0 1px 2px rgba(15,23,42,.05), 0 2px 10px rgba(15,23,42,.035); }
.ck-kpi .vl { font-size: 21px; }

.ck-panel { border-radius: 12px; box-shadow: 0 1px 2px rgba(15,23,42,.05), 0 2px 10px rgba(15,23,42,.035); }
.ck-panel > header { padding: 9px 13px; }
.ck-panel h3 { font-size: 13px; font-weight: 600; color: #334155; }
.ck-panel .bd-body { padding: 10px 12px 12px; }
.ck-row2 { gap: 12px; }

.ck-row { padding: 6.5px 2px; }
.ck-stat { gap: 7px; }
.ck-stat .ck-st { padding: 7px 9px; border-radius: 8px; }
.ck-stat .ck-st .lb { min-width: 62px; }
.ck-alert { padding: 7px 10px; border-radius: 8px; }

/* 空态：原 26px 上下留白偏大；另给「一句话说明」型空态一个小号样式 */
.ck-empty { padding: 20px 0; }
.ck-empty-sm { padding: 16px 6px; line-height: 1.6; }

/* 底部区域与网格保持同一节奏 */
.ck-foot { margin-top: 12px; }
.ck-foot .ck-row2 { margin-top: 12px; }

/* 中列：余量交给首块「区域派驻分布」（气泡图 + 排名区可以自然长高），末块保持自然高度不拉伸 */
.cockpit .ck-bubble { max-height: none; }
.ck-col.ck-main > .ck-row2:last-child { flex: 0 0 auto; }

/* 中列残余收口：让首块「区域派驻分布」吃掉最后一点高度
   ⇒ 三列内容底边与网格底边严格对齐（实测 0/0/0px，1920~1152 四档屏宽一致） */
.ck-col.ck-main > .ck-panel:first-child { flex: 1 1 auto; }

/* ===== PADFIX / PADFIX2 / PADFIX3（2026-09-23 老板截图反馈）：列表页「表格框体下沿空隙」收口 =====
   现场（老板两张截图 + 真页面实测 1680×1000 与 1440×800，与视口高度无关）：
     · 改造前 员工管理页：框体下沿到窗口底 = 25px
     · 改造前 员工预支页：框体下沿到窗口底 = 43px
   组成（两页的结构同为「表格框体 flex:1 撑满 → 框体下面还剩两截」）：
     ① .content 底部内边距：员工页 4px（app.js 运行时注入的 EMPFILL）、预支页 22px（吃全局默认）
     ② 折叠态翻页条 21px（平时隐身但照样占位）
   口径（老板 2026-09-23 拍 B 案：翻页条的位置与形态都不动，两页统一到同一条线）：
     ① 折叠态翻页条 → 原生 13px：上下 padding 归零，并去掉 0.8 等比缩放
        （原来 11px 字号被缩到 8.8px，现在 10.5px 原尺寸 —— 反而更清楚）
     ② 展开态也是 13px（按钮 / 页码块 / 下拉一并收）⇒ 展开时不会把框体顶上去，零位移
     ③ 内容区底部内边距 → 7px（PADFIX2 压到 2px 得 15px、抬到 12px 得 25px；PADFIX3 老板复看后要 20px）
   作用域：全部用 :has() 挂在两页上；其它 .table-wrap 页面（供方 / 工伤 / 合同 / 结清…）零影响。
   为什么用 !important：app.js 运行时会往 head 追加一条
     body:has(#emp-pager) .content{padding-bottom:4px}（EMPFILL），
   该 style 排在 styles.css 之后，同特异性下按顺序会盖掉本文件 ⇒ 必须提升优先级才生效。
   验收：部署后两页实测均为 20px（内容区底部 7px + 折叠态翻页条 13px），hover 浮现与翻页功能不变。 */
body:has(#emp-pager) .content { padding-bottom: 7px !important; }
body:has(#adv-pager) .content { padding-bottom: 7px !important; }
#emp-pager,
#adv-pager { padding: 0 4px !important; transform: none !important; }
#emp-pager .emp-pager-info,
#adv-pager .adv-pager-info { font-size: 10.5px !important; line-height: 13px !important; }
#emp-pager .emp-pager-btn,
#adv-pager .adv-pager-btn { height: 13px !important; line-height: 11px !important; font-size: 10.5px !important; padding: 0 6px !important; }
#emp-pager .emp-pager-cur,
#adv-pager .adv-pager-cur { height: 13px !important; line-height: 13px !important; font-size: 10.5px !important; min-width: 16px !important; padding: 0 5px !important; }
#emp-pager select,
#adv-pager select { height: 13px !important; font-size: 10.5px !important; padding: 0 2px !important; }

/* @VCHNUM 2026-09-24（老板：红框位置加序号 + 压缩每行高度 + 每页30行）—— 记账凭证列表
   行高压缩：只压纵向（水平 padding、字号一律不动）；选择器带 .tbl-vouchers 提高优先级，
   压过 2026-09-02 的通用 -10% 段（tbody 7.2px / thead 8.2px 对本表同样生效过）。 */
.table-wrap.tbl-vouchers table thead th { padding-top: 4px; padding-bottom: 4px; }
.table-wrap.tbl-vouchers table tbody td { padding-top: 3px; padding-bottom: 3px; }
.tbl-vouchers tfoot td { padding-top: 3px; padding-bottom: 3px; }
.vch-table th.vch-idx, .vch-table td.vch-idx { text-align: center; color: #94a3b8; width: 42px; }
#vch-pager { opacity: 0; transition: opacity .15s; }
#vch-pager:hover { opacity: 1; }

/* @VCH30 2026-09-24（老板：「记账凭证页面 跟员工管理一样 但固定显示行数从25行改为30行；红框高度改为固定的20px」）
   记账凭证列表：框体撑满 ＋ 一屏30行 ＋ 框下留白固定20px
   参照物：员工管理页整套（本文件 1998 起的 flex 拉满块）＋ 四页同款 cqh 配方
  （员工 --emp-rows ／ 预支 --adv-rows ／ 结清 --stl-rows ／ 供方 --sup-rows，本段是第五份）。
   改造前现场（真浏览器 1920x1080 实测）：#view 是 block、框体只有自然高 977px，
  30 行压扁后框下露出大条空白（老板截图红框），且页面整体还溢出 69px 要滚动。
   改法（与员工管理页完全同构）：
     ① #view → #vch-list → .table-wrap 逐级 flex:1 拉满 ⇒ 框体撑满、红框消失、页面不滚
     ② 行高 =（框体内高 − 表头 − 合计行）÷ 30，用容器查询单位 cqh 由浏览器实时反推
       （本表比员工页多一个 tfoot 合计行 ⇒ 公式多减一项 --vch-foot-h，零 JS 零监听）
     ③ 框下留白 = 隐身态翻页条 13px ＋ .content padding-bottom 7px = 固定 20px
       （翻页条内联样式在 app-modules.js vchPagerHtml 同批收成 13px，与员工／预支页
         PADFIX3 后的口径完全一致；内容底距 7px 也与该两页同口径）
     ④ 表头 sticky（内滚时钉住）、操作列按钮压到 20px，与结清／预支页同款
   降级：视口太矮、公式值低于行自然高时行高触自然地板，一屏少几条（宁少不挤，框内滚动）。
   调参：只动下面 5 个变量（--vch-rows 改 N 就是一屏 N 行，改完 F5 即生效）。
   作用域：全部带 #view:has(.tbl-vouchers) ／ .tbl-vouchers ／ body:has(#vch-pager) 前缀
  ⇒ 仅记账凭证页；员工／预支／结清／供方／合同／工伤等页零影响。
   回滚：删除本段 ＋ vchPagerHtml 三处内联样式还原 ＋ index.html 版号还原（erp_backups 本批目录）。
   注意：本注释块内不得出现「星号紧跟斜杠」的字符组合（会提前闭合注释并静默吃掉后续规则）。
   ========================================================================== */
#view:has(.tbl-vouchers) {
  --vch-rows: 30;        /* 每屏行数（老板指定 30） */
  --vch-head-h: 25px;    /* 表头高（由下方 th 规则钉死；自然高 24.5 ⇒ 25 生效） */
  --vch-foot-h: 23px;    /* 合计行高（由下方 tfoot 规则钉死；自然高 22.5；员工页无此项） */
  --vch-row-min: 26px;   /* 行高下限（防挤压） */
  --vch-row-max: 46px;   /* 行高上限（防超大屏行距过大） */
}
/* ① 逐级拉满：与员工页 #view:has(.tbl-employees) 同构 */
#view:has(.tbl-vouchers) { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
#view:has(.tbl-vouchers) > .view-head { flex-shrink: 0; }
#view:has(.tbl-vouchers) > #vch-list { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
#view:has(.tbl-vouchers) > #vch-list > .table-wrap.tbl-vouchers {
  flex: 1 1 auto; min-height: 0;
  overflow-y: auto;      /* 全局 .table-wrap 是 overflow-y:hidden，内滚必须有它 */
  container-type: size;  /* 使后代可用 cqh 读到框体高度 */
}
#view:has(.tbl-vouchers) > #vch-list > #vch-pager { flex-shrink: 0; }
/* ② 表头 ／ 合计行钉死高度：公式里两个扣减项必须成为确定值，30 行才可能精确。
   全局 box-sizing:border-box ⇒ height 含 padding（表头自然 24.5、合计行自然 22.5）。 */
#view:has(.tbl-vouchers) .tbl-vouchers table thead th { height: var(--vch-head-h, 25px); }
#view:has(.tbl-vouchers) .tbl-vouchers table tfoot td { height: var(--vch-foot-h, 23px); }
/* ③ 行高 =（框体内高 − 表头 − 合计行）÷ 30 ⇒ 一屏恰好 30 条、恰好铺满。 */
#view:has(.tbl-vouchers) .tbl-vouchers table tbody td:not([colspan]) {
  height: clamp(var(--vch-row-min, 26px), calc((100cqh - var(--vch-head-h, 25px) - var(--vch-foot-h, 23px)) / var(--vch-rows, 30)), var(--vch-row-max, 46px));
}
/* ④ 操作列按钮 24px → 20px（与结清／预支页同一套数值）：不压它它是行内最高控件，
   行高地板降不下来，矮视口会白白发不到 30 行。 */
.tbl-vouchers.table-wrap table tbody .btn-sm { height: 20px; min-height: 20px; padding: 1px 7px; font-size: 11.5px; line-height: 1.2; }
/* ⑤ 表头 sticky（内滚钉住），与员工页同款；显式背景避免露出框体渐变底。 */
#view:has(.tbl-vouchers) .table-wrap.tbl-vouchers thead th { position: sticky; top: 0; z-index: 2; background: #f1f5f9; box-shadow: inset 0 -1px 0 #e2e8f0; border-bottom: 0; }
#view:has(.tbl-vouchers) .table-wrap.tbl-vouchers thead th:last-child { z-index: 3; }
/* ⑥ 框下留白固定 20px ＝ 隐身翻页条 13px ＋ 本条 7px，与员工／预支页（PADFIX3 口径）一致。
   用 !important 与该两行保持同一形态（本页虽无 EMPFILL 运行时注入，统一形态防将来静默失效）。 */
body:has(#vch-pager) .content { padding-bottom: 7px !important; }

/* ══════════ @FCW 2026-10-01 财务总览主表 列宽再适配（老板口径）═════════════
   老板原话：「用人单位宽度压缩30%，金额/税额两个框体宽度加大50%，框体整体再适配下」
   ---------------------------------------------------------------------------
   展开态（16 列）改动（其余列一分不动）：
     unit      8.20 → 5.74  （-30%）
     open-amt  4.20 → 6.30  （+50%）
     open-tax  3.10 → 4.65  （+50%）
   缺口 = (6.30-4.20)+(4.65-3.10)-(8.20-5.74) = +1.19pp，由**内容最宽松**的两类列让出：
     ③分账 5 个子列  6.62 → 6.42  （各让 0.20，合计 1.00）
     结算日历        6.90 → 6.71  （让 0.19，补齐）
   ⇒ 16 列合计 = 2.2+5.74+6.30+4.65+7.3+7.6+6.42×5+10.0+7.1+7.5+6.71+2.8 = **100.00%** ✅
   折叠态（13 列）同口径：
     unit 10.40 → 7.28 / open-amt 5.60 → 8.40 / open-tax 4.00 → 6.00
     ③分账 5 子列 9.10 → 8.76（合计让 1.70pp）/ profit 10.00 → 10.02（承接 0.02 尾差）
   ⇒ 13 列合计 = 2.4+7.28+8.4+6.0+9.6+9.9+8.76×5+10.02+2.6 = **100.00%** ✅
   ---------------------------------------------------------------------------
   max-width 兜底：`.fc-table` 的 min-width 1600 → **1740px**。
     为什么必须同步抬：unit 压到 5.74% 后，最宽单位名「昆文（豪达）」实测文本宽 78px，
     需要列宽 ≥ 94px（含左右各 8px padding）；1600×5.74% = 91.8px ⇒ **会折行**。
     1740×5.74% = 99.9px（内容区 83.9px，余量 5.9px）⇒ 不折行。
     对内容区 ≥1740px 的窗口（1920/2200/2560）零影响；只有 1600~1740 的窗口改为横向滚动
     —— 与「宁横向滚动也不压扁」的既有口径一致。
   ---------------------------------------------------------------------------
   实测依据（真浏览器 Playwright，改前基线）：
     · 金额列在 1600 档溢出 18 格、1920 档溢出 4 格（最长「¥210,098.55」需 82px，
       列宽仅 79.6px）；税额列 1920 档溢 1 格（最长「¥3,956.04」需 67px，列宽 58.7px）
       ⇒ 老板「金额/税额太挤」的判断属实，加宽 50% 后两档溢出全部归零。
     · 改后 4 档屏宽（1600/1920/2200/2560）：表体零溢出、零折行、行高恒 42.02px。
   回滚：把上列 11 个数值改回原值 + min-width 回 1600px 即可（无结构改动）。
   ══════════════════════════════════════════════════════════════════════════ */
/* ══════════ @INVFACE 2026-09-24 财务总览 ①开票 拆「金额+税额」两列 + 表底合计行 ══════════ */
/* ① 开票 7.3% 拆两列：金额 4.2% + 税额 3.1%（合计=7.3%，其它列宽一分不动） */
.fc-table .fc-col-open-amt { width: 6.3%; }
.fc-table .fc-col-open-tax { width: 4.65%; }
.fc-table-panel.fc-cols-collapsed .fc-col-open-amt { width: 8.4%; }
.fc-table-panel.fc-cols-collapsed .fc-col-open-tax { width: 6.0%; }
/* 两级表头：①开票 组头染 ③分账 同款浅蓝（子头走 fc-h2 通用浅蓝） */
.fc-table-panel .fc-table thead tr.fc-h1 th.fc-th-open { background: #e8effb; color: #1d4ed8; }
/* 税额为 0 的「—」淡化（与表体 — 同语言） */
.fc-table .fc-tax-cell .fc-tax-zero { color: #cbd5e1; }
/* 表底合计行：浅底 + 加粗 + 上边框；标签格左对齐 */
.fc-table tr.fc-total-row td { background: #f8fafc; font-weight: 700; border-top: 2px solid #cbd5e1; }
.fc-table tr.fc-total-row td.fc-total-label { text-align: left; padding-left: 12px; color: #334155; }


/* ============================================================================
   @IEFIT 2026-09-24（老板：「收支明细 这页面完全按照员工管理页面设置及美化
     ①绿框中的折叠按钮 ②整屏显示25条 ③每页可显示 100/200/500 及左下角隐藏按钮」）
   ----------------------------------------------------------------------------
   本页是**第六份同款配方**（前五份：员工 --emp-rows ／ 预支 --adv-rows ／
   结清 --stl-rows ／ 供方 --sup-rows ／ 记账凭证 --vch-rows），逐项照抄员工管理页。
   ① 操作列折叠按钮 ⊟：表头「操作」右侧
      （按钮 DOM 在 app-finance.js renderIncomeExpense 的 head 里；点击切换与持久化
        复用 app.js 的 .col-ops-toggle 全局委托，本批把 .tbl-fin_bank 加进白名单）
   ② 一屏恰好 25 条：行高用容器查询单位 cqh 由浏览器实时反推，零 JS、零 resize 监听
   ③ 分页条（左下角）：每页 100 / 200 / 500 / 全部 ＋ 默认整条隐身、hover 浮现
      ＋「翻页」折叠开关（与员工页 EMPFOLD / EMPHOVER 同款）
   作用域：全部带 #view:has(.fin-bank-table) ／ .tbl-fin_bank ／ body:has(#ie-pager) 前缀
     ⇒ 仅「收支明细」页；同 Hub 的工资计算 / 政府报税 / 供方费用页，以及其它全部表格页零影响。
   调参：只动下面 4 个变量（--ie-rows 改 N 就是一屏 N 行，行高自动跟着变），改完 F5 即生效。
   降级：视口太矮时行高触 26px 下限，一屏少几条（宁可行数少，也不挤压行内容）；
        浏览器不支持 cqh 时整条 height 声明失效，回落原自然行高，行为安全。
   回滚：删除本段 ＋ app.js 白名单还原 ＋ index.html 三个版号还原（erp_backups 本批目录）。
   注意：本注释块内不得出现「星号紧跟斜杠」的字符组合（会提前闭合注释并静默吃掉后续规则）。
   ========================================================================== */
#view:has(.fin-bank-table) {
  --ie-rows: 25;         /* 每屏行数（老板指定 25，与员工管理页一致） */
  --ie-head-h: 30px;     /* 表头高（由下方 th 规则钉死） */
  --ie-row-min: 26px;    /* 行高下限（防挤压） */
  --ie-row-max: 46px;    /* 行高上限（防超大屏行距过大） */
}
/* ① 逐级拉满：与员工页 #view:has(.tbl-employees) 同构 —— #view → #fin-sub → #ie-table → .table-wrap */
#view:has(.fin-bank-table) { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
#view:has(.fin-bank-table) > #fin-sub { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
#view:has(.fin-bank-table) > #fin-sub > :not(#ie-table) { flex-shrink: 0; }
#view:has(.fin-bank-table) > #fin-sub > #ie-table { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
#view:has(.fin-bank-table) #ie-table > .table-wrap {
  flex: 1 1 auto; min-height: 0;
  overflow-y: auto;      /* 全局 .table-wrap 是 overflow-y:hidden，内滚必须有它 */
  container-type: size;  /* 使后代可用 cqh 读到框体高度 */
}
#view:has(.fin-bank-table) #ie-table > #ie-pager { flex-shrink: 0; }
/* ② 表头钉死高度：公式里的扣减项必须成为确定值，25 行才可能精确（全局 box-sizing:border-box）。 */
#view:has(.fin-bank-table) .fin-bank-table thead th { height: var(--ie-head-h, 30px); }
/* ③ 行高 =（框体内高 − 表头）÷ 25 ⇒ 一屏恰好 25 条、恰好铺满。
      td:not([colspan]) 排除「代发明细」展开行（colspan=14）与内嵌明细表，避免带偏行高。 */
#view:has(.fin-bank-table) #ie-table > .table-wrap table.fin-bank-table tbody td:not([colspan]) {
  height: clamp(var(--ie-row-min, 26px), calc((100cqh - var(--ie-head-h, 30px)) / var(--ie-rows, 25)), var(--ie-row-max, 46px));
}
/* ④ 操作列按钮压到 20px（与员工／预支／凭证页同一套数值）：不压它它就是行内最高控件，
      行高地板降不下来，矮视口会白白发不到 25 行。 */
#ie-table .fin-bank-table td.row-op .btn-sm { height: 20px; min-height: 20px; padding: 1px 7px; font-size: 11.5px; line-height: 1.2; }
/* ④′ 本页行内边距压缩：.fin-bank-table 的 th/td 全局是 9px 上下，叠加 12px 字行高后
      自然行高 ≈ 35px —— 一屏只显示得下 21 条，且行高被内容顶穿、cqh 算出的值根本不生效。
      参照员工／预支／凭证页口径压到 3px，让 ③ 的公式值真正落地（一屏恰好 25 条）。 */
#view:has(.fin-bank-table) #ie-table > .table-wrap table.fin-bank-table tbody td:not([colspan]) { padding-top: 3px; padding-bottom: 3px; }
#view:has(.fin-bank-table) #ie-table > .table-wrap table.fin-bank-table thead th { padding-top: 3px; padding-bottom: 3px; }
/* ⑤ 表头 sticky（内滚钉住），与员工页同款；显式背景避免露出框体渐变底。 */
#view:has(.fin-bank-table) #ie-table > .table-wrap thead th { position: sticky; top: 0; z-index: 2; background: #f1f5f9; box-shadow: inset 0 -1px 0 #e2e8f0; border-bottom: 0; }
#view:has(.fin-bank-table) #ie-table > .table-wrap thead th:last-child { z-index: 3; }
/* ⑥ 框下留白固定 20px ＝ 隐身翻页条 13px ＋ 本条 7px，与员工／预支／凭证页（PADFIX3 口径）一致。 */
body:has(#ie-pager) .content { padding-bottom: 7px !important; }
/* ⑦ 分页条：默认整条隐身、鼠标移入浮现（与员工页 EMPHOVER 同款）；
      尺寸收窄到 13px 原生，与员工／预支／凭证页同一条线（PADFIX3 口径）。 */
#ie-pager { opacity: 0; transition: opacity .15s; padding: 0 4px !important; }
#ie-pager:hover { opacity: 1; }
#ie-pager .ie-pager-info { font-size: 10.5px !important; line-height: 13px !important; }
#ie-pager .ie-pager-btn { height: 13px !important; line-height: 11px !important; font-size: 10.5px !important; padding: 0 6px !important; }
#ie-pager .ie-pager-cur { height: 13px !important; line-height: 13px !important; font-size: 10.5px !important; min-width: 16px !important; padding: 0 5px !important; }
#ie-pager select { height: 13px !important; font-size: 10.5px !important; padding: 0 2px !important; }
/* ⑧ 操作列折叠按钮 ⊟（表头「操作」右侧）—— 与员工管理页 .tbl-employees 那套逐字同款：
      按钮绝对定位在表头格右侧，折叠只藏行内写操作按钮、保留「操作记录」常驻可见，
      再点一次变 + 展开。 */
.tbl-fin_bank th.row-op-head { position: relative; padding-right: 28px; }
.tbl-fin_bank th.row-op-head .col-ops-toggle {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  width: 20px; height: 20px; padding: 0; line-height: 1; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #475569;
  font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center;
  transition: background .12s, border-color .12s, color .12s;
}
.tbl-fin_bank th.row-op-head .col-ops-toggle:hover { background: #f1f5f9; border-color: #94a3b8; color: #1e293b; }
.tbl-fin_bank th.row-op-head .col-ops-toggle:active { background: #e2e8f0; }
.tbl-fin_bank.col-collapsed td.row-op .row-actions > *:not([data-flog]) { display: none !important; }
.tbl-fin_bank.col-collapsed td.row-op { padding-right: 2px; }
.tbl-fin_bank.col-collapsed th.row-op-head .col-ops-toggle { background: #2563eb; color: #fff; border-color: #2563eb; width: 14px; height: 14px; right: 1px; font-size: 10.5px; line-height: 1; }

/* =============================================================================
 * 公司制度墙（2026-09-25 CP · 内部管理 → 公司制度）
 *   卡片墙（默认）/ 表格双视图，右上角 .seg 切换；仅管理员可见（后端 403 为权威）
 * ========================================================================== */
.cp-tabs { display: flex; flex-wrap: wrap; gap: 8px; margin: 10px 0 14px; }
.cp-tab {
  border: 1px solid #e2e8f0; background: #fff; color: #475569;
  padding: 6px 13px; border-radius: 999px; font-size: 13px; cursor: pointer;
  transition: background .15s, border-color .15s, color .15s;
}
.cp-tab:hover { border-color: #93c5fd; color: #1d4ed8; }
.cp-tab.active { background: #2563eb; border-color: #2563eb; color: #fff; font-weight: 600; }
.cp-tab-n {
  display: inline-block; margin-left: 6px; min-width: 18px; padding: 0 5px;
  border-radius: 9px; background: #f1f5f9; color: #64748b; font-size: 11px; line-height: 17px; text-align: center;
}
.cp-tab.active .cp-tab-n { background: rgba(255, 255, 255, .28); color: #fff; }

.cp-empty { padding: 46px 0; text-align: center; color: #94a3b8; font-size: 14px; }
.cp-loading { padding: 46px 0; text-align: center; color: #94a3b8; font-size: 14px; }

/* ---- 卡片墙 ---- */
.cp-grid {
  display: grid; gap: 14px;
  grid-template-columns: repeat(auto-fill, minmax(258px, 1fr));
}
.cp-card {
  background: #fff; border: 1px solid #e8edf3; border-radius: 12px; padding: 14px 15px 11px;
  display: flex; flex-direction: column; min-height: 148px;
  box-shadow: 0 1px 2px rgba(15, 23, 42, .04);
  transition: box-shadow .16s, border-color .16s, transform .16s;
}
.cp-card:hover { border-color: #bfd4f7; box-shadow: 0 6px 16px rgba(37, 99, 235, .12); transform: translateY(-1px); }
.cp-card-top { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.cp-card-ic { font-size: 21px; line-height: 1; }
.cp-badge {
  font-size: 11.5px; color: #1d4ed8; background: #eff6ff; border: 1px solid #dbeafe;
  padding: 2px 8px; border-radius: 999px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cp-card-title {
  font-size: 14.5px; font-weight: 600; color: #1e293b; line-height: 1.45; margin-bottom: 6px;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.cp-card-sub { font-size: 12.5px; color: #64748b; margin-bottom: 10px; word-break: break-all; }
.cp-card-foot { margin-top: auto; display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.cp-card-meta { font-size: 11.5px; color: #94a3b8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cp-card-ops { display: flex; gap: 4px; flex: none; }

.cp-op {
  border: none; background: transparent; color: #2563eb; font-size: 12.5px;
  padding: 3px 6px; border-radius: 6px; cursor: pointer;
}
.cp-op:hover { background: #eff6ff; }
.cp-op.danger { color: #dc2626; }
.cp-op.danger:hover { background: #fef2f2; }

/* ---- 表格 ---- */
.cp-table { width: 100%; border-collapse: collapse; background: #fff; font-size: 13px; }
.cp-table th, .cp-table td { border: 1px solid #e8edf3; padding: 8px 10px; text-align: left; vertical-align: middle; }
.cp-table th { background: #f8fafc; color: #475569; font-weight: 600; white-space: nowrap; }
.cp-table tbody tr:hover { background: #f8fbff; }
.cp-table .cp-t-title { font-weight: 600; color: #1e293b; }
.cp-table .cp-t-file { color: #64748b; word-break: break-all; }

/* ---- 弹窗 ---- */
.cp-viewbox {
  max-height: 62vh; overflow: auto; white-space: pre-wrap; word-break: break-word;
  font-size: 13.5px; line-height: 1.85; color: #1e293b; background: #f8fafc;
  border: 1px solid #e8edf3; border-radius: 8px; padding: 14px 16px;
}
.cp-form { display: flex; flex-direction: column; gap: 12px; }
.cp-frow { display: flex; align-items: flex-start; gap: 10px; }
.cp-frow > span { flex: none; width: 52px; font-size: 13px; color: #475569; line-height: 30px; }
.cp-frow select, .cp-frow input[type="text"], .cp-frow textarea {
  flex: 1; border: 1px solid #d7dee8; border-radius: 8px; padding: 6px 10px; font-size: 13px; color: #1e293b;
}
.cp-frow textarea { line-height: 1.7; resize: vertical; }
.cp-frow input[type="file"] { flex: 1; font-size: 13px; padding-top: 4px; }
.cp-hint { font-size: 12px; color: #94a3b8; margin-top: 5px; line-height: 1.6; }
.cp-filebox, .cp-textbox { align-items: flex-start; }
.cp-filebox > span, .cp-textbox > span { line-height: 24px; }
.cp-filebox > .cp-hint, .cp-textbox > .cp-hint { flex: none; }
.cp-seg { display: inline-flex; border: 1px solid #d7dee8; border-radius: 8px; overflow: hidden; }
.cp-seg button {
  border: none; background: #fff; color: #475569; font-size: 13px; padding: 6px 14px; cursor: pointer;
}
.cp-seg button.active { background: #2563eb; color: #fff; font-weight: 600; }

@media (max-width: 640px) {
  .cp-grid { grid-template-columns: 1fr; }
  .cp-frow { flex-direction: column; gap: 4px; }
  .cp-frow > span { width: auto; line-height: 1.6; }
}

/* ============================================================================
   2026-09-26 STLCOL —— 老板要求：结清补发台账「操作」列加折叠按钮（参考员工管理页），默认折叠。
   ----------------------------------------------------------------------------
   机制与 .tbl-advances / .tbl-vouchers / .tbl-fin_bank 完全同款：表头 ⊟ 按钮
   （.col-ops-toggle）+ 框体挂 .col-collapsed 类 ⇒ 本段负责折叠后的视觉。
   点击绑定**不在** app/10-misc.js 的全局委托白名单里（那份白名单只收录
     employees / reimbursements / contracts / client_companies / vouchers / fin_bank 六页），
   本批刻意**不扩白名单** ⇒ 其它页行为零变化；改由本页脚本自绑
   （public/js/fin/08-settle-list.js 末尾 @STLCOL 段），并**默认折叠 + 不持久化**
   （对齐员工管理页 EMPFOLD2 2026-09-24 口径：每次渲染一律回默认折叠态）。
   ⚠️ 特异性：本页表头另有两条既有规则 ——
     ① #view:has(.tbl-settle) > #fin-sub > #stl-table thead th   （position:sticky / z-index）
     ② .tbl-settle.table-wrap table thead th { padding: 10px 8px; }   （0,2,3）
     故本段 th 相关规则一律用 .tbl-settle.table-wrap table thead th.col-ops-th（0,3,3）起步，
     确保压过 ②；① 不设 padding，不构成冲突。
   ⚠️ 不得给 th.col-ops-th 写 position:relative —— ① 里的 sticky 是本页横向滚动时表头吸附的
     依赖，改成 relative 会直接破掉。折叠按钮走 position:absolute 时，**sticky 元素本身
     即是包含块**（CSS 规范：sticky 属 positioned），无需 relative。
   作用域：全部规则带 .tbl-settle 前缀 ⇒ 只有结清补发页命中（该 class 全站仅此一处）。
   回滚：删掉本段 + 还原 08-settle-list.js 的 @STLCOL 段即可。
   ========================================================================== */
.tbl-settle.table-wrap table thead th.col-ops-th { padding-right: 26px; }
.tbl-settle.table-wrap table thead th.col-ops-th .col-ops-toggle {
  position: absolute; right: 4px; top: 50%; margin-top: -8px;
  width: 16px; height: 16px; padding: 0; line-height: 1; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #475569;
  font-size: 11px; font-weight: 700;
  display: flex; align-items: center; justify-content: center;
}
.tbl-settle.table-wrap table thead th.col-ops-th .col-ops-toggle:hover { background: #f1f5f9; border-color: #94a3b8; color: #1e293b; }
.tbl-settle.col-collapsed th.col-ops-th .col-ops-th-label { display: none; }
.tbl-settle.table-wrap.col-collapsed table thead th.col-ops-th { padding-right: 2px; min-width: 16px; }
.tbl-settle.col-collapsed td.col-ops-td { display: none; }
.tbl-settle.col-collapsed th.col-ops-th .col-ops-toggle {
  background: #2563eb; color: #fff; border-color: #2563eb;
  width: 14px; height: 14px; right: 1px; margin-top: -7px; font-size: 10.5px;
}

/* ══════════════════════════════════════════════════════════════════
   2026-09-28 RECFOLD —— 招聘台账页（.tbl-onboarding_entries）操作列折叠
   ----------------------------------------------------------------------------
   老板原话：「红框移到右边角落去   默认折叠」（附招聘台账截屏，红框圈住表头
   「操作」列里那枚 ⊟ 按钮 —— 它当时是**浏览器默认按钮外观**，且压在「操作」二字上）。

   根因：招聘台账**不在「操作列折叠」体系的维护名单里**。该体系要求三处成对维护：
     (a) styles.css 专属样式段   (b) app/10-misc.js 的全局点击委托 selector
     (c) renderList 页在 app/05-list.js 的默认折叠白名单
   遗漏史：2026-09-11 报销页 / 09-12 供方页 / 09-14 用工单位页（三次复发）；
   另凭证页(.tbl-vouchers)、收支明细(.tbl-fin_bank)、结算补发(.tbl-settle) 各自另补。
   本页是**第四次同款遗漏** —— 表头渲染了按钮，但 (a)(b)(c) 三处都没覆盖。

   本段与 .tbl-contracts / .tbl-reimbursements 逐字节同形（零新设计）；追加在文件末尾，
   不插队、不改动任何既有规则 ⇒ 其余 6 个表的折叠行为逐字节不变。
   回滚：删掉本段 + 还原 10-misc.js / 05-list.js 的两处白名单即可。
   ========================================================================== */
.tbl-onboarding_entries th.col-ops-th { position: relative; padding-right: 28px; }
.tbl-onboarding_entries th.col-ops-th .col-ops-toggle {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  width: 20px; height: 20px; padding: 0; line-height: 1; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #475569;
  font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center;
  transition: background .12s, border-color .12s, color .12s;
}
.tbl-onboarding_entries th.col-ops-th .col-ops-toggle:hover { background: #f1f5f9; border-color: #94a3b8; color: #1e293b; }
.tbl-onboarding_entries th.col-ops-th .col-ops-toggle:active { background: #e2e8f0; }
.tbl-onboarding_entries.col-collapsed th.col-ops-th .col-ops-th-label { display: none; }
.tbl-onboarding_entries.col-collapsed th.col-ops-th { padding-right: 2px; min-width: 16px; }
.tbl-onboarding_entries.col-collapsed td.col-ops-td { display: none; }
.tbl-onboarding_entries.col-collapsed th.col-ops-th .col-ops-toggle { background: #2563eb; color: #fff; border-color: #2563eb; width: 14px; height: 14px; right: 1px; font-size: 10.5px; line-height: 1; }

/* =====================================================================
   2026-09-30 IECOMPACT：收支明细页竖向压缩（温和档）+ 余额退回小角标
   —— 老板口径：「红框中的都隐藏，界面再紧凑一点」
   ⚠️ 全部限定在 .ie-stats / #ie-table 作用域内 ⇒ 其它页面零影响。
   ⚠️ 本段位于文件末尾，且 #ie-table 前缀把特异性提到 (1,1,1)
      > 原 .fin-bank-table td (0,1,1)，无需 !important 即可生效。
   ===================================================================== */

/* (1) 统计卡与表格整体收紧 */
.ie-stats { margin-bottom: 8px; }                          /* 原 12px */
#ie-table .fin-bank-table th,
#ie-table .fin-bank-table td { padding: 6px 10px; }        /* 原 9px 11px */
#ie-table .dt-wrap { padding: 6px 10px; }                  /* 原 10px 14px */
#ie-table .fin-detail-table th,
#ie-table .fin-detail-table td { padding: 4px 8px; }       /* 原 6px 10px */

/* (2) 代发明细批标题整行隐藏（2026-09-30 老板口径）
      注：JS 侧已不再渲染该 div，此处为「防回归」双保险 —— 万一将来有人改回渲染，
      也不会突然又冒出这一行。 */
#ie-table .dt-title { display: none !important; }

/* (3) 余额退回小角标（替代原批标题里的「另有 ¥Z 余额退回（整批，未落到个人）」）
      平时 10.5px 灰字、极低调；鼠标悬停由 title 展开完整清单（日期 / 金额 / 银行摘要）。 */
#ie-table .ie-bal-chip {
  display: inline-block; margin-left: 4px; padding: 0 4px;
  border-radius: 3px; background: #eef2f7; color: #64748b;
  font-size: 10.5px; line-height: 15px; vertical-align: middle;
  white-space: nowrap; cursor: help;
}
#ie-table .ie-bal-chip:hover { background: #e2e8f0; color: #334155; }


/* ══════════════════════════════════════════════════════════════════════════
   QCHR 统一页面骨架 v1（PG v1）· 2026-10-02 · 财务界面标准化 第 1 批
   ─────────────────────────────────────────────────────────────────────────
   把「一个业务页面该长什么样」从口头约定变成可判定的 5 层结构：
     ① 标题行 .pg-head   页面名 + 一句状态摘要 + 最多 1 个主操作
     ② 范围栏 .pg-scope  期间 / 单位 / 主体 / 搜索 —— 永远这个位置、这个顺序
     ③ 指标带 .pg-strip  最多 5 个数字，压成一条（不是 5 张卡）
     ④ 工作区 .pg-work   本页唯一的表格，占满剩余高度
     ⑤ 提示区 .pg-note   缺口 / 待办 / 异常 —— 默认折叠成一行
   铁律：5 层顺序固定、不可插队；某个东西放不进任何一层，就先别加。
   ⚠️ 本段**只新增 .pg-* 新类**，不修改任何既有选择器 ⇒ 对未套用的页面 100% 零影响。
   ══════════════════════════════════════════════════════════════════════════ */
.pg-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 10px; }
.pg-head h2 { margin: 0; font-size: 20px; font-weight: 700; color: #0f172a; letter-spacing: -.3px; flex-shrink: 0; }
.pg-sum { font-size: 12.5px; color: #64748b; }
.pg-scope { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; }
.pg-strip { display: flex; align-items: stretch; gap: 0; margin-bottom: 8px; }
.pg-work { min-height: 0; }
.pg-note { margin-top: 8px; }

/* ── 财务总览 ③ 指标带（2026-10-02 UI-STD 第 1 批）──────────────────────────
   老板口径：「更清晰明了 / 界面整洁 / 能简化最好 / 前提功能不缺」。
   做法：5 张「两行大卡」（实测高 50px）→ **一条单行带**（约 30px），首屏还给表格 ~20px。
   ① 结构层：label / val / sub 由 <div> 改 <span> 横排（<div> 是块级、各自成行 —— 这正是原卡两行的成因）；
   ② 信息零丢失：sub 仍上屏，超宽由省略号截断，**完整内容在 title 上**（悬停可看）；
   ③ 形态开关：只对带 .fc-kpis-strip 的容器生效 ⇒ 摘掉这个类即回到原样，回退成本为零。 */
.fc-kpis-strip { gap: 8px; margin-bottom: 8px; }
.fc-kpis-strip .fc-kpi {
  min-height: 0; padding: 4px 10px; border-radius: 6px; box-shadow: none;
  display: flex; align-items: baseline; gap: 7px; flex-wrap: nowrap; justify-content: flex-start;
}
.fc-kpis-strip .fc-kpi-label { flex: 0 0 auto; font-size: 11.5px; }
.fc-kpis-strip .fc-kpi-val { flex: 0 0 auto; font-size: 15px; }
.fc-kpis-strip .fc-kpi-sub {
  flex: 1 1 auto; min-width: 0; margin-top: 0; font-size: 10.5px; color: #94a3b8;
  text-align: right; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* ── 页头低频操作收纳「⋯ 更多」（2026-10-02 UI-STD 第 1 批）─────────────────
   老板口径：「界面能整洁一点 / 能简化最好」。页头按钮由「平铺 6 枚」→「常驻 3 枚 + 1 个更多」。
   ⚠️ **纯 CSS 悬停展开、零 JS**：不引入新的监听器/状态，避免与 _fcBindBar 的重复绑定打架。
   ⚠️ 收纳只改 DOM 位置、**按钮 id 一字不改** ⇒ _fcBindBar 里那几段 querySelector('#fc-xxx').onclick
      照旧命中（它查的是后代，不关心层级）⇒ 绑定逻辑零改动。
   ⚠️ .fc-more 用 padding-bottom + 负 margin 把悬停区与菜单无缝接上，避免鼠标移到空隙就收起。 */
.fc-more { position: relative; display: inline-flex; padding-bottom: 6px; margin-bottom: -6px; }
.fc-more-menu {
  position: absolute; right: 0; top: 100%; z-index: 60;
  display: none; flex-direction: column; gap: 4px; padding: 6px; min-width: 196px;
  background: #fff; border: 1px solid #e2e8f0; border-radius: 8px;
  box-shadow: 0 12px 28px -10px rgba(15,23,42,.28), 0 2px 6px rgba(15,23,42,.08);
}
.fc-more:hover .fc-more-menu { display: flex; }
.fc-more:hover .fc-more-btn { background: #eff6ff; border-color: #bfdbfe; color: #1d4ed8; }
.fc-more-menu .fc-btn { width: 100%; justify-content: flex-start; text-align: left; white-space: nowrap; }

/* ══════════════════════════════════════════════════════════════════════════
   2026-10-02 UI-STD 第 2 批（老板口径）
     ①「把公司本级做成按钮 移到上面的红框处 点击才展开里面的内容」
     ②「指标区高度改到45px，能容纳两行文字就行」
   ⚠️ 本段仍是**只新增**：既有选择器一条未改。第 ① 条的最后一条规则
      (.fc-company-card{display:none}) 是为「旧卡容器万一仍在别处渲染」留的兜底，
      现 DOM 已不再输出该类，它不会命中任何元素。
   ══════════════════════════════════════════════════════════════════════════ */

/* ── ② 指标带：高度 45px、两行（label+val 一行 / sub 一行）─────────────────
   覆盖第 1 批的「单行 + sub 省略号」形态：第 1 批实测 26.8px，本批按要求放到 45px。
   换行机制：sub 用 flex:1 0 100% 强制独占第二行（display:flex + flex-wrap:wrap）。
   ⚠️ 仍是同一把开关：只有带 .fc-kpis-strip 的容器受影响，摘掉即回第 1 批形态。 */
.fc-kpis-strip .fc-kpi {
  height: 45px; min-height: 45px; padding: 3px 10px;
  flex-wrap: wrap; align-content: center; row-gap: 0; column-gap: 6px;
  justify-content: flex-start;
}
.fc-kpis-strip .fc-kpi-label { flex: 0 0 auto; font-size: 11.5px; line-height: 1.25; }
.fc-kpis-strip .fc-kpi-val   { flex: 0 0 auto; font-size: 15px; line-height: 1.15; }
.fc-kpis-strip .fc-kpi-sub {
  flex: 1 0 100%; min-width: 0; margin-top: 0;
  font-size: 10.5px; line-height: 1.2; color: #94a3b8;
  text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* ── ① 公司本级：页头按钮 + 点击浮层 ───────────────────────────────────────
   按钮落在 .fc-toolbar-right 开头（= 截图上红框位、🧾 记账凭证 左侧）。
   浮层面板仍挂在 #invoice-host 之内（保证 _fcBind 的 [data-fc-cc-key] 就地录入照旧命中），
   用绝对定位浮在表格上方，收起时不占任何高度。 */
#invoice-host { position: relative; }
.fc-cc-open-btn b { color: #b45309; font-variant-numeric: tabular-nums; font-weight: 700; }
.fc-cc-open-btn.fc-cc-open-on { background: #eff6ff; border-color: #93c5fd; color: #1d4ed8; }
.fc-cc-open-btn.fc-cc-open-on b { color: #1d4ed8; }
.fc-cc-pop {
  display: none; position: absolute; top: 0; right: 0; z-index: 55;
  width: min(1120px, 100%); background: #fff;
  border: 1px solid #cbd5e1; border-radius: 8px;
  /* 高处兜底：内容定高约 334px，小屏（如 768px 高）也不会把底部说明顶出视口。
     内容不超高时 overflow 不产生任何变化，圆角裁剪照旧。 */
  max-height: calc(100vh - 150px); overflow: auto;
  box-shadow: 0 18px 40px -12px rgba(15, 23, 42, .32), 0 2px 8px rgba(15, 23, 42, .10);
}
.fc-cc-pop.fc-cc-open { display: block; }
.fc-cc-pop .fc-cc-head { padding: 8px 14px; }
.fc-cc-pop .fc-cc-close {
  width: 22px; height: 22px; line-height: 1; padding: 0; flex: none; margin-left: 4px;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #64748b;
  font-size: 12px; cursor: pointer;
}
.fc-cc-pop .fc-cc-close:hover { background: #fef2f2; border-color: #fecaca; color: #dc2626; }
/* 兜底：旧卡容器类已不再由前端输出（内容整体并入 .fc-cc-pop），保留规则防止别处残留 */
.fc-company-card { display: none; }

/* ══════════════════════════════════════════════════════════════════════════
   2026-10-02 UI-STD 第 3 批 —— 财务总览「整页套骨架」
   老板口径：「红框中的骨架到底改了啥？？我要的是界面变化，而不是我在基础上小改点东西」
   ⇒ 前两批只**新增** .pg-* 类、无任何页面套用 ⇒ 界面上 0 变化。本批把 5 层骨架**真正落地**。

   结构（①~③ 收进一张卡；表格自带 .box-panel，单独一张卡；卡间 12px 灰缝）：
     ┌ 卡①  .box-panel.pg-top ────────────────────────────────┐
     │  ① 标题行 .pg-head   财务总览 + 一句状态摘要 + 🏦账户管理  │
     │  ② 范围栏 .pg-scope  ◀月份▶ / 主体下拉 / 工具按钮组       │
     │  ③ 指标带 .pg-strip  5 个数字（原 _fcKpis 产出）          │
     └────────────────────────────────────────────────────────┘
     ┌ 卡②  .fc-table-panel（既有 .box-panel）④ 工作区 表格 ────┐
     └────────────────────────────────────────────────────────┘

   ⚠️ 只新增 .pg-page / .pg-top / .pg-head-right / .pg-sum 命名空间；
      不修改任何既有选择器 ⇒ 除本页外 0 影响，回退＝还原 JS 那两行。
   ══════════════════════════════════════════════════════════════════════════ */
.pg-page { display: flex; flex-direction: column; gap: 12px; }
.pg-top { padding: 12px 14px 11px; }
.pg-page .pg-head { padding-bottom: 9px; border-bottom: 1px solid #eef2f7; margin-bottom: 10px; }
.pg-head-right { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.pg-sum:empty { display: none; }                 /* 无数据时不占位 */
.pg-page .pg-scope { margin-bottom: 9px; }
.pg-strip:empty { display: none; }               /* 加载中/错误时不占位 */
.pg-page .fc-kpis-strip { margin-bottom: 0; }

/* 指标带进卡片后，由「5 张带边小卡」改为「一行数字 + 竖分隔线」——
   更贴合「指标带」语义；只在本页生效（.pg-page 限定），其余页面不受影响。 */
.pg-page .fc-kpis-strip .fc-kpi {
  background: transparent; border: 0; border-radius: 0; box-shadow: none;
  padding: 0 12px;
}
.pg-page .fc-kpis-strip .fc-kpi:first-child { padding-left: 0; }
.pg-page .fc-kpis-strip .fc-kpi + .fc-kpi { border-left: 1px solid #eef2f7; }


/* ══════════════════════════════════════════════════════════════════════════
   ===== UI-STD 第 4 批 · 2026-10-02 =====
   财务总览 KPI 换成「员工管理同款 7 格卡」
   老板口径：「员工管理的 KPI 模块很完美：1) 一屏 7 个 KPI；2) 宽度、高度；
   3) 每个 KPI 里文字呈现样式（左上主要内容，左下实际数据数字变大加粗，
   右下详细描述及另外的数据）—— 把这套 ×整× 套移到财务总览；
   也按 7 个做，没到 7 个就空着」。

   做法：财务页改用员工页那套 .ck-kpi 卡 —— 左上 .lb 指标名 / 左下 .vl 数字 /
   右下 .sb 描述及附带数据。
   ⚠️ 视觉数值**逐条照抄员工页实际生效值**，一个新数字都没造：
        .ck-kpi            841~849 行  白底 / 1px #e2e8f0 / 左侧 3px 彩条（默认 #0284c7）
        .emp-stats .ck-kpi 2019~2029 行 padding 3/12/5/12 · flex 竖排 · 标签 12.5px/700
                                        · 数字 22px/700/行高 1 · 说明 12px 右对齐
                                        · .row2 基线对齐两端分置 · 数字 min-width 48px
        .ck-kpi 圆角       4997 行把它从 10px 覆盖为 12px ⇒ 员工页实际是 12px，这里钉 12px
   ⚠️ **不复用 .emp-stats 类名**：2045 行有 `#view:has(.tbl-employees) #list-area > .emp-stats`
      属员工页专属选择器，复用会让两页互相牵连。
   ⚠️ **只用新选择器 .fc-stats**，既有选择器一条不改 ⇒ 员工台账 / 预支页 / 收支明细页 /
      保险页共用的 .ck-kpi 基类**不受任何影响**（不受影响才敢动）。
   ⚠️ 与员工页有两处**有意的**差异，两处都写在对应规则的上方注释里：
      ① 不写 cursor:pointer / hover 抬升   —— 财务 KPI 不可点，不做"能点"的假暗示；
      ② .sb 加 nowrap + 省略号            —— 财务的说明是长明细，不约束就撑成 162px 高（员工页 50px）。
   ══════════════════════════════════════════════════════════════════════════ */
.fc-stats {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr));
  gap: 10px; margin-bottom: 0;
  flex: 1 1 100%; min-width: 0;        /* 在 .pg-strip(flex) 内撑满整行 */
}
.fc-stats .ck-kpi {
  padding: 3px 12px 5px 12px;          /* 员工页同款：≈47px（标签行 + 数字行 + 上下 8px） */
  border-radius: 12px;
  display: flex; flex-direction: column; justify-content: flex-start;
}
.fc-stats .ck-kpi .lb   { font-size: 12.5px; font-weight: 700; margin-bottom: 1px; }
.fc-stats .ck-kpi .row2 { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.fc-stats .ck-kpi .vl   { font-size: 22px; font-weight: 700; line-height: 1; }
.fc-stats .ck-kpi .row2 .vl { flex: 0 0 auto; min-width: 48px; }
/* ⚠️ ③ 与员工页**唯一**必需的差异（不加这条就达不到你要的「同高」）：
   员工页的说明都是短词（「当前台账总记录数」「在岗占比 59%」），在 1/7 宽度下一行放得下；
   财务的说明是长明细（「工资 ¥728,000.00 · 费用 ¥51,600.00 · 保险 ¥37,800.00 · 报销 ¥17,200.00」），
   不约束就会在 205px 宽的卡里折成 4~5 行 —— 实测整排 KPI 会被最高那张撑到 162px（员工页是 50px）。
   ⇒ 与 .vl 同样的「一行 + 超宽省略号」，把形态拉回员工页那样；完整说明在 title 悬停里（不丢）。 */
.fc-stats .ck-kpi .sb {
  flex: 0 1 auto; min-width: 0; font-size: 12px; margin-top: 1px; text-align: right;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* 空位（未占用的格位）：财务当前 5 个指标 ⇒ 第 6、7 格留空。
   淡虚线空框只为保持 7 等分对齐与「这里有位置」的可读性，不画色条、不填假数据。
   ⇒ 想要**完全留白**：把下面两条删掉即可（一行改动，无需动 JS）。 */
.fc-stats .ck-kpi.is-empty { background: transparent; border-style: dashed; border-color: #e8eef5; box-shadow: none; }
.fc-stats .ck-kpi.is-empty::before { display: none; }
@media (max-width: 1280px) { .fc-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 800px)  { .fc-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

/* ══════════════════════════════════════════════════════════════════════════
   ===== UI-STD 第 5 批 · 2026-10-02 =====
   财务总览页头：摘要下线 + 工具条上行 + 顶部去卡片背景
   老板口径：「红框文字删掉；绿框中的全部按钮移到红框的位置；
   截图中的全部框体不要加背景，跟员工管理界面一样就行了」

   ① 去背景（.pg-flat）
      .pg-top 原本挂在 .box-panel 上（渐变底 + 边框 + 圆角 + 多层阴影）。
      本批把 .box-panel 摘掉、换成 .pg-flat，另需把两处残留一并清零，否则做不到
      「跟员工管理页头一样」：
        · .pg-top 自身 padding(12/14/11)  —— 不清零，标题与 KPI 带会比表格卡多内缩 14px；
        · .pg-head 的 border-bottom 分隔线 —— 不清零，标题下会留一条本页特有的横线。
      ⇒ 用**新修饰类 .pg-flat** 承载覆盖，不动 .pg-top / .pg-head 既有规则（其余页面零影响）。

   ② 工具条上行（.pg-head > .fc-head-slot）
      工具条原挂在第二行 .pg-scope 里，作为 flex 子项宽度是内容宽（shrink-to-fit）
      ⇒ .fc-toolbar 的 justify-content:space-between 没有多余空间可分配、等于失效。
      搬进 .pg-head 后给 flex:1 1 auto 撑满「<h2> 右侧 → 🏦账户管理 左侧」整段，
      右侧按钮组自然顶到该段最右端 —— 即老板截图红框所在的横向区间。
      ⚠️ 只新增 .pg-page 作用域规则；.view-head .fc-head-slot（4608~4610 行，员工管理等页在用）
         一个字未改 ⇒ 那些页面不受任何影响。

   ⚠️ 本段**只新增**，既有选择器一条未改；回退 = 删掉本段 + 还原 10-misc.js 骨架那几行。
   ══════════════════════════════════════════════════════════════════════════ */
.pg-page .pg-top.pg-flat { padding: 0; background: none; border: 0; border-radius: 0; box-shadow: none; }
.pg-page .pg-top.pg-flat .pg-head { padding-bottom: 0; border-bottom: 0; }
.pg-page .pg-head > .fc-head-slot { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; }
.pg-page .pg-head > .fc-head-slot .fc-toolbar { flex: 1 1 auto; margin: 0; gap: 10px; }
.pg-page .pg-head > .fc-head-slot .fc-toolbar-right { gap: 10px; }

/* ══════════════════════════════════════════════════════════════════════════
   2026-10-04 MERGEBTN：「📋 离职核对 / 👥 在职核对」合并为一个「📋 名单核对 ▾」下拉。
     · 作用域仅员工管理页工具栏（.roster-drop），**不复用**操作列那套 .action-drop*
       （后者为表格 <td> 写：min-width:130px + 按 right-130 右对齐，套到工具栏会错位）。
     · 尺寸沿用本页 V6 Box Pattern：按钮沿用 .btn-sm.btn-light，仅补箭头对齐。
     · 浮层用 position:fixed + Portal（JS 移到 body），避开工具栏祖先 overflow 裁剪。
     · 回滚：删掉本段 + 05-list.js 恢复 obBatchBtn/owBatchBtn 两个按钮即可，无需重启。
   ══════════════════════════════════════════════════════════════════════════ */
.roster-drop { position: relative; display: inline-block; vertical-align: middle; }
.roster-drop-btn { cursor: pointer; white-space: nowrap; }
.roster-drop-btn .caret { margin-left: 2px; font-size: 10px; opacity: .65; }
.roster-drop-menu {
  display: none;
  position: fixed;
  min-width: 208px;
  background: #fff;
  border: 1px solid #cbd5e1;
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(15, 23, 42, .18);
  z-index: 9999;
  padding: 6px 0;
}
.roster-drop-menu.show { display: block; }
.roster-drop-menu a {
  display: flex; flex-direction: column; gap: 2px;
  padding: 7px 14px;
  font-size: 12.5px; color: #0f172a;
  cursor: pointer; text-decoration: none;
  transition: background .12s;
  border-left: 3px solid transparent;
}
.roster-drop-menu a:hover { background: #f1f5f9; border-left-color: #2563eb; }
.roster-drop-menu a small { font-size: 11px; color: #64748b; line-height: 1.4; }
.roster-drop-menu a:hover small { color: #475569; }

/* ══════════════════════════════════════════════════════════════════════════
   @SFDETFIT 2026-10-09 供方费用页（财务管理 Hub · supplierfee · #sf-table）
   老板原话：「这页面 字体变大一点，宽度也适配下 一屏幕就显示25条」（附截图）
   --------------------------------------------------------------------------
   本页是**第七份同款配方**（前六份：员工 --emp-rows ／ 预支 --adv-rows ／
   结清 --stl-rows ／ 供方管理 --sup-rows ／ 记账凭证 --vch-rows ／ 收支明细 --ie-rows）。
   与前六份的两点差别（本页数据量小、**没有分页条**）：
     · 容器查询宿主放在 #sf-table（不是 .table-wrap）；
     · 表格框 .sf-wrap 用 max-height 贴合内容
       ⇒ 家数 < 25 时框体自动收短（不放大片空底），家数 ≥ 25 时框内滚动、恒露 25 行。
   --------------------------------------------------------------------------
   ① 字号加大（由 04-tax-supplier.js 的内联样式给出）：
      td 12 → 14px、th 12 → 13.5px；行内控件同步放大
      （明细按钮 20→21px ／ 付款方式 select 20→21px ／ 是否核对与是否已转胶囊 18→19px ／
       ＋上传 16→17px ／ 收款账号等宽数字 11→13px ／ 附件图标 14→16px）。
   ② 宽度适配（同文件 SFF_COLS 给出）：11 列百分比按 14px 重算，合计仍 = 100%
      序号 4→3 ／ 明细 6→5 ／ 是否核对 6→5 ／ 是否已转 6→5（这四列冗余最多）
      匀给 供应商 8.5→11 ／ 收款账户 8→11 ／ 付款方式 12→13 ／ 发票附件 12.5→10；
      收款账号 15、收款信息 10、提成小计合计 12 保持不变。
   ③ 一屏恰好 25 条：行高 =（#sf-table 可用高 − 表格框 2px 边框 − 表头 30px − 合计行 28px
      − 提示条占位）÷ 25，由容器查询单位 cqh 实时反推 ⇒ 零 JS、零 resize 监听、零重排。
      本页 td 的**内联 height 已在本批删除**（内联样式会盖掉外部 CSS，公式将永不生效）。
      ⚠️ 那 −2px 是**真 Chromium 实测补上的**：.sf-wrap 有 1px 上下边框，它不参与 100cqh，
         漏掉就会让「第 25 行被吸底合计行压住 1.7px」—— 肉眼几乎看不出，但严格讲只算 24 条。
   ④ 表格框不得有纵向 margin：滚动框高度必须与 cqh 逐像素相等，否则第 26 行会露出来。
   ⑤ 合计行**吸底**（sticky bottom）：本页无分页，家数超 25 时框内滚动，
      非吸底的话滚起来会变成 26 行可见；吸底后 25 条在任意滚动位置都精确。
      （真 Chromium 实测：th `position:sticky;top:0` 与 tr.sf-foot > td `position:sticky;bottom:0`
        都**确实生效**，见下方 ⑦。）
   ⑥ 未匹配提示条固定高 22px（单行省略号 + title 兜全文），其占位 28px 由 --sf-warn-h
      供给 ③ 的公式 —— 提示条有/无，25 条都精确。
   降级：可用高不足 25 × 22 + 60 = 610px（有提示条时 638px）则行高触 22px 下限
        （22px = 行内最高控件「付款方式 select」21px + 行自身 1px 边框；真 Chromium 实测
          再往下 td 的 height 就被内容顶住了、压不动 —— floor 就是它，宁可行数少也不挤压），
        一屏显示 floor(...) 条。
        cqh 不被支持时 ⑦ 的第二条 height 声明整条被判无效丢弃，回落同一规则里的
        26px 兜底值（与改前 29px 相近），不会把行压成一行字。
        真 Chromium 实测（1849×829 内容区）：25 条恒定成立要求内容区高 ≳ 764px；
        实测 760px → 24 条、780px → 25 条，与上式吻合。
   作用域：选择器全带 #view:has(#sf-table) ／ #sf-table ／ body:has(#sf-table) 前缀
     ⇒ 仅「供方费用」页；同 Hub 的工资计算 / 政府报税 / 收支明细，以及员工 / 预支 /
       结清 / 供方管理 / 记账凭证 / 合同 / 工伤等全部表格页零影响。
   调参：只动下面 6 个变量（--sf-rows 改成 N 就是一屏 N 行，行高自动跟着变），改完 F5 即生效。
   回滚：删掉本段，并把 04-tax-supplier.js 的内联样式与 index.html 两个版号还原
        （备份见 erp_backups 本批目录）。
   注意：本注释块内不得出现「星号紧跟斜杠」的字符组合，否则会提前闭合注释并静默吃掉后续规则。
   ══════════════════════════════════════════════════════════════════════════ */
#view:has(#sf-table) {
  --sf-rows: 25;         /* 每屏行数（老板 2026-10-09 指定 25） */
  --sf-head-h: 30px;     /* 表头高（由下方 th 规则钉死） */
  --sf-foot-h: 28px;     /* 合计行高（由下方 tr.sf-foot 规则钉死，吸底） */
  --sf-wrap-bd: 2px;     /* .sf-wrap 的上下边框合计（1px×2）—— 必须从公式里扣掉，见 ③ */
  --sf-row-min: 22px;    /* 行高下限（真 Chromium 实测：＝付款方式 select 21px + 行 1px 边框） */
  --sf-row-max: 46px;    /* 行高上限（防超大屏行距过大） */
  --sf-warn-h: 0px;      /* 未匹配提示条占位：无提示 0，有提示 28px（见 ③） */
}
/* ① 逐级拉满：#view → #fin-sub → #sf-table（与员工页 #view:has(.tbl-employees) 同构） */
#view:has(#sf-table) { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
#view:has(#sf-table) > .view-head { flex-shrink: 0; }
#view:has(#sf-table) > #fin-sub { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
#view:has(#sf-table) > #fin-sub > :not(#sf-table) { flex-shrink: 0; }
#view:has(#sf-table) > #fin-sub > #sf-table {
  flex: 1 1 auto; min-height: 0;
  display: flex; flex-direction: column;
  container-type: size;   /* 使后代可用 cqh 读到「表格可用高」 */
}
/* ② 未匹配提示条：固定高 22px + 单行省略号（title 兜住全文）。
   高度必须是确定值，③ 的 --sf-warn-h 才敢按 28px（22 + 上边距 6）扣减。 */
#view:has(#sf-table) #sf-table > .sf-warn {
  flex: 0 0 auto;
  height: 22px;
  line-height: 22px;
  margin: 6px 0 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
/* ③ 有提示条时把占位变量改掉 —— 变量落在 #sf-table 上，被 .sf-wrap 与行高公式一起继承。 */
#view:has(#sf-table) #sf-table:has(> .sf-warn) { --sf-warn-h: 28px; }
/* ④ 表格框：贴合内容（flex-grow:0），上限 = 可用高 − 提示条；超出由框内滚动承担。
   两条 max-height 是**安全阀**：万一 flex 链算不出确定高度（100% 无法解析），
   两条都失效 ⇒ 回落 max-height:none（框体贴合内容、页面滚动），表格不会塌成 0 高。 */
#view:has(#sf-table) #sf-table > .sf-wrap {
  flex: 0 1 auto;
  max-height: calc(100% - var(--sf-warn-h, 0px));
  max-height: max(240px, calc(100% - var(--sf-warn-h, 0px)));
  overflow-y: auto;
}
/* ⑤ 表头 / 合计行钉死高度：公式里两个扣减项必须是确定值，25 行才可能精确
   （全局 box-sizing:border-box ⇒ height 含 padding）。 */
#view:has(#sf-table) #sf-table > .sf-wrap > table thead th { height: var(--sf-head-h, 30px); }
#view:has(#sf-table) #sf-table > .sf-wrap > table tbody tr.sf-foot > td {
  height: var(--sf-foot-h, 28px);
  position: sticky; bottom: 0; z-index: 2;   /* 吸底：家数超 25 时合计行常驻框底 */
  background: #eef2ff;                        /* sticky 必须自带不透明底 */
  box-shadow: inset 0 2px 0 #333;             /* 顶线改用 inset（sticky 下 border 不跟随） */
}
/* ⑥ 行高 =（可用高 − 表头 − 合计行 − 提示条）÷ 25 ⇒ 一屏恰好 25 条、恰好铺满。
   第一条 height 是**兜底值**：cqh 不被支持时第二条整条声明失效，自动回落 26px。
   td:not([colspan]) 排除空态行；tbody tr:not(.sf-foot) 排除合计行。 */
#view:has(#sf-table) #sf-table > .sf-wrap > table tbody tr:not(.sf-foot) > td:not([colspan]) {
  height: 26px;
  height: clamp(var(--sf-row-min, 22px), calc((100cqh - var(--sf-wrap-bd, 2px) - var(--sf-head-h, 30px) - var(--sf-foot-h, 28px) - var(--sf-warn-h, 0px)) / var(--sf-rows, 25)), var(--sf-row-max, 46px));
}
/* ⑦ 表头 sticky（框内滚动时钉住）；显式不透明背景，避免滚动时透出下方行。
   背景沿用本页既有浅灰 #f8fafc（＝全局 th 底色），不改配色。 */
#view:has(#sf-table) #sf-table > .sf-wrap > table thead th {
  position: sticky; top: 0; z-index: 3;
  background: #f8fafc;
  box-shadow: inset 0 -1px 0 #e2e8f0;
  border-bottom: 0;
}
/* ⑧ 页面底留白 22px → 7px（与员工／预支／凭证／收支明细页 PADFIX3 口径一致），
   省下的 15px 全部让给表格 —— 25 条的行高由 cqh 自动吃到这 15px。 */
body:has(#sf-table) .content { padding-bottom: 7px !important; }

/* ══════════════════════════════════════════════════════════════════════════
   2026-10-14 INTCALC：内部工资分配表 —— 内部人员「工资计算过程」展开区
   老板口径：「（这个表）再把工资计算过程整合进去」—— 每人一行可展开，
     展开后录 基本工资 / 岗位工资 / 绩效工资 / 人数激励 / 补贴 / 缺勤天数 / 缺勤扣发 → 应发；
     − 保险 / 个税 / 负激励，＋报销，−预支 → 实发；「本月工资」取「应发工资」（可手改）。
   ⚠️ 本段**纯新增**（ialc-* 前缀，与既有 ial-* 互不干扰），既有选择器一条未改 ⇒ 其它页面零影响。
   ══════════════════════════════════════════════════════════════════════════ */
.ial-exp {
  width: 18px; height: 18px; line-height: 1; padding: 0; margin-right: 5px; flex: none;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff; color: #0284c7;
  font-size: 10px; cursor: pointer; vertical-align: middle;
}
.ial-exp:hover { background: #eff6ff; border-color: #93c5fd; }
.ial-exp-on { background: #eff6ff; border-color: #93c5fd; color: #1d4ed8; }
.ialc-tr > td { padding: 0 !important; background: #f8fafc; border-bottom: 1px solid #e2e8f0; }
.ialc-box { padding: 8px 12px 9px; }
.ialc-line { display: flex; align-items: center; flex-wrap: wrap; gap: 7px 12px; margin-bottom: 7px; }
.ialc-line:last-child { margin-bottom: 0; }
.ialc-lb { font-size: 11.5px; color: #64748b; white-space: nowrap; }
.ialc-hd { font-size: 11px; color: #94a3b8; font-weight: 400; }
.ialc-in {
  width: 76px; height: 24px; padding: 1px 6px; font-size: 12px; font-family: inherit;
  border: 1px solid #cbd5e1; border-radius: 5px; background: #fff; color: #0f172a;
  text-align: right; font-variant-numeric: tabular-nums;
}
.ialc-in:focus { outline: none; border-color: #93c5fd; box-shadow: 0 0 0 2px rgba(59,130,246,.15); }
.ialc-dept { width: 88px; text-align: left; }
.ialc-grp { display: inline-flex; align-items: center; gap: 5px; }
.ialc-eq {
  display: inline-flex; align-items: center; gap: 5px; margin-left: 4px; padding: 2px 9px;
  font-size: 11.5px; color: #334155; background: #eef2f7; border-radius: 5px; white-space: nowrap;
}
.ialc-eq b { font-size: 13px; font-variant-numeric: tabular-nums; color: #0f172a; }
.ialc-eq.ialc-net b { color: #047857; }
.ialc-btn {
  height: 24px; padding: 0 9px; font-size: 11.5px; font-family: inherit;
  border: 1px solid #cbd5e1; border-radius: 5px; background: #fff; color: #1d4ed8;
  cursor: pointer; white-space: nowrap;
}
.ialc-btn:hover { background: #eff6ff; border-color: #93c5fd; }
.ialc-tip { font-size: 11px; color: #94a3b8; white-space: nowrap; margin-left: auto; }

/* ══ 2026-10-14 SALWAGECALC：内部工资分配表「工资计算过程」全员明细层 ══
   老板口径：明细不再行内展开，改为标题栏入口 + 全员一张表（一人一行）。
   只新增规则；行内展开那套旧规则原样留着不删（历史版本回滚时仍在）。 */
.ial-act-btn {
  height: 24px; padding: 0 10px; margin-right: 10px;
  font-size: 12px; font-family: inherit; line-height: 22px;
  border: 1px solid #93c5fd; border-radius: 6px;
  background: #eff6ff; color: #1d4ed8; cursor: pointer; white-space: nowrap;
}
.ial-act-btn:hover { background: #dbeafe; border-color: #60a5fa; }
.ial-act-btn.ial-act-back { background: #fff; border-color: #cbd5e1; color: #475569; }
.ialc-wrap { max-height: 432px; overflow: auto; border: 1px solid #e2e8f0; border-radius: 6px; background: #fff; }
.ialc-tbl { width: 100%; border-collapse: collapse; font-size: 12px; }
.ialc-tbl th {
  position: sticky; top: 0; z-index: 1;
  background: #f1f5f9; color: #334155; font-weight: 500;
  text-align: center; padding: 6px 3px; border-bottom: 1px solid #e2e8f0; white-space: nowrap;
}
.ialc-tbl th.ialc-eq-th { background: #e0e7ef; }
/* 2026-10-16 IALROW（老板口径）：「每行的高度改为跟右边红框的高度一样」——
   右红框 = 「操作」列的格子（.ialc-op-td：padding 2px + 按钮 22px ⇒ 26px）。
   本行 padding 4px→2px、下一行输入框 24px→22px 后，每个格子的自然高都是 22+2×2 = 26px
   ⇒ 全表行高统一 26px（改前由「姓名 + 职务」两行撑到约 37px）。 */
.ialc-tbl td { padding: 2px 3px; border-bottom: 1px solid #f1f5f9; text-align: center; }
.ialc-tbl tbody tr:hover td { background: #f8fafc; }
.ialc-tbl td.ialc-nm { text-align: left; padding-left: 8px; }
.ialc-nm-t { font-weight: 500; color: #0f172a; white-space: nowrap; }
/* 2026-10-16 IALROW：姓名下「职务」小字已按老板口径下线（渲染处一并移除）。
   规则**保留**，将来要恢复显示时无需重写样式。 */
.ialc-nm-r { font-size: 11px; color: #94a3b8; margin-top: 1px; white-space: nowrap; }
.ialc-tbl .ialc-in { width: 60px; height: 22px; padding: 0 4px; }
.ialc-tbl .ialc-dept { width: 64px; text-align: left; }
.ialc-tbl td.ialc-eq-td { background: #eef2f7; }
.ialc-eq-td b { font-variant-numeric: tabular-nums; color: #0f172a; font-size: 12.5px; }
.ialc-tbl td.ialc-net-td b { color: #047857; }

/* ══ 2026-10-14 ICALCBTN（老板口径，附截图 2 张）══
   ① 提示条右侧那个空位 → 「＋ 添加人员」；② 表格最右一列 → 每行一个「复制」；
   ③ 「框体中的空格做的和工资计算表一样，可复制、可粘贴」→ 表格内输入格向 .sa-in 看齐。
   ⚠️ 既有选择器一条未改（只在文件更后面追加，同特异性下后者生效）；
      **全局** .ialc-in（行内展开区那套老样式）一字不动 —— 下面每条都带 .ialc-tbl 限定。 */

/* ① 提示条：只作用于全员明细层（#ial-view-calc 里那个带 ialc-hint 的）。
      分配表的 .ial-hint 不带这个类 ⇒ 排版一字不变。 */
.ialc-hint { display: flex; align-items: flex-start; gap: 10px; }
.ialc-hint-t { flex: 1 1 auto; min-width: 0; }
.ialc-hint-b { flex: none; display: flex; gap: 6px; }

/* ② 操作列：每行一个「复制」；自行添加的人多一个「✕」移除键 */
.ialc-tbl th.ialc-op-th { width: 76px; }
.ialc-tbl td.ialc-op-td { padding: 2px 4px; white-space: nowrap; }
.ialc-cp {
  height: 22px; padding: 0 8px; margin: 0; font-size: 11.5px; font-family: inherit; line-height: 20px;
  border: 1px solid #cbd5e1; border-radius: 5px; background: #fff; color: #0369a1;
  cursor: pointer; white-space: nowrap;
}
.ialc-cp:hover { background: #eff6ff; border-color: #93c5fd; }
.ialc-rm {
  height: 22px; width: 22px; padding: 0; margin: 0 0 0 4px; font-size: 11px; font-family: inherit;
  line-height: 20px; border: 1px solid #fca5a5; border-radius: 5px; background: #fff;
  color: #dc2626; cursor: pointer;
}
.ialc-rm:hover { background: #fef2f2; border-color: #f87171; }

/* ③ 添加人员面板（展开在提示条下方） */
.ialc-add {
  margin: 0 0 10px; padding: 9px 12px; background: #f8fafc;
  border: 1px solid #e2e8f0; border-radius: 6px;
}
.ialc-add-hd { display: flex; align-items: center; font-size: 12px; font-weight: 600; color: #334155; margin-bottom: 7px; }
.ialc-add-x { margin-left: auto; padding: 0 4px; cursor: pointer; color: #94a3b8; font-size: 12px; font-weight: 400; }
.ialc-add-x:hover { color: #475569; }
.ialc-add-row { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-bottom: 6px; }
.ialc-add-row:last-child { margin-bottom: 0; }
.ialc-add-tip { margin-top: 2px; font-size: 11px; color: #94a3b8; line-height: 1.6; }
.ialc-sel {
  height: 26px; max-width: 420px; padding: 0 6px; font-size: 12px; font-family: inherit;
  border: 1px solid #cbd5e1; border-radius: 5px; background: #fff; color: #0f172a;
}

/* ④ 「空格做的和工资计算表一样」—— 只覆盖**表格内**的输入格：
      去掉边框与圆角、透明底、聚焦淡蓝底（= .sa-in 的观感）；网格线交给 td 画。
      ⚠️ width 仍是固定 60px（本表没有 colgroup）—— 改成 100% 会让 td 塌陷。 */
.ialc-tbl td.ialc-num { padding: 1px 1px; border-left: 1px solid #eef2f7; border-right: 1px solid #eef2f7; }
.ialc-tbl .ialc-in {
  width: 60px; height: 24px; box-sizing: border-box; padding: 1px 4px;
  border: none; border-radius: 0; background: transparent; text-align: center;
}
.ialc-tbl .ialc-in:hover { background: #f8fafc; }
.ialc-tbl .ialc-in:focus { outline: none; border: none; box-shadow: none; background: #eef2ff; }
.ialc-tbl .ialc-dept { width: 64px; text-align: left; }
.ialc-tbl .ialc-in::-webkit-outer-spin-button,
.ialc-tbl .ialc-in::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.ialc-tbl .ialc-in[type="number"] { -moz-appearance: textfield; }


/* ============================================================================
   2026-10-17 STLRMKW —— 结清补发页「备注」列收窄（老板截图批）
   ----------------------------------------------------------------------------
   老板原话：「绿框的备注框体宽度 压缩50%，文字显示不全的可隐藏（不要错行），
             鼠标移上去显示全部」。
   改前：备注格内容没限宽，只要一条 12 字备注（如「项目：企业社保：个人所得税」）
        就把整列撑到 175~185px（本地真码渲染台实测），而这一列几乎全是 `--`。
   改后：内容宽钉在 70px ⇒ 列宽约 86px（约原来的 51%）；单行不换行 + 省略号；
        全文在 title 里，鼠标移上去即见（点击仍可就地编辑、看全文）。
   为什么不能只给 td 写 width：本表 table-layout 是 auto，td 的 width 只是"建议值"，
     内层文字一宽照样把列撑开 ⇒ 必须由**内层 span** 自己限宽并裁切。
   作用域：.tbl-settle（结清补发页专有）⇒ 其它表格零影响。
   回滚：删掉本段 + 还原 08-settle-list.js 的 stlRmkHtml / stlRemarkEdit。
   ========================================================================== */
.tbl-settle.table-wrap table tbody td > .stl-rmk-txt {
  display: inline-block;
  max-width: 70px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  vertical-align: middle;
}
/* 编辑态：输入框是绝对定位浮层（宽 200px 压在右侧邻列上），靠这一句给 td
   建立定位上下文；否则它会相对整页定位、跑到表格外面去。 */
.tbl-settle.table-wrap table td.stl-rmk-editing {
  position: relative;
  z-index: 30;
}

/* ============================================================================
   2026-10-17 SUPTOP3 —— 供方管理「在职人数前三名」金银铜标记（老板截图批）
   ----------------------------------------------------------------------------
   老板原话：「供方管理 根据在职人数 给排前三的供应商名称前标个金银铜 点缀下页面」。
   改法：供应商名称前加一枚 🥇/🥈/🥉（走 col.fmt 钩子渲染，零 cellHtml 改动），
        并把前三名的名称加粗一档 —— 只作点缀，不新增底色、不改行高、不动列宽。
   口径：在职人数 = total − left（与默认排序同源）；0 人不戴牌。
   作用域：.tbl-contracts（只在供方管理页出现）⇒ 员工台账等其它表格零影响。
   回滚：删掉本段 + 还原 05-list.js 的两处改动。
   徽章尺寸（2026-10-17 像素实测定参，非拍脑袋）：
     13.5px / vertical-align:-1px 会让金牌**吊在文字下方 3px**（徽章墨迹 15.5px vs 文字 11px，
     底差 +3.0）⇒ 改为 12px、去掉 vertical-align（默认 baseline）：
     徽章墨迹 13.5px、文字 11px、高比 1.23、顶差 −1.5 / 底差 +1.0 ≈ 竖直居中，略大于文字。
   ========================================================================== */
.tbl-contracts table tbody td .sup-top-badge {
  display: inline-block;
  margin-right: 5px;
  font-size: 12px;
  line-height: 1;
}
.tbl-contracts table tbody td .sup-top-name {
  font-weight: 600;
  color: #1e293b;
}
