:root {
  --bg: #f5f6f8;
  --card: #ffffff;
  --border: #e6e8eb;
  --tx: #1f2329;
  --tx2: #6b7280;
  --tx3: #9ca3af;
  --pri: #185fa5;
  --pri-soft: #e6f1fb;
  --ok: #0f6e56;
  --ok-soft: #e1f5ee;
  --warn: #854f0b;
  --warn-soft: #faeeda;
  --red: #a32d2d;
  --red-soft: #fcebeb;
  --radius: 10px;
  --shadow: 0 1px 3px rgba(0,0,0,.06);
  --font: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;

  /* ---- 字号阶梯（唯一口径：全站只用这 7 档；▸ × + 等图形符号尺寸除外）---- */
  --fs-xs: 11px;    /* 极小辅助：角标、拖选提示 */
  --fs-sm: 12px;    /* 辅助信息：标签、表头、meta */
  --fs-md: 13px;    /* 紧凑正文：表格、列表、看板卡片 */
  --fs-base: 14px;  /* 正文基准：输入框、按钮、正文 */
  --fs-lg: 16px;    /* 标题：卡片标题、顶栏 logo */
  --fs-xl: 18px;    /* 大标题：弹窗标题 */
  --fs-2xl: 22px;   /* 特大：登录页标题、统计数字 */
}
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body {
  font-family: var(--font);
  background: var(--bg);
  color: var(--tx);
  font-size: var(--fs-base);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
}
a { color: var(--pri); text-decoration: none; }
button { font-family: inherit; font-size: inherit; }
small { font-size: var(--fs-xs); }

/* ---------- 登录页 ---------- */
#loginPage {
  min-height: 100vh; display: flex; align-items: center; justify-content: center;
  padding: 20px;
}
.login-box {
  width: 100%; max-width: 360px; background: var(--card); border: 1px solid var(--border);
  border-radius: 14px; padding: 32px 28px; box-shadow: var(--shadow);
}
.login-box h1 { margin: 0 0 4px; font-size: var(--fs-2xl); font-weight: 600; }
.login-box .sub { color: var(--tx2); font-size: var(--fs-md); margin-bottom: 22px; }
.login-box label { display: block; font-size: var(--fs-sm); color: var(--tx2); margin: 12px 0 4px; }
.login-box .err { color: var(--red); font-size: var(--fs-sm); margin-top: 10px; min-height: 16px; }

/* ---------- 备案号页脚 ---------- */
.icp-foot { text-align: center; padding: 14px 0 4px; font-size: var(--fs-sm); color: var(--tx3); }
.icp-foot a { color: var(--tx3); }
.icp-foot a:hover { color: var(--pri); }
#loginPage .icp-foot { position: fixed; left: 0; right: 0; bottom: 12px; padding: 0; }

/* ---------- 通用控件 ---------- */
input, select, textarea {
  width: 100%; padding: 8px 10px; border: 1px solid var(--border); border-radius: 8px;
  font-size: var(--fs-base); font-family: inherit; color: var(--tx); background: #fff; outline: none;
}
input:focus, select:focus, textarea:focus { border-color: var(--pri); }
input[readonly] { background: #f3f4f6; }
textarea { resize: vertical; min-height: 56px; }
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 4px;
  padding: 8px 16px; border-radius: 8px; border: 1px solid var(--border);
  background: #fff; color: var(--tx); font-size: var(--fs-base); cursor: pointer; transition: .15s;
}
.btn:hover { border-color: var(--pri); color: var(--pri); }
.btn.pri { background: var(--pri); border-color: var(--pri); color: #fff; }
.btn.pri:hover { background: #0f4a83; }
.btn.ok { background: var(--ok); border-color: var(--ok); color: #fff; }
.btn.dgr { color: var(--red); }
.btn.dgr:hover { border-color: var(--red); background: var(--red-soft); }
.btn.sm { padding: 4px 10px; font-size: var(--fs-md); border-radius: 6px; }
.btn[disabled] { opacity: .5; cursor: not-allowed; }
.row { display: flex; gap: 12px; flex-wrap: wrap; }
.row > div { flex: 1; min-width: 140px; }
.row label { display: block; font-size: var(--fs-sm); color: var(--tx2); margin-bottom: 4px; }

/* ---------- 布局 ---------- */
#app { display: none; min-height: 100vh; }
#app.on { display: block; }
.topbar {
  position: sticky; top: 0; z-index: 20; background: var(--card); border-bottom: 1px solid var(--border);
  height: 54px; display: flex; align-items: center; padding: 0 16px; gap: 12px;
}
.topbar .logo { font-size: var(--fs-lg); font-weight: 600; color: var(--pri); white-space: nowrap; }
.topbar .spacer { flex: 1; }
.topbar .who { font-size: var(--fs-md); color: var(--tx2); }

.layout { display: flex; }
.sidebar {
  width: 180px; flex-shrink: 0; background: var(--card); border-right: 1px solid var(--border);
  min-height: calc(100vh - 54px); padding: 12px 8px; position: sticky; top: 54px;
}
.sidebar a {
  display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-radius: 8px;
  color: var(--tx2); font-size: var(--fs-base); margin-bottom: 2px;
}
.sidebar a:hover { background: var(--pri-soft); color: var(--pri); }
.sidebar a.on { background: var(--pri-soft); color: var(--pri); font-weight: 600; }
.main { flex: 1; min-width: 0; padding: 20px; }
.menu-icon { width: 18px; text-align: center; }

/* ---------- 卡片 ---------- */
.card {
  background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);
  padding: 16px; margin-bottom: 16px; box-shadow: var(--shadow);
}
.card h2 { margin: 0 0 12px; font-size: var(--fs-lg); font-weight: 600; }
.card h3 { margin: 0 0 8px; font-size: var(--fs-base); font-weight: 600; }
.toolbar { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-bottom: 12px; }
.toolbar .spacer { flex: 1; }

/* ---------- 表格 ---------- */
table { width: 100%; border-collapse: collapse; font-size: var(--fs-md); }
th, td { text-align: left; padding: 8px 10px; border-bottom: 1px solid var(--border); }
th { color: var(--tx2); font-weight: 500; font-size: var(--fs-sm); white-space: nowrap; background: #f7f8fa; }
td.n, th.n { text-align: right; font-variant-numeric: tabular-nums; }
tr:last-child td { border-bottom: none; }
tbody tr:hover { background: #fafbfc; }
.empty { color: var(--tx3); text-align: center; padding: 24px; }

/* ---------- 标签 ---------- */
.tag { display: inline-block; padding: 1px 8px; border-radius: 20px; font-size: var(--fs-sm); font-weight: 500; background: #eef0f2; color: var(--tx2); white-space: nowrap; }
.tag.pri { background: var(--pri-soft); color: var(--pri); }
.tag.ok { background: var(--ok-soft); color: var(--ok); }
.tag.warn { background: var(--warn-soft); color: var(--warn); }
.tag.red { background: var(--red-soft); color: var(--red); }
.tag.sew { background: #f3e8fd; color: #6b21a8; }   /* 无骨缝头（外发） */
.tag.cxl { background: #eceef1; color: #7d8590; }   /* 已取消（客人取消制作） */

/* ---------- 进度条 ---------- */
.segs { display: flex; gap: 6px; flex-wrap: wrap; margin: 8px 0; }
.seg { flex: 1; min-width: 90px; background: #f3f4f6; border-radius: 6px; padding: 6px 8px; }
.seg .bar { height: 6px; background: #e5e7eb; border-radius: 3px; overflow: hidden; margin-top: 4px; }
.seg .bar i { display: block; height: 100%; background: var(--pri); }
.seg .bar i.ok { background: var(--ok); }
.seg .lbl { font-size: var(--fs-xs); color: var(--tx2); display: flex; justify-content: space-between; }
.seg .lbl b { color: var(--tx); }

/* ---------- 工序按钮（报工） ---------- */
.procs { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; }
.proc {
  padding: 8px 14px; border: 1px solid var(--border); border-radius: 8px; cursor: pointer;
  background: #fff; text-align: center; min-width: 72px; user-select: none; transition: .15s;
}
.proc b { display: block; font-size: var(--fs-base); }
.proc span { font-size: var(--fs-xs); color: var(--tx2); }
.proc.on { border-color: var(--pri); background: var(--pri-soft); color: var(--pri); }
.proc.on span { color: var(--pri); }
.proc.done { border-color: var(--ok); background: var(--ok-soft); }
.proc.done b, .proc.done span { color: var(--ok); }
/* 样品阶段跳过工序（11-04）：虚线黄底 + 「已跳过」，旁边给「恢复」 */
.proc.skipped { border-style: dashed; border-color: #f59e0b; background: #fffbeb; }
.proc.skipped b { color: #b45309; }
.proc.skipped .skptx { color: #b45309; font-weight: 600; }
.proc .skpa { margin-left: 7px; font-size: var(--fs-xs); color: var(--pri); text-decoration: none; white-space: nowrap; }
.proc .skpa:hover { text-decoration: underline; }
.bitem .skip-b { margin-top: 3px; font-size: var(--fs-xs); color: #b45309; background: #fffbeb;
  border: 1px dashed #fcd34d; border-radius: 6px; padding: 2px 7px; display: inline-block; max-width: 100%; }

/* ---------- 手工做法多选 chip ---------- */
.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip {
  padding: 6px 12px; border: 1px solid var(--border); border-radius: 20px; cursor: pointer;
  background: #fff; font-size: var(--fs-md); user-select: none; transition: .15s;
}
.chip small { color: var(--tx3); }
.chip.on { border-color: var(--pri); background: var(--pri-soft); color: var(--pri); }
.chip.on small { color: var(--pri); }

/* ---------- 订单搜索下拉（报工） ---------- */
.ord-drop {
  position: absolute; left: 0; right: 0; top: 100%; z-index: 40; margin-top: 2px;
  background: #fff; border: 1px solid var(--border); border-radius: 8px;
  max-height: 280px; overflow-y: auto; display: none; box-shadow: 0 4px 14px rgba(0,0,0,.1);
}
.ord-drop.on { display: block; }
.ord-item { padding: 8px 12px; cursor: pointer; border-bottom: 1px solid var(--border); font-size: var(--fs-md); }
.ord-item:last-child { border-bottom: none; }
.ord-item:hover { background: var(--pri-soft); }
.ord-item .sub { color: var(--tx2); font-size: var(--fs-sm); }
.ord-item.has-thumb { display: flex; gap: 10px; align-items: center; }
.ord-item .ord-thumb {
  width: 38px; height: 38px; object-fit: cover; border-radius: 6px;
  border: 1px solid var(--border); flex: none;
}
.ord-item .ord-thumb.ph { display: block; background: #f3f4f6; border-style: dashed; }
.ord-item .ord-main { min-width: 0; flex: 1; }

/* ---------- 报工页：款式图 + 信息备注 ---------- */
.r-imgbox { margin-bottom: 12px; }
.r-imgbox-in {
  display: flex; gap: 14px; align-items: flex-start; flex-wrap: wrap;
  background: var(--pri-soft); border-radius: 8px; padding: 10px;
}
img.r-img {
  width: 190px; max-width: 100%; border-radius: 6px; border: 1px solid var(--border);
  cursor: zoom-in; display: block; background: #fff;
}
img.r-img:hover { border-color: var(--pri); }
.r-noimg {
  width: 190px; padding: 20px 10px; text-align: center; font-size: var(--fs-sm); color: var(--tx3);
  border: 1px dashed var(--border); border-radius: 6px; background: #fff; line-height: 1.7;
}
.r-noimg span { font-size: var(--fs-xs); }
.r-imginfo { flex: 1; min-width: 220px; font-size: var(--fs-md); }
.r-imginfo .sub { color: var(--tx2); font-size: var(--fs-sm); margin: 4px 0 6px; }
/* 报工页：款式图右侧的订单信息块（面板里的信息直接铺开；原来要点「打开这张单」） */
.r-ordinfo { margin-top: 6px; }
.r-kvs { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 0 18px; }
.r-kvs .om-kv { padding: 3px 0; }
.r-kvs .om-kv > span { width: 68px; font-size: var(--fs-sm); }
.r-kvs .om-kv > b { font-size: var(--fs-base); }
.r-kvs .r-wide { grid-column: 1 / -1; }
.r-ordops { margin-top: 10px; display: flex; gap: 8px; flex-wrap: wrap; }

/* ---------- 款式图缩略图 ---------- */
img.thumb {
  width: 46px; height: 46px; object-fit: cover; border-radius: 6px;
  border: 1px solid var(--border); cursor: pointer; display: block;
}
img.thumb:hover { border-color: var(--pri); }
.img-box { margin-top: 8px; }
.img-box img { max-width: 160px; border-radius: 8px; border: 1px solid var(--border); }

/* ---------- 看板 ---------- */
.board-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; }
.bcol { background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.bcol-head { padding: 10px 14px; background: #fff; color: var(--tx); border-top: 2px solid #e2e8f0; border-bottom: 1px solid var(--border); font-weight: 600; display: flex; justify-content: space-between; align-items: center; }
.bcol-head .cnt { font-size: var(--fs-xs); font-weight: 500; color: var(--tx2); background: #f1f3f5; border-radius: 10px; padding: 1px 8px; }
.bitem { padding: 8px 14px; border-top: 1px solid var(--border); font-size: var(--fs-md); }
.bitem .no { font-weight: 600; }
.bitem .meta { color: var(--tx2); font-size: var(--fs-sm); }
/* 「拍照/寄样」是记录环节：浅绿底、不打点按钮醒目；拆成两列后「待寄样」用蓝色区分（寄出后会自动进出货对账） */
.bcol.smp-col > .bcol-head { border-top-color: var(--ok); }
/* 「待确认机台样」列（样品视图：织造完成 → 确认机台样 → 才能缝头） */
.bcol.mchk-col > .bcol-head { border-top-color: var(--warn); }
.bcol.smp-col.jy-col > .bcol-head { border-top-color: var(--pri); }
.bitem .smp-badge {
  display: inline-block; margin: 4px 0 2px; padding: 2px 10px; border-radius: 20px;
  font-size: var(--fs-sm); font-weight: 600; color: var(--ok); background: var(--ok-soft);
}
/* 已经拍过照、但前面还有工序没做完（客人急着确认大货的情况） */
.bitem .smp-badge.ok { background: var(--ok-soft); color: var(--ok); font-weight: 500; }
.bitem .smp-badge.mchk { background: var(--warn-soft); color: var(--warn); }
.bitem .card-ops { margin-top: 8px; }
/* 报工页：记录环节的提示条 */
.proc-note {
  flex-basis: 100%; margin-top: 10px; padding: 9px 12px; border-radius: 8px;
  background: var(--warn-soft); color: var(--warn); font-size: var(--fs-md); line-height: 1.7;
}
.proc-note.ok { background: var(--ok-soft); color: var(--ok); }
/* 看板卡片上的工艺摘要（刺绣 · 点胶 · 木耳边） */
.bitem .craft {
  display: inline-block; margin: 4px 0 2px; padding: 1px 9px; border-radius: 20px;
  font-size: var(--fs-sm); line-height: 1.7; color: var(--pri); background: var(--pri-soft);
}
/* 看板 / 面板：工艺归属来源小标（10-17 大货页「按款工艺归属」）—— 款内 / 整单 / 未读到 */
.csrc {
  display: inline-block; margin-left: 4px; padding: 0 5px; border-radius: 9px;
  font-size: var(--fs-xs); font-weight: 400; line-height: 1.6; white-space: nowrap;
  color: var(--tx2); background: rgba(0, 0, 0, .06); border: 1px solid rgba(0, 0, 0, .06);
}
.csrc.miss { color: var(--warn); background: var(--warn-soft); border-color: transparent; }
/* 订单表格「工艺」列的第二行（.ot-sub 只在 table.ordtbl 下生效）：未读到用警示色 */
table.ordtbl .ot-sub.miss { color: var(--warn); font-weight: 600; }

/* 看板卡片：同款另一边的状态（样品↔大货配对，不用切视图来回看） */
.bitem .pairln { margin: 3px 0 2px; font-size: var(--fs-sm); color: var(--tx2); }
.bitem .pairln.wait { color: var(--warn, #b45309); }
.bitem .pairln.ok { color: var(--ok, #15803d); font-weight: 500; }
/* 看板：同一主单号分组（可展开/收起） */
.bgrp-head {
  display: flex; align-items: center; gap: 6px; cursor: pointer; user-select: none;
  padding: 6px 12px; background: #f4f6f9; border-top: 1px solid var(--border);
  font-size: var(--fs-sm);
  flex-wrap: wrap; row-gap: 4px;   /* 窄列放不下就换行（防按钮被列 overflow:hidden 裁掉）—— 09-19 */
}
.bgrp-head:hover { background: var(--pri-soft); }
.bgrp-head .arw { color: var(--tx2); flex: none; width: 11px; font-size: var(--fs-xs); }
.bgrp-head .gno { font-weight: 600; color: var(--tx); white-space: nowrap; }
.bgrp-head .gmeta { color: var(--tx2); margin-left: auto; text-align: right; white-space: nowrap; }
.bgrp-head .gbtns { flex: none; margin-left: 8px; }
/* 「等待确认大货」列组头的「整单确认」（10-18）：靠右、紧贴 meta 左侧（红框位），不挤标题 */
.bcol.gate-col .bgrp-head .gbtns.gate-rop { margin-left: auto; }
.bcol.gate-col .bgrp-head .gbtns.gate-rop + .gmeta { margin-left: 8px; }
/* 「待确认成品样」列组头的「整单样品确认」（10-22）：靠右、紧贴 meta 左侧（红框位），不挤标题；
   按钮与 meta 包成 .gright 一整块 —— 窄列换行时两者一起换行、仍靠右（不出现 meta 左漂） */
.bgrp-head .gright { margin-left: auto; display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.bgrp-head .gright .gmeta { margin-left: 0; }
.bgrp-head.closed .gno { color: var(--tx2); }

/* @@GRPBTN-WRAP-BEGIN@@ ======================================================
   分组头按钮组 · 窄屏换行（2026-10-26 用户：卡片按钮改「确认大货」后组头批量按钮变长）
   现象：390 宽下「整组确认转大货（N 款）」+「整单返单免打样→大货」合宽 336px，
   可用只有 304px —— .gbtns 是 flex:none 的 flex item，宽度取 max-content，
   不换行 → 被 .bcol 的 overflow:hidden 裁掉约 70px。
   做法：仅 ≤640px 让 .gbtns 可收缩到容器宽并内部换行、右对齐；桌面端规则完全不动。
   回滚：整段删除即可（不改任何既有规则）。
   ========================================================================== */
@media (max-width: 640px) {
  .bgrp-head .gbtns { max-width: 100%; display: inline-flex; flex-wrap: wrap; gap: 6px; justify-content: flex-end; }
  .bgrp-head .gbtns > .btn { flex: 0 0 auto; }
}
/* @@GRPBTN-WRAP-END@@ */
.bgrp-body { border-left: 2px solid #e8ecf0; }
.bgrp-body .bitem:first-child { border-top: 1px dashed var(--border); }
.gate-col .bgrp-body { border-left-color: #f0e6d2; }

/* ---------- 缝头外发（无骨缝头送厂外做） ---------- */
.sew-box {
  border: 1px solid #e3d5f5; border-radius: 8px; padding: 10px 12px;
  background: #fbf8ff;
}
.sew-sum { font-size: var(--fs-md); color: var(--tx); margin-bottom: 6px; }
.sew-pend { color: var(--warn); }
.sew-ok { color: var(--ok); }
.sew-row {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 7px 2px; border-bottom: 1px dashed #e3d5f5; font-size: var(--fs-md);
}
.sew-row:last-child { border-bottom: none; }
.sew-line { flex: 1; min-width: 200px; }
.sew-line .sub { color: var(--tx2); font-size: var(--fs-sm); margin-left: 6px; }
.sew-ops { display: inline-flex; gap: 6px; flex: none; }
.sew-row .btn { flex: none; }
.sew-row.sew-new { border-top: 1px solid #e3d5f5; padding-top: 10px; gap: 8px; }
.sew-row.sew-new input { width: auto; }
.sew-row.sew-new input[type="date"] { width: 150px; }
.sew-row.sew-new input[type="number"] { width: 130px; }
.sew-row.sew-new #sewFactory { width: 150px; }
.sew-row.sew-new #sewNote { flex: 1; min-width: 120px; }
.sew-hint { align-self: flex-end; font-size: var(--fs-sm); color: #6b21a8; line-height: 1.6; }
.sew-hint b { color: #6b21a8; }
/* 定型规则提示（包边/上鞋襻不用定型） */
.shape-hint {
  background: #fbf8ff; border: 1px solid #e3d5f5; border-radius: 8px;
  padding: 8px 10px; margin: 6px 0 4px; color: #6b21a8; font-size: var(--fs-sm); line-height: 1.7;
}
.shape-hint b { color: #6b21a8; }
/* 看板卡片上的外发提示行 */
.sew-line-b { margin-top: 4px; font-size: var(--fs-sm); color: #6b21a8; line-height: 1.5; }
.sew-line-b b { color: var(--warn); }
tr.cmp-row .tag.sew { margin-left: 4px; }

/* ---------- 刺绣花版（DST） ---------- */
.emb-box { border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px; background: #fafbfc; }
.emb-title { font-size: var(--fs-md); font-weight: 600; color: var(--tx2); margin-bottom: 6px; }
.emb-row {
  display: flex; align-items: flex-start; gap: 12px; flex-wrap: wrap;
  padding: 8px 2px; border-bottom: 1px dashed var(--border); font-size: var(--fs-md);
}
.emb-row:last-child { border-bottom: none; }
.emb-main { flex: 1; min-width: 220px; display: flex; flex-direction: column; gap: 7px; }
.emb-main .emb-line { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.emb-main .sub { color: var(--tx2); font-size: var(--fs-sm); }
.emb-main .sub b { color: var(--tx); }
.emb-thread { width: 210px; }
.emb-row.emb-new { border-top: 1px solid var(--border); padding-top: 10px; }
.emb-row .btn { flex: none; }

/* 花版缩略图：花版预览图 + 实物图（点图看大图） */
.emb-thumbs { display: flex; gap: 8px; flex: none; }
.emb-thumb {
  position: relative; width: 76px; height: 76px; border-radius: 8px; overflow: hidden;
  border: 1px solid var(--border); background: #fff; flex: none;
  display: flex; align-items: center; justify-content: center;
}
.emb-thumb img {
  width: 100%; height: 100%; object-fit: contain; cursor: zoom-in; display: block;
  background: #fff;
}
.emb-thumb.ph { background: #f7f8f9; color: var(--tx3); }
.emb-thumb.add {
  border: 1px dashed var(--pri); color: var(--pri); background: var(--pri-soft);
  cursor: pointer; flex-direction: column; gap: 2px;
}
.emb-thumb.add:hover { opacity: .82; }
.emb-thumb.add.busy { opacity: .5; pointer-events: none; }
.emb-ph-plus { font-size: 20px; line-height: 1; font-weight: 600; }
.emb-ph-empty { font-size: var(--fs-xs); }
.emb-thumb-tag {
  position: absolute; left: 0; right: 0; bottom: 0; text-align: center;
  font-size: var(--fs-xs); line-height: 16px; height: 16px; color: #fff;
  background: rgba(31, 35, 41, .55);
}
.emb-thumb.ph .emb-thumb-tag { background: rgba(31, 35, 41, .28); }
.emb-thumb.add .emb-thumb-tag { background: transparent; color: var(--pri); position: static; height: auto; }
.emb-thumb .emb-x {
  position: absolute; top: 2px; right: 2px; width: 18px; height: 18px; padding: 0;
  border: none; border-radius: 50%; background: rgba(31, 35, 41, .6); color: #fff;
  font-size: var(--fs-sm); line-height: 18px; cursor: pointer; z-index: 2;
}
.emb-thumb .emb-x:hover { background: var(--red); }
@media (max-width: 640px) {
  .emb-thumb { width: 64px; height: 64px; }
}
/* 花版沿用同款样品单时的说明条 */
.emb-share {
  background: var(--pri-soft); color: var(--pri); font-size: var(--fs-sm); line-height: 1.7;
  border-radius: 8px; padding: 8px 12px; margin-bottom: 8px;
}
/* ---------- 袜机文件（明德制版：花型 .hly / 链条 .cat） ---------- */
.sock-box { border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px; background: #fafbfc; }
.sock-title { font-size: var(--fs-md); font-weight: 600; color: var(--tx2); margin-bottom: 6px; }
.sock-row {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 7px 2px; border-bottom: 1px dashed var(--border); font-size: var(--fs-md);
}
.sock-row:last-child { border-bottom: none; }
.sock-row .sub { color: var(--tx2); font-size: var(--fs-sm); }
.sock-row.sock-new { border-top: 1px solid var(--border); padding-top: 10px; }
.sock-row .btn { flex: none; }
.sock-ver {
  display: inline-block; padding: 1px 7px; border-radius: 5px;
  background: var(--pri-soft); color: var(--pri); font-size: var(--fs-xs); font-weight: 700;
}

/* 订单弹窗里的「修改建议」展示区 */
.revbox { display: flex; flex-direction: column; gap: 8px; }
.revcard {
  border: 1px solid #e3d5f5; border-radius: 8px; background: #fbf8ff; padding: 8px 10px;
}
.revcard-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: var(--fs-sm); }
.revcard-head b { font-size: var(--fs-md); color: #6b21a8; }
.revcard-head .sub { color: var(--tx2); }
.revcard-head .revcard-del { margin-left: auto; }
.revcard-text { margin-top: 5px; font-size: var(--fs-md); line-height: 1.7; white-space: pre-line; }
.revcard-imgs { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
.revcard-imgs img { width: 84px; height: 84px; object-fit: cover; border-radius: 6px; cursor: zoom-in; }
.revcard-big { display: block; max-width: 100%; margin-top: 8px; border-radius: 8px; border: 1px solid #e3d5f5; }

/* ---------- 样品寄出汇总：费用数字点一下可改 ---------- */
.fee-edit { cursor: pointer; }
.fee-edit:hover { color: var(--pri); text-decoration: underline dotted; }

/* ---------- 出货记录（出货对账）：费用格行内改金额（10-20）---------- */
.ledg-fee { position: relative; white-space: nowrap; }
.ledg-fee::after { content: '✎'; font-size: 10px; margin-left: 3px; opacity: 0; color: var(--tx3); }
.ledg-fee:hover::after { opacity: .65; }
.ledg-fee.fee-on { padding: 1px 3px; }
.ledg-fee-inp {
  font: inherit; text-align: right; padding: 1px 4px;
  border: 1px solid var(--pri); border-radius: 4px; background: #fff; color: var(--tx);
  outline: none; box-shadow: 0 0 0 2px var(--pri-soft, rgba(37, 99, 235, .12));
}
.ledg-fee-inp:disabled { opacity: .6; }

/* ---------- 等待确认大货（等样品确认）列 ---------- */
.bcol.gate-col > .bcol-head { border-top-color: var(--warn); }
.bcol.gate-col .bgrp-head { background: #fdf6ea; }
.bcol.gate-col .bgrp-head:hover { background: var(--warn-soft); }
.bitem.gate { background: var(--warn-soft); }
.bitem.gate .gst { margin-top: 4px; font-size: var(--fs-sm); color: var(--warn); line-height: 1.5; }
.bitem.gate .gst .ok-tx { color: var(--ok, #0f6e56); font-weight: 600; }
.bitem.gate .gst .warn-tx { color: var(--warn, #b45309); font-weight: 600; }
/* 确认记录（谁点的确认大货 + 时间） */
.rel-by { margin-top: 3px; font-size: var(--fs-xs); color: var(--tx3, #9aa0a6); line-height: 1.4; }
.rel-by .lnk { color: var(--pri, #2563eb); text-decoration: none; border-bottom: 1px dashed currentColor; }
.rel-by .lnk:hover { color: var(--danger, #dc2626); border-bottom-style: solid; }

/* 状态备注行（10-22）：等待确认大货卡片上的人工标注 —— 与确认记录同款小字，只是文案在前 */
.wn-line { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.wn-line .wn-tx { color: var(--warn, #b45309); font-weight: 600; }
.wn-line .wn-lb { color: var(--tx3, #9aa0a6); }
.wn-line .wn-lk { color: var(--pri, #2563eb); border-bottom: 1px dashed currentColor; }
.wn-line[data-wnote] { cursor: pointer; }
.wn-line[data-wnote]:hover .wn-lk { border-bottom-style: solid; }
.wn-line[data-wnote]:hover .wn-tx { text-decoration: underline dotted; }
.wn-line .wn-who { color: var(--tx3, #9aa0a6); }
.wn-line.wn-empty .lnk { color: var(--tx3, #9aa0a6); font-weight: 400; }
.wn-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.wn-hist { margin-top: 10px; max-height: 170px; overflow: auto; font-size: var(--fs-sm); line-height: 1.7; }
.wn-hist .wn-hd { color: var(--tx3, #9aa0a6); margin-bottom: 2px; }
.wn-hist .wn-hi { color: var(--tx3, #9aa0a6); }
.wn-hist .wn-hi span { color: var(--tx, #333); margin-left: 6px; }
body.skin-fs-tbl #page-board .bitem .wn-line { flex-basis: 100%; margin-top: 0; }

/* ---------- 页面互跳：可点卡片 / 链接 / 定位高亮 ---------- */
a.lnk { color: var(--pri); text-decoration: none; border-bottom: 1px dashed currentColor; cursor: pointer; }
a.lnk:hover { border-bottom-style: solid; }
.bitem.clickable { cursor: pointer; transition: background .15s; }
.bitem.clickable:hover { background: #f4f8fc; }
.bitem.gate.clickable:hover { background: #f4e2c4; }
.bitem .meta a.lnk { font-size: var(--fs-sm); }

/* 打样版本备注（09-22）：卡片版本标下的小字 + 弹窗里的「版本N [框]」 */
.vnote-b { margin-top: 3px; font-size: var(--fs-xs); color: var(--tx3, #9aa0a6); line-height: 1.4; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.bitem .no a[data-vnote] { white-space: nowrap; }
.vnote-row { display: flex; align-items: center; gap: 8px; margin: 7px 0; }
.vnote-row label { flex: 0 0 54px; color: var(--tx2); }
.vnote-row .vnote-in { flex: 1; min-width: 0; }
img.thumb.xs, span.thumb.xs { width: 24px; height: 24px; border-radius: 4px; vertical-align: middle; display: inline-block; }
img.thumb.xs { object-fit: cover; }
span.thumb.ph { background: #f2f4f7; border: 1px dashed var(--border); }
/* ---------- 路由编辑器 ---------- */
.route-editor { display: flex; flex-direction: column; gap: 6px; }
.route-line { display: flex; align-items: center; gap: 6px; }
.route-line .rproc {
  flex: 1; display: flex; align-items: center; justify-content: space-between;
  padding: 6px 12px; border: 1px solid var(--border); border-radius: 8px; background: #fff;
}
.route-line .rproc .nm { font-weight: 600; }
.route-line .rproc .dup { font-size: var(--fs-sm); color: var(--warn); }
.route-line .ops { display: flex; gap: 4px; }
.route-line .ops button { width: 28px; height: 28px; border: 1px solid var(--border); background: #fff; border-radius: 6px; cursor: pointer; }
.route-line .ops button:hover { border-color: var(--pri); color: var(--pri); }
.route-add { display: flex; gap: 6px; }
.route-add select { flex: 1; }

/* ---------- 模态 ---------- */
.modal-mask {
  position: fixed; inset: 0; background: rgba(0,0,0,.4); z-index: 50;
  display: flex; align-items: center; justify-content: center; padding: 16px;
}
.modal {
  background: var(--card); border-radius: 14px; width: 100%; max-width: 560px;
  max-height: 90vh; overflow-y: auto; padding: 20px;
  box-shadow: 0 20px 60px rgba(15, 23, 42, .18);
}
.modal h2 { margin: 0 0 16px; font-size: var(--fs-xl); }
.modal .foot { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; }
.modal.wide { max-width: min(1280px, 96vw); }
.modal.mid { max-width: min(860px, 95vw); }
/* 看板内「订单管理」弹窗：头/身体/脚三段式，身体滚动、按钮常驻底部 */
.modal.om-modal {
  padding: 0; display: flex; flex-direction: column;
  max-height: 94vh; overflow: hidden;
}
.modal.om-modal .om-head { padding: 18px 26px 14px; border-bottom: 1px solid var(--border); flex: none; }
.modal.om-modal .om-head h2 { margin: 0; font-size: var(--fs-xl); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.modal.om-modal .om-body { flex: 1; overflow-y: auto; padding: 18px 26px; }
.modal.om-modal .om-foot {
  flex: none; display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 14px 26px; border-top: 1px solid var(--border); background: #fafbfc;
}
.modal.om-modal .om-foot .btn { padding: 9px 22px; font-size: var(--fs-base); }
/* 双栏：左 = 图 + 基本信息 + 备注；右 = 进度 + 同款单 + 报工 */
.om-grid { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); gap: 6px 32px; align-items: start; }
@media (max-width: 900px) { .om-grid { grid-template-columns: 1fr; gap: 0; } }
.om-col > .om-sect:first-child { margin-top: 0; }
.om-top { display: flex; gap: 20px; align-items: flex-start; flex-wrap: wrap; }
.om-pic { flex: none; }
img.om-img {
  width: 270px; max-width: 46vw; border-radius: 8px; border: 1px solid var(--border);
  cursor: zoom-in; display: block; background: #fff;
}
img.om-img:hover { border-color: var(--pri); }
.om-noimg {
  width: 270px; max-width: 46vw; padding: 44px 8px; text-align: center; font-size: var(--fs-base);
  color: var(--tx3); border: 1px dashed var(--border); border-radius: 8px;
}
.om-kvs { flex: 1; min-width: 260px; font-size: var(--fs-base); }
.om-kv { display: flex; gap: 10px; padding: 5px 0; align-items: baseline; }
.om-kv > span { color: var(--tx2); font-size: var(--fs-sm); flex: none; width: 78px; }
.om-kv > b { min-width: 0; }
.om-sect {
  font-size: var(--fs-md); font-weight: 600; color: var(--tx2);
  margin: 20px 0 10px; padding-bottom: 6px; border-bottom: 1px solid var(--border);
}
.om-procs { display: flex; flex-wrap: wrap; gap: 9px; }
.om-proc {
  display: flex; align-items: center; gap: 7px; font-size: var(--fs-base);
  background: #f4f6f9; border-radius: 20px; padding: 6px 15px;
}
.om-proc.done { background: var(--ok-soft); color: var(--ok); }
.om-proc i { font-style: normal; font-size: var(--fs-sm); color: var(--red); }
.om-peer {
  display: flex; align-items: center; gap: 12px; padding: 11px 6px; font-size: var(--fs-base);
  border-bottom: 1px dashed var(--border); cursor: pointer;
}
.om-peer:hover { background: var(--pri-soft); }
.om-peer .sub, .om-log .sub { color: var(--tx2); font-size: var(--fs-sm); }
.om-log {
  display: flex; align-items: center; gap: 12px; padding: 10px 6px; font-size: var(--fs-base);
  border-bottom: 1px dashed var(--border);
}
.om-log i { font-style: normal; color: var(--red); }
.om-log .lnk { margin-left: auto; }
/* 手机上让这个弹窗铺满屏幕，别缩成小卡片 */
@media (max-width: 900px) {
  .modal.om-modal { width: 100%; max-width: none; max-height: 94vh; }
}

/* ---------- 报工框（09-22）：从看板 / 订单面板点「报工」弹出 —— 头 / 身体 / 脚三段式，身体滚动、按钮常驻底部 ---------- */
.modal.rp-modal {
  padding: 0; display: flex; flex-direction: column;
  max-height: 92vh; overflow: hidden;
  width: 100%; max-width: min(1080px, 96vw);
}
.modal.rp-modal .rp-head { padding: 15px 22px 12px; border-bottom: 1px solid var(--border); flex: none; display: flex; align-items: center; gap: 10px; }
.modal.rp-modal .rp-head h2 { margin: 0; font-size: var(--fs-xl); }
.modal.rp-modal .rp-body { flex: 1; overflow-y: auto; padding: 16px 22px 18px; }
.modal.rp-modal .rp-foot {
  flex: none; display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 12px 22px; border-top: 1px solid var(--border); background: #fafbfc;
}
.modal.rp-modal .rp-foot .btn { padding: 9px 20px; font-size: var(--fs-base); }
@media (max-width: 900px) {
  .modal.rp-modal { max-width: none; max-height: 94vh; }
}

/* ---------- 提示 ---------- */
.toast {
  position: fixed; top: 16px; left: 50%; transform: translateX(-50%); z-index: 100;
  background: var(--tx); color: #fff; padding: 10px 18px; border-radius: 8px; font-size: var(--fs-base);
  box-shadow: 0 4px 12px rgba(0,0,0,.2); opacity: 0; transition: .25s;
}
.toast.show { opacity: 1; }
.toast.err { background: var(--red); }
.toast.ok { background: var(--ok); }
/* 共用打样回执条（10-21）：文字 + 「撤销」按钮 */
.toast { display: flex; align-items: center; gap: 10px; }
.toast-undo {
  flex: 0 0 auto; padding: 3px 12px; border: 1px solid rgba(255,255,255,.75); border-radius: 6px;
  background: transparent; color: #fff; font-size: var(--fs-base); font-family: inherit; cursor: pointer;
}
.toast-undo:hover { background: rgba(255,255,255,.16); }
.toast-undo:disabled { opacity: .6; cursor: default; }

/* ---------- 统计卡片 ---------- */
.stat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; }
.stat { background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); padding: 14px; }
.stat .v { font-size: var(--fs-2xl); font-weight: 600; }
.stat .k { font-size: var(--fs-sm); color: var(--tx2); margin-top: 2px; }

.hint { color: var(--tx3); font-size: var(--fs-sm); }

/* 台账「备注」列：单行截断（悬停看全文） */
.tnote { display: inline-block; max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle; color: var(--tx2); }

/* ---------- 订单表格（类多维表格）：拉动看数据 = 首列冻结 + 列宽可拖 ---------- */
.ordtbl-wrap { overflow: auto; max-height: calc(100vh - 250px); border: 1px solid var(--border); border-radius: 10px; background: #fff; }
table.ordtbl { border-collapse: separate; border-spacing: 0; font-size: var(--fs-md); table-layout: fixed; }
table.ordtbl th {
  position: sticky; top: 0; z-index: 2; background: #fafbfc; color: var(--tx2);
  font-weight: 500; font-size: var(--fs-sm); white-space: nowrap; text-align: left;
  padding: 8px 16px 8px 10px; border-bottom: 1px solid var(--border);
  overflow: hidden; text-overflow: ellipsis;
}
table.ordtbl td { padding: 8px 10px; border-bottom: 1px solid var(--border); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
table.ordtbl tbody tr:last-child td { border-bottom: none; }
table.ordtbl tbody tr.ot-row { cursor: pointer; }
table.ordtbl tbody tr.ot-row:hover { background: #fafbfc; }
table.ordtbl tr.ot-grp td { background: #f5f7f9; color: var(--tx2); font-size: var(--fs-sm); cursor: pointer; }
table.ordtbl tr.ot-grp:hover td { background: var(--pri-soft); }
table.ordtbl tr.ot-main td { background: #eef3f8; font-weight: 600; cursor: pointer; }
table.ordtbl tr.ot-main:hover td { background: var(--pri-soft); }
table.ordtbl.dense td { padding: 4px 10px; }
table.ordtbl.dense th { padding: 5px 16px 5px 10px; }
/* 首列冻结：往右拉表格看后面的列时，第一列（任务项）固定在最左边 */
table.ordtbl th.ot-lock { left: 0; z-index: 4; background: #fafbfc; box-shadow: 1px 0 0 var(--border); }
table.ordtbl td.ot-lock { position: sticky; left: 0; z-index: 3; background: #fff; box-shadow: 1px 0 0 var(--border); }
table.ordtbl tbody tr.ot-row:hover td.ot-lock { background: #fafbfc; }
/* 列宽拖动：表头右边缘一条热区（悬停亮一条竖线；拖动中整页 col-resize） */
table.ordtbl th .ot-rz { position: absolute; top: 0; right: 0; bottom: 0; width: 9px; cursor: col-resize; z-index: 6; }
table.ordtbl th .ot-rz::after { content: ''; position: absolute; left: 3px; top: 3px; bottom: 3px; width: 2px; background: transparent; border-radius: 1px; }
table.ordtbl th .ot-rz:hover::after { background: var(--pri); }
body.colrz, body.colrz * { cursor: col-resize !important; user-select: none !important; }
/* 表尾空白行：直接填（类飞书）——任务项+数量齐了自动建单 */
table.ordtbl tr.ot-add td { color: var(--tx); background: #fbfdfe; border-top: 1px dashed var(--border); border-bottom: none; }
table.ordtbl tr.ot-add td.ot-addc { cursor: text; }
table.ordtbl tr.ot-add:hover td { background: #f5f9fc; }
table.ordtbl tr.ot-add td.ot-addc:hover { background: var(--pri-soft); }
table.ordtbl tr.ot-add td.ot-addna { color: var(--tx3); cursor: default; }
table.ordtbl tr.ot-add td.ot-lock { background: #fbfdfe; box-shadow: 1px 0 0 var(--border); }
table.ordtbl tr.ot-add:hover td.ot-lock { background: #f5f9fc; }
table.ordtbl tr.ot-add .ot-plus { color: var(--pri); font-weight: 700; margin-right: 2px; }
table.ordtbl tr.ot-emptyrow td { color: var(--tx3); }
.ot-thumb { height: 34px; width: 34px; object-fit: cover; border-radius: 6px; border: 1px solid var(--border); cursor: zoom-in; display: inline-block; vertical-align: middle; }
.ot-thumb + .ot-thumb { margin-left: 4px; }
.ot-edit { cursor: text; }
.ot-edit:hover { background: var(--pri-soft); }
.ot-miss { color: var(--red); }
.tbl-pop {
  position: fixed; display: none; z-index: 70; background: #fff; border: 1px solid var(--border);
  border-radius: 10px; box-shadow: 0 8px 24px rgba(0,0,0,.12); padding: 12px 14px; max-width: min(440px, 92vw);
}
.tbl-pop .pfrow { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; font-size: var(--fs-md); }
.tbl-pop .pfrow > span { color: var(--tx2); font-size: var(--fs-sm); width: 64px; flex: none; }
.tbl-pop .pfopt { padding: 7px 8px; border-radius: 6px; cursor: pointer; font-size: var(--fs-md); }
.tbl-pop .pfopt:hover { background: var(--pri-soft); }
.tbl-pop .pfcols { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 14px; }
.tbl-pop .pfcol { display: flex; align-items: center; gap: 7px; font-size: var(--fs-md); padding: 4px 6px; border-radius: 6px; cursor: pointer; }
.tbl-pop .pfcol:hover { background: var(--pri-soft); }
.tbl-pop .pfcol input { width: auto; }
.tbl-pop .btn.on2 { border-color: var(--pri); color: var(--pri); background: var(--pri-soft); }

/* 订单表格：多选小方框 + 同款合并行的小字（样品进度 / 样品交期 / +样数量） */
table.ordtbl .ot-ck { width: auto; margin: 0 7px 0 1px; vertical-align: middle; cursor: pointer; }
table.ordtbl .ot-sub { display: block; font-size: var(--fs-xs); line-height: 1.4; color: var(--tx2); }
/* 同单折叠：同单多款时单号前的小三角（收起 / 展开同单其它款）+ 收起时的「+N 款」小标 */
table.ordtbl .ot-fold { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; margin: -4px 3px -4px 9px; font-size: 17px; font-weight: 700; line-height: 1; color: var(--tx); cursor: pointer; border-radius: 7px; user-select: none; vertical-align: middle; }
table.ordtbl .ot-fold:hover { color: var(--pri); background: var(--pri-soft); }
table.ordtbl .ot-fold:active { color: var(--pri); background: var(--pri-soft); }
table.ordtbl .ot-fb { font-size: var(--fs-xs); line-height: 1.4; color: var(--tx2); background: #eef1f4; border-radius: 8px; padding: 0 6px; margin-left: 4px; vertical-align: middle; }
.toolbar #ordSelBox { display: inline-flex; align-items: center; gap: 8px; }
.ordsel-n { font-size: var(--fs-sm); color: var(--tx2); }

/* 数量列：像 Excel 一样拖选一段 → 合计（高亮 + 合计条 + 拖动时禁文字选择） */
table.ordtbl td[data-edit="qty"] { cursor: cell; }
table.ordtbl td.ot-qsel { background: #d9ecff; box-shadow: inset 0 0 0 1px rgba(21, 87, 163, .35); }
body.qtdrag, body.qtdrag * { user-select: none !important; }
.toolbar #ordQtyBox { display: inline-flex; align-items: center; gap: 6px; }
.ordqsel-n { font-size: var(--fs-sm); color: var(--pri); background: var(--pri-soft); padding: 2px 8px; border-radius: 10px; white-space: nowrap; }
/* 样品寄出汇总：拖选订单行 → 合计（行高亮 + 右下角浮条[.ledgsel 与出货记录同款] + 拖动时禁文字选择） */
tr.smp-order.smp-sel td { background: #cfe3fb; box-shadow: inset 0 0 0 1px rgba(21, 87, 163, .5); }
/* 样品寄出汇总：按「出货时间」分成年月的组头行（10-09，参考出货记录的 ledg-grp） */
tr.smp-mo td { background: #f5f7f9; color: var(--tx2); font-size: var(--fs-sm); cursor: pointer; }
tr.smp-mo:hover td { background: var(--pri-soft); }
tr.smp-mo b { color: var(--tx); font-size: var(--fs-md); }
body.smpdrag, body.smpdrag * { user-select: none !important; }
/* 样品寄出汇总：每款打样成本后面的小字（「= …」算式）—— 这笔钱逐笔怎么加出来的（初样/推翻样全额、修改样(vN)/补打样半价、免费补打 0） */
.smpdy-note { white-space: nowrap; font-size: var(--fs-xs); line-height: 1.35; color: var(--tx3); font-weight: 400; }

/* ---------- 响应式：手机 ---------- */
/* 手机底部导航：桌面端隐藏（默认 none），窄屏才显示 */
.bottom-nav { display: none; }
@media (max-width: 720px) {
  .sidebar { display: none; }
  .main { padding: 12px; }
  .topbar { padding: 0 12px; }
  .row > div { min-width: 100%; }
  .bottom-nav {
    position: fixed; bottom: 0; left: 0; right: 0; background: var(--card);
    border-top: 1px solid var(--border); display: flex; z-index: 20; padding-bottom: env(safe-area-inset-bottom);
  }
  .bottom-nav a {
    flex: 1; text-align: center; padding: 8px 4px; font-size: var(--fs-xs); color: var(--tx2);
    display: flex; flex-direction: column; gap: 2px; align-items: center;
  }
  .bottom-nav a .menu-icon { font-size: 18px; width: auto; }
  .bottom-nav a.on { color: var(--pri); font-weight: 600; }
  .main { padding-bottom: 70px; }
  .board-grid { grid-template-columns: 1fr; }
  table { font-size: var(--fs-sm); }
  th, td { padding: 6px 6px; }
}

/* ---------- 整单报工：款列表在左，「合格数 / 次品数 / 金额」摆到列表右边（fillBatchBox 给 #rLineWrap 加 .batch-on） ---------- */
#rLineWrap.batch-on { display: flex; align-items: flex-start; gap: 14px; }
.bk-qty { width: 78px; padding: 3px 6px; font-size: var(--fs-sm); border: 1px solid var(--border); border-radius: 6px; text-align: right; }   /* 整单：每款行内数量框（10-06 点胶起） */
.bk-rmn { width: 66px; padding: 3px 6px; font-size: var(--fs-sm); border: 1px solid var(--border); border-radius: 6px; text-align: right; }   /* 整单：每款行内余数框（10-18） */
.bk-qty:focus, .bk-rmn:focus { border-color: var(--pri); outline: none; }
.bk-qty.bk-over { border-color: var(--warn); background: #fff7ed; }   /* 超过该款可报量：橙边提示（补数/重做可超） */
.bk-sum { margin-top: 8px; padding-top: 6px; border-top: 1px dashed var(--border); font-size: var(--fs-sm); color: var(--tx2); }
.bk-sum b { color: var(--tx); }
.bk-warn { color: var(--warn); }
#rLineWrap.batch-on #rBatchBox { flex: 1 1 auto; min-width: 0; }
#rLineWrap.batch-on #rQtyRow { flex: 0 0 200px; flex-direction: column; gap: 10px; }
#rLineWrap.batch-on #rQtyRow > div { flex: none; min-width: 0; }
@media (max-width: 720px) {
  #rLineWrap.batch-on { display: block; }
  #rLineWrap.batch-on #rQtyRow { margin-top: 10px; }
}

/* ---------- 刺绣文件数据汇总（订单表格页下方；刺绣车间 / 跟单 / 管理员可见） ---------- */
#embSumWrap { overflow-x: auto; }
.es-tbl td { white-space: nowrap; }
.es-tbl tr.es-sec td { background: #f5f7f9; color: var(--tx2); font-size: var(--fs-sm); font-weight: 600; }
/* 同单折叠三角（点一下收起 / 展开同单的其它款 —— 09-23 用户） */
/* 通用折叠小三角 + 「+N 款」标记（订单表格外的汇总页统一用；订单表格内是 .ot-fold/.ot-fb）—— 09-23 晚统一 */
.fold-ar { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; margin: -5px 3px -5px 0; font-size: 15px; font-weight: 700; line-height: 1; color: var(--tx); cursor: pointer; border-radius: 7px; user-select: none; vertical-align: middle; }
.fold-ar:hover { color: var(--pri); background: var(--pri-soft); }
.fold-ar:active { color: var(--pri); background: var(--pri-soft); }
/* 卡片模块折叠（10-09；仅「待发货」用）：点标题收起 / 展开（默认展开；收起 = 只留标题行） */
.card.cardf > *:not(.toolbar) { display: none !important; }
.card.cardf > .toolbar > *:not(h2) { display: none !important; }   /* 收起 = 只留标题行（工具条一并收起） */
.c-fold { cursor: pointer; user-select: none; }
.c-fold:hover { color: var(--pri); }
.c-fold .c-fold-ar { margin-left: 6px; font-size: 13px; color: var(--tx3); font-weight: 700; }
.c-fold:hover .c-fold-ar { color: var(--pri); }
/* 「年份 + 月份」两级勾选（10-09）：年份行 + 该年月份 chips */
.mo-yr { display: flex; align-items: center; gap: 10px; margin: 5px 0; flex-wrap: wrap; }
.mo-yc { display: inline-flex; align-items: center; gap: 6px; font-weight: 600; font-size: var(--fs-md); min-width: 64px; cursor: pointer; user-select: none; }
.mo-yc input, .mo-mc input { width: auto; }
.mo-ms { display: inline-flex; align-items: center; gap: 2px; flex-wrap: wrap; }
.mo-mc { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; border-radius: 6px; cursor: pointer; font-size: var(--fs-md); user-select: none; }
.mo-mc:hover { background: var(--pri-soft); }
.fold-cnt { font-size: var(--fs-xs); line-height: 1.4; color: var(--tx2); background: #eef1f4; border-radius: 8px; padding: 0 6px; margin-left: 4px; vertical-align: middle; }
.fold-row { cursor: pointer; }
.es-thumb { width: 44px; height: 44px; object-fit: contain; border: 1px solid var(--border); border-radius: 8px; background: #fff; cursor: zoom-in; display: block; }
.es-thumb:hover { border-color: var(--pri); }
.es-thread { width: 160px; padding: 5px 8px; font-size: var(--fs-sm); }
.es-thread.saved { border-color: var(--ok); box-shadow: 0 0 0 3px var(--ok-soft); }
.es-source { width: 92px; padding: 5px 6px; font-size: var(--fs-sm); }
.es-source.saved { border-color: var(--ok); box-shadow: 0 0 0 3px var(--ok-soft); }
.emb-ver { display: inline-block; margin-right: 6px; padding: 1px 7px; border-radius: 5px; background: var(--pri-soft); color: var(--pri); font-size: var(--fs-xs); font-weight: 700; vertical-align: 1px; }
.emb-fin { display: inline-block; margin: 0 4px 0 2px; padding: 1px 7px; border-radius: 5px; background: var(--ok-soft); color: var(--ok); font-size: var(--fs-xs); font-weight: 700; vertical-align: 1px; }
.emb-fin-strong { color: var(--ok); }
.emb-slot { display: inline-block; margin-right: 6px; padding: 1px 7px; border-radius: 5px; background: var(--warn-soft); color: var(--warn); font-size: var(--fs-xs); font-weight: 700; vertical-align: 1px; }
.emb-slotgrp { margin: 4px 0 2px; }
.emb-slotgrp .emb-slothead { font-size: var(--fs-sm); font-weight: 700; color: var(--tx2); margin: 8px 0 2px; }
.emb-slotsel { font-size: var(--fs-sm); padding: 3px 4px; margin-right: 6px; }
.es-ver { white-space: nowrap; }

/* ---------- 导入刺绣文件 · 弹窗里的文件清单与选单面板 ---------- */
.imp-list { border: 1px solid var(--border); border-radius: 10px; max-height: 300px; overflow: auto; }
.imp-row { display: flex; align-items: center; gap: 8px; padding: 7px 10px; border-bottom: 1px solid var(--border); font-size: var(--fs-md); }
.imp-row:last-child { border-bottom: none; }
.imp-row .imp-name { flex: 0 1 36%; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.imp-row .imp-ord { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.imp-row .imp-res { flex: none; color: var(--ok); font-size: var(--fs-sm); }
.imp-row .imp-res.bad { color: var(--red); }
.imp-row .imp-del { flex: none; color: var(--red); }
.imp-pick { padding: 8px 10px; border-bottom: 1px solid var(--border); background: #fafbfc; }
.imp-pick input { max-width: 320px; }
.imp-qlist { max-height: 200px; overflow: auto; margin-top: 6px; border: 1px solid var(--border); border-radius: 8px; background: #fff; }
.imp-qlist a { display: block; padding: 6px 10px; border-bottom: 1px solid var(--border); }
.imp-qlist a:last-child { border-bottom: none; }
.imp-qlist a:hover { background: var(--pri-soft); }
.imp-qlist a.on { background: var(--pri-soft); }

/* ---------- 刺绣制版群「待导入花版」区（刺绣汇总页顶部；10-05） ---------- */
.pend-tbl td { vertical-align: middle; }
.pend-tbl td.pend-why { white-space: normal; min-width: 240px; max-width: 460px; line-height: 1.55; color: var(--tx2); font-size: var(--fs-sm); }
.pend-tbl .btn.sm { white-space: nowrap; }
.pend-tbl td:last-child a.lnk { margin-left: 6px; }   /* 10-07：「撤下」与「导入到订单」按钮之间留出间距，操作列不贴挤 */
/* 10-07 排版规整：本区 .sub 小字此前没有全局规则（时间/KB/说明都被渲染成正文 13-14px）→ 统一 12px 次要灰；时间数字等宽对齐 */
#embPendBox .sub { color: var(--tx2); font-size: var(--fs-sm); }
.pend-tbl td.sub { font-variant-numeric: tabular-nums; }
.pend-doc { float: right; color: var(--pri); cursor: pointer; padding: 0 2px 0 12px; user-select: none; }
.pend-doc:hover { text-decoration: underline; }

/* 单据核对弹窗（刺绣汇总页点订单号） */
.esdoc-wrap { max-height: 60vh; overflow: auto; border: 1px solid var(--border); border-radius: 10px; background: #fafbfc; padding: 6px; text-align: center; }
.esdoc-wrap img { max-width: 100%; display: block; margin: 0 auto; cursor: zoom-in; }

/* ---------- 简洁细节（09-27 UI 优化）：细滚动条 ---------- */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-thumb { background: #d3d8de; border-radius: 6px; border: 2px solid transparent; background-clip: content-box; }
::-webkit-scrollbar-thumb:hover { background: #b9c0c8; border: 2px solid transparent; background-clip: content-box; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-corner { background: transparent; }

/* @@FEISHU-SKIN-BEGIN@@ ==================================================
   飞书风格皮肤·卡片版 —— body.skin-fs 时生效（访问地址带 ?fs=1 查看）。
   参考飞书多维表格的色板与组件风格；只作用于「进度看板」页（#page-board）。
   （2026-10-04 上线「表格版」为默认皮肤，见下方 SKIN2 段；本段保留作切换对比用。）
   ======================================================================== */
body.skin-fs {
  --fk-blue: #3370ff;
  --fk-blue-soft: #e1eaff;
  --fk-tx2: #646a73;
  --fk-tx3: #8f959e;
  --fk-border: #dee0e3;
  --fk-bg: #f5f6f7;
  --fk-green: #2ea121;
  --fk-green-soft: #dff5de;
  --fk-orange: #d9730d;
  --fk-orange-soft: #fde9d5;
  --fk-red: #d83931;
  --fk-red-soft: #fbe3e3;
  --fk-purple: #7b61ff;
  --fk-purple-soft: #eae4ff;
}

/* —— 顶部工具条：输入框浅灰底、按钮圆角 6、主按钮飞书蓝 —— */
body.skin-fs #page-board .card { box-shadow: none; }
body.skin-fs #page-board input,
body.skin-fs #page-board select {
  background: var(--fk-bg); border-color: transparent; border-radius: 6px;
}
body.skin-fs #page-board input:focus,
body.skin-fs #page-board select:focus { background: #fff; border-color: var(--fk-blue); }
body.skin-fs #page-board .btn { height: 32px; padding-top: 0; padding-bottom: 0; border-radius: 6px; }
body.skin-fs #page-board .btn:hover { border-color: var(--fk-blue); color: var(--fk-blue); background: #fff; }
body.skin-fs #page-board .btn.pri { background: var(--fk-blue); border-color: var(--fk-blue); color: #fff; }
body.skin-fs #page-board .btn.pri:hover { background: #4e83fd; border-color: #4e83fd; color: #fff; }
body.skin-fs #page-board .btn.sm { height: 26px; padding-left: 10px; padding-right: 10px; font-size: var(--fs-sm); }
body.skin-fs #page-board .hint { color: var(--fk-tx3); line-height: 1.7; }

/* —— 看板列：浅灰圆角列容器（飞书看板视图风格），列头 = 色点 + 名称 + 计数 —— */
body.skin-fs #page-board .board-grid { gap: 14px; }
body.skin-fs #page-board .bcol {
  background: var(--fk-bg); border: none; border-radius: 8px; overflow: visible;
  padding: 8px; display: flex; flex-direction: column; gap: 8px;
}
body.skin-fs #page-board .bcol-head {
  border: none; background: transparent; padding: 4px 4px 0;
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap; row-gap: 2px;
}
body.skin-fs #page-board .bcol-head::before {
  content: ''; width: 8px; height: 8px; border-radius: 50%; flex: none; background: #c9cdd4;
}
body.skin-fs #page-board .bcol.smp-col > .bcol-head::before { background: var(--fk-green); }
body.skin-fs #page-board .bcol.smp-col.jy-col > .bcol-head::before { background: var(--fk-blue); }
body.skin-fs #page-board .bcol.mchk-col > .bcol-head::before { background: var(--fk-orange); }
body.skin-fs #page-board .bcol.gate-col > .bcol-head::before { background: var(--fk-orange); }
body.skin-fs #page-board .bcol-head .cnt {
  margin-left: auto; background: transparent; padding: 0; border-radius: 0;
  color: var(--fk-tx3); font-weight: 400;
}
body.skin-fs #page-board .empty { color: var(--fk-tx3); font-size: var(--fs-sm); }
body.skin-fs #page-board .bcol > .btn { margin: 0 !important; width: 100% !important; }

/* —— 卡片：独立白卡（1px 边框 + hover 轻阴影），间距 8 —— */
body.skin-fs #page-board .bitem {
  background: #fff; border: 1px solid var(--fk-border); border-radius: 6px;
  padding: 10px 12px;
}
body.skin-fs #page-board .bitem.clickable:hover {
  background: #fff; border-color: #c9cdd4; box-shadow: 0 2px 8px rgba(31,35,41,.06);
}
body.skin-fs #page-board .bitem .no { font-size: var(--fs-base); }
body.skin-fs #page-board .bitem .meta { color: var(--fk-tx2); }
body.skin-fs #page-board .bitem .rel-by,
body.skin-fs #page-board .vnote-b { color: var(--fk-tx3); }

/* 等待确认大货列：白卡 + 左侧橙色标记条（比整块浅橙底更清爽） */
body.skin-fs #page-board .bitem.gate { background: #fff; border-left: 3px solid var(--fk-orange); }
body.skin-fs #page-board .bitem.gate .gst { color: var(--fk-orange); }
body.skin-fs #page-board .bitem.gate.clickable:hover {
  background: #fff; border-color: var(--fk-orange); box-shadow: 0 2px 8px rgba(217,115,13,.12);
}

/* —— 分组头（同主单号）：无底色、hover 浅灰 —— */
body.skin-fs #page-board .bgrp-head {
  background: transparent; border: none; border-radius: 6px; padding: 6px 4px;
}
body.skin-fs #page-board .bgrp-head:hover { background: #eceef1; }
body.skin-fs #page-board .bgrp-head.closed .gno { color: var(--fk-tx2); }
body.skin-fs #page-board .bgrp-head .gbtns { display: inline-flex; gap: 4px; flex-wrap: wrap; }
body.skin-fs #page-board .bgrp-body { border-left: none; display: flex; flex-direction: column; gap: 8px; }
body.skin-fs #page-board .bgrp-body .bitem:first-child { border-top: 1px solid var(--fk-border); }
body.skin-fs #page-board .bcol.gate-col .bgrp-head { background: transparent; }
body.skin-fs #page-board .bcol.gate-col .bgrp-head:hover { background: #fbe9d6; }

/* —— 标签 / 徽标：飞书选项标签风（4px 小圆角、浅底深字） —— */
body.skin-fs #page-board .tag {
  border-radius: 4px; padding: 0 6px; font-weight: 400; font-size: var(--fs-xs); line-height: 18px;
}
body.skin-fs #page-board .tag.pri { background: var(--fk-blue-soft); color: var(--fk-blue); }
body.skin-fs #page-board .tag.ok { background: var(--fk-green-soft); color: var(--fk-green); }
body.skin-fs #page-board .tag.warn { background: var(--fk-orange-soft); color: var(--fk-orange); }
body.skin-fs #page-board .tag.red { background: var(--fk-red-soft); color: var(--fk-red); }
body.skin-fs #page-board .tag.sew { background: var(--fk-purple-soft); color: var(--fk-purple); }
body.skin-fs #page-board .tag.cxl { background: #f2f3f5; color: var(--fk-tx3); }
body.skin-fs #page-board .bitem .craft {
  border-radius: 4px; background: var(--fk-blue-soft); color: var(--fk-blue); font-weight: 400;
}
body.skin-fs #page-board .bitem .smp-badge { border-radius: 4px; padding: 1px 8px; font-weight: 500; }
body.skin-fs #page-board .bitem .smp-badge.ok { background: var(--fk-green-soft); color: var(--fk-green); }
body.skin-fs #page-board .bitem .smp-badge.mchk { background: var(--fk-orange-soft); color: var(--fk-orange); }

/* —— 链接：「报工」做成浅蓝小按钮，其余链接简洁蓝字 —— */
body.skin-fs #page-board a.lnk { border-bottom: none; }
body.skin-fs #page-board a.lnk:hover { border-bottom: none; text-decoration: underline; }
body.skin-fs #page-board .meta a.lnk {
  display: inline-block; line-height: 18px; padding: 0 8px; border-radius: 4px;
  background: var(--fk-blue-soft); color: var(--fk-blue); font-weight: 500;
}
body.skin-fs #page-board .meta a.lnk:hover { background: #d0e0ff; text-decoration: none; }
/* @@FEISHU-SKIN-END@@ */

/* @@FEISHU-SKIN2-BEGIN@@ ==================================================
   飞书表格版（一行行列表）—— 2026-10-04 起为默认皮肤：
   body 默认带 skin-fs + skin-fs-tbl（?fs=0 回退原版、?fs=1 切卡片版）。
   与「卡片版皮肤」共用组件样式（skin-fs）；本段只重写「布局与行样式」：
   原来的「工序分列 + 卡片」→「工序分组块 + 一行行记录」。
   ======================================================================== */

/* —— 总布局：工序块纵向全宽堆叠 —— */
body.skin-fs-tbl #page-board .board-grid { display: block; }
body.skin-fs-tbl #page-board .bcol {
  background: #fff; border: 1px solid var(--fk-border); border-radius: 8px;
  padding: 0; margin-bottom: 14px; overflow: hidden;
  display: block;
}

/* —— 工序分组头：浅灰横条 —— */
body.skin-fs-tbl #page-board .bcol-head {
  background: var(--fk-bg); border: none; border-bottom: 1px solid var(--fk-border);
  border-radius: 0; padding: 9px 14px;
}

/* —— 记录行：一条订单一行（原卡片改为横排） —— */
body.skin-fs-tbl #page-board .bitem {
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px 12px;
  padding: 9px 14px; background: #fff;
  border: none; border-top: 1px solid var(--fk-border); border-radius: 0;
}
body.skin-fs-tbl #page-board .bcol-head + .bitem,
body.skin-fs-tbl #page-board .bcol-head + .bgrp-head { border-top: none; }
body.skin-fs-tbl #page-board .bitem.clickable:hover {
  background: #f7f9fc; box-shadow: none; border-color: var(--fk-border);
}
body.skin-fs-tbl #page-board .bitem .no { flex: 0 0 auto; }
body.skin-fs-tbl #page-board .bitem .craft { margin: 0; }
body.skin-fs-tbl #page-board .bitem .pairln { margin: 0; }
body.skin-fs-tbl #page-board .bitem .smp-badge { margin: 0; }
body.skin-fs-tbl #page-board .bitem .meta { margin: 0; flex: 0 0 auto; }
body.skin-fs-tbl #page-board .bitem .card-ops { margin: 0 0 0 auto; display: inline-flex; gap: 6px; }
body.skin-fs-tbl #page-board .bitem .rel-by,
body.skin-fs-tbl #page-board .bitem .vnote-b,
body.skin-fs-tbl #page-board .bitem .sew-line-b { flex-basis: 100%; margin-top: 0; }

/* —— 等待确认大货行：白底 + 左侧橙条 —— */
body.skin-fs-tbl #page-board .bitem.gate { border-left: 3px solid var(--fk-orange); padding-left: 11px; }
body.skin-fs-tbl #page-board .bitem.gate.clickable:hover { background: #fff8f1; }
body.skin-fs-tbl #page-board .bitem.gate .gst { margin: 0; }

/* —— 同号多款分组：行间小条 + 子行缩进 —— */
body.skin-fs-tbl #page-board .bgrp-head {
  background: #fafbfc; border: none; border-top: 1px solid var(--fk-border);
  border-radius: 0; padding: 7px 14px;
}
body.skin-fs-tbl #page-board .bgrp-head:hover { background: #f0f4fa; }
body.skin-fs-tbl #page-board .bcol.gate-col .bgrp-head { background: #fafbfc; }
body.skin-fs-tbl #page-board .bcol.gate-col .bgrp-head:hover { background: #f0f4fa; }
body.skin-fs-tbl #page-board .bgrp-body { display: block; border-left: none; }
body.skin-fs-tbl #page-board .bgrp-body .bitem { padding-left: 34px; }
body.skin-fs-tbl #page-board .bgrp-body .bitem:first-child { border-top: 1px solid var(--fk-border); }

/* —— 工序块内的全宽按钮（整个「待确认大货」批量确认）—— */
body.skin-fs-tbl #page-board .bcol > .btn { margin: 8px 14px !important; width: calc(100% - 28px) !important; }
/* 空工序块的占位行：压矮一点，别占地方 */
body.skin-fs-tbl #page-board .empty { padding: 8px 14px !important; font-size: var(--fs-sm); }
/* —— 工序块折叠（2026-10-04）：点标题条折叠单块；表格版给出箭头与手型提示 —— */
body.skin-fs-tbl #page-board .bcol-head { cursor: pointer; user-select: none; }
body.skin-fs-tbl #page-board .bcol-head:hover { background: #eceef1; }
body.skin-fs-tbl #page-board .bcol-head::after {
  content: '▾'; margin-left: 6px; flex: none; color: var(--fk-tx3); font-size: 10px; line-height: 1;
}
body.skin-fs-tbl #page-board .bcol.folded .bcol-head::after { content: '▸'; }
body.skin-fs-tbl #page-board .bcol.folded > :not(.bcol-head) { display: none; }
/* @@FEISHU-SKIN2-END@@ */

/* @@REPBTN-BEGIN@@ ==========================================================
   报工入口加大 / 高对比（2026-10-04 用户：报工按钮要醒目、方便触屏点击）
   —— 看板「报工」（卡片行内 a.lnk + 同号分组头按钮）+ 报工框「提交报工」+
      订单面板「去报工」统一做大：实心主色底 + 白字加粗 + 最小高度 40px（触屏友好）。
   三档皮肤通用（表格版 / 卡片版 / 原版）；按钮颜色随皮肤走
   （普通档 = --pri 深蓝；飞书皮肤档 = --fk-blue 亮蓝）。
   回滚：整段删除即可（不改任何既有规则）。
   ========================================================================== */
:root { --rep-bg: #185fa5; --rep-bg-h: #0f4a83; --rep-sh: rgba(24,95,165,.28); }
body.skin-fs { --rep-bg: #3370ff; --rep-bg-h: #245bdb; --rep-sh: rgba(51,112,255,.28); }

/* —— 看板「报工」（卡片行内 / 同号分组头）：实心大按钮 —— */
body #page-board #boardGrid a.lnk[data-report],
body #page-board #boardGrid button.btn[data-report],
body #page-board #boardGrid button.btn[data-smprep] {
  display: inline-flex; align-items: center; justify-content: center; gap: 4px;
  min-height: 40px; padding: 0 20px; margin: 0;
  border: 0; border-radius: 8px; background: var(--rep-bg); color: #fff;
  font-size: var(--fs-base); font-weight: 600; line-height: 1;
  text-decoration: none; white-space: nowrap; cursor: pointer;
  box-shadow: 0 2px 8px var(--rep-sh);
  -webkit-tap-highlight-color: transparent; touch-action: manipulation;
  transition: background .15s, box-shadow .15s, transform .05s;
}
body #page-board #boardGrid a.lnk[data-report]:hover,
body #page-board #boardGrid button.btn[data-report]:hover,
body #page-board #boardGrid button.btn[data-smprep]:hover {
  background: var(--rep-bg-h); box-shadow: 0 3px 10px var(--rep-sh);
}
body #page-board #boardGrid a.lnk[data-report]:active,
body #page-board #boardGrid button.btn[data-report]:active,
body #page-board #boardGrid button.btn[data-smprep]:active {
  background: var(--rep-bg-h); box-shadow: none; transform: translateY(1px);
}

/* —— 报工框底部「提交报工」：再大一号（车间最关键的确认动作） —— */
body .modal.rp-modal .rp-foot #rSubmit {
  min-height: 44px; padding: 0 36px; font-weight: 600; font-size: var(--fs-lg);
  border-radius: 8px; box-shadow: 0 2px 8px var(--rep-sh);
}
body .modal.rp-modal .rp-foot #rSubmit:hover { box-shadow: 0 3px 10px var(--rep-sh); }

/* —— 订单面板底部「去报工」：白底 → 实心主色（和看板一致） —— */
body .modal.om-modal .om-foot [data-omrep] {
  background: var(--rep-bg); border-color: var(--rep-bg); color: #fff;
  font-weight: 600; box-shadow: 0 2px 8px var(--rep-sh);
}
body .modal.om-modal .om-foot [data-omrep]:hover {
  background: var(--rep-bg-h); border-color: var(--rep-bg-h); color: #fff;
  box-shadow: 0 3px 10px var(--rep-sh);
}
/* @@REPBTN-END@@ */

/* @@REPBTN2-BEGIN@@ ==========================================================
   车间操作按钮加大 · 第二批（2026-10-04 用户：「机台样确认」「拍照完成」「确认大货」
   这几个小按钮也可以大）—— 与「报工」同一规格：实心主色、白字加粗、最小 40px。
   覆盖：卡片「机台样确认 / 拍照·寄样完成 / 确认大货」+ 同号组头批量变体
   （整组确认转大货 / 整单确认 / 确认块 / 整单拍照·寄样 / 块N拍照·寄样）。
   颜色随皮肤（--rep-bg 由 @@REPBTN 段定义：普通档深蓝 / skin-fs 亮蓝）。
   回滚：整段删除即可（不改任何既有规则）。
   ========================================================================== */
body #page-board #boardGrid button.btn[data-mchk],
body #page-board #boardGrid button.btn[data-smpdone],
body #page-board #boardGrid button.btn[data-release],
body #page-board #boardGrid button.btn[data-release-all],
body #page-board #boardGrid button.btn[data-mchkgrp],
body #page-board #boardGrid button.btn[data-mchkblk],
body #page-board #boardGrid button.btn[data-smpgroup],
body #page-board #boardGrid button.btn[data-smpgblk] {
  min-height: 40px; padding: 0 20px; margin: 0;
  border: 0; border-radius: 8px; background: var(--rep-bg); color: #fff;
  font-size: var(--fs-base); font-weight: 600; line-height: 1;
  box-shadow: 0 2px 8px var(--rep-sh);
  -webkit-tap-highlight-color: transparent; touch-action: manipulation;
  transition: background .15s, box-shadow .15s, transform .05s;
}
body #page-board #boardGrid button.btn[data-mchk]:hover,
body #page-board #boardGrid button.btn[data-smpdone]:hover,
body #page-board #boardGrid button.btn[data-release]:hover,
body #page-board #boardGrid button.btn[data-release-all]:hover,
body #page-board #boardGrid button.btn[data-mchkgrp]:hover,
body #page-board #boardGrid button.btn[data-mchkblk]:hover,
body #page-board #boardGrid button.btn[data-smpgroup]:hover,
body #page-board #boardGrid button.btn[data-smpgblk]:hover {
  background: var(--rep-bg-h); box-shadow: 0 3px 10px var(--rep-sh);
}
body #page-board #boardGrid button.btn[data-mchk]:active,
body #page-board #boardGrid button.btn[data-smpdone]:active,
body #page-board #boardGrid button.btn[data-release]:active,
body #page-board #boardGrid button.btn[data-release-all]:active,
body #page-board #boardGrid button.btn[data-mchkgrp]:active,
body #page-board #boardGrid button.btn[data-mchkblk]:active,
body #page-board #boardGrid button.btn[data-smpgroup]:active,
body #page-board #boardGrid button.btn[data-smpgblk]:active {
  background: var(--rep-bg-h); box-shadow: none; transform: translateY(1px);
}
/* @@REPBTN2-END@@ */

/* @@RLOGTABS-BEGIN@@ ========================================================
   报工流水「工序标签栏」（2026-10-05 用户：默认显示织造；点哪个工序看哪个环节）。
   点标签 = 设置隐藏字段 #rLogProc → renderToday() 重渲染。
   选中态实心主色、颜色随皮肤走（--rep-bg 由 @@REPBTN 段定义：
   普通档深蓝 / skin-fs 亮蓝）。回滚：整段删除即可
   （app.js 侧搜索 rlog-tab / logTabsSync 一并回滚）。
   ========================================================================== */
#page-report .rlog-tabs { display: flex; flex-wrap: wrap; gap: 6px; margin: 2px 0 10px; }
#page-report .rlog-tab {
  display: inline-flex; align-items: center; justify-content: center;
  min-height: 36px; padding: 0 16px; margin: 0;
  border: 1px solid var(--border); border-radius: 18px; background: #fff; color: var(--tx);
  font-size: var(--fs-md); font-weight: 500; line-height: 1; cursor: pointer;
  -webkit-tap-highlight-color: transparent; touch-action: manipulation;
  transition: background .12s, color .12s, border-color .12s;
}
#page-report .rlog-tab:hover { border-color: var(--rep-bg); color: var(--rep-bg); }
#page-report .rlog-tab.on { background: var(--rep-bg); border-color: var(--rep-bg); color: #fff; font-weight: 600; }
#page-report .rlog-tab.on:hover { color: #fff; }
/* @@RLOGTABS-END@@ */

/* @@RLOGGLUE-BEGIN@@ ========================================================
   「点胶」专属视图（2026-10-05 用户参考图定制：第一个单独设计的环节）——
   顶部小结条 + 按大货 / 样品分段（段头可收起）+ 行内「订单类型」浅蓝标签；
   「点胶费」列 = 人工填（10-06 用户口径：取消自动计算）。回滚：整段删除即可（app.js 侧搜索 gl-sum / gl-seg / gl-tag / glueFold）。
   ========================================================================== */
#page-report .gl-sum {
  display: flex; align-items: center; gap: 6px; min-height: 36px; padding: 4px 12px;
  margin: 2px 0 10px; background: #f5f7f9; border-radius: 8px; color: var(--tx2); font-size: var(--fs-md);
}
#page-report .gl-sum b { color: var(--tx); font-weight: 600; }
#page-report .gl-seg { margin-bottom: 12px; }
#page-report .gl-seg-head {
  display: flex; align-items: center; gap: 8px; min-height: 34px; padding: 0 6px;
  border-radius: 6px; cursor: pointer; user-select: none; -webkit-user-select: none;
  -webkit-tap-highlight-color: transparent; touch-action: manipulation;
}
#page-report .gl-seg-head:hover { background: #f5f7f9; }
#page-report .gl-seg-head .arw { color: var(--tx2); font-size: 14px; width: 14px; text-align: center; flex: none; }
#page-report .gl-seg-head .nm { font-weight: 600; color: var(--tx); }
#page-report .gl-seg-head .cnt2 { color: var(--tx3); font-size: var(--fs-xs); }
#page-report .gl-seg.folded > .gl-seg-body { display: none; }
#page-report .gl-seg table td { white-space: nowrap; }   /* 窄屏不折行（横滑查看，防「款式」折成竖排） */
#page-report .gl-seg .sub { color: var(--tx2); font-size: var(--fs-sm); }   /* 款式一览的交叉尺寸小字（10-06 九调：1-1 19/21/23/25） */
#page-report .gl-tag {
  display: inline-block; padding: 1px 10px; border-radius: 12px; line-height: 1.7;
  background: var(--pri-soft); color: var(--pri); font-size: var(--fs-xs); font-weight: 500; white-space: nowrap;
}
#page-report .gl-tag.warn { background: var(--warn-soft); color: var(--warn); }   /* 徐敏（外发）橙标（10-05） */
#page-report .gl-tag.kd { background: var(--ok-soft); color: var(--ok); }         /* 非 PVC 胶种（低温胶 / 硅胶 / 脚后跟透明硅胶）绿标（10-05） */
/* 10-18 方案A：胶种列全列统一胶囊 —— 可点的胶囊（单条行=就地改 / 合并行=按款设置）加手型与悬停圈；
   空胶种（库里没填、按 PVC 计）用灰标「PVC（未填）」，与「确认用 PVC」区分 */
#page-report .gl-tag.gk-edit, #page-report .gl-tag.gk-perk { cursor: pointer; }
#page-report .gl-tag.gk-edit:hover, #page-report .gl-tag.gk-perk:hover { box-shadow: 0 0 0 2px var(--pri-soft); }
#page-report .gl-tag.emp { background: var(--bg); color: var(--tx3); }
/* 10-18：未知胶种（不在标准枚举里）—— 已单独成条，用红标警示核对 */
#page-report .gl-tag.unk { background: var(--red-soft); color: var(--red); }
#page-report .gk-sel {
  width: 122px; padding: 4px 6px; font-size: var(--fs-xs); border: 1px solid var(--border);
  border-radius: 6px; background: #fff; color: var(--tx); cursor: pointer;
}
#page-report .gs-sel {
  width: 122px; padding: 4px 6px; font-size: var(--fs-xs); border: 1px solid var(--border);
  border-radius: 6px; background: #fff; color: var(--tx); cursor: pointer;
}
#page-report .gs-sel.warn { color: var(--warn); font-weight: 600; }   /* 徐敏（外发）醒目（10-06 阶段列可选更改） */
#page-report .gk-price { cursor: pointer; border-bottom: 1px dashed var(--border); }                       /* 单价可点填（点胶 10-06 公式版 / 手工 10-07 共用）：点金额可填写 */
#page-report .gk-price.empty { color: var(--warn); border-bottom-color: var(--warn); font-weight: 600; }   /* 单价未填 —— 橙色醒目，点它填写 */
#page-report .glue-fee-out.none { color: var(--tx2); }                                                     /* 点胶费未算（单价未填）—— 灰「—」 */
#page-report .gk-inp { width: 84px; padding: 3px 6px; font-size: var(--fs-sm); border: 1px solid var(--pri); border-radius: 6px; text-align: right; }   /* 单价就地编辑框（10-06 二期：直接填数字；10-07 手工共用） */
#page-report .hcraft.edit { cursor: pointer; border-bottom: 1px dashed var(--border); }   /* 手工做法可点改（10-08）：同「价格」列点感 */
#page-report .hcraft.edit:hover { color: var(--pri); border-bottom-color: var(--pri); }
/* 「订单号」列可复制（10-07 用户需求：列头由「任务项」改为「订单号」、点一下即复制、旁边小按钮开面板）
   —— 单号可拖选（.gl-seg td 的 nowrap + 表格拖选求和会压掉文字选择，这里放行）+ 虚线下划线提示可点。 */
#page-report .gl-seg td.ordc, #page-report .gl-seg td.ordc * { user-select: text; -webkit-user-select: text; }
#page-report .ordno { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
#page-report .ordno-cp { cursor: pointer; border-bottom: 1px dashed var(--pri); }
#page-report .ordno-cp:hover { color: var(--pri); border-bottom-style: solid; }
#page-report .ordno-op {
  font-size: var(--fs-xs); line-height: 1.6; color: var(--tx2); text-decoration: none; white-space: nowrap;
  border: 1px solid var(--border); border-radius: 6px; padding: 0 6px; background: #fff; cursor: pointer;
}
#page-report .ordno-op:hover { color: var(--pri); border-color: var(--pri); background: var(--pri-soft); }
/* 「点胶成本」区域（10-07 用户参考图重做）：代班费明细（全天 / 半天：单次费用 × 次数 = 汇总）+ 师傅工资 /
   胶油原料费 / 硅胶原料费 → 点胶总成本（自动算）；7 个值人工手填（app.js glueCostEdit / .glc-val）、按月存、仅管理员可见可填；
   回滚随 @@RLOGGLUE 段整段删） */
#page-report .gl-cost { margin: 2px 0 4px; padding: 10px 12px 12px; background: #f5f7f9; border-radius: 8px; }
#page-report .gl-cost-head { font-size: var(--fs-xs); font-weight: 600; color: var(--tx2); margin-bottom: 8px; }
#page-report .glc-tbl { border-collapse: collapse; background: #fff; }
#page-report .glc-tbl th, #page-report .glc-tbl td { padding: 5px 16px; font-size: var(--fs-md); border: 1px solid var(--border); }
#page-report .glc-tbl th { background: #f5f7f9; color: var(--tx2); font-weight: 600; font-size: var(--fs-xs); }
#page-report .glc-tbl th.cat { min-width: 96px; }
#page-report .glc-tbl td.cat { color: var(--tx); text-align: left; white-space: nowrap; }
#page-report .glc-tbl td.n { text-align: center; white-space: nowrap; min-width: 110px; }
#page-report .glc-tbl tr.glc-sum td { background: #fafbfc; color: var(--tx2); }
#page-report .glc-tbl tr.glc-sum td.n { color: var(--tx); font-weight: 600; }
#page-report .glc-tbl tr.glc-total td { background: var(--pri-soft); font-weight: 700; }
#page-report .glc-tbl tr.glc-feesum td { background: #f5f7f9; font-weight: 700; }   /* 「点胶费总和」行（10-07 用户：当月点胶费总和，自动算） */
#page-report .glc-tbl tr.glc-profit td { background: #f5f7f9; font-weight: 700; }   /* 「大概利润」行（10-07 用户；10-13 起：点胶费总和（厂内）- 点胶总成本 —— 外发费用不计入，自动算） */
#page-report .glc-tbl tr.glc-total td.n .glc-out { color: var(--pri); }
#page-report .glc-val { font-weight: 600; color: var(--tx); cursor: pointer; border-bottom: 1px dashed var(--border); }   /* 人工填的值（点它填 / 改） */
#page-report .glc-val.glc-none { color: var(--tx2); font-weight: 500; }                                                    /* 未填：灰「—」，点它填（⚠️别叫 empty —— 撞全局 .empty 的 padding:24px） */
#page-report .glc-val:hover { color: var(--pri); border-bottom-style: solid; }
#page-report .glc-out { font-weight: 600; color: var(--tx); }                                                              /* 自动算的值（只读） */
#page-report .glc-out.none { color: var(--tx3); font-weight: 500; }                                                        /* 未算（相关项没填）：灰「—」 */
#page-report .glc-tbl tr.glc-feesum-out td { background: #fdf7ee; }                                                        /* 「外发费用（徐敏）」行（10-13 晚：与厂内分开核算、不合并统计） */
#page-report .glc-tbl tr.glc-feesum-out td.n .glc-fee-out { color: var(--warn); }
#page-report .glc-tbl tr.glc-qty-out td { background: #fdf7ee; }                                                           /* 「点胶总数量（外发）」行（10-14 用户：与厂内分开核算、不合并统计） */
#page-report .glc-tbl tr.glc-qty-out td.n .glc-out { color: var(--warn); }
/* ---- 来源筛选 chips + 子组小标（10-13 晚「方案二」：点胶+二次点胶合并一条 / 外发与厂内分开） ---- */
#page-report .glf { display: inline-flex; gap: 6px; margin-left: 12px; vertical-align: middle; }
#page-report .glf-chip {
  cursor: pointer; padding: 1px 12px; border: 1px solid var(--border); border-radius: 999px;
  font-size: var(--fs-xs); color: var(--tx2); background: #fff; line-height: 1.8; user-select: none;
}
#page-report .glf-chip:hover { border-color: var(--pri); color: var(--pri); }
#page-report .glf-chip.on { background: var(--pri); border-color: var(--pri); color: #fff; }
#page-report .gl-subx {
  display: inline-block; font-size: var(--fs-xs); line-height: 1.6; padding: 0 6px; border-radius: 8px;
  background: var(--pri-soft); color: var(--pri); white-space: nowrap;
}
#page-report .gl-subx.warn { background: var(--warn-soft); color: var(--warn); }    /* 徐敏（外发）橙标 */
#page-report .gl-subrow { display: block; line-height: 1.9; }                       /* 行内多子组：每子组一行（费用各自独立、不合并） */
#page-report .gl-seg-out > .gl-seg-head { background: var(--warn-soft); }           /* 「外发（徐敏）」段头浅橙（10-13 晚） */
#page-report .gl-seg-out > .gl-seg-head .nm { color: var(--warn); }
/* @@RLOGGLUE-END@@ */

/* @@RLOGSORT-BEGIN@@ ========================================================
   报工流水「设置排序条件」面板（2026-10-05 用户参考飞书排序面板）——
   条件行：字段下拉 + 方向切换（分段式、选中白底蓝字）+ 删除；「＋ 选择条件」。
   面板本体是 .tbl-pop 浮层（fixed 定位，交互在 app.js rlogSort* 区块）。
   回滚：整段删除即可（app.js 搜 rlogSort / rsp- 前缀一并回滚）。
   ========================================================================== */
.rlog-sort-pop { width: 336px; }
.rsp-title { font-weight: 600; margin-bottom: 10px; }
.rsp-row { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.rsp-row .rsp-field { max-width: 96px; flex: none; }
.rsp-seg { display: inline-flex; background: #f1f3f5; border-radius: 8px; padding: 2px; margin-left: auto; }
.rsp-seg button { border: none; background: transparent; color: var(--tx2); font-size: var(--fs-md); line-height: 1; padding: 6px 11px; border-radius: 6px; cursor: pointer; white-space: nowrap; }
.rsp-seg button.on { background: #fff; color: var(--rep-bg); font-weight: 600; box-shadow: 0 1px 2px rgba(0,0,0,.08); }
.rsp-del { border: none; background: none; color: var(--tx2); font-size: 16px; line-height: 1; cursor: pointer; padding: 2px 5px; border-radius: 4px; flex: none; }
.rsp-del:hover { background: var(--red-soft); color: var(--red); }
.rsp-add { display: inline-flex; align-items: center; gap: 4px; border: none; background: #f1f3f5; color: var(--tx2); border-radius: 8px; padding: 7px 12px; font-size: var(--fs-md); cursor: pointer; }
.rsp-add:hover { background: #e9ecef; color: var(--tx); }
.rsp-hint { margin-top: 8px; font-size: var(--fs-xs); color: var(--tx3); }
/* @@RLOGSORT-END@@ */

/* @@CELLSUM-BEGIN@@ ========================================================
   报工流水「拖选求和」（2026-10-05 用户：Excel / 多维表格式框选自动合计）——
   选中格浅蓝高亮 + 右下角深色合计浮条（固定定位、不吃鼠标点击）。
   回滚：整段删除即可（app.js 搜 cellSel / bindCellSelect 一并回滚）。
   ========================================================================== */
#rToday td.selc { background: var(--pri-soft) !important; }
#page-report .cellsum {
  position: fixed; right: 16px; bottom: 16px; z-index: 65;
  background: rgba(31, 35, 41, .92); color: #fff; border-radius: 10px;
  padding: 10px 14px; font-size: var(--fs-md); line-height: 1.5;
  box-shadow: 0 6px 20px rgba(0,0,0,.25); display: none;
  max-width: min(340px, 90vw); pointer-events: none;
}
#page-report .cellsum b { font-size: var(--fs-lg); }
#page-report .cellsum .sum-sub { color: #cbd2da; font-size: var(--fs-xs); }
/* @@CELLSUM-END@@ */

/* @@RLOGMONTH-BEGIN@@ =======================================================
   报工流水「按月分组」（2026-10-05 用户：每个环节的记录按月一组、可收起展开）——
   月份组头浅灰条（月名 + N 条记录 + 合格合计，点收起/展开）；点胶视图在月份内再按大货/样品分段。
   回滚：整段删除即可（app.js 搜 rlogMonth 前缀一并回滚）。
   ========================================================================== */
#page-report .rlm { margin-bottom: 14px; }
#page-report .rlm-head {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap; row-gap: 2px;
  min-height: 38px; padding: 5px 12px; margin-bottom: 6px;
  background: #f5f7f9; border-radius: 8px; cursor: pointer;
  user-select: none; -webkit-user-select: none; -webkit-tap-highlight-color: transparent;
}
#page-report .rlm-head:hover { background: #eceff2; }
#page-report .rlm-head .arw { color: var(--tx); font-size: 15px; width: 16px; text-align: center; flex: none; }
#page-report .rlm-head .nm { font-weight: 600; }
#page-report .rlm-head .cnt { font-size: var(--fs-xs); font-weight: 500; color: var(--tx2); background: #fff; border-radius: 10px; padding: 2px 9px; }
#page-report .rlm-head .sum { font-size: var(--fs-xs); color: var(--tx3); }
#page-report .rlm.folded > .rlm-body { display: none; }
/* @@HANDSUM-BEGIN@@ 手工视图·月度金额汇总（10-07 晚 用户：手工部分每月金额汇总；金额仅管理员可见） */
#page-report .rlm-head .money { font-size: var(--fs-xs); font-weight: 600; color: var(--tx); background: #fff; border-radius: 10px; padding: 2px 9px; }
#page-report tr.hand-sum td { background: #f5f7f9; color: var(--tx2); font-size: var(--fs-md); }
#page-report tr.hand-sum td.n { color: var(--tx); font-weight: 600; }
/* @@HANDSUM-END@@ */
/* @@RLOGMONTH-END@@ */


/* @@LEDGVIEW-BEGIN@@ 出货记录「仿飞书表格」视图（10-05）：可点排序表头 / 分组行 / 底部合计 / 紧凑行高
   —— 回滚：整段删除即可（app.js 侧搜索 LEDG_ / ledg 前缀区块一并回滚） */
table.ledgtbl th.ledg-th { cursor: pointer; user-select: none; white-space: nowrap; }
table.ledgtbl th.ledg-th:hover { color: var(--pri); }
table.ledgtbl .ledg-si { color: var(--pri); font-size: 10px; }
table.ledgtbl.dense td { padding: 4px 10px; }
table.ledgtbl.dense th { padding: 5px 10px; }
table.ledgtbl tr.ledg-grp td { background: #f5f7f9; color: var(--tx2); font-size: var(--fs-sm); cursor: pointer; }
table.ledgtbl tr.ledg-grp:hover td { background: var(--pri-soft); }
table.ledgtbl tr.ledg-grp b { color: var(--tx); font-size: var(--fs-md); }
#page-shipment .btn.on2 { border-color: var(--pri); color: var(--pri); background: var(--pri-soft); }
.ledg-stats { margin-top: 8px; font-size: var(--fs-sm); color: var(--tx2); background: #f5f7f9; border-radius: 8px; padding: 6px 10px; }
.ledg-stats b { color: var(--tx); }
/* 出货记录：行内订单勾选（10-16 用户：订单号旁方形小复选框 + Shift 连选；照订单表格 .ot-ck / .ot-qsel 口径） */
table.ledgtbl .ledg-ck { width: auto; margin: 0 7px 0 1px; vertical-align: middle; cursor: pointer; }
table.ledgtbl tr.ledg-picked td { background: #d9ecff; box-shadow: inset 0 0 0 1px rgba(21, 87, 163, .35); }
/* 出货记录：拖选一片 → 右下角合计（10-16 用户「区域」需求；浮条照报工流水 .cellsum 口径） */
tr.ledg-row.ledg-dsel td { background: #cfe3fb; box-shadow: inset 0 0 0 1px rgba(21, 87, 163, .5); }
body.ledgdrag, body.ledgdrag * { user-select: none !important; }
.ledgsel { position: fixed; right: 16px; bottom: 16px; z-index: 65; background: rgba(31, 35, 41, .92); color: #fff;
  border-radius: 10px; padding: 10px 14px; font-size: var(--fs-md); line-height: 1.5;
  box-shadow: 0 6px 20px rgba(0,0,0,.25); display: none; max-width: min(460px, 90vw); }
.ledgsel b { font-size: var(--fs-lg); }
.ledgsel .btn { margin-left: 8px; }
/* @@LEDGVIEW-END@@ */

/* ---------- @@ZIMG-BEGIN@@ 图片大图「捏合 / 双击」缩放查看器（10-05 手机端需求） ---------- */
/* 视口固定高度、图片先整页适配；缩放/位移由 app.js makeZoomable() 驱动。整段删除即回滚样式。 */
.zimg-view {
  position: relative; height: min(66vh, 520px); overflow: hidden; background: #fafbfc;
  border: 1px solid var(--border); border-radius: 10px;
  display: flex; align-items: center; justify-content: center;
  touch-action: none; overscroll-behavior: contain;
  cursor: zoom-in; user-select: none; -webkit-user-select: none; -webkit-touch-callout: none;
}
.zimg-view.zoomed { cursor: grab; }
.zimg-view img {
  max-width: 100%; max-height: 100%; display: block;
  transform-origin: center center; will-change: transform;
  -webkit-user-drag: none; user-select: none; -webkit-user-select: none;
}
/* ---------- @@ZIMG-END@@ ---------- */

/* @@TAGS-PAGE@@（10-07 晚 工艺贴打印页） */
#page-tags .toolbar{flex-wrap:wrap;gap:8px}
#page-tags .toolbar select,#page-tags .toolbar input{height:32px}
#page-tags table td{vertical-align:middle}


/* @@TOUCH-BEGIN@@ —— 车间触屏账号（角色「车间触屏」）专用放大（10-15）。
   只对这一个角色生效（app.js 登录后给 body 挂 .touch class），其它账号零影响。
   回滚 = 删掉本标记段 + app.js 里那两行 classList 调用。
   做法：① 字号直接抬 CSS 变量（不逐选择器写 font-size，免得跟组件样式 / @media 打架）
        ② 布局类规则（表格内边距）包在 @media(min-width:721px) 里 —— 窄屏让既有响应式规则说话
        ③ 复选框显式给尺寸（它会继承 input{width:100%} 撑满格子） */
@media screen and (min-width: 721px) {
  body.touch { --fs-sm: 13px; --fs-md: 15px; --fs-base: 16px; --fs-lg: 18px; --fs-xl: 20px; }
  body.touch th, body.touch td { padding: 12px 12px; }
}
body.touch .btn { padding: 11px 18px; border-radius: 10px; min-height: 44px; }
body.touch .btn.sm { padding: 8px 14px; border-radius: 8px; min-height: 44px; }
body.touch input, body.touch select, body.touch textarea { padding: 11px 12px; }
body.touch input[type="checkbox"], body.touch input[type="radio"] {
  width: 22px; height: 22px; min-width: 22px; min-height: 22px;
}
body.touch .sidebar a { padding: 14px 14px; margin-bottom: 6px; border-radius: 10px; }
body.touch .toolbar input, body.touch .toolbar select { min-height: 42px; }
@media screen and (max-width: 720px) {
  body.touch .btn { min-height: 44px; }
  body.touch th, body.touch td { padding: 11px 8px; }
}
/* @@TOUCH-END@@ */

/* @@WLOGBATCH-BEGIN@@ 报工流水「多选 + 批量更改」（10-18）
   已选提示 / 批量弹窗 / 移动端点击区。回滚 = 删本段 + app.js 搜 rlogSel / batchEdit。 */
#page-report .rlog-tabbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 2px 0 10px; }
#page-report .rlog-tabbar .rlog-tabs { flex: 1 1 auto; margin: 0; }
#page-report .rlog-selinfo { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-sm);
  color: var(--tx2); background: var(--pri-soft); border-radius: 14px; padding: 3px 10px; white-space: nowrap; }
#page-report .rlog-selinfo[hidden] { display: none; }
#page-report .rlog-selinfo { margin-left: auto; }
#page-report .rlog-selinfo b { color: var(--pri); font-size: var(--fs-base); }
#page-report .rlog-selinfo .lnk { font-size: var(--fs-sm); }
#page-report .rlm-body td:first-child input.rLogCk,
#page-report .rlm-body th:first-child input.rLogAll,
#page-report .gl-seg-body td:first-child input.rLogCk,
#page-report .gl-seg-body th:first-child input.rLogAll { width: 18px !important; height: 18px !important; min-width: 18px; cursor: pointer; }
.modal.rp-modal.batch-modal { max-width: min(760px, 96vw); }
.bw-lead { background: var(--warn-soft); color: var(--warn); border-radius: 8px; padding: 8px 12px;
  font-size: var(--fs-sm); line-height: 1.7; }
.bw-fields { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; }
.bw-f { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 9px 12px;
  border: 1px solid var(--border); border-radius: 10px; transition: background .12s, border-color .12s; }
.bw-f.off { background: #fafbfc; }
.bw-f:not(.off) { border-color: var(--pri); background: var(--pri-soft); }
.bw-ck { display: inline-flex; align-items: center; gap: 7px; min-width: 122px; font-size: var(--fs-md);
  font-weight: 600; cursor: pointer; }
.bw-ck input { width: 18px; height: 18px; }
.bw-ctl { flex: 1; min-width: 190px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.bw-ctl input[type=date], .bw-ctl input[type=number], .bw-ctl select { max-width: 240px; }
.bw-hint { font-size: var(--fs-xs); color: var(--tx2); }
.bw-n { font-size: var(--fs-sm); color: var(--tx2); white-space: nowrap; }
.bw-n b { color: var(--pri); }
.bw-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.bw-chip { display: inline-flex; align-items: center; gap: 5px; border: 1px solid var(--border);
  border-radius: 14px; padding: 3px 10px; font-size: var(--fs-sm); background: #fff; cursor: pointer; }
.bw-chip input { width: 15px; height: 15px; margin: 0; }
.bw-chip.on { border-color: var(--pri); background: var(--pri-soft); color: var(--pri); }
.bw-err { color: var(--red); font-size: var(--fs-sm); min-height: 18px; margin-top: 8px; }
.bw-confirm-t { margin: 0 0 10px; font-size: var(--fs-base); }
.bw-scope { margin-top: 12px; padding: 8px 12px; border: 1px dashed var(--border); border-radius: 8px;
  font-size: var(--fs-sm); line-height: 1.8; color: var(--tx2); }
.bw-scope b { color: var(--tx); }
.bw-sumlist { margin: 0; padding-left: 20px; font-size: var(--fs-md); line-height: 1.9; }
.bw-result { font-size: var(--fs-base); padding: 10px 12px; border-radius: 8px; background: var(--ok-soft); color: var(--ok); }
.bw-result .err { color: var(--warn); }
.bw-skipttl { font-weight: 600; font-size: var(--fs-md); margin: 12px 0 6px; }
.bw-skip { max-height: 220px; overflow: auto; border: 1px solid var(--border); border-radius: 8px;
  padding: 8px 10px; font-size: var(--fs-sm); line-height: 1.8; }
@media (max-width: 760px) {
  #page-report .rlm-body td:first-child input.rLogCk,
  #page-report .rlm-body th:first-child input.rLogAll,
  #page-report .gl-seg-body td:first-child input.rLogCk,
  #page-report .gl-seg-body th:first-child input.rLogAll { width: 22px !important; height: 22px !important; }
  .bw-f { align-items: flex-start; }
  .bw-ck { width: 100%; }
  .bw-ctl { width: 100%; min-width: 0; }
  .bw-ctl input[type=date], .bw-ctl input[type=number], .bw-ctl select { max-width: none; width: 100%; }
  .bw-n { width: 100%; }
  .modal.rp-modal.batch-modal .rp-foot .btn { flex: 1; min-height: 44px; }
  /* 工具栏紧凑排布：标题 / 搜索 / 日期+清除 / 排序+导出 / 已选+两个批量按钮（只动报工流水页） */
  #page-report .toolbar { gap: 6px; }
  #page-report .toolbar .spacer,
  #page-report .toolbar > label.sub,
  #page-report .toolbar > span.sub { display: none; }
  #page-report .toolbar h2 { order: 0; width: 100%; }
  #page-report #rLogQ { order: 1; flex: 1 1 100%; max-width: none !important; }
  #page-report #rLogFrom, #page-report #rLogTo { flex: 1 1 0; width: auto; min-width: 0; max-width: none !important; }
  #page-report #rLogFrom { order: 2; }
  #page-report #rLogTo { order: 3; }
  #page-report #rLogClear { order: 4; }
  #page-report #rLogSortBtn { order: 5; }
  #page-report #rLogExport { order: 6; }
  #page-report .rlog-selinfo { order: 7; flex: 1 1 100%; justify-content: center; }
  #page-report #rLogBatch, #page-report #rLogUndo { flex: 1 1 40%; min-height: 40px; }
  #page-report #rLogBatch { order: 8; }
  #page-report #rLogUndo { order: 9; }
}
/* @@WLOGBATCH-END@@ */

/* ---------- 修改单页面（10-19 用户：导入 → 人工决定是否退回「车间打样」） ---------- */
.revimp-tools { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; padding: 6px 0 10px;
  border-bottom: 1px solid var(--border); margin-bottom: 8px; }
.revimp-list { display: flex; flex-direction: column; gap: 8px; }
.revimp-row, .revimp-prow { display: flex; gap: 10px; align-items: flex-start; padding: 10px 12px;
  border: 1px solid var(--border); border-radius: var(--radius); background: var(--card); }
.revimp-row input[type=checkbox], .revimp-prow input[type=checkbox],
.revimp-tools input[type=checkbox] { width: auto; height: auto; flex: 0 0 auto; margin: 0; }
.revimp-prow > input[type=checkbox], .revimp-row > input[type=checkbox] { margin-top: 4px; }
.revimp-main { flex: 1; min-width: 0; }
.revimp-head { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-bottom: 3px; }
.revimp-orders { display: flex; gap: 6px; flex-wrap: wrap; margin: 4px 0; }
.revimp-ord { display: inline-flex; gap: 6px; align-items: center; background: var(--bg);
  border-radius: 6px; padding: 2px 8px; }
.revimp-text { width: 100%; margin: 6px 0; font: inherit; color: inherit; padding: 6px 8px;
  border: 1px solid var(--border); border-radius: 6px; resize: vertical; background: var(--card); }
.revimp-text.ro { border: 0; padding: 0; background: none; color: var(--tx2); }
.revimp-imgs { display: flex; gap: 6px; flex-wrap: wrap; max-width: 210px; flex: none; }
.revimp-ops { display: flex; flex-direction: column; gap: 6px; flex: none; }
.revimp-warn { color: var(--red); }
.revimp-filter { display: inline-flex; gap: 4px; }
.revimp-kuans { color: var(--tx2); }
.revimp-cf { border-top: 1px dashed var(--border); padding: 8px 0; }
.revimp-detail { color: var(--tx2); margin-top: 3px; }
@media (max-width: 720px) {
  .revimp-row, .revimp-prow { flex-wrap: wrap; }
  .revimp-imgs { max-width: 100%; }
  .revimp-ops { flex-direction: row; width: 100%; }
  .revimp-ops .btn { flex: 1; }
}

/* ---------- 打样完成面板（10-21） ---------- */
.modal.wd-modal { max-width: min(1180px, 97vw); }
.wd-hint { margin: 0 0 10px; line-height: 1.7; }
.wd-list { border: 1px solid var(--border); border-radius: 8px; overflow-x: auto; }
.wd-head, .wd-row { display: grid; grid-template-columns: 26px minmax(150px,1.4fr) 80px 128px 108px 90px minmax(120px,1fr) 92px; gap: 8px; align-items: center; padding: 7px 10px; min-width: 950px; }
.wd-head { background: #f4f6f9; font-size: var(--fs-sm); color: var(--tx2); font-weight: 600; }
.wd-row { border-top: 1px solid var(--border); font-size: var(--fs-md); }
.wd-row .wd-size b { display: block; }
.wd-row .wd-size .sub { display: block; font-size: var(--fs-xs); color: var(--tx3); }
.wd-row .wd-size .sub a.lnk { font-size: var(--fs-sm); }   /* 10-27：订单号可点看单据（师傅按单据填数量） */
.wd-row .wd-qty::placeholder { color: var(--tx3); font-size: var(--fs-sm); }
/* 单据核对弹窗「整单全部页」页码（10-27：同号多款按款分页，点页切主图） */
.esdoc-pages { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 0 0 8px; }
.esdoc-pages .sub { color: var(--tx3); font-size: var(--fs-sm); }
.esdoc-pg { padding: 4px 10px; }
.esdoc-pg.on { background: var(--pri); border-color: var(--pri); color: #fff; }
.wd-row input, .wd-row select { width: 100%; box-sizing: border-box; padding: 5px 6px; font-size: var(--fs-md); }
.wd-row .wd-ck { display: flex; justify-content: center; }
.wd-row .wd-ck input { width: auto; }
.wd-qty.wd-bad { border-color: var(--red); background: var(--red-soft); }
.wd-sock.wd-miss { border-color: var(--red); background: var(--red-soft); }
/* 「标共用」逐行勾（10-21b）：人工选、默认不勾；勾了这行的打样输入灰掉（不读它的数量） */
.wd-sharepick { display: flex; align-items: center; gap: 5px; font-size: var(--fs-sm); color: var(--tx2); white-space: nowrap; cursor: pointer; }
.wd-row .wd-sharepick input { width: auto; }
.wd-sharepick.wd-noc { color: var(--tx3); cursor: not-allowed; }
.wd-row.wd-off .wd-qty, .wd-row.wd-off .wd-sock, .wd-row.wd-off .wd-kind,
.wd-row.wd-off .wd-worker, .wd-row.wd-off .wd-note { opacity: .4; }
.wd-grp { padding: 6px 10px; background: #fafbfc; border-top: 1px solid var(--border); font-size: var(--fs-sm); color: var(--tx2); }
/* 10-27 多版本打样（打样完成面板）：点「＋多版本」在该行下方展开的版本子行 */
.wd-vers { padding: 6px 10px 10px 46px; background: #fbfcfd; border-top: 1px dashed var(--border); }
.wd-vhead { font-size: var(--fs-sm); color: var(--tx2); margin-bottom: 6px; }
.wd-vrow { display: grid; grid-template-columns: 64px 104px minmax(160px, 1fr) 64px; gap: 8px; align-items: center; margin-bottom: 6px; }
.wd-vrow input { width: 100%; box-sizing: border-box; padding: 5px 6px; font-size: var(--fs-md); }
.wd-vtag { display: inline-block; font-size: var(--fs-sm); color: var(--tx2); background: #eef2f7; border-radius: 3px; padding: 1px 6px; font-weight: 600; white-space: nowrap; }
.wd-vqty.wd-bad { border-color: var(--red); background: var(--red-soft); }
.wd-size .wd-vopen { margin-left: 6px; }
.wd-size .wd-vtag { margin-left: 6px; }
.wd-status { margin: 12px 0 0; padding: 9px 12px; border: 1px dashed var(--border); border-radius: 8px; font-size: var(--fs-sm); color: var(--tx2); }
.wd-status-h { font-weight: 600; margin-bottom: 4px; }
.wd-st { display: flex; gap: 10px; padding: 3px 0; align-items: baseline; }
.wd-st .sub { margin-left: auto; }
.wd-share { margin: 12px 0 0; padding: 10px 12px; border: 1px dashed var(--border); border-radius: 8px; }
.wd-share-on { display: flex; align-items: center; gap: 6px; font-size: var(--fs-md); cursor: pointer; }
.wd-share-on input { width: auto; }
.wd-share-item, .wd-pre-item { display: flex; align-items: center; gap: 8px; padding: 4px 0 4px 22px; font-size: var(--fs-md); cursor: pointer; }
.wd-share-item input, .wd-pre-item input { width: auto; }
.wd-sum { margin: 12px 0 0; padding: 9px 12px; background: var(--pri-soft); border-radius: 8px; font-size: var(--fs-md); }
.wd-warn { color: var(--red); }
@media (max-width: 900px) { .modal.wd-modal { max-width: none; } }

/* @@OBBATCH-BEGIN@@ 整单外发（10-26 用户）：一个订单号一张表 */
.modal.ob-modal { max-width: 1000px; }
.ob-tbl { width: 100%; border-collapse: collapse; font-size: var(--fs-md); table-layout: fixed; }
.ob-tbl th:first-child, .ob-tbl td:first-child { width: 178px; }
.ob-tbl th:nth-child(2), .ob-tbl td:nth-child(2) { width: 72px; }
.ob-tbl th { font-size: var(--fs-sm); font-weight: 500; color: var(--tx2); text-align: left;
  padding: 5px 6px; border-bottom: 1px solid var(--border); white-space: nowrap; }
.ob-tbl td { padding: 6px; border-bottom: 1px solid var(--border); vertical-align: top; }
.ob-tbl th.ob-num, .ob-tbl td.ob-num { text-align: right; }
.ob-tbl input.ob-q { width: 66px; padding: 3px 5px; font-size: var(--fs-sm); }
/* 刺绣：单面 / 双面（10-26）—— 针数不翻倍，只换单价档 */
.ob-tbl select.ob-sides { width: 66px; padding: 2px 3px; font-size: var(--fs-sm); margin-bottom: 3px; }
.ob-na { color: var(--tx3); text-align: center; }
.ob-meta { font-size: var(--fs-xs); color: var(--tx2); margin-bottom: 2px; white-space: nowrap; }
.ob-sub { font-size: var(--fs-xs); color: var(--tx3); }
.ob-pend { color: var(--warn); }
.ob-done { color: var(--ok); }
.ob-msg { font-size: var(--fs-sm); margin-top: 6px; }
.ob-msg.err { color: var(--red); }
.ob-msg.ok { color: var(--ok); }
.ob-backs { border: 1px solid var(--border); border-radius: 8px; padding: 2px 8px; max-height: 240px; overflow: auto; }
.ob-brow { display: flex; align-items: center; gap: 8px; padding: 5px 0;
  border-bottom: 1px solid var(--border); flex-wrap: wrap; }
.ob-brow:last-child { border-bottom: 0; }
.ob-bchk input { width: auto; }
.ob-bno { font-weight: 600; min-width: 46px; }
.ob-btag { font-size: var(--fs-xs); background: var(--pri-soft); color: var(--pri);
  border-radius: 3px; padding: 1px 5px; }
.ob-btxt { font-size: var(--fs-sm); color: var(--tx2); }
.ob-bfill { display: flex; align-items: center; gap: 4px; font-size: var(--fs-sm); color: var(--tx2); margin-left: auto; }
.ob-bfill input { width: 58px; padding: 2px 4px; font-size: var(--fs-sm); flex: 0 0 auto; }
.ob-bfill input[data-obbr] { width: 150px; }
.ob-bfill > span, .ob-bfill > input { white-space: nowrap; }
@media (max-width: 900px) {
  .modal.ob-modal { max-width: none; }
  .ob-tbl { min-width: 720px; }          /* 窄屏不要压列，改成表格内部横向滚动 */
  .ob-brow { min-width: 660px; }
  .ob-backs { overflow-x: auto; }
}
/* @@OBBATCH-END@@ */

/* @@DAILY-REPORT-START@@ 车间日报（11-02：每天 18:00 的点胶/刺绣/手工汇总卡片，发微信群用） */
.dly-bar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 0 0 12px; }
.dly-body { max-height: min(66vh, 720px); overflow-y: auto; padding-right: 2px; }
.dly-sec { border: 1px solid var(--border); border-radius: var(--radius); padding: 12px 12px 10px; margin: 0 0 14px; background: #fbfcfd; }
.dly-h { display: flex; align-items: baseline; gap: 10px; margin: 0 0 10px; }
.dly-h b { font-size: var(--fs-lg); color: var(--tx); }
.dly-h span { color: var(--tx2); font-size: var(--fs-sm); }
.dly-img { display: block; width: 100%; border-radius: 8px; margin: 0 0 10px; background: #fff; border: 1px solid var(--border); }
.dly-act { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.dly-act .sub { color: var(--tx3); font-size: var(--fs-sm); }
@media (max-width: 720px) {
  .dly-body { max-height: none; }
  .dly-sec { padding: 10px 10px 8px; }
}
.dly-txt { margin: 0 0 10px; border: 1px solid var(--border); border-radius: 8px; background: #fff; }
.dly-txt summary { padding: 8px 12px; cursor: pointer; font-size: var(--fs-sm); color: var(--tx2); }
.dly-txt pre { margin: 0; padding: 0 12px 10px; font-family: var(--font); font-size: var(--fs-md);
  line-height: 1.7; color: var(--tx); white-space: pre-wrap; word-break: break-all; }
/* @@DAILY-REPORT-END@@ */
