* { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  font-family: "Microsoft YaHei", "PingFang SC", "Segoe UI", sans-serif;
  background: #f4f6f9;
  color: #24303a;
  font-size: 14px;
  line-height: 1.5;
}

.sticky-top { position: sticky; top: 0; z-index: 100; }
.req-top {
  position: sticky;
  top: 92px;
  z-index: 90;
  background: #f4f6f9;
  padding: 2px 0 10px;
  box-shadow: 0 4px 8px -8px rgba(20, 50, 74, .35);
}

a { color: #2563eb; text-decoration: none; }
a:hover { text-decoration: underline; }

.topbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  background: #14324a;
  color: #fff;
  padding: 12px 22px;
}

.topbar .brand {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 18px;
  font-weight: 700;
}
.topbar .brand-logo {
  width: auto;
  height: 26px;
  border-radius: 4px;
}

.topbar .userbox { display: flex; align-items: center; gap: 10px; font-size: 13px; }
.topbar .umeta { color: #b9c6d2; }
.topbar .btn-mini {
  color: #fff;
  border: 1px solid #4b6a82;
  padding: 3px 9px;
  border-radius: 5px;
}
.topbar .btn-mini:hover { background: #244a67; text-decoration: none; }
.topbar button.btn-mini {
  background: none;
  font: inherit;
  font-size: 13px;
  cursor: pointer;
}
.topbar button.btn-mini:hover { background: #244a67; }

.nav {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  background: #fff;
  padding: 0 16px;
  border-bottom: 1px solid #e2e8f0;
}

.nav a {
  padding: 11px 14px;
  color: #33475b;
  font-weight: 500;
  border-bottom: 2px solid transparent;
}
.nav a:hover { background: #f1f5f9; text-decoration: none; }
.nav a.active { color: #2563eb; border-bottom-color: #2563eb; }
.nav a.nav-disabled {
  color: #b6c2cd;
  cursor: not-allowed;
}
.nav a.nav-disabled:hover { background: transparent; }
.nav a.nav-home {
  color: #2563eb;
  font-weight: 600;
  border-right: 1px solid #e2e8f0;
  margin-right: 2px;
}
/* 菜单栏最右侧：「我的默认页面」按钮（右边缘跟右上角「退出」对齐） */
.nav .nav-dp { margin-left: auto; margin-right: 6px; display: inline-flex;
  align-items: center; }
.nav .nav-dp .dpform { margin: 0; display: inline-flex; }
.nav .nav-dp .btn-mini { white-space: nowrap; }
/* 一级菜单里的下拉（员工首页 → 子菜单） */
.nav .nav-drop-wrap { position: relative; display: inline-flex; }
.nav a.nav-drop .caret { font-size: 10px; margin-left: 5px; color: #94a3b8; }
.nav .nav-submenu {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 170px;
  background: #fff;
  border: 1px solid #e2e8f0;
  border-top: none;
  border-radius: 0 0 10px 10px;
  box-shadow: 0 14px 28px rgba(15, 23, 42, .14);
  padding: 6px 0;
  z-index: 60;
}
.nav .nav-drop-wrap:hover .nav-submenu,
.nav .nav-drop-wrap:focus-within .nav-submenu { display: block; }
.nav .nav-submenu a {
  display: block;
  padding: 9px 16px;
  font-size: 13px;
  font-weight: 400;
  color: #33475b;
  border-bottom: none;
  white-space: nowrap;
}
.nav .nav-submenu a:hover { background: #f1f5f9; text-decoration: none; }
.nav .nav-submenu a.active { color: #2563eb; background: #eff6ff; border-bottom-color: transparent; }
.nav .nav-submenu a.nav-disabled { color: #b6c2cd; }
.nav .nav-submenu a.nav-disabled:hover { background: transparent; }

.container { max-width: 1280px; margin: 0 auto; padding: 20px 22px 40px; }

h1 { font-size: 22px; margin: 4px 0 16px; }
h2 { font-size: 16px; margin: 0 0 12px; }

.card {
  background: #fff;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  padding: 18px;
  margin-bottom: 18px;
}
.card.narrow { max-width: 460px; }
.card.danger { border-color: #fecaca; }
.card.summary { display: flex; align-items: center; }
.card.summary .big, .big { font-size: 20px; color: #2563eb; font-weight: 700; }

.toolbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 14px;
}
.filterbar { justify-content: flex-start; flex-wrap: nowrap; }
.filterbar select { width: auto; padding: 5px 6px; }
.pagehead { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap; margin: 4px 0 14px; }
.pagehead .inline { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-left: auto; }
.pagehead .inline select { width: auto; padding: 5px 6px; }
.toolbar .inline { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.toolbar .btn-group { display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.toolbar .btn-group form.inline { display: inline-block; }
form.addrow { display: flex; align-items: center; gap: 8px; margin-top: 12px; }
form.addrow input[type="text"] { width: 240px; padding: 6px 8px; }
form.company-add { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 2px 0 10px; }
form.company-add input[type="text"] { padding: 6px 8px; }
form.company-add input[name="name"] { width: 210px; }
form.company-add input[name="current_price"] { width: 250px; }
.toolbar .inline select { width: auto; padding: 5px 6px; }
.toolbar .inline input[type="text"] { width: 190px; padding: 5px 6px; }
.toolbar .inline input[name="kw"] { width: 280px; }
.toolbar .inline input[name="u"] { width: 122px; }
.reqfilter .flt-row label.pg, .reqfilter .flt-row .pg { white-space: nowrap; }
.quick-btns { display: inline-flex; align-items: center; gap: 6px; }
.quick-btns a { text-decoration: none; }
/* 开销与收入·登记汇总 的筛选行：三个模块等宽、排成一行 */
.reqfilter .flt-row.staff-filter {
  display: grid;
  grid-template-columns: 180px 180px 360px max-content auto;
  align-items: stretch;
  gap: 8px 10px;
}
.reqfilter .flt-row.staff-filter .fitem {
  display: flex;
  align-items: center;
  gap: 6px;
  min-width: 0;
  height: 100%;
  font-size: 13px;
  color: #4a5b6b;
  white-space: nowrap;
}
.reqfilter .flt-row.staff-filter .fitem > input,
.reqfilter .flt-row.staff-filter .fitem > select {
  flex: 1 1 auto;
  width: auto;
  min-width: 0;
}
.reqfilter .flt-row.staff-filter .fitem input[type="date"] {
  width: 140px;
  flex: 0 0 auto;
}
.reqfilter .flt-row.staff-filter .flt-btns { justify-self: end; margin-left: 0; }
/* 「汇总总览」的筛选行只有 日期 + 快捷按钮 + 查询/重置 三块，单独定列宽，避免挤压叠在一起 */
.reqfilter .flt-row.staff-filter.ov-filter { grid-template-columns: 360px max-content auto; }
@media (max-width: 1180px) {
  .reqfilter .flt-row.staff-filter.ov-filter { grid-template-columns: 360px max-content; }
}
/* 「开销与收入汇总」的筛选行：登记人 / 部门 / 收支 / 日期 四块排成一行（登记人+部门 ≈ 日期） */
.reqfilter .flt-row.staff-filter.claim-filter {
  grid-template-columns: max-content max-content max-content minmax(280px, 300px) max-content auto;
  column-gap: 8px;
}
/* 快捷按钮多了一个「今年」，按钮和日期框都收一点，保证整行不换行 */
.reqfilter .flt-row.staff-filter.claim-filter .quick-btns { gap: 5px; }
.reqfilter .flt-row.staff-filter.claim-filter .quick-btns a { padding-left: 7px; padding-right: 7px; }
/* 登记人 / 部门 / 收支 三个搜索框宽度完全一致（列宽随标签文字长短自适应，不再靠固定像素） */
.reqfilter .flt-row.staff-filter.claim-filter .fitem > .combo {
  width: 100px;
  flex: 0 0 auto;
}
/* 日期只留够显示完整日期：空间多时最多 140px，空间少时缩到 110px，整行仍不换行 */
.reqfilter .flt-row.staff-filter.claim-filter .fitem input[type="date"] {
  flex: 1 1 0;
  width: auto;
  min-width: 110px;
  max-width: 140px;
}
@media (max-width: 1180px) {
  .reqfilter .flt-row.staff-filter.claim-filter {
    grid-template-columns: max-content max-content max-content minmax(300px, 340px);
  }
}
/* 「员工」筛选：可下拉、可模糊搜索、选中即筛选 */
.reqfilter .flt-row.staff-filter .fitem > .combo { flex: 1 1 auto; min-width: 0; }
.reqfilter .flt-row.staff-filter .fitem > .combo input {
  width: 100%;
  box-sizing: border-box;
}
/* 「1号搜拉一体」：内容不合法时的红框、以及下拉里的“无可选项”提醒 */
.combo input.nh-bad { border-color: #dc2626; background: #fef2f2; }
/* 「工资汇总 · 工资查询」的筛选行：五块自然排一行，查询/重置 不拉伸、高度跟输入框一样 */
.reqfilter .flt-row.staff-filter.salary-q {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 10px;
}
.reqfilter .flt-row.staff-filter.salary-q .fitem {
  height: auto;
  flex: 0 0 auto;
}
.reqfilter .flt-row.staff-filter.salary-q .fitem > .combo { width: 150px; flex: 0 0 auto; }
.reqfilter .flt-row.staff-filter.salary-q .fitem > input[name="syear"] { width: 96px; flex: 0 0 auto; }
.reqfilter .flt-row.staff-filter.salary-q .fitem > input[type="month"] { width: 138px; flex: 0 0 auto; }
.reqfilter .flt-row.staff-filter.salary-q .flt-btns { margin-left: auto; align-self: center; }
.reqfilter .flt-row.staff-filter.salary-q .flt-btns > .btn {
  height: 39px;
  padding: 0 20px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
}
.dopt.nh-empty {
  color: #b91c1c; background: #fef2f2; cursor: default;
  font-weight: 600; white-space: normal; line-height: 1.5;
}
.dopt.nh-hint {
  color: #b45309; background: #fffbeb; cursor: default;
  white-space: normal; line-height: 1.5;
}
.dopt.nh-blank {
  color: #64748b; border-top: 1px solid #e2e8f0; background: #f8fafc;
}
/* 按人员汇总：一个人一块，整表带框线；小计右对齐，右侧合计列居中 */
.tbl.tbl-sum th, .tbl.tbl-sum td {
  border: 1px solid #dbe3ec;
  padding: 6px 10px;
  text-align: left;
  vertical-align: middle;
}
.tbl.tbl-sum th { background: #f1f5f9; color: #334155; }
.tbl.tbl-sum tr:hover td { background: #fff; }
.tbl.tbl-sum td.sum-name { font-weight: 600; white-space: nowrap; }
.tbl.tbl-sum td.sum-dept { white-space: nowrap; }
.tbl.tbl-sum td.sum-dir { white-space: nowrap; color: #475569; }
.tbl.tbl-sum td.sum-sub { white-space: nowrap; font-variant-numeric: tabular-nums; }
.tbl.tbl-sum td.sum-total {
  white-space: nowrap;
  font-variant-numeric: tabular-nums; color: #14324a;
}
/* 负的总结余标红；不能用通用的 .qty-red（它是 display:block，会把单元格踢出表格框线） */
.tbl.tbl-sum td.sum-red { color: #dc2626; font-weight: 600; }
.tbl.tbl-sum tr.sum-toggle-row td {
  background: #f8fafc; padding: 3px 10px;
}
.tbl.tbl-sum tr.sum-toggle-row a {
  color: #2563eb; font-size: 12px; text-decoration: none;
}
.tbl.tbl-sum tr.sum-toggle-row a:hover { text-decoration: underline; }
/* 开销与收入·登记汇总：返回按钮+标题+汇总卡+筛选行 一起锁定在顶部 */
.mg-sticky {
  position: sticky;
  top: 60px;
  z-index: 70;
  background: #f4f6f9;
  padding: 6px 0 10px;
  margin: -6px 0 4px;
  box-shadow: 0 6px 10px -10px rgba(20, 50, 74, .45);
}
.mg-sticky .pagehead { margin: 0 0 10px; justify-content: flex-start; }
.mg-sticky .pagehead h1 { margin: 0; }
.mg-sticky .stats { margin: 0 0 10px; }
.mg-sticky .card.mg-filter { margin-bottom: 0; }
/* 薪资福利：表格里的行内输入框 */
.tbl.tbl-pay .num-in { width: 88px; padding: 3px 6px; font-size: 12.5px; }
.tbl.tbl-pay .note-in { width: 150px; padding: 3px 6px; font-size: 12.5px; }
.tbl.tbl-pay form.payform { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.tbl.tbl-pay td.pay-net { font-weight: 700; color: #14324a; }
/* 新建账号时按人事档案自动带出信息的提示 */
.hr-autofill-tip { font-size: 12px; color: #2563eb; margin-top: 4px; }
@media (max-width: 1180px) {
  .reqfilter .flt-row.staff-filter { grid-template-columns: 180px 180px 360px; }
}
/* 被审核标注过的记录：整行浅黄底 + 左侧橙条 */
.tbl tr.row-note td { background: #fffbeb; }
.tbl tr.row-note td:first-child { box-shadow: inset 3px 0 0 #f59e0b; }
/* 最新填写的 3 条登记：置顶显示并标浅黄底；有更新的登记后自动回到自己的日期位置 */
.tbl tr.row-new td { background: #fef9c3; }
/* 已撤回的登记：整行变灰，且不参与任何计算 */
.tbl tr.row-void td { color: #9ca3af; background: #f8fafc; }
.tbl tr.row-void td a, .tbl tr.row-void td button { color: #9ca3af; }
.tbl tr.row-void td .money-in, .tbl tr.row-void td .money-out,
.tbl tr.row-void td .dir-in, .tbl tr.row-void td .dir-out { color: #9ca3af; }
/* 操作列里的灰色小字提醒（如「填写已超2天」「已提交修改申请…」）：允许换行，不撑出表格 */
.op-note {
  color: #94a3b8; font-size: 12px; line-height: 1.45; margin-top: 2px;
  white-space: normal; word-break: break-word;
}
/* 操作列默认不换行：编辑 / 详情 / 删除 等入口并排一行 */
.tbl td.ops, .tbl th.ops { white-space: nowrap; }
/* 只有「我的登记记录」「开销与收入明细」需要让提醒文字在操作列里换行 */
.tbl.tbl-claim td.ops, .tbl.tbl-claim-mg td.ops { white-space: normal; max-width: 170px; }
.tbl td.ops .btn-mini-btn { padding: 2px 7px; font-size: 12px; white-space: nowrap; }
/* 明细里的「修改/撤回申请」区块 */
.req-box { min-width: 230px; }
.req-badge {
  display: inline-block; padding: 1px 7px; border-radius: 999px;
  background: #fef3c7; color: #b45309; font-size: 12px; font-weight: 600;
}
.req-detail { color: #334155; font-size: 12.5px; margin-top: 4px; line-height: 1.5; }
.req-holder { display: none; }
/* 有待审核申请的行：整行盖一层半透明层，入口按钮居中放在这层上 */
.tbl tr.row-req { position: relative; }
.row-ov {
  position: absolute; inset: 0; z-index: 3;
  display: flex; align-items: center; justify-content: center;
  background: rgba(37, 99, 235, .10);
}
.row-ov .btn-primary { box-shadow: 0 1px 5px rgba(0, 0, 0, .18); }
/* 半透明层上的审核入口：50% 透明度红色、两头半圆的长条，高度与「标注」按钮一致 */
.row-ov .row-ov-btn,
.row-ov-btn {
  background: rgba(220, 38, 38, .5);
  border-color: rgba(220, 38, 38, .5);
  color: #fff;
  border-radius: 999px;
  padding-left: 18px;
  padding-right: 18px;
  box-shadow: 0 1px 6px rgba(0, 0, 0, .18);
  font-weight: 600;
}
.row-ov .row-ov-btn:hover,
.row-ov-btn:hover { background: rgba(220, 38, 38, .68); border-color: rgba(220, 38, 38, .68); }
/* 点「查看申请」后的审批弹层 */
.req-modal {
  position: fixed; inset: 0; background: rgba(15, 23, 42, .45);
  display: flex; align-items: center; justify-content: center; z-index: 9999;
}
.req-modal-box {
  background: #fff; border-radius: 10px; width: min(700px, 92vw); max-height: 86vh;
  overflow: auto; box-shadow: 0 20px 50px rgba(0, 0, 0, .25);
}
.req-modal-head {
  display: flex; justify-content: space-between; align-items: center;
  padding: 12px 16px; border-bottom: 1px solid #e2e8f0;
}
.req-modal-head b { font-size: 15px; color: #14324a; }
.req-x { border: none; background: none; font-size: 20px; line-height: 1; cursor: pointer; color: #64748b; }
.req-modal-body { padding: 14px 16px; line-height: 1.65; font-size: 13.5px; color: #334155; }
.req-modal-foot {
  display: flex; gap: 10px; justify-content: flex-end; align-items: center;
  padding: 12px 16px; border-top: 1px solid #e2e8f0;
}
.req-kv { margin: 4px 0; }
.req-kv b { color: #14324a; }
/* 「开销与收入明细」的序号列：有申请时里面放整行半透明层 */
.tbl.tbl-claim-mg td.idx { position: static; }
.req-old { color: #475569; font-size: 13px; margin-bottom: 8px; }
.req-old .req-k { color: #94a3b8; margin-right: 6px; }
/* 申请页：「申请修改内容 / 申请撤回」两个大选项 */
.req-choice { display: flex; gap: 10px; flex-wrap: wrap; margin: 4px 0 12px; }
.req-opt {
  flex: 1 1 280px; max-width: 430px; margin: 0;
  display: flex; gap: 6px; align-items: flex-start;
  border: 1px solid #cbd5e1; border-radius: 8px; padding: 8px 10px;
  background: #fff; cursor: pointer; line-height: 1.45;
}
/* 全局 input 样式会把单选框拉满整行（圆点离文字很远），这里必须还原成小圆点 */
.req-opt input[type="radio"] {
  width: auto; flex: 0 0 auto; margin: 3px 0 0; padding: 0;
  border: none; background: none; accent-color: #2563eb;
}
.req-opt-t { font-weight: 600; color: #14324a; font-size: 13.5px; }
.req-opt-d { display: block; color: #64748b; font-size: 12px; margin-top: 1px; }
.req-opt.is-on { border-color: #2563eb; background: #f0f7ff; box-shadow: 0 0 0 1px #bfdbfe inset; }
/* 「管理与汇总·总览」按人汇总表里的总结余：负数标红（不能用 .tbl .qty-red，它是 display:block） */
.tbl td.bal-red { color: #dc2626; font-weight: 600; }
.notefield { width: 220px !important; padding: 4px 6px !important; font-size: 13px; }
.tbl td.note_cell { max-width: 320px; white-space: normal; }
.tbl td.note_cell .notefield { width: 170px !important; }
.tbl td.note_cell form.inline { display: inline-block; margin-top: 4px; }
/* 审核标注：默认只显示「标注」按钮，点开才出现输入框（只在纵向展开，列宽固定不左右跳动） */
/* 列宽按百分比固定（合计 100%）：序号/日期很窄且不换行，左边几列加宽，事由/审核标注收窄 */
.tbl.tbl-manage, .tbl.tbl-claim { table-layout: fixed; }
/* 我的登记记录：序号 日期 收支 类别 金额 票据 事由 审核标注 操作 */
.tbl.tbl-claim th:nth-child(1) { width: 5%; }
.tbl.tbl-claim th:nth-child(2) { width: 13%; }
.tbl.tbl-claim th:nth-child(3) { width: 6%; }
.tbl.tbl-claim th:nth-child(4) { width: 13%; }
.tbl.tbl-claim th:nth-child(5) { width: 10%; }
.tbl.tbl-claim th:nth-child(6) { width: 13%; }
.tbl.tbl-claim th:nth-child(7) { width: 15%; }
.tbl.tbl-claim th:nth-child(8) { width: 15%; }
.tbl.tbl-claim th:nth-child(9) { width: 10%; }
/* 开销与收入明细：序号 日期 收支 登记人 部门 类别 金额 票据 事由 审核标注 */
.tbl.tbl-manage th:nth-child(1) { width: 5%; }
.tbl.tbl-manage th:nth-child(2) { width: 11%; }
.tbl.tbl-manage th:nth-child(3) { width: 6%; }
.tbl.tbl-manage th:nth-child(4) { width: 9%; }
.tbl.tbl-manage th:nth-child(5) { width: 10%; }
.tbl.tbl-manage th:nth-child(6) { width: 10%; }
.tbl.tbl-manage th:nth-child(7) { width: 9%; }
.tbl.tbl-manage th:nth-child(8) { width: 10%; }
.tbl.tbl-manage th:nth-child(9) { width: 15%; }
.tbl.tbl-manage th:nth-child(10) { width: 15%; }
.tbl.tbl-manage td:nth-child(1), .tbl.tbl-claim td:nth-child(1),
.tbl.tbl-manage td:nth-child(2), .tbl.tbl-claim td:nth-child(2) { white-space: nowrap; }
.tbl td.idx { text-align: center; color: #64748b; }
.tbl.tbl-manage td, .tbl.tbl-claim td { word-break: break-word; overflow-wrap: anywhere; }
.note-cell { display: flex; flex-direction: column; gap: 4px; align-items: flex-start; width: 100%; max-width: 100%; }
.note-badge {
  background: #fee2e2; color: #b91c1c; font-size: 11px;
  padding: 1px 7px; border-radius: 10px; white-space: nowrap;
}
.note-editor { display: none; margin-top: 4px; width: 100%; max-width: 100%; }
.note-editor .notefield { width: 100% !important; box-sizing: border-box; }
.note-actions { display: flex; gap: 6px; margin-top: 4px; }
.note-thread {
  margin-top: 6px; border-left: 3px solid #e2e8f0;
  padding-left: 8px; width: 100%; max-width: 100%; box-sizing: border-box;
}
.note-thread .nt-item { margin-bottom: 5px; font-size: 12px; }
.note-thread .nt-who { color: #94a3b8; font-size: 11px; }
.note-thread .nt-text { color: #334155; white-space: pre-wrap; word-break: break-all; }
.note-thread .nt-item.nt-mgr .nt-text { color: #b91c1c; }
.note-thread .nt-item.nt-me .nt-text { color: #2563eb; }
.note-thread .nt-tag {
  display: inline-block; width: 16px; height: 16px; line-height: 16px;
  text-align: center; border-radius: 4px; font-size: 11px;
  background: #e2e8f0; color: #475569; margin-right: 4px;
}
.note-thread .nt-item.nt-mgr .nt-tag { background: #fee2e2; color: #b91c1c; }
.note-thread .nt-item.nt-me .nt-tag { background: #dbeafe; color: #1d4ed8; }
.hist-toggle { font-size: 12px; color: #2563eb; text-decoration: none; }
.hist-toggle:hover { text-decoration: underline; }
.note-hist { display: none; margin-top: 4px; }
/* 我的登记记录：右上角筛选条 + 金额列可点击排序 */
.card-head {
  display: flex; justify-content: space-between; align-items: center;
  gap: 10px; flex-wrap: nowrap; margin-bottom: 10px;
}
.card-head h2 { margin: 0; flex: 0 0 auto; }
.mine-filter {
  display: flex; align-items: center; gap: 6px;
  flex: 1 1 auto; justify-content: flex-end;
  flex-wrap: nowrap; overflow-x: auto;
  font-size: 12.5px; color: #4a5b6b;
}
.mine-filter .pg { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.mine-filter select { width: 92px; padding: 3px 5px; font-size: 12.5px; }
.mine-filter input[type="date"] { width: 112px; padding: 3px 5px; font-size: 12.5px; }
.mine-filter input[type="text"] { width: 120px; padding: 3px 5px; font-size: 12.5px; }
.mine-filter .btn-mini-btn { padding: 3px 9px; font-size: 12.5px; white-space: nowrap; }
/* 工作报表汇总的筛选：人员 / 部门 / 类型 / 状态 / 日期 一样宽 */
.mine-filter.rptflt select, .mine-filter.rptflt input[type="date"],
.mine-filter.rptflt input[type="text"] { width: 110px; }
/* 工作报表汇总：标题右边的「自动审核」设置 */
.apform { display: flex; align-items: center; gap: 6px; font-size: 12.5px;
  color: #4a5b6b; white-space: nowrap; }
.apform input[type="number"] { padding: 3px 5px; font-size: 12.5px; }
.apform .btn-mini-btn { padding: 3px 9px; font-size: 12.5px; }
.tbl th.sortable-head { cursor: pointer; user-select: none; white-space: nowrap; }
.tbl th.sortable-head:hover { color: #2563eb; }
.sortarrow { color: #2563eb; font-size: 11px; }
.toolbar .inline input[type="date"] { width: 145px; padding: 4px 6px; }
.toolbar .inline label.pg {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  margin: 0;
  font-size: 13px;
  color: #4a5b6b;
}
.reqfilter { display: block; width: 100%; }
.reqfilter .flt-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
}
.reqfilter .flt-row + .flt-row { margin-top: 8px; }
.reqfilter .flt-btns {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-left: auto;
}
.toolbar .inline.reqfilter input[name="kw"] { width: 250px; }
/* 代发记录明细筛选栏（只有这个页面）：日期 + 6 个下拉 + 按钮 要挤在一行，所以整体压窄 */
/* 这一行要占满整行宽度，多出来的宽度全部给搜索框 */
.reqfilter.ordlist .flt-row { gap: 6px; flex: 1 1 auto; }
.reqfilter.ordlist .flt-btns { margin-left: 0; }
.toolbar .inline.reqfilter.ordlist input[name="kw"] { width: 118px; flex: 1 1 118px; min-width: 118px; }
.reqfilter.ordlist .msel-trigger { max-width: 112px; padding: 5px 6px; }
.reqfilter.ordlist .msel-text { max-width: 72px; }
.toolbar .inline.reqfilter.ordlist input[type="date"] { width: 110px; padding: 4px 4px; }
.ordlist .ship-date { display: inline-flex; align-items: center; gap: 3px; }
/* 代发统计看板：日期框右边的快捷区间按钮 */
.quick-range { display: inline-flex; align-items: center; gap: 5px; }
/* 售后 · 补发/丢件登记：筛选栏保持一行，表格紧凑不撑破 */
.reqfilter.aftfilter .flt-row { gap: 6px; flex: 1 1 auto; }
.reqfilter.aftfilter select { max-width: 104px; }
.reqfilter.aftfilter .pg { gap: 3px; }
.toolbar .inline.reqfilter.aftfilter input[type="date"] { width: 90px; padding: 4px 2px; }
/* 搜索框吃掉余下的宽度，让整行正好充满 */
.reqfilter.aftfilter .flt-btns { margin-left: 0; }
.toolbar .inline.reqfilter.aftfilter input[name="kw"] {
  width: 110px; flex: 1 1 110px; min-width: 110px;
}
.tbl-aft td, .tbl-aft th { padding: 5px 7px; font-size: 12.5px; }
.tbl-aft td.ops { white-space: nowrap; }
/* 补发单号：表格里点一下就能直接输入（打单同事回填用） */
.tbl-aft td.cell-resendno { padding: 3px 5px; vertical-align: middle; }
.tbl-aft input.resendno-in {
  width: 100%; min-width: 118px; padding: 3px 6px;
  font-size: 12.5px; font-family: inherit; color: #24303a;
  border: 1px dashed #cbd5e1; border-radius: 4px; background: #fff;
}
.tbl-aft input.resendno-in::placeholder { color: #94a3b8; }
.tbl-aft input.resendno-in:hover { border-color: #93c5fd; background: #f8fbff; }
.tbl-aft input.resendno-in:focus {
  border-style: solid; border-color: #2563eb; background: #fff; outline: none;
  box-shadow: 0 0 0 2px rgba(37,99,235,.15);
}
.tbl-aft input.resendno-in.saving { opacity: .55; }
.tbl-aft input.resendno-in.saved { border-style: solid; border-color: #16a34a; background: #f0fdf4; }
.tbl-aft input.resendno-in.failed { border-style: solid; border-color: #dc2626; background: #fef2f2; }
/* 店铺一整行显示；买家ID窄一点，写不下就换行 */
.tbl-aft th.col-shop, .tbl-aft td.col-shop { white-space: nowrap; }
.tbl-aft th.col-buyer, .tbl-aft td.col-buyer {
  width: 96px; max-width: 96px; white-space: normal; word-break: break-all;
}
/* 点一下复制 */
.copy-wrap { display: flex; align-items: center; gap: 4px; }
.tbl-aft .copy-btn {
  flex: 0 0 auto; width: 20px; height: 22px; line-height: 1;
  padding: 0; font-size: 12px; color: #64748b; cursor: pointer;
  border: 1px solid #cbd5e1; border-radius: 4px; background: #fff;
}
.tbl-aft .copy-btn:hover { color: #1d4ed8; border-color: #93c5fd; background: #eff6ff; }
.tbl-aft td.copy-cell { cursor: pointer; }
.tbl-aft td.copy-cell:hover { background: #f0f7ff; }
.copy-toast {
  position: fixed; left: 50%; bottom: 42px; transform: translateX(-50%);
  background: rgba(20,50,74,.93); color: #fff; font-size: 13px;
  padding: 7px 15px; border-radius: 6px; z-index: 9999;
  opacity: 0; transition: opacity .18s; pointer-events: none;
}
.copy-toast.show { opacity: 1; }
.copy-toast.wide {
  max-width: 540px; white-space: normal; line-height: 1.55; text-align: center;
  padding: 10px 16px; border-radius: 8px; font-size: 13px;
}
/* ===== 销售开单（售前管理） ===== */
.so-card .grid.seven { grid-template-columns: repeat(8, 1fr); gap: 10px 10px; }
.grid.seven > .span6 { grid-column: span 6; }
.grid.seven > .span5 { grid-column: span 5; }
.so-tbl { table-layout: fixed; }
.so-tbl { margin-top: 18px; }
.so-card .grid.four { margin-top: 14px; }
/* 销售开单第二行：开单编号 / 收货人 / 联系电话 / 收货地址 / 备注
   （备注宽度刚好是收货地址的一半，整行还是一行） */
.so-card .grid.so-row2 { grid-template-columns: 1.15fr 1.15fr 1.15fr 4fr 2fr; }
/* 第三行只剩审核 / 发货 / 复核 */
.so-card .grid.so-row3 { grid-template-columns: repeat(3, 1fr); }
/* 最近开的单：发货/单号列（就一个输入框，内容多会自动换行、框跟着变高） */
.modal-mask {
  position: fixed; left: 0; right: 0; top: 0; bottom: 0; z-index: 9998;
  background: rgba(15, 23, 42, .45); padding: 36px 16px; overflow: auto;
  display: flex; align-items: flex-start; justify-content: center;
}
.modal-box {
  background: #fff; border-radius: 10px; padding: 18px 22px 20px; width: 100%; max-width: 880px;
  box-shadow: 0 18px 40px rgba(15, 23, 42, .28);
}
.modal-box h3 { margin: 0 0 6px; font-size: 17px; color: #14324a; }
.modal-box .muted { font-size: 12.5px; margin: 0 0 12px; }
.cb-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 16px; }
.cb-grid .span2 { grid-column: span 2; }
.cb-grid label { display: block; font-size: 12px; color: #475569; margin-bottom: 2px; }
.cb-grid input {
  width: 100%; padding: 5px 7px; font-size: 13px; font-family: inherit;
  border: 1px solid #e2e8f0; border-radius: 5px; box-sizing: border-box;
}
.cb-grid input:focus { border-color: #2563eb; outline: none; }
/* 合同预览：按 A4 白纸显示，字体字号跟导出的一致 */
.contract-page {
  background: #fff; border: 1px solid #cbd5e1; border-radius: 6px;
  width: 100%; max-width: 794px; min-height: 1123px; margin: 0 auto; padding: 1.5cm;
  font-family: SimSun, "宋体", serif; font-size: 10.5pt; line-height: 1.6; color: #000;
  box-shadow: 0 6px 18px rgba(15, 23, 42, .08);
}
.contract-page p { margin: 4px 0; }
/* 浮动文本框（合同编号那三行 / 需方资料 / 供方资料）：按 Word 坐标绝对定位 */
.contract-page { position: relative; }
.contract-page .anchor-wrap { position: relative; }
.contract-page .tbox { position: absolute; background: #fff; padding: 4px 6px; box-sizing: border-box; }
/* 盖章 */
.stamp-bar {
  display: flex; align-items: center; gap: 8px; flex-wrap: nowrap;
  background: #fff; border: 1px solid #cbd5e1; border-radius: 8px;
  padding: 6px 10px; margin-bottom: 10px; overflow-x: auto;
}
.stamp-bar .btn-mini-btn { white-space: nowrap; }
.stamp-bar select {
  padding: 4px 6px; font-size: 12.5px; font-family: inherit;
  border: 1px solid #e2e8f0; border-radius: 5px;
  min-width: 300px; max-width: 380px;
}
.stamp-bar .muted { font-size: 12px; }
.stamp-box {
  position: absolute; z-index: 20; cursor: move; user-select: none; touch-action: none;
  outline: 1px dashed transparent;
}
.stamp-box.stamp-sel { outline: 1px dashed #2563eb; }
.stamp-box .stamp-img {
  display: block; width: 100%; height: 100%; -webkit-user-drag: none;
  mix-blend-mode: multiply;            /* 跟 PS 的"正片叠底"一样，白底不会盖住文字 */
}
.stamp-box .stamp-del {
  position: absolute; right: -10px; top: -10px; width: 20px; height: 20px; padding: 0;
  line-height: 1; font-size: 14px; cursor: pointer; border-radius: 50%;
  border: 1px solid #fecaca; background: #fff; color: #dc2626; display: none;
}
.stamp-box .stamp-handle {
  position: absolute; right: -6px; bottom: -6px; width: 13px; height: 13px; cursor: nwse-resize;
  background: #2563eb; border: 1px solid #fff; border-radius: 2px; display: none;
}
.stamp-box.stamp-sel .stamp-del, .stamp-box.stamp-sel .stamp-handle { display: block; }
.stamp-thumb { max-width: 110px; max-height: 70px; border: 1px solid #e2e8f0; background: #fff; }
.stamp-row {
  display: flex; align-items: center; gap: 14px; padding: 8px 0; border-bottom: 1px dashed #e2e8f0;
}
.stamp-row .stamp-org { width: 240px; font-size: 13px; color: #14324a; }
.stamp-row .stamp-prev { width: 130px; }
.stamp-row .stamp-actions { display: flex; align-items: center; gap: 10px; font-size: 12.5px; }
.stamp-row input[type=file] { font-size: 12px; }
@media print { .stamp-bar { display: none !important; } }
.contract-tbl { width: 100%; border-collapse: collapse; margin: 8px 0; table-layout: fixed; }
.contract-tbl th, .contract-tbl td {
  border: 1px solid #000; padding: 2px 5px; font-size: 10.5pt; line-height: 1.25;
}
.contract-tbl td p, .contract-tbl th p { margin: 0; line-height: 1.25; }
@media print {
  .contract-page { border: none; box-shadow: none; padding: 0; max-width: none; }
}
.cb-grid .combo { position: relative; }
.cb-grid .combo input { width: 100%; }
.cb-grid .combo { display: flex; align-items: center; }
.cb-grid .combo .caret { flex: 0 0 auto; cursor: pointer; }
/* 下拉三角用 CSS 画，避免字体里没有这个符号显示成乱码 */
.cb-grid .combo .caret.ct-caret::after {
  content: ""; display: inline-block; width: 0; height: 0;
  border-left: 5px solid transparent; border-right: 5px solid transparent;
  border-top: 6px solid #64748b; vertical-align: middle;
}
.cb-grid .combo .caret.ct-caret {
  display: flex; align-items: center; justify-content: center; line-height: 1;
  align-self: stretch; margin-left: -1px;
}
.cb-grid .combo .dlist { position: absolute; left: 0; right: 0; top: 100%; z-index: 30; }
.modal-box .actions { display: flex; gap: 10px; margin-top: 14px; }
@media (max-width: 700px) {
  .cb-grid { grid-template-columns: 1fr; }
  .cb-grid .span2 { grid-column: span 1; }
}
@media print { .modal-mask { display: none !important; } }
.tbl-aft td.cell-shipno { white-space: normal; padding: 3px 6px; vertical-align: middle; }
.tbl-aft .shipno-wrap { align-items: flex-start; }
.tbl-aft .shipno-in {
  width: 156px; min-height: 24px; padding: 3px 6px; font-size: 12.5px; font-family: inherit;
  line-height: 1.45; color: #14324a; background: #fff; box-sizing: border-box;
  border: 1px solid #e2e8f0; border-radius: 4px; resize: none; overflow: hidden;
  white-space: pre-wrap; word-break: break-word;
}
.tbl-aft .shipno-in::placeholder { color: #94a3b8; }
.tbl-aft .shipno-in:hover { border-color: #93c5fd; background: #f8fbff; }
.tbl-aft .shipno-in:focus { border-color: #2563eb; outline: none; background: #fff; }
.tbl-aft .shipno-in.saving { opacity: .55; }
.tbl-aft .shipno-in.saved { border-color: #16a34a; background: #f0fdf4; }
.tbl-aft .shipno-in.failed { border-color: #dc2626; background: #fef2f2; }
.so-tbl th, .so-tbl td { padding: 4px 6px; font-size: 12.5px; }
.so-tbl td.so-idx { text-align: center; color: #64748b; }
.so-tbl input, .so-tbl select {
  width: 100%; padding: 3px 5px; font-size: 12.5px; font-family: inherit;
  border: 1px solid #e2e8f0; border-radius: 4px; background: #fff;
}
.so-tbl input:focus, .so-tbl select:focus { border-color: #2563eb; outline: none; }
.so-tbl input.so-qty, .so-tbl input.so-price { text-align: right; }
.so-tbl td.so-amt { text-align: right; font-variant-numeric: tabular-nums; }
.tbl.so-tbl td.so-amt { padding: 3px 5px; }
.so-tbl .so-amt-in {
  display: block; padding: 3px 6px; text-align: right;
  font-size: 12.5px; color: #14324a; font-weight: 600;
  background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 4px;
  font-variant-numeric: tabular-nums;
}
.so-tbl th:nth-child(1) { width: 44px; }
.so-tbl th:nth-child(3) { width: 134px; }
.so-tbl th:nth-child(4) { width: 76px; }
.so-tbl th:nth-child(5) { width: 78px; }
.so-tbl th:nth-child(6) { width: 96px; }
.so-tbl th:nth-child(7) { width: 100px; }
.so-tbl th.so-del-cell, .so-tbl td.so-del-cell {
  width: 62px; text-align: center; vertical-align: middle; padding: 2px 4px;
}
.so-tbl .so-del {
  padding: 3px 10px; font-size: 12.5px; line-height: 1.3; border-radius: 4px;
  color: #b91c1c; background: #fff; border: 1px solid #fecaca; cursor: pointer;
}
.so-tbl .so-del:hover { background: #fef2f2; border-color: #fca5a5; }
.so-foot { display: flex; align-items: center; justify-content: space-between; margin: 8px 0 4px; }
.so-sum { font-size: 14px; color: #14324a; }
.so-sum b { font-size: 17px; color: #dc2626; }
/* 销售单查看 / 打印 */
.sheet {
  background: #fff; border: 1px solid #cbd5e1; border-radius: 6px;
  padding: 22px 26px; max-width: 1000px; margin: 0 auto;
}
.sheet-title { text-align: center; font-size: 20px; margin: 0 0 14px; letter-spacing: 2px; }
.sheet-head { display: flex; justify-content: space-between; gap: 16px; margin-bottom: 8px; font-size: 13.5px; }
/* 销售单表格：横竖格线统一成实线（.tbl 的基础样式在后面，所以这里加上 .tbl 提高优先级） */
.tbl.sheet-tbl th, .tbl.sheet-tbl td { border: 1px solid #94a3b8; padding: 5px 7px; font-size: 12.5px; }
.tbl.sheet-tbl th { background: #f1f5f9; text-align: center; color: #334155; }
.sheet-tbl td:nth-child(1) { text-align: center; }
.sheet-tbl td:nth-child(5), .sheet-tbl td:nth-child(6), .sheet-tbl td:nth-child(7) { text-align: right; }
.sheet-sum { display: flex; justify-content: space-between; margin: 8px 0; font-size: 13.5px; }
.sheet-sum b { color: #b91c1c; }
.sheet-foot { display: flex; flex-wrap: wrap; gap: 8px 26px; font-size: 13px; margin: 6px 0; }
.sheet-addr { font-size: 13px; margin: 4px 0 10px; }
.sheet-sign { display: flex; gap: 34px; font-size: 13px; margin: 10px 0; }
.sheet-sign .sign-line { margin-left: auto; }
/* 销售单签名：默认签开单人的名字，用签字体；双击可以改、点 ✕ 可以删 */
.sheet-sign .sig-line { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; }
.sig-text {
  font-family: "华文行楷", "STXingkai", "楷体", "KaiTi", "Microsoft YaHei", cursive;
  font-style: italic; font-size: 20px; line-height: 26px; color: #1d4ed8;
  letter-spacing: 1px; min-width: 88px; padding: 0 6px; outline: none;
  border-bottom: 1px solid transparent; white-space: nowrap;
}
.sig-text:hover { border-bottom-color: #cbd5e1; }
.sig-text:focus { border-bottom-color: #94a3b8; background: #f6f9ff; }
.sig-text.sig-empty { font-family: inherit; font-style: normal; font-size: 13px; color: #94a3b8; }
.sig-text.sig-empty::before { content: "双击这里签上姓名"; }
.sig-clear {
  width: 20px; height: 20px; padding: 0; line-height: 1; font-size: 12px; cursor: pointer;
  border: 1px solid #e2e8f0; border-radius: 50%; background: #fff; color: #94a3b8;
}
.sig-clear:hover { color: #dc2626; border-color: #fecaca; background: #fef2f2; }
.sheet-note { font-size: 13px; color: #475569; }
.sheet-company { border-top: 1px solid #cbd5e1; margin-top: 14px; padding-top: 8px; font-size: 12.5px; color: #64748b; }
@media print {
  .topbar, .nav, .foot, .no-print, .pager, .flash { display: none !important; }
  body { background: #fff; }
  .container { max-width: none; padding: 0; }
  .sheet { border: none; padding: 0; max-width: none; }
  main .toolbar { display: none !important; }
  .sig-text.sig-empty::before { content: ""; }
  .sig-text:hover { border-bottom-color: transparent; }
}
/* 打印销售单时固定 A4 竖版（跟下载的 PDF 一致），页边距 15mm */
@page { size: A4 portrait; margin: 15mm; }
/* 导出丢件登记：勾选列的面板 */
.exp-cols { display: flex; flex-wrap: wrap; gap: 8px 18px; margin: 6px 0 6px; }
.exp-col { display: inline-flex; align-items: center; gap: 5px; font-size: 13px; color: #24303a; }
.exp-col input { margin: 0; }
/* 数据汇总表：店铺当行、原因当列，保证整表在窗口内 */
.tbl.tbl-sum-aft th, .tbl.tbl-sum-aft td { white-space: nowrap; }
.tbl.tbl-sum-aft th.sum-shop, .tbl.tbl-sum-aft td.sum-shop {
  text-align: left; min-width: 132px; max-width: 190px; overflow: hidden; text-overflow: ellipsis;
}
.tbl.tbl-sum-aft td, .tbl.tbl-sum-aft th { padding: 4px 8px; font-size: 12.5px; }
.tbl.tbl-sum-aft td:not(.sum-shop) { text-align: center; }
/* 是否丢件：双击直接改 */
.tbl-aft td.cell-lostflag { cursor: pointer; position: relative; }
.tbl-aft td.cell-lostflag:hover { background: #f0f7ff; }
.tbl-aft td.cell-lostflag .lf-text { border-bottom: 1px dashed #94a3b8; }
.tbl-aft td.cell-lostflag .lf-text.lf-blue { color: #2563eb; font-weight: 600; }
.tbl-aft td.cell-lostflag .lf-text.lf-red { color: #dc2626; font-weight: 600; }
/* 代发记录筛选栏：所有控件固定宽度，筛选后布局不再跳动 */
/* 始终保留右侧滚动条：筛选后结果变少时页面不会因为滚动条消失而左右抖一下 */
html { overflow-y: scroll; scrollbar-gutter: stable; }
/* 代发记录筛选栏：恢复原来的自然宽度（筛选栏的宽度压缩试验已回退） */
/* 考勤排班：筛选栏（月份 + 员工 + 查看）固定排成一行，宽度自适应、不换行、不抖动 */
.toolbar.attfilter {
  flex-wrap: nowrap; justify-content: flex-start; align-items: center; gap: 10px;
}
.toolbar.attfilter label.pg { white-space: nowrap; flex: none; margin: 0; align-self: center; }
.toolbar.attfilter input[type="month"] { width: 168px; flex: none; }
.toolbar.attfilter select { width: 190px; flex: none; }
.toolbar.attfilter .btn, .toolbar.attfilter .btn-primary { flex: none; }
/* 班次对应时间：显示在筛选栏下一行 */
.att-shift-times {
  margin: -6px 0 16px; font-size: 12.5px; color: #64748b; line-height: 1.5;
}
/* 卡片标题行：左边标题、右边控件（参与排班人员） */
.card-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 0 0 12px; }
.card-head h2 { margin: 0; }
.att-part { position: relative; flex: none; }
/* 排班卡片标题右侧的操作提示 */
.sched-tip { margin-left: 12px; font-size: 12.5px; font-weight: 400; color: #64748b; }
/* 「清空排班」按钮：贴住卡片右侧（在「参与排班人员」左边） */
.sched-clear { margin-left: auto; flex: none; }
.sched-clear button { padding: 5px 10px; font-size: 12.5px; }
.att-part-btn {
  display: inline-flex; align-items: center; gap: 4px; padding: 5px 10px;
  border: 1px solid #cbd5e1; border-radius: 6px; background: #fff;
  color: #33475b; font-size: 12.5px; font-family: inherit; cursor: pointer;
}
.att-part-btn:hover { background: #f1f5f9; border-color: #94a3b8; }
.att-part-caret { font-size: 10px; color: #64748b; }
.att-part-menu {
  display: none; position: absolute; right: 0; top: calc(100% + 4px); z-index: 50;
  min-width: 236px; padding: 8px 10px; background: #fff; border: 1px solid #cbd5e1;
  border-radius: 8px; box-shadow: 0 12px 28px -10px rgba(20, 50, 74, .35);
}
.att-part.open .att-part-menu { display: block; }
.att-part-tip { margin: 0 0 6px; font-size: 12px; color: #64748b; }
.att-part-list { max-height: 250px; overflow: auto; }
.att-part-list label {
  display: flex; align-items: center; gap: 7px; padding: 3px 2px;
  font-size: 13px; color: #24303a; cursor: pointer; white-space: nowrap;
}
.att-part-list input { width: auto; margin: 0; flex: none; accent-color: #2563eb; cursor: pointer; }
.att-part-foot {
  display: flex; gap: 14px; margin-top: 6px; padding-top: 6px; border-top: 1px solid #eef2f6;
}
/* 考勤排班：日历排班表 */
.cal-tbl { min-width: 100%; table-layout: fixed; }
.cal-tbl th, .cal-tbl td { padding: 1px; font-size: 11.5px; text-align: center; }
.cal-tbl thead th small { display: block; font-size: 10px; color: #94a3b8; font-weight: 400; }
.cal-tbl thead th.cal-weekend { background: #fef2f2; }
.cal-tbl thead th.cal-weekend small { color: #ef4444; }
/* 左上角表头：一条斜线，左下"员工"、右上"日期" */
.cal-tbl thead th.cal-corner {
  position: relative; height: 36px; padding: 0; background-color: #f8fafc;
  background-image: linear-gradient(to top right,
    transparent calc(50% - 0.5px), #a8b6c6 calc(50% - 0.5px),
    #a8b6c6 calc(50% + 0.5px), transparent calc(50% + 0.5px));
}
.cal-tbl thead th.cal-corner .corner-date {
  position: absolute; top: 2px; right: 6px;
}
.cal-tbl thead th.cal-corner .corner-staff {
  position: absolute; bottom: 2px; left: 6px;
}
/* 两个标注的字号 / 字体 / 颜色保持一致 */
.cal-tbl thead th.cal-corner .corner-date,
.cal-tbl thead th.cal-corner .corner-staff {
  font-family: inherit; font-size: 11px; font-weight: 400; color: #475569;
}
.cal-tbl th.cal-name, .cal-tbl td.cal-name {
  position: sticky; left: 0; background: #f8fafc; width: 76px; min-width: 76px;
  text-align: left; padding: 1px 6px; z-index: 2; font-size: 12px;
  vertical-align: middle; line-height: 20px;      /* 跟班次输入框同高，行内上下对齐 */
}
/* 日历格子：没有下拉三角，直接点/框选后从浮层里选班次 */
.cal-tbl .cal-cell { padding: 1px; cursor: pointer; user-select: none; }
.cal-tbl .cal-btn {
  display: block; width: 100%; padding: 2px 0; border: 1px solid #e2e8f0; border-radius: 3px;
  background: #fff; font-size: 11.5px; line-height: 1.25; overflow: hidden; white-space: nowrap;
  text-align: center;                     /* 班次文字居中 */
}
/* 不同班次不同底色 */
.cal-btn.sc-morning, .my-shift.sc-morning, .ms-shift.sc-morning { background: #dbeafe; border-color: #93c5fd; color: #1e40af; }
.cal-btn.sc-mid, .my-shift.sc-mid, .ms-shift.sc-mid { background: #dcfce7; border-color: #86efac; color: #166534; }
.cal-btn.sc-night, .my-shift.sc-night, .ms-shift.sc-night { background: #ede9fe; border-color: #c4b5fd; color: #5b21b6; }
.cal-btn.sc-allday, .my-shift.sc-allday, .ms-shift.sc-allday { background: #cffafe; border-color: #67e8f9; color: #155e75; }
.cal-btn.sc-off, .my-shift.sc-off, .ms-shift.sc-off {
  background: #fee2e2; border-color: #fca5a5; color: #b91c1c; font-weight: 700;
}
.cal-btn.sc-leave, .my-shift.sc-leave, .ms-shift.sc-leave { background: #fef3c7; border-color: #fcd34d; color: #92400e; }
.cal-btn.sc-other0, .my-shift.sc-other0, .ms-shift.sc-other0 { background: #ffe4e6; border-color: #fda4af; color: #9f1239; }
.cal-btn.sc-other1, .my-shift.sc-other1, .ms-shift.sc-other1 { background: #ffedd5; border-color: #fdba74; color: #9a3412; }
.cal-btn.sc-other2, .my-shift.sc-other2, .ms-shift.sc-other2 { background: #ecfccb; border-color: #bef264; color: #3f6212; }
.cal-btn.sc-other3, .my-shift.sc-other3, .ms-shift.sc-other3 { background: #e0e7ff; border-color: #a5b4fc; color: #3730a3; }
.cal-btn.sc-other4, .my-shift.sc-other4, .ms-shift.sc-other4 { background: #fae8ff; border-color: #f0abfc; color: #86198f; }
/* 我的排班（整月迷你月历） */
.ms-head { display: grid; grid-template-columns: repeat(7, 1fr); gap: 5px; margin-bottom: 5px; }
.ms-head span { text-align: center; font-size: 12px; color: #64748b; }
.ms-head span.we { color: #ef4444; }
.ms-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 5px; }
.ms-day {
  min-height: 54px; padding: 3px 5px; border: 1px solid #eef2f6;
  border-radius: 6px; background: #fff;
}
.ms-day.ms-empty { border-color: transparent; background: transparent; }
.ms-day.today { border-color: #2563eb; background: #f7fbff; }
.ms-num { display: block; font-size: 11.5px; color: #64748b; }
.ms-day.we .ms-num { color: #ef4444; }
.ms-shift {
  display: block; margin-top: 3px; padding: 3px 0; border: 1px solid transparent;
  border-radius: 4px; text-align: center; font-size: 12.5px; font-weight: 700;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ms-none { display: block; margin-top: 3px; text-align: center; font-size: 11px; color: #cbd5e1; }
/* 我的排班：最近 7 天 */
/* 员工端：「今日打卡」（左）与「我的排班（本月）」（右）并排一行 */
/* 个人总览：模块可拖动排序 */
/* 个人总览·考勤排班：打卡块长得跟统计块一样，5 块排一行 */
.mod-row .stats .stat-form { flex: 1 1 auto; min-width: 140px; display: flex; }
.stat-punch {
  flex: 1 1 auto; width: 100%; margin: 0; align-items: center; justify-content: center;
  text-align: center; font: inherit; cursor: pointer; border-radius: 8px;
}
.stat-punch .num { display: block; }
.stat-punch .pb-now { display: flex; flex-direction: column; align-items: center; gap: 2px; }
.stat-punch .pb-hover { display: none; font-size: 16px; font-weight: 700; }
/* 没打卡：实心绿 / 实心橙，跟考勤页的打卡按钮一个色，够显眼 */
.stat-punch.p-in { background: #16a34a; border-color: #16a34a; }
.stat-punch.p-in .num, .stat-punch.p-in .lbl { color: #fff; }
.stat-punch.p-in:hover { background: #15803d; border-color: #15803d; }
.stat-punch.p-out { background: #ea580c; border-color: #ea580c; }
.stat-punch.p-out .num, .stat-punch.p-out .lbl { color: #fff; }
.stat-punch.p-out:hover { background: #c2410c; border-color: #c2410c; }
.stat-punch.p-done { border-color: #cbd5e1; background: #f1f5f9; }
.stat-punch.p-done .num { color: #64748b; }
.stat-punch.p-done .lbl { color: #94a3b8; }
.stat-punch.p-done.pb-locked { cursor: default; }
.stat-punch.p-done:not(.pb-locked):hover { border-color: #93c5fd; background: #eff6ff; }
.stat-punch.p-done:not(.pb-locked):hover .pb-now { display: none; }
.stat-punch.p-done:not(.pb-locked):hover .pb-hover { display: block; color: #1d4ed8; }
.sort-block { position: relative; }
.sort-block.dragging { opacity: .55; }
.sort-bar { display: flex; justify-content: flex-end; margin: 0 4px -6px; }
.sort-handle {
  display: inline-flex; align-items: center; gap: 4px; padding: 2px 10px;
  border: 1px dashed #cbd5e1; border-radius: 999px; background: #f8fafc;
  color: #94a3b8; font-size: 12px; cursor: grab; user-select: none; touch-action: none;
}
.sort-handle:hover { color: #2563eb; border-color: #93c5fd; background: #eff6ff; }
.sort-block.dragging .sort-handle { cursor: grabbing; }
.att-row2 { display: flex; gap: 16px; align-items: stretch; margin-bottom: 18px; }
.att-row2 > .card { margin-bottom: 0; min-width: 0; }
.att-row2 > .att-punch-card { flex: 1.45 1 0; }        /* 今日打卡占大块 */
.att-row2 > .att-month-card { flex: 1 1 0; }           /* 我的排班占小块 */
@media (max-width: 780px) {
  .att-row2 { display: block; }
  .att-row2 > .card { margin-bottom: 18px; max-width: none; }
}
/* 今日打卡：面积大、按钮醒目 */
.att-punch-card { padding: 20px 22px 22px; }
.att-punch-card .punch-shift { padding: 8px 14px; font-size: 15px; }
.att-punch-card .punch-shift b { font-size: 22px; letter-spacing: 2px; }
.att-punch-card .punch-line { margin-bottom: 16px; }
.att-punch-card .punch-btns { gap: 18px; }
.att-punch-card .punch-main { display: flex; align-items: center; gap: 22px; }
.att-punch-card .punch-main .punch-btns { flex: none; }
/* 打卡按钮右侧的提醒 */
.punch-tip {
  flex: 1 1 auto; min-width: 220px; padding: 18px 20px; border-radius: 10px;
  font-size: 17px; font-weight: 600; line-height: 1.65;
}
.punch-tip.tip-info { background: #eff6ff; border: 1px solid #bfdbfe; color: #1d4ed8; }
.punch-tip.tip-warn { background: #fef2f2; border: 1px solid #fecaca; color: #b91c1c; }
.punch-tip.tip-done { background: #f0fdf4; border: 1px solid #bbf7d0; color: #15803d; }
@media (max-width: 1000px) {
  .att-punch-card .punch-main { flex-direction: column; align-items: stretch; }
}
.att-punch-card .punch-form .btn-primary {
  /* 正方形按钮：宽 150 不变，高度拉到 150；文字上下两行 */
  width: 150px; min-width: 150px; height: 150px; padding: 0;
  display: inline-flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 6px; line-height: 1.1; font-size: 34px; font-weight: 700; letter-spacing: 0;
  border-radius: 12px;
}
.att-punch-card .punch-form .btn-primary .pb-l1,
.att-punch-card .punch-form .btn-primary .pb-l2 { display: block; font-size: 34px; }
.att-punch-card .punch-form .btn-primary .pb-l3 { display: block; margin-top: 4px; font-size: 15px; font-weight: 600; }
.att-punch-card .punch-form .btn-primary .pb-sm { font-size: 22px; letter-spacing: 0; }
/* 已打卡：按钮不消失，变灰并显示"上班已打卡 / 下班已打卡" */
.att-punch-card .punch-form .btn-primary.pb-done {
  background: #e2e8f0; border-color: #cbd5e1; color: #94a3b8; cursor: pointer;
}
.att-punch-card .punch-form .btn-primary .pb-now { display: block; }
.att-punch-card .punch-form .btn-primary .pb-hover { display: none; font-size: 26px; font-weight: 700; }
/* 鼠标移上去：变蓝、文字提示"重新打卡"，点一下就能重新打（上班卡已锁定，不参与） */
.att-punch-card .punch-form .btn-primary.pb-done:not(.pb-locked):hover {
  background: #dbeafe; border-color: #93c5fd; color: #1d4ed8;
}
.att-punch-card .punch-form .btn-primary.pb-done:not(.pb-locked):hover .pb-now { display: none; }
.att-punch-card .punch-form .btn-primary.pb-done:not(.pb-locked):hover .pb-hover { display: block; }
/* 上班卡打完：灰块锁定，鼠标移上去也不变、点不动 */
.att-punch-card .punch-form .btn-primary.pb-locked { cursor: default; }
.att-punch-card .punch-form .btn-primary.pb-locked:hover {
  background: #e2e8f0; border-color: #cbd5e1; color: #94a3b8;
}
.att-punch-card .punch-form { flex-direction: column; gap: 8px; }
.att-punch-card .punch-ok { font-size: 15px; font-weight: 600; }
.att-punch-card .punch-form .linklike { font-size: 13.5px; }
/* 上班打卡（绿）/ 下班打卡（橙）两个按钮区分开 */
.att-punch-card .p-in .btn-primary { background: #16a34a; border-color: #16a34a; }
.att-punch-card .p-in .btn-primary:hover { background: #15803d; border-color: #15803d; }
.att-punch-card .p-in .punch-ok { color: #15803d; }
.att-punch-card .p-in .linklike { color: #15803d; }
.att-punch-card .p-out .btn-primary { background: #ea580c; border-color: #ea580c; }
.att-punch-card .p-out .btn-primary:hover { background: #c2410c; border-color: #c2410c; }
.att-punch-card .p-out .punch-ok { color: #c2410c; }
.att-punch-card .p-out .linklike { color: #c2410c; }
/* 今日打卡卡片里的「本月我的考勤」统计 */
.pstat-head {
  margin: 18px 0 10px; padding-top: 14px; border-top: 1px dashed #e2e8f0;
  font-size: 13px; font-weight: 600; color: #475569;
}
.pstat-row { display: flex; flex-wrap: wrap; gap: 8px; }
.pstat {
  display: inline-flex; align-items: center; padding: 6px 12px; border-radius: 999px;
  border: 1px solid #e2e8f0; background: #f8fafc; font-size: 13px; font-weight: 500;
  color: #334155; white-space: nowrap;
}
.pstat b { margin-right: 5px; font-weight: 700; }
.pstat.pstat-off, .pstat.pstat-late, .pstat.pstat-miss {
  background: #fee2e2; border-color: #fca5a5; color: #b91c1c;
}
.pstat.pstat-leave { background: #fef3c7; border-color: #fcd34d; color: #92400e; }
.pstat.sc-morning { background: #dbeafe; border-color: #93c5fd; color: #1e40af; }
.pstat.sc-mid { background: #dcfce7; border-color: #86efac; color: #166534; }
.pstat.sc-night { background: #ede9fe; border-color: #c4b5fd; color: #5b21b6; }
.pstat.sc-allday { background: #cffafe; border-color: #67e8f9; color: #155e75; }
.pstat.sc-leave { background: #fef3c7; border-color: #fcd34d; color: #92400e; }
.pstat.sc-other0 { background: #ffe4e6; border-color: #fda4af; color: #9f1239; }
.pstat.sc-other1 { background: #ffedd5; border-color: #fdba74; color: #9a3412; }
.pstat.sc-other2 { background: #ecfccb; border-color: #bef264; color: #3f6212; }
.pstat.sc-other3 { background: #e0e7ff; border-color: #a5b4fc; color: #3730a3; }
.pstat.sc-other4 { background: #fae8ff; border-color: #f0abfc; color: #86198f; }
/* 我的排班（本月）：低调一些 */
.att-month-card { padding: 12px 14px 14px; }
.att-month-card h2 { font-size: 14px; color: #475569; }
.att-month-card .my-me { font-size: 11.5px; margin-left: 6px; }
.att-month-card .ms-head { gap: 4px; margin-bottom: 4px; }
.att-month-card .ms-head span { font-size: 12.5px; font-weight: 600; color: #475569; }
.att-month-card .ms-head span.we { color: #ef4444; font-weight: 700; }   /* 六、日 标红 */
.att-month-card .ms-grid { gap: 4px; }
.att-month-card .ms-day { min-height: 48px; padding: 3px 4px; }
.att-month-card .ms-num { font-size: 12.5px; font-weight: 700; color: #334155; }
.att-month-card .ms-shift { margin-top: 2px; padding: 2px 0; font-size: 11px; font-weight: 600; }
.att-month-card .ms-none { margin-top: 2px; font-size: 10.5px; }
.my-me { margin-left: 8px; font-size: 12.5px; font-weight: 400; color: #64748b; }
.my-week { display: flex; gap: 8px; flex-wrap: wrap; }
.my-day {
  flex: 1 1 92px; min-width: 92px; padding: 8px 6px; text-align: center;
  border: 1px solid #e2e8f0; border-radius: 8px; background: #fff;
}
.my-day.today { border-color: #2563eb; background: #f7fbff; }
.my-day.my-weekend .my-day-top { color: #ef4444; }
.my-day-top { font-size: 13.5px; font-weight: 600; color: #334155; }
.my-day-top small { display: block; font-size: 12px; color: #64748b; font-weight: 500; }
.my-day.my-weekend .my-day-top small { color: #f87171; }
.my-shift {
  display: block; margin: 7px 0 4px; padding: 6px 4px; border: 1px solid transparent;
  border-radius: 4px; font-size: 15px; font-weight: 700; letter-spacing: 1px;
  overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
  background: #f1f5f9; color: #475569; border-color: #e2e8f0;
}
.my-time { min-height: 15px; font-size: 12.5px; font-weight: 500; color: #475569; }
/* 考勤：打卡 / 出勤汇总 / 申请与审批 */
/* 考勤页顶部（标题 + 月份/员工/部门筛选 + 班次时间）：往下滚时锁定在最上方
   手机（窄屏）打开时不锁，避免挡住内容 */
.att-lock {
  /* 顶栏（.sticky-top）是 sticky 的，这里要贴在它下沿；实际数值由页面脚本按顶栏高度设置 */
  position: sticky; top: 92px; z-index: 40;
  background: #f4f6f9; padding: 8px 0 4px; margin: 0 0 6px;
  border-bottom: 1px solid #e6ecf2;
  box-shadow: 0 8px 12px -12px rgba(20, 50, 74, .55);
}
.att-lock .pagehead { margin: 0 0 10px; }
.att-lock .toolbar { margin-bottom: 6px; }
.att-lock .att-shift-times { margin: 0; }
/* 跟系统其它吸顶区一致：窄屏（顶栏本身也不吸顶了）和手机上就不锁，避免上方空一截 */
@media (max-width: 820px), (pointer: coarse) {
  .att-lock { position: static; box-shadow: none; border-bottom: none; padding: 0; margin: 0; }
}
html.is-phone .att-lock { position: static; box-shadow: none; border-bottom: none; padding: 0; margin: 0; }
/* 窗口较窄时（比如嵌在侧边栏里）筛选栏允许换行，避免横向溢出 */
@media (max-width: 880px) {
  .toolbar.attfilter { flex-wrap: wrap; }
  .toolbar.attfilter input[type="month"] { width: 150px; }
  .toolbar.attfilter select { width: 160px; }
}
.punch-line { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 0 0 12px; }
.punch-shift {
  display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 6px;
  border: 1px solid transparent; font-size: 13px;
}
.punch-shift b { font-size: 15px; font-weight: 700; letter-spacing: 1px; }
.punch-btns { display: flex; gap: 14px; flex-wrap: wrap; align-items: center; }
.punch-form { display: inline-flex; align-items: center; gap: 8px; }
.punch-ok { font-size: 13px; color: #16a34a; }
.sum-today { font-size: 13.5px; color: #24303a; }
.sum-grid { display: flex; gap: 10px; flex-wrap: wrap; }
.sum-tile {
  flex: 1 1 132px; min-width: 132px; padding: 10px 12px;
  border: 1px solid #e2e8f0; border-radius: 8px; background: #f8fafc;
}
.sum-tile b { display: block; font-size: 20px; color: #2563eb; }
.sum-tile span { font-size: 12px; color: #64748b; }
.att-st { font-size: 12.5px; }
.st-ok { color: #16a34a; }
.st-late { color: #dc2626; }
.st-abs { color: #b91c1c; font-weight: 600; }
.st-leave { color: #d97706; }
.st-wait { color: #2563eb; font-weight: 600; }
.row-wait { background: #fffdf5; }
/* 打卡来源 IP / 核实 */
.att-ip { font-size: 12px; color: #94a3b8; font-family: Consolas, Menlo, monospace; }
.tbl td.att-src { white-space: nowrap; font-size: 12.5px; }
/* 重新打卡过：把上一次的打卡时间标在小字里（考勤按后一次算） */
.tbl span.att-prev { display: block; font-size: 11.5px; color: #94a3b8; margin-top: 2px; }
.att-side { display: flex; align-items: center; gap: 5px; line-height: 1.7; }
.att-side b { color: #64748b; font-weight: 500; }
.att-side + .att-side { margin-top: 2px; }
/* 不在公司网络时的打卡提醒（放打卡卡片标题右边，最多两行） */
.att-punch-card > h2 { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.att-punch-card > h2 .punch-title { flex: 0 1 auto; }
.punch-warn-inline {
  flex: 0 1 52%; max-width: 52%; text-align: right; font-size: 12.5px; font-weight: 400;
  color: #b91c1c; line-height: 1.5;
}
.home-warn { margin: 6px 0 0; font-size: 12.5px; color: #b91c1c; line-height: 1.5; }
.toolbar.attapply { flex-wrap: wrap; justify-content: flex-start; gap: 8px; }
.toolbar.attapply label.pg { margin: 0; white-space: nowrap; }
.toolbar.attapply input[type="date"], .toolbar.attapply input[type="time"],
.toolbar.attapply select { width: auto; }
.toolbar.attapply input[type="text"] { width: 280px; }
.cal-tbl .cal-btn.cal-empty { color: #cbd5e1; }
.cal-tbl td.cal-cell:hover .cal-btn { border-color: #93c5fd; background: #f0f7ff; }
/* 批量框选时：底色统一加深 + 蓝色实线框，选中的格子一眼能看出来 */
.cal-tbl td.cal-on { background: #e8f0fe; }
.cal-tbl td.cal-on .cal-btn {
  border-color: #1d4ed8;
  box-shadow: inset 0 0 0 100px rgba(30, 64, 175, .32);
  outline: 2px solid #1d4ed8; outline-offset: -2px;
}
/* 员工端的只读排班表：不能点选、没有悬停提示 */
.cal-tbl.cal-ro .cal-cell { cursor: default; }
.cal-tbl.cal-ro td.cal-cell:hover .cal-btn { border-color: #e2e8f0; background: #fff; }
.cal-menu {
  position: fixed; z-index: 9999; background: #fff; border: 1px solid #cbd5e1; border-radius: 8px;
  box-shadow: 0 10px 24px -8px rgba(20, 50, 74, .35); padding: 8px 10px; width: 210px;
}
.cal-menu b { display: block; font-size: 12px; color: #475569; margin-bottom: 6px; }
.cal-menu button {
  margin: 2px 3px 2px 0; padding: 3px 9px; font-size: 12.5px; font-family: inherit;
  border: 1px solid #e2e8f0; border-radius: 5px; background: #fff; cursor: pointer;
}
.cal-menu button:hover { border-color: #93c5fd; background: #f0f7ff; }
.cal-menu button.cal-clear { color: #b91c1c; border-color: #fecaca; }
.tbl-aft td.cell-lostflag select.lf-sel {
  /* 绝对定位：展开时不会撑高表格行，页面不会抖 */
  position: absolute; left: 0; top: 100%; z-index: 60;
  width: 100%; min-width: 104px; padding: 2px 4px; font-size: 12.5px;
  border: 1px solid #2563eb; border-radius: 4px; background: #fff;
  box-shadow: 0 8px 18px -6px rgba(20, 50, 74, .35);
}
/* 售后管理：三个页签跟在标题后面，高度跟标题一样 */
.pagehead.aft-head { justify-content: flex-start; gap: 18px; }
.aft-head h1 { margin: 0; }
.aft-tabs { display: inline-flex; align-items: center; gap: 8px; }
.aft-tabs .btn-mini-btn { padding: 5px 16px; font-size: 14px; line-height: 21px; }
/* 页签后面的三个汇总数字：跟标题行同高，数字加粗 */
.aft-head .aft-stats {
  display: inline-flex; align-items: center; gap: 18px; flex-wrap: wrap;
  color: #475569; font-size: 13.5px;
}
.aft-head .aft-stats span { display: inline-flex; align-items: center; gap: 4px; }
.aft-head .aft-stats b { color: #14324a; font-size: 16px; font-weight: 700; }
/* 补发登记表单：上排 7 项按比例给宽度（平台 0.5 倍、订单编号 1.5 倍、其他 1 倍） */
.grid.aft-form1 { grid-template-columns: 1fr 1fr 0.5fr 1fr 1.5fr 1fr 1fr; gap: 12px 10px; }
/* 下排：补发产品 2 格宽、其他备注 2 格宽、保存/取消 1 格，跟上一排的列对齐 */
.grid.aft-form2 { grid-template-columns: repeat(7, 1fr); gap: 12px 10px; }
.grid.aft-form2 > .span2 { grid-column: span 2; }
.grid.aft-form2 > .span4 { grid-column: span 4; }
.grid.aft-form2 > .span3 { grid-column: span 3; }
.grid.aft-form2 > .span4 { grid-column: span 4; }
/* 丢件登记表单：上排 7 项等宽（字段都比较短），下排跟补发一样 */
/* 丢件登记上排：平台 0.5 倍宽、订单编号 1.5 倍宽，其余等宽（合计仍是 7 格） */
.grid.aft-form-lost { grid-template-columns: 1fr 1fr 1fr 1fr 0.5fr 1fr 1.5fr; gap: 12px 10px; }
/* 系统自动填的字段（发起人/发起时间/登记人/登记时间）：锁死、不可编辑的样子 */
.grid input.auto-filled {
  background: #f1f5f9; color: #64748b; border-style: solid; border-color: #e2e8f0;
  cursor: not-allowed;
}
.grid input.auto-filled:focus {
  outline: none; box-shadow: none; border-color: #e2e8f0; background: #f1f5f9;
}
@media (max-width: 1200px) { .grid.aft-form-lost { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 900px) { .grid.aft-form-lost { grid-template-columns: repeat(2, 1fr); } }
.grid.aft-form2 > .aft-form-btns { display: flex; align-items: flex-end; gap: 8px; }
@media (max-width: 1200px) {
  .grid.aft-form1 { grid-template-columns: repeat(4, 1fr); }
  .grid.aft-form2 { grid-template-columns: repeat(4, 1fr); }
}
@media (max-width: 900px) {
  .grid.aft-form1, .grid.aft-form2 { grid-template-columns: repeat(2, 1fr); }
}
.toolbar .inline.reqfilter input[type="date"] { width: 132px; padding: 4px 6px; }
.toolbar .inline.reqfilter input[type="number"] { width: 90px; padding: 4px 6px; }
.msel { position: relative; display: inline-block; }
.msel-trigger {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  justify-content: flex-start;
  max-width: 230px;
  padding: 5px 8px;
  background: #fff;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  color: #24303a;
  font-size: 13px;
  line-height: 1.35;
  cursor: pointer;
  text-align: left;
}
.msel-trigger:hover { border-color: #94a3b8; }
.msel-text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 176px;
}
.msel-arrow { color: #64748b; font-size: 12px; }
.msel-menu {
  display: none;
  position: absolute;
  left: 0;
  top: calc(100% + 4px);
  z-index: 220;
  min-width: 170px;
  max-width: 290px;
  width: max-content;
  padding: 4px;
  background: #fff;
  border: 1px solid #cbd5e1;
  border-radius: 8px;
  box-shadow: 0 10px 26px rgba(15, 23, 42, .16);
  text-align: left;
}
.msel.open .msel-menu { display: block; }
.msel-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 4px 6px 6px;
  border-bottom: 1px solid #eef2f7;
  margin-bottom: 2px;
}
.msel-hint { color: #7c8b9c; font-size: 12px; }
.msel-clear {
  border: none;
  background: #eff6ff;
  color: #2563eb;
  border-radius: 5px;
  padding: 2px 8px;
  font-size: 12px;
  cursor: pointer;
}
.msel-clear:hover { background: #dbeafe; }
.msel-opt {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 6px;
  margin: 0;
  padding: 5px 7px;
  border-radius: 5px;
  cursor: pointer;
  font-size: 13px;
  color: #24303a;
  white-space: nowrap;
}
.msel-opt:hover { background: #f1f5f9; }
.msel-opt input {
  flex: 0 0 auto;
  width: 14px;
  height: 14px;
  margin: 0;
  accent-color: #2563eb;
  cursor: pointer;
}
.msel-opt span { text-align: left; }

.colsw {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px 6px;
  margin: -6px 0 12px;
  padding: 7px 10px;
  background: #eef4fb;
  border: 1px solid #d8e4f2;
  border-radius: 8px;
}
.colsw .cs-label {
  color: #274d6d;
  font-weight: 700;
  margin-right: 4px;
  white-space: nowrap;
}
.colck-l {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin: 0;
  padding: 2px 8px;
  background: #fff;
  border: 1px solid #cbdbea;
  border-radius: 6px;
  font-size: 13px;
  color: #24303a;
  cursor: pointer;
  white-space: nowrap;
}
.colck-l input { margin: 0; accent-color: #2563eb; cursor: pointer; }
.colck-l input:not(:checked) { opacity: .45; }
.colsw .btn-group {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-left: auto;
  white-space: nowrap;
}
#reqTableCard.colhide-amount .col-amount,
#reqTableCard.colhide-settle .col-settle,
#reqTableCard.colhide-invoice_type .col-invoice_type,
#reqTableCard.colhide-invoice_progress .col-invoice_progress,
#reqTableCard.colhide-supplier .col-supplier {
  display: none;
}
.btn-mini-btn {
  border: 1px solid #2563eb;
  background: #2563eb;
  color: #fff;
  border-radius: 6px;
  padding: 3px 12px;
  font-size: 13px;
  cursor: pointer;
  font-family: inherit;
  white-space: nowrap;
}
.btn-mini-btn:hover { background: #1d4ed8; }
.btn-mini-btn.btn-mini-off { border-color: #94a3b8; background: #fff; color: #475569; }
.btn-mini-btn.btn-mini-off:hover { background: #f1f5f9; color: #24303a; }
/* 快捷时间按钮：已选中（再点一下取消） */
.btn-mini-btn.btn-mini-on { background: #dbeafe; border-color: #60a5fa; color: #1d4ed8; font-weight: 600; }
.btn-mini-btn.btn-mini-on:hover { background: #bfdbfe; color: #1d4ed8; }

.grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px 16px; }
.grid.wide { grid-template-columns: 1fr; }
.form-inline-2 { display: flex; align-items: flex-end; gap: 12px; margin-top: 12px; }
.form-inline-2 .grow { flex: 1 1 220px; min-width: 0; max-width: 360px; }
.form-inline-2 .submit-cell { flex: 0 0 auto; }
.mini-sum { display: flex; gap: 8px; margin-left: auto; flex: 0 0 auto; }
.mini-sum .box {
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 4px 12px;
  min-width: 104px;
  text-align: center;
}
.mini-sum .box .k { font-size: 11px; color: #64748b; line-height: 1.4; }
.mini-sum .box .v { font-size: 15px; font-weight: 700; color: #14324a; line-height: 1.4; }
.mini-sum .box .v.danger { color: #dc2626; }
.grid.five { grid-template-columns: repeat(5, 1fr); }
.grid.six { grid-template-columns: repeat(6, 1fr); }
@media (max-width: 1200px) { .grid.six { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 1100px) { .grid.five { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 900px) { .grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .grid { grid-template-columns: 1fr; } }
.grid.seven { grid-template-columns: repeat(7, 1fr); }
.grid.three { grid-template-columns: repeat(3, 1fr); }
.grid.two { grid-template-columns: repeat(2, 1fr); }
@media (max-width: 900px) { .grid.two { grid-template-columns: 1fr; } }
/* 人事档案表单：14 格栅格，第二行按第一行的列对齐（身份证跨"性别+学历"，银行卡对齐"部门"） */
.grid.hr-grid { grid-template-columns: repeat(14, minmax(0, 1fr)); }
.hr-sp2 { grid-column: span 2; }
.hr-sp3 { grid-column: span 3; }
.hr-sp4 { grid-column: span 4; }
.grid.hr-grid > div { min-width: 0; }
.grid.hr-grid label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.grid.hr-grid input[type="file"] { width: 100%; font-size: 12.5px; }
@media (max-width: 1200px) {
  .grid.hr-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .hr-sp2, .hr-sp3, .hr-sp4 { grid-column: span 1; }
}
@media (max-width: 900px) { .grid.hr-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.file-hint { font-size: 12px; line-height: 1.5; padding-top: 2px; margin: 2px 0 10px; }
/* 人事档案列表：入职日期下面的工龄、身份证下面的生日倒计时 */
.tbl .hr-sub { font-size: 11px; color: #dc2626; line-height: 1.45; margin-top: 2px; }
/* 人事档案：离职登记的就地展开表单 */
.leave-editor { display: none; margin-top: 6px; padding: 8px; border: 1px solid #e2e8f0;
  border-radius: 6px; background: #f8fafc; width: 260px; text-align: left; }
.leave-editor label { font-size: 12px; color: #4a5b6b; display: block; margin-bottom: 2px; }
.leave-editor input { width: 100%; box-sizing: border-box; padding: 4px 6px; font-size: 12.5px; }
.leave-editor > form > div { margin-bottom: 6px; }
.leave-actions { display: flex; gap: 6px; }
/* 薪资福利：我的工资条 */
.me-card .me-box { display: flex; flex-wrap: wrap; gap: 16px; align-items: flex-start; }
.me-card .me-left { flex: 1 1 320px; min-width: 0; max-width: 520px; }
.me-card .me-title { font-weight: 600; color: #14324a; margin-bottom: 6px; }
.me-card .me-right { flex: 0 0 auto; min-width: 200px; }
.tbl.tbl-compose th, .tbl.tbl-compose td { padding: 5px 10px; }
.tbl.tbl-compose td:first-child { color: #64748b; width: 96px; }
.tbl.tbl-compose tr.me-total td { background: #f1f5f9; font-weight: 700; }
.tbl.tbl-compose td.me-net { color: #dc2626; font-weight: 700; font-size: 15px; }
/* 员工工资条：核对无误 / 有异议 */
.me-obj { margin-top: 6px; padding: 6px 9px; border: 1px solid #fed7aa;
  background: #fff7ed; border-radius: 6px; color: #b45309; font-size: 13px; }
/* 员工工资条：管理人员的回复 */
.me-reply { margin-top: 6px; padding: 6px 9px; border: 1px solid #bfdbfe;
  background: #eff6ff; border-radius: 6px; color: #1e40af; font-size: 13px; }
/* 员工工资条：异议 / 回复的完整对答记录 */
.me-chat { margin-top: 8px; }
.me-chat-h { font-size: 12.5px; color: #64748b; margin-bottom: 4px; }
/* 员工工资条：一张总表（行＝月份，列＝项目） */
.paytable { table-layout: auto; min-width: 720px; }
.paytable th, .paytable td { padding: 6px 9px; white-space: nowrap; vertical-align: middle; }
.paytable th.num, .paytable td.num { text-align: right; }
.paytable td.pay-gross { font-weight: 600; color: #14324a; }
.paytable td.pay-net { font-weight: 700; color: #dc2626; }
.paytable .opcell { text-align: left; }
.paytable .oprow { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.paytable .objform { display: flex; gap: 5px; align-items: center; margin: 0; }
.paytable .objin { width: 150px; height: 27px; font-size: 12.5px; }
.paytable .btn, .paytable .btn-primary { white-space: nowrap; }
.paytable .me-confirmed { margin: 0; white-space: nowrap; }
/* 员工工资条里的「备注」列：文字要能换行显示 */
.paytable td.pncell { text-align: left; white-space: normal; word-break: break-word;
  max-width: 240px; min-width: 120px; font-size: 12.5px; color: #33475b; line-height: 1.55; }
.paytable .chat-hist { margin-top: 0; border-top: none; padding-top: 0; min-width: 260px; }
/* 对答记录（员工端、管理端共用） */
.chat { max-height: 190px; overflow: auto; }
.chat-i { border-radius: 6px; padding: 5px 8px; margin-bottom: 4px; font-size: 12.5px;
  line-height: 1.55; }
.chat-i .chat-h { font-size: 12px; font-weight: 600; margin-bottom: 1px; }
.chat-i .chat-h .muted { margin-left: 6px; font-weight: 400; }
.chat-i .chat-t { white-space: pre-wrap; word-break: break-word; }
.chat-emp { background: #fff7ed; border: 1px solid #fed7aa; color: #9a3412; }
.chat-mgr { background: #eff6ff; border: 1px solid #bfdbfe; color: #1e40af; }
.tpcell { min-width: 260px; }
/* 管理端：处理完的异议收在折叠的「历史记录」里 */
.chat-hist { margin-top: 8px; border-top: 1px dashed #e6ebf1; padding-top: 7px; }
.chat-hist > summary { cursor: pointer; font-size: 12.5px; color: #64748b; outline: none; }
.chat-hist > summary:hover { color: #2563eb; }
.hist-i { margin-top: 8px; }
.hist-h { font-size: 12.5px; color: #33475b; margin-bottom: 4px; display: flex;
  align-items: center; gap: 7px; flex-wrap: wrap; }
/* 管理端「员工核对 / 异议」里的回复、异议已处理 */
.rpcell { min-width: 300px; }
/* 回复输入框 + 回复 + 异议已处理 排成一行 */
.rprow { display: flex; gap: 6px; align-items: center; flex-wrap: nowrap; }
.rpform { display: flex; gap: 6px; align-items: center; flex: 1 1 auto; min-width: 0; }
.rpin { flex: 1 1 auto; min-width: 120px; height: 28px; font-size: 12.5px; }
.rpdone { margin: 0; flex: 0 0 auto; }
.rpdone .btn { white-space: nowrap; }
.rprow .btn { white-space: nowrap; }
.rp-saved { font-size: 12.5px; color: #1e40af; background: #eff6ff;
  border: 1px solid #bfdbfe; border-radius: 6px; padding: 4px 7px; margin-bottom: 5px;
  white-space: pre-wrap; }
.objform { display: flex; gap: 6px; align-items: center; margin-top: 8px; flex-wrap: wrap; }
.objform .objin { width: 230px; padding: 5px 8px; font-size: 12.5px; }
/* 全员表右下角的「工资推送 / 撤回推送」 */
.allfoot { display: flex; align-items: center; gap: 10px; margin-top: 6px; flex-wrap: wrap; }
.allfoot .allfoot-btns { margin-left: auto; display: flex; gap: 8px; }
/* 全员表右上角的「工资合计 / 人均」 */
.allsum { margin-left: auto; white-space: nowrap; background: #f8fafc;
  border: 1px solid #eef2f7; border-radius: 8px; padding: 4px 11px;
  font-size: 12.5px; color: #64748b; }
.allsum b { color: #14324a; font-size: 14.5px; }
.allsum .allsum-n { color: #94a3b8; font-size: 12px; }
/* 全员表按钮下面：员工那边的「可见时间」设置 */
.keeprow { display: flex; align-items: center; gap: 10px; flex-wrap: nowrap;
  margin-top: 8px; padding-top: 8px;
  border-top: 1px dashed #e6ebf1; font-size: 12.5px; }
/* 说明文字占左边剩下的地方，写不下就折成两行，跟右边控件上下居中 */
.keeprow > .muted { flex: 1 1 auto; min-width: 0; text-align: left; line-height: 1.6; }
/* 下拉框不许被挤窄：宽度固定，文字才不会被切掉 */
.keepform { display: flex; align-items: center; gap: 8px; margin: 0;
  flex: 0 0 auto; flex-wrap: nowrap; margin-left: auto; }
.keepform span { display: inline-flex; align-items: center; gap: 4px; color: #475569;
  white-space: nowrap; flex: 0 0 auto; }
/* 注意：全站 select 自带 padding 8px，这里要把它改小，否则文字会被上下切掉 */
.keepform select { width: 96px; height: 30px; padding: 0 6px; font-size: 12.5px;
  line-height: 28px; box-sizing: border-box; flex: 0 0 auto; }
.keepform .keepnum { width: 62px; height: 30px; padding: 0 6px; font-size: 12.5px;
  text-align: center; box-sizing: border-box; flex: 0 0 auto; }
/* 绩效 / 项目推送：发布表单 */
/* 信息设置：按菜单分组的小标题 + 顶部跳转 */
.attline { display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  margin: 5px 0; font-size: 12.5px; color: #33475b; }
.attnum { width: 58px; height: 26px; padding: 0 6px; font-size: 12.5px;
  text-align: center; box-sizing: border-box; flex: 0 0 auto; }
.attfrom { display: inline-block; min-width: 96px; color: #64748b; }
/* 这里的按钮要盖住全站 .btn 的 padding:8px 16px，否则字会压到边框上 */
.attline .btn { display: inline-flex; align-items: center; justify-content: center;
  height: 26px; padding: 0 10px; font-size: 12.5px; line-height: 1; box-sizing: border-box;
  flex: 0 0 auto; }
.attline .attdel { color: #b91c1c; border-color: #fecaca; background: #fff5f5; }
.attline .attdel:hover { border-color: #fca5a5; background: #fee2e2; }
.setnav { display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  background: #f8fafc; border: 1px solid #eef2f7; border-radius: 8px;
  padding: 7px 12px; margin: 0 0 12px; font-size: 12.5px; color: #64748b; }
.setnav a { color: #2563eb; text-decoration: none; }
.setnav a:hover { text-decoration: underline; }
.setgroup { margin: 18px 0 8px; padding-left: 9px; border-left: 4px solid #2563eb;
  font-size: 15px; font-weight: 700; color: #14324a; line-height: 1.5;
  scroll-margin-top: 70px; }
.setgroup .muted { font-weight: 400; font-size: 12.5px; margin-left: 7px; }
.ppform { margin: 0; }
/* 发布表单：一行一行对齐，同一行的控件一样高、上下居中对齐 */
.pprow { display: flex; align-items: center; gap: 8px; margin-bottom: 10px;
  flex-wrap: wrap; }
.pprow.pprow-top { align-items: flex-start; }
.pprow.pprow-hint { margin: -4px 0 10px; align-items: flex-start; }
.pprow > label { flex: 0 0 88px; color: #4a5b6b; font-size: 13px; line-height: 1.4; }
.ppform input[type="text"], .ppform input[type="number"], .ppform input[type="date"],
.ppform select { height: 30px; padding: 0 8px; font-size: 13px; box-sizing: border-box;
  border: 1px solid #d8dde6; border-radius: 6px; background: #fff; color: #24303a;
  font-family: inherit; }
.ppform input[type="text"] { flex: 1 1 auto; max-width: 420px; }
.ppform input[type="number"] { width: 76px; }
.ppform input[type="date"] { width: 148px; }
/* 「快选天数」：一个框，能选也能填 */
.ppdue-wrap { position: relative; display: inline-flex; align-items: center;
  flex: 0 0 auto; }
.ppform input.ppdue { flex: 0 0 auto; width: 108px; padding-right: 20px;
  background: #f8fafc; color: #1d4ed8; }
.ppdue-arw { position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
  font-size: 11px; color: #94a3b8; cursor: pointer; user-select: none; }
.ppdue-pop { position: absolute; z-index: 46; top: 34px; left: 0; width: 226px;
  max-height: 232px; overflow: auto; background: #fff; border: 1px solid #e6ebf1;
  border-radius: 8px; box-shadow: 0 8px 22px rgba(20, 50, 74, .16); padding: 6px;
  display: flex; flex-wrap: wrap; gap: 4px; }
.ppdue-pop[hidden] { display: none; }
.ppdue-pop a { flex: 0 0 auto; padding: 3px 8px; border-radius: 6px; font-size: 12.5px;
  color: #33475b; text-decoration: none; background: #f8fafc;
  border: 1px solid #eef2f7; }
.ppdue-pop a:hover { background: #eff6ff; border-color: #93c5fd; color: #1d4ed8; }
.ppform select { width: auto; min-width: 140px; max-width: 220px; }
.ppform textarea { flex: 1 1 auto; max-width: 720px; font-size: 13px; line-height: 1.6;
  padding: 6px 8px; border: 1px solid #d8dde6; border-radius: 6px; font-family: inherit; }
.ppinlbl { color: #4a5b6b; font-size: 13px; white-space: nowrap; }
.pphint-t { color: #94a3b8; font-size: 12px; line-height: 1.55; max-width: 900px; }
.pprbox { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; }
.ppr { display: inline-flex; align-items: center; gap: 5px; font-size: 13px; color: #33475b;
  white-space: nowrap; cursor: pointer; }
.ppr input { margin: 0; flex: 0 0 auto; }
.ppbox { flex: 1 1 auto; max-width: 900px; max-height: 210px; overflow: auto;
  border: 1px solid #e6ebf1; border-radius: 8px; background: #fbfcfe; padding: 8px 10px; }
.ppdept { margin-bottom: 8px; }
.ppdh { font-size: 12.5px; color: #64748b; margin-bottom: 5px; display: flex;
  align-items: center; gap: 8px; }
.ppdh .muted { font-size: 11.5px; }
.ppall { font-size: 12px; color: #2563eb; text-decoration: none; }
.ppall:hover { text-decoration: underline; }
.ppg { display: flex; flex-wrap: wrap; gap: 6px; }
.ppl { display: inline-flex; align-items: center; gap: 4px; font-size: 12.5px;
  color: #33475b; background: #fff; border: 1px solid #e6ebf1; border-radius: 7px;
  padding: 3px 8px; cursor: pointer; }
.ppl:hover { border-color: #93c5fd; }
.ppl .pd { color: #94a3b8; font-size: 11.5px; }
.ppl.ppbind { margin-left: 12px; white-space: nowrap; border-color: #cbd5e1; }
.ppmiss { color: #b91c1c; font-size: 12.5px; line-height: 1.7; margin: 10px 0 0;
  background: #fef2f2; border: 1px solid #fecaca; border-radius: 8px;
  padding: 7px 10px; }
.ppform input.ppgrey { color: #33475b; }
.ppform input.ppgrey::placeholder { color: #a9b6c6; opacity: 1; }
.pph1row { display: flex; align-items: center; gap: 12px; margin: 0 0 10px; }
.pph1row h1 { margin: 0; }
.ppaudit-row td { background: #f8fafc; }
.ppaudit-box { border: 1px solid #e2e8f0; border-radius: 8px; padding: 8px 10px;
  background: #fff; }
.ppaudit-h { font-size: 13px; color: #33475b; margin-bottom: 6px; }
.ppaudit-h .muted { font-size: 12px; }
.ppaudit-tbl { margin: 0 0 8px; }
.ppaudit-tbl th { font-size: 12px; }
.ppaudit-tbl td { font-size: 12.5px; padding: 5px 8px; vertical-align: middle; }
.ppaudit-tbl input[type="number"] { height: 26px; padding: 0 6px; }
.ppaudit-tbl input[type="checkbox"] { width: 15px; height: 15px; }
.ppaudit-btns { display: flex; align-items: center; gap: 10px;
  flex-wrap: nowrap; white-space: nowrap; }
.ppaudit-btns .btn { font-size: 12.5px; padding: 5px 12px; }
.ppedit-tip { background: #fffbeb; border: 1px solid #fde68a; border-radius: 8px;
  padding: 6px 10px; font-size: 12.5px; color: #92400e; margin-bottom: 8px; }
.actcell { display: flex; align-items: center; gap: 10px; white-space: nowrap; }
.actcell.ppactcell { display: block; }
.ppact2 { display: flex; align-items: center; gap: 10px; }
.ppact2 + .ppact2 { margin-top: 4px; }
.actcell { flex-wrap: wrap; }
.actcell form { margin: 0; display: inline; }
.paused-row td { background: #f8fafc; color: #94a3b8; }
.paused-badge { font-size: 11.5px; color: #b91c1c; background: #fee2e2;
  border-radius: 20px; padding: 1px 8px; margin-left: 6px; }
.paused { color: #b91c1c; }
.pppend { display: inline-block; background: #fff7ed; border: 1px solid #fdba74;
  color: #c2410c; font-weight: 600; font-size: 12px; border-radius: 6px;
  padding: 2px 8px; margin-bottom: 4px; }
.pfdone-n { color: #64748b; font-size: 12.5px; }
a.pppend { text-decoration: none; cursor: pointer; }
a.pppend:hover { background: #fed7aa; }
a.pppend.on { background: #c2410c; border-color: #c2410c; color: #fff; }
.pfdone-y { color: #15803d; font-weight: 600; font-size: 12.5px; }
.pfpend-n { color: #c2410c; font-weight: 600; font-size: 12.5px; }
.pfpg { font-size: 12.5px; font-weight: 600; }
.pfpg.ok { color: #15803d; }
.pfpg.wait { color: #c2410c; }
.pfpg.bad { color: #b91c1c; }
.pfpg.run { color: #2563eb; font-weight: 500; }
.pfno { display: inline-block; margin-left: 8px; padding: 1px 7px;
  border: 1px solid #cbd5e1; border-radius: 6px; background: #f8fafc;
  color: #475569; font-size: 12px; font-weight: 600; }
.salhead { display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
  margin: 6px 0 24px; }
.salhead .saltitle { margin: 0; flex: 0 0 auto; }
.salper { margin-left: auto; display: flex; align-items: center; gap: 6px;
  font-size: 13px; flex: 0 0 auto; white-space: nowrap; }
.salper > span { white-space: nowrap; }
.salper input[type=month] { padding: 4px 6px; border: 1px solid #cbd5e1;
  border-radius: 6px; font-size: 13px; }
.pfsum { border: 1px solid #bfdbfe; background: #eff6ff; border-radius: 8px;
  padding: 8px 12px; font-size: 12.5px; line-height: 1.7; color: #1e3a8a;
  white-space: nowrap; }
.pfsum-t { font-weight: 700; }
.pfsum-sep { color: #93c5fd; padding: 0 2px; }
.pfsum-line { white-space: nowrap; }
.pfset { display: inline-block; background: #ecfdf5; border: 1px solid #86efac;
  color: #166534; border-radius: 6px; padding: 3px 8px; font-size: 12.5px;
  font-weight: 600; white-space: nowrap; }
.pfhead .pfset { margin-left: auto; }
.pfset b { color: #15803d; }
.pfset.pfmax { background: #fffbeb; border-color: #fcd34d; color: #92400e; }
.pfset.pfmax b { color: #b45309; }
.rphead { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.rptypes { display: inline-flex; align-items: center; gap: 6px; margin-left: auto;
  font-weight: 400; font-size: 12.5px; }
.rptchip { display: inline-flex; align-items: center; gap: 4px; cursor: pointer;
  padding: 3px 10px; border: 1px solid #cbd5e1; border-radius: 14px;
  background: #f8fafc; color: #33475b; user-select: none; }
.rptchip input { margin: 0; accent-color: #2563eb; }
.rptchip.on { background: #2563eb; border-color: #2563eb; color: #fff; }
.rptchip.on input { accent-color: #fff; }
.rplock { background: #eef2f7 !important; color: #64748b !important;
  cursor: not-allowed; border-style: dashed !important; }
.rptedit-row > td { background: #f8fafc; }
.rvrow > td { background: #f8fafc; }
.rvform textarea { font-size: 13px; line-height: 1.6; padding: 6px 8px;
  border: 1px solid #d8dde6; border-radius: 6px; font-family: inherit; }
.rptbad { color: #b91c1c; font-weight: 600; }
.rptok { color: #15803d; font-weight: 600; }
.rpedit .grid { margin-bottom: 6px; }
.rpedit .actions { display: flex; gap: 8px; align-items: center; }
/* 报表表单里的灰色预置提示：调浅一些，别让人误以为已经填好了 */
#reportForm input::placeholder, #reportForm textarea::placeholder,
.rpedit input::placeholder, .rpedit textarea::placeholder { color: #c2ccda; opacity: 1; }
/* 员工端/管理端：意见那一行（标签 + 红字意见 + 按钮/已读标签，都排在同一行） */
.tbl tr.rptnoterow > td { background: #f8fafc; }
.tbl tr.rptnoterow.unread > td { background: #fffbeb; }
.rptnoteline { display: flex; gap: 8px; align-items: center; }
.rptnotek { font-size: 12px; font-weight: 600; color: #33475b; white-space: nowrap; }
.rptnoterow.unread .rptnotek { color: #b45309; }
.rptnoterow .rptnotek.rej { color: #b91c1c; }
.rptnotetxt { font-size: 12.5px; color: #475569; line-height: 1.7;
  white-space: pre-wrap; word-break: break-word; }
.rptnoteq { flex: 1 1 auto; min-width: 0; color: #dc2626; font-weight: 600; }
.rptnotebtn { flex: 0 0 auto; display: inline-flex; align-items: center; }
.btn-readnote { background: #2563eb; color: #fff; border: 0; border-radius: 5px;
  padding: 3px 9px; font-size: 11.5px; line-height: 18px; font-family: inherit;
  cursor: pointer; white-space: nowrap; }
.btn-readnote:hover { background: #1d4ed8; }
.rptread { display: inline-block; font-size: 11px; color: #15803d; font-weight: 600;
  background: #f0fdf4; border: 1px solid #bbf7d0; border-radius: 5px;
  padding: 2px 8px; white-space: nowrap; }
/* 被驳回后「重新提交」的入口 */
.lnk-again { background: #dc2626; color: #fff; border: 0; border-radius: 5px;
  padding: 2px 8px; font-size: 12px; font-family: inherit; cursor: pointer;
  white-space: nowrap; }
.lnk-again:hover { background: #b91c1c; }
/* 「审核通过」按钮：绿色 */
.btn.btn-pass { background: #16a34a; border-color: #16a34a; color: #fff; }
.btn.btn-pass:hover { background: #15803d; border-color: #15803d; color: #fff; }
/* 审批面板那行按钮：排一行、上下居中对齐 */
.rvform .actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.rvform .actions > * { margin: 0; }
/* 管理端：员工有没有看过这条意见 */
.rvread { display: inline-block; margin-top: 3px; font-size: 11px; font-weight: 600;
  color: #15803d; background: #f0fdf4; border: 1px solid #bbf7d0; border-radius: 5px;
  padding: 1px 6px; }
.rvunread { display: inline-block; margin-top: 3px; font-size: 11px; font-weight: 600;
  color: #b45309; background: #fffbeb; border: 1px solid #fcd34d; border-radius: 5px;
  padding: 1px 6px; }
.tbl td.ops .linklike + form { margin-left: 10px; }
.ppager { display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  margin-top: 10px; font-size: 12.5px; }
.ppager .pgbtn { color: #2563eb; text-decoration: none; padding: 3px 9px;
  border: 1px solid #e2e8f0; border-radius: 6px; background: #fff; }
.ppager .pgbtn:hover { background: #f1f5f9; }
.ppager .pgbtn.on { background: #2563eb; border-color: #2563eb; color: #fff;
  font-weight: 600; }
.ppflt { margin-bottom: 10px; }
.pfsum-line b { color: #1d4ed8; }
.ppsort { display: flex; align-items: center; gap: 8px; font-size: 12.5px;
  margin: 0 0 8px; flex-wrap: wrap; }
.ppfilter { margin-left: auto; display: flex; align-items: center; gap: 8px;
  align-self: center;
  flex-wrap: wrap; }
.ppfilter label.pg { display: inline-flex; align-items: center; gap: 4px;
  white-space: nowrap; }
.ppfilter select { padding: 3px 6px; border: 1px solid #cbd5e1;
  border-radius: 6px; font-size: 12.5px; }
.ppfilter input[type=text] { padding: 4px 8px; border: 1px solid #cbd5e1;
  border-radius: 6px; font-size: 12.5px; width: 150px; }
.ppfilter .btn { height: 29px; padding: 0 10px; box-sizing: border-box;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 12.5px; line-height: 1; }
.ppsort a { color: #2563eb; text-decoration: none; padding: 3px 9px;
  border: 1px solid #e2e8f0; border-radius: 6px; background: #fff; }
.ppsort a:hover { border-color: #93c5fd; }
.ppsort a.on { background: #2563eb; border-color: #2563eb; color: #fff; }
.ppcontent { font-size: 12.5px; color: #33475b; line-height: 1.6; max-width: 780px; }
.ppclamp { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
  overflow: hidden; max-height: 4.8em; }
.ppbt { display: inline-block; white-space: nowrap; }
.tbl td.ppobj, .tbl th.ppobj { text-align: center; }
.tbl td.pptime, .tbl th.pptime { padding-left: 22px; }
.pppts { color: #33475b; font-size: 12.5px; font-weight: 600; }
td.ppcontent, td.ppname { position: relative; }
td.ppcl { position: relative; }
.pftip { display: none; position: absolute; left: 0; top: 100%; z-index: 60;
  width: 320px; max-width: 320px; background: #0f172a; color: #fff; font-size: 12px;
  line-height: 1.55; padding: 8px 10px; border-radius: 6px;
  white-space: pre-wrap; word-break: break-word; overflow-wrap: anywhere;
  box-shadow: 0 6px 18px rgba(15, 23, 42, .28); }
td.ppcontent:hover .pftip, td.ppname:hover .pftip { display: block; }
td.ppcl:hover .pftip { display: block; }
/* 长文本格子：3 行就能显示全的，鼠标放上去不再弹浮窗（免得挡着看别的） */
td.ppfit:hover .pftip { display: none; }
/* 员工端：我收到的项目 / 考核 —— 一条一张小卡：左边内容，右边得分/钱/按钮 */
.pfitem { display: flex; gap: 16px; align-items: flex-start;
  background: #fff; border: 1px solid #e6ebf1; border-left: 3px solid #cbd5e1;
  border-radius: 8px; padding: 8px 11px; margin-bottom: 8px; }
.pfitem.s-wait { border-left-color: #f59e0b; }
.pfitem.s-done { border-left-color: #2563eb; }
.pfitem.s-aud { border-left-color: #16a34a; background: #f7fdf9; }
.pfitem.s-no { border-left-color: #dc2626; }
.pfmain { flex: 1 1 auto; min-width: 0; }
.pfhead { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pftitle { font-size: 14px; color: #1f2937; }
.pfstate { font-size: 11.5px; padding: 2px 8px; border-radius: 20px;
  background: #f1f5f9; color: #475569; }
.pfstate.s-wait { background: #fef3c7; color: #92400e; }
.pfstate.s-done { background: #dbeafe; color: #1d4ed8; }
.pfstate.s-aud { background: #dcfce7; color: #15803d; }
.pfstate.s-no { background: #fee2e2; color: #b91c1c; }
.pfmeta { font-size: 11.5px; color: #94a3b8; margin-top: 2px; }
.pfwhen { display: inline-block; font-size: 12.5px; color: #1f2937; margin: 0;
  background: #eef4ff; border: 1px solid #dbe6fb; border-radius: 6px;
  padding: 2px 9px; white-space: nowrap; }
.pfwhen b { font-size: 13px; }
.pfhead { align-items: center; }
.pfwhen.late { background: #fef2f2; border-color: #fecaca; color: #b91c1c; }
.pfbody { font-size: 13.5px; color: #1f2937; line-height: 1.75; margin-top: 8px;
  white-space: normal; background: #f8fafc; border: 1px solid #eef2f7;
  border-radius: 8px; padding: 8px 10px; }
/* 项目内容默认只露 3 行，多的收起来；下面给一个明显的「展开全文」按钮 */
.pfbody.pfclamp { display: -webkit-box; -webkit-line-clamp: 3;
  -webkit-box-orient: vertical; overflow: hidden; margin-top: 6px;
  padding: 6px 9px; }
.pfbody.pfopen { display: block; -webkit-line-clamp: none; overflow: visible; }
.pffold { display: none; margin-top: 5px; font-size: 12.5px; font-weight: 600;
  color: #1d4ed8; text-decoration: none; background: #eff6ff;
  border: 1px solid #bfdbfe; border-radius: 999px; padding: 2px 12px; }
.pffold:hover { background: #dbeafe; color: #1e40af; }
.pffold.on { display: inline-block; }
/* 岗位数据录入：填了负数的格子闪红一下，旁边弹一句提醒 */
input.pfin.neg-bad { border-color: #dc2626 !important; background: #fef2f2; }
.nhnegtip { position: fixed; z-index: 9999; background: #fee2e2; color: #b91c1c;
  border: 1px solid #fca5a5; border-radius: 6px; padding: 3px 10px;
  font-size: 12.5px; font-weight: 600; pointer-events: none;
  box-shadow: 0 4px 12px rgba(15, 23, 42, .18); }
/* 代发登记：订单编号跟历史重复时的标红 + 「再次确认」提醒条 */
input.dup-bad { border-color: #dc2626 !important; background: #fef2f2 !important;
  box-shadow: 0 0 0 3px rgba(220, 38, 38, .12); }
input.dup-warn { border-color: #f59e0b !important; background: #fffbeb !important; }
.dup-bar { display: none; margin: 8px 0 0; padding: 8px 12px; border-radius: 8px;
  font-size: 13px; line-height: 1.7; align-items: center; gap: 10px; flex-wrap: wrap; }
.dup-bar.on { display: flex; }
.dup-bar.bad { background: #fef2f2; border: 1px solid #fca5a5; color: #b91c1c; }
.dup-bar:not(.bad) { background: #fffbeb; border: 1px solid #fcd34d; color: #92400e; }
.dup-bar .dup-yes { background: #dc2626; color: #fff; border-color: #dc2626;
  font-weight: 600; }
.dup-bar .dup-yes:hover { background: #b91c1c; color: #fff; }
.dup-bar .dup-jump { color: #1d4ed8; font-size: 12.5px; }
.dup-no { color: #dc2626; font-weight: 700; cursor: pointer; }
.dup-no:hover { text-decoration: underline; }
/* 代发单：备注右边「订单已退款 / 退款后毛利」和列表里的小标注 */
.refund-row { display: flex; gap: 14px; align-items: flex-start; }
.refund-row .refund-note { flex: 0 0 46%; min-width: 220px; }
.refund-row .refund-note textarea { width: 100%; box-sizing: border-box; }
.refund-row .refund-box { flex: 1 1 auto; }
.refund-row .refund-ck { display: block; font-weight: 600; margin: 2px 0 8px; }
.refund-row .refund-line { display: flex; align-items: center; gap: 8px;
  margin-bottom: 6px; }
.refund-row .refund-line label { flex: 0 0 auto; min-width: 92px; margin: 0;
  white-space: nowrap; }
.refund-row .refund-line input { flex: 0 0 240px; box-sizing: border-box; }
/* 退款后成本 / 退款后毛利 里填的是「文字说明」（如 待定、已协商）：加粗蓝色，且不参与计算
   （改回纯数字就自动回到普通样式、重新参与计算） */
.refund-line input.refund-text { color: #2563eb; font-weight: 700; }
/* 只允许两种写法：数字，或下拉里的「暂无法计算」。别的写法红字提醒 + 存不进去 */
.refund-line input.refund-bad { color: #dc2626; font-weight: 700; }
/* 退款后成本/毛利：输入框右边的下拉箭头**一直显示**（自己画的，不靠鼠标悬停），
   点一下弹出「暂无法计算」；输入框本身照旧可以随便打字 */
.refund-row .refund-line .refund-combo { flex: 0 0 240px; position: relative; display: block; }
.refund-row .refund-line .refund-combo input { width: 100%; box-sizing: border-box;
  padding-right: 28px; flex: 1 1 auto; }
.refund-arrow { position: absolute; right: 1px; top: 1px; bottom: 1px; width: 26px;
  display: flex; align-items: center; justify-content: center; cursor: pointer;
  color: #475569; background: #f1f5f9; border-left: 1px solid #e2e8f0;
  border-radius: 0 7px 7px 0; font-size: 12px; user-select: none; }
.refund-arrow:hover { background: #e2e8f0; color: #1d4ed8; }
.refund-menu { display: none; position: absolute; left: 0; right: 0; top: 100%; z-index: 40;
  margin-top: 4px; background: #fff; border: 1px solid #e2e8f0; border-radius: 8px;
  box-shadow: 0 10px 24px rgba(15,23,42,.14); overflow: hidden; }
.refund-menu.open { display: block; }
.refund-menu .refund-opt { padding: 8px 12px; font-size: 13px; cursor: pointer; color: #1d4ed8;
  font-weight: 700; }
.refund-menu .refund-opt:hover { background: #eff6ff; }
.refund-tag { color: #dc2626; font-size: 11.5px; font-weight: 600; margin-top: 2px; }
.refund-gross { color: #1d4ed8; font-weight: 700; }
/* 填过「退款后合计成本 + 退款后毛利」的单：利润率**只换个颜色**（蓝色），
   字体、字号、"写在利润下面一行"的格式全部沿用原来的 .tbl .sub-red 那套 */
.tbl .sub-red.refund-rate { color: #1d4ed8; }
.dup-note { display: inline-block; margin-left: 10px; font-size: 12.5px;
  color: #b91c1c; background: #fef2f2; border: 1px solid #fca5a5;
  border-radius: 6px; padding: 3px 10px; }
.dup-note a { color: #1d4ed8; margin-left: 8px; }
/* 信息设置：保存后右下角提示（不跳页面顶部，就地看到结果） */
.nhset-toast { position: fixed; right: 22px; bottom: 22px; z-index: 9999;
  max-width: 440px; padding: 10px 16px; border-radius: 8px; font-size: 13.5px;
  line-height: 1.6; box-shadow: 0 8px 22px rgba(15, 23, 42, .18);
  opacity: 0; transform: translateY(10px); pointer-events: none;
  transition: opacity .18s ease, transform .18s ease; }
.nhset-toast.show { opacity: 1; transform: none; }
.nhset-toast.info { background: #ecfdf5; color: #15803d; border: 1px solid #86efac; }
.nhset-toast.warn { background: #fffbeb; color: #92400e; border: 1px solid #fcd34d; }
.nhset-toast.error { background: #fef2f2; color: #b91c1c; border: 1px solid #fca5a5; }
.pftools { display: flex; gap: 10px; margin-top: 8px; }
.pfmini { font-size: 12px; color: #2563eb; text-decoration: none;
  border: 1px dashed #bfdbfe; border-radius: 6px; padding: 2px 8px; }
.pfmini:hover { background: #eff6ff; }
.pfmemo-box { margin-top: 8px; background: #f8fafc; border: 1px solid #e2e8f0;
  border-radius: 8px; padding: 8px 10px; font-size: 12.5px; color: #33475b; }
.pfmemo-box input[type="text"], .pfmemo-box input[type="date"] { height: 28px;
  padding: 0 6px; font-size: 12.5px; }
.pfmemo-box textarea { width: 100%; box-sizing: border-box; font-size: 12.5px;
  padding: 6px 8px; border: 1px solid #d8dde6; border-radius: 6px;
  font-family: inherit; }
.pfmemo { margin-top: 4px; font-size: 12px; padding: 4px 8px; border-radius: 6px; }
.pfmemo.wait { background: #fff7ed; border: 1px solid #fed7aa; color: #9a3412; }
.pfmemo.done { background: #f0fdf4; border: 1px solid #bbf7d0; color: #15803d; }
.pfnotes { margin-top: 8px; padding-top: 6px; border-top: 1px dashed #eef2f7;
  font-size: 11.5px; color: #64748b; line-height: 1.7;
  display: flex; align-items: flex-start; gap: 12px; }
.pfnote-txt { flex: 1 1 auto; min-width: 0; }
.pfnotes .pftools { margin-top: 0; flex: 0 0 auto; align-items: center;
  flex-wrap: nowrap; }
.pfnotes .pftools .btn { font-size: 12.5px; padding: 5px 12px; }
.pfscore2 { display: inline-block; font-size: 12.5px; font-weight: 600;
  color: #1f2937; background: #f1f5f9; border: 1px solid #e2e8f0;
  border-radius: 6px; padding: 2px 9px; white-space: nowrap; }
.pfscore2.sub { background: #fff7ed; border-color: #fed7aa; color: #9a3412; }
.pfnote-aud { color: #15803d; }
.pfside { flex: 0 0 132px; text-align: right; display: flex;
  flex-direction: column; align-items: flex-end; gap: 6px; }
.pfsc { font-size: 19px; font-weight: 700; color: #1f2937; line-height: 1.2; }
.pfsc span { font-size: 11.5px; font-weight: 400; color: #94a3b8; }
.pfmo { font-size: 13px; color: #b45309; font-weight: 600; }
.pfmo-sub { font-size: 11px; color: #94a3b8; font-weight: 400; }
.pfbtn2 { font-size: 12px; padding: 4px 10px; white-space: nowrap; }
.pfbtn2.rejbtn { background: #fee2e2; color: #b91c1c; border-color: #fca5a5; }
.pfbtn2.blue { background: #2563eb; color: #fff; border-color: #2563eb; }
.pfbtn2.blue:hover { background: #1d4ed8; color: #fff; }
.pfbtn-done { display: inline-block; font-size: 12.5px; font-weight: 600;
  color: #15803d; background: #dcfce7; border: 1px solid #86efac;
  border-radius: 6px; padding: 4px 10px; white-space: nowrap; }
.pfbtn-done.wait { color: #1d4ed8; background: #dbeafe; border-color: #93c5fd; }
/* 员工端：我收到的项目 */
.pfit { background: #f8fafc; border: 1px solid #eef2f7; border-radius: 8px;
  padding: 8px 10px; margin-bottom: 8px; }
.pfih { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
  margin-bottom: 3px; }
.pfit-c { font-size: 13px; color: #33475b; line-height: 1.65; }
/* 员工工资条下面的「考勤明细」 */
.attd { display: flex; align-items: center; gap: 8px; font-size: 12.5px;
  color: #33475b; line-height: 1.7; }
.attd b { color: #64748b; font-weight: 600; min-width: 42px; }
.attd span { margin-left: auto; }
.attd span.muted { color: #94a3b8; }
/* 全员表：勾选推送/撤回时才出现的勾选框；已推送的人名后一个小绿点 */
.ptable .pchk { display: none; width: 13px; height: 13px; margin: 0 5px 0 0;
  padding: 0; vertical-align: middle; accent-color: #2563eb; }
.card.picking .ptable .pchk { display: inline-block; }
.card.picking .ptable td.pname { background: #eff6ff; }
.ptable .pushed-dot { color: #16a34a; font-size: 11px; vertical-align: middle; }
/* 两张表最后一列「合计工资」 */
.ptable td.cell, .ptable th.nrow-c { min-width: 60px; }   /* 保证格子里 6 位数能完整显示 */
.ptable th.sumth { background: #f1f5f9; color: #14324a; width: 72px; min-width: 72px;
  max-width: 72px; font-size: 12.5px; padding: 0 4px;
  border-left: 1px solid #eef2f7; }
.ptable td.sumcell { background: #f8fafc; font-weight: 700; color: #14324a;
  text-align: center; padding: 0 6px; border-left: 1px solid #eef2f7;
  width: 72px; min-width: 72px; max-width: 72px; font-size: 13px; }
/* 姓名后的员工反馈标记：红＝提了异议，绿勾＝已核对无误 */
.ptable th.noteth { background: #f1f5f9; color: #14324a; width: 76px; min-width: 76px;
  max-width: 76px; font-size: 12.5px; padding: 0 4px;
  border-left: 1px solid #eef2f7; }
.ptable td.notecell { padding: 0; }
.ptable .pnote { text-align: center; color: #475569; min-width: 0; }
/* 有备注时显示「查看备注」（红色、不加粗） */
.ptable .pnote.pnote-has { color: #dc2626; font-weight: 400; }
/* 备注的悬浮预览小窗（自动换行、不出屏） */
.notetip { position: fixed; z-index: 500; max-width: 340px; background: #1f2937;
  color: #fff; font-size: 12.5px; line-height: 1.65; padding: 8px 10px;
  border-radius: 8px; box-shadow: 0 10px 26px rgba(15, 23, 42, .28);
  white-space: pre-wrap; word-break: break-word; pointer-events: none; }
/* 备注的浮窗编辑框 */
.notepop-mask { position: fixed; inset: 0; background: rgba(15, 23, 42, .28);
  z-index: 400; display: flex; align-items: center; justify-content: center; }
.notepop { background: #fff; border-radius: 10px; padding: 14px 16px 12px;
  box-shadow: 0 20px 50px rgba(15, 23, 42, .25); width: min(540px, 92vw);
  box-sizing: border-box; }
.notepop-h { font-size: 13.5px; font-weight: 600; color: #14324a; margin-bottom: 8px;
  display: flex; align-items: baseline; flex-wrap: wrap; }
.notepop-t { width: 100%; box-sizing: border-box; font-size: 13px; line-height: 1.65;
  padding: 8px 10px; border: 1px solid #d8e0ea; border-radius: 8px; min-height: 120px;
  resize: vertical; font-family: inherit; }
.notepop-t:focus { outline: none; border-color: #2563eb; }
.notepop-b { display: flex; align-items: center; gap: 8px; justify-content: flex-end;
  margin-top: 10px; }
.notepop-msg { margin-right: auto; font-size: 12.5px; color: #b91c1c; }
.ptable .obj-dot { display: inline-block; min-width: 13px; height: 13px; line-height: 13px;
  margin-left: 3px; border-radius: 50%; background: #dc2626; color: #fff; font-size: 11px;
  font-weight: 700; text-align: center; vertical-align: middle; cursor: help; }
.ptable .ok-dot { color: #16a34a; font-size: 12px; font-weight: 700;
  vertical-align: middle; cursor: help; }
/* 黄色按钮（撤回这类「要小心」的操作） */
.btn.btn-warn { background: #fffbeb; border-color: #fcd34d; color: #b45309; }
.btn.btn-warn:hover { background: #fef3c7; border-color: #f59e0b; color: #92400e; }
.btn.btn-red { background: #dc2626; border-color: #dc2626; color: #fff; }
.btn.btn-red:hover { background: #b91c1c; border-color: #b91c1c; color: #fff; }
.me-status { margin-bottom: 10px; color: #475569; }
.me-confirmed { color: #15803d; font-size: 13px; font-weight: 600; }
/* 人事档案：标题右侧的总人数 */
.hr-total { font-size: 13px; font-weight: 400; color: #64748b; margin-left: 10px; }
/* 系统管理：新增/编辑人员 —— 部门多选单独一整行 */
.field-block { margin-top: 12px; }
.field-block > label { display: block; font-size: 13px; color: #4a5b6b; margin-bottom: 2px; }
.field-block .chk-group { padding-top: 0; }
/* 授权页：分系统 → 主菜单 → 子菜单 三级 */
.role-tabs { display: flex; flex-wrap: wrap; gap: 8px; }
.role-tab {
  border: 1px solid #cbd5e1; background: #fff; color: #24303a;
  border-radius: 6px; padding: 6px 14px; font-size: 14px;
  cursor: pointer; font-family: inherit;
}
.role-tab:hover { background: #f1f5f9; }
.role-tab.active { background: #2563eb; border-color: #2563eb; color: #fff; font-weight: 600; }
.role-tab .cnt { font-size: 12px; opacity: .8; margin-left: 6px; }
.role-panel { display: none; }
.role-panel.active { display: block; }
.perm-sys-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.perm-sys-lbl { font-weight: 700; color: #14324a; font-size: 14px; }
.perm-count { font-size: 12px; color: #64748b; }
.perm-actions { margin-left: auto; display: inline-flex; gap: 6px; }
.perm-body { margin-top: 6px; padding-left: 4px; }
.perm-menu { padding: 5px 0 5px 0; border-top: 1px dashed #e6edf5; }
.perm-menu:first-child { border-top: none; }
.perm-menu > .perm-m { font-weight: 600; color: #1f3b52; }
/* 子菜单横向排一行（一行放不下时整项换行，不把文字拆成竖排） */
.perm-subs {
  display: flex; flex-wrap: wrap; gap: 6px 22px;
  margin: 6px 0 2px 18px; padding-left: 12px;
  border-left: 2px solid #e2e8f0;
}
.perm-sub { display: inline-flex; align-items: center; gap: 8px; padding: 2px 0; }
.perm-sub > .perm-s,
.perm-sub > .perm-fns,
.perm-sub .perm-fns label { white-space: nowrap; }
.perm-sub > .perm-s { color: #33475b; }
.perm-menu > .perm-fns, .perm-sub > .perm-fns { margin-left: 22px; }
.perm-sub > .perm-fns { margin-left: 0; }
.perm-note { font-size: 12px; color: #94a3b8; }
.perm-menu-off > .perm-m, .perm-sub-off > .perm-s, .perm-menu-off .perm-fns,
.perm-menu-off .perm-subs { opacity: .45; }
.perm-menu-off .perm-fns input, .perm-sub-off .perm-fns input { cursor: not-allowed; }
.perm-body-off { opacity: .5; }
@media (max-width: 900px) { .grid.three { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .grid.three { grid-template-columns: 1fr; } }
.grid.seven .span2 { grid-column: span 2; }
.grid.seven > .span3 { grid-column: span 3; }
.grid.seven > .span4 { grid-column: span 4; }
.grid.seven.row1 { grid-template-columns: 1fr 1.5fr 0.5fr 1fr 1fr 1fr 1fr; }
@media (max-width: 1200px) { .grid.seven.row1 { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 900px) { .grid.seven.row1 { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .grid.seven.row1 { grid-template-columns: 1fr; } }
@media (max-width: 1200px) { .grid.seven { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 900px) { .grid.seven { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .grid.seven { grid-template-columns: 1fr; } }

label { display: block; font-size: 13px; color: #4a5b6b; margin: 8px 0 4px; }
label.chk { display: inline-flex; align-items: center; gap: 6px; margin: 0; font-size: 14px; color: #24303a; }
.chk-group { display: flex; flex-wrap: wrap; gap: 4px 14px; padding-top: 6px; }
.chk-group label.chk { font-size: 13px; }
/* 选项不压缩、文字不换行：一行放不下就整项换行，避免「部门」变成竖排 */
.chk-group label.chk { flex: 0 0 auto; white-space: nowrap; }

input, select, textarea {
  width: 100%;
  padding: 8px 10px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  font-size: 14px;
  font-family: inherit;
  background: #fff;
}
input:focus, select:focus, textarea:focus { outline: none; border-color: #2563eb; }
input.wide { max-width: 640px; }
/* 勾选框 / 单选按钮不要被上面的 width:100% 拉成整行（否则文字会换行错位） */
input[type="checkbox"], input[type="radio"] {
  width: 15px; height: 15px; min-width: 15px; padding: 0; margin: 0;
  flex: 0 0 auto; vertical-align: middle; accent-color: #1d4ed8; cursor: pointer;
}

.actions { margin-top: 16px; }

.btn, .btn-primary, .btn-danger {
  display: inline-block;
  padding: 8px 16px;
  border-radius: 6px;
  border: 1px solid #cbd5e1;
  background: #fff;
  color: #24303a;
  cursor: pointer;
  font-size: 14px;
  font-family: inherit;
}
.btn:hover { background: #f1f5f9; }
.btn-primary { background: #2563eb; border-color: #2563eb; color: #fff; }
.btn-primary:hover { background: #1d4ed8; text-decoration: none; }
.btn-danger { background: #dc2626; border-color: #dc2626; color: #fff; }

button.linklike {
  background: none;
  border: none;
  color: #dc2626;
  cursor: pointer;
  padding: 0;
  font-size: 14px;
  font-family: inherit;
}
button.linklike:hover { text-decoration: underline; }
button.linklike.link-danger { color: #dc2626; }
button.linklike.link-ok { color: #2563eb; }

.tbl { width: 100%; border-collapse: collapse; }
.tbl th, .tbl td {
  border-bottom: 1px solid #edf2f7;
  padding: 8px 10px;
  text-align: left;
  vertical-align: top;
}
.tbl th { background: #f8fafc; color: #4a5b6b; font-weight: 600; white-space: nowrap; }
.tbl tr:hover td { background: #fafcff; }
.tbl .empty { text-align: center; color: #94a3b8; padding: 24px; }
.tbl.kv th { width: 130px; background: #f8fafc; }
.tbl .ops { white-space: nowrap; }
.tbl .ops a { margin-right: 8px; }
.tbl .ops form.inline { display: inline-block; margin-right: 8px; }
.tbl .ops form.inline:last-child { margin-right: 0; }
.tbl .ops button.linklike { vertical-align: baseline; }
/* 「采购发起」的操作列：编辑 / 详情 / 删除 并排一行，给够宽度 */
#reqTableCard th.col-ops, #reqTableCard td.col-ops { width: 120px; white-space: nowrap; }
.sortlink { color: #33475b; white-space: nowrap; }
.sortlink:hover { color: #2563eb; text-decoration: none; }
.sortarrow { color: #2563eb; }

.badge {
  display: inline-block;
  padding: 2px 9px;
  border-radius: 20px;
  font-size: 12px;
  background: #e2e8f0;
}
.badge.ok { background: #dcfce7; color: #15803d; }
.badge.warn { background: #fef3c7; color: #b45309; }
.badge.bad { background: #fee2e2; color: #b91c1c; }

.stats { display: flex; gap: 14px; flex-wrap: wrap; margin-bottom: 18px; }
.summaries { display: flex; gap: 14px; flex-wrap: wrap; margin: 4px 0 14px; }
.summaries .stat { min-width: 240px; }
.summaries .stat .num.danger { color: #dc2626; }
.summaries.compact { gap: 8px; margin: 4px 0 10px; }
.summaries.compact .stat { min-width: 112px; padding: 8px 10px; flex: 1 1 112px; }
.summaries.compact .stat .num { font-size: 15px; line-height: 1.35; }
.summaries.compact .stat .lbl { font-size: 12px; }
.inv-sum-title { margin: 2px 0 8px; font-size: 13px; font-weight: 600; color: #14324a; }
.stat {
  background: #fff;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  padding: 16px 22px;
  min-width: 150px;
}
.stat .num { font-size: 26px; font-weight: 700; color: #14324a; }
.stat .num.danger { color: #dc2626; }
.stat .lbl { color: #64748b; font-size: 13px; }

.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
@media (max-width: 820px) { .two-col { grid-template-columns: 1fr; } }
.three-col { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
@media (max-width: 1250px) { .three-col { grid-template-columns: 1fr; } }
.tblnote { font-size: 12px; color: #64748b; font-weight: 400; line-height: 1.45; margin-top: 2px; }

.quick { list-style: none; margin: 0; padding: 0; }
.quick li { padding: 7px 0; border-bottom: 1px solid #f1f5f9; }

.perm-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }
@media (max-width: 720px) { .perm-grid { grid-template-columns: 1fr; } }
.perm-section { padding: 8px 0 14px; border-bottom: 1px solid #edf2f7; }
.perm-section:last-child { border-bottom: none; }
.perm-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px; }
.perm-head h2 { margin: 0; font-size: 15px; }
.perm-head span { color: #94a3b8; font-size: 12px; }
.perm-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px 18px; }
@media (max-width: 720px) { .perm-list { grid-template-columns: 1fr; } }
.perm-list label {
  display: flex;
  align-items: center;
  gap: 8px;
  border: 1px solid #eef2f7;
  background: #f8fafc;
  border-radius: 6px;
  padding: 7px 10px;
  margin: 0;
  font-size: 13px;
  cursor: pointer;
}
.perm-list label:hover { background: #eff6ff; }
.perm-list input { width: auto; margin: 0; flex: none; }
.perm-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(420px, 1fr)); gap: 12px; align-items: start; }
.perm-sys { border: 1px solid #e2e8f0; border-radius: 8px; padding: 8px 12px 10px; background: #fff; }
.perm-sys-head {
  display: flex; align-items: center; gap: 6px;
  font-weight: 700; font-size: 14px; color: #14324a;
  padding-bottom: 6px; border-bottom: 1px solid #edf2f7; margin: 0 0 2px;
}
.perm-sys-head.perm-head-lbl { font-weight: 600; color: #475569; font-size: 13px; }
.perm-row { display: flex; align-items: flex-start; gap: 8px; padding: 3px 0; }
.perm-m { flex: 0 0 108px; font-size: 13px; color: #24303a; }
.perm-lbl { color: #64748b; font-size: 12.5px; }
.perm-fns { display: flex; flex-wrap: wrap; gap: 1px 14px; font-size: 12.5px; flex: 1 1 auto; min-width: 0; }
.perm-fns .chk { display: inline-flex; align-items: center; gap: 4px; margin: 0; font-size: 12.5px; }
.perm-cols-row {
  flex: 1 1 100%; display: flex; flex-wrap: wrap; gap: 1px 12px;
  margin-top: 2px; padding-top: 2px; border-top: 1px dashed #f1f5f9;
}
.perm-cols-row > span { color: #94a3b8; font-size: 12px; align-self: center; }
.perm-extra-row { border-top: 1px dashed #e2e8f0; margin-top: 5px; padding-top: 6px; }
.perm-row-off { opacity: .45; }
.perm-sys.perm-off { opacity: .55; }
.perm-body-off { opacity: .5; pointer-events: none; }
.perm-fns-off { opacity: .5; pointer-events: none; }
.perm-fn input, .perm-sys-head input, .perm-m input { width: auto; margin: 0; flex: none; }

.hist { list-style: none; margin: 0; padding: 0; }
.hist li { padding: 6px 0; border-bottom: 1px dashed #e2e8f0; }

.muted { color: #64748b; }
.qty-red { color: #dc2626; }
/* 开销与收入登记：收入（文字+金额）用默认黑色；支出（文字+金额）蓝色。
   只改颜色，不加 display，避免把单元格踢出表格框线 */
.dir-out, .money-out { color: #2563eb; }
.note-small { font-size: 11px; line-height: 1.35; }
.note-black { color: #1f2937; }
.reject-reason { color: #dc2626; }
.partial-red { color: #dc2626; font-weight: 500; margin-top: 2px; white-space: nowrap; }
.arrival-over { color: #dc2626; }
.arrival-part { color: #2563eb; }
.st-unsettled { color: #dc2626; font-weight: 600; }
.st-part-settle { color: #d97706; font-weight: 600; }
.inv-undone { color: #dc2626; font-weight: 600; }
.inv-partial { color: #2563eb; font-weight: 600; }
.cell-link { color: inherit; text-decoration: none; }
.cell-link:hover { background: #eef5ff; border-radius: 4px; }
.approve-panel { padding: 4px 0 2px; }
.approve-line {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
  align-items: center;
}
.approve-line .f {
  display: flex;
  align-items: center;
  gap: 6px;
  margin: 0;
}
.approve-line .f label {
  margin: 0;
  white-space: nowrap;
  font-size: 13px;
  color: #4a5b6b;
}
.approve-line select,
.approve-line input {
  width: 190px;
  padding: 5px 8px;
}
.approve-line .btn-primary { padding: 6px 14px; }

.flash {
  padding: 10px 14px;
  border-radius: 6px;
  margin-bottom: 16px;
}
.flash.info { background: #dbeafe; color: #1d4ed8; }
.flash.error { background: #fee2e2; color: #b91c1c; }
.flash.warn { background: #fef3c7; color: #b45309; font-weight: 600; }
.flash.ship-toast {
  position: fixed;
  top: 74px;
  right: 24px;
  z-index: 60;
  margin: 0;
  box-shadow: 0 6px 20px rgba(15, 23, 42, .18);
}

.login-wrap {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(135deg, #14324a, #1e4d74);
}
.login-card {
  background: #fff;
  width: 380px;
  padding: 30px 32px;
  border-radius: 10px;
  box-shadow: 0 20px 50px rgba(0,0,0,.25);
}
.login-card h1 { text-align: center; font-size: 20px; }
.login-brand {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  font-size: 20px;
  font-weight: 700;
  color: #14324a;
  margin-bottom: 6px;
}
.login-brand img { width: 34px; height: 34px; }
.login-card .sub { text-align: center; color: #64748b; margin-top: -8px; }
.login-card .login-remember {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: 12px;
  font-size: 13px;
  color: #475569;
  cursor: pointer;
  user-select: none;
}
.login-card .login-remember input {
  width: 15px;
  height: 15px;
  margin: 0;
  cursor: pointer;
}
.login-card .btn-primary { width: 100%; margin-top: 18px; padding: 10px; }

.foot { text-align: center; color: #94a3b8; font-size: 12px; padding: 18px; }

/* ---- v2 新增样式 ---- */
.card h3 { font-size: 14px; color: #14324a; margin: 14px 0 6px; }
.tabs { display: flex; gap: 8px; margin-bottom: 10px; flex-wrap: wrap; align-items: center; }
.tab {
  padding: 8px 18px;
  border: 1px solid #cbd5e1;
  border-radius: 8px;
  background: #fff;
  color: #33475b;
  font-weight: 500;
}
.tab.on { background: #2563eb; border-color: #2563eb; color: #fff; }
.tab:hover { text-decoration: none; }
.tab.off { color: #94a3b8; border-color: #e2e8f0; cursor: default; }
.tab { padding: 4px 10px; font-size: 12px; border-radius: 6px; }
.pg { align-self: center; color: #475569; font-size: 13px; }
.tabs label.pg { display: inline-flex; align-items: center; gap: 6px; }
.tabs select.per { width: auto; padding: 5px 6px; }
.tabs a.tab, .tabs span.tab { padding: 5px 10px; font-size: 13px; border-radius: 6px; display: inline-flex; align-items: center; height: auto; line-height: 1.3; }
.tbl th.chk, .tbl td.chk { width: 34px; text-align: center; }
.tbl th.col-idx, .tbl td.col-idx { width: 46px; text-align: center; color: #64748b; }
.tbl td.chk input { width: auto; margin: 0; }
.tbl th.chk input { width: auto; margin: 0; }
.batchbar { display: inline-flex; gap: 8px; }
.batchbar .btn, .batchbar .btn-danger { padding: 4px 10px; font-size: 13px; }
/* 采购发起：批量维护勾选框列（默认隐藏，进入批量模式才显示） */
.tbl .selcol { display: none; width: 34px; text-align: center; }
.tbl.sel-on th.selcol, .tbl.sel-on td.selcol { display: table-cell; }
.tbl td.selcol input { width: auto; margin: 0; }
.batchbar { display: flex; align-items: center; gap: 10px; margin: 0 0 8px; }
.batchbar .batch-count { color: #475569; font-size: 13px; }
.batchbar .batch-count b { color: #dc2626; font-size: 14px; }
/* 「列开关」那一行里的批量编辑按钮 + 计数 */
.colsw .batch-count { color: #475569; font-size: 12.5px; white-space: nowrap; }
.colsw .batch-count b { color: #dc2626; font-size: 13.5px; }
.bar { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; margin: 0 0 6px; }
.bar .tabs { margin-bottom: 0; }
.subrow td { background: #fafbfd; padding: 4px 12px 12px; }
.rowdetail summary { cursor: pointer; color: #2563eb; font-weight: 500; padding: 8px 0; font-size: 14px; }
.rowdetail form { padding: 6px 2px 12px; }
.monthgrid { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.mcell {
  background: #f1f5f9;
  border-radius: 6px;
  padding: 6px 8px;
  min-width: 96px;
  font-size: 12px;
  text-align: center;
}
.mcell b { display: block; color: #475569; font-weight: 600; margin-bottom: 2px; }
.mcell span { display: block; color: #0f172a; }
.mcell.sum { background: #dbeafe; }
.finsum { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 8px; }
.fcard { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 8px 12px; }
.fcard span { display: block; color: #64748b; font-size: 12px; }
.fcard b { font-size: 15px; }
.fcard.danger { background: #fef2f2; border-color: #fecaca; }
.fcard.danger b { color: #b91c1c; }
.modal-mask {
  position: fixed; inset: 0;
  background: rgba(15, 23, 42, .45);
  display: flex; align-items: flex-start; justify-content: center;
  z-index: 2000; padding: 8vh 16px;
}
.modal { background: #fff; border-radius: 10px; padding: 22px; width: 100%; max-width: 640px; }
.accept-compare { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin: 10px 0 14px; }
@media (max-width: 640px) { .accept-compare { grid-template-columns: 1fr; } }
.ac-box { border: 1px solid #e2e8f0; background: #f8fafc; border-radius: 8px; padding: 8px 10px; font-size: 13px; }
.ac-box .tt { font-weight: 600; color: #475569; margin-bottom: 4px; }
.ac-box .note-black { display: block; }
.tbl .kv th { width: 150px; }
.danger { color: #b91c1c; }
.urgency {
  display: inline-block;
  padding: 2px 9px;
  border-radius: 20px;
  font-size: 12px;
}
.urgency.urg-normal { background: #e2e8f0; color: #475569; }
.urgency.urg-high { background: #fee2e2; color: #b91c1c; font-weight: 600; }
.urgency.urg-critical { background: #b91c1c; color: #fff; font-weight: 600; }
.wait { color: #94a3b8; font-style: italic; }
.wait-link { cursor: pointer; text-decoration: none; }
.wait-approval { color: #d97706; font-style: italic; }
.wait-purchase { color: #2563eb; font-style: italic; }
.wait-approval:hover { color: #b45309; }
.wait-purchase:hover { color: #1d4ed8; }
.accept-entry { margin-top: 4px; }
.tbl .nowrap, .nowrap { white-space: nowrap; }
.tbl .sub {
  display: block;
  font-size: 12px;
  color: #94a3b8;
  margin-top: 2px;
  white-space: nowrap;
}
.tbl .sub-red {
  display: block;
  font-size: 12px;
  color: #dc2626;
  font-weight: 600;
  margin-top: 2px;
  white-space: nowrap;
}
.tbl .qty-red {
  display: block;
  font-size: 12px;
  font-weight: 600;
  color: #dc2626;
  margin-top: 2px;
  white-space: nowrap;
}
.tbl td.col-prod { min-width: 132px; max-width: 240px; }
.tbl .cell-prod { white-space: normal; word-break: break-word; }
.tbl .cell-prod .p-code { white-space: nowrap; }
.tbl .cell-prod .p-spec { margin-left: 6px; color: #475569; }
.tbl .settle-red { color: #dc2626; font-weight: 600; white-space: nowrap; }
.tbl .settle-blue { color: #2563eb; font-weight: 600; white-space: nowrap; }
.auto-field input.stop-ship { color: #dc2626; font-weight: 700; }
.sum-card h2 { display: flex; align-items: baseline; gap: 8px; margin: 0 0 6px; }
.sum-card h2 .tblnote { font-size: 12px; font-weight: 400; }
.sum-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 10px;
  padding: 5px 0;
}
.sum-row > label { font-size: 13px; color: #475569; min-width: 44px; }
.sum-row select {
  width: auto;
  padding: 4px 8px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  font-size: 13px;
  background: #fff;
  min-width: 128px;
}
.sum-div { width: 1px; align-self: stretch; background: #e2e8f0; margin: 2px 3px; }
.sum-item { font-size: 13px; color: #475569; white-space: nowrap; }
.sum-item b { color: #0f172a; font-size: 14px; }
.sum-total { border-top: 1px dashed #cbd5e1; margin-top: 2px; padding-top: 10px; }
.sum-total .sum-item b { color: #1d4ed8; font-size: 15px; }
.sum-total .sum-un b { color: #dc2626; }
.imp-div { width: 1px; align-self: stretch; background: #e2e8f0; margin: 0 6px; }
.dash-stats { flex-wrap: wrap; }
.dash-stats .stat .num.danger { color: #dc2626; }
.legend { display: flex; gap: 16px; font-size: 12px; color: #475569; margin-bottom: 6px; }
.legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 5px; }
.legend i.s { background: #2563eb; }
.legend i.g { background: #16a34a; }
.chart { overflow-x: auto; padding: 6px 2px 10px; }
.ch-cols { display: flex; align-items: flex-end; gap: 12px; min-height: 190px; }
.ch-col { display: flex; flex-direction: column; align-items: center; gap: 3px; min-width: 46px; }
.ch-bars { display: flex; align-items: flex-end; gap: 3px; height: 170px; }
.ch-bar { display: block; width: 15px; border-radius: 3px 3px 0 0; }
.ch-bar.ch-s { background: #2563eb; }
.ch-bar.ch-g { background: #16a34a; }
.ch-bar.ch-neg { background: #dc2626; }
.ch-x { font-size: 12px; color: #475569; white-space: nowrap; }
.ch-n { font-size: 11px; color: #94a3b8; white-space: nowrap; }
.dim-grid { display: grid; grid-template-columns: 1fr; gap: 0; }
.dim-card h3 { margin: 0 0 10px; font-size: 15px; color: #14324a; }
.tbl tr.dim-total td { font-weight: 700; background: #f8fafc; border-top: 1px solid #e2e8f0; }
.tbl td.un { color: #dc2626; font-weight: 600; }
.auto-warn {
  margin-top: 8px;
  padding: 6px 10px;
  background: #fef2f2;
  border: 1px dashed #fca5a5;
  border-radius: 6px;
  color: #b91c1c;
  font-size: 12.5px;
  line-height: 1.5;
}
.auto-warn a { color: #b91c1c; text-decoration: underline; font-weight: 600; }
.nh-tip {
  position: fixed;
  z-index: 200;
  background: #0f172a;
  color: #fff;
  font-size: 12px;
  line-height: 1.4;
  padding: 4px 9px;
  border-radius: 6px;
  pointer-events: none;
  box-shadow: 0 6px 18px rgba(15, 23, 42, .28);
  white-space: normal;
  max-width: 340px;
}
.tbl .cell-note { max-width: 180px; word-break: break-word; }

button.accept-open {
  border: 1px solid #2563eb;
  color: #2563eb;
  background: #eff6ff;
  border-radius: 5px;
  padding: 2px 9px;
  cursor: pointer;
  font-size: 12px;
}
button.accept-open:hover { background: #dbeafe; }
.combo { position: relative; }
.combo input { padding-right: 32px; }
.combo select {
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  padding-right: 32px;
  cursor: pointer;
}
.combo .caret {
  position: absolute;
  right: 4px;
  top: 50%;
  transform: translateY(-50%);
  border: none;
  background: transparent;
  color: #64748b;
  cursor: pointer;
  font-size: 16px;
  font-weight: 400;
  line-height: 1;
  padding: 12px 8px;
}
.combo .caret:hover { color: #475569; }
.dlist {
  display: none;
  position: absolute;
  left: 0;
  right: 0;
  top: calc(100% + 2px);
  z-index: 60;
  background: #fff;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  max-height: 220px;
  overflow: auto;
  box-shadow: 0 8px 20px rgba(15, 23, 42, .12);
}
.dopt { padding: 6px 10px; cursor: pointer; border-bottom: 1px solid #f1f5f9; font-size: 13px; white-space: nowrap; }
.dopt:last-child { border-bottom: none; }
.dopt:hover { background: #eff6ff; }
.dopt b { color: #2563eb; margin-right: 6px; }
#centerTip {
  position: fixed;
  top: 45%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: rgba(255, 255, 255, .97);
  border: 1px solid #ef4444;
  color: #dc2626;
  padding: 18px 26px;
  border-radius: 10px;
  box-shadow: 0 12px 34px rgba(127, 29, 29, .25);
  z-index: 300;
  max-width: 82%;
  font-weight: 600;
  font-size: 15px;
  line-height: 1.8;
  white-space: pre-line;
}
.home-hero { text-align: center; padding: 10px 8px 4px; }
.home-hero h1 { margin: 0 0 6px; font-size: 24px; color: #14324a; }
.home-hero p { margin: 0; color: #64748b; font-size: 14px; }
.home-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(215px, 1fr));
  gap: 14px;
  margin-top: 20px;
}
/* 员工首页：功能模块 + 它自己的数据卡片，排成一行 */
.mod-row {
  display: flex;
  align-items: stretch;
  gap: 12px;
  flex-wrap: wrap;
  margin: 0 0 10px;
}
.mod-row .module-card { flex: 0 0 290px; max-width: 290px; margin: 0; }
.mod-row .stats { flex: 1 1 340px; margin: 0; align-items: stretch; gap: 12px; }
.mod-row .stat {
  flex: 1 1 auto;
  min-width: 140px;
  padding: 8px 16px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.mod-row .stat .num { font-size: 20px; line-height: 1.3; }
.mod-row .stat .lbl { font-size: 12px; }
/* 一个模块 = 一个整块（模块入口 + 数据 + 最近记录） */
.card.staff-block { padding: 14px 16px; }
.card.staff-block .block-title {
  font-size: 13px;
  color: #64748b;
  margin: 2px 0 6px;
  padding-top: 10px;
  border-top: 1px solid #edf2f7;
}
@media (max-width: 820px) {
  .mod-row .module-card { flex: 1 1 100%; max-width: none; }
  .mod-row .stats { flex: 1 1 100%; }
}
.module-card {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 15px 14px;
  background: #fff;
  border: 1px solid #dbe4ee;
  border-radius: 10px;
  text-decoration: none;
  color: #24303a;
  transition: box-shadow .15s, transform .15s, border-color .15s;
}
a.module-card:hover {
  box-shadow: 0 8px 18px rgba(15, 23, 42, .10);
  transform: translateY(-2px);
  border-color: #93c5fd;
  text-decoration: none;
}
.module-card .mod-ico {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 10px;
  background: #2563eb;
  color: #fff;
  font-size: 18px;
  font-weight: 700;
}
.module-card .mod-body {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
}
.module-card .mod-body b { font-size: 15px; }
.module-card .mod-body small {
  margin-top: 2px;
  color: #7c8b9c;
  font-size: 12px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.module-card .mod-go, .module-card .mod-tag {
  flex: 0 0 auto;
  font-style: normal;
  font-size: 12px;
}
.module-card .mod-go { color: #2563eb; }
.module-card.module-soon { background: #f1f5f9; cursor: not-allowed; }
.module-card.module-soon .mod-ico { background: #94a3b8; }
.module-card.module-soon .mod-tag { color: #94a3b8; }
.module-card.module-lock { background: #f8fafc; }
.module-card.module-lock .mod-ico { background: #94a3b8; }
.module-card.module-lock .mod-tag { color: #b45309; }
.price-line {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 18px;
  max-width: 900px;
}
.price-line span {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  white-space: nowrap;
}
.price-line b { font-weight: 600; }
.price-line input { width: 110px; }
.prod-form-line {
  display: flex;
  align-items: flex-end;
  flex-wrap: nowrap;
  gap: 10px;
  margin-bottom: 8px;
  width: 100%;
}
.prod-form-line span {
  display: flex;
  flex: 1 1 0;
  flex-direction: column;
  min-width: 0;
}
.prod-form-line label { margin: 0 0 3px; white-space: nowrap; }
.prod-form-line input,
.prod-form-line select {
  width: 100%;
  min-width: 0;
  padding: 5px 7px;
  border: 1px solid #cbd5e1;
  border-radius: 5px;
}
.prod-note { display: block; }
.prod-note span { width: 100%; }
.prod-filter {
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
  gap: 6px;
  margin-bottom: 12px;
  padding: 7px 10px;
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
}
.prod-filter label { margin: 0; white-space: nowrap; font-size: 13px; }
.prod-filter .prod-count {
  font-weight: 600;
  color: #0f766e;
  white-space: nowrap;
  margin-right: 4px;
}
.prod-filter select,
.prod-filter input {
  padding: 4px 6px;
  border: 1px solid #cbd5e1;
  border-radius: 5px;
  font-size: 13px;
}
.prod-filter select { width: 110px; }
.prod-filter input[name="code"] { width: 105px; }
.prod-filter input[name="kw"] { width: 150px; }
.prod-filter .btn { padding: 4px 11px; font-size: 13px; }
.prod-filter .combo.pcombo { width: 132px; }
.prod-filter .combo.pcombo input { width: 100%; box-sizing: border-box; padding: 5px 24px 5px 8px; font-size: 13px; }
.prod-filter .combo.pcombo .caret { right: 4px; }
.prod-filter .combo.pcombo .dlist { min-width: 110px; }
.price-filter { align-items: center; }
.price-filter .pf-item {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 4px;
}
.price-filter .pf-item > label { flex: 0 0 auto; }
.price-filter .pf-item .combo.pcombo,
.price-filter .pf-item select {
  flex: 1 1 auto;
  width: auto;
  min-width: 0;
}
.price-filter .pf-item .combo.pcombo { width: auto; }
.price-filter .pf-item .auto-pick {
  width: 100%;
  box-sizing: border-box;
}
.price-filter .pf-item select { width: 100%; }
.quote-filter {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
  margin-bottom: 8px;
}
.quote-filter .qf {
  flex: 1 1 0;
  min-width: 130px;
  padding: 5px 8px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  font-size: 13px;
}
.quote-filter .combo.qcombo {
  flex: 1 1 0;
  min-width: 150px;
  width: auto;
}
.quote-filter .qpick {
  width: 100%;
  box-sizing: border-box;
  padding: 5px 26px 5px 8px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  font-size: 13px;
}
.quote-filter .qreset {
  flex: 0 0 auto;
  padding: 5px 14px;
  font-size: 13px;
}
.import-form {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: nowrap;
  overflow-x: auto;
}
.import-form label { white-space: nowrap; font-size: 13px; }
.import-form select, .import-form input[type="file"] {
  padding: 4px 7px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  font-size: 13px;
  background: #fff;
}
.import-form input[type="text"] {
  padding: 4px 7px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  font-size: 13px;
  background: #fff;
  flex: 1 1 0;
  min-width: 110px;
}
.import-form select { max-width: none; min-width: 90px; flex: 1 1 0; }
.import-form input[type="file"] { max-width: none; min-width: 160px; flex: 1.6 1 200px; }
.import-form .btn, .import-form .btn-primary { white-space: nowrap; flex: 0 0 auto; }
.import-hint { margin: 6px 0 0; font-size: 12px; color: #64748b; }
.ov-cards { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; }
.ov-card {
  flex: 1 1 150px;
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  padding: 8px 10px;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.ov-card span { font-size: 12px; color: #64748b; }
.ov-card b { font-size: 17px; color: #0f172a; }
.ov-total-ok b { color: #166534; }
.ov-total-partial b { color: #92400e; }
.ov-total-bad b { color: #991b1b; }
.ov-badge { padding: 2px 9px; border-radius: 10px; font-size: 12px; white-space: nowrap; }
.ov-ok { background: #dcfce7; color: #166534; }
.ov-partial { background: #fef3c7; color: #92400e; }
.ov-bad { background: #fee2e2; color: #991b1b; }
.ov-only { white-space: nowrap; }
.pager {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  margin: 10px 0 4px;
}
.pager .pager-info { font-size: 13px; color: #475569; }
.pager .btn-mini-btn[disabled] { opacity: .45; cursor: default; }
a.btn-mini-btn { text-decoration: none; display: inline-block; }
.tbl-wrap { overflow-x: auto; }
/* 表格太宽时（如工资条：一列一个项目）在这一层横向滚动，别顶出卡片 */
.tblwrap { overflow-x: auto; max-width: 100%; }
.adj-input::placeholder { font-size: 12px; color: #94a3b8; }
.bind-cell label.chk {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin: 2px 14px 2px 0;
  font-size: 13px;
  white-space: nowrap;
}
.grid .combo.pcombo { width: 100%; }
.grid .combo.pcombo .auto-pick { width: 100%; box-sizing: border-box; }
.ship-prod-opt {
  display: flex;
  justify-content: flex-start;
  gap: 8px;
}
.ship-prod-opt .sp-code { font-weight: 600; color: #0f172a; }
.ship-prod-opt .sp-spec { color: #475569; }
.auto-card {
  background: #f0f9ff;
  border: 1px dashed #7dd3fc;
  border-radius: 8px;
  padding: 10px 12px;
  margin: 8px 0;
}
.auto-head {
  display: flex;
  align-items: center;
  gap: 8px;
  font-weight: 600;
  color: #0369a1;
  margin-bottom: 8px;
}
.auto-head .auto-hint { font-weight: 400; font-size: 12px; color: #0284c7; }
.auto-field label { color: #0369a1; }
.auto-field input { background: #f8fdff; border-color: #7dd3fc; }
#shipProdTable.colhide-code .col-code,
#shipProdTable.colhide-name .col-name,
#shipProdTable.colhide-spec .col-spec,
#shipProdTable.colhide-size .col-size,
#shipProdTable.colhide-weight .col-weight,
#shipProdTable.colhide-group_name .col-group_name,
#shipProdTable.colhide-memo .col-memo,
#shipProdTable.colhide-ops .col-ops { display: none !important; }
#shipProdTable .colsel { display: none; }
#shipProdTable.ship-sel .colsel { display: table-cell; }
#shipOrdTable .colsel { display: none; }
#shipOrdTable.ship-sel .colsel { display: table-cell; }

.zone-block {
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  padding: 8px 10px;
  margin-bottom: 10px;
  background: #fff;
}
.zone-head {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 6px;
}
.zone-head b { color: #0f766e; font-size: 14px; }
.zone-head .zone-names {
  color: #64748b;
  font-size: 12px;
  flex: 1;
  min-width: 180px;
}
.zone-head .zone-bulk {
  width: 110px;
  padding: 4px 7px;
  border: 1px solid #cbd5e1;
  border-radius: 5px;
  font-size: 13px;
}
.zone-head .zone-apply { padding: 4px 10px; font-size: 13px; }

.prov-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  padding: 3px 7px;
  background: #f8fafc;
  cursor: move;
}
.prov-chip .prov-name {
  font-size: 12px;
  color: #334155;
  white-space: nowrap;
}
.prov-chip .prov-amt {
  width: 68px;
  padding: 3px 5px;
  border: 1px solid #cbd5e1;
  border-radius: 4px;
  font-size: 12px;
}
.zone-body { min-height: 42px; }

/* ===== 首页「待办 / 提醒」板块 ===== */
/* 出生日期：公历日期框下面一行「农历」月 / 日 下拉 */
.hr-lunar { display: flex; align-items: center; gap: 4px; margin-top: 4px; }
.hr-lunar select { width: auto; padding: 2px 4px; font-size: 12.5px; }
.hr-lunar-lb { color: #64748b; font-size: 12.5px; flex: 0 0 auto; }
.hr-lunar-tip { color: #94a3b8; font-size: 12px; white-space: nowrap; }
.todo-board { margin-top: 18px; }
.todo-board h2 { margin: 0 0 10px; }
.todo-groups { display: flex; gap: 14px; flex-wrap: wrap; }
.todo-group {
  flex: 1 1 320px; min-width: 260px;
  border: 1px solid #e2e8f0; border-radius: 8px;
  padding: 10px 12px 6px; background: #f8fafc;
}
.todo-gname { font-weight: 600; color: #14324a; margin-bottom: 6px; }
.todo-item {
  display: flex; align-items: center; gap: 8px;
  padding: 6px 8px; margin-bottom: 6px;
  border: 1px solid #e2e8f0; border-radius: 6px;
  background: #fff; text-decoration: none; color: #24303a; line-height: 1.5;
}
.todo-item:hover { border-color: #93c5fd; background: #f0f7ff; }
.todo-dot {
  flex: 0 0 auto; width: 7px; height: 7px; border-radius: 50%;
  background: #f59e0b;
}
.todo-txt { flex: 1 1 auto; word-break: break-word; }
.todo-num { flex: 0 0 auto; color: #dc2626; font-weight: 700; }
.todo-go { flex: 0 0 auto; color: #2563eb; font-style: normal; font-size: 12.5px; white-space: nowrap; }

/* ===== 手机端：顶部锁定区不吸顶 =====
   手机上顶栏+标题+筛选占满整屏，吸顶后表格内容看不到，所以在窄屏/手机上取消锁定 */
@media (max-width: 820px) {
  .sticky-top { position: static; }
  .req-top,
  .mg-sticky { position: static; top: auto; box-shadow: none; }
}
/* 用浏览器识别到是手机时（含「桌面版网站」模式）同样取消锁定 */
html.is-phone .sticky-top { position: static; }
html.is-phone .req-top,
html.is-phone .mg-sticky { position: static; top: auto; box-shadow: none; }


/* 页内页签（薪资/绩效/福利、自动化推送等共用） */
.ptabs{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 12px}
.ptabs a{padding:7px 15px;border:1px solid #d7dee7;background:#fff;border-radius:8px;
  font-size:13.5px;color:#33475b;text-decoration:none;font-weight:500;white-space:nowrap}
.ptabs a:hover{background:#f1f5f9}
.ptabs a.active{background:#1d4ed8;border-color:#1d4ed8;color:#fff;font-weight:600}
.ptabs a .dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-left:6px;
  vertical-align:middle}
.ptabs a .dot.on{background:#16a34a}
.ptabs a .dot.off{background:#cbd5e1}
.ptabs a.active .dot.on{background:#86efac}
.ptabs a.active .dot.off{background:#e2e8f0}

/* 员工端「我的预估工资」：跟管理端考核组那张表一个样子，但只读、不能改 */
.est-card .est-head{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
  margin-bottom:6px}
.est-card .est-note{font-size:12.5px;color:#64748b;line-height:1.65;margin:0 0 8px}
.est-card .est-note b{color:#33475b}
.est-card .est-blank{background:#fffbeb;border:1px solid #fde68a;border-radius:6px;
  padding:6px 9px;color:#92400e;margin:0 0 8px;font-size:12.5px}
.est-card .est-wrap{overflow-x:auto}
.est-table{width:100%;border-collapse:collapse}
.est-table th,.est-table td{border-bottom:1px solid #edf2f7;border-right:1px solid #eef2f7;
  padding:6px 8px;text-align:center;white-space:nowrap;font-size:12.5px;color:#24303a;
  vertical-align:middle}
.est-table thead th{border-top:1px solid #e2e8f0;background:#f8fafc;color:#4a5b6b;
  font-weight:600}
.est-table th:first-child,.est-table td:first-child{border-left:1px solid #eef2f7}
.est-table th.gstart,.est-table td.gstart{border-left:1px solid #cbd5e1}
.est-table tr:last-child td{border-bottom:1px solid #e2e8f0}
.est-table thead tr.est-grow th.gg{background:#f8fafc;color:#64748b;font-size:12px;
  font-weight:600;padding:3px 6px}
.est-table td.pname{text-align:left;background:#fbfcfe;white-space:nowrap}
.est-table td.est-empty{color:#b6c2cd}
.est-table td.est-neg{color:#dc2626}
.est-table td.est-total{background:#f8fafc;font-weight:700;color:#14324a;font-size:13px}
/* 备注：不在表格里占列了，放在表格下面单独一行，红色加粗 */
.est-card .est-noteline{margin:10px 0 0;font-size:13px;line-height:1.8;color:#dc2626;
  font-weight:700;white-space:pre-wrap;word-break:break-word}
/* 表格下面的说明：跟管理端考核组的说明同步过来（这里只看，不能改） */
.est-card .est-memo{margin:12px 0 0;border-top:1px dashed #e6ebf1;padding-top:8px}
.est-card .est-memo-h{font-size:12.5px;color:#64748b;margin-bottom:4px}
.est-card .est-memo-h b{color:#33475b}
.est-memo-line{display:flex;align-items:flex-start;gap:0;font-size:12.5px;line-height:1.75;
  color:#3f4c59}
.est-memo-no{flex:0 0 auto;color:#5c6b7a;white-space:nowrap}
.est-memo-txt{flex:1 1 auto;min-width:0;white-space:pre-wrap;word-break:break-word}
.est-memo-extra{margin-top:6px;border-top:1px dashed #e6ebf1;padding-top:6px;color:#64748b}
/* 绩效数据录入：一人一张卡片，左边填、右边看算出来的结果 */
.pfc-bar { display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  margin: 0 0 10px; }
.pfc-bar-b { margin: 14px 0 0; }
.pfc-chk { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px;
  color: #475569; margin-right: auto; }
.pfc { padding: 12px 16px 14px; }
.pfc-h { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
  padding-bottom: 8px; margin-bottom: 10px; border-bottom: 1px solid #eef2f7; }
.pfc-h b { font-size: 15px; color: #14324a; }
.pfc-h .muted { font-size: 12px; }
.pfc-badge { margin-left: auto; font-size: 12.5px; color: #0f766e; background: #f0fdfa;
  border: 1px solid #ccece6; border-radius: 20px; padding: 3px 12px; white-space: nowrap; }
.pfc-badge b { font-size: 14px; }
.pfc-b { display: flex; gap: 18px; align-items: flex-start; flex-wrap: wrap; }
.pfc-fbox { flex: 1 1 620px; min-width: 0; }
.pfc-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 3px 0; }
.pfc-g { flex: 0 0 52px; font-size: 12.5px; color: #64748b; font-weight: 600; }
.pfc-g-on { color: #2563eb; }
.pfc-row + .pfc-row { border-top: 1px dashed #f1f5f9; }
.pfc-f { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px;
  color: #475569; }
.pfc-f span { white-space: nowrap; }
.pfc input.pfin { width: 92px; height: 28px; padding: 0 7px; border: 1px solid #dbe3ec;
  border-radius: 6px; text-align: right; font-size: 12.5px; font-family: inherit;
  color: #14324a; }
.pfc input.pfin-note { width: 160px; text-align: left; }
.pfc input.pfin:focus { outline: none; border-color: #93c5fd;
  box-shadow: 0 0 0 3px rgba(147, 197, 253, .22); }
.pfc-sum { flex: 0 0 232px; border: 1px solid #e6f4f1; background: #f7fdfc;
  border-radius: 10px; padding: 10px 12px; }
.pfc-sumt { font-size: 12px; color: #0f766e; margin-bottom: 6px; }
.pfc-s { display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; font-size: 12.5px; color: #475569; padding: 3px 0;
  border-bottom: 1px dashed #e6f4f1; }
.pfc-s:last-child { border-bottom: none; }
.pfc-s b { color: #0f766e; font-size: 13.5px; white-space: nowrap; }
.pfc-pf { display: flex; align-items: center; justify-content: space-between; gap: 8px;
  font-size: 12.5px; color: #475569; padding: 2px 0; }
.pfc-pf span { white-space: nowrap; }
.pfc-pf input.pfin { width: 96px; }
.pfc-pf input.pfin-note { width: 96px; text-align: left; }
@media (max-width: 1000px) { .pfc-sum { flex: 1 1 100%; } }
/* 绩效录入：组 / 项目维护面板 */
.pchip-g { padding: 2px 4px 2px 8px; }
/* 页签后面那一行「平台」：紧凑一点，输入框刚好放下字 */
.pcfgrow-plat { display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  background: #f8fafc; border: 1px solid #eef2f7; border-radius: 8px;
  padding: 5px 10px; margin: 0 0 10px; }
.pcfgrow-plat .pcfglbl { flex: 0 0 auto; font-size: 12.5px; }
.pcfgrow-plat .pchip { padding: 1px 3px 1px 6px; }
.pcfgrow-plat .pchip-in { width: 62px; height: 22px; font-size: 12.5px; }
.pcfgrow-plat .pchip-x { font-size: 13px; }
.pcfgrow-plat .pcfgadd { margin-left: 4px; }
.pcfgrow-plat .pcfgadd input[type="text"] { width: 104px; height: 26px;
  padding: 0 6px; font-size: 12.5px; }
.pcfgrow-plat .pcfgadd .btn,
.pcfgrow-plat > .btn { padding: 2px 8px; font-size: 12.5px; height: 26px; }
/* 组（店铺）上的 × 平时不显示：点「－ 减店铺」才出来，防止误删 */
.pchip-g .pchip-x { display: none; }
.pcfgrow.pdel .pchip-g { opacity: .9; }
.pcfgrow.pdel .pchip-g .pchip-x { display: inline-block; }
.pchip-n { cursor: pointer; color: #1d4ed8; }
.pchip-n:hover { text-decoration: underline; }
.pmod-b { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.pmod-mask[hidden] { display: none !important; }
.pmod-add { margin-top: 10px; display: flex; align-items: center; gap: 6px; }
.pmod-add input[type="text"] { width: 200px; height: 28px; padding: 0 8px; font-size: 12.5px; }
.pmod-add .btn { padding: 3px 10px; font-size: 12.5px; }
.pcfg-h { font-size: 14px; font-weight: 600; color: #14324a; margin-bottom: 8px;
  display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.pcfg-h .muted { font-weight: 400; font-size: 12px; }
.pcfgrow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 4px 0; }
.pcfgrow + .pcfgrow { border-top: 1px dashed #eef2f7; }
.pcfglbl { flex: 0 0 52px; font-size: 12.5px; color: #64748b; font-weight: 600; }
.pchip { display: inline-flex; align-items: center; gap: 2px; background: #f8fafc;
  border: 1px solid #e6ebf1; border-radius: 7px; padding: 2px 4px 2px 6px; }
.pchip-in { width: 132px; height: 24px; padding: 0 4px; border: none; background: transparent;
  font-size: 12.5px; color: #33475b; font-family: inherit; }
.pchip-in:focus { outline: none; background: #fff; box-shadow: 0 0 0 2px #93c5fd; }
.pchip-x { border: none; background: none; color: #b91c1c; font-size: 14px;
  line-height: 1; cursor: pointer; padding: 0 2px; }
.pcfgadd { display: inline-flex; align-items: center; gap: 6px; margin-left: 6px;
  flex-wrap: nowrap; }
.pcfgadd input[type="text"], .pcfgadd select, .pcfgadd .btn { flex: 0 0 auto; }
.pcfgadd .btn { white-space: nowrap; }
.pcfgadd input[type="text"] { width: 190px; height: 28px; padding: 0 8px; font-size: 12.5px; }
.pcfgadd .btn { padding: 3px 10px; font-size: 12.5px; }
/* 「－ 减店铺」跟「＋ 加店铺」一样高矮，排在它右边 */
.pcfgrow > .btn { padding: 3px 10px; font-size: 12.5px; line-height: normal; }
/* 汇总页的「汇总项」：勾选框 + 名字，宽度刚好放得下字 */
.psum { display: inline-flex; align-items: center; gap: 3px; background: #f8fafc;
  border: 1px solid #e6ebf1; border-radius: 7px; padding: 0 6px; height: 24px;
  box-sizing: border-box; margin: 0; cursor: pointer; line-height: 1;
  font-size: 12.5px; color: #33475b; }
.psum form { display: inline-flex; align-items: center; margin: 0; height: 14px; }
.psum input[type="checkbox"] { width: 14px; height: 14px; margin: 0;
  display: block; cursor: pointer; accent-color: #1d4ed8; }
.psum-t { white-space: nowrap; }
/* 自动算出来的两项（净销售额 / 转化率）换个颜色，跟录入项区分开 */
.psum.psum-calc { background: #fffbeb; border-color: #fcd34d; color: #92400e; }
.psum.psum-calc input[type="checkbox"] { accent-color: #d97706; }
th.th-calc { background: #fffbeb; color: #92400e; }
td.pfro-calc { background: #fffdf5; color: #92400e; }
/* 扣除项的数值一律标蓝（是 0 也标蓝） */
td.pfro-minus { color: #1d4ed8; }
th.th-minus { color: #1d4ed8; }
/* 汇总表：手改过的数值标红，双击可以改 */
td.pfro-manual { color: #dc2626; font-weight: 600; }
td.pfro[data-sum] { cursor: cell; }
td.pfro[data-sum]:hover { background: #f1f5f9; }
td.pfro-manual:hover { background: #fef2f2; }
.sumin { width: 72px; height: 24px; padding: 0 4px; font-size: 12.5px;
  border: 1px solid #93c5fd; border-radius: 6px; text-align: right;
  font-family: inherit; color: #33475b; }
/* 最右边两列（提成 / 总销售额）：不分平台，占两行 */
th.th-total { background: #eef6ff; color: #1d4ed8; }
td.pfro-total { background: #f7fbff; font-weight: 600; }
.psum-rate { width: 48px; height: 24px; padding: 0 4px; font-size: 12.5px;
  border: 1px solid #d8dee6; border-radius: 6px; background: #fff; color: #33475b;
  font-family: inherit; text-align: right; }
.psum-rate:focus { outline: none; box-shadow: 0 0 0 2px #93c5fd; }
/* 绩效录入：自动保存的提示 */
.pfauto { margin-left: 10px; font-size: 12px; color: #15803d; font-weight: 600; }
.pfauto.bad { color: #b91c1c; }
/* 实发工资按保底算时，下面那行小字（合计工资） */
.minw-sub { font-size: 11px; color: #1d4ed8; font-weight: 400; line-height: 1.2;
  margin-top: 1px; }
td.sumcell { cursor: help; }
/* 信息设置：保底工资 一行放 3 个人 */
.minw-list { display: flex; flex-wrap: wrap; gap: 4px 10px; margin: 4px 0 2px; }
.minw-row { display: flex; align-items: center; gap: 6px; flex-wrap: nowrap;
  flex: 0 0 calc(33.333% - 7px); max-width: calc(33.333% - 7px);
  padding: 2px 0; }
.minw-row > b { flex: 0 0 56px; color: #14324a; font-size: 12.5px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* 这一块要紧凑：人员 / 金额 / 按钮 排一行，控件都一样高 */
.minw-card p.muted { font-size: 12px; line-height: 1.45; margin: 0 0 6px; }
.minw-card .attline, .minw-card .minw-row { flex-wrap: nowrap; margin: 3px 0;
  gap: 6px; font-size: 12.5px; }
.minw-card .minw-row { padding: 2px 0; }
.minw-card .minw-row > b { flex: 0 0 56px; font-size: 12.5px; }
.minw-card select { width: 150px; height: 26px; padding: 0 6px; font-size: 12.5px;
  line-height: 24px; box-sizing: border-box; flex: 0 0 auto; }
.minw-card .attnum { width: 84px; }
.minw-card .minw-row .btn { padding: 0 8px; font-size: 12px; }
.minw-card .btn, .minw-card .btn-primary { height: 26px; padding: 0 10px;
  font-size: 12.5px; line-height: 1; display: inline-flex; align-items: center;
  justify-content: center; box-sizing: border-box; flex: 0 0 auto; }
/* 项目上的「＋ / －」：－ 表示这一项要从总销售额里扣掉 */
.psign { border: none; background: none; cursor: pointer; padding: 0 1px;
  font-size: 13px; line-height: 1; color: #94a3b8; font-family: inherit; }
.psign:hover { color: #1d4ed8; }
.psign.on { color: #b91c1c; font-weight: 700; }
.psum-row .pcfglbl { flex: 0 0 72px; }
.psum-row { padding: 1px 0; }
.psum-row + .psum-row { border-top: none; }
.psum-row .pcfgadd { margin-left: 0; }
.pcfgadd select { width: 140px; height: 28px; padding: 0 6px; font-size: 12.5px;
  border: 1px solid #d8dee6; border-radius: 7px; background: #fff; color: #33475b;
  font-family: inherit; }

/* 绩效数据录入：一张简表（跟全员表一个样式） */
table.pfgrid { border-collapse: collapse; }
table.pfgrid { width: 100%; table-layout: auto; }
table.pfgrid th, table.pfgrid td {
  border: 1px solid #e2e8f0; padding: 0; text-align: center; vertical-align: middle;
  background: #fff;
}
table.pfgrid thead th {
  background: #f1f5f9; color: #33475b; font-size: 12.5px; font-weight: 600;
  padding: 6px 4px; white-space: normal; word-break: break-word; line-height: 1.35;
}
table.pfgrid td.pname { text-align: left; padding: 8px 12px; background: #fbfcfe;
  white-space: nowrap; font-size: 13px; min-width: 62px; }
/* 列多的时候不往外跑：格子自己缩窄（实在放不下才在卡片里横向滚） */
table.pfgrid td.cell { min-width: 0; }
table.pfgrid input.pfin {
  width: 100%; height: 34px; padding: 0 4px; border: none; background: transparent;
  text-align: center; font-size: 12.5px; color: #24303a; font-family: inherit;
  box-sizing: border-box;
}
table.pfgrid input.pfin:hover { background: #f8fafc; }
table.pfgrid input.pfin:focus {
  outline: none; background: #fff; box-shadow: inset 0 0 0 2px #93c5fd;
}
/* 页签那一行右侧：新增平台 / 加平台 / 减平台（保持一行、矮一点） */
.ptabs { align-items: center; }
.ptab { display: inline-flex; align-items: center; }
.ptab .pchip-x { display: none; }
.ptabs.pdel .ptab .pchip-x { display: inline-block; }
.ptabs .ptab-tools { margin-left: auto; display: inline-flex; align-items: center;
  gap: 6px; }
.ptabs .ptab-tools input[type="text"] { width: 104px; height: 28px; padding: 0 6px;
  font-size: 12.5px; }
.ptabs .ptab-tools .btn, .ptabs .ptab-tools button {
  padding: 3px 10px; font-size: 12.5px; height: 28px; }
/* 「汇总」页签：黄底 + 加粗，而且永远排在最后一个 */
.ptabs .ptab-sum a { background: #fffbeb; border-color: #fcd34d; color: #b45309;
  font-weight: 700; }
.ptabs .ptab-sum a:hover { background: #fef3c7; border-color: #f59e0b; }
.ptabs .ptab-sum a.active { background: #f59e0b; border-color: #f59e0b; color: #fff;
  font-weight: 700; }
/* 员工端「我的工资条」：格子压紧一点，项目多时也尽量不用左右拖 */
.tbl.paytable th, .tbl.paytable td { padding: 5px 6px; font-size: 13px; }
.tbl.paytable .objin { width: 118px; }
.tbl.paytable td.pncell, .tbl.paytable th { max-width: 150px; }
