/* ============================================================
   [打样订单管理系统] 全部样式
   拆分自 index.html 原 <style> 块（原第 13-848 行），内容未改动
   ============================================================ */

        /* ===== 压缩样式（与原版一致） ===== */
        :root {
            --primary: #2c3e7a;
            --primary-light: #3a5199;
            --success: #27ae60;
            --warning: #f39c12;
            --danger: #e74c3c;
            --bg-light: #f4f6fa;
            --shadow: 0 2px 12px rgba(0,0,0,0.08);
            --overdue-bg: #f8d7da;
        }
        * { box-sizing: border-box; }
        /* 根字号随屏幕宽度自适应（手机约 15.2px，桌面 16px），rem 字体随之缩放 */
        html { font-size: clamp(15px, 0.35vw + 14.4px, 16px); -webkit-text-size-adjust: 100%; }
        body {
            background: var(--bg-light);
            font-family: 'Segoe UI', 'PingFang SC', Roboto, 'Helvetica Neue', sans-serif;
            padding-bottom: 60px;
        }
        .app-header {
            background: linear-gradient(135deg, var(--primary), var(--primary-light));
            color: white;
            padding: 12px 0;
            box-shadow: 0 4px 20px rgba(44,62,122,0.3);
            position: sticky;
            top: 0;
            z-index: 1000;
        }
        .app-header .container {
            display: flex;
            align-items: center;
            justify-content: space-between;
            flex-wrap: wrap;
            gap: 8px;
        }
        .app-header h1 { font-size: 1.3rem; font-weight: 700; margin:0; display:flex; align-items:center; gap:8px; }
        .app-header h1 i { font-size:1.5rem; }
        .header-stats {
            display:flex; gap:12px; flex-wrap:wrap; font-size:0.8rem; cursor:pointer;
        }
        .header-stats .stat-item {
            background:rgba(255,255,255,0.15); padding:2px 12px; border-radius:20px;
            backdrop-filter:blur(4px); display:flex; align-items:center; gap:4px;
            transition:background 0.2s;
        }
        .header-stats .stat-item:hover { background:rgba(255,255,255,0.25); }
        .header-stats .stat-item .num { font-weight:700; font-size:1rem; }
        .header-stats .stat-item .num.overdue { color:#ffb3b3; }
        .header-right { display:flex; align-items:center; gap:8px; }
        .btn-settings { background:rgba(255,255,255,0.2); border:none; color:white; border-radius:30px; padding:2px 12px; font-size:1.1rem; transition:all 0.2s; }
        .btn-settings:hover { background:rgba(255,255,255,0.3); color:white; }

        .view-tabs-row {
            display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:6px;
            background:white; border-radius:12px; padding:3px 10px 3px 3px; box-shadow:var(--shadow); margin-top:12px;
        }
        .view-tabs {
            display:flex; gap:3px; flex-wrap:wrap;
        }
        .view-tabs .tab-btn {
            padding:6px 18px; border:none; background:transparent; border-radius:8px;
            font-weight:600; color:#6b7a93; transition:all 0.2s; font-size:0.85rem; cursor:pointer;
        }
        .view-tabs .tab-btn:hover { background:var(--bg-light); color:var(--primary); }
        .view-tabs .tab-btn.active { background:var(--primary); color:white; box-shadow:0 2px 8px rgba(44,62,122,0.25); }
        .view-tabs .tab-btn i { margin-right:4px; }

        /* 分类汇总页内的子选项卡（分类汇总 / 工程部月报） */
        .sub-tabs {
            display:flex; gap:4px; flex-wrap:wrap; align-items:center;
            border-bottom:2px solid #e6ebf5; margin-bottom:12px;
        }
        .sub-tabs .sub-tab-btn {
            padding:7px 18px; border:none; background:transparent; border-radius:8px 8px 0 0;
            font-weight:600; color:#6b7a93; font-size:0.85rem; cursor:pointer;
            border-bottom:2px solid transparent; margin-bottom:-2px; transition:all 0.2s;
        }
        .sub-tabs .sub-tab-btn i { margin-right:4px; }
        .sub-tabs .sub-tab-btn:hover { background:var(--bg-light); color:var(--primary); }
        .sub-tabs .sub-tab-btn.active { color:var(--primary); border-bottom-color:var(--primary); }
        .sub-tab-pane { display:none; }
        .sub-tab-pane.active { display:block; }
        /* 异常报告：表头排序提示条 */
        .rp-sort-hint { font-size:12px; color:#6b7a93; margin:-4px 0 8px; }
        .rp-sort-hint b { color:var(--primary); }
        .btn-add-order {
            border-radius:30px; padding:3px 16px; font-weight:600; background:var(--primary); color:white;
            border:none; transition:all 0.2s; height:34px; white-space:nowrap; font-size:0.85rem;
        }
        .btn-add-order:hover { background:var(--primary-light); transform:translateY(-1px); box-shadow:0 4px 12px rgba(44,62,122,0.3); }
        .btn-add-order i { margin-right:4px; }

        .view-panel { display:none; margin-top:12px; }
        .view-panel.active { display:block; }

        .card-dashboard {
            background:white; border-radius:12px; padding:14px; box-shadow:var(--shadow); margin-bottom:14px;
        }
        .list-header {
            display:flex; justify-content:space-between; align-items:center; margin-bottom:10px; flex-wrap:wrap; gap:6px;
        }
        .list-header .status-toggle,
        .list-header .demand-toggle,
        .list-header .biz-toggle {
            display:flex; gap:3px; background:var(--bg-light); padding:2px; border-radius:30px;
        }
        .list-header .status-toggle .btn,
        .list-header .demand-toggle .btn,
        .list-header .biz-toggle .btn {
            border-radius:30px; padding:2px 12px; font-size:0.75rem; font-weight:500; border:none;
            background:transparent; color:#6b7a93;
        }
        .list-header .status-toggle .btn.active,
        .list-header .demand-toggle .btn.active,
        .list-header .biz-toggle .btn.active {
            background:var(--primary); color:white;
        }
        /* 表单内业务域切换（打样 / 估价 / 大货）：与列表筛选按钮同风格 */
        .biz-switch {
            display:inline-flex; gap:3px; background:var(--bg-light); padding:2px; border-radius:30px;
        }
        .biz-switch .btn {
            border-radius:30px; padding:2px 14px; font-size:0.78rem; font-weight:500; border:none;
            background:transparent; color:#6b7a93;
        }
        .biz-switch .btn.active { background:var(--primary); color:white; }
        /* 订单列表「业务域」列：切到单一业务域时隐藏（信息冗余） */
        #orderTable.hide-biz-col .col-biz { display:none; }
        .biz-badge {
            display:inline-block; padding:1px 6px; border-radius:4px; font-size:0.68rem; font-weight:500;
            background:#eef2fa; color:#4a6fd4; border:1px solid #d8e0f0; white-space:nowrap;
        }
        .biz-badge.costing { background:#fdf3e7; color:#c47d1a; border-color:#f2e0c4; }
        .biz-badge.mass { background:#eaf6ee; color:#2e8b57; border-color:#cfe9d9; }
        /* 顶部全局搜索（所有视图可见，跨状态/分类搜索） */
        .global-search-bar { flex:1 1 100%; display:flex; justify-content:center; align-items:stretch; gap:8px; flex-wrap:wrap; }
        /* 顶栏 mode 控制（每个一级目录有自己的专属顶栏；订单专属元素只在 mode-order 下显示）：
              mode-order    = 打样订单管理（含子 view）→ 显示订单专属元素
              mode-settings = 系统设置（含子分区）→ 订单专属元素全隐藏
              mode-fmea     = 失效模式管理（含子分区）→ 订单专属元素全隐藏（2026-09-28 需求）
              mode-foil     = 烫金箔计算（body.foil-open 同步加）→ 订单专属元素全隐藏，顶栏显示「烫金箔计算」标题
           切换由 js/12-settings-ui.js switchView 与 js/14-nav.js switchModule 同步 body.classList 实现。
           默认状态（无 mode-* class）= 订单专属元素可见，对应首次进入订单页面的体验。 */
        body.mode-settings .header-stats,
        body.mode-settings .global-search-bar,
        body.mode-fmea .header-stats,
        body.mode-fmea .global-search-bar,
        body.mode-foil .header-stats,
        body.mode-foil .global-search-bar,
        /* 2026-10-16：标准工时管理（iframe 工具页）同样隐藏订单专属顶栏元素 */
        /* 2026-10-28f：资料袋管理（iframe 工具页）补上——此前漏配 mode-bags，进该模块仍显示全局搜索/新增订单/统计徽标 */
        body.mode-workhours .header-stats,
        body.mode-workhours .global-search-bar,
        body.mode-bags .header-stats,
        body.mode-bags .global-search-bar,
        /* 2026-11-02：打样信息管理 / 工程变更管理（占位模块）同样隐藏订单专属顶栏元素 */
        body.mode-sampleinfo .header-stats,
        body.mode-sampleinfo .global-search-bar,
        body.mode-ecn .header-stats,
        body.mode-ecn .global-search-bar { display:none !important; }
        /* 人员与账号表：按部门分级显示的组头行（部门名 + 人数；点击折叠 / 展开） */
        .dept-group-row td { background:#eef2fb; color:#3b5bdb; font-weight:600; font-size:0.78rem; padding:4px 8px; border-left:3px solid #3b5bdb; cursor:pointer; user-select:none; }
        .dept-group-row td:hover { background:#e2e9fa; }
        .dept-group-row .dept-arrow { transition:transform 0.15s; }
        .global-search-box { flex:1 1 auto; width:100%; max-width:600px; min-width:220px; }
        /* 订单表单分区（2026-09-28 需求）：产品信息等分区用横线分割 + 小节标题 */
        .form-section-divider { margin: 10px 0 8px; opacity: .35; }
        .form-section-title {
            display: flex; align-items: center; gap: 6px;
            font-size: 0.74rem; font-weight: 700; color: var(--primary);
            margin-bottom: 6px; letter-spacing: 1px;
        }
        .form-section-title i { font-size: 0.9rem; }
        /* 全局搜索右侧「我的待办」常驻入口（关闭提醒弹窗后仍可随时打开） */
        .my-todo-btn {
            flex:0 0 auto; display:inline-flex; align-items:center; gap:6px; white-space:nowrap;
            background:rgba(255,255,255,0.15); border:1px solid rgba(255,255,255,0.28); color:#fff;
            border-radius:8px; padding:2px 12px; font-size:0.78rem; font-weight:500; transition:background 0.2s;
        }
        .my-todo-btn:hover { background:rgba(255,255,255,0.32); color:#fff; }
        .my-todo-btn .my-todo-count {
            background:#fff; color:#c92a2a; border-radius:10px; padding:0 6px; font-size:0.7rem; font-weight:700; line-height:1.5;
        }
        .global-search-box .form-control {
            background:rgba(255,255,255,0.15); border:1px solid rgba(255,255,255,0.28); color:#fff;
        }
        .global-search-box .form-control::placeholder { color:rgba(255,255,255,0.72); }
        .global-search-box .form-control:focus {
            background:rgba(255,255,255,0.22); color:#fff; border-color:rgba(255,255,255,0.55); box-shadow:none;
        }
        .global-search-box .input-group-text {
            background:rgba(255,255,255,0.15); border:1px solid rgba(255,255,255,0.28); color:#fff;
        }
        .global-search-box .btn {
            background:rgba(255,255,255,0.15); border:1px solid rgba(255,255,255,0.28); color:#fff;
        }
        .global-search-box .btn:hover { background:rgba(255,255,255,0.32); color:#fff; }

        /* 产能概览与产能占用看板（排产页顶部） */
        .capacity-panel {
            background:#fff; border:1px solid #eef1f6; border-radius:10px; padding:10px 12px; margin-bottom:10px;
            box-shadow: var(--shadow);
        }
        .capacity-title { font-weight:700; color:var(--primary); font-size:0.85rem; margin-bottom:8px; }
        .capacity-title .cap-note { color:#8a94a6; font-weight:400; font-size:0.72rem; }
        .capacity-grid { display:grid; grid-template-columns:repeat(4, 1fr); gap:8px; }
        .capacity-item {
            background:var(--bg-light); border-radius:8px; padding:8px 10px; text-align:center;
            display:flex; flex-direction:column; gap:2px; justify-content:center;
        }
        .cap-label { font-size:0.72rem; color:#6b7a93; }
        .cap-num { font-size:1.3rem; font-weight:800; color:var(--primary); line-height:1.1; }
        .cap-num small { font-size:0.7rem; font-weight:500; color:#6b7a93; margin-left:3px; }
        .cap-num.danger { color:var(--danger); }
        .cap-sub { font-size:0.68rem; color:#6b7a93; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
        /* 产能占用看板（独立页 · 固定 14 天 = 今天+明天+未来12天 · 周日不排产） */
        .cap-calendar { display:flex; flex-direction:column; gap:10px; margin-top:4px; }
        .cap-week-block { background:var(--bg-light); border:1px solid #e0e5ee; border-radius:10px; padding:8px; }
        .cap-week-head { display:flex; align-items:center; gap:10px; margin:2px 2px 8px; flex-wrap:wrap; }
        .cap-week-title { font-weight:700; color:var(--primary); font-size:0.85rem; }
        .cap-week-sub { font-size:0.7rem; color:#8a94a6; }
        .cap-scroll { overflow-x:auto; -webkit-overflow-scrolling:touch; padding-bottom:4px; scrollbar-width:thin; scrollbar-color:#c6cdd9 transparent; }
        .cap-scroll::-webkit-scrollbar { height:8px; }
        .cap-scroll::-webkit-scrollbar-track { background:transparent; }
        .cap-scroll::-webkit-scrollbar-thumb { background:#c6cdd9; border-radius:4px; }
        .cap-slots { display:grid; grid-template-columns:repeat(7, minmax(0,1fr)); gap:8px; }
        .cap-day:not(.rest) { cursor:pointer; transition:border-color .15s, box-shadow .15s; }
        .cap-day:not(.rest):hover { border-color:var(--primary); box-shadow:0 2px 10px rgba(44,62,122,0.14); }
        .cap-day.today { border-color:var(--primary); box-shadow:0 0 0 1px var(--primary); }
        .cap-day.rest { background:#f6f7f9; border-style:dashed; }
        .cap-day.rest .cap-day-tag { background:#b6bcc8; }
        .cap-day-empty-tip { font-size:0.72rem; color:#8a94a6; line-height:1.5; text-align:center; padding:10px 4px; }
        @media (max-width:480px) {
            .cap-slots { grid-template-columns:repeat(7, minmax(0,1fr)); gap:5px; }
            .cap-day { padding:6px; }
        }
        /* ===== 手机端「产能占用」界面优化：竖向单列卡片，仅显示 7 天（今天起），避免横向拥挤 ===== */
        @media (max-width:768px) {
            /* 标题与顶部冗长说明：手机上隐藏长文案，仅保留标题 */
            #viewCapacity .list-header h5 small { display:none; }
            .cap-week-sub { display:none; }
            .cap-week-block { padding:8px; }
            .cap-week-title { font-size:0.82rem; }
            /* 卡片竖向单列堆叠：每张卡占满整行，数字与进度条清晰不拥挤 */
            .cap-slots { grid-template-columns:1fr; gap:8px; }
            .cap-scroll { overflow-x:visible; padding-bottom:0; }
            .cap-day { padding:10px 12px; }
            .cap-day-row { font-size:0.8rem; }
            .cap-day-row b { font-size:1rem; }
            /* 团队产能信息改为竖排，避免一屏挤不下 */
            .cap-team-note { flex-direction:column; align-items:flex-start; gap:4px; }
            .cap-team-note span { padding:2px 0; }
        }
        /* 5 天产能占用看板（历史样式保留） */
        .capacity-week { display:grid; grid-template-columns:repeat(5, minmax(0,1fr)); gap:8px; margin-top:4px; }
        .cap-day { background:var(--bg-light); border:1px solid #e0e5ee; border-radius:10px; padding:8px 10px; min-width:0; }
        .cap-day.over { border-color:var(--danger); background:#fdf1f0; box-shadow:0 0 0 1px var(--danger); }
        .cap-day-head { display:flex; align-items:center; gap:6px; margin-bottom:6px; }
        .cap-day-tag {
            background:var(--primary); color:#fff; border-radius:20px; font-size:0.68rem; padding:1px 8px; font-weight:600; white-space:nowrap;
        }
        .cap-day-date { font-size:0.72rem; color:#6b7a93; white-space:nowrap; }
        .cap-warn { color:var(--danger); font-size:0.95rem; margin-left:auto; animation:cappulse 1.2s infinite; }
        @keyframes cappulse { 0%,100%{opacity:1} 50%{opacity:.35} }
        .cap-day-row { display:flex; justify-content:space-between; align-items:center; font-size:0.72rem; color:#6b7a93; padding:1px 0; gap:6px; }
        .cap-day-row b { font-size:0.88rem; color:#2c3e7a; font-weight:700; }
        .cap-day-row b.danger { color:var(--danger); }
        .cap-day-row .cap-occ { color:#6b7a93; }
        .cap-day-bar { height:6px; background:#e0e5ee; border-radius:3px; margin-top:5px; overflow:hidden; }
        .cap-day-bar i { display:block; height:100%; min-width:0; background:var(--success); border-radius:3px; }
        .cap-day.over .cap-day-bar i { background:var(--danger); }
        .cap-cap { margin-top:3px; }
        .cap-cap .cap-day-bar { margin-top:2px; }
        .cap-day-bar.reserve i { background:#8e7cc3; }
        .cap-unit { font-style:normal; font-size:0.6rem; font-weight:400; color:#9aa4b5; margin-left:1px; }
        .cap-legend { margin-top:6px; font-size:0.72rem; color:#6b7a93; }
        .cap-legend .warn-dot { color:var(--danger); }
        .cap-team-note {
            display:flex; flex-wrap:wrap; gap:3px 18px; align-items:center; margin-top:8px; padding-top:8px;
            border-top:1px dashed #e0e5ee; font-size:0.72rem; color:#6b7a93;
        }
        .cap-team-note b { color:#2c3e7a; }
        /* 角色/履历范畴管理（设置） */
        .role-manage-list { display:flex; flex-direction:column; gap:6px; margin-bottom:8px; }
        .role-item {
            display:block; background:#f1f5fb; border:1px solid #dbe3f0; border-radius:10px;
            padding:6px 10px; font-size:0.75rem; color:#2c3e7a;
        }
        .scope-item {
            display:inline-flex; align-items:center; gap:6px; background:#f1f5fb; border:1px solid #dbe3f0;
            border-radius:20px; padding:2px 8px 2px 10px; font-size:0.75rem; color:#2c3e7a;
        }
        .role-item .role-head { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
        .role-item .role-name { font-weight:700; }
        .role-item .role-spacer { flex:1; }
        .role-item .form-check-input { width:0.85em; height:0.85em; margin-top:0; }
        .role-item .role-cap-tag { font-size:0.6rem; color:#0a7a4b; background:#e1f5ea; border-radius:10px; padding:0 6px; }
        .role-item .cap-toggle, .role-item .role-step-toggle { display:inline-flex; align-items:center; gap:3px; font-size:0.7rem; color:#2c3e7a; cursor:pointer; user-select:none; }
        .role-steps { display:flex; flex-wrap:wrap; gap:4px 14px; align-items:center; margin-top:5px; padding-top:5px; border-top:1px dashed #d5deee; }
        .role-steps .role-steps-hint { font-weight:700; color:#2c3e7a; font-size:0.7rem; }
        .role-steps .role-step-toggle { color:#44506b; }
        .role-steps .role-step-toggle input { width:0.85em; height:0.85em; margin-top:0; }
        /* 角色程序权限：按「界面查看 / 订单操作 / 排产调度」分组展示勾选项 */
        .role-perms { display:flex; flex-direction:column; gap:4px; margin-top:5px; padding-top:5px; border-top:1px dashed #d5deee; }
        .role-perms .role-steps-hint { font-weight:700; color:#2c3e7a; font-size:0.7rem; }
        .role-perm-group { display:flex; flex-wrap:wrap; gap:4px 14px; align-items:center; }
        .role-perm-group-title { flex:0 0 auto; font-size:0.68rem; font-weight:700; color:#fff; background:#5a6fae; border-radius:10px; padding:0 8px; }
        .role-perm-group .role-step-toggle { color:#44506b; }
        .role-perm-group .role-step-toggle input { width:0.85em; height:0.85em; margin-top:0; }
        .role-item button, .scope-item button { border:none; background:transparent; padding:0; color:#8a94a6; font-size:0.8rem; line-height:1; }
        .role-item button:hover, .scope-item button:hover { color:var(--danger); }
        .role-item button.rename:hover { color:var(--primary); }
        /* ---- 角色表格（2026-09-24 需求9：按参照图改造；旧 .role-item 卡片样式保留给其它用途，角色管理已不再使用） ---- */
        .role-table { font-size:0.75rem; }
        .role-table > :not(caption) > * > * { padding:4px 8px; border-color:#eef1f6; }
        .role-table thead th { background:#f7f9fc; color:#4a5875; font-weight:700; font-size:0.7rem; white-space:nowrap; }
        .role-table tbody tr:hover { background:#fafbfe; }
        .role-table .role-name { font-weight:700; color:#243b6b; }
        .role-table .role-cap-tag { font-size:0.6rem; color:#0a7a4b; background:#e1f5ea; border-radius:10px; padding:0 6px; white-space:nowrap; }
        .role-level-input { width:54px; text-align:center; }
        .role-op-cell { white-space:nowrap; }
        .role-op { border:none; background:transparent; padding:0 2px; color:var(--primary); font-size:0.72rem; line-height:1.2; }
        .role-op:hover { text-decoration:underline; }
        .role-op.danger { color:var(--danger); }
        /* ---- 角色管理：左侧部门树 + 顶部搜索框（2026-09-24 需求10：补全参照图1 的部门列与搜索） ---- */
        .role-manage-wrap { display:flex; gap:14px; align-items:flex-start; }
        .role-dept-tree {
            flex:0 0 156px; width:156px; max-height:420px; overflow:auto; padding:6px;
            background:#f7f9fc; border:1px solid #eef1f6; border-radius:10px;
        }
        .role-dept-tree-head { font-size:0.68rem; font-weight:700; color:#8894ac; letter-spacing:1px; padding:2px 8px 6px; }
        .role-dept-item {
            display:flex; align-items:center; justify-content:space-between; gap:6px;
            width:100%; border:none; background:transparent; border-radius:8px; padding:6px 8px;
            font-size:0.74rem; color:#3b4a6b; text-align:left; cursor:pointer;
        }
        .role-dept-item:hover { background:#e9effa; }
        .role-dept-item.active { background:var(--primary); color:#fff; font-weight:600; }
        .role-dept-item .dept-name { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
        .role-dept-item .dept-count { flex:0 0 auto; font-size:0.66rem; opacity:0.72; }
        .role-manage-main { flex:1 1 auto; min-width:0; }
        .role-search-bar { max-width:320px; margin-bottom:8px; }
        @media (max-width: 768px) {
            /* 手机端：部门树改为一行横向滑动的筛选条 */
            .role-manage-wrap { flex-direction:column; gap:8px; }
            .role-dept-tree {
                flex:1 1 auto; width:100%; max-height:none; display:flex; flex-wrap:nowrap;
                gap:4px; overflow-x:auto; overflow-y:hidden; padding:6px;
            }
            .role-dept-tree-head { display:none; }
            .role-dept-item { flex:0 0 auto; width:auto; white-space:nowrap; }
            .role-search-bar { max-width:none; }
        }
        /* ---- 「编辑角色权限」面板（需求9：多列分组 + 列分隔线，组标题可全选） ---- */
        .perm-panel-cols { display:flex; flex-wrap:wrap; align-items:flex-start; }
        .perm-col { flex:0 0 auto; min-width:186px; max-width:290px; padding:2px 14px 10px 0; margin-right:14px; border-right:1px solid #eef1f6; }
        .perm-col:last-child { border-right:none; }
        .perm-col-head { display:flex; align-items:center; gap:6px; font-size:0.78rem; font-weight:700; color:#3c4a63; padding:4px 0 6px; margin-bottom:0; cursor:pointer; user-select:none; }
        .perm-col-head.has-on { color:var(--primary); }
        .perm-col-head input, .perm-item input { width:0.85em; height:0.85em; margin:0; flex:0 0 auto; }
        .perm-item { display:flex; align-items:flex-start; gap:6px; font-size:0.72rem; color:#5a6a86; padding:2px 0; margin-bottom:0; cursor:pointer; user-select:none; line-height:1.35; }
        .perm-item:hover { color:#243b6b; }
        .perm-item.on { color:#243b6b; font-weight:600; }
        @media (max-width: 768px) {
            /* 手机上权限面板单列堆叠（列分隔线改为上下分隔线） */
            .perm-col { flex:1 1 100%; max-width:none; margin-right:0; border-right:none; border-bottom:1px solid #eef1f6; padding:6px 0; }
            .role-op { font-size:0.78rem; }
        }
        .scope-empty-tip { font-size:0.72rem; color:#8a94a6; }
        .capacity-formula { line-height:1.5; padding-left:2px; }
        /* 基本档设置：折叠分区 */
        .settings-acc .accordion-item { border:1px solid #dbe3f0; border-radius:8px; overflow:hidden; margin-bottom:10px; background:#fff; }
        .settings-acc .accordion-button { font-size:0.86rem; font-weight:700; color:#2c3e7a; background:#f3f7fd; padding:9px 14px; }
        .settings-acc .accordion-button:not(.collapsed) { color:var(--primary); background:#e9f0fb; box-shadow:none; }
        .settings-acc .accordion-button:focus { box-shadow:none; }
        .settings-acc .accordion-button::after { width:0.8em; height:0.8em; background-size:0.8em; }
        .settings-acc .accordion-body { padding:0.8rem 0.9rem 0.4rem; }
        .settings-acc .acc-sub { font-size:0.72rem; color:#6b7a93; font-weight:400; }
        .settings-acc .acc-sub b { color:#2c3e7a; }
        /* ==================== 系统设置主页（#viewSettings，原弹窗迁入） ==================== */
        .settings-page-head {
            display: flex; align-items: center; flex-wrap: wrap; gap: 8px;
            padding-bottom: 10px; margin-bottom: 12px;
            border-bottom: 1px solid #e6ecf5;
        }
        .settings-pane { display: none; }
        .settings-pane.active { display: block; }
        /* ---- FMEA 样式已迁至 assets/fmea.css（2026-09-28 整理）：分区容器 / 占位卡 / 模块管理双树节点 / DFMEA·PFMEA 表格 / 手机端隐藏 #fmeaTree 均在该文件 ---- */
        .settings-mobile-tabs { display: none; }
        /* 手机端：设置主页用横向页签替代侧边栏树（断点 991.98px 与侧栏横条模式一致：平板宽度下树同样收为单按钮，分区切换只能靠页签） */
        @media (max-width: 991.98px) {
            .settings-mobile-tabs {
                display: flex; gap: 4px; overflow-x: auto; padding-bottom: 8px; margin-bottom: 8px;
                border-bottom: 1px solid #e6ecf5;
            }
            .settings-mob-tab {
                flex: 0 0 auto; padding: 6px 12px; border: 1px solid #dbe3f0;
                border-radius: 18px; background: #fff; color: #4a5e87; font-size: 0.8rem;
                cursor: pointer; white-space: nowrap;
            }
            .settings-mob-tab.active { background: var(--primary); color: #fff; border-color: var(--primary); }
            .settings-page-head .acc-sub { display: none; }
        }
        @media (max-width:900px) {
            .capacity-week { display:flex; overflow-x:auto; padding-bottom:4px; }
            .cap-day { flex:0 0 170px; }
        }
        @media (max-width:768px) {
            .global-search-box { max-width:100%; }
            .my-todo-btn { flex:1 1 100%; justify-content:center; min-height:40px; font-size:0.85rem; }
            .capacity-grid { grid-template-columns:repeat(2, 1fr); }
            .capacity-week { display:flex; overflow-x:auto; padding-bottom:4px; }
            .cap-day { flex:0 0 160px; }
        }

        .table-wrap {
            overflow-x:auto; overflow-y:visible; border-radius:10px; border:1px solid #eef1f6;
        }
        .table-wrap table {
            margin-bottom:0; font-size:0.75rem; width:100%; table-layout:auto;
        }
        .table-wrap table th {
            background:#f8fafc; color:#2d3a4f; font-weight:600; padding:4px 6px; border-bottom:2px solid #eef1f6;
            position:sticky; top:0; z-index:10; white-space:nowrap;
        }
        .table-wrap table td {
            padding:4px 6px; vertical-align:middle; border-bottom:1px solid #f0f2f5;
            word-break:break-word; white-space:normal;
        }
        .table-wrap table tr { cursor:pointer; }
        .table-wrap table tr:hover td { background:#f8faff; }
        .table-wrap table tr.overdue-row { background-color:var(--overdue-bg) !important; }
        .table-wrap table tr.overdue-row:hover td { background-color:#fccccc !important; }

        .pagination-container {
            display:flex; justify-content:center; align-items:center; gap:10px; margin-top:12px; flex-wrap:wrap;
        }
        .pagination-container .page-info { font-size:0.8rem; color:#6b7a93; }
        .pagination-container .btn { border-radius:30px; padding:2px 14px; font-size:0.8rem; }

        .badge-status { font-size:0.65rem; padding:2px 8px; border-radius:30px; font-weight:500; display:inline-block; }
        .badge-status.done { background:#d4edda; color:#155724; }
        .badge-status.pending { background:#fff3cd; color:#856404; }
        .badge-status.empty { background:#f1f3f5; color:#6c757d; }
        .badge-status.overdue-tag { background:#dc3545; color:white; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-right:3px; }
        .badge-status.abnormal-tag { background:#fd7e14; color:white; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-left:3px; }
        .badge-status.paused-tag { background:#e2d9f3; color:#5b3e8f; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-left:3px; }
        .badge-status.confirm-tag { background:#ffe6c7; color:#a34d00; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-left:3px; }
        .badge-status.part-tag { background:#cfe2ff; color:#084298; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-left:3px; }
        .badge-status.post-tag { background:#e2d9f3; color:#5b3e8f; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-left:3px; }
        /* 2026-10-15g：详情页状态格徽标变体补全（cls 直拼 -tag，原来只有部分变体有样式）+ 折叠「+N」 */
        .badge-status.normal-tag { background:#d4edda; color:#155724; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-left:3px; }
        .badge-status.blocked-tag { background:#fde2d4; color:#9c3b10; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-left:3px; border:1px dashed #e8a87c; }
        .badge-status.special-part-tag { background:#cfe2ff; color:#084298; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-left:3px; }
        .badge-status.special-post-tag { background:#e8f4f6; color:#0b5e6b; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-left:3px; }
        .badge-status.special-mark-tag { background:#cfe2ff; color:#084298; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; margin-left:3px; }
        .badge-status.normal-tag, .badge-status.blocked-tag, .badge-status.special-part-tag, .badge-status.special-post-tag, .badge-status.special-mark-tag { margin-right:3px; }
        .badge-status.more-tag { background:#eef1f6; color:#5a6472; font-weight:700; padding:1px 6px; border-radius:10px; font-size:0.65rem; cursor:help; border:1px dashed #d7dce5; }
        .status-badge { font-size:0.65rem; padding:2px 8px; border-radius:30px; font-weight:600; display:inline-block; white-space:nowrap; }
        .status-badge.normal { background:#d4edda; color:#155724; }
        .status-badge.abnormal { background:#fff3cd; color:#856404; }
        .status-badge.overdue { background:#f8d7da; color:#721c24; }
        .status-badge.paused { background:#e2d9f3; color:#5b3e8f; }
        .status-badge.confirm { background:#ffe6c7; color:#a34d00; }
        .status-badge.blocked { background:#fde2d4; color:#9c3b10; border:1px dashed #e8a87c; }
        .status-badge.special-part { background:#cfe2ff; color:#084298; }
        .status-badge.special-post { background:#e8f4f6; color:#0b5e6b; }
        /* 2026-10-15g：列表状态列折叠徽标「+N」（项目源自状态属性，第 2 个起折叠） */
        .status-badge.more { background:#eef1f6; color:#5a6472; border:1px dashed #d7dce5; cursor:help; margin-left:3px; }
        /* 2026-10-15j：订单取消流程徽标（系统级，优先且唯一）——待取消确认=橙色警示；已取消=灰底删除线终态 */
        .status-badge.cancel-req { background:#ffe0b2; color:#8a4b00; border:1px solid #ffb74d; }
        .status-badge.cancelled { background:#e9ecef; color:#5a6472; border:1px solid #ced4da; }
        /* 2026-10-15j：状态管理弹窗 · 订单取消区块 */
        .cancel-box { border:1px solid #e3e7ee; border-radius:8px; padding:8px 10px; background:#fafbfd; font-size:.76rem; }
        .cancel-box.pending { border-color:#ffcc80; background:#fff8ec; }
        .cancel-box.cancelled { border-color:#d7dce5; background:#f4f6f9; }
        .cancel-box .cancel-title { font-weight:700; color:#b23c00; margin-bottom:4px; }
        .cancel-box.cancelled .cancel-title { color:#5a6472; }
        .cancel-box .cancel-meta { color:#495057; line-height:1.6; }
        .cancel-box .cancel-tip { color:#6c757d; margin-top:4px; line-height:1.5; }
        .cancel-box .cancel-actions { display:flex; gap:6px; flex-wrap:wrap; margin-top:6px; }
        .cancel-inv { margin-top:6px; padding:6px 8px; background:#fff; border:1px dashed #e3e7ee; border-radius:6px; }
        .cancel-inv-row { display:flex; gap:6px; line-height:1.6; }
        .cancel-inv-row .ci-label { flex:0 0 68px; color:#868e96; }
        .cancel-form { margin-top:6px; padding:8px; border:1px solid #ffcc80; border-radius:6px; background:#fff; }
        .cancel-form-title { font-weight:600; margin-bottom:4px; color:#8a4b00; }
        .cancel-radio { display:block; margin:3px 0; font-weight:400; }
        .cancel-form-actions { display:flex; gap:6px; justify-content:flex-end; margin-top:6px; }
        /* 2026-10-15m：分类汇总 · 存量流转台账（期初 ＋ 新接 − 完成 − 取消 ＝ 期末；按业务域分行，不合计） */
        .flow-panel { border:1px solid #d7dce5; border-radius:8px; padding:8px 10px; background:#fafbfd; margin-bottom:10px; }
        .flow-head { font-weight:700; color:var(--primary); font-size:.84rem; margin-bottom:2px; }
        .flow-head .text-muted { font-size:.72rem; margin-left:4px; }
        .flow-note { color:#6c757d; font-size:.71rem; line-height:1.55; margin-bottom:6px; }
        .flow-row { display:flex; align-items:center; gap:4px; flex-wrap:wrap; padding:5px 0; border-top:1px dashed #e3e7ee; }
        .flow-row:first-of-type { border-top:none; }
        .flow-biz { flex:0 0 60px; }
        .flow-cell { min-width:76px; text-align:center; padding:2px 6px; border-radius:6px; background:#fff; border:1px solid #e9edf3; }
        .flow-cell.end { border-color:var(--primary); background:#eef4ff; }
        .flow-cell .fn-l { font-size:.68rem; color:#6c757d; line-height:1.3; white-space:nowrap; }
        .flow-cell .fn-l em { display:block; font-style:normal; font-size:.62rem; color:#a0a8b3; }
        .flow-cell .fn-v { font-size:1.05rem; font-weight:700; color:#212529; line-height:1.2; }
        .flow-cell.end .fn-v { color:var(--primary); }
        .flow-op { color:#868e96; font-weight:700; font-size:.9rem; }
        .flow-chk { margin-left:auto; font-size:.68rem; padding:2px 8px; border-radius:10px; white-space:nowrap; }
        .flow-chk.ok { background:#e6f4ea; color:#1e7e34; border:1px solid #b7dfc4; }
        .flow-chk.bad { background:#fdecea; color:#b3261e; border:1px solid #f5c6cb; }
        .flow-chk.na { background:#f1f3f5; color:#868e96; border:1px solid #dee2e6; }
        @media (max-width: 991.98px) {
            .flow-row { gap:2px; }
            .flow-cell { min-width:54px; padding:2px 3px; }
            .flow-cell .fn-v { font-size:.95rem; }
            .flow-cell .fn-l { font-size:.62rem; }
            .flow-chk { margin-left:0; }
        }
        /* 2026-10-15g：详情页进度主标签（已完成/进行中/未开始）样式补全（14k1 引入类名但一直缺样式） */
        .status-main { font-weight:700; padding:1px 8px; border-radius:10px; font-size:0.7rem; display:inline-block; }
        .status-main.main-done { background:#d4edda; color:#155724; }
        .status-main.main-doing { background:#cfe2ff; color:#084298; }
        .status-main.main-ready { background:#f1f3f5; color:#6c757d; }
        /* —— 订单状态管理：状态/属性开关按钮（美化） —— */
        .status-flag-btn {
            --c:#5a6472; --bg:#f2f4f8; --bd:rgba(90,100,114,.25); --g1:#8494a8; --g2:#5a6472; --sh:rgba(90,100,114,.22);
            display:inline-flex; align-items:center; gap:5px; margin:0;
            border:1px solid var(--bd); background:var(--bg); color:var(--c);
            border-radius:999px; font-size:.74rem; font-weight:600; line-height:1.15;
            padding:3px 11px 3px 4px; cursor:pointer; letter-spacing:.2px;
            box-shadow:0 1px 2px rgba(15,25,50,.05);
            transition:transform .12s ease, box-shadow .15s ease, background-color .15s ease, color .15s ease, border-color .15s ease;
        }
        .status-flag-btn:hover { transform:translateY(-1px); box-shadow:0 3px 9px var(--sh); }
        .status-flag-btn:active { transform:translateY(0); }
        .status-flag-btn .flag-ic {
            width:20px; height:20px; flex:none; border-radius:50%;
            display:inline-flex; align-items:center; justify-content:center;
            background:#fff; border:1px solid var(--bd); font-size:.72rem; line-height:1;
            transition:inherit;
        }
        .status-flag-btn.active {
            background:linear-gradient(135deg,var(--g1),var(--g2));
            border-color:transparent; color:#fff; box-shadow:0 4px 12px var(--sh);
        }
        .status-flag-btn.active .flag-ic { background:rgba(255,255,255,.24); border-color:rgba(255,255,255,.5); color:#fff; }
        .status-flag-btn::after {
            content:''; width:7px; height:7px; border-radius:50%; flex:none;
            border:1.5px solid currentColor; opacity:.4; transition:inherit;
        }
        .status-flag-btn.active::after { content:'✓'; border:none; width:auto; height:auto; font-size:.68rem; font-weight:800; opacity:1; line-height:1; }
        .status-flag-btn:focus-visible { outline:2px solid var(--c); outline-offset:1px; }
        .status-flag-btn.flag-paused { --c:#6d28d9; --bg:#f6f2fe; --bd:rgba(109,40,217,.30); --g1:#a78bfa; --g2:#6d28d9; --sh:rgba(109,40,217,.28); }
        .status-flag-btn.flag-confirm { --c:#b45309; --bg:#fff8ec; --bd:rgba(217,119,6,.32); --g1:#f59e0b; --g2:#d97706; --sh:rgba(217,119,6,.28); }
        .status-flag-btn.flag-part { --c:#1d4ed8; --bg:#eef4ff; --bd:rgba(29,78,216,.30); --g1:#3b82f6; --g2:#1d4ed8; --sh:rgba(29,78,216,.28); }
        .status-flag-btn.flag-out { --c:#0f766e; --bg:#ecfdf9; --bd:rgba(13,148,136,.32); --g1:#14b8a6; --g2:#0d9488; --sh:rgba(13,148,136,.28); }
        /* 需求（2026-10-10）：占位按钮（待提供实物/修改结构/修改工艺）——虚线边框示意功能开发中，不参与开关切换 */
        .status-flag-btn.flag-todo { border-style:dashed; }
        .status-flag-btn.flag-await { --c:#b91c1c; --bg:#fef2f2; --bd:rgba(185,28,28,.32); --g1:#f87171; --g2:#dc2626; --sh:rgba(185,28,28,.25); }
        .status-flag-btn.flag-arch { --c:#0e7490; --bg:#ecfeff; --bd:rgba(14,116,144,.32); --g1:#22d3ee; --g2:#0891b2; --sh:rgba(14,116,144,.25); }
        .status-flag-btn.flag-struct { --c:#4d7c0f; --bg:#f7fee7; --bd:rgba(101,163,13,.34); --g1:#a3e635; --g2:#65a30d; --sh:rgba(101,163,13,.25); }
        .status-flag-btn.flag-craft { --c:#9d174d; --bg:#fdf2f8; --bd:rgba(157,23,77,.32); --g1:#f472b6; --g2:#db2777; --sh:rgba(157,23,77,.25); }
        /* 需求（2026-10-10）：产品履历折叠展开后限高滚动，避免履历过多时撑高弹窗 */
        #pauseHistoryList.collapse.show { max-height:280px; overflow-y:auto; }
        .status-cell { cursor:pointer; }
        .pause-history-item { border:1px solid #e5e9f2; border-radius:6px; padding:6px 8px; margin-bottom:6px; background:#fafbfd; }
        .pause-history-item .pause-history-content { font-size:0.8rem; margin-top:4px; white-space:pre-wrap; word-break:break-all; }
        .hist-by { display:inline-block; font-size:0.66rem; color:#5f6d85; background:#eef1f7; border-radius:10px; padding:1px 7px; white-space:nowrap; }
        /* 产品履历类型徽标 */
        .hist-badge { display:inline-block; font-size:0.65rem; padding:1px 7px; border-radius:10px; font-weight:600; white-space:nowrap; }
        .hist-badge.create { background:#d4edda; color:#155724; }
        .hist-badge.step { background:#cfe2ff; color:#084298; }
        .hist-badge.abnormal { background:#f8d7da; color:#721c24; }
        .hist-badge.pause { background:#e2d9f3; color:#5b3e8f; }
        .hist-badge.resume { background:#d1e7dd; color:#0f5132; }
        .hist-badge.edit { background:#fff3cd; color:#856404; }
        .hist-badge.note { background:#e9ecef; color:#495057; }
        /* 状态/属性开关对应履历徽标：与订单状态管理按钮配色一致 */
        .hist-badge.pendingConfirm { background:#ffe6c7; color:#a34d00; }
        .hist-badge.productionPart { background:#cfe2ff; color:#084298; }
        .hist-badge.outsourced { background:#ccfbf1; color:#0f766e; }

        .action-btns .btn { padding:1px 4px; font-size:0.65rem; border-radius:4px; margin:0 1px; }

        .modal-custom .modal-content { border-radius:12px; border:none; box-shadow:0 20px 60px rgba(0,0,0,0.15); }
        .modal-custom .modal-header { border-bottom:1px solid #eef1f6; padding:10px 16px; }
        .modal-custom .modal-body { padding:10px 16px; max-height:80vh; overflow-y:auto; }
        .modal-custom .modal-footer { border-top:1px solid #eef1f6; padding:8px 16px; }
        .modal-custom .form-label { font-weight:500; font-size:0.7rem; margin-bottom:2px; color:#2d3a4f; }
        .modal-custom .form-control, .modal-custom .form-select { border-radius:8px; border:1.5px solid #e0e5ee; font-size:0.75rem; padding:4px 10px; height:28px; }
        /* 下拉框须为 Bootstrap 右侧箭头预留内边距：箭头占右侧 12~28px，上面规则把默认 padding-right(2.25rem) 压成 10px 会导致箭头与文字重叠 */
        .modal-custom .form-select { padding-right:30px; }
        .modal-custom .form-control-sm { height:24px; font-size:0.7rem; padding:2px 6px; }
        .modal-custom .form-select-sm { height:24px; font-size:0.7rem; padding:2px 30px 2px 8px; }
        .modal-custom .row { margin-bottom:3px; }
        .modal-custom .input-group .btn { height:28px; font-size:0.75rem; }

        .empty-state { text-align:center; padding:30px 20px; color:#8a94a6; }
        .empty-state i { font-size:2.5rem; margin-bottom:8px; opacity:0.4; }

        .progress-track { display:flex; gap:2px; flex-wrap:wrap; align-items:center; }
        .progress-track .dropdown .step { display:inline-flex; align-items:center; gap:2px; font-size:0.7rem; color:#6b7a93; padding:2px 5px; border-radius:6px; cursor:pointer; transition:background 0.15s; background:transparent; border:1px solid transparent; white-space:nowrap; }
        .progress-track .dropdown .step:hover { background:#eef3ff; border-color:#cdd8e8; }
        .progress-track .dropdown .step i { font-size:0.75rem; }
        .progress-track .dropdown .step.done { color:var(--success); }
        .progress-track .dropdown .step.pending { color:var(--warning); }
        /* 无需：此单不需要该工序 → 灰色×图标，与默认未开始的浅灰区分 */
        .progress-track .dropdown .step.na { color:#8f99a8; }
        .progress-track .dropdown .step.na i { opacity:0.85; }
        /* 品检（末道终检）：不参与通用四态流转，只由「检验」驱动 ——
           未检验＝主色「检验」入口（做成按钮观感）；合格＝绿色已完成；不合格＝红色「返工」 */
        .progress-track .dropdown .step.qa-inspect { color:var(--primary); background:#eef3ff; border-color:#cdd8e8; font-weight:600; }
        .progress-track .dropdown .step.qa-inspect:hover { background:#e3ecff; border-color:#b7c9ea; }
        .progress-track .dropdown .step.rework { color:#dc3545; font-weight:600; }
        .progress-track .dropdown .step.rework:hover { background:#fdeceb; border-color:#f2c4c0; }
        .progress-track .dropdown .step:not(.done):not(.pending):not(.na):not(.qa-inspect):not(.rework) { color:#adb5bd; }
        .progress-track .dropdown-menu { min-width:80px; padding:3px 0; font-size:0.75rem; max-height:160px; overflow-y:auto; z-index:9999 !important; }
        .progress-track .dropdown-menu .dropdown-item { padding:3px 12px; cursor:pointer; }
        .progress-track .dropdown-menu .dropdown-item:hover { background:var(--bg-light); }
        /* 自定义工序状态弹出菜单：fixed 挂到 body，不被卡片/滚动容器裁剪 */
        .progress-step-popup {
            position:fixed; z-index:10000; min-width:116px; padding:4px 0;
            background:#fff; border:1px solid #e0e5ee; border-radius:8px;
            box-shadow:0 6px 20px rgba(0,0,0,.16); font-size:0.85rem;
            overflow:hidden;
        }
        .progress-step-popup .pop-item {
            padding:9px 14px; cursor:pointer; display:flex; align-items:center; gap:7px;
            white-space:nowrap; color:#2d3a4f; user-select:none; -webkit-user-select:none;
        }
        .progress-step-popup .pop-item:hover { background:#f0f4ff; }
        .progress-step-popup .pop-item.active { color:var(--primary); font-weight:600; background:#eef3ff; }
        /* 备料状态菜单 · 材料清单就地勾选（2026-10-12 需求）：菜单项下方分区列出材料复选框 */
        .progress-step-popup .pop-mat { border-top:1px solid #e8edf5; padding:5px 0 2px; }
        .progress-step-popup .pop-mat-head { display:flex; align-items:center; justify-content:space-between; gap:10px; padding:3px 14px 4px; font-size:0.72rem; color:#7a8699; white-space:nowrap; }
        .progress-step-popup .pop-mat-head .pop-mat-count { font-weight:600; color:#4a5a72; }
        .progress-step-popup .pop-mat-row { display:flex; align-items:center; gap:7px; padding:5px 14px; cursor:pointer; white-space:nowrap; color:#2d3a4f; font-size:0.82rem; user-select:none; -webkit-user-select:none; }
        .progress-step-popup .pop-mat-row:hover { background:#f0f4ff; }
        .progress-step-popup .pop-mat-row .m-name.done { text-decoration:line-through; color:#9aa5b5; }
        .progress-step-popup .pop-mat-row .m-steps { font-size:0.68rem; color:#8a93a5; }
        .progress-step-popup .pop-mat-row input[type=checkbox] { margin:0; }

        .summary-chart { display:flex; flex-wrap:wrap; gap:6px; margin-top:6px; }
        .summary-chart .bar-item { display:flex; align-items:center; gap:6px; width:100%; cursor:pointer; border-radius:6px; padding:2px 4px; transition:background 0.15s; }
        .summary-chart .bar-item:hover { background:#f2f5fb; }
        .summary-chart .bar-item .label { min-width:50px; font-size:0.75rem; color:#4a5a72; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
        .summary-chart .bar-item .bar-track { flex:1; height:6px; background:#eef1f6; border-radius:30px; overflow:hidden; }
        .summary-chart .bar-item .bar-track .bar-fill { height:100%; border-radius:30px; background:linear-gradient(90deg, var(--primary-light), var(--primary)); transition:width 0.6s ease; width:0%; }
        .summary-chart .bar-item .bar-value { font-size:0.75rem; font-weight:600; color:var(--primary); min-width:30px; text-align:right; }

        .dimension-selector { display:flex; flex-wrap:wrap; gap:4px; margin-bottom:8px; }
        .dimension-selector .dim-btn { padding:3px 12px; border-radius:30px; border:1.5px solid #e0e5ee; background:white; font-size:0.75rem; font-weight:500; color:#4a5a72; transition:all 0.2s; cursor:pointer; }
        .dimension-selector .dim-btn:hover { border-color:var(--primary); color:var(--primary); }
        .dimension-selector .dim-btn.active { background:var(--primary); color:white; border-color:var(--primary); }

        .summary-scope-toggle { display:flex; gap:4px; margin-right:10px; }
        .summary-scope-toggle .scope-btn { padding:3px 12px; border-radius:30px; border:1.5px solid #d8e3d0; background:#f6faf3; font-size:0.75rem; font-weight:500; color:#3a7d44; transition:all 0.2s; cursor:pointer; }
        .summary-scope-toggle .scope-btn:hover { border-color:#2e8b57; color:#2e8b57; }
        .summary-scope-toggle .scope-btn.active { background:#2e8b57; color:white; border-color:#2e8b57; }
        .summary-table tbody tr { cursor:pointer; }
        .summary-table tbody tr:hover { background:#f0f4ff !important; }
        /* 分类汇总：按业务域（估价 / 打样 / 大货）分区的区块 */
        .summary-biz-block { margin-bottom:16px; padding-bottom:12px; border-bottom:2px dashed #e3e9f4; }
        .summary-biz-block:last-child { margin-bottom:0; padding-bottom:0; border-bottom:none; }
        .summary-biz-head { display:flex; align-items:center; gap:8px; margin-bottom:8px; }

        .btn-outline-primary-custom { border-color:var(--primary); color:var(--primary); }
        .btn-outline-primary-custom:hover { background:var(--primary); color:white; }
        .badge-dimension { background:#eef3ff; color:var(--primary); font-weight:500; padding:2px 8px; border-radius:30px; font-size:0.65rem; }

        ::-webkit-scrollbar { width:4px; height:4px; }
        ::-webkit-scrollbar-track { background:#f0f2f5; border-radius:10px; }
        ::-webkit-scrollbar-thumb { background:#c5cdd8; border-radius:10px; }
        ::-webkit-scrollbar-thumb:hover { background:#a8b2c0; }

        /* ===== 手机端优化 ===== */
        @media (max-width:768px) {
            body { padding-bottom: 76px; }
            .container { padding-left: 12px; padding-right: 12px; }

            /* 头部精简（需求4）：手机上取消抬头「打样订单管理」、三枚统计卡片、导航条「系统设置」入口，
               只保留「用户 / 设置 / 登出」三个按钮（#userChip）＋全局搜索栏，两行紧凑排布 */
            .app-header { padding: 8px 0; }
            .app-header .container { flex-direction:row; align-items:center; text-align:left; gap:6px; }
            .app-header h1 { display:none; }
            .header-stats { display:none; }
            .header-right { flex:1 1 100%; flex-direction:row; justify-content:flex-end; gap:6px; }
            .user-chip { flex-direction:row; align-items:center; }
            /* 「系统设置」是管理员后台，手机屏幕窄，取消导航条上的该入口（桌面端不受影响） */
            #systemSettingsTree { display:none; }

            /* 顶部导航与新增按钮（.view-tabs-row 顶部页签已删除、「新增订单」按钮已搬到顶栏搜索区，对应移动端样式一并清理；.view-tabs .tab-btn 仍服务于「数据看板」内部门总览 / 人员负荷 / 我的工作 子选项卡） */
            .view-tabs { display:flex; width:100%; gap:3px; }
            .view-tabs .tab-btn { flex:1; min-height:44px; display:flex; align-items:center; justify-content:center; font-size:0.8rem; padding:6px 4px; }
            /* 手机端 tab 图标隐藏，保证 5 个标签（含订单排产）一行放下 */
            .view-tabs .tab-btn i { display:none; }
            /* 分类汇总页内子选项卡：一行等宽放下 */
            .sub-tabs { width:100%; }
            .sub-tabs .sub-tab-btn { flex:1; justify-content:center; padding:9px 6px; font-size:0.82rem; }

            /* 卡片间距 */
            .card-dashboard { padding:14px; margin-bottom:14px; }
            .dashboard-big-cards .big-card { padding:16px 12px; }
            .dashboard-big-cards .big-card .number { font-size:2.4rem; }
            .dashboard-big-cards .big-card .label { font-size:0.9rem; }
            .dashboard-big-cards .big-card .sub { font-size:0.8rem; }
            .step-stats-cards .step-card { padding:12px; }
            .step-stats-cards .step-card .step-item { font-size:0.9rem; padding:6px 0; }
            .step-stats-cards .step-card .step-title { font-size:0.95rem; }

            /* 列表头部 */
            .list-header { gap:8px; }
            .list-header > div.d-flex { flex-wrap:wrap; }
            .list-header .btn { min-height:44px; font-size:0.9rem; white-space:nowrap; }
            .list-header #btnBatchCopy, .list-header #btnBatchDelete, .list-header #btnRefresh { flex:1 1 auto; padding:4px 10px; }
            .list-header .status-toggle,
            .list-header .demand-toggle,
            .list-header .biz-toggle { width:100%; align-self:flex-start; }
            .list-header .status-toggle .btn,
            .list-header .demand-toggle .btn,
            .list-header .biz-toggle .btn { min-height:44px; padding:4px 8px; font-size:0.9rem; flex:1; white-space:nowrap; }

            /* 订单列表手机端卡片化：状态+客户首行，代号/品名各一行，需求+数量一行，工序自适应换行 */
            #tableWrap { overflow-x:visible; }
            #tableWrap table { min-width:0 !important; font-size:0.8rem; }
            /* 强制表格按卡片宽度收缩，避免进度标签因容器被撑开而不换行 */
            #orderTable { display:block !important; width:100% !important; max-width:100% !important; }
            #orderTable tbody { display:block !important; width:100% !important; }
            #orderTable tbody tr { width:100% !important; box-sizing:border-box; }
            #orderTable thead { display:none; }
            #orderTable tbody tr { display:flex; flex-wrap:wrap; align-items:center; gap:2px 8px; border:1px solid #e0e5ee; border-radius:10px; margin-bottom:8px; padding:8px 10px; background:#fafbfd; box-shadow:0 1px 4px rgba(0,0,0,0.03); }
            #orderTable tbody td { display:flex; align-items:center; gap:4px; border:none; padding:3px 2px; font-size:0.8rem; flex:0 1 auto; max-width:100%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
            #orderTable tbody td::before { content:attr(data-label); color:#8a94a6; font-size:0.72rem; flex-shrink:0; }
            /* 全选框 */
            #orderTable tbody td:first-child { order:0; flex:0 0 auto; overflow:visible; }
            /* 隐藏列：流水号、单号、重复、操作 */
            #orderTable tbody td.col-idx,
            #orderTable tbody td.col-actions,
            #orderTable tbody td[data-label="单号"],
            #orderTable tbody td[data-label="重复"] { display:none; }
            /* 第一行：状态 + 客户 + 代号 */
            #orderTable tbody td[data-label="状态"] { order:1; flex:0 0 auto; }
            #orderTable tbody td[data-label="客户"] { order:2; flex:1 1 auto; min-width:0; }
            #orderTable tbody td[data-label="代号"] { order:3; flex:0 1 auto; min-width:0; }
            /* 第二行：品名 */
            #orderTable tbody td[data-label="品名"] { order:4; flex-basis:100%; }
            /* 第三行：需求 + 数量 + 接单日 + 完成日 */
            #orderTable tbody td[data-label="需求"] { order:5; flex:0 0 auto; }
            #orderTable tbody td[data-label="数量"] { order:6; flex:0 0 auto; }
            #orderTable tbody td[data-label="接单日"] { order:7; flex:0 0 auto; }
            #orderTable tbody td[data-label="完成日"] { order:8; flex:0 0 auto; }
            /* 第四行：业务 + 工程师（业务强制从新行开始，宽度按内容自适应） */
            #orderTable tbody td[data-label="业务"] { order:9; flex:0 0 auto; flex-basis:100%; max-width:fit-content; }
            #orderTable tbody td[data-label="工程师"] { order:10; flex:0 0 auto; }
            /* 进度：独立一行，工序自适应换行，无需左右滚动 */
            #orderTable tbody td.progress-cell { order:11; flex-basis:100%; white-space:normal; overflow:visible; border-top:1px dashed #eef1f6; margin-top:4px; padding-top:6px; }
            #orderTable tbody td.progress-cell::before { display:none; }
            #orderTable .progress-track { flex-wrap:wrap; overflow:visible; padding-bottom:2px; }
            #orderTable .progress-track .dropdown { flex:0 0 auto; }
            #orderTable .progress-track .step { font-size:0.85rem; padding:5px 7px; }
            .step-combined { min-width:0 !important; }
            .step-combined .num-cell { font-size:1rem; min-width:32px; padding:8px 6px; }
            .step-combined th, .step-combined td { padding:10px 6px; }
            .detail-table { min-width:640px; }
            .detail-table td, .detail-table th { padding:8px 10px; }

            /* 按钮与输入框最小高度 44px，方便手指点击 */
            .btn { min-height:44px; display:inline-flex; align-items:center; justify-content:center; }
            .btn-sm { min-height:40px; }
            .btn-primary, .btn-outline-primary-custom, .btn-danger { padding:6px 14px; }
            .action-btns .btn { min-height:36px; min-width:36px; font-size:0.8rem; padding:2px 8px; }
            .form-control, .form-select { height:44px; font-size:1rem; }
            .modal-custom .form-control { height:44px; font-size:1rem; padding:8px 12px; }
            .modal-custom .form-select { height:44px; font-size:1rem; padding:8px 30px 8px 12px; }
            .modal-custom .form-control-sm, .modal-custom .form-select-sm { height:44px; font-size:1rem; }
            .modal-custom .input-group .btn { height:44px; font-size:1rem; }
            .modal-custom textarea.form-control, .modal-custom textarea.form-control-sm { height:auto; min-height:44px; }
            .compact-form .form-control, .compact-form .form-select { height:44px; font-size:1rem; }
            .compact-form .input-group .btn { height:44px; font-size:1rem; }
            .business-filter-row { flex-direction:column; align-items:stretch; gap:8px; }
            .business-filter-row select { width:100%; height:44px; font-size:1rem; min-width:100%; }
            .summary-date-filter { flex-direction:column; align-items:stretch; gap:8px; }
            .summary-date-filter input[type="date"] { width:100%; height:44px; font-size:1rem; }
            .summary-date-filter .btn { width:100%; min-height:44px; font-size:0.9rem; }
            .dash-filter-bar { padding:8px 10px; font-size:0.9rem; }
            .dash-filter-bar .btn { min-height:40px; font-size:0.9rem; padding:4px 12px; }
            .pagination-container { flex-direction:column; gap:8px; }
            .pagination-container .btn { min-height:44px; padding:6px 20px; font-size:0.9rem; }
            .pagination-container .page-info { font-size:0.9rem; }
            .card-footer-actions { flex-direction:column-reverse; gap:8px; }
            .card-footer-actions .btn { width:100%; height:44px; font-size:0.9rem; }

            /* 模态框 */
            .modal-dialog { margin:8px; }
            .modal-custom .modal-body { padding:12px; }
            .modal-custom .form-label { font-size:0.9rem; margin-bottom:4px; }
            .modal-custom .row { margin-bottom:6px; }

            /* 字号与间距 rem 化 */
            .stat-grid { grid-template-columns:repeat(2,1fr); gap:8px; }
            .stat-card { padding:12px; }
            .stat-card .number { font-size:1.5rem; }
            .stat-card .label { font-size:0.85rem; }
            .summary-chart .bar-item .label { font-size:0.85rem; }
            .summary-chart .bar-item .bar-value { font-size:0.85rem; }
            .progress-track .dropdown .step { font-size:0.85rem; padding:6px 7px; }
            .badge-status, .status-badge { font-size:0.75rem; padding:3px 10px; }
            .empty-state { padding:28px 16px; font-size:0.9rem; }
            /* 订单列表 · 表头排序（2026-10-12 需求）：点列名切换升/降序，当前排序列高亮 + ▲▼ 标记 */
            #orderTable thead th.sortable { cursor:pointer; user-select:none; -webkit-user-select:none; padding:8px 6px; transition:background 0.15s; white-space:nowrap; }
            #orderTable thead th.sortable:hover { background:#eef3ff; color:var(--primary); }
            #orderTable thead th.sortable .sort-ind { display:inline-block; width:11px; margin-left:3px; font-size:0.7rem; color:#b8c0d0; transition:color 0.15s; }
            #orderTable thead th.sortable.sort-asc,
            #orderTable thead th.sortable.sort-desc { color:var(--primary); background:#f4f7ff; }
            #orderTable thead th.sortable.sort-asc .sort-ind,
            #orderTable thead th.sortable.sort-desc .sort-ind { color:var(--primary); }
            /* toast 手机端样式见基础 .toast-msg 规则之后的 @media 覆盖（必须后置，避免 top/bottom 同时生效拉成竖长条） */
            /* 手机端：隐藏流水号列与操作列；进度列内容自动换行，工序标签保持一行 */
            #orderTable .col-idx, #orderTable .col-actions { display:none; }
            #orderTable td.progress-cell { white-space:normal; }
            #orderTable .progress-track .dropdown { flex:0 0 auto; }
        }
        @media (max-width:480px) {
            .dashboard-big-cards .big-card .number { font-size:2rem; }
            .view-tabs .tab-btn { font-size:0.8rem; padding:6px 6px; }
            .header-stats .stat-item { font-size:0.8rem; padding:5px 8px; }
        }
        .detail-table td { vertical-align:middle; }
        .detail-table textarea { width:100%; resize:vertical; min-height:30px; font-size:0.75rem; }
        /* ==================== 订单排产 ==================== */
        .prod-section-title { font-weight:bold; color:var(--primary); margin:14px 0 8px; font-size:1rem; display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
        .prod-section-title:first-child { margin-top:0; }
        .prod-count { display:inline-flex; align-items:center; justify-content:center; min-width:22px; height:22px; padding:0 6px; border-radius:11px; background:var(--primary); color:#fff; font-size:0.72rem; font-weight:600; }
        .prod-step-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:10px; }
        .prod-step-card { background:#f8f9fc; border:1px solid #e0e5ee; border-radius:10px; padding:10px 12px; }
        .prod-step-title { font-weight:600; color:#2c3e7a; margin-bottom:8px; font-size:0.95rem; display:flex; align-items:center; justify-content:space-between; gap:8px; flex-wrap:wrap; }
        .prod-step-title > span:first-child { display:inline-flex; align-items:center; gap:8px; }
        .prod-chip-pick { cursor:pointer; user-select:none; }
        .prod-chip-pick:hover { border-color:#b8c4de; }
        .prod-chip-pick input[type=checkbox] { width:14px; height:14px; margin:0; accent-color:var(--primary); flex:none; }
        .prod-chip.picked { border-color:var(--primary); background:#eef3ff; box-shadow:0 0 0 1px var(--primary); }
        .badge-status.assembled { background:#cfe2ff; color:#084298; }
        .prod-step-export-btn, .prod-add { white-space:nowrap; }
        .prod-step-orders { display:flex; flex-wrap:wrap; gap:6px; }
        .prod-chip-empty { display:inline-block; color:#8a94a6; font-size:0.8rem; padding:2px 0; }
        .prod-step-edit { cursor:pointer; transition:transform .1s; }
        .prod-step-edit:hover { transform:scale(1.06); filter:brightness(1.05); }
        .prod-chip { display:inline-flex; align-items:center; gap:5px; background:#fff; border:1px solid #dde3ee; border-radius:8px; padding:4px 8px; font-size:0.8rem; font-weight:600; color:#2c3e7a; }
        .prod-chip small { font-weight:400; color:#8a94a6; font-size:0.72rem; }
        .prod-plan { font-weight:400; color:#b45f06; font-size:0.75rem; }
        .prod-plan.overdue { color:#b02a37; font-weight:600; }
        .badge-status.ready { background:#fff6e5; color:#8a5a00; }
        .badge-status.doing { background:#cfe2ff; color:#084298; }
        .prod-order-card { background:#fff; border:1px solid #e0e5ee; border-radius:10px; padding:10px 12px; margin-bottom:8px; }
        .prod-order-head { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
        .prod-order-title { flex:1 1 auto; min-width:200px; display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
        .prod-order-meta { display:flex; gap:12px; color:#8a94a6; font-size:0.78rem; flex-wrap:wrap; }
        .prod-order-steps { display:flex; flex-wrap:wrap; gap:5px; margin-top:8px; }
        .prod-step { display:inline-flex; align-items:center; gap:3px; border:1px solid #dde3ee; background:#f6f8fb; border-radius:6px; padding:3px 8px; font-size:0.75rem; color:#6c7688; }
        .prod-step.done { background:#e7f4ec; border-color:#bcd9c6; color:#0f5132; }
        .prod-step.doing { background:#e6f0ff; border-color:#b8d1f5; color:#084298; }
        /* 无需：排产明细工序徽章灰色虚线样式（区别于未开始的实线灰） */
        .prod-step.na { background:#f3f4f6; border:1px dashed #c8cfd9; color:#8f99a8; }
        .prod-step.ready { background:#fff6e5; border-color:#f0d9a8; color:#8a5a00; font-weight:600; box-shadow:0 0 0 1px #f0d9a8; }
        /* 排产订单：打样员（多选） */
        .prod-order-samplers { display:flex; align-items:center; gap:4px 8px; flex-wrap:wrap; margin-top:8px; font-size:0.75rem; }
        .prod-order-samplers .ps-label { font-weight:700; color:#2c3e7a; flex:none; white-space:nowrap; }
        .prod-order-samplers .ps-none { color:#b02a37; font-weight:600; }
        .sampler-chip { display:inline-flex; align-items:center; gap:4px; border:1px solid #dde3ee; background:#f6f8fb; border-radius:20px; padding:2px 9px; font-size:0.72rem; color:#6c7688; cursor:pointer; user-select:none; }
        .sampler-chip:hover { border-color:#b8c4de; }
        .sampler-chip.on { background:#e7f4ec; border-color:#bcd9c6; color:#0f5132; font-weight:600; }
        .sampler-chip input { width:0.85em; height:0.85em; margin:0; accent-color:var(--success); }
        /* 加入排产：定义打样员弹窗 */
        .sampler-overlay { position:fixed; inset:0; z-index:10600; background:rgba(15,23,42,.5); display:flex; justify-content:center; align-items:flex-start; padding:36px 12px; overflow:auto; }
        .sampler-modal { background:#fff; border-radius:14px; width:min(720px,100%); box-shadow:0 16px 48px rgba(0,0,0,.25); display:flex; flex-direction:column; max-height:calc(100vh - 72px); }
        .sampler-modal-head { padding:12px 16px; border-bottom:1px solid #e5eaf2; font-weight:700; color:#2c3e7a; display:flex; justify-content:space-between; align-items:center; gap:10px; flex:none; }
        .sampler-modal-head small { font-weight:400; color:#8a94a6; }
        .sampler-modal-body { overflow:auto; padding:8px 14px; flex:1 1 auto; }
        .sampler-order { border:1px solid #e0e5ee; border-radius:10px; padding:8px 10px; margin:8px 0; background:#f8f9fc; }
        .sampler-order-title { display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:0.8rem; margin-bottom:6px; }
        .sampler-order-title .so-cust { color:#8a94a6; font-weight:400; font-size:0.75rem; }
        .sampler-order-title .so-mark { color:#b02a37; font-weight:600; font-size:0.68rem; margin-left:auto; }
        .sampler-modal-foot { padding:10px 16px; border-top:1px solid #e5eaf2; display:flex; justify-content:flex-end; gap:8px; flex:none; }
        /* 组装派单：星级 / 承担数量输入 / 在手单数 */
        .sampler-chip .so-star { color:#e8a20c; letter-spacing:-1px; }
        .sampler-chip .so-name { font-weight:600; }
        .sampler-chip .so-qty { width:58px; height:20px; border:1px solid #d7dfec; border-radius:6px; padding:0 4px; font-size:0.7rem; text-align:right; background:#fff; color:#2d3a4f; }
        .sampler-chip.on .so-qty { border-color:#8fbfa4; }
        .sampler-chip .so-qty:disabled { background:#f1f3f7; color:#b6bdc9; }
        .sampler-chip .so-backlog { color:#a2abb9; font-size:0.66rem; }
        /* 需求33（2026-09-30）：派单对话框「主办人」勾选框样式——白底灰边框，勾选时金底高亮 */
        .sampler-chip .so-primary { display:inline-flex; align-items:center; gap:3px; padding:1px 6px; border:1px solid #d7dfec; background:#fff; border-radius:10px; color:#6c7688; cursor:pointer; user-select:none; font-weight:500; }
        .sampler-chip .so-primary:hover { border-color:#e8a20c; }
        .sampler-chip .so-primary.on { background:#fff7e6; border-color:#e8a20c; color:#9a6b00; font-weight:600; }
        .sampler-chip .so-primary input { width:0.85em; height:0.85em; margin:0; accent-color:#e8a20c; cursor:pointer; }
        .sampler-order-title .so-mark { margin-left:auto; }
        .sampler-order-title .so-split-btn { margin-left:8px; }
        /* 排产「印刷 / 后加工」清单打印：先预览 → 再打印（表单版式定义见 js/09-schedule.js → STEP_PRINT_FORMS） */
        .step-print-overlay { position:fixed; inset:0; z-index:10700; background:rgba(15,23,42,.55); display:flex; justify-content:center; align-items:flex-start; padding:28px 12px; overflow:auto; }
        .step-print-modal { background:#eef1f6; border-radius:14px; width:min(900px,100%); box-shadow:0 16px 48px rgba(0,0,0,.28); display:flex; flex-direction:column; max-height:calc(100vh - 56px); }
        .step-print-head { padding:12px 16px; border-bottom:1px solid #e5eaf2; background:#fff; border-radius:14px 14px 0 0; font-weight:700; color:#2c3e7a; display:flex; justify-content:space-between; align-items:center; gap:10px; flex:none; }
        .step-print-head small { font-weight:400; color:#8a94a6; }
        .step-print-body { overflow:auto; padding:16px; flex:1 1 auto; display:flex; justify-content:center; }
        .step-print-paper { background:#fff; box-shadow:0 4px 16px rgba(0,0,0,.14); border-radius:4px; }
        .step-print-foot { padding:10px 16px; border-top:1px solid #e5eaf2; background:#fff; border-radius:0 0 14px 14px; display:flex; align-items:center; justify-content:flex-end; gap:8px; flex:none; }
        .step-print-foot .text-muted { margin-right:auto; }
        /* 打印：只输出表单纸张，页面其余内容（弹窗头尾、其它遮罩等）不打印 */
        @media print {
            @page { size:A4 portrait; margin:10mm; }
            body.print-step-form > *:not(.step-print-overlay) { display:none !important; }
            body.print-step-form .step-print-overlay { position:static; inset:auto; background:#fff; padding:0; overflow:visible; display:block; }
            body.print-step-form .step-print-modal { width:auto; max-width:none; max-height:none; box-shadow:none; border-radius:0; background:#fff; }
            body.print-step-form .step-print-body { padding:0; overflow:visible; display:block; }
            body.print-step-form .step-print-paper { box-shadow:none; border-radius:0; }
            body.print-step-form .step-print-paper .pf-root { width:auto; padding:0; }
            body.print-step-form .step-print-head, body.print-step-form .step-print-foot { display:none !important; }
            body.print-step-form .pf-table thead { display:table-header-group; }
            body.print-step-form .pf-table tr { page-break-inside:avoid; }
        }
        /* 排产明细：派单结果（工人 + 承担数量） */
        .prod-order-samplers .ps-chip { display:inline-flex; align-items:center; gap:2px; background:#eef3fd; border:1px solid #d7e0f8; color:#2c3e7a; border-radius:20px; padding:1px 8px; font-size:0.72rem; }
        .prod-order-samplers .ps-chip b { color:#0d6efd; }
        /* 基本档设置：重复理由「责任方」下拉 */
        .scope-item .duty-sel { font-size:0.7rem; padding:1px 16px 1px 6px; border:1px solid #dbe3f0; border-radius:20px; background:#fff; color:#2c3e7a; cursor:pointer; }
        .scope-item .duty-sel:focus { outline:none; border-color:#8fa8d8; box-shadow:0 0 0 2px rgba(44,62,122,.08); }
        /* 详情页紧凑信息布局 */
        .detail-info-row { display:grid; grid-template-columns:repeat(2, 1fr); gap:2px 18px; margin-bottom:4px; }
        .detail-info-cell { display:flex; align-items:baseline; gap:6px; min-width:0; padding:5px 2px; border-bottom:1px dashed #eef1f6; }
        .detail-info-cell .di-label { color:#8a94a6; font-size:0.72rem; flex-shrink:0; }
        .detail-info-cell .di-value { color:#2d3a4f; font-weight:600; font-size:0.82rem; word-break:break-word; overflow-wrap:anywhere; flex:1 1 auto; min-width:0; }
        .detail-info-cell .di-value .abnormal-tag { vertical-align:middle; }
        /* 工序表格移动端卡片化 */
        @media (max-width:768px) {
            .detail-table { min-width:0 !important; }
            .detail-table thead { display:none; }
            .detail-table, .detail-table tbody, .detail-table tr, .detail-table td { display:block; width:100% !important; }
            .detail-table tr { margin-bottom:12px; border:1px solid #e0e5ee; border-radius:10px; padding:10px 12px; background:#fafbfd; box-shadow:0 1px 4px rgba(0,0,0,0.03); }
            .detail-table td { border:none; padding:5px 0; display:flex; align-items:center; gap:8px; }
            .detail-table td::before { content:attr(data-label); color:#8a94a6; font-size:0.78rem; flex-shrink:0; min-width:48px; max-width:62px; line-height:1.3; }
            .detail-table td .form-select, .detail-table td .form-control { flex:1; min-width:0; height:36px !important; font-size:0.85rem; }
            .detail-table td .abnormal-textarea { flex:1 0 100%; min-height:36px; }
        }
        .settings-engineer-list .badge { margin-left:6px; }
        .compact-form .col-form-label { font-size:0.65rem; padding-top:2px; padding-bottom:2px; }
        .compact-form .form-control { font-size:0.7rem; padding:2px 6px; height:26px; }
        .compact-form .form-select { font-size:0.7rem; padding:2px 30px 2px 6px; height:26px; }
        .compact-form .row { margin-bottom:2px; }
        .compact-form .input-group .btn { height:26px; font-size:0.7rem; }
        .compact-form .form-text { font-size:0.6rem; }
        .compact-form hr { margin:3px 0; }
        .card-footer-actions { display:flex; justify-content:flex-end; gap:6px; margin-top:10px; }
        .card-footer-actions .btn { height:30px; font-size:0.75rem; }

        .dashboard-big-cards .big-card {
            background:white; border-radius:12px; padding:14px 12px; text-align:center;
            box-shadow:0 2px 10px rgba(0,0,0,0.06); border:1px solid #eef1f6; height:100%; transition:transform 0.2s;
        }
        .dashboard-big-cards .big-card:hover { transform:translateY(-2px); }
        .dashboard-big-cards .big-card .number { font-size:2.6rem; font-weight:700; line-height:1.1; }
        .dashboard-big-cards .big-card .qty { font-size:1.05rem; font-weight:600; color:#8a94a6; margin-top:1px; }
        .dashboard-big-cards .big-card .qty .qty-unit { font-size:0.7rem; color:#a6aebc; font-weight:400; }
        .dashboard-big-cards .big-card .label { font-size:0.85rem; color:#6b7a93; margin-top:2px; }
        .dashboard-big-cards .big-card .sub { font-size:0.7rem; color:#8a94a6; margin-top:2px; }
        .dashboard-big-cards .big-card .number.primary { color:var(--primary); }
        .dashboard-big-cards .big-card .number.danger { color:var(--danger); }
        .dashboard-big-cards .big-card .number.warning { color:var(--warning); }
        .dashboard-big-cards .big-card .number.success { color:var(--success); }

        .step-stats-cards .step-card {
            background:var(--bg-light); border-radius:10px; padding:10px 12px; border:1px solid #eef1f6;
        }
        .step-stats-cards .step-card .step-item {
            display:flex; justify-content:space-between; padding:2px 0; border-bottom:1px solid #f0f2f5; font-size:0.75rem;
        }
        .step-stats-cards .step-card .step-item:last-child { border-bottom:none; }
        .step-stats-cards .step-card .step-item .count { font-weight:600; color:var(--primary); }
        .step-stats-cards .step-card .step-item .count.danger { color:var(--danger); }
        .step-stats-cards .step-card .step-item .count.warning { color:var(--warning); }
        .step-stats-cards .step-card .step-item .count.success { color:var(--success); }
        .step-stats-cards .step-card .step-title { font-weight:600; font-size:0.8rem; color:#2d3a4f; margin-bottom:6px; text-align:center; }

        /* 看板数值双击定位 */
        .dash-click { cursor:pointer; border-radius:6px; transition:opacity .15s; }
        .dash-click:hover { opacity:.75; }
        .dash-filter-bar {
            display:none; align-items:center; gap:8px; flex-wrap:wrap;
            background:#fff8e6; border:1px solid #ffe0a3; border-radius:8px;
            padding:6px 10px; margin-bottom:10px; font-size:0.8rem; color:#7a5c00;
        }
        .dash-filter-bar .btn { height:26px; padding:0 10px; font-size:0.72rem; }
        .toast-msg {
            position:fixed; top:60px; left:50%; transform:translateX(-50%);
            background:rgba(30,41,59,.95); color:#fff; padding:10px 18px;
            border-radius:8px; font-size:0.85rem; z-index:2000;
            box-shadow:0 4px 16px rgba(0,0,0,.2); max-width:90%;
        }
        /* 手机端 toast：底部居中小胶囊（⚠ 必须写在基础规则之后——此前写在前面被基础 top:60px 反压，
           top:60px 与 bottom:20px 同时生效把提示拉成整屏竖长条，2026-10-10 修复） */
        @media (max-width:768px) {
            .toast-msg {
                top:auto; bottom:22px; left:50%; transform:translateX(-50%);
                max-width:92%; padding:11px 16px; font-size:0.88rem;
                border-radius:12px; line-height:1.5; text-align:center;
                box-shadow:0 6px 20px rgba(0,0,0,.28);
            }
        }
        .step-combined .dash-click { cursor:pointer; }
        .step-combined th.dash-click:hover { background:#eef4ff; }
        .step-combined .num-cell { display:inline-block; min-width:34px; padding:2px 10px; border-radius:6px; font-size:0.9rem; }
        .step-combined .num-cell:hover { background:#f1f3f5; }
        .step-row-handle { cursor:grab; color:#9aa4b2; padding:0 6px 0 2px; font-size:1.05rem; line-height:1; display:inline-block; user-select:none; -webkit-user-select:none; touch-action:none; }
        .step-row-handle:hover { color:var(--primary); }
        .step-row-handle:active, tr.step-drag-active .step-row-handle { cursor:grabbing; color:var(--primary); }
        /* 需求48：长按待命（按住2秒激活拖动）——把手高亮脉冲提示 */
        .step-row-handle.step-drag-arming { color:var(--warning); animation:stepArmPulse 0.9s ease-in-out infinite; }
        @keyframes stepArmPulse { 0%,100% { opacity:1; } 50% { opacity:0.35; } }
        tr.step-drag-active td { background:#f2f6ff !important; }
        body.drag-in-progress { cursor:grabbing; user-select:none; -webkit-user-select:none; }

        /* ===== 数据看板：业务域统计卡片（估价 / 打样 / 大货 三列竖排，每列 4 行指标） ===== */
        .biz-stat-cards .biz-stat-card {
            background:#fff; border:1px solid #eef1f6; border-radius:12px; height:100%;
            box-shadow:0 2px 10px rgba(0,0,0,0.06); overflow:hidden;
        }
        .biz-stat-cards .biz-stat-head {
            display:flex; align-items:center; justify-content:center; gap:6px;
            padding:8px 10px; font-weight:700; font-size:0.95rem;
            background:#f8fafc; border-bottom:1px solid #eef1f6;
        }
        .biz-stat-cards .biz-stat-row {
            display:flex; align-items:center; justify-content:space-between;
            padding:9px 14px; border-bottom:1px dashed #f0f2f5;
        }
        .biz-stat-cards .biz-stat-row:last-child { border-bottom:none; }
        .biz-stat-cards .biz-stat-row .rlabel { font-size:0.82rem; color:#6b7a93; }
        .biz-stat-cards .biz-stat-row .rval { font-size:1.5rem; font-weight:700; line-height:1.15; }
        .biz-stat-cards .biz-stat-row .rval.warn { color:var(--warning); }
        .biz-stat-cards .biz-stat-row .rval.danger { color:var(--danger); }
        .biz-stat-cards .biz-stat-row.dual { gap:8px; padding:12px 14px; }
        .biz-stat-cards .biz-stat-row.dual .rcell { flex:1; text-align:center; padding:2px 4px; border-radius:8px; }
        .biz-stat-cards .biz-stat-row.dual .rcell-val { font-size:1.7rem; font-weight:700; line-height:1.1; color:#2d3a4f; }
        .biz-stat-cards .biz-stat-row.dual .rcell-val.primary { color:var(--primary); }
        .biz-stat-cards .biz-stat-row.dual .rcell-label { font-size:0.78rem; color:#8a94a6; margin-top:2px; }

        /* ===== 数据看板：我的工作 顶部统计卡（6 项；在制项目 / 未开工按单计，其余按工序项计） ===== */
        .mine-stat-cards {
            display:grid; grid-template-columns:repeat(auto-fit, minmax(118px, 1fr)); gap:8px;
        }
        .mine-stat-card {
            background:#fff; border:1px solid #eef1f6; border-radius:12px; padding:10px 8px;
            box-shadow:0 2px 10px rgba(0,0,0,0.06); text-align:center;
            transition:background .15s, border-color .15s, transform .15s;
        }
        .mine-stat-card.dash-click:hover { background:#f7faff; border-color:#cfe0ff; cursor:pointer; transform:translateY(-1px); }
        .mine-stat-card .mine-stat-num { font-size:1.6rem; font-weight:700; line-height:1.15; color:#2d3a4f; }
        .mine-stat-card .mine-stat-num.primary { color:var(--primary); }
        .mine-stat-card .mine-stat-num.warn { color:var(--warning); }
        .mine-stat-card .mine-stat-num.danger { color:var(--danger); }
        .mine-stat-card .mine-stat-label { font-size:0.78rem; color:#8a94a6; margin-top:3px; }

        /* ===== 数据看板：工序计划状况按业务域分表 ===== */
        .step-table-block { margin-bottom:12px; }
        .step-table-block:last-child { margin-bottom:0; }
        .step-table-caption {
            display:flex; align-items:center; gap:8px; margin:2px 0 6px;
            font-weight:600; font-size:0.9rem; color:#2d3a4f;
        }


        .business-filter-row {
            display:flex; align-items:center; gap:10px; margin-bottom:12px; flex-wrap:wrap;
        }
        .business-filter-row label { font-weight:600; font-size:0.85rem; color:#2d3a4f; }
        .business-filter-row select {
            border-radius:30px; padding:3px 20px 3px 12px; border:1.5px solid #e0e5ee;
            background:var(--bg-light); font-size:0.8rem; height:32px; min-width:120px;
        }
        .business-filter-row select:focus { border-color:var(--primary); outline:none; }

        .summary-date-filter {
            display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-bottom:12px;
        }
        .summary-date-filter label { font-weight:500; font-size:0.8rem; color:#2d3a4f; }
        .summary-date-filter input[type="date"] {
            border-radius:30px; padding:3px 12px; border:1.5px solid #e0e5ee;
            background:var(--bg-light); font-size:0.8rem; height:32px;
        }
        .summary-date-filter input[type="date"]:focus { border-color:var(--primary); outline:none; }
        .summary-date-filter .date-range-label { font-weight:600; color:var(--primary); font-size:0.85rem; }
        .summary-date-filter .btn { border-radius:30px; padding:3px 14px; font-size:0.8rem; }

        /* 异常报告：「需汇总项」勾选卡片（勾选后才汇总，选择记忆在本机） */
        .rp-picker {
            border:1px solid #e0e5ee; border-radius:10px; background:var(--bg-light);
            padding:10px 12px; margin-bottom:12px;
        }
        .rp-picker-head { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-bottom:8px; }
        .rp-picker-title { font-weight:600; color:var(--primary); font-size:0.88rem; }
        .rp-picker-hint { font-size:0.75rem; color:#8894a8; }
        .rp-picker-actions { display:flex; gap:6px; margin-left:auto; }
        .rp-picker-actions .btn { border-radius:30px; padding:3px 12px; font-size:0.78rem; }
        .rp-picker-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(215px,1fr)); gap:5px 10px; }
        .rp-pick-item {
            display:flex; align-items:center; gap:6px; font-size:0.8rem; color:#2d3a4f;
            background:#fff; border:1px solid #e6ebf3; border-radius:8px; padding:5px 8px; cursor:pointer;
            transition:border-color 0.15s, background 0.15s;
        }
        .rp-pick-item:hover { border-color:var(--primary); }
        .rp-pick-item input { margin:0; cursor:pointer; flex:none; }
        .rp-pick-item.checked { border-color:var(--primary); background:#f2f6ff; font-weight:500; }

        /* 异常报告：双击行定位（重复打样责任归因 → 具体订单） */
        .rp-drill-row { cursor:pointer; }
        .rp-drill-row:hover td { background:#eef3ff; }

        /* 异常报告：准时 · 合格趋势折线图（按周 / 按月，统计区间可自定义） */
        .rp-trend {
            border:1px solid #e0e5ee; border-radius:10px; background:#fff;
            padding:12px 14px; margin-top:14px;
        }
        .rp-trend-head { display:flex; flex-wrap:wrap; align-items:baseline; gap:8px; margin-bottom:8px; }
        .rp-trend-title { font-weight:600; color:var(--primary); font-size:0.92rem; }
        .rp-trend-hint { font-size:0.74rem; color:#8894a8; }
        .rp-trend-ctrl {
            display:flex; flex-wrap:wrap; align-items:center; gap:8px;
            padding:8px 10px; margin-bottom:10px; border-radius:8px; background:var(--bg-light);
            font-size:0.78rem; color:#55627a;
        }
        .rp-trend-ctrl-label { font-weight:600; color:var(--primary); font-size:0.78rem; white-space:nowrap; }
        .rp-trend-ctrl .btn { border-radius:30px; padding:3px 12px; font-size:0.78rem; }
        .rp-trend-ctrl label { margin:0 2px 0 4px; font-weight:600; color:#55627a; }
        .rp-trend-ctrl input[type="date"] {
            border:1px solid #cfd7e6; border-radius:6px; padding:3px 8px;
            font-size:0.78rem; color:#2d3a4f; background:#fff;
        }
        .rp-trend-ctrl input[type="date"]:focus { border-color:var(--primary); outline:none; }
        label.rp-trend-labels { display:inline-flex; align-items:center; gap:4px; cursor:pointer; }
        label.rp-trend-labels input[type="checkbox"] { margin:0; width:14px; height:14px; accent-color:var(--primary); }
        .rp-trend-meta { font-size:0.78rem; color:#55627a; margin-bottom:6px; }
        .rp-trend-meta b { color:var(--primary); }
        .rp-trend-legend { display:flex; flex-wrap:wrap; gap:14px; font-size:0.78rem; color:#55627a; margin-bottom:6px; }
        .rp-trend-legend i { display:inline-block; width:14px; height:3px; border-radius:2px; margin-right:5px; vertical-align:middle; }
        .rp-trend-chart { overflow-x:auto; }
        .rp-trend-chart svg { display:block; width:100%; min-width:660px; height:auto; }
        .rp-trend-table-wrap { max-height:300px; overflow:auto; margin-top:10px; border:1px solid #e6ebf3; border-radius:8px; }
        table.rp-trend-table { width:100%; border-collapse:collapse; font-size:0.78rem; }
        table.rp-trend-table th {
            position:sticky; top:0; z-index:1; background:var(--primary); color:#fff;
            padding:5px 6px; white-space:nowrap; font-weight:600;
        }
        table.rp-trend-table th .rp-th-sub { font-weight:400; font-size:0.68rem; opacity:0.85; }
        table.rp-trend-table td { padding:4px 6px; border-bottom:1px solid #eef2f8; text-align:center; color:#2d3a4f; }
        table.rp-trend-table tbody tr:nth-child(even) td { background:#f7f9fc; }
        table.rp-trend-table tfoot td { background:#eef3fa; font-weight:600; }
        /* 双击下钻：可双击的行 / 单元格给出鼠标手势与高亮 */
        table.rp-trend-table tr.rp-drill-row, table.rp-trend-table .rp-drill-cell { cursor:pointer; }
        table.rp-trend-table tr.rp-drill-row:hover td, table.rp-trend-table .rp-drill-cell:hover { background:#eef3ff !important; }
        .rp-trend-note { font-size:0.72rem; color:#8894a8; margin-top:8px; line-height:1.6; }
        .rp-trend-empty { color:#8894a8; padding:20px; text-align:center; border:1px dashed #d9dfea; border-radius:8px; font-size:0.82rem; }

        .stat-grid {
            display:grid; grid-template-columns:repeat(auto-fit, minmax(120px,1fr)); gap:10px; margin-bottom:0;
        }
        .stat-card {
            background:var(--bg-light); border-radius:10px; padding:10px 12px; text-align:center; transition:transform 0.2s;
        }
        .stat-card:hover { transform:translateY(-2px); }
        .stat-card .number { font-size:1.6rem; font-weight:700; color:var(--primary); line-height:1.2; }
        .stat-card .label { font-size:0.7rem; color:#6b7a93; margin-top:2px; }
        .stat-card .number.green { color:var(--success); }
        .stat-card .number.orange { color:var(--warning); }
        .stat-card .number.red { color:var(--danger); }
        .stat-card .number.overdue { color:#c0392b; }
        .stat-card .number.abnormal { color:#fd7e14; }
        /* ==================== 左侧目录栏（竖条导航） ==================== */
        .app-nav {
            position: fixed; top: 0; left: 0; bottom: 0; width: 210px; z-index: 5000;
            background: linear-gradient(180deg, #0b1730 0%, #0d1c38 100%);
            color: #fff; display: flex; flex-direction: column;
            box-shadow: 2px 0 16px rgba(0, 0, 0, 0.26);
        }
        .app-nav-head {
            display: flex; flex-direction: column; gap: 6px; padding: 22px 18px 18px;
            font-weight: 700; font-size: 1.05rem; letter-spacing: 0.5px;
        }
        .app-nav-head .nav-title { display: flex; align-items: center; gap: 9px; }
        .app-nav-head i { font-size: 1.15rem; color: #7fa3ff; }
        .app-nav-head .nav-sub { font-size: 0.62rem; font-weight: 400; opacity: 0.52; letter-spacing: 2px; color: #9fb2d6; }
        /* 2026-10-11 需求：导航内容超高时自动出现下拉条，鼠标滚轮悬停侧栏即可滚动；
           min-height:0 是 flex 子项允许内部滚动的关键，登录区/底栏在 items 之外保持固定 */
        .app-nav-items { padding: 8px 12px; display: flex; flex-direction: column; gap: 4px; flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; }
        /* 深色侧栏配细窄半透明滚动条，避免默认粗条突兀 */
        .app-nav-items::-webkit-scrollbar { width: 6px; }
        .app-nav-items::-webkit-scrollbar-track { background: transparent; }
        .app-nav-items::-webkit-scrollbar-thumb { background: rgba(127, 163, 255, 0.32); border-radius: 3px; }
        .app-nav-items::-webkit-scrollbar-thumb:hover { background: rgba(127, 163, 255, 0.55); }
        .app-nav-items { scrollbar-width: thin; scrollbar-color: rgba(127, 163, 255, 0.32) transparent; }
        .app-nav-item {
            display: flex; flex-direction: column; align-items: flex-start; gap: 1px; width: 100%;
            background: transparent; border: none; border-radius: 10px; color: rgba(255, 255, 255, 0.78);
            padding: 12px 14px; cursor: pointer;
            transition: background 0.2s, color 0.2s; font-family: inherit; text-align: left;
        }
        .app-nav-item .nav-line { display: flex; align-items: center; gap: 11px; font-size: 0.95rem; font-weight: 500; }
        .app-nav-item .nav-note { display: block; font-size: 0.68rem; font-weight: 400; opacity: 0.6; margin: 3px 0 0 33px; }
        .app-nav-item:hover { background: rgba(255, 255, 255, 0.08); color: #fff; }
        .app-nav-item.active { background: linear-gradient(90deg, #3554f0, #2f4fe8); color: #fff; box-shadow: 0 6px 16px rgba(47, 79, 232, 0.4); }
        .app-nav-item.active .nav-line { font-weight: 600; }
        .app-nav-item i { font-size: 1.15rem; color: #96a8d6; }
        .app-nav-item.active i { color: #fff; }
        .app-nav-item.active .nav-note { opacity: 0.85; }
        .app-nav-foot { padding: 14px 16px; font-size: 0.7rem; color: rgba(255, 255, 255, 0.4); }
        /* 侧栏左下角用户登录区（2026-09-28 需求：从顶栏移入侧栏底部）：贴侧栏左缘，名称溢出省略 */
        .app-nav-user { padding: 10px 12px 2px; }
        .app-nav-user .user-chip { width: 100%; }
        .app-nav-user .chip-name {
            flex: 1 1 auto; min-width: 0; justify-content: flex-start;
            overflow: hidden; text-overflow: ellipsis;
        }
        body { padding-left: 210px; }
        /* ==================== 侧边栏「系统设置」树（桌面端可展开/收缩；手机端折叠为单按钮） ==================== */
        .app-nav-tree { margin-top: 6px; }
        .app-nav-tree-parent {
            display: flex; align-items: center; gap: 8px; width: 100%;
            background: transparent; border: none; border-radius: 10px; color: rgba(255,255,255,0.78);
            padding: 12px 14px 6px 28px; cursor: pointer; text-align: left;
            font-family: inherit; font-size: 0.95rem; font-weight: 500;
            transition: background 0.2s, color 0.2s;
        }
        .app-nav-tree-parent:hover { background: rgba(255, 255, 255, 0.08); color: #fff; }
        .app-nav-tree-parent .tree-arrow {
            font-size: 0.78rem; color: #96a8d6;
            transition: transform 0.18s ease;
            display: inline-block; width: 14px; text-align: center;
        }
        .app-nav-tree-parent[aria-expanded="true"] .tree-arrow { transform: rotate(90deg); }
        .app-nav-tree-parent .nav-line { display: flex; align-items: center; gap: 9px; }
        .app-nav-tree-parent i.bi-gear-fill { font-size: 1.15rem; color: #96a8d6; }
        .app-nav-tree-parent:hover i.bi-gear-fill { color: #fff; }
        .app-nav-tree-children {
            display: flex; flex-direction: column; gap: 2px;
            padding: 4px 0 6px 28px; overflow: hidden;
            max-height: 0; opacity: 0;
            transition: max-height 0.22s ease, opacity 0.18s ease, padding 0.22s ease;
            padding-top: 0; padding-bottom: 0;
        }
        .app-nav-tree-children:not([hidden]) {
            /* 2026-10-11 修复：上限原为 320px，系统设置树长到 9 个叶子（约 359px）后最后一个「备料材料」
               被 overflow:hidden 裁掉、侧栏滚动也救不回。放大到 2000px（保住展开动画，实际由内容撑开） */
            max-height: 2000px; opacity: 1; padding-top: 4px; padding-bottom: 6px;
        }
        /* FMEA 侧栏树交互样式沿用本节通用规则（.app-nav-tree-*），交互逻辑见 js/17-fmea.js；FMEA 专属样式在 assets/fmea.css */
        .app-nav-tree-leaf {
            display: flex; align-items: center; gap: 9px; width: 100%;
            background: transparent; border: none; border-radius: 8px;
            color: rgba(255, 255, 255, 0.72); padding: 7px 12px 7px 22px; cursor: pointer;
            font-family: inherit; font-size: 0.86rem; text-align: left;
            transition: background 0.2s, color 0.2s; position: relative;
        }
        .app-nav-tree-leaf:hover { background: rgba(255, 255, 255, 0.08); color: #fff; }
        .app-nav-tree-leaf.active {
            background: linear-gradient(90deg, rgba(53, 84, 240, 0.55), rgba(47, 79, 232, 0.45));
            color: #fff;
        }
        .app-nav-tree-leaf i { font-size: 0.95rem; color: #96a8d6; }
        .app-nav-tree-leaf.active i { color: #fff; }
        /* ↑↑ 2026-09-28 需求：模块管理三级子树样式（.app-nav-subtree / .app-nav-sub-parent / .app-nav-sub-children）已删除——DFMEA / PFMEA 移到主区界面内展示 */
        @media (min-width: 992px) and (max-width: 1240px) {
            body { padding-left: 192px; }
            .app-nav { width: 192px; }
            .app-nav-item .nav-note { display: none; }
            .app-nav-tree-parent { padding-left: 18px; }
            .app-nav-tree-children { padding-left: 18px; }
            .app-nav-tree-leaf { padding-left: 14px; }
        }
        /* 烫金箔计算页面（独立二级页面，iframe 隔离加载） */
        /* 桌面端：烫金箔 iframe 让出左侧 210px 侧栏区域，避免 iframe 原子化遮挡侧栏导致无法切到打样订单管理 / 系统设置 */
        .tool-page { position: fixed; top: 0; right: 0; bottom: 0; left: 210px; z-index: 100; background: #eef2f8; display: none; }
        /* 2026-10-16：多个 iframe 工具页并存（烫金箔计算 / 标准工时管理）→ 按 id 精确显示当前那个，避免同时 display:block 互相遮挡 */
        body.foil-open #hotfoilPage,
        body.workhours-open #workhoursPage { display: block; }
        /* 2026-10-28 资料袋管理（独立工具页，与标准工时同模式）：body.bags-open 时显示 iframe 容器 */
        body.bags-open #bagsPage { display: block; }
        /* 2026-11-02 打样信息管理 / 工程变更管理（占位模块，不挂 iframe）：body.xxx-open 时显示主区占位页 */
        body.sampleinfo-open #sampleInfoPage,
        body.ecn-open #ecnPage { display: block; }
        .tool-page iframe { width: 100%; height: 100%; border: 0; display: block; background: #fff; }
        /* 占位模块页（功能待定义）：居中提示卡片，与系统配色一致；后续填功能时整块替换即可 */
        .module-placeholder {
            height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center;
            gap: 6px; padding: 24px; text-align: center; color: #4a5568;
        }
        .module-placeholder .mp-ico {
            width: 64px; height: 64px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
            background: #e8eef9; color: #2c3e7a; font-size: 26px; margin-bottom: 6px;
        }
        .module-placeholder h2 { font-size: 1.15rem; font-weight: 700; color: #2c3e7a; margin: 0; }
        .module-placeholder .mp-sub { font-size: .9rem; color: #5a6b85; margin: 2px 0 0; }
        .module-placeholder .mp-sub b { color: #c47d1a; }
        .module-placeholder .mp-hint { font-size: .8rem; color: #8a97a8; margin: 6px 0 0; max-width: 460px; line-height: 1.6; }
        /* 移动端：侧栏改为顶部 56px 横条，iframe 让出顶部 56px 让侧栏始终可点 */
        @media (max-width: 768px) {
            .tool-page { top: 56px; left: 0; right: 0; bottom: 0; }
        }
        @media (max-width: 991.98px) {
            body { padding-left: 0; padding-top: 56px; }
            .app-nav { top: 0; left: 0; right: 0; bottom: auto; width: 100%; height: 56px; flex-direction: row; align-items: center; padding: 0 8px; }
            .app-nav-head { border-bottom: none; border-right: 1px solid rgba(255, 255, 255, 0.15); padding: 6px 12px; justify-content: center; }
            .app-nav-head .nav-sub { display: none; }
            .app-nav-items { flex-direction: row; padding: 0 4px; gap: 4px; align-items: center; flex: 1; overflow-y: visible; overflow-x: auto; min-height: 0; }
            .app-nav-items::-webkit-scrollbar { height: 0; }
            .app-nav-item { flex-direction: row; justify-content: center; padding: 8px 10px; gap: 8px; border-radius: 10px; }
            .app-nav-item .nav-line { font-size: 0.88rem; }
            .app-nav-item .nav-note { display: none; }
            .app-nav-foot { display: none; }
            .app-header { top: 56px; }
        }
        /* 手机端（≤768px）系统设置树折叠为单按钮：父项成为直入入口，叶子由设置主页内的横向页签承载
           2026-09-28 修复：断点由 768px 提到 991.98px —— 侧栏变顶部横条是 991.98px 起效，平板宽度下树叶子若仍按桌面竖排展示会把 56px 横条撑爆（打样订单管理 6 叶子竖排 BUG） */
        @media (max-width: 991.98px) {
            .app-nav-tree { margin-top: 0; flex: 1; }
            .app-nav-tree-parent { padding: 8px 10px; gap: 6px; border-radius: 10px; font-size: 0.88rem; }
            .app-nav-tree-parent .tree-arrow { display: none; }
            .app-nav-tree-children { display: none !important; }
        }
        /* 需求11 修正（2026-09-30）：打样组长手机端可展开「打样订单管理」子项（下拉面板挂在 56px 横条下方），
           直达 订单排产 → 可开工订单明细；其他角色手机端仍收为单按钮直入默认首页（原行为不变） */
        @media (max-width: 991.98px) {
            /* 2026-10-17 修复（平板竖屏下拉被"遮盖"）：原写法是 position:absolute 挂在 .app-nav-tree 下，
               而外层 .app-nav-items 手机端是 `overflow-x:auto`（CSS 规范：overflow-x 为 auto 时 overflow-y 的
               visible 会被强制计算成 auto ⇒ 两个方向都裁剪），56px 横条把整块下拉面板裁掉——
               看到的正是"点了没反应 / 被汇总页面盖住"。改为 fixed 脱离该裁剪上下文：
                 top:56px 紧贴横条下方、左右到边（平板竖屏更好点），z-index 5010 高于侧栏 5000 确保"在最上层"，
                 同时低于 Bootstrap 弹窗（.modal 5200），不会盖住弹窗。 */
            body.leader-mobile-nav #orderMgmtParent .tree-arrow { display: inline-block; }
            body.leader-mobile-nav #orderMgmtChildren {
                display: flex !important;
                position: fixed; top: 56px; left: 0; right: 0; z-index: 5010;
                background: #0d1c38; padding: 6px 8px 10px;
                box-shadow: 0 12px 26px rgba(0, 0, 0, 0.34);
                max-height: calc(100vh - 56px); overflow-y: auto; -webkit-overflow-scrolling: touch;
            }
            /* 平板竖屏触摸友好：叶子加大点击区 */
            body.leader-mobile-nav #orderMgmtChildren .app-nav-tree-leaf { padding: 11px 12px; font-size: 0.92rem; }
            body.leader-mobile-nav #orderMgmtChildren[hidden] { display: none !important; }
        }
        /* 2026-09-30 撤销需求 16/17 后：打样员手机端专属样式类 sampler-mobile-nav 已下线
           （打样员手机端走标准侧栏，与 PC 端一致）。 */
        /* 需求14（2026-09-30）：手机端派单弹窗人员改一列显示、姓名完整显示 */
        @media (max-width: 991.98px) {
            .sampler-overlay { padding: 10px 6px; align-items: stretch; }
            .sampler-modal { width: 100%; max-height: calc(100vh - 20px); border-radius: 10px; }
            .sampler-modal-head { padding: 8px 10px; font-size: 0.85rem; flex-wrap: wrap; }
            .sampler-modal-head small { display: none; }
            .sampler-modal-body { padding: 6px 8px; overflow-y: auto; overflow-x: hidden; }
            .sampler-order { padding: 6px 8px; max-width: 100%; }
            .sampler-order-title { flex-wrap: wrap; row-gap: 4px; }
            .sampler-order-title .so-cust { flex-basis: 100%; white-space: normal; word-break: break-all; }
            .sampler-order-title .so-mark { margin-left: 0; }
            /* 人员一列：每行 星级 + 姓名（完整）+ 数量 */
            .sampler-order .d-flex { display: grid !important; grid-template-columns: 1fr; gap: 6px; }
            .sampler-chip { width: 100%; border-radius: 8px; padding: 5px 9px; }
            .sampler-chip .so-name { white-space: normal; word-break: break-all; }
            .sampler-chip .so-qty { width: 56px; flex: 0 0 auto; }
            .sampler-chip .so-backlog { display: none; }
        }
        /* 需求12（2026-09-30）：可开工订单明细卡片式（订单排产页，PC / 手机统一）——双击卡片＝指派打样员（打样组长） */
        .ks-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 10px; margin-top: 8px; }
        .ks-card.ks-startable { border: 1px solid #dfe6f0; border-radius: 10px; background: #fff; padding: 10px 12px; cursor: pointer; transition: box-shadow .15s ease, border-color .15s ease; user-select: none; min-width: 0; max-width: 100%; }
        .ks-card.ks-startable:hover { box-shadow: 0 4px 14px rgba(13, 28, 56, .12); border-color: #b9c8de; }
        .ks-card.ks-startable.doing { border-left: 3px solid #f0ad4e; }
        .ks-card-head { display: flex; align-items: flex-start; gap: 8px; min-width: 0; }
        .ks-idx { flex: 0 0 auto; min-width: 22px; height: 22px; border-radius: 6px; background: #eef2f8; color: #4a5a74; font-size: .72rem; font-weight: 600; display: flex; align-items: center; justify-content: center; margin-top: 1px; }
        .ks-title { flex: 1; min-width: 0; }
        .ks-line1 { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; }
        .ks-line1 b { font-size: .82rem; color: var(--primary, #0d1c38); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
        .ks-customer { font-size: .82rem; font-weight: 600; color: #22314c; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
        .ks-line2 { display: flex; align-items: baseline; gap: 8px; min-width: 0; margin-top: 2px; }
        .ks-code { flex: 0 0 auto; max-width: 45%; font-size: .76rem; color: #55688a; font-family: var(--font-mono, monospace); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        .ks-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .78rem; color: #333; }
        .ks-card-meta { display: flex; flex-wrap: wrap; gap: 4px 12px; margin-top: 8px; padding-top: 8px; border-top: 1px dashed #e6ebf3; min-width: 0; }
        .ks-meta { font-size: .74rem; color: #333; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
        .ks-meta i { font-style: normal; color: #8a97ab; margin-right: 3px; }
        .ks-card-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 8px; min-width: 0; }
        .ks-people { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; min-width: 0; font-size: .76rem; }
        .ks-ops { flex: 0 0 auto; }
        /* 需求12（2026-09-30）：手机端隐藏订单排产页的解说文字（标题后的 small 说明），界面精简 */
        @media (max-width: 991.98px) {
            #viewProduction .list-header h5 small,
            #viewProduction .prod-section-title small { display: none; }
            .ks-card-grid { grid-template-columns: 1fr; }
            /* 手机端卡片信息两列排布，全部字段一屏可见、无横向滚动 */
            .ks-card.ks-startable { padding: 8px 10px; }
            .ks-card-meta { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 3px 10px; }
            .ks-card-foot { flex-wrap: wrap; }
            .ks-people { flex: 1 1 100%; }
            .ks-ops { flex: 0 0 auto; }
        }
        /* 需求14（2026-09-30）：订单排产页（打样组长手机端）字体加大 1 号 + 加粗；操作按钮蓝色实底 */
        @media (max-width: 991.98px) {
            #viewProduction .list-header h5 { font-size: 1.15rem; font-weight: 700; }
            #viewProduction .prod-section-title { font-size: 1.1rem; font-weight: 700; }
            #viewProduction .prod-count { font-weight: 700; }
            .ks-card.ks-startable { font-weight: 600; }
            .ks-card .ks-idx { font-size: .85rem; font-weight: 700; }
            .ks-card .ks-line1 b { font-size: .95rem; font-weight: 700; }
            .ks-card .ks-customer { font-size: .95rem; font-weight: 700; }
            .ks-card .ks-line2 { font-size: .88rem; font-weight: 600; }
            .ks-card .ks-code { font-size: .88rem; font-weight: 600; }
            .ks-card .ks-name { font-size: .88rem; font-weight: 600; }
            .ks-card .ks-meta { font-size: .86rem; font-weight: 600; }
            .ks-card .ks-people { font-size: .86rem; font-weight: 600; }
            .ks-card .ps-chip { font-size: .84rem; font-weight: 600; }
            .ks-card .badge-status { font-size: .8rem; font-weight: 700; }
            /* 按钮改蓝色实底（原 outline-primary / outline-success） */
            .ks-card .psop-start { color: #fff; background-color: var(--primary, #2c3e7a); border-color: var(--primary, #2c3e7a); font-weight: 700; }
            .ks-card .psop-done { color: #fff; background-color: var(--primary, #2c3e7a); border-color: var(--primary, #2c3e7a); font-weight: 700; }
            /* 看板页「订单排产」按钮：蓝色实底、加大加粗 */
            #dashMainTabs .tab-btn.active { background: var(--primary, #2c3e7a); color: #fff; font-weight: 700; font-size: .95rem; }
            /* 排产页「返回看板」按钮：蓝色实底、加大加粗（需求15：按钮从看板移到排产页） */
            #viewProduction #btnBackDashboard { background: var(--primary, #2c3e7a); border-color: var(--primary, #2c3e7a); color: #fff; font-weight: 700; font-size: .95rem; }
            /* 需求16（2026-09-30）：打样员手机端「工作汇总」按钮蓝色实底；工作汇总页两个按钮也改蓝色实底 */
            #dashMainTabs #dashGoWorkSummary { background: var(--primary, #2c3e7a); color: #fff; font-weight: 700; font-size: .95rem; border-color: var(--primary, #2c3e7a); }
            #viewWorkSummary #btnBackDashboard2 { background: var(--primary, #2c3e7a); border-color: var(--primary, #2c3e7a); color: #fff; font-weight: 700; font-size: .95rem; }
            #viewWorkSummary #btnRefreshWorkSummary { font-weight: 700; font-size: .9rem; }
            /* 工作汇总页样式 */
            .ws-my-rank-tip { background: #eef5ff; border: 1px solid #c5dafa; border-radius: 8px; padding: 8px 12px; font-weight: 600; }
            .ws-rank-badge { display: inline-block; min-width: 30px; padding: 3px 8px; border-radius: 12px; font-weight: 700; background: #eef2f8; color: #4a5a74; }
            .ws-rank-1 { background: linear-gradient(135deg, #ffd700 0%, #ffb700 100%); color: #5b3a00; }
            .ws-rank-2 { background: linear-gradient(135deg, #c0c4cb 0%, #9ea4ad 100%); color: #2d3447; }
            .ws-rank-3 { background: linear-gradient(135deg, #cd7f32 0%, #b36b25 100%); color: #4d2a08; }
            .ws-row-me { background: #f4faff !important; }
            .ws-me-tag { background: #198754; color: #fff; font-size: .7rem; padding: 2px 8px; border-radius: 10px; margin-left: 6px; font-weight: 600; }
        }
        @media (max-width: 430px) {
            .app-nav-head { display: none; }
        }
        /* 移动端（≤991.98px）：侧栏收为顶部 56px 横条——用户登录区随横条收尾显示，只留两个圆钮（名字太长会撑爆横条） */
        @media (max-width: 991.98px) {
            .app-nav-user { padding: 0 4px; display: flex; align-items: center; }
            .app-nav-user .user-chip { width: auto; }
            .app-nav-user .chip-name { display: none; }
        }
        /* ==================== 登录 / 账号与权限 ==================== */
        #loginOverlay {
            position: fixed; inset: 0; z-index: 10000;
            display: flex; align-items: center; justify-content: center;
            background: linear-gradient(135deg, #0b1730 0%, #14284f 55%, #1c3a70 100%);
            padding: 16px;
        }
        .login-card {
            width: min(370px, 100%); background: #fff; border-radius: 18px;
            padding: 30px 26px 24px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
            text-align: center;
        }
        .login-card .lc-ico {
            width: 62px; height: 62px; margin: 0 auto 12px; border-radius: 18px;
            display: flex; align-items: center; justify-content: center;
            background: linear-gradient(135deg, var(--primary), var(--primary-light));
            color: #fff; font-size: 1.7rem;
        }
        .login-card h5 { font-weight: 700; margin-bottom: 4px; }
        .login-card .lc-sub { font-size: 0.78rem; margin-bottom: 18px; }
        .login-card .form-label { font-size: 0.78rem; text-align: left; display: block; color: #5a6a86; font-weight: 600; }
        .login-card .form-control { border-radius: 10px; }
        .login-card .form-control:focus { border-color: var(--primary); box-shadow: 0 0 0 .2rem rgba(47, 79, 232, .12); }
        .lc-error { min-height: 22px; font-size: 0.78rem; color: var(--danger); text-align: left; margin: 2px 0 6px; }
        .lc-ok { min-height: 22px; font-size: 0.78rem; color: var(--success); text-align: left; margin: 2px 0 6px; }
        .lc-remember { display: flex; align-items: center; justify-content: flex-start; margin: 2px 0 6px; user-select: none; }
        .lc-remember .rm-line { display: inline-flex; align-items: center; gap: 6px; font-size: 0.78rem; color: #5a6a86; cursor: pointer; }
        .lc-remember .rm-line:hover { color: var(--primary); }
        .lc-remember input[type="checkbox"] { accent-color: var(--primary); width: 14px; height: 14px; margin: 0; cursor: pointer; }
        #btnLogin { border-radius: 10px; padding: 8px; font-weight: 600; letter-spacing: 4px; }
        .lc-foot { font-size: 0.72rem; color: #9aa7bf; margin-top: 14px; }
        .user-chip { display: flex; align-items: center; gap: 5px; }
        .user-chip .chip-name {
            background: rgba(255, 255, 255, 0.15); color: #fff; border-radius: 20px;
            padding: 3px 10px; font-size: 0.78rem; white-space: nowrap;
            display: flex; align-items: center; gap: 5px;
        }
        .user-chip .btn-user {
            background: rgba(255, 255, 255, 0.2); border: none; color: #fff;
            border-radius: 30px; width: 30px; height: 30px; font-size: 0.95rem;
            display: inline-flex; align-items: center; justify-content: center;
            transition: all 0.2s;
        }
        .user-chip .btn-user:hover { background: rgba(255, 255, 255, 0.35); }
        .perm-grid { display: flex; flex-wrap: wrap; gap: 6px; }
        .perm-grid label {
            border: 1.5px solid #dde3ef; border-radius: 20px; padding: 3px 10px;
            font-size: 0.78rem; cursor: pointer; user-select: none; color: #41506b;
        }
        .perm-grid label input { margin-right: 4px; }
        .perm-grid label.on { background: #eef3ff; border-color: var(--primary); color: var(--primary); }
        .perm-grid.perm-slim label { padding: 2px 8px; }
        #profileModal .modal-body, #accountModal .modal-body { font-size: 0.85rem; }
        body.ro-mode #orderTable thead th:first-child,
        body.ro-mode #orderTable tbody td:first-child { display: none; }
        body.ro-mode .progress-track .step,
        body.ro-mode .repeat-badge { pointer-events: none !important; cursor: default !important; }
        body.ro-mode .status-cell { cursor: default; }
        .ro-tip { font-size: 0.7rem; color: var(--warning); }
        /* 排产只读：无排产调度权限时屏蔽/隐藏排产改动类控件 */
        body.prod-ro .prod-add { display: none !important; }
        body.prod-ro .prod-remove,
        body.prod-ro .prod-step-edit, body.prod-ro .sampler-chip,
        body.prod-ro .prod-chip-pick, body.prod-ro input.prod-pick { pointer-events: none !important; cursor: not-allowed !important; }
        .acct-item { border: 1px solid #e5eaf3; border-radius: 12px; padding: 8px 10px; margin-bottom: 8px; background: #fff; }
        .acct-item .row > div { min-width: 0; }
        .acct-tag { display: inline-block; font-size: 0.68rem; padding: 1px 8px; border-radius: 20px; margin: 1px 2px; }
        .acct-tag.admin { background: #fff3d6; color: #a06800; border: 1px solid #f3d98a; }
        .acct-tag.off { background: #f4f6fa; color: #97a2b5; border: 1px dashed #ccd4e2; }
        .acct-tag.fn { background: #eef2fd; color: #3a5cdb; border: 1px solid #d7e0f8; }
        .acct-item .small { line-height: 1.6; }

        /* ============================================================
           录单编号：选择号（配件号）
           ============================================================ */
        /* 「增加选择 / 沿用已有选择」选择框、产品记录选择框 共用外壳 */
        .seq-overlay {
            position: fixed; inset: 0; z-index: 10750;
            background: rgba(15, 23, 42, 0.5);
            display: flex; align-items: center; justify-content: center;
            padding: 24px 12px;
        }
        .seq-modal {
            background: #fff; border-radius: 14px; width: min(520px, 100%);
            box-shadow: 0 16px 48px rgba(0, 0, 0, 0.25);
            display: flex; flex-direction: column; max-height: calc(100vh - 48px);
        }
        .seq-modal-head {
            padding: 12px 16px; border-bottom: 1px solid #e5eaf2;
            font-weight: 700; color: var(--primary); font-size: 0.95rem;
        }
        .seq-modal-head small {
            display: block; font-weight: 400; color: #8a94a6;
            margin-top: 3px; font-size: 0.75rem; line-height: 1.5;
        }
        .seq-modal-body {
            padding: 12px 16px; overflow: auto;
            display: flex; flex-direction: column; gap: 8px;
        }
        .seq-opt {
            display: flex; align-items: flex-start; gap: 10px; width: 100%;
            text-align: left; border: 1px solid #dde3ee; background: #f8f9fc;
            border-radius: 10px; padding: 10px 12px; cursor: pointer;
            transition: all 0.15s;
        }
        .seq-opt > i { color: #7b8aa5; margin-top: 2px; }
        .seq-opt:hover { border-color: #8fa8d8; background: #eef3fd; }
        .seq-opt:hover > i { color: var(--primary); }
        .seq-opt.primary { border-color: #bcd9c6; background: #eaf6ee; }
        .seq-opt.primary > i { color: var(--success); }
        .seq-opt.primary:hover { border-color: #7cbb90; background: #dcf0e3; }
        .seq-opt-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
        .seq-opt-main { font-weight: 600; color: var(--primary); font-size: 0.88rem; }
        .seq-opt-sub { color: #8a94a6; font-size: 0.72rem; line-height: 1.5; }
        .seq-modal-foot {
            padding: 10px 16px; border-top: 1px solid #e5eaf2;
            display: flex; justify-content: flex-end;
        }
        /* 本次新增加的选号：输入框高亮，避免和「沿用」混淆 */
        #fPartSeq.seq-new {
            background: #eaf6ee; border-color: #9ecfb0;
            color: #1f7a45; font-weight: 600;
        }
        /* 品名搜索按钮与单号检索按钮的一致观感 */
        #btnSearchProduct { flex: 0 0 auto; }

        /* ==================== 工程部月报：始终表格形式（不换行、紧凑小字号） ==================== */        .eng-month .rp-root { background:#fff; padding:6px 2px; font-size:0.8rem; color:#2d3a4f; }
        .eng-month.rp-root, .eng-month .rp-root { background:#fff; padding:6px 2px; font-size:0.8rem; color:#2d3a4f; }
        .eng-month .rp-page-head { font-size:1.05rem; font-weight:700; color:var(--primary); margin:2px 0 6px; display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
        .eng-month .rp-section { margin-top:12px; border:1px solid #e0e5ee; border-radius:10px; background:#fff; padding:8px 10px 10px; }
        .eng-month .rp-section-head { font-weight:600; color:var(--primary); font-size:0.9rem; margin-bottom:6px; display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
        .eng-month .rp-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(340px, 1fr)); gap:10px; }
        .eng-month .rp-block { border:1px solid #e6ebf3; border-radius:8px; padding:6px 8px 8px; background:#fafbfd; overflow-x:auto; }
        .eng-month .rp-block-head { font-weight:600; color:#2d3a4f; font-size:0.82rem; margin-bottom:5px; display:flex; align-items:baseline; gap:6px; flex-wrap:wrap; }
        .eng-month .rp-stat { display:flex; gap:10px; margin:6px 0 8px; }
        .eng-month .rp-stat-box { flex:1; border:1px solid #d9dfea; border-radius:8px; padding:6px 8px; text-align:center; background:#f8fafc; }
        .eng-month .rp-stat-num { font-size:1.25rem; font-weight:700; color:#2c3e7a; line-height:1.2; }

        /* ==================== 送出前检查报告（QF-07-05）：平板现场会签 ==================== */
        .cr-overlay { position: fixed; inset: 0; z-index: 9000; background: rgba(10, 18, 38, .55); display: flex; align-items: flex-start; justify-content: center; padding: 12px; overflow-y: auto; -webkit-overflow-scrolling: touch; }
        .cr-overlay.cr-sub-overlay { z-index: 9100; }
        /* Bootstrap 弹窗默认 z-index 1050/1055，低于左侧固定导航 .app-nav 的 5000——
           平板/桌面横屏下 210px 侧栏把居中弹窗左侧盖住一截；整体抬高弹窗层到侧栏之上 */
        .modal-backdrop { z-index: 5100; }
        .modal { z-index: 5200; }
        /* 安全居中：margin:auto 替代 align-items:center——面板高于视口时可完整滚动到顶/底（flex center 会裁掉顶/底且不可滚动） */
        .cr-overlay.cr-sub-overlay .cr-modal { margin: auto 0; }
        .cr-modal { width: min(980px, 100%); background: #fff; border-radius: 14px; box-shadow: 0 24px 70px rgba(0,0,0,.35); display: flex; flex-direction: column; max-height: calc(100vh - 24px); overflow: hidden; }
        .cr-modal.cr-modal-sub { width: min(680px, 100%); }
        .cr-head { display: flex; align-items: center; gap: 12px; padding: 12px 16px; background: var(--primary, #2c3e7a); color: #fff; flex-wrap: wrap; }
        .cr-head-title { font-size: 1.15rem; font-weight: 700; display: flex; align-items: center; gap: 8px; }
        .cr-head-sub { font-size: .72rem; opacity: .75; font-weight: 400; }
        .cr-head-info { flex: 1; font-size: .9rem; opacity: .95; min-width: 200px; }
        .cr-prog { background: rgba(255,255,255,.18); border-radius: 12px; padding: 2px 10px; font-weight: 700; margin-left: 8px; }
        .cr-head-btns { display: flex; gap: 8px; }
        .cr-body { padding: 14px 16px 20px; overflow-y: auto; }
        .cr-btn { border: 1px solid #c9d2e6; background: #fff; color: #2d3a4f; border-radius: 9px; padding: 8px 14px; font-size: .92rem; font-weight: 600; cursor: pointer; }
        .cr-btn:active { transform: scale(.97); }
        .cr-btn-primary { background: var(--primary, #2c3e7a); border-color: var(--primary, #2c3e7a); color: #fff; }
        .cr-btn-danger { background: #b02a37; border-color: #b02a37; color: #fff; }
        .cr-btn-ghost { background: transparent; border-color: rgba(255,255,255,.5); color: #fff; }
        .cr-btn-sm { padding: 4px 10px; font-size: .8rem; }
        .cr-muted { color: #8a93a6; font-size: .8rem; }
        .cr-lock-banner { background: #fff7e6; border: 1px solid #f0d9a8; color: #7a5b12; border-radius: 10px; padding: 10px 14px; font-size: .88rem; font-weight: 600; margin-bottom: 12px; }
        .cr-cat-row { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-bottom: 12px; font-size: 1rem; }
        .cr-cat { display: inline-flex; align-items: center; gap: 6px; font-weight: 600; cursor: pointer; }
        .cr-cat input, .cr-result-opt input { width: 20px; height: 20px; accent-color: var(--primary, #2c3e7a); }
        .cr-info-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
        .cr-cell { border: 1px solid #dde3ef; border-radius: 10px; padding: 8px 10px; background: #fafbfe; }
        .cr-cell label { font-size: .74rem; color: #6b7590; display: block; margin-bottom: 3px; }
        .cr-val { font-size: 1.05rem; font-weight: 700; color: #22304c; min-height: 28px; word-break: break-all; }
        .cr-rate { color: #b02a37; }
        .cr-input { width: 100%; border: 1px solid #c9d2e6; border-radius: 8px; padding: 9px 12px; font-size: 1.05rem; font-weight: 700; color: #22304c; background: #fff; }
        .cr-input:focus { outline: 2px solid var(--primary, #2c3e7a); outline-offset: -1px; }
        .cr-select { width: 100%; border: 1px solid #c9d2e6; border-radius: 8px; padding: 10px 12px; font-size: 1rem; background: #fff; }
        .cr-textarea { width: 100%; border: 1px solid #c9d2e6; border-radius: 8px; padding: 10px 12px; font-size: 1rem; resize: vertical; }
        .cr-save-row { display: flex; align-items: center; gap: 12px; margin: 12px 0 4px; flex-wrap: wrap; }
        .cr-section-title { font-size: 1.02rem; font-weight: 700; color: var(--primary, #2c3e7a); margin: 16px 0 8px; padding-left: 8px; border-left: 4px solid var(--primary, #2c3e7a); }
        .cr-defect-sec { border: 1px solid #dde3ef; border-radius: 10px; margin-bottom: 8px; overflow: hidden; }
        .cr-defect-head { display: flex; align-items: center; gap: 10px; padding: 8px 12px; background: #f2f5fb; flex-wrap: wrap; }
        .cr-defect-title { font-weight: 700; font-size: .92rem; color: #2d3a4f; }
        .cr-defect-sign { flex: 1; font-size: .82rem; color: #4a5a74; text-align: right; }
        .cr-defect-text { padding: 10px 12px; font-size: .95rem; white-space: pre-wrap; }
        .cr-dept-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }
        .cr-dept-card { border: 2px solid #dde3ef; border-radius: 12px; padding: 12px; display: flex; flex-direction: column; gap: 6px; background: #fff; }
        .cr-dept-card.signed { border-color: #9ecfb0; background: #f4fbf6; }
        .cr-dept-card.has-ng { border-color: #e2a2a9; background: #fdf5f5; }
        .cr-dept-name { font-size: 1.1rem; font-weight: 700; color: #22304c; }
        .cr-dept-state { display: flex; gap: 6px; }
        .cr-badge { display: inline-block; background: #eef2f8; color: #4a5a74; border-radius: 12px; padding: 2px 10px; font-size: .78rem; font-weight: 700; }
        .cr-badge-ok { background: #d9f0e1; color: #1f7a45; }
        .cr-badge-ng { background: #f8dcdf; color: #b02a37; }
        .cr-dept-signer { font-size: .88rem; min-height: 22px; }
        .cr-dept-btn { width: 100%; padding: 11px; font-size: 1rem; }
        .cr-result-card { border: 2px solid #dde3ef; border-radius: 12px; padding: 12px 14px; background: #fff; }
        .cr-result-card.approved { border-color: #9ecfb0; background: #f4fbf6; }
        .cr-result-card.cr-disabled { opacity: .55; }
        .cr-result-opt { display: flex; align-items: center; gap: 8px; padding: 7px 0; font-size: 1rem; cursor: pointer; }
        .cr-result-ng { display: flex; align-items: center; gap: 10px; margin: 8px 0; flex-wrap: wrap; }
        .cr-result-ng .cr-input { width: 260px; max-width: 100%; font-weight: 500; }
        .cr-result-by { margin-top: 6px; font-size: .92rem; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
        .cr-ng-warn { color: #b02a37; font-weight: 700; font-size: .85rem; }
        .cr-field-label { font-size: .84rem; font-weight: 700; color: #4a5a74; display: block; margin: 10px 0 5px; }
        .cr-sign-row { display: grid; grid-template-columns: 1.2fr 1fr; gap: 12px; margin-top: 6px; }
        .cr-sign-actions { display: flex; align-items: center; gap: 12px; margin-top: 14px; flex-wrap: wrap; }
        .cr-sign-actions .cr-btn-primary { padding: 12px 22px; font-size: 1.05rem; }
        .cr-judge-tip { background: #eef5ff; border: 1px solid #c5dafa; border-radius: 10px; padding: 8px 12px; font-size: .9rem; margin-bottom: 10px; }
        .cr-judge-tip .t-ok { color: #1f7a45; } .cr-judge-tip .t-ng { color: #b02a37; }
        .cr-judge-item { border: 1px solid #e2e7f2; border-radius: 10px; padding: 10px 12px; margin-bottom: 8px; }
        .cr-judge-name { font-size: 1.05rem; font-weight: 700; color: #22304c; margin-bottom: 6px; }
        .cr-judge-sub { display: flex; align-items: center; gap: 10px; padding: 4px 0; }
        .cr-sub-name { min-width: 90px; font-size: .95rem; color: #4a5a74; }
        .cr-judge-group { display: flex; gap: 8px; flex: 1; }
        .cr-judge-btn { flex: 1; border: 2px solid #c9d2e6; background: #fff; border-radius: 9px; padding: 11px 6px; font-size: 1rem; font-weight: 700; cursor: pointer; color: #4a5a74; }
        .cr-judge-btn.ok.on { background: #1f7a45; border-color: #1f7a45; color: #fff; }
        .cr-judge-btn.ng.on { background: #b02a37; border-color: #b02a37; color: #fff; }
        .cr-judge-btn.na.on { background: #6b7590; border-color: #6b7590; color: #fff; }
        .cr-judge-btn:active { transform: scale(.96); }
        .cr-judge-ro { font-weight: 700; font-size: 1rem; }
        .cr-judge-ro.ok { color: #1f7a45; } .cr-judge-ro.ng { color: #b02a37; }
        /* 系统设置 → 检验项目 */
        .cr-set-dept { border: 1px solid #dde3ef; border-radius: 10px; padding: 10px; margin-bottom: 10px; background: #fafbfe; }
        .cr-set-dept input, .cr-set-dept select { font-size: .85rem; }
        .cr-set-sfrow { display: flex; align-items: flex-start; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
        .cr-set-sf-label { font-size: .8rem; font-weight: 700; color: #4a5e87; padding-top: 6px; white-space: nowrap; }
        .cr-set-sfrow select { max-width: 240px; }
        .cr-set-sfrow .cr-set-sfusers { min-width: 260px; max-width: 320px; }
        /* ---- A4 打印视图：1:1 还原 QF-07-05（屏幕隐藏，仅打印可见） ---- */
        /* 2026-10-11 印表版式修订：单行标题 / 取消类别行 / 信息栏六格等宽 / 不良三段合表 /
           意见栏 11mm 起自动增高 / 批示单行（可送出与 NG 二选一）——整体压入一页 A4 */
        #crPrintArea { display: none; font-family: "SimSun","宋体",serif; color: #000; font-size: 10.5pt; line-height: 1.2; break-inside: avoid; page-break-inside: avoid; }
        /* 2026-10-14c 关键修复：版式样式移出 @media print ——
           打印前 _crFitPrintOnePage 要在屏幕上「按打印样式」测量整表高度，
           若样式锁在 @media print 里，屏幕量到的是浏览器无样式布局（与真实打印差 15~20%），
           缩放系数必然失真 → 放大后溢出第二页。
           屏幕上 #crPrintArea 恒为 display:none（仅测量时临时绝对定位可见），不影响正常界面 */
        #crPrintArea .crp-title { text-align: center; font-size: 16pt; font-weight: 700; line-height: 1.15; margin-bottom: 1mm; }
        #crPrintArea .crp-title-en { display: block; font-size: 10pt; font-weight: 700; letter-spacing: 1px; }
        #crPrintArea .crp-table { width: 100%; border-collapse: collapse; table-layout: fixed; margin-bottom: 0; break-inside: avoid; page-break-inside: avoid; }
        /* 2026-10-14d 框线规范：格线与表间线一律 1pt（原 0.5mm≈1.42pt），整表最外圈 2pt（见本段末外框规则） */
        #crPrintArea .crp-table th, #crPrintArea .crp-table td { border: 1pt solid #000; padding: 0.6mm 1.2mm; font-size: 9pt; word-break: break-all; vertical-align: middle; }
        #crPrintArea .crp-en { font-size: 7pt; color: #333; word-break: normal; overflow-wrap: break-word; }
        #crPrintArea .crp-info td { height: 8mm; }
        #crPrintArea .crp-lab, #crPrintArea .crp-val { width: 16.66%; }
        #crPrintArea .crp-lab { text-align: center; font-weight: 700; background: #f2f2f2; }
        #crPrintArea .crp-val { font-weight: 700; }
        /* 不良行文字贴格顶（整体上移）；经办人栏加宽到 45mm、中英标题一行、签名与时间分两行 */
        /* 注意：通用规则 #crPrintArea .crp-table td 特异性 (1,1,1) 高于 .crp-defect (1,1,0)，
           必须用 td.crp-defect (1,1,2) 才能覆盖 vertical-align，否则文字仍垂直居中 */
        /* 2026-10-14d：不良三段行高 9→18mm（×2，留出手写空间） */
        #crPrintArea td.crp-defect { height: 18mm; vertical-align: top; padding-top: 0.3mm; }
        #crPrintArea td.crp-defect-sign { vertical-align: top; }
        #crPrintArea .crp-defect-text { min-height: 3.5mm; font-weight: 600; }
        #crPrintArea .crp-defect-sign { width: 45mm; font-size: 8pt; text-align: left; }
        #crPrintArea .crp-signrole { white-space: nowrap; }
        #crPrintArea .crp-signname2 { font-family: "KaiTi","楷体",serif; font-weight: 700; font-size: 9pt; min-height: 3.5mm; }
        #crPrintArea .crp-time { font-size: 7pt; color: #444; }
        #crPrintArea .crp-depts { display: flex; border: none; }
        /* 2026-10-14d：竖排标题左侧即整表左外框（2pt）；顶线由不良表底线承担（表间不画双线，见本段末） */
        #crPrintArea .crp-side { writing-mode: vertical-rl; text-orientation: upright; border: 1pt solid #000; border-right: none; border-left-width: 2pt; border-top: none; text-align: center; font-weight: 700; font-size: 9pt; letter-spacing: 2px; padding: 2mm 1mm; }
        #crPrintArea .crp-dept-tables { flex: 1; }
        #crPrintArea .crp-dept { margin-bottom: 0; }
        /* 部门块：左列签名标题/姓名/时间三行竖排，右侧检验项行内连排 */
        /* 2026-10-14b：时间一行放下不折行（列加宽 29mm + 禁折行） */
        #crPrintArea .crp-sign-title { width: 29mm; text-align: center; font-weight: 700; font-size: 8.5pt; height: 5mm; }
        #crPrintArea .crp-sign-name { text-align: center; font-size: 9pt; font-weight: 700; min-height: 4mm; font-family: "KaiTi","楷体",serif; }
        #crPrintArea .crp-sign-time { text-align: center; font-size: 7pt; height: 4mm; border-top: none !important; white-space: nowrap; }
        /* 签名（姓名）与时间之间的框线取消 —— 左列看起来是一个格内的三行
           （collapse 模式下相邻格共用边框，必须两侧都置 none） */
        #crPrintArea .crp-sign-name { border-bottom: none !important; }
        /* 2026-10-14d：检验项文字贴格顶 —— 通用规则 (1,1,1) 特异性高于 .crp-items (1,1,0)，必须写 td.crp-items (1,1,2) */
        #crPrintArea td.crp-items { font-size: 9pt; line-height: 1.7; padding: 0.3mm 2mm 0; vertical-align: top; }
        #crPrintArea .crp-it { display: inline-block; margin: 0 2.2mm 0.4mm 0; white-space: nowrap; }
        #crPrintArea .crp-it b { font-weight: 700; }
        /* 2026-10-14d 判定符号统一：13pt 无框 + 与项目文字「视觉」居中。
           各字形墨迹重心不同（canvas 实测，基线为 0）：中文 9pt 墨迹中线 4px；√ 8px、× 7.5px、N.A. 5.5px
           → 按自身字形分别下移，使墨迹中线都落在 4px：√ 4px、× 3.5px、N.A. 1.5px */
        #crPrintArea .crp-ck { font-weight: 700; font-size: 13pt; line-height: 1; position: relative; top: 4px; }
        #crPrintArea .crp-ck.ng { color: #c00; font-size: 13pt; top: 3.5px; }
        #crPrintArea .crp-na { font-size: 13pt; font-weight: 700; line-height: 1; position: relative; top: 1.5px; }
        /* 2026-10-14d：部门意见行高 9→18mm（×2）；意见格内部上下两端分布（意见贴顶、主管贴底留手签位） */
        #crPrintArea .crp-opinion-cell { height: 18mm; vertical-align: top; padding: 0.3mm 1.2mm; }
        #crPrintArea .crp-op-wrap { display: flex; flex-direction: column; justify-content: space-between; min-height: 17.4mm; }
        #crPrintArea .crp-op-title { font-weight: 700; font-size: 8.5pt; }
        #crPrintArea .crp-op-text { font-size: 8.5pt; }
        #crPrintArea .crp-appr { text-align: right; font-size: 8.5pt; margin-top: 0; padding-right: 30mm; padding-bottom: 0.5mm; }
        /* 2026-10-14d：结果批示行高 11→23mm；内容贴顶 0.3mm，结论贴顶、批示/日期贴底并左移留书写位 */
        #crPrintArea .crp-result td { padding: 0.3mm 2mm 0.5mm; height: 23mm; }
        #crPrintArea .crp-res-label { width: 16mm; text-align: center; font-weight: 700; font-size: 10.5pt; }
        #crPrintArea .crp-res-wrap { display: flex; flex-direction: column; justify-content: space-between; min-height: 22.2mm; }
        #crPrintArea .crp-res-opt { font-size: 9.5pt; padding: 0; }
        #crPrintArea .crp-res-appr { margin-top: 0; text-align: right; font-size: 9.5pt; padding-bottom: 0.2mm; padding-right: 5mm; }
        #crPrintArea .crp-foot { display: flex; justify-content: space-between; font-size: 7.5pt; color: #333; margin-top: 1.5mm; }

        /* ===== 2026-10-14d 框线规范：格线与表间线一律 1pt，整表最外圈 2pt =====
           注意：部门表行2/3（姓名/时间）虽是 DOM 里该行唯一 td，但右侧是检验项格的内部线，
           所以右外框只对 crp-items / crp-opinion-cell 生效，绝不能用 td:last-child 通配 */
        #crPrintArea .crp-info tr:first-child > td { border-top-width: 2pt; }        /* 上外框 */
        #crPrintArea .crp-result tr:last-child > td { border-bottom-width: 2pt; }    /* 下外框 */
        #crPrintArea .crp-info tr > td:first-child,
        #crPrintArea .crp-defects tr > td:first-child,
        #crPrintArea .crp-result tr > td:first-child { border-left-width: 2pt; }     /* 左外框 */
        #crPrintArea .crp-info tr > td:last-child,
        #crPrintArea .crp-defects tr > td:last-child,
        #crPrintArea .crp-result tr > td:last-child,
        #crPrintArea .crp-dept td.crp-items,
        #crPrintArea .crp-dept td.crp-opinion-cell { border-right-width: 2pt; }      /* 右外框 */

        /* ===== 2026-10-14d 表间接缝去双线 =====
           这张纸表由 信息表 / 不良表 / 各部门表 / 批示表 共 7 张独立 table 拼成：同一张表内部的线由
           collapse 合并为一条，但相邻两张表之间不合并 —— 上表底线与下表顶线紧挨着各画一条，
           接缝视觉 2pt（比格线粗一倍）。故接缝一律由「上方表格」的底线承担，下方表格首行不画顶线。
           .crp-side 只去 border-top（顶线同样由不良表全宽底线承担）；其底线必须保留 ——
           末张部门表的底线只覆盖部门表宽度，竖排标题正下方那一段要靠它补齐 */
        #crPrintArea .crp-defects tr:first-child > td,
        #crPrintArea .crp-dept tr:first-child > td,
        #crPrintArea .crp-result tr:first-child > td { border-top: none !important; }
        /* 2026-10-14e 关键修复：@page 必须放顶层 —— 写在 @media print 内部时浏览器会忽略它，
           纸张回落到系统默认（本机实测为 Letter 279.4mm，比 A4 矮 17.6mm）→ 保一页失效。
           页边距：上/下 10mm、左右 8mm（A4 可用内容区 194×277mm，与预览一致） */
        @page { size: A4 portrait; margin: 10mm 8mm; }
        @media print {
            body { margin: 0 !important; }
            body > *:not(#crPrintArea) { display: none !important; }
            #crPrintArea { display: block !important; }
        }
        @media (max-width: 991.98px) {
            /* 平板/手机：取消面板内部嵌套滚动，改为整层 overlay 滚动——
               iOS 对 fixed 容器内的嵌套滚动不可靠（签名/密码行够不到、键盘弹出不把输入框滚进可视区） */
            .cr-modal { max-height: none; }
            .cr-modal .cr-body { overflow: visible; }
        }
        @media (max-width: 767.98px) {
            .cr-info-grid { grid-template-columns: 1fr 1fr; }
            .cr-dept-grid { grid-template-columns: 1fr; }
            .cr-sign-row { grid-template-columns: 1fr; }
        }
        /* 平板竖屏（768~991.98px）：详情/大弹窗加宽到视口内——
           默认 500px 窄宽度下「工序完成状况」表（含时间输入框）右侧被裁切约 1cm，需右滑才能看全 */
        @media (min-width: 768px) and (max-width: 991.98px) {
            .modal-custom .modal-dialog.modal-lg { max-width: calc(100vw - 24px); }
            .detail-table .actual-input { width: 170px; min-width: 0; }
            .detail-table .status-select { min-width: 0; }
        }
        /* ==================== 工程部月报：样式段结束 ==================== */
        .eng-month .rp-stat-num.warn { color:#b02a37; }
        .eng-month .rp-stat-label { font-size:0.7rem; color:#8a94a6; margin-top:1px; }
        /* 月报内表格：强制真实表格布局（覆盖全局移动端卡片化），单元格不换行、小字号，超宽横向滚动 */
        .eng-month .table-responsive { overflow-x:auto; -webkit-overflow-scrolling:touch; }
        .eng-month table.detail-table { display:table; width:100%; min-width:0; font-size:0.74rem; border-collapse:collapse; table-layout:auto; }
        .eng-month table.detail-table thead { display:table-header-group; }
        .eng-month table.detail-table tbody { display:table-row-group; }
        .eng-month table.detail-table tr { display:table-row; margin:0; padding:0; border:none; border-radius:0; background:transparent; box-shadow:none; width:auto !important; }
        .eng-month table.detail-table th { display:table-cell; white-space:nowrap; padding:3px 6px; background:#eef2fb; color:#2c3e7a; font-weight:600; border:1px solid #d9dfea; text-align:center; }
        .eng-month table.detail-table td { display:table-cell; white-space:nowrap; padding:2px 6px; border:1px solid #e3e8f1; vertical-align:middle; text-align:left; width:auto !important; }
        .eng-month table.detail-table td::before { content:none; }
        .eng-month table.detail-table tr:nth-child(even) td { background:#f7f9fc; }
        .eng-month table.detail-table .eng-trial-input { height:24px !important; padding:1px 4px; font-size:0.72rem; flex:none; }
        .eng-month .empty-state { padding:12px; }

        /* ============================================================
           组装工序计时（2026-10-10 · 一人一计时器）：看板计时芯片 + 卡片计时徽章
           ============================================================ */
        .assembly-timer-chip {
            display:flex; align-items:center; gap:8px; flex-wrap:wrap;
            margin:0 0 8px; padding:8px 12px;
            background:#eafaf1; border:1px solid #bfe6cf; border-left:4px solid #198754;
            color:#0f5132; border-radius:8px; font-size:0.85rem;
        }
        .assembly-timer-chip i { color:#198754; font-size:0.95rem; }
        .assembly-timer-chip b { font-size:0.9rem; }
        .assembly-timer-elapsed {
            background:#198754; color:#fff;
            border-radius:999px; padding:1px 10px; font-weight:700;
            font-variant-numeric:tabular-nums; font-size:0.82rem;
        }
        .assembly-timer-hint { font-size:0.72rem; color:#5c7566; }
        .assy-timing-badge {
            display:inline-flex; align-items:center; gap:2px;
            background:#198754; color:#fff; border-radius:6px;
            padding:2px 7px; font-size:0.72rem; font-weight:700; margin-right:5px;
        }
        /* 手机端：芯片只留核心信息（单号/品名/时长），隐藏操作提示、缩小留白，避免长条换行 */
        @media (max-width:991.98px) {
            .assembly-timer-hint { display:none; }
            .assembly-timer-chip { padding:6px 10px; font-size:0.8rem; gap:6px; border-radius:7px; }
            .assembly-timer-chip b { font-size:0.84rem; }
        }

        /* ==================== 备料材料清单（2026-10-11 需求） ==================== */
        /* 工序格子上的「材」徽标：关联材料全部到位 → 绿（可排产）；部分到位 → 琥珀 x/y */
        .step-mat-badge { display:inline-block; margin-left:4px; padding:0 5px; border-radius:9px; font-size:0.6rem; font-weight:700; line-height:1.5; vertical-align:1px; }
        .step-mat-badge.ready { background:#198754; color:#fff; }
        .step-mat-badge.partial { background:#fd7e14; color:#fff; }
        /* 准备材料对话框：条目行（复选框 + 名称 + 关联工序 + 删除） */
        .mp-list { border:1px solid #dee2e6; border-radius:8px; max-height:44vh; overflow-y:auto; }
        .mp-row { display:flex; align-items:center; gap:8px; padding:7px 10px; border-bottom:1px solid #f0f0f0; }
        .mp-row:last-child { border-bottom:none; }
        .mp-row .mp-name { flex:1; font-weight:600; }
        .mp-row .mp-name.done { color:#198754; text-decoration:line-through; }
        .mp-row .mp-steps { font-size:0.72rem; color:#6c757d; white-space:nowrap; }
        /* 2026-10-14 对话框交互重构：全部材料备选 + 左勾「需要」/右勾「到位」两列，点击整行切换需要 */
        .mp-row.mp-headrow { padding:4px 10px; background:#f8f9fa; border-bottom:1px solid #dee2e6; cursor:default; }
        .mp-row.mp-headrow .mp-name, .mp-row.mp-headrow .mp-hcell { font-size:0.72rem; color:#6c757d; font-weight:600; }
        .mp-row .mp-hcell { width:1.05em; text-align:center; flex-shrink:0; }
        .mp-row { cursor:pointer; }
        .mp-row:hover { background:#f5f7fa; }
        .mp-row.sel { background:#eef5ff; }
        .mp-row.sel:hover { background:#e3eFFF; }
        .mp-row:not(.sel) .mp-name { color:#9aa3ad; font-weight:500; }
        .mp-row .mp-done[disabled] { opacity:.25; }
        /* 系统设置 → 备料材料：预置条目维护行（名称 + 关联工序芯片 + 删除） */
        .mp-set-list { border:1px solid #dee2e6; border-radius:8px; }
        .mp-set-row { display:flex; align-items:flex-start; gap:8px; padding:8px 10px; border-bottom:1px solid #f0f0f0; flex-wrap:wrap; }
        .mp-set-row:last-child { border-bottom:none; }
        .mp-set-row .mp-set-name { width:150px; flex-shrink:0; }
        .mp-set-steps { flex:1; display:flex; flex-wrap:wrap; gap:4px; min-width:220px; }
        .mp-step-chip { display:inline-flex; align-items:center; gap:3px; padding:2px 9px; border:1px solid #ced4da; border-radius:12px; font-size:0.72rem; cursor:pointer; user-select:none; background:#fff; color:#495057; }
        .mp-step-chip input { display:none; }
        .mp-step-chip.on { background:#0d6efd; border-color:#0d6efd; color:#fff; }

        /* ============================================================
           管理员手机端专属显示（2026-10-30）
           只对 body.admin-mobile-view 生效：该类的判定与维护见 04-settings.js
           isAdminMobileView / updateAdminMobileNav（账号 role==='admin' 且视口 ≤991.98px，
           由 renderDashboard / renderTable / renderProduction 三个渲染入口刷新）。
           背景：管理员此前没有任何手机端分支（acctRoleName(admin) 返回空串 → 打样组长 /
           打样员 / 备料员三个判定全部 false），手机上拿到的是 PC 完整界面原样缩小——
           两段超长说明文字、挤成一行的 4 个筛选下拉、7 列宽表要横向滚动、
           订单列表卡片里连「单号」都不显示。这里统一重排，其它角色不受影响。
           ============================================================ */
        @media (max-width: 991.98px) {
            /* ---- 看板：页签等宽、加大加粗 ---- */
            body.admin-mobile-view .view-tabs { width: 100%; gap: 6px; }
            body.admin-mobile-view .view-tabs .tab-btn { flex: 1 1 0; min-height: 46px; font-size: 0.95rem; font-weight: 700; }
            /* ---- 看板：筛选折叠条（默认收起，点开后每个下拉独占一行、44px 高） ---- */
            body.admin-mobile-view #dashFilterToggle { min-height: 44px; font-size: 0.95rem; font-weight: 700; display: flex; align-items: center; justify-content: center; gap: 6px; }
            body.admin-mobile-view .business-filter-row { flex-direction: column; align-items: stretch; gap: 10px; padding: 10px 12px; border: 1px solid #e6ebf5; border-radius: 10px; background: #fafbfd; }
            body.admin-mobile-view .business-filter-row label { margin: 0; font-size: 0.9rem; font-weight: 600; color: #4a5a74; }
            body.admin-mobile-view .business-filter-row select { width: 100%; min-width: 100%; height: 44px; font-size: 1rem; }
            /* ---- 看板：业务域统计卡数字加大 ---- */
            body.admin-mobile-view .biz-stat-cards .biz-stat-head { font-size: 1.05rem; padding: 10px; }
            body.admin-mobile-view .biz-stat-cards .biz-stat-row .rlabel { font-size: 0.95rem; }
            body.admin-mobile-view .biz-stat-cards .biz-stat-row .rval { font-size: 1.8rem; }
            body.admin-mobile-view .biz-stat-cards .biz-stat-row.dual .rcell-val { font-size: 2rem; }
            body.admin-mobile-view .biz-stat-cards .biz-stat-row.dual .rcell-label { font-size: 0.85rem; }
            /* ---- 看板：工序计划状况（管理员手机端只留 未完成 / 可开工 / 今日 3 列） ---- */
            body.admin-mobile-view .step-table-caption { font-size: 1.05rem; font-weight: 700; margin: 4px 0 6px; }
            body.admin-mobile-view .step-combined { min-width: 0 !important; }
            body.admin-mobile-view .step-combined th { font-size: 0.95rem; padding: 10px 6px; white-space: nowrap; }
            body.admin-mobile-view .step-combined td { font-size: 1rem; padding: 10px 6px; }
            body.admin-mobile-view .step-combined .num-cell { font-size: 1.15rem; min-width: 38px; padding: 8px 6px; }
            body.admin-mobile-view .step-combined td:first-child { font-size: 0.98rem; font-weight: 600; }
            /* 拖拽手柄（靠长按 2 秒拖动排序）在手机上容易误触，管理员手机端隐藏 */
            body.admin-mobile-view .step-row-handle { display: none; }
            /* ---- 订单列表：卡片化（平板宽度也生效，不再横向滚动） ---- */
            body.admin-mobile-view #tableWrap { overflow-x: visible; }
            body.admin-mobile-view #orderTable { display: block !important; width: 100% !important; max-width: 100% !important; font-size: 0.9rem; }
            body.admin-mobile-view #orderTable thead { display: none; }
            body.admin-mobile-view #orderTable tbody { display: block !important; width: 100% !important; }
            body.admin-mobile-view #orderTable tbody tr { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; width: 100% !important; box-sizing: border-box; border: 1px solid #e0e5ee; border-radius: 10px; margin-bottom: 10px; padding: 10px 12px; background: #fafbfd; }
            body.admin-mobile-view #orderTable tbody td { display: flex; align-items: center; gap: 5px; border: none; padding: 3px 2px; font-size: 0.9rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
            body.admin-mobile-view #orderTable tbody td::before { content: attr(data-label); color: #8a94a6; font-size: 0.78rem; flex-shrink: 0; }
            /* 单号：公共手机端规则把它隐藏了，管理员必须能看到——放第一行最前、加大加粗 */
            body.admin-mobile-view #orderTable tbody td[data-label="单号"] { display: flex !important; order: 1; flex: 0 0 auto; }
            body.admin-mobile-view #orderTable tbody td[data-label="单号"] strong { font-size: 1.05rem; font-weight: 800; color: var(--primary, #2c3e7a); }
            body.admin-mobile-view #orderTable tbody td[data-label="重复"] { display: flex !important; order: 2; flex: 0 0 auto; }
            body.admin-mobile-view #orderTable tbody td[data-label="状态"] { order: 3; flex: 0 0 auto; }
            body.admin-mobile-view #orderTable tbody td[data-label="客户"] { order: 4; flex: 1 1 auto; min-width: 0; font-weight: 700; font-size: 0.95rem; }
            body.admin-mobile-view #orderTable tbody td[data-label="代号"] { order: 5; flex: 0 1 auto; min-width: 0; }
            body.admin-mobile-view #orderTable tbody td[data-label="品名"] { order: 6; flex-basis: 100%; font-weight: 600; }
            body.admin-mobile-view #orderTable tbody td[data-label="业务域"] { order: 7; flex: 0 0 auto; }
            body.admin-mobile-view #orderTable tbody td[data-label="需求"] { order: 8; flex: 0 0 auto; }
            body.admin-mobile-view #orderTable tbody td[data-label="数量"] { order: 9; flex: 0 0 auto; }
            body.admin-mobile-view #orderTable tbody td[data-label="接单日"] { order: 10; flex: 0 0 auto; }
            body.admin-mobile-view #orderTable tbody td[data-label="完成日"] { order: 11; flex: 0 0 auto; }
            body.admin-mobile-view #orderTable tbody td[data-label="业务"] { order: 12; flex: 0 0 auto; }
            body.admin-mobile-view #orderTable tbody td[data-label="工程师"] { order: 13; flex: 0 0 auto; }
            /* 进度：独立一行，工序标签自适应换行，无需左右滚动 */
            body.admin-mobile-view #orderTable tbody td.progress-cell { order: 14; flex-basis: 100%; white-space: normal; overflow: visible; border-top: 1px dashed #eef1f6; margin-top: 4px; padding-top: 6px; }
            body.admin-mobile-view #orderTable tbody td.progress-cell::before { display: none; }
            body.admin-mobile-view #orderTable .progress-track { flex-wrap: wrap; overflow: visible; }
            body.admin-mobile-view #orderTable .progress-track .step { font-size: 0.9rem; padding: 6px 8px; }
            /* 操作列：管理员有编辑 / 删除，恢复显示并独立成行（公共手机端规则把它隐藏了） */
            body.admin-mobile-view #orderTable tbody td.col-actions { display: flex !important; order: 15; flex-basis: 100%; justify-content: flex-start; padding-top: 6px; }
            body.admin-mobile-view #orderTable .action-btns .btn { min-height: 40px; min-width: 44px; font-size: 0.9rem; }
            /* 流水号列对管理员无用，仍隐藏 */
            body.admin-mobile-view #orderTable tbody td.col-idx { display: none; }
            /* ---- 订单排产：可开工订单明细卡片再加一档（字号 / 按钮高度） ---- */
            body.admin-mobile-view .ks-card-grid { grid-template-columns: 1fr; gap: 12px; }
            body.admin-mobile-view .ks-card.ks-startable { padding: 12px 14px; }
            body.admin-mobile-view .ks-card .ks-line1 b { font-size: 1.05rem; }
            body.admin-mobile-view .ks-card .ks-customer { font-size: 1.05rem; }
            body.admin-mobile-view .ks-card .ks-line2 { font-size: 0.95rem; }
            body.admin-mobile-view .ks-card .ks-code,
            body.admin-mobile-view .ks-card .ks-name { font-size: 0.95rem; }
            body.admin-mobile-view .ks-card .ks-meta { font-size: 0.92rem; }
            body.admin-mobile-view .ks-card .ks-people { font-size: 0.92rem; }
            body.admin-mobile-view .ks-card .psop-start,
            body.admin-mobile-view .ks-card .psop-done { min-height: 44px; font-size: 0.95rem; }
        }
