:root{
  --bg:#f5f6f8; --panel:#fff; --line:#e3e6ea; --text:#1f2329;
  --muted:#8a9099; --primary:#2f6fed; --primary-d:#245bd0;
  --active:#fff7e6; --active-b:#ffb02e; --done:#e8f7ee; --done-b:#34c759;
  --danger:#ff4d4f; --warn:#faad14;
}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;background:var(--bg);color:var(--text);font-size:14px}
/* 未登录状态（body.locked）：隐藏整个主界面，只显示登录框，必须输对密码才能进入 */
body.locked .topbar,
body.locked main,
body.locked #zoomCtl{display:none}
.topbar{display:flex;align-items:center;gap:16px;padding:0 16px;height:56px;background:var(--panel);border-bottom:1px solid var(--line)}
.brand{flex-shrink:0;font-weight:700;font-size:16px;display:flex;align-items:center;gap:6px}
.brand .sub{font-weight:400;color:var(--muted);font-size:12px;margin-left:6px}
.brand .logo-img{height:28px;width:auto;display:block}
.nav{display:flex;gap:4px;flex:1;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none;cursor:grab;user-select:none}
.nav::-webkit-scrollbar{display:none}
.nav.dragging{cursor:grabbing}
.nav-btn{flex-shrink:0;background:none;border:none;padding:7px 11px;border-radius:8px;cursor:pointer;color:var(--muted);font-size:13px;white-space:nowrap}
.nav-btn.active{background:#eef3ff;color:var(--primary);font-weight:600}
.conn{flex-shrink:0;font-size:12px;color:var(--muted)}
.search{position:relative;display:flex;align-items:center;flex-shrink:0}
.search-input{padding:7px 10px;border:1px solid var(--line);border-radius:8px;font-size:13px;font-family:inherit;width:200px;background:#fff}
.who{display:flex;align-items:center;gap:6px;margin-left:0;flex-shrink:0}
.search-input:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 2px rgba(47,111,237,.15)}
.search-results{position:absolute;top:46px;right:0;width:340px;max-height:70vh;overflow:auto;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 10px 30px rgba(0,0,0,.14);z-index:60;padding:8px}
.search-results[hidden]{display:none}
.sr-item{border:1px solid var(--line);border-radius:9px;padding:9px;margin-bottom:8px;cursor:pointer}
.sr-item:hover{border-color:var(--primary);background:#f7f9ff}
.sr-wo{font-weight:600;font-size:13px;display:flex;align-items:center;gap:8px}
.sr-meta{font-size:11px;color:var(--muted);margin:3px 0}
.sr-empty{color:var(--muted);font-size:13px;text-align:center;padding:14px 0}
/* R93：搜索结果操作区（定位到卡片 / 查看详情 / 文档） */
.sr-ops{display:flex;align-items:center;gap:6px;margin-top:7px;flex-wrap:wrap}
.sr-jump{font-size:11px;color:var(--primary);font-weight:600;white-space:nowrap}
.conn.ok{color:var(--done-b)}
.conn.bad{color:var(--danger)}
main{padding:20px}
.view{display:none}
.view.active{display:block}

.btn{border:1px solid var(--line);background:var(--panel);padding:8px 14px;border-radius:8px;cursor:pointer;font-size:13px}
.btn:hover{border-color:var(--primary)}
.btn.primary{background:var(--primary);color:#fff;border-color:var(--primary)}
.btn.primary:hover{background:var(--primary-d)}
.btn.sm{padding:4px 10px;font-size:12px}
.btn.danger{background:#fff;border-color:var(--danger);color:var(--danger)}
.btn.danger:hover{background:var(--danger);color:#fff}
.btn:disabled{opacity:.5;cursor:not-allowed}
td.center{text-align:center}

.panel{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:18px}
.panel h2{font-size:15px;margin-bottom:12px}

table{width:100%;border-collapse:collapse;margin-top:10px}
th,td{text-align:left;padding:9px 10px;border-bottom:1px solid var(--line);font-size:13px}
th{color:var(--muted);font-weight:600;background:#fafbfc}
.badge{display:inline-block;padding:2px 9px;border-radius:20px;font-size:12px}
.badge.pending{background:#f0f1f3;color:var(--muted)}
.badge.received,.badge.done{background:var(--done);color:#1a7f37}
.badge.active{background:var(--active);color:#b5790a}
.badge.warn{background:#fff1f0;color:var(--danger)}
.badge.sil-self{background:#f6ffed;color:#1a7f37;border:1px solid #b7eb8f}
.badge.sil-purchase{background:#fff7e6;color:#b5790a;border:1px solid #ffd591}
.badge.fin{background:#e6f4ff;color:#0958d9;border:1px solid #91caff}
.badge.semi{background:#f9f0ff;color:#722ed1;border:1px solid #d3adf7}

/* 看板 */
.board-toolbar{display:flex;align-items:center;gap:16px;margin-bottom:14px;flex-wrap:wrap}
.legend{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:12px}
.dot{width:10px;height:10px;border-radius:50%;display:inline-block;margin-left:8px}
.dot.active{background:var(--active-b)} .dot.done{background:var(--done-b)}
.hint{color:var(--muted);font-size:12px;margin-left:auto}

.stats{display:flex;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.stat{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 18px;min-width:120px}
.stat .n{font-size:24px;font-weight:700}
.stat .l{color:var(--muted);font-size:12px}

/* 看板：固定高度的内部滚动区，横向滚动条常驻可见，无需把整页拉到底 */
.board{display:flex;gap:10px;overflow-x:auto;overflow-y:hidden;height:calc(100vh - 215px);min-height:340px;padding:4px 4px 10px;align-items:stretch}
.col{flex:0 0 220px;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:10px;display:flex;flex-direction:column;overflow-y:auto;overflow-x:hidden;min-height:0}
.col.active-col{border-color:var(--active-b);box-shadow:0 0 0 2px var(--active)}
.col.done-col{opacity:.85}
.col h3{font-size:13px;margin-bottom:4px;position:sticky;top:0;background:var(--panel);z-index:2;padding-bottom:4px}
.col .owner{font-size:11px;color:var(--muted);margin-bottom:8px;position:sticky;top:21px;background:var(--panel);z-index:2}
/* R99：工序列「在制工单数」徽标 + 部门合计（进行中 + 已暂停） */
.col h3 .col-count{display:inline-block;margin-left:6px;padding:0 7px;border-radius:10px;background:#eef3ff;color:var(--primary);font-size:11px;font-weight:700;line-height:17px;vertical-align:1px;white-space:nowrap}
.col h3 .col-count.zero{background:#f0f1f3;color:var(--muted);font-weight:600}
.col.mine-col h3 .col-count{background:var(--primary);color:#fff}
.col.mine-col h3 .col-count.zero{background:#e6e9ef;color:var(--muted)}
.col .owner .dept-count{color:#6b7280;background:#f5f6f8;border:1px solid var(--line);border-radius:9px;padding:0 6px;font-size:10.5px;white-space:nowrap}
/* 已取消列：醒目标识，确保取消工单不丢失 */
.card{background:#fafbfc;border:1px solid var(--line);border-radius:9px;padding:9px;margin-bottom:8px;cursor:default;position:relative}
.card .wo{font-weight:600;font-size:13px}
.card .wo-model{font-weight:800;font-size:15px;color:#000;letter-spacing:.3px;line-height:1.25;margin-bottom:4px;padding-right:24px}
.collapse-btn{position:absolute;top:6px;right:6px;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:5px;cursor:pointer;color:var(--muted);font-size:13px;user-select:none;z-index:3}
.collapse-btn:hover{background:#eef0f3;color:var(--text)}
.collapse-btn::before{content:"▾"}
.card.collapsed{padding:6px 9px}
.card-actions{margin-top:7px;display:flex;gap:6px;flex-wrap:wrap;flex-direction:column;align-items:stretch}
.card .doc-btn-collapsed{display:none}
.card.collapsed > *:not(.wo-model):not(.collapse-btn):not(.doc-btn-collapsed){display:none !important}
.card.collapsed .doc-btn-collapsed{display:inline-block;margin-top:2px}
.card .meta{font-size:11px;color:var(--muted);margin:3px 0}
.card .steps-progress{margin-top:5px;padding-top:5px;border-top:1px dashed var(--line)}
.card .steps-progress .meta{margin:1.5px 0}
.card .steps-progress .state-tip{color:#5F6B7A}
.card .bar{height:5px;background:#eef0f3;border-radius:4px;overflow:hidden;margin-top:6px}
.card .bar i{display:block;height:100%;background:var(--primary)}
/* R93：搜索定位后卡片高亮闪烁（黄底 + 描边脉冲，约 3.6 秒） */
@keyframes cardFlash {
  0%   { box-shadow: 0 0 0 0 rgba(250,173,20,.85); background: #fff8e1; border-color: #faad14; }
  35%  { box-shadow: 0 0 0 6px rgba(250,173,20,0);  background: #fff8e1; border-color: #faad14; }
  60%  { box-shadow: 0 0 0 0 rgba(250,173,20,.85); background: #fff8e1; border-color: #faad14; }
  100% { box-shadow: 0 0 0 0 rgba(250,173,20,0);   background: #fff8e1; border-color: #faad14; }
}
.card.card-flash {
  animation: cardFlash 1.2s ease-out 3;
  background: #fff8e1;
  border-color: #faad14;
  outline: 2px solid #faad14;
  outline-offset: 1px;
}
@media (prefers-reduced-motion: reduce) {
  .card.card-flash { animation: none; box-shadow: 0 0 0 3px rgba(250,173,20,.55); }
}
.lock-tip{display:inline-block;font-size:12px;color:var(--muted);background:#f5f6f8;border:1px dashed var(--line);border-radius:7px;padding:3px 8px}

/* 工序卡片上的「本次完成数量」输入框（统计系统：上线/下线/夹层） */
.qty-inputs{display:flex;gap:8px;flex-wrap:wrap;width:100%;margin-bottom:6px}
.qty-field{display:flex;flex-direction:column;font-size:11px;color:var(--muted);gap:2px;flex:1;min-width:70px}
.qty-field .qty-cur{font-weight:600;color:#389e0d}
.qty-in{width:100%;padding:5px 7px;font-size:13px;border:1px solid var(--line);border-radius:7px;box-sizing:border-box}
.qty-in:focus{outline:none;border-color:var(--primary)}
/* 冲展开卡片：「此面不冲展开」勾选 + 超产「超出」提示（R50） */
.qty-skip{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--muted);margin-top:2px}
.qty-over{color:var(--danger);font-size:11px;font-weight:600;margin-left:4px}
.qty-cap{font-size:10px;color:#cf1322;background:#fff1f0;border:1px solid #ffa39e;border-radius:6px;padding:0 4px;margin-left:2px}
.qty-ded{font-size:10px;color:#d48806;background:#fff7e6;border:1px solid #ffd591;border-radius:6px;padding:0 4px;margin-left:2px}
.deduct-block{margin-top:6px;padding:6px 8px;background:#f6ffed;border:1px solid #b7eb8f;border-radius:7px;font-size:12px;color:#389e0d}
.deduct-block b{color:#237804}

/* 出货查询栏 */
.ship-query{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
.ship-query input{padding:7px 10px;border:1px solid var(--line);border-radius:7px;font-size:13px}
.ship-query input#shModel{min-width:190px}
.ship-query input#shDate{width:160px}
/* 出货面板：按型号/日期搜索后，命中的出货记录整行变绿（R42） */
#shipTable tr.ship-match{background:#e8f8ee}
#shipTable tr.ship-match td{color:#1a7a3c;font-weight:600}
#shipTable tr.ship-match:hover{background:#d6f3e1}
/* R94：完成工单月报统计预览卡片 */
.wo-report-summary{margin-top:12px}
.wo-sum-cards{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:12px}
.wo-sum-card{background:#f7f9ff;border:1px solid var(--line);border-radius:10px;padding:10px 16px;min-width:110px;text-align:center}
.wo-sum-card .n{font-size:22px;font-weight:700;color:#1f2937}
.wo-sum-card .l{color:var(--muted);font-size:11.5px;margin-top:2px}
.wo-sum-card.hi{background:#fff7e6;border-color:#ffd591}
.wo-sum-card.hi .n{color:#d46b08}
.wo-kind-table{width:100%;border-collapse:collapse;font-size:13px}
.wo-kind-table th,.wo-kind-table td{border:1px solid var(--line);padding:6px 10px;text-align:left}
.wo-kind-table th{background:#fafafa;font-weight:600;color:#4b5563}
.wo-kind-table strong{color:#d46b08}
/* 库存面板：按型号搜索命中行变绿（R43） */
#itemTable tr.inv-hit{background:#e8f8ee}
#itemTable tr.inv-hit td{color:#1a7a3c;font-weight:600}
#itemTable tr.inv-hit:hover{background:#d6f3e1}
/* 装配仓库 / 损耗仓 / 检测仓：搜索命中行变绿（R50） */
#assemblyTable tr.inv-hit,#lossTable tr.inv-hit,#inspTable tr.inv-hit{background:#e8f8ee}
#assemblyTable tr.inv-hit td,#lossTable tr.inv-hit td,#inspTable tr.inv-hit td{color:#1a7a3c;font-weight:600}
#assemblyTable tr.inv-hit:hover,#lossTable tr.inv-hit:hover,#inspTable tr.inv-hit:hover{background:#d6f3e1}
.toolbar-spacer{flex:1}

/* 弹窗 */
.modal-mask{position:fixed;inset:0;background:rgba(0,0,0,.35);display:none;align-items:center;justify-content:center;z-index:50}
.modal-mask:not([hidden]){display:flex}
.modal{background:#fff;border-radius:14px;padding:22px;width:420px;max-width:92vw;max-height:88vh;overflow:auto}
.modal h3{margin-bottom:14px}
.field{margin-bottom:12px}
.field label{display:block;font-size:12px;color:var(--muted);margin-bottom:5px}
.field input,.field select,.field textarea{width:100%;padding:9px 10px;border:1px solid var(--line);border-radius:8px;font-size:14px;font-family:inherit}
.field input[type="file"]{font-size:12px;padding:7px 8px;border:1px dashed var(--line);border-radius:8px;background:#fff;cursor:pointer}
.field .static{padding:9px 10px;background:#f5f6f8;border:1px solid var(--line);border-radius:8px;font-size:14px;color:var(--text)}
.modal-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:8px}
.modal.wide{width:min(920px,94vw)}

/* 工单文档页面内预览 */
.doc-preview-head{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:12px}
.doc-preview-head h3{margin-bottom:0;word-break:break-all}
.doc-preview-body{max-height:74vh;overflow:auto}
.doc-preview-img{max-width:100%;max-height:74vh;display:block;margin:0 auto;border-radius:8px;border:1px solid var(--line)}
.doc-preview-frame{width:100%;height:74vh;border:0;border-radius:8px}
.doc-preview-other{text-align:center;padding:24px 12px}
.doc-preview-other .doc-icon{font-size:42px}
.doc-preview-other .meta{margin:8px 0 14px}
.doc-preview-text{white-space:pre-wrap;word-break:break-all;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:13px;line-height:1.6;background:#f7f8fa;border:1px solid var(--line);border-radius:8px;padding:14px;max-height:74vh;overflow:auto}
.doc-preview-office{max-height:74vh;overflow:auto}
.doc-preview-office .pdf-page{display:block;margin:0 auto 14px;background:#fff;box-shadow:0 1px 5px rgba(0,0,0,.15);border-radius:2px}
.doc-preview-office table{border-collapse:collapse;width:auto;margin:0 0 12px;font-size:13px}
.doc-preview-office td,.doc-preview-office th{border:1px solid var(--line);padding:4px 8px;white-space:nowrap}
.doc-preview-office th{background:#f0f2f5}
.sheet-title{margin:12px 0 4px;font-size:14px;color:var(--text)}

/* 部门身份 */
.who-label{font-size:12px;color:var(--muted)}
.who-select{padding:6px 8px;border:1px solid var(--line);border-radius:8px;font-size:13px;background:#fff;font-family:inherit}
.mytodo{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--muted);cursor:pointer;user-select:none}

/* 看板：我负责的工序列高亮 */
.col.mine-col{border-color:var(--primary);box-shadow:0 0 0 2px rgba(47,111,237,.18)}
.dot.mine{background:var(--primary)}
.me-tag{display:inline-block;background:var(--primary);color:#fff;font-size:10px;padding:1px 6px;border-radius:10px;margin-left:4px}

/* 紧急度（普通=白 / 加急=黄 / 紧急=红） */
.pri-badge{display:inline-block;padding:1px 8px;border-radius:10px;font-size:11px;line-height:1.6}
.pri-普通{background:#fafbfc;color:#8a9099;border:1px solid #e3e6ea}
.pri-加急{background:#fff3bf;color:#8a6d00;border:1px solid #ffe066}
.pri-紧急{background:#fff1f0;color:#cf1322;border:1px solid #ffa39e}
.card.pri-普通{border-left:4px solid #e3e6ea}
.card.pri-加急{border-left:4px solid #ffd400}
.card.pri-紧急{border-left:4px solid #ff4d4f}
.card.paused{background:#fffdf5;border-left:4px solid #ffd591}
.state-tip{display:inline-block;font-size:12px;border-radius:7px;padding:3px 8px}
.state-tip.paused{background:#fff7e6;color:#b5790a;border:1px solid #ffd591}
.state-tip.done{background:#f6ffed;color:#389e0d;border:1px solid #b7eb8f}
.pause-reason{color:#b5790a;font-weight:600}
.remark-line{color:#555;background:#f7f8fa;border-radius:5px;padding:2px 6px;display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 工单详情时间线 */
.wo-detail{background:#fafbfc;border:1px solid var(--line);border-radius:10px;padding:12px;font-size:13px;line-height:1.9}
.timeline{list-style:none;margin-top:4px}
.tl{position:relative;padding:0 0 14px 22px;border-left:2px solid var(--line)}
.tl:last-child{border-left-color:transparent}
.tl-dot{position:absolute;left:-7px;top:2px;width:12px;height:12px;border-radius:50%;background:#cfd4db;border:2px solid #fff;box-shadow:0 0 0 1px var(--line)}
.tl.ok .tl-dot{background:var(--done-b)}
.tl.now .tl-dot{background:var(--active-b);box-shadow:0 0 0 3px rgba(255,176,46,.25)}
.tl-body b{font-size:13px}
.tl-owner{font-size:11px;color:var(--muted);margin-left:6px}
.tl-meta{font-size:11px;color:var(--muted)}
.tl-qty{font-size:11.5px;color:#3d4a5c;font-weight:600;margin-top:2px}

/* 采购工具栏 */
.toolbar{display:flex;gap:10px;margin-bottom:6px;flex-wrap:wrap}

/* 出入库流水 */
.log-body{max-height:55vh;overflow:auto;margin-top:6px}
.log-table{width:100%;border-collapse:collapse}
.log-table th,.log-table td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);font-size:12px}
.log-table th{color:var(--muted);background:#fafbfc;position:sticky;top:0}
.log-table .up{color:var(--done-b);font-weight:600}
.log-table .down{color:var(--danger);font-weight:600}

/* toast */
.toast-wrap{position:fixed;right:20px;bottom:20px;display:flex;flex-direction:column;gap:10px;z-index:100}
.toast{padding:11px 16px;border-radius:10px;background:#1f2329;color:#fff;font-size:13px;box-shadow:0 6px 20px rgba(0,0,0,.18);opacity:1;transition:opacity .5s,transform .5s;max-width:340px}
.toast.hide{opacity:0;transform:translateY(8px)}
.toast.success{background:#1a7f37}
.toast.warn{background:#b5790a}
.toast.error{background:#cf1322}
.toast.info{background:#245bd0}

/* 登录 */
.login-err{color:var(--danger);font-size:12px;min-height:16px;margin-top:6px}
.who-dept{font-weight:600;color:var(--primary)}

/* 外发卡片 / 状态 */
.outsource-card{border:1px dashed var(--active-b);background:#fffdf5}
.state-tip.outsource{background:#e6f4ff;color:#0958d9;border:1px solid #91caff}
.state-tip.nb{background:#f9f0ff;color:#722ed1;border:1px solid #d3adf7}
.state-tip.ded-done{background:#e6fffb;color:#08979c;border:1px solid #87e8de}
.state-tip.over{background:#fff2e8;color:#d4380d;border:1px solid #ffbb96}
.state-tip.ded{background:#e6fffb;color:#08979c;border:1px solid #87e8de}

/* 总经理控制台：状态筛选标签 */
.admin-tabs{display:flex;gap:8px;margin-bottom:12px;flex-wrap:wrap}
.tab{border:1px solid var(--line);background:var(--panel);padding:6px 14px;border-radius:20px;cursor:pointer;font-size:13px;color:var(--muted)}
.tab:hover{border-color:var(--primary)}
.tab.active{background:var(--primary);color:#fff;border-color:var(--primary)}
code.pw{background:#f5f6f8;padding:2px 8px;border-radius:6px;font-family:ui-monospace,Menlo,Consolas,monospace;letter-spacing:1px}

/* ===== 手机 / 小屏自适应：让网页版在手机上也能完整使用（与电脑版功能完全一致） ===== */
/* ===== 手机端缩放控件（仅小屏显示，与网页版同一套页面，只是可缩放） ===== */
#zoomCtl {
  position: fixed; right: 10px; bottom: 10px; z-index: 200;
  display: flex; align-items: center; gap: 4px;
  background: rgba(31, 35, 41, .92); border-radius: 22px; padding: 4px 6px;
  box-shadow: 0 4px 16px rgba(0, 0, 0, .28);
}
#zoomCtl button {
  width: 36px; height: 36px; border: none; border-radius: 50%;
  background: #3a3f47; color: #fff; font-size: 20px; line-height: 1; cursor: pointer;
}
#zoomCtl button:active { background: #2f6fed; }
#zoomCtl #zoomReset { width: auto; border-radius: 14px; font-size: 12px; padding: 0 10px; }
#zoomCtl #zoomVal { color: #fff; font-size: 12px; min-width: 40px; text-align: center; }
/* 弹窗打开时隐藏缩放按钮（避免遮住弹窗底部按钮） */
body.modal-open #zoomCtl { display: none; }
@media (min-width: 821px) { #zoomCtl { display: none; } }

@media (max-width: 820px) {
  body { font-size: 14px; }
  /* 顶栏允许换行，避免小屏被挤破；顺序仍与电脑一致：品牌→菜单→部门→连接，搜索框单独整行方便点按 */
  .topbar { flex-wrap: wrap; height: auto; padding: 8px 10px; gap: 8px 10px; align-items: center; }
  .who, .conn { margin-left: 0; }
  .search { order: 9; flex: 1 1 100%; }
  .search-input { width: 100%; }
  .search-results { width: auto; left: 0; right: 0; top: 42px; }

  main { padding: 12px; }
  /* 宽表格在小屏内横向滑动，所有列都能看到（和电脑同一张表，只是可左右滑） */
  .panel { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  table { min-width: 560px; }
  .panel h2 { font-size: 15px; }

  /* 看板：手指横向滑动切换工序（与电脑一致，只是用滑的） */
  .board { height: auto; min-height: 60vh; }
  .col { flex: 0 0 80vw; max-width: 80vw; }
  .board-toolbar { gap: 8px 12px; flex-wrap: wrap; }
  .hint { margin-left: 0; width: 100%; }

  /* 触摸优化：按钮与输入框更大，避免误触；输入框 16px 防止 iOS 聚焦自动放大 */
  .btn { padding: 10px 14px; font-size: 14px; min-height: 42px; }
  .btn.sm { padding: 8px 12px; min-height: 36px; }
  .nav-btn { padding: 10px 12px; font-size: 14px; }
  .field input, .field select, .field textarea { font-size: 16px; padding: 11px 10px; }
  .qty-in { font-size: 16px; padding: 8px 8px; }
  .modal { padding: 16px; width: 94vw; }
  .modal-actions .btn { flex: 1; }

  /* 统计卡片两列自适应 */
  .stats { gap: 8px; }
  .stat { flex: 1 1 40%; min-width: 0; padding: 10px 12px; }
  .stat .n { font-size: 20px; }
}
/* R78 登录监控：异常登录红字标出、离线部门灰字 */
.row-abn { background: #fff1f0 !important; }
.row-abn td { color: #cf1322 !important; font-weight: 600; }
/* R95：采购订单物料——已到货行浅绿底；卡片上的到货标签 */
#poWoTable tr.po-arrived { background: #f0fbf3; }
#poWoTable tr.po-arrived td { color: #1a7f37; }
.card .meta.mat-arrived { color: #1a7f37; font-weight: 600; background: #eafaf0; border: 1px solid #b7ebc6; border-radius: 7px; padding: 2px 8px; display: inline-block; }
.row-off td { color: var(--muted); }
#loginLogTable .meta { font-size: 11px; }
/* R80 系统更新提示：顶部绿色横幅 */
#updateBar { position: sticky; top: 0; z-index: 999; background: #16a34a; color: #fff; text-align: center; padding: 8px 12px; font-size: 14px; }

/* ===== R86 全屏专注模式：勾选「只看我的待办」(非总经理) 时触发 =====
   看板统计条隐藏腾出高度。
   R86-3：同部门多道工序绝不混在一屏——整页横向分页轮播：每列=一道工序，占满整屏宽；
     通过 左右箭头 / ←→键 / 触屏横划 切换上下一个工序页（scroll-snap 吸附整页），
     页内该工序卡片自动多列排布，一次看到更多、减少滚动。 */
body.board-focus #boardStats { display: none; }
body.board-focus .board { height: calc(100vh - 145px); min-height: 340px; position: relative; }
body.board-focus .board.focus { display: flex; overflow-x: auto; overflow-y: hidden; scroll-snap-type: x mandatory; scroll-behavior: smooth; }
/* 每道工序 = 一整页：占满容器宽高，页内卡片多列 grid，超出一屏纵向滚动本页。
   卡片宽度写死为 198px —— 与平时(不勾选只看我的待办)普通看板列内卡片完全同宽
   （普通列 220px − 边框2 − 列内边距20 = 198）。轨道 fixed 不可被内容撑宽。 */
body.board-focus .board.focus .col { flex: 0 0 100%; min-width: 100%; max-width: 100%; height: 100%; overflow-y: auto; scroll-snap-align: start; display: grid; grid-template-columns: repeat(auto-fill, 198px); justify-content: start; gap: 8px; align-content: start; }
body.board-focus .board.focus .card { width: 198px; min-width: 198px; max-width: 198px; box-sizing: border-box; justify-self: start; }
body.board-focus .board.focus .col h3,
body.board-focus .board.focus .col .owner { grid-column: 1 / -1; position: static; }
body.board-focus .board.focus .col .card { margin-bottom: 0; }
/* R86-3 悬浮步骤切换胶囊：◀ 工序名 1/3 ▶（多工序时出现，仅一页自动隐藏） */
#focusNav { position: absolute; bottom: 10px; left: 50%; transform: translateX(-50%); display: none; align-items: center; gap: 2px; background: rgba(15, 23, 42, .75); color: #fff; padding: 3px 6px; border-radius: 999px; font-size: 12.5px; z-index: 60; box-shadow: 0 2px 10px rgba(0, 0, 0, .25); white-space: nowrap; }
#focusNav .fn-btn { background: transparent; border: 0; color: #fff; font-size: 15px; line-height: 1; padding: 3px 8px; cursor: pointer; border-radius: 8px; }
#focusNav .fn-btn:hover { background: rgba(255, 255, 255, .22); }
#focusNav .fn-btn:disabled { opacity: .3; cursor: default; }
#focusNav .fn-btn:disabled:hover { background: transparent; }
#focusNav .fn-txt { padding: 0 6px; font-weight: 600; }
/* R86-3 空栏占位：本部门某道工序没有进行中的工单时，全屏页内居中提示（栏不消失，可左右切到其它工序） */
body.board-focus .board.focus .col .col-empty { grid-column: 1 / -1; height: calc(100vh - 260px); min-height: 200px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; color: var(--muted); font-size: 14px; border: 1.5px dashed rgba(120, 130, 150, .35); border-radius: 10px; margin: 4px; }
body.board-focus .board.focus .col .col-empty .col-empty-sub { font-size: 11.5px; opacity: .7; }
/* R86-2：专注模式下卡片更紧凑（内边距/行距/字号/按钮都压缩），一屏可见更多工单 */
body.board-focus .board.focus .card { padding: 6px 8px; border-radius: 7px; }
body.board-focus .board.focus .card .wo-model { font-size: 13.5px; margin-bottom: 2px; line-height: 1.2; }
body.board-focus .board.focus .card .wo { font-size: 12px; }
body.board-focus .board.focus .card .meta { margin: 1px 0; font-size: 10.5px; line-height: 1.45; }
body.board-focus .board.focus .card .steps-progress { margin-top: 3px; padding-top: 3px; }
body.board-focus .board.focus .card .bar { height: 3px; margin-top: 4px; }
body.board-focus .board.focus .card-actions { margin-top: 4px; gap: 4px; }
body.board-focus .board.focus .card .qty-inputs { gap: 5px; margin-bottom: 3px; }
body.board-focus .board.focus .card .qty-field { font-size: 10px; min-width: 62px; }
body.board-focus .board.focus .card .qty-in { padding: 2px 5px; font-size: 12px; }
body.board-focus .board.focus .card .btn.sm { padding: 2px 7px; font-size: 11px; }
body.board-focus .board.focus .card .collapse-btn { top: 4px; right: 4px; }
body.board-focus .board.focus .card .state-tip { padding: 1px 6px; font-size: 10.5px; }
body.board-focus .board.focus .card.collapsed { padding: 4px 8px; }
body.board-focus .board.focus .card.collapsed .wo-model { font-size: 12.5px; margin-bottom: 0; }
@media (max-width: 820px) {
  body.board-focus .board { height: calc(100vh - 120px); min-height: 340px; }
  body.board-focus .board.focus .col { grid-template-columns: repeat(auto-fill, minmax(170px, 200px)); }
}
/* ===== R91 弹窗标题行右侧统一 ✕ 关闭按钮 ===== */
.modal h3 { display: flex; align-items: center; gap: 8px; margin-bottom: 14px; }
.modal .modal-x { flex: 0 0 auto; margin-left: auto; width: 26px; height: 26px; border: none; border-radius: 50%; background: #f0f1f3; color: #6b7280; font-size: 13px; line-height: 1; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; user-select: none; transition: background .15s; }
.modal .modal-x:hover { background: #e2e4e8; color: #333; }
.modal > .modal-x { float: right; margin: -4px -4px 0 0; }   /* 无 h3 的兜底弹窗：按钮置于弹窗右上角 */
@media (max-width: 820px) {
  .modal h3 { gap: 6px; }
}
/* ===== R90 仓库主表：型号行下方灰字显示最近备注 ===== */
/* R92：型号行下方的"最近备注"醒目行 —— 备注重要，正文深黑加粗，浅黄底突出；操作人/时间用小字灰 */
tr.inv-note-row td { padding: 2px 10px 9px; border-bottom: 0; background: #fff9ec; }
tr.inv-note-row .inv-note-ic { font-size: 12px; }
tr.inv-note-row .inv-note-txt { color: #111; font-size: 13px; font-weight: 700; word-break: break-all; }
tr.inv-note-row .inv-note-meta { color: #666; font-size: 11px; opacity: .85; white-space: nowrap; }
/* ===== R96 库存抵扣勾选弹窗 ===== */
.deduct-hint { font-size: 12.5px; color: #6b7280; margin: -8px 0 12px; }
.deduct-group { margin-bottom: 12px; }
.deduct-group-h { font-size: 13px; font-weight: 700; color: #111; margin-bottom: 5px; padding-left: 2px; }
.deduct-table { width: 100%; border-collapse: collapse; }
.deduct-table td { padding: 5px 7px; border-bottom: 1px solid #eee; font-size: 13px; vertical-align: middle; }
.deduct-table tr:last-child td { border-bottom: 0; }
.dc-cb { width: 26px; text-align: center; }
.dc-cb input { width: 16px; height: 16px; cursor: pointer; }
.dc-model { font-weight: 600; color: #111; white-space: nowrap; }
.dc-qty { width: 76px; }
.dc-qty-in { width: 64px; padding: 3px 6px; border: 1px solid #d5d7db; border-radius: 5px; font-size: 13px; text-align: right; }
.dc-qty-in:disabled { background: #f5f5f5; color: #aaa; border-color: #e8e8e8; cursor: not-allowed; }
.dc-wh { width: 82px; color: #555; font-size: 12px; white-space: nowrap; }
.dc-note { color: #111; font-size: 12.5px; font-weight: 600; word-break: break-all; max-width: 210px; }
.dc-nonote { color: #bbb; font-weight: 400; }
.deduct-sum { margin: 12px 0 4px; padding: 9px 12px; background: #f6f8fa; border-radius: 8px; font-size: 13px; color: #333; }
.deduct-sum b { color: #111; font-size: 14px; }
.deduct-sum b.hl { color: #c2410c; }
/* ===== R96 仓库型号行的版本备注徽标（不同版本分开成行） ===== */
.inv-ver { display: inline-block; margin-top: 3px; padding: 1px 7px; border-radius: 9px; background: #eef4ff; color: #1f4e8c; font-size: 11.5px; font-weight: 600; }

/* ===== R98 总经理控制台：可折叠区块 + 搜索定位 ===== *//* 顶部工具条：搜索框 + 折叠控制 */
.admin-tools-panel { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 0; }
.admin-search-wrap { position: relative; flex: 1; min-width: 260px; display: flex; align-items: center; }
.admin-search-input { width: 100%; padding: 9px 12px; font-size: 14px; border-radius: 9px; }
.admin-search-wrap .admin-search-clear { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); padding: 2px 8px; }
.admin-search-results { top: 46px; left: 0; right: 0; width: auto; max-height: 62vh; }
.sr-group-title { font-size: 11px; color: var(--muted); font-weight: 700; letter-spacing: .4px; padding: 8px 4px 3px; border-bottom: 1px dashed var(--line); margin-bottom: 6px; }
.sr-group-title:first-child { padding-top: 2px; }
.admin-fold-tools { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }

/* 可折叠区块（手风琴）：标题栏点击折叠/展开，状态记忆到 localStorage */
.acc { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; margin-top: 14px; overflow: hidden; }
.acc-head { display: flex; align-items: center; gap: 9px; font-size: 15px; font-weight: 600; padding: 14px 18px; margin: 0; cursor: pointer; user-select: none; background: #fafbfc; transition: background .15s ease; }
.acc-head:hover { background: #f1f5fb; }
.acc-chev { display: inline-block; color: var(--muted); font-size: 12px; line-height: 1; transition: transform .18s ease; }
.acc.collapsed .acc-chev { transform: rotate(-90deg); }
.acc-title { flex: 1; }
.acc-count { font-size: 12px; font-weight: 400; color: var(--muted); white-space: nowrap; }
.acc-body { padding: 2px 18px 18px; }
.acc.collapsed .acc-body { display: none; }
/* 折叠时标题栏加一条下边框提示"这是一个可点开的区块" */
.acc.collapsed .acc-head { background: #f7f9fc; }
/* 搜索定位后区块标题短暂高亮，告知"目标在这个区块" */
@keyframes accFlash { 0%,100% { background: #fafbfc; } 30% { background: #fff3cd; } 60% { background: #fff8e1; } }
.acc.acc-flash .acc-head { animation: accFlash 1.2s ease-out 2; }

/* 搜索定位后表格行高亮闪烁（黄底 + 左侧色条，约 3.6 秒） */
@keyframes rowFlash {
  0%   { background: #fff3cd; box-shadow: inset 4px 0 0 #faad14; }
  50%  { background: #fff8e1; box-shadow: inset 4px 0 0 #faad14; }
  100% { background: #fff8e1; box-shadow: inset 4px 0 0 #faad14; }
}
tr.row-flash > td { animation: rowFlash 1.2s ease-out 3; background: #fff8e1; }
tr.row-flash > td:first-child { box-shadow: inset 4px 0 0 #faad14; }
@media (prefers-reduced-motion: reduce) {
  tr.row-flash > td { animation: none; background: #fff8e1; }
  .acc.acc-flash .acc-head { animation: none; background: #fff8e1; }
}
/* 小屏：搜索框占满整行 */
@media (max-width: 640px) {
  .admin-search-wrap { flex: 1 1 100%; }
  .admin-fold-tools { flex: 1 1 100%; }
}

/* ===== R99d 页内确认框 / 输入框（替代原生 confirm/prompt —— 内嵌预览会屏蔽原生弹窗） ===== */
.confirm-msg { font-size: 13.5px; line-height: 1.7; color: var(--text); margin: 4px 0 14px; word-break: break-word; }
.confirm-msg b { color: #111; }
.modal .modal-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; flex-wrap: wrap; }
.btn.danger.primary { background: var(--danger); border-color: var(--danger); color: #fff; }
.btn.danger.primary:hover { background: #d9363e; border-color: #d9363e; }

/* ===== R102 合流工序（点焊/组水胶）完成弹窗：单片去向核对表 ===== */
.asm-bal { width: 100%; border-collapse: collapse; margin: 6px 0 8px; font-size: 13px; table-layout: fixed; }
.asm-bal th, .asm-bal td { border: 1px solid var(--border, #e5e5e5); padding: 6px 8px; text-align: center; }
.asm-bal th { background: #f7f7f5; font-weight: 600; color: #444; white-space: nowrap; }
.asm-bal td.asm-t { text-align: left; }
.asm-bal td.asm-num { font-variant-numeric: tabular-nums; font-weight: 600; }
.asm-bal input { width: 100%; min-width: 60px; padding: 3px 4px; font-size: 13px; text-align: right; box-sizing: border-box; }
.asm-bal input:disabled { background: #f2f2f2; }
.asm-note { font-size: 12.5px; line-height: 1.6; }
