  :root{
    --primary:#3370ff; --primary-hover:#245bdb; --primary-light:#e8f0ff;
    --success:#34c724; --success-bg:#edf9eb; --success-bd:#b7eb8f;
    --warning:#ff8800; --warning-bg:#fff7e8; --warning-bd:#ffd591;
    --danger:#f54a45; --danger-bg:#ffece8; --danger-bd:#ffa39e;
    --text-1:#1f2329; --text-2:#646a73; --text-3:#8f959e;
    --bg:#f2f3f5; --border:#e5e6eb; --sidebar:#1f2329; --sidebar-active:#3370ff;
    --radius:8px; --shadow:0 2px 8px rgba(31,35,41,.08);
  }
  * { box-sizing: border-box; margin:0; padding:0; }
  body { font-family: -apple-system,"Segoe UI","Microsoft YaHei",sans-serif; background:var(--bg); color:var(--text-1); font-size:14px; }
  .hidden { display:none !important; }
  /* 登录/激活 */
  .auth-wrap { display:flex; height:100vh; align-items:center; justify-content:center; background:linear-gradient(135deg,#eef3ff 0%,#f2f3f5 60%); }
  .auth-box { background:#fff; padding:36px; border-radius:14px; box-shadow:0 8px 40px rgba(31,35,41,.12); width:380px; }
  .auth-box h2 { text-align:center; margin-bottom:6px; color:var(--text-1); font-size:20px; }
  .auth-box .sub { text-align:center; color:var(--text-3); font-size:13px; margin-bottom:20px; }
  .auth-box input { width:100%; padding:11px 12px; margin:8px 0; border:1px solid var(--border); border-radius:8px; font-size:14px; outline:none; transition:border .15s; }
  .auth-box input:focus { border-color:var(--primary); box-shadow:0 0 0 2px var(--primary-light); }
  .auth-box button { width:100%; padding:11px; background:var(--primary); color:#fff; border:0; border-radius:8px; cursor:pointer; font-size:15px; margin-top:8px; transition:background .15s; }
  .auth-box button:hover { background:var(--primary-hover); }
  .tip { font-size:12px; color:var(--text-3); margin-top:10px; line-height:1.6; }
  .warn { background:var(--warning-bg); border:1px solid var(--warning-bd); color:var(--warning); padding:10px; border-radius:8px; font-size:13px; margin-bottom:14px; }
  /* 布局 */
  .layout { display:flex; height:100vh; }
  .side { width:224px; background:var(--sidebar); color:#c9cdd4; padding-top:0; overflow-y:auto; flex-shrink:0; }
  .side .logo { padding:18px; font-weight:600; font-size:16px; color:#fff; border-bottom:1px solid rgba(255,255,255,.08); letter-spacing:1px; }
  .side .group { padding:14px 18px 4px; font-size:11px; color:#646a73; letter-spacing:1px; }
  .side .item { padding:9px 18px; cursor:pointer; font-size:13.5px; border-left:3px solid transparent; transition:all .12s; display:flex; align-items:center; }
  .side .item:hover { background:rgba(255,255,255,.06); color:#fff; }
  .side .item.active { background:var(--sidebar-active); color:#fff; border-left-color:#fff; }
  .main { flex:1; display:flex; flex-direction:column; min-width:0; }
  .topbar { height:52px; background:#fff; display:flex; align-items:center; justify-content:space-between; padding:0 20px; box-shadow:var(--shadow); position:relative; z-index:10; }
  #pageTitle { font-size:15px; font-weight:600; }
  .content { flex:1; padding:20px; overflow:auto; }
  .page-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:14px; flex-wrap:wrap; gap:10px; }
  .page-head h2 { font-size:18px; font-weight:600; }
  .card { background:#fff; border-radius:var(--radius); padding:18px; margin-bottom:16px; box-shadow:var(--shadow); }
  .card h3 { font-size:15px; margin-bottom:12px; }
  table { width:100%; border-collapse:collapse; }
  th,td { border:1px solid var(--border); padding:9px 12px; text-align:left; font-size:13px; }
  th { background:#f7f8fa; font-weight:600; color:var(--text-2); white-space:nowrap; }
  tbody tr:nth-child(even) { background:#fafbfc; }
  tbody tr:hover { background:var(--primary-light); }
  .table-wrap { overflow-x:auto; }
  /* 按钮 */
  .btn { padding:7px 15px; background:var(--primary); color:#fff; border:0; border-radius:6px; cursor:pointer; font-size:13px; transition:all .15s; display:inline-flex; align-items:center; gap:4px; }
  .btn:hover { background:var(--primary-hover); }
  .btn.gray { background:#fff; color:var(--text-2); border:1px solid var(--border); }
  .btn.gray:hover { background:#f2f3f5; }
  .btn.green { background:var(--success); }
  .btn.green:hover { filter:brightness(.95); }
  .btn.danger { background:var(--danger); }
  .btn.danger:hover { filter:brightness(.95); }
  .btn.sm { padding:3px 10px; font-size:12px; }
  .btn:disabled { opacity:.6; cursor:not-allowed; }
  .menu-btn { display:none; font-size:20px; background:none; border:0; cursor:pointer; color:var(--text-1); }
  /* 弹窗表单 */
  .mask { position:fixed; inset:0; background:rgba(31,35,41,.45); display:flex; align-items:center; justify-content:center; z-index:1000; animation:fadeIn .15s; }
  @keyframes fadeIn { from{opacity:0} to{opacity:1} }
  @keyframes slideUp { from{transform:translateY(16px);opacity:0} to{transform:none;opacity:1} }
  .modal { background:#fff; border-radius:12px; width:460px; max-width:94vw; max-height:88vh; overflow:auto; padding:22px; box-shadow:0 12px 40px rgba(0,0,0,.2); animation:slideUp .18s; }
  .modal h3 { margin-bottom:16px; font-size:16px; padding-bottom:12px; border-bottom:1px solid var(--border); }
  .modal .fld { margin-bottom:13px; }
  .modal .fld label { display:block; font-size:13px; color:var(--text-2); margin-bottom:5px; }
  .modal .fld label .req { color:var(--danger); margin-right:2px; }
  .modal .fld input,.modal .fld select,.modal .fld textarea { width:100%; padding:8px 10px; border:1px solid var(--border); border-radius:6px; box-sizing:border-box; font-size:13px; outline:none; transition:border .15s; }
  .modal .fld input:focus,.modal .fld select:focus,.modal .fld textarea:focus { border-color:var(--primary); box-shadow:0 0 0 2px var(--primary-light); }
  /* V84: 渠道多选（checkbox-group） */
  .chk-group{display:flex;flex-wrap:wrap;gap:8px;}
  .chk{display:inline-flex;align-items:center;gap:5px;padding:6px 12px;border:1px solid var(--border);border-radius:16px;font-size:13px;cursor:pointer;background:#fafbfc;user-select:none;}
  .chk:hover{border-color:var(--primary);}
  .chk input[type=checkbox]{width:14px;height:14px;margin:0;accent-color:var(--primary);}
  .chk:has(input:checked){background:var(--primary-light);border-color:var(--primary);color:var(--primary);font-weight:600;}
  .chk:has(input:disabled){opacity:.45;cursor:not-allowed;}
  .modal .fld textarea { min-height:70px; resize:vertical; }
  .modal .fld.err input,.modal .fld.err select { border-color:var(--danger); }
  .modal .fld .ferr { color:var(--danger); font-size:12px; margin-top:3px; display:none; }
  .modal .fld.err .ferr { display:block; }
  .modal .sect { font-size:12px; color:var(--text-3); margin:16px 0 8px; padding-top:12px; border-top:1px dashed var(--border); }
  .modal .acts { text-align:right; margin-top:20px; }
  .modal .acts .btn { margin-left:8px; }
  .modal input,.modal select,.modal textarea { width:100%; padding:8px; margin:4px 0; border:1px solid var(--border); border-radius:6px; font-size:13px; box-sizing:border-box; }
  /* KPI / 统计卡片 */
  .stat-row { display:flex; gap:16px; flex-wrap:wrap; }
  .stat { flex:1; min-width:140px; background:#fff; border-radius:var(--radius); padding:18px 20px; box-shadow:var(--shadow); }
  .stat .num { font-size:26px; font-weight:700; color:var(--primary); }
  .stat .lbl { color:var(--text-3); margin-top:6px; font-size:13px; }
  .kpis { display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:14px; }
  .kpi { background:var(--primary-light); border-radius:var(--radius); padding:16px 18px; display:flex; flex-direction:column; gap:6px; }
  .kpi b { font-size:24px; color:var(--primary); }
  .kpi span { font-size:12.5px; color:var(--text-2); }
  /* 标签 */
  .tag { padding:2px 9px; border-radius:10px; font-size:12px; display:inline-block; white-space:nowrap; background:#f2f3f5; color:var(--text-2); border:1px solid transparent; }
  .tag.ok,.tag.green { background:var(--success-bg); color:var(--success); border-color:var(--success-bd); }
  .tag.wait { background:var(--warning-bg); color:var(--warning); border-color:var(--warning-bd); }
  .tag.no,.tag.danger { background:var(--danger-bg); color:var(--danger); border-color:var(--danger-bd); }
  .tag.gray { background:#f2f3f5; color:var(--text-2); }
  /* 工具行 */
  .row { display:flex; gap:10px; margin-bottom:12px; flex-wrap:wrap; align-items:center; }
  .row input,.row select { padding:7px 10px; border:1px solid var(--border); border-radius:6px; font-size:13px; outline:none; }
  .row input:focus,.row select:focus { border-color:var(--primary); }
  /* 工具栏搜索 */
  .toolbar { display:flex; gap:10px; flex-wrap:wrap; align-items:center; margin-bottom:12px; }
  .toolbar .search { padding:7px 12px; border:1px solid var(--border); border-radius:6px; width:240px; font-size:13px; outline:none; }
  .toolbar .search:focus { border-color:var(--primary); box-shadow:0 0 0 2px var(--primary-light); }
  .pager { display:flex; gap:8px; align-items:center; margin-top:12px; font-size:13px; color:var(--text-2); }
  /* toast */
  .toast { position:fixed; top:24px; left:50%; transform:translateX(-50%); background:#1f2329; color:#fff; padding:10px 22px; border-radius:8px; z-index:9999; font-size:13.5px; box-shadow:0 6px 20px rgba(0,0,0,.25); animation:slideDown .2s; max-width:80vw; }
  @keyframes slideDown { from{transform:translate(-50%,-20px);opacity:0} to{transform:translate(-50%,0);opacity:1} }
  .toast.ok { background:#2ba245; }
  .toast.err { background:#d83931; }
  /* 顶部细进度条（替代居中假弹窗） */
  .prog{position:fixed;top:0;left:0;height:3px;background:linear-gradient(90deg,var(--primary),#6aa1ff);z-index:9998;width:0;transition:width .2s;box-shadow:0 0 8px var(--primary);}
  /* 空态 */
  .empty { text-align:center; color:var(--text-3); padding:36px 12px; font-size:13px; }
  .empty::before { content:"📭"; display:block; font-size:34px; margin-bottom:8px; opacity:.6; }
  /* 可搜索下拉（远程选择器） */
  .selbox { position:relative; }
  .selbox input { width:100%; padding:8px 10px; border:1px solid var(--border); border-radius:6px; font-size:13px; outline:none; }
  .selbox input:focus { border-color:var(--primary); box-shadow:0 0 0 2px var(--primary-light); }
  .selbox .opts { position:absolute; left:0; right:0; top:100%; background:#fff; border:1px solid var(--border); border-radius:6px; max-height:220px; overflow:auto; z-index:50; box-shadow:0 6px 20px rgba(0,0,0,.12); display:none; }
  .selbox.open .opts { display:block; }
  /* V61.2 P2：靠近容器底边时向上弹出，避免被 Drawer/滚动容器裁剪（窄屏修复） */
  .selbox.drop-up .opts { top:auto; bottom:100%; }
  .selbox .opts .opt { padding:7px 12px; cursor:pointer; font-size:13px; }
  .selbox .opts .opt:hover { background:var(--primary-light); }
  .selbox .opts .opt .sub { color:var(--text-3); font-size:11px; margin-left:6px; }
  .selbox .picked { font-size:12px; color:var(--text-3); margin-top:3px; }
  /* 类型单选卡片（异动类型等） */
  .type-cards { display:flex; gap:10px; flex-wrap:wrap; }
  .type-card { border:1px solid var(--border); border-radius:8px; padding:10px 16px; cursor:pointer; font-size:13px; flex:1; text-align:center; min-width:90px; transition:all .12s; }
  .type-card.sel { border-color:var(--primary); background:var(--primary-light); color:var(--primary); font-weight:600; }

  /* ===== P0 设计系统补全 ===== */
  :root{
    --primary-active:#1d4fd0; --primary-disabled:#a8c0ff;
    --warning-bg:#fff7e8; --warning-bd:#ffd591;
    --danger-bg:#ffece8; --danger-bd:#ffa39e;
    --text-disabled:#c9cdd4; --border-dark:#c9cdd4; --card:#ffffff;
    --shadow-modal:0 12px 40px rgba(0,0,0,.2);
    --shadow-drawer:-8px 0 24px rgba(31,35,41,.12);
    --row-err-bg:#fff1f0; --required:#f54a45;
  }
  /* 控件统一 32px 高 */
  .toolbar input,.toolbar select,.row input,.row select,
  .modal .fld input,.modal .fld select,.modal .fld textarea{height:32px;}
  .modal .fld textarea{height:auto;min-height:70px;}
  .num-r{text-align:right !important; font-variant-numeric:tabular-nums;}
  /* 右侧 Drawer（单据头+多行分录） */
  .drawer{position:fixed;top:0;right:0;bottom:0;width:720px;max-width:100vw;background:var(--card);box-shadow:var(--shadow-drawer);display:flex;flex-direction:column;z-index:1001;animation:slideInRight .18s;}
  @keyframes slideInRight{from{transform:translateX(40px);opacity:0}to{transform:none;opacity:1}}
  .drawer-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border);}
  .drawer-head h3{font-size:16px;font-weight:600;}
  .drawer-head .x{cursor:pointer;font-size:20px;color:var(--text-3);border:0;background:none;line-height:1;}
  .drawer-body{flex:1;overflow:auto;padding:18px 20px;}
  .drawer-acts{display:flex;justify-content:flex-end;gap:8px;padding:14px 20px;border-top:1px solid var(--border);background:#fafbfc;}
  .drawer-acts .spacer{flex:1;}
  /* 居中加宽弹窗（审批详情/BOM树/导入向导） */
  .modal-wide{width:860px;max-width:96vw;}
  /* 分录可编辑网格 */
  .grid-edit{width:100%;border-collapse:collapse;font-size:13px;}
  .grid-edit th,.grid-edit td{border:1px solid var(--border);padding:6px 8px;text-align:left;vertical-align:middle;}
  .grid-edit th{background:#f7f8fa;font-weight:600;color:var(--text-2);white-space:nowrap;}
  .grid-edit input,.grid-edit select{width:100%;height:30px;border:1px solid var(--border);border-radius:6px;padding:0 8px;font-size:13px;outline:none;box-sizing:border-box;}
  .grid-edit input:focus,.grid-edit select:focus{border-color:var(--primary);box-shadow:0 0 0 2px var(--primary-light);}
  .grid-edit td .readonly{color:var(--text-3);font-size:12px;}
  .grid-edit tr.row-err td{background:var(--row-err-bg);}
  .grid-edit .g-num{text-align:right;}
  .grid-total{margin-top:10px;font-size:13px;color:var(--text-2);text-align:right;}
  .grid-total b{color:var(--text-1);}
  .head-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px;margin-bottom:14px;}
  .head-grid .fld{margin-bottom:0;}
  .head-grid .full{grid-column:1 / -1;}
  /* 批量操作条 */
  .batchbar{display:flex;align-items:center;gap:12px;background:var(--primary-light);border:1px solid var(--primary-disabled);border-radius:8px;padding:8px 14px;margin-bottom:10px;font-size:13px;}
  .batchbar b{color:var(--primary);}
  .batchbar .right{margin-left:auto;display:flex;gap:8px;}
  /* 分页器 */
  .pager{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:13px;color:var(--text-2);}
  .pager .pg{min-width:28px;height:28px;padding:0 8px;border:1px solid var(--border);border-radius:6px;background:#fff;cursor:pointer;font-size:13px;color:var(--text-2);}
  .pager .pg:hover{border-color:var(--primary);color:var(--primary);}
  .pager .pg.on{background:var(--primary);color:#fff;border-color:var(--primary);}
  .pager .pg:disabled{opacity:.4;cursor:not-allowed;}
  .pager select,.pager input{height:28px;border:1px solid var(--border);border-radius:6px;font-size:13px;padding:0 6px;}
  /* V85 员工档案分页条：首页/上一页/第X页共Y页/下一页/尾页 */
  .page-bar{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:14px;flex-wrap:wrap;}
  .page-bar .pg-btn{min-width:56px;height:30px;padding:0 12px;border:1px solid var(--border);border-radius:6px;background:#fff;cursor:pointer;font-size:13px;color:var(--text-2);transition:all .15s;}
  .page-bar .pg-btn:hover:not(:disabled){border-color:var(--primary);color:var(--primary);}
  .page-bar .pg-btn:disabled{opacity:.4;cursor:not-allowed;}
  .page-bar .pg-info{font-size:13px;color:var(--text-2);display:inline-flex;align-items:center;gap:4px;}
  .page-bar .pg-jump{width:52px;height:28px;border:1px solid var(--border);border-radius:6px;font-size:13px;padding:0 6px;text-align:center;}
  /* 导入向导步骤条 */
  .stepbar{display:flex;align-items:center;gap:0;margin:6px 0 18px;}
  .stepbar .st{display:flex;align-items:center;gap:6px;color:var(--text-3);font-size:13px;}
  .stepbar .st .n{width:22px;height:22px;border-radius:50%;background:var(--info-bg);color:var(--text-2);display:inline-flex;align-items:center;justify-content:center;font-size:12px;}
  .stepbar .st.on{color:var(--primary);font-weight:600;}
  .stepbar .st.on .n{background:var(--primary);color:#fff;}
  .stepbar .st.done .n{background:var(--success);color:#fff;}
  .stepbar .ln{flex:1;height:1px;background:var(--border);margin:0 10px;}
  .dropzone{border:2px dashed var(--border-dark);border-radius:8px;padding:36px;text-align:center;color:var(--text-3);cursor:pointer;transition:all .15s;}
  .dropzone:hover,.dropzone.drag{border-color:var(--primary);background:var(--primary-light);color:var(--primary);}
  .impstat{display:flex;gap:18px;margin:10px 0;font-size:13px;}
  .impstat .ok{color:var(--success);} .impstat .bad{color:var(--danger);} .impstat .skip{color:var(--text-3);}
  /* 侧栏分组可折叠 */
  .side .grp{cursor:pointer;user-select:none;display:flex;justify-content:space-between;align-items:center;}
  .side .grp .arrow{transition:transform .15s;}
  .side .grp.closed .arrow{transform:rotate(-90deg);}
  .side .grp-items{overflow:hidden;}
  .side .grp.closed + .grp-items{display:none;}
  .side .pin{border-top:1px solid rgba(255,255,255,.08);}
  /* V81: 3级菜单 一级/二级/三级 */
  .side .grp.top-grp{padding:13px 18px 6px;font-size:13.5px;font-weight:600;color:#fff;letter-spacing:1px;border-top:1px solid rgba(255,255,255,.08);margin-top:4px;}
  .side .grp.top-grp .arrow{font-size:11px;color:#9aa0a6;}
  .side .grp.mid-grp{padding:9px 18px 3px 26px;font-size:12px;color:#8b929b;letter-spacing:.5px;}
  .side .item.lv3{padding-left:40px;font-size:13px;}
  .side .item.lv2{padding-left:26px;font-size:13px;}
  /* 面包屑 */
  .breadcrumb{display:flex;align-items:center;gap:6px;font-size:12.5px;color:#9aa0a6;margin-left:8px;padding-left:12px;border-left:1px solid var(--border);}
  .breadcrumb .bc-seg{color:#9aa0a6;}
  .breadcrumb .bc-cur{color:var(--text-2);font-weight:500;}
  .breadcrumb .bc-sep{color:#c9cdd4;font-size:11px;}
  /* V82: 面包屑快捷子菜单条 */
  .bc-quick-bar{background:#fff;border-bottom:1px solid var(--border);padding:6px 20px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12.5px;overflow-x:auto;box-shadow:0 1px 2px rgba(0,0,0,.03);}
  .bc-qk-label{font-weight:600;color:var(--text-3);font-size:12px;margin-right:2px;white-space:nowrap;}
  .bc-qk{padding:3px 12px;background:#f5f7fa;border:1px solid var(--border);border-radius:14px;cursor:pointer;color:var(--text-2);white-space:nowrap;transition:all .15s;font-size:12.5px;}
  .bc-qk:hover{background:var(--primary);color:#fff;border-color:var(--primary);}
  .bc-qk-mid{background:#e8f0fe;color:var(--primary);border-color:#c2d7fd;font-weight:600;}
  .bc-qk-mid:hover{background:var(--primary);color:#fff;border-color:var(--primary);}
  .bc-qk-group{font-weight:600;color:var(--text-3);margin-right:4px;}
  /* V82: 可双击反推的数字 */
  td[style*="underline"][title*="双击"]{transition:background .12s;}
  td[style*="underline"][title*="双击"]:hover{background:#e8f0fe;}
  @media (max-width: 768px) {
    .side { position:fixed; left:-224px; top:0; height:100vh; z-index:100; transition:left .2s; }
    .side.open { left:0; }
    .menu-btn { display:block; }
    .content { padding:12px; }
    .card { padding:12px; }
    .stat-row { gap:10px; }
    .stat { min-width:45%; padding:12px; }
    table { font-size:12px; } th,td { padding:6px; }
    .toolbar .search { width:100%; }
  }

/* ===== Round2: UX 打磨 ===== */
/* 长表固定表头 */
.table-wrap thead th { position:sticky; top:0; background:#f7f8fa; z-index:2; }

/* ===== Round2: 车间实时看板（深色大屏） ===== */
.shopfloor-wrap { background:#101418; border-radius:10px; padding:16px; min-height:calc(100vh - 120px); color:#e6e8eb; }
.shop-topbar { display:flex; justify-content:space-between; align-items:center; margin-bottom:14px; font-size:13px; color:#c9cdd4; }
.shop-dot { display:inline-block; width:10px; height:10px; border-radius:50%; margin-right:5px; vertical-align:middle; }
.shop-updated { font-size:12px; color:#8f959e; }
.shop-ws { margin-bottom:18px; }
.shop-ws-title { font-size:15px; font-weight:600; margin-bottom:10px; color:#fff; }
.shop-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:12px; }
.shop-card { background:#1a2026; border:1px solid #2a3138; border-left:4px solid #8f959e; border-radius:8px; padding:12px; min-height:130px; }
.shop-card-head { display:flex; justify-content:space-between; align-items:center; font-size:14px; color:#fff; }
.shop-lamp { width:10px; height:10px; border-radius:50%; display:inline-block; }
.shop-code { font-size:11px; color:#8f959e; margin:4px 0 6px; }
.shop-wo { font-size:12px; color:#c9cdd4; }
.shop-prod { font-size:12px; color:#e6e8eb; margin:2px 0 6px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.shop-bar { height:6px; background:#2a3138; border-radius:3px; overflow:hidden; }
.shop-bar-fill { height:100%; }
.shop-pct { font-size:11px; color:#8f959e; margin-top:4px; }

/* ===== Round2: 订单进度甘特 ===== */
.gantt { font-size:12px; }
.gantt-axis { position:relative; height:22px; border-bottom:1px solid var(--border); margin-bottom:6px; }
.gantt-axis span { position:absolute; top:0; transform:translateX(-50%); color:var(--text-3); font-size:11px; }
.gantt-now { position:absolute; top:0; bottom:-6px; width:1px; background:var(--danger); }
.gantt-row { display:flex; align-items:center; border-bottom:1px solid #f0f1f3; min-height:44px; }
.gantt-left { padding:6px 10px; box-sizing:border-box; }
.g-no { font-weight:600; color:var(--text-1); }
.g-warn { color:var(--danger); margin-right:2px; }
.g-prod { color:var(--text-2); font-size:11px; margin-top:2px; }
.g-step { color:var(--primary); }
.g-cust { color:var(--text-3); font-size:11px; }
.gantt-track { position:relative; flex:1; height:28px; }
.gantt-bar { position:absolute; top:6px; height:16px; background:#cfe0ff; border-radius:3px; overflow:hidden; }
.gantt-bar.late { background:#ffd6d2; }
.gantt-bar-done { height:100%; background:var(--primary); }
.gantt-bar.late .gantt-bar-done { background:var(--danger); }
.gantt-pct { position:absolute; top:5px; right:-38px; font-size:11px; color:var(--text-2); }

/* ===== Round6: 图表 tooltip + 图例 ===== */
.chart-box { position:relative; }
.chart-tip { position:absolute; display:none; background:rgba(33,37,43,.94); color:#fff; font-size:12px; padding:6px 10px; border-radius:6px; pointer-events:none; z-index:5; box-shadow:0 4px 14px rgba(0,0,0,.25); white-space:nowrap; line-height:1.6; }
.chart-legend { display:flex; gap:14px; flex-wrap:wrap; margin-top:8px; font-size:12px; color:var(--text-2); align-items:center; }
.chart-legend .lg-item { display:inline-flex; align-items:center; gap:5px; }
.chart-legend .lg-sw { display:inline-block; width:10px; height:10px; border-radius:2px; }
.chart-box svg [data-tip] { cursor:default; transition:opacity .15s; }
.chart-box svg [data-tip]:hover { opacity:.72; }

/* ===== Round6: 打印模板可视化设计器 ===== */
.pdes-grid { display:grid; grid-template-columns:220px 1fr 1fr; gap:14px; align-items:start; }
.pdes-fields { display:flex; flex-wrap:wrap; gap:6px; }
.pdes-field { font-family:Consolas,monospace; }
.pdes-ta { width:100%; height:420px; min-height:200px; font-family:Consolas,monospace; font-size:12px; padding:10px; border:1px solid var(--border); border-radius:8px; resize:vertical; box-sizing:border-box; }
.pdes-page { margin:0 auto; background:#fff; border:1px dashed var(--border); padding:10px; box-sizing:border-box; width:794px; max-width:100%; transition:width .2s; }
.pdes-page.a5 { width:560px; }
.pdes-iframe { width:100%; height:420px; border:0; display:block; background:#fff; }
.btn.gray.on { background:var(--primary-light); border-color:var(--primary); color:var(--primary); }
@media (max-width:1100px) { .pdes-grid { grid-template-columns:1fr; } }

/* ===== Round6: 审批实例流转图 ===== */
.wf-flow { display:flex; align-items:center; flex-wrap:wrap; gap:0; font-size:12px; margin-top:4px; }
.wf-step { display:inline-flex; align-items:center; gap:5px; padding:4px 10px; border-radius:14px; border:1.5px solid #ccc; background:#f2f3f5; color:var(--text-2); white-space:nowrap; }
.wf-step .wf-dot { width:8px; height:8px; border-radius:50%; background:#bbb; display:inline-block; }
.wf-step.wf-pass { background:#e6f7ec; border-color:#2da44e; color:#1a7f37; }
.wf-step.wf-pass .wf-dot { background:#2da44e; }
.wf-step.wf-cur { background:#e8f0ff; border-color:#1f6feb; color:#1f6feb; font-weight:600; box-shadow:0 0 0 3px rgba(31,111,235,.15); }
.wf-step.wf-cur .wf-dot { background:#1f6feb; }
.wf-step.wf-reject { background:#ffe9e9; border-color:#cf222e; color:#cf222e; }
.wf-step.wf-reject .wf-dot { background:#cf222e; }
.wf-step.wf-start, .wf-step.wf-end { background:#f7f8fa; border-color:#888; color:#555; }
.wf-arrow { margin:0 6px; color:#bbb; }
.wf-lg { display:inline-block; width:10px; height:10px; border-radius:2px; margin-right:3px; vertical-align:middle; }

/* ===== V56 P0: 车间平面鸟瞰（x/y 绝对定位） ===== */
.shop-tip { background:#2a2118; border:1px solid #5a4a2a; color:#e6d3a3; padding:8px 12px; border-radius:8px; font-size:12px; margin-bottom:12px; }
.shop-canvas { position:relative; width:100%; height:520px; background:#0b0f13; border:1px solid #242b32; border-radius:10px; overflow:hidden; }
.shop-canvas-grid { position:absolute; inset:0; background-image:linear-gradient(#182027 1px,transparent 1px),linear-gradient(90deg,#182027 1px,transparent 1px); background-size:40px 40px; pointer-events:none; }
.shop-dev { position:absolute; transform:translate(-50%,-50%); width:168px; }
.shop-dev .shop-card { min-height:118px; cursor:pointer; transition:box-shadow .15s, transform .15s; }
.shop-dev .shop-card:hover { box-shadow:0 0 0 2px var(--primary),0 6px 18px rgba(0,0,0,.4); }
.shop-card.is-fault { animation:shopBlink 1s infinite; }
@keyframes shopBlink { 0%,100%{ box-shadow:0 0 0 0 rgba(245,74,69,.55);} 50%{ box-shadow:0 0 0 6px rgba(245,74,69,0);} }

/* ===== V56 P0: 订单 7 阶段流水线步进器 ===== */
.ostep-row { display:flex; align-items:center; gap:16px; padding:10px 8px; border-bottom:1px solid #f0f1f3; cursor:pointer; }
.ostep-row:hover { background:#f7f9ff; }
.ostep-info { width:230px; flex:none; padding-right:10px; border-right:1px dashed var(--border); }
.ostep-cur { width:80px; flex:none; text-align:right; font-size:12px; color:var(--primary); font-weight:600; }
.ostep { display:flex; align-items:center; flex:1; min-width:0; }
.ostep-node { display:inline-flex; align-items:center; gap:5px; font-size:12px; color:var(--text-3); white-space:nowrap; }
.ostep-dot { width:11px; height:11px; border-radius:50%; background:#d4d7dc; display:inline-block; }
.ostep-link { flex:1; height:2px; background:#e2e5e9; margin:0 4px; min-width:10px; }
.ostep-node.st-done { color:#1a7f37; } .ostep-node.st-done .ostep-dot { background:#2da44e; }
.ostep-node.st-cur { color:#1f6feb; font-weight:700; } .ostep-node.st-cur .ostep-dot { background:#1f6feb; box-shadow:0 0 0 4px rgba(31,111,235,.18); }
.ostep-node.st-late { color:#cf222e; font-weight:700; } .ostep-node.st-late .ostep-dot { background:#cf222e; box-shadow:0 0 0 4px rgba(207,34,46,.18); }
/* V59.2 P1-2：窄屏(<640px)阶段步进只显 合同/当前/发货 + "+N阶段" */
.ostep-narrow .ostep-node { font-size:9px; gap:2px; }
.ostep-narrow .ostep-link { min-width:4px; flex:0 0 auto; }
.ostep-narrow .ostep-dot { width:8px; height:8px; }
.ostep-more { font-size:9px; color:var(--text-3); white-space:nowrap; padding:0 1px; }
/* V59.2 P2-2：顶栏角标默认隐藏（桌面端只亮侧栏 todoBadge）；窄屏侧栏收起时才显示 */
.topbar-badge { display:none; margin-left:8px; background:#e53935; color:#fff; border-radius:9px; padding:0 7px; font-size:11px; }
@media (max-width:800px){ .topbar-badge { display:inline-block; } }

/* ===== V56 P0: 待办三 Tab 卡片化 ===== */
.todo-tabs { display:flex; gap:8px; border-bottom:1px solid var(--border); margin-bottom:14px; padding-bottom:0; align-items:center; }
.todo-tab { background:#fff; border:1px solid var(--border); border-bottom:none; border-radius:8px 8px 0 0; padding:8px 18px; font-size:13px; color:var(--text-2); cursor:pointer; }
.todo-tab.on { background:var(--primary-light); border-color:var(--primary); color:var(--primary); font-weight:600; position:relative; }
.todo-tab.on::after { content:''; position:absolute; left:0; right:0; bottom:-1px; height:2px; background:var(--primary); }
.todo-list { display:flex; flex-direction:column; gap:10px; }
.todo-card { display:flex; justify-content:space-between; align-items:center; gap:14px; border:1px solid var(--border); border-radius:10px; padding:12px 14px; background:#fff; cursor:pointer; transition:box-shadow .15s, border-color .15s; }
.todo-card:hover { border-color:var(--primary); box-shadow:0 4px 14px rgba(31,111,235,.1); }
.todo-card-main { flex:1; min-width:0; }
.todo-card-title { font-size:14px; font-weight:600; color:var(--text-1); margin-bottom:5px; }
.todo-card-meta { font-size:12px; color:var(--text-3); margin-bottom:6px; }
.todo-card-acts { display:flex; gap:6px; flex:none; }

/* ===== V57: UX 增强 ===== */
/* 骨架屏加载 */
.skeleton { background:linear-gradient(90deg,#f0f1f3 25%,#e6e8eb 50%,#f0f1f3 75%); background-size:200% 100%; animation:skeletonShimmer 1.4s infinite; border-radius:6px; }
@keyframes skeletonShimmer { 0%{background-position:200% 0} 100%{background-position:-200% 0} }
.skeleton-row { height:36px; margin-bottom:6px; }
.skeleton-card { height:120px; margin-bottom:12px; }

/* 仓库鸟瞰图（热力色阶+分区） */
.wh-birdview { padding:8px 0; }
.wh-zone { margin-bottom:20px; }
.wh-zone-title { font-size:14px; font-weight:600; color:var(--text-1); margin-bottom:10px; padding:6px 12px; background:var(--primary-light); border-radius:6px; display:flex; align-items:center; gap:8px; }
.wh-zone-title .wh-zone-cnt { font-size:12px; color:var(--text-3); font-weight:400; }
.wh-grid { display:grid; gap:8px; padding:0 4px; }
.wh-cell { padding:12px 8px; text-align:center; border-radius:8px; border:1px solid var(--border); cursor:pointer; transition:transform .12s, box-shadow .12s; min-height:72px; display:flex; flex-direction:column; justify-content:center; }
.wh-cell:hover { transform:translateY(-2px); box-shadow:0 4px 12px rgba(0,0,0,.12); z-index:1; }
.wh-cell .wh-loc { font-size:13px; font-weight:600; color:var(--text-1); }
.wh-cell .wh-qty { font-size:20px; font-weight:700; margin:4px 0; }
.wh-cell .wh-zone-tag { font-size:11px; color:var(--text-3); }
.wh-cell.lvl-0 { background:#f5f6f7; } .wh-cell.lvl-0 .wh-qty { color:var(--text-3); }
.wh-cell.lvl-1 { background:#e6f4ff; border-color:#91caff; } .wh-cell.lvl-1 .wh-qty { color:#0958d9; }
.wh-cell.lvl-2 { background:#bae0ff; border-color:#69b1ff; } .wh-cell.lvl-2 .wh-qty { color:#0958d9; }
.wh-cell.lvl-3 { background:#91caff; border-color:#4096ff; } .wh-cell.lvl-3 .wh-qty { color:#fff; }
.wh-cell.lvl-4 { background:#1677ff; border-color:#0958d9; } .wh-cell.lvl-4 .wh-qty { color:#fff; }
.wh-cell.lvl-over { background:#ffa940; border-color:#d46b08; } .wh-cell.lvl-over .wh-qty { color:#fff; }
.wh-cell.lvl-frozen { background:#ff4d4f; border-color:#cf1322; } .wh-cell.lvl-frozen .wh-qty { color:#fff; }
.wh-legend { display:flex; gap:14px; flex-wrap:wrap; font-size:12px; color:var(--text-2); margin-bottom:14px; padding:8px 12px; background:#fafbfc; border-radius:6px; }
.wh-legend .lg-sw { display:inline-block; width:14px; height:14px; border-radius:3px; margin-right:4px; vertical-align:middle; }

/* 进度条通用 */
.progress-bar-wrap { background:#eef0f3; border-radius:6px; height:8px; overflow:hidden; min-width:80px; }
.progress-bar-fill { height:100%; border-radius:6px; transition:width .3s; }

/* 模具寿命预警条 */
.life-bar { display:flex; align-items:center; gap:6px; }
.life-bar .life-track { flex:1; background:#eef0f3; border-radius:4px; height:6px; overflow:hidden; min-width:60px; }
.life-bar .life-fill { height:100%; background:var(--success); }
.life-bar .life-fill.warn { background:var(--warning); }
.life-bar .life-fill.danger { background:var(--danger); }

/* Drawer 内表单栅格增强 */
.drawer-body .head-grid .fld label { display:block; font-size:13px; color:var(--text-2); margin-bottom:5px; }
.drawer-body .fld input, .drawer-body .fld select, .drawer-body .fld textarea { width:100%; padding:8px 10px; border:1px solid var(--border); border-radius:6px; box-sizing:border-box; font-size:13px; outline:none; }
.drawer-body .fld input:focus, .drawer-body .fld select:focus, .drawer-body .fld textarea:focus { border-color:var(--primary); box-shadow:0 0 0 2px var(--primary-light); }

/* 工具栏按钮组 */
.toolbar-btns { display:flex; gap:8px; align-items:center; flex-wrap:wrap; }

/* 小屏适配 (≤480px) */
@media (max-width: 480px) {
  .drawer { width:100vw !important; }
  .content { padding:10px; }
  .card { padding:12px; margin-bottom:10px; }
  .stat { min-width:calc(50% - 5px); padding:12px; }
  .stat .num { font-size:20px; }
  .kpis { grid-template-columns:repeat(2,1fr); gap:10px; }
  .kpi { padding:12px; } .kpi b { font-size:20px; }
  .wh-grid { grid-template-columns:repeat(3,1fr) !important; }
  .shop-canvas { height:min(400px, 60vh) !important; }
  .gantt { font-size:11px; }
  .ostep-info { width:140px; font-size:11px; }
  .ostep-cur { width:50px; font-size:10px; }
  .ostep-node { font-size:10px; gap:3px; }
  .ostep-dot { width:9px; height:9px; }
  .row { gap:6px; }
  .toolbar { gap:6px; }
  table th, table td { padding:6px 8px; font-size:12px; }
  .pdes-grid { grid-template-columns:1fr; }
}

/* 表格统一横向滚动（确保所有裸 table 都有包裹） */
.card > .table-wrap, .card > table { max-width:100%; }
.card table { font-size:13px; }

/* ===== V59.5 全工厂鸟瞰 / 员工鸟瞰布局 ===== */
.fo-wrap { display:flex; gap:12px; align-items:stretch; }
.fo-tree { width:240px; flex:none; max-height:640px; overflow:auto; }
.fo-tname { cursor:pointer; display:block; padding:3px 4px; border-radius:4px; font-size:13px; }
.fo-tname:hover { background:#eef4ff; }
.fo-stage { position:relative; height:640px; overflow:hidden; background:#101418; border:1px solid #242b32; border-radius:10px; cursor:grab; }
.fo-stage:active { cursor:grabbing; }
.fo-world { position:absolute; top:0; left:0; transform-origin:0 0; }
.fo-bg { position:relative; }
.fo-bg-svg svg { display:block; }
.fo-layers { position:absolute; inset:0; }
.fo-node { position:absolute; transform:translate(-50%,-50%); }
.fo-chip { background:#1a2026; border:1px solid #2a3138; border-left:3px solid #8f959e; border-radius:6px; padding:4px 8px; font-size:12px; color:#e6e8eb; white-space:nowrap; }
.fo-chip.emp { border-left-color:#3370ff; }
@media (max-width:900px){ .fo-wrap { flex-direction:column; } .fo-tree { width:100%; max-height:none; } .fo-stage { height:420px; } }

/* ===== v16: 顶栏用户菜单 / 权限矩阵 / 鸟瞰 Scope Tabs ===== */
.um-item { padding:9px 14px; font-size:13px; cursor:pointer; display:flex; align-items:center; gap:8px; }
.um-item:hover { background:var(--primary-light); color:var(--primary); }
/* 角色权限勾选矩阵 */
.perm-matrix { display:grid; grid-template-columns:repeat(auto-fill,minmax(170px,1fr)); gap:8px 14px; margin-top:8px; }
.perm-matrix label { display:flex; align-items:center; gap:6px; font-size:13px; color:var(--text-2); cursor:pointer; padding:5px 6px; border-radius:6px; }
.perm-matrix label:hover { background:var(--primary-light); }
.perm-matrix input[type=checkbox] { width:15px; height:15px; accent-color:var(--primary); }
.role-badge { display:inline-block; padding:2px 8px; border-radius:10px; font-size:12px; background:var(--primary-light); color:var(--primary); }
.role-badge.super { background:#fff1f0; color:var(--danger); }
/* 鸟瞰 Scope Tabs */
.scope-tabs { display:inline-flex; background:#f2f3f5; border-radius:8px; padding:3px; gap:2px; }
.scope-tabs .stb { padding:5px 12px; font-size:12.5px; cursor:pointer; border-radius:6px; color:var(--text-2); }
.scope-tabs .stb.on { background:#fff; color:var(--primary); font-weight:600; box-shadow:0 1px 3px rgba(0,0,0,.08); }
/* 个人中心 / 改密 提示 */
.hint-warn { background:var(--warning-bg); border:1px solid var(--warning-bd); color:var(--warning); padding:8px 12px; border-radius:6px; font-size:12.5px; line-height:1.6; }
/* 空状态统一更小的 emoji（避免 .empty 强制 📭 不匹配鸟瞰场景） */
.empty.plain::before { content:''; }

/* ===== V105：货品图片墙 ===== */
.v105-wall { margin-top:6px; }
.v105-drop { border:2px dashed var(--border); border-radius:8px; padding:16px; text-align:center; cursor:pointer; transition:border-color .15s, background .15s; }
.v105-drop:hover { border-color:var(--primary); background:var(--primary-light); }
.v105-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(120px,1fr)); gap:10px; margin-top:10px; }
.v105-cell { position:relative; border:1px solid var(--border); border-radius:8px; overflow:hidden; background:#f7f8fa; aspect-ratio:1; }
.v105-cell.dragging { opacity:.4; border-style:dashed; }
.v105-cell img { width:100%; height:100%; object-fit:cover; display:block; }
.v105-cell-bar { position:absolute; left:0; right:0; bottom:0; display:flex; justify-content:center; gap:4px; background:rgba(0,0,0,.45); padding:3px; opacity:0; transition:opacity .15s; }
.v105-cell:hover .v105-cell-bar { opacity:1; }
.v105-cell-bar button { width:22px; height:22px; line-height:1; border:0; border-radius:4px; cursor:pointer; background:rgba(255,255,255,.9); color:#333; font-size:12px; }
.v105-cell-bar button:disabled { opacity:.4; cursor:not-allowed; }
.v105-cell-bar .v105-del { background:var(--danger); color:#fff; }

/* ===== V105：图纸预览容器 ===== */
#v105PdfBox canvas { display:block; margin:0 auto 10px; }
#v105DxfBox { background:#fff; }


