/* v28.2: 从 index.html 抽出（D1 拆分）—— 全局样式 */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{
  --nav-bg:#1e293b;--nav-bg2:#0f172a;--nav-text:#94a3b8;--nav-active:#3b82f6;
  --bg:#f1f5f9;--card:#ffffff;--border:#e2e8f0;
  --text:#1e293b;--text-mid:#475569;
  /* v30.1 P4: #94a3b8 白底仅 2.56 不达 AA；#5b6779 白卡 5.74 / 浅灰底 5.24 双背景达标 */
  --text-light:#5b6779;
  /* 装饰性弱文字：仅用于不承载信息处 */
  --text-faint:#94a3b8;
  --blue:#3b82f6;--blue-light:#eff6ff;--blue-dark:#1d4ed8;
  --green:#22c55e;--green-light:#f0fdf4;
  --amber:#f59e0b;--amber-light:#fffbeb;
  --red:#ef4444;--red-light:#fef2f2;
  --slate:#64748b;--slate-light:#f8fafc;
  --purple:#8b5cf6;--purple-light:#f5f3ff;
  --bg-light:#f8fafc;
  /* v30.1 P1: 文字/徽标专用语义色（WCAG AA 实测达标）；原 * 色仅用于色块/进度条/图标底色 */
  --blue-text:#1d4ed8;--green-text:#15803d;--amber-text:#a16207;
  --red-text:#b91c1c;--purple-text:#6d28d9;
  --radius:8px;--radius-lg:12px;
  --font:"Microsoft YaHei","Noto Sans CJK SC","PingFang SC",system-ui,sans-serif;
}
html[data-theme="dark"]{
  --bg:#0f172a;--card:#1e293b;--border:#334155;
  --text:#e2e8f0;--text-mid:#94a3b8;
  /* v30.1 P4: 深色下 #64748b 仅 3.07；#94a3b8 在 #1e293b 上 5.71 达标 */
  --text-light:#94a3b8;
  --text-faint:#64748b;
  --blue-light:#1e3a5f;--green-light:#14532d;
  --amber-light:#422006;--red-light:#450a0a;
  --slate-light:#1e293b;--purple-light:#3b0764;--bg-light:#1e293b;
  /* v30.1 P1 深色：语义文字提亮一档（on #1e293b 全部 >=5.2） */
  --blue-text:#60a5fa;--green-text:#4ade80;--amber-text:#fbbf24;
  --red-text:#f87171;--purple-text:#a78bfa;
}
html,body{height:100%;font-family:var(--font);font-size:14px;color:var(--text);background:var(--bg)}
a{color:inherit;text-decoration:none}
#app{display:flex;flex-direction:column;height:100vh;overflow:hidden}
/* v30.13 顶部一级菜单 + 左侧二级菜单 */
#topmenu{height:48px;min-height:48px;background:linear-gradient(90deg,var(--nav-bg),var(--nav-bg2));display:flex;align-items:center;padding:0 16px;gap:14px;color:var(--nav-text);z-index:60;box-shadow:0 1px 4px rgba(0,0,0,.25)}
.tm-actions{margin-left:auto;flex:0 0 auto;display:flex;align-items:center;gap:10px}
.tm-actions .clock{color:#c6d2e0;font-size:13px;font-variant-numeric:tabular-nums}
.tm-actions .icon-btn{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.15);color:#e2e8f0}
.tm-actions .icon-btn:hover{background:rgba(255,255,255,.16)}
.tm-actions .notif-bell:hover{background:rgba(255,255,255,.1)}
.tm-brand{font-size:16px;font-weight:700;color:#fff;white-space:nowrap;letter-spacing:1px;margin-right:6px}
#topmenu-nav{display:flex;gap:2px;overflow-x:auto;flex:1;scrollbar-width:none}
#topmenu-nav::-webkit-scrollbar{display:none}
.tm-item{padding:7px 13px;border-radius:7px;font-size:13.5px;color:var(--nav-text);cursor:pointer;display:flex;align-items:center;gap:7px;white-space:nowrap;transition:all .15s;user-select:none}
.tm-item::before{content:'';width:8px;height:8px;border-radius:50%;flex:0 0 auto;opacity:.85}
.tm-item[data-group="workbench"]::before{background:#7EB8E8}
.tm-item[data-group="execute"]::before{background:#5B9BD5}
.tm-item[data-group="quality"]::before{background:#70C7BA}
.tm-item[data-group="material"]::before{background:#90D4A0}
.tm-item[data-group="trade"]::before{background:#F4B183}
.tm-item[data-group="equipment"]::before{background:#A5D8E8}
.tm-item[data-group="finance"]::before{background:#D4B896}
.tm-item[data-group="system"]::before{background:#B8A9D9}
.tm-item:hover{color:#fff;background:rgba(255,255,255,.06)}
.tm-item.active{color:#fff;background:rgba(59,130,246,.28)}
#app-body{flex:1;display:flex;min-height:0}
#sidebar{width:200px;min-width:200px;background:linear-gradient(180deg,var(--nav-bg),var(--nav-bg2));display:flex;flex-direction:column;color:var(--nav-text)}
.sidebar-header{padding:10px 18px 8px;border-bottom:1px solid rgba(255,255,255,.08)}
.sidebar-header h1{font-size:17px;color:#fff;font-weight:600;margin-bottom:2px;display:flex;align-items:center;gap:8px}
.sidebar-header h1::before{content:'';width:9px;height:9px;border-radius:50%;background:var(--gc,#7EB8E8);flex:0 0 auto}
/* v30.1: 侧栏恒为深底，不能用 --text-light（浅色主题下它是深灰，深底上不可读） */
.sidebar-header p{font-size:11px;color:var(--nav-text)}
.sidebar-nav{flex:1;padding:8px 0;overflow-y:auto}
.nav-group{margin-bottom:2px}
/* v30.1 P2: 去 opacity:.7（实测 3.56/4.04 不达 AA），直接给达标色 #a9b6c6（5.94/7.24） */
/* v30.6/v30.8 借鉴快工单侧栏：分组标题加粗加大、菜单项紧凑小字 */
/* v30.13: 一级菜单移到顶部，侧栏只显示当前组的二级菜单，组标题隐藏 */
.nav-section{display:none}
.nav-section:hover{color:#fff}
.nav-arrow{font-size:10px;transition:transform .2s;width:12px;text-align:center}
.nav-section.open .nav-arrow{transform:rotate(90deg)}
.nav-items{overflow:hidden}
.nav-items.hidden{display:none}
.sidebar-nav a{display:flex;align-items:center;gap:8px;padding:7px 16px 7px 18px;font-size:13px;color:var(--nav-text);cursor:pointer;transition:all .15s;border-left:3px solid transparent}
.sidebar-nav a:hover{background:rgba(255,255,255,.05);color:#e2e8f0}
.sidebar-nav a.active{background:rgba(59,130,246,.12);color:#fff;border-left-color:var(--nav-active)}
.sidebar-nav a .icon{width:15px;text-align:center;font-size:12px}
/* v28.4 三级导航：子模块标签 */
/* v30.1 P2: 去 opacity:.5（11px 小字叠加后不达 AA），用 --nav-text（5.71/6.96 达标） */
.nav-sub{padding:10px 18px 2px 20px;font-size:11px;color:var(--nav-text);letter-spacing:.5px;user-select:none}
.nav-sub:first-child{padding-top:4px}
/* v28.4 8 区配色：功能区标题左侧色点 */
.nav-section::before{content:'';width:8px;height:8px;border-radius:50%;flex:0 0 auto;opacity:.85}
.nav-group[data-group="workbench"] .nav-section::before{background:#7EB8E8}
.nav-group[data-group="execute"] .nav-section::before{background:#5B9BD5}
.nav-group[data-group="quality"] .nav-section::before{background:#70C7BA}
.nav-group[data-group="material"] .nav-section::before{background:#90D4A0}
.nav-group[data-group="trade"] .nav-section::before{background:#F4B183}
.nav-group[data-group="equipment"] .nav-section::before{background:#A5D8E8}
.nav-group[data-group="finance"] .nav-section::before{background:#D4B896}
.nav-group[data-group="system"] .nav-section::before{background:#B8A9D9}
.sidebar-footer{padding:12px 18px;border-top:1px solid rgba(255,255,255,.08);font-size:11px;color:var(--nav-text)}
.sidebar-footer .user{display:flex;align-items:center;gap:8px;cursor:pointer}
.sidebar-footer .avatar{width:28px;height:28px;border-radius:50%;background:var(--nav-active);display:flex;align-items:center;justify-content:center;color:#fff;font-size:12px;font-weight:600}
#main{flex:1;overflow-y:auto;display:flex;flex-direction:column;position:relative}
.topbar{height:46px;min-height:46px;background:var(--card);border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;padding:0 24px;position:sticky;top:0;z-index:50}
.topbar h2{font-size:16px;font-weight:600}
.topbar .actions{display:flex;gap:10px;align-items:center}
.topbar .clock{font-size:13px;color:var(--text-light);font-variant-numeric:tabular-nums}
.content{flex:1;padding:20px 24px;overflow-y:auto}
.view{display:none}.view.active{display:block}
.toolbar{display:flex;gap:6px;align-items:center}
.icon-btn{width:32px;height:32px;border:1px solid var(--border);background:var(--card);border-radius:6px;cursor:pointer;font-size:14px;color:var(--text-mid);display:flex;align-items:center;justify-content:center;transition:all .15s}
.icon-btn:hover{border-color:var(--blue);color:var(--blue)}
.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:18px}
.card-title{font-size:14px;font-weight:600;margin-bottom:14px;display:flex;align-items:center;justify-content:space-between}
.kpi-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:14px;margin-bottom:20px}
.kpi-grid-4{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:20px}
.kpi-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:16px 18px;position:relative;overflow:hidden}
.kpi-card .kpi-label{font-size:12px;color:var(--text-light);margin-bottom:6px}
.kpi-card .kpi-value{font-size:28px;font-weight:700;line-height:1}
.kpi-card .kpi-sub{font-size:11px;color:var(--text-light);margin-top:4px}
/* v30.1 P1: KPI 大字虽属大字号门槛 3.0，但 green 2.28 / amber 2.15 仍不达标，统一改 *-text */
.kpi-card.blue .kpi-value{color:var(--blue-text)}.kpi-card.green .kpi-value{color:var(--green-text)}
.kpi-card.amber .kpi-value{color:var(--amber-text)}.kpi-card.red .kpi-value{color:var(--red-text)}
.kpi-card.slate .kpi-value{color:var(--slate)}
.kpi-card .kpi-icon{position:absolute;top:14px;right:14px;font-size:20px;opacity:.15}
.badge{display:inline-flex;align-items:center;gap:4px;padding:2px 10px;border-radius:99px;font-size:12px;font-weight:500;white-space:nowrap}
.badge::before{content:'';width:6px;height:6px;border-radius:50%}
/* v30.1 P1: 徽标文字统一 *-text 变量（全部 WCAG AA 达标），圆点保留原色块色 */
.badge-blue{background:var(--blue-light);color:var(--blue-text)}.badge-blue::before{background:var(--blue)}
.badge-green{background:var(--green-light);color:var(--green-text)}.badge-green::before{background:var(--green)}
.badge-amber{background:var(--amber-light);color:var(--amber-text)}.badge-amber::before{background:var(--amber)}
.badge-red{background:var(--red-light);color:var(--red-text)}.badge-red::before{background:var(--red)}
.badge-purple{background:var(--purple-light);color:var(--purple-text)}.badge-purple::before{background:var(--purple)}
.badge-slate{background:var(--slate-light);color:var(--slate)}.badge-slate::before{background:var(--slate)}
.btn{display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border:1px solid var(--border);border-radius:var(--radius);font-size:13px;font-family:var(--font);cursor:pointer;transition:all .15s;background:var(--card);color:var(--text)}
.btn:hover{border-color:var(--blue);color:var(--blue)}
.btn-primary{background:var(--blue);color:#fff;border-color:var(--blue)}
.btn-primary:hover{background:var(--blue-dark);color:#fff;border-color:var(--blue-dark)}
.btn-sm{padding:4px 10px;font-size:12px}
.btn-xs{padding:2px 8px;font-size:11px;border-radius:4px}
.btn-danger{background:var(--red);color:#fff;border-color:var(--red)}
.btn-danger:hover{background:#dc2626;color:#fff;border-color:#dc2626}
.btn-success{background:var(--green);color:#fff;border-color:var(--green)}
.btn-success:hover{background:#16a34a;color:#fff;border-color:#16a34a}
.btn[disabled]{opacity:.4;cursor:not-allowed}
.table-wrap{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);overflow:hidden}
table{width:100%;border-collapse:collapse;font-size:13px}
thead{background:var(--slate-light)}
th{padding:10px 14px;text-align:left;font-weight:600;color:var(--text-mid);font-size:12px;white-space:nowrap;border-bottom:1px solid var(--border)}
td{padding:10px 14px;border-bottom:1px solid var(--border);vertical-align:middle}
tr:last-child td{border-bottom:none}
tr:hover td{background:var(--slate-light)}
/* v30.74 数据表框线：.table-wrap 内的表格整格描边（外框沿用容器边框，避免重线） */
.table-wrap th,.table-wrap td{border:1px solid var(--border)}
.table-wrap thead tr th{border-top:0}
.table-wrap tr th:first-child,.table-wrap tr td:first-child{border-left:0}
.table-wrap tr th:last-child,.table-wrap tr td:last-child{border-right:0}
.table-wrap tbody tr:last-child td{border-bottom:0}
/* v30.73/v30.74 用户管理宽表：容器内滚动 + 表头/工号列固定 + 排版优化 */
.table-wrap.tbl-sticky{overflow:auto}
.tbl-sticky table{min-width:1600px}
/* v30.76 行列间距优化：表头 9px/10px，单元格 6px/9px，垂直居中 + 统一行高 */
.tbl-sticky th{padding:9px 10px;vertical-align:middle}
.tbl-sticky td{padding:6px 9px;vertical-align:middle;line-height:1.45}
.tbl-sticky tbody td{white-space:nowrap}
.tbl-sticky tbody tr:nth-child(even) td{background:var(--bg-light)}
.table-wrap.tbl-sticky thead th{position:sticky;top:0;z-index:3;border-bottom:0;background:var(--slate-light);box-shadow:inset 0 -1px 0 var(--border)}
/* v30.76 冻结前两列：工号列定宽 110px(left:0) + 姓名列(left:110px)；斑马纹/悬停背景由原规则按更高优先级自然覆盖 */
.table-wrap.tbl-sticky thead th:nth-child(-n+2){position:sticky;top:0;z-index:4;background:var(--slate-light)}
.table-wrap.tbl-sticky thead th:nth-child(1){left:0}
.table-wrap.tbl-sticky thead th:nth-child(2){left:110px}
.tbl-sticky th:nth-child(1),.tbl-sticky td:nth-child(1){width:110px;min-width:110px;max-width:110px;overflow:hidden;text-overflow:ellipsis}
.tbl-sticky tbody td:nth-child(-n+2){position:sticky;z-index:2;background:var(--card)}
.tbl-sticky tbody td:nth-child(1){left:0}
.tbl-sticky tbody td:nth-child(2){left:110px;box-shadow:1px 0 0 var(--border)}
.tbl-sticky tbody tr:hover td{background:var(--slate-light)}
/* v30.75 地址等长文本：最多两行，超出省略，悬停 title 看全量 */
#view-users .cell-clamp2{max-width:240px;white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:1.4;word-break:break-all}
/* v30.1 P1: 13px 链接 --blue 仅 3.68 不达 AA，改 --blue-text */
.clickable{cursor:pointer;color:var(--blue-text)}.clickable:hover{text-decoration:underline}
.filters{display:flex;gap:12px;margin-bottom:16px;align-items:center;flex-wrap:wrap}
.filters select,.filters input{padding:7px 12px;border:1px solid var(--border);border-radius:var(--radius);font-size:13px;font-family:var(--font);background:var(--card);color:var(--text)}
.filters select:focus,.filters input:focus{outline:none;border-color:var(--blue)}
.progress-bar{width:100%;height:8px;background:var(--border);border-radius:99px;overflow:hidden}
.progress-bar .fill{height:100%;background:var(--blue);border-radius:99px;transition:width .3s}
.progress-bar .fill.green{background:var(--green)}.progress-bar .fill.amber{background:var(--amber)}
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.form-group{display:flex;flex-direction:column;gap:5px}
.form-group.full{grid-column:1/-1}
.form-group label{font-size:13px;font-weight:500;color:var(--text-mid)}
.form-group input,.form-group select,.form-group textarea{padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius);font-size:13px;font-family:var(--font);background:var(--card);color:var(--text)}
.form-actions{margin-top:18px;display:flex;gap:10px;justify-content:flex-end}
.two-col{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-bottom:20px}
.muted{color:var(--text-light)}
.mt-12{margin-top:12px}.mt-16{margin-top:16px}.mt-8{margin-top:8px}
.empty{text-align:center;padding:40px 20px;color:var(--text-light);font-size:13px}
.empty .empty-icon{font-size:40px;margin-bottom:8px;opacity:.5}

/* ===== Process Steps / Timeline ===== */
.process-timeline{display:flex;flex-direction:column;gap:0}
.process-step{border:1px solid var(--border);border-radius:var(--radius-lg);margin-bottom:12px;overflow:hidden;background:var(--card);transition:box-shadow .2s}
.process-step:hover{box-shadow:0 2px 12px rgba(0,0,0,.06)}
.process-step.done{border-left:4px solid var(--green)}
.process-step.active{border-left:4px solid var(--blue);box-shadow:0 0 0 3px rgba(59,130,246,.1)}
.process-step.pending{opacity:.7}
.process-step.rework{border-left:4px solid var(--amber)}
.ps-header{padding:12px 16px;display:flex;align-items:center;justify-content:space-between;cursor:pointer;background:var(--slate-light)}
.ps-header .ps-left{display:flex;align-items:center;gap:10px}
.ps-header .ps-no{width:28px;height:28px;border-radius:50%;background:var(--slate);color:#fff;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex-shrink:0}
.process-step.done .ps-no{background:var(--green)}
.process-step.active .ps-no{background:var(--blue)}
.process-step.rework .ps-no{background:var(--amber)}
.ps-header .ps-name{font-weight:600;font-size:14px}
.ps-header .ps-status{font-size:12px;color:var(--text-light)}
.ps-body{padding:16px;border-top:1px solid var(--border);display:none}
.process-step.open .ps-body{display:block}
.ps-toggle{font-size:12px;color:var(--text-light);transition:transform .2s}
.process-step.open .ps-toggle{transform:rotate(180deg)}

/* ===== Check items ===== */
.check-item{padding:10px 0;border-bottom:1px solid var(--border)}
.check-item:last-child{border-bottom:none}
.check-item .ci-title{font-size:13px;font-weight:500;margin-bottom:6px}
.check-item .ci-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.ci-result-input{flex:1;min-width:120px;padding:6px 10px;border:1px solid var(--border);border-radius:6px;font-size:13px;font-family:var(--font)}
.ci-photo{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border:1px dashed var(--border);border-radius:6px;font-size:12px;cursor:pointer;color:var(--text-mid);background:var(--slate-light)}
.ci-photo:hover{border-color:var(--blue);color:var(--blue)}
/* v30.1 P1: 12px 绿字仅 2.28 不达 AA，文字改 --green-text，边框保留色块色 */
.ci-photo.has-photo{border-style:solid;border-color:var(--green);color:var(--green-text)}
.ci-remark{width:100%;padding:6px 10px;border:1px solid var(--border);border-radius:6px;font-size:12px;font-family:var(--font);margin-top:6px;resize:vertical;min-height:36px}
/* v21.2: 通用「输入+拍照上传」行与缩略图（工单检查项 + 快速报工四区共用） */
.ci-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.ci-thumbs{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.ci-thumb-wrap{position:relative}
.ci-thumb{width:72px;height:72px;object-fit:cover;border-radius:6px;border:1px solid var(--border);cursor:pointer;display:block}
/* v21.6: 提交后灰度锁定——禁用输入框统一灰底浅字，视觉上与可编辑状态明确区分 */
input:disabled,textarea:disabled,select:disabled{background:#f1f5f9;color:#94a3b8;cursor:not-allowed;opacity:1}
.ci-thumb-del{position:absolute;top:-6px;right:-6px;width:18px;height:18px;line-height:16px;text-align:center;background:#dc2626;color:#fff;border-radius:50%;font-size:12px;cursor:pointer;text-decoration:none}

/* ===== Stage blocks ===== */
.stage{margin-top:14px;padding:12px;border:1px solid var(--border);border-radius:8px;background:var(--bg-light)}
.stage-label{font-size:12px;font-weight:600;color:var(--text-mid);margin-bottom:8px;display:flex;align-items:center;gap:6px}
.stage-label .stage-dot{width:8px;height:8px;border-radius:50%}
.stage.pending{opacity:.6}
.stage.done{background:var(--green-light)}
.stage.rework{background:var(--amber-light)}
.stage-actions{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}
.stage-meta{font-size:12px;color:var(--text-light);margin-top:6px}

/* ===== Judge pills ===== */
.judge-group{display:inline-flex;gap:4px}
.judge-pill{padding:4px 12px;border:1px solid var(--border);border-radius:6px;font-size:12px;cursor:pointer;background:var(--card);transition:all .15s}
.judge-pill:hover{border-color:var(--blue)}
.judge-pill.pass.active{background:var(--green);color:#fff;border-color:var(--green)}
.judge-pill.rework.active{background:var(--amber);color:#fff;border-color:var(--amber)}
.judge-pill.scrap.active{background:var(--red);color:#fff;border-color:var(--red)}

/* ===== QR Code ===== */
.qr-box{display:flex;flex-direction:column;align-items:center;gap:8px}
.qr-box img{width:160px;height:160px;border:1px solid var(--border);border-radius:8px;padding:8px;background:#fff}
.qr-box .qr-caption{font-size:12px;color:var(--text-light);text-align:center}

/* ===== Notifications ===== */
.notif-bell{position:relative;cursor:pointer;padding:6px 10px;border-radius:8px;transition:background .15s;font-size:18px}
.notif-bell:hover{background:var(--slate-light)}
.notif-badge{position:absolute;top:2px;right:2px;background:var(--red);color:#fff;font-size:10px;font-weight:600;min-width:16px;height:16px;border-radius:8px;display:flex;align-items:center;justify-content:center;padding:0 4px;line-height:1}
.notif-panel{position:absolute;top:56px;right:24px;width:380px;max-height:480px;background:var(--card);border:1px solid var(--border);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.12);z-index:200;display:none;flex-direction:column;overflow:hidden}
.notif-panel.show{display:flex}
.notif-panel-header{padding:12px 14px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between}
.notif-tabs{display:flex;gap:4px;padding:8px 10px;border-bottom:1px solid var(--border);overflow-x:auto}
.notif-tab{padding:4px 10px;border:none;background:transparent;font-size:12px;color:var(--text-light);cursor:pointer;border-radius:6px;white-space:nowrap}
.notif-tab.active{background:var(--blue-light);color:var(--blue-dark);font-weight:500}
.notif-list{flex:1;overflow-y:auto;max-height:360px}
.notif-item{padding:10px 14px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .15s;position:relative}
.notif-item:hover{background:var(--slate-light)}
.notif-item.unread::before{content:'';position:absolute;left:6px;top:14px;width:6px;height:6px;background:var(--blue);border-radius:50%}
.notif-item.unread{background:var(--blue-light)}
.notif-item .notif-title{font-weight:600;font-size:13px;margin-bottom:2px;padding-left:10px}
.notif-item .notif-content{font-size:12px;color:var(--text-light);line-height:1.5;padding-left:10px}
.notif-item .notif-time{font-size:11px;color:var(--text-light);margin-top:4px;padding-left:10px}
.notif-empty{padding:40px 20px;text-align:center;color:var(--text-light);font-size:13px}

/* ===== Toast ===== */
.toast{position:fixed;top:20px;right:20px;background:#1e293b;color:#fff;padding:12px 20px;border-radius:var(--radius);font-size:13px;z-index:200;transform:translateX(400px);transition:transform .3s;max-width:360px}
.toast.show{transform:translateX(0)}
.toast.success{background:var(--green)}.toast.error{background:var(--red)}

/* ===== Scan modal ===== */
.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.4);display:none;align-items:center;justify-content:center;z-index:100}
.modal-overlay.show{display:flex}
.modal{background:var(--card);border-radius:var(--radius-lg);padding:24px;width:440px;max-width:90vw;box-shadow:0 20px 60px rgba(0,0,0,.15)}
.modal h3{font-size:16px;margin-bottom:16px}
/* v30.75 新增/编辑用户：弹窗加宽 + 三列表单，缩短纵向高度 */
#form-modal.wide .modal{width:860px}
#form-modal.wide .form-grid{grid-template-columns:repeat(3,1fr);gap:12px}
.modal .modal-footer{display:flex;gap:10px;justify-content:flex-end;margin-top:16px}

/* ===== Pool tabs ===== */
.pool-tabs{display:flex;gap:4px;margin-bottom:16px;background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:4px;display:inline-flex}
.pool-tab{padding:6px 16px;border-radius:6px;font-size:13px;cursor:pointer;color:var(--text-mid);transition:all .15s;background:transparent;border:none;font-family:var(--font)}
.pool-tab.active{background:var(--blue);color:#fff;font-weight:500}
.pool-tab .count{margin-left:6px;padding:1px 7px;border-radius:10px;font-size:11px;background:rgba(255,255,255,.25)}
.pool-tab:not(.active) .count{background:var(--slate-light);color:var(--text-mid)}

/* ===== Big screen ===== */
.bigscreen-btn{background:none;border:1px solid var(--border);color:var(--text-mid);padding:6px 12px;border-radius:6px;cursor:pointer;font-size:13px;font-family:var(--font)}
.bigscreen-btn:hover{border-color:var(--blue);color:var(--blue)}
body.bigscreen-mode #sidebar{transform:translateX(-100%);position:fixed}
body.bigscreen-mode .topbar{display:none}
body.bigscreen-mode #topmenu{display:none}
.bigscreen-exit{position:fixed;top:16px;right:16px;z-index:200;background:rgba(0,0,0,.7);color:#fff;border:none;padding:8px 16px;border-radius:8px;cursor:pointer;font-size:13px;font-family:var(--font);display:none}
body.bigscreen-mode .bigscreen-exit{display:block}

/* ===== Mobile ===== */
.mobile-toggle{display:none;position:fixed;top:12px;left:12px;z-index:200;background:#1e293b;color:#fff;border:none;border-radius:8px;width:40px;height:40px;font-size:20px;cursor:pointer}
.overlay-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:99}
@media(max-width:768px){
  .mobile-toggle{display:flex;align-items:center;justify-content:center}
  .overlay-mask.show{display:block}
  #app{flex-direction:column}
  #sidebar{position:fixed;left:0;top:0;bottom:0;z-index:100;transform:translateX(-100%);transition:transform .25s ease;width:240px}
  #sidebar.show{transform:translateX(0)}
  #main{width:100%}
  #topmenu{padding:0 12px 0 58px;height:46px;min-height:46px}
  .topbar{padding:0 16px 0 60px;height:44px;min-height:44px}
  .tm-actions .clock{display:none}
  .content{padding:12px}
  .kpi-grid{grid-template-columns:repeat(2,1fr);gap:10px}
  .two-col{grid-template-columns:1fr;gap:12px}
  .form-grid{grid-template-columns:1fr}
  #form-modal.wide .modal{width:auto;max-width:94vw}
  #form-modal.wide .form-grid{grid-template-columns:1fr}
  .table-wrap{overflow-x:auto}
}

/* ===== v20 登录页 ===== */
#login-gate{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;padding:20px;
  background:linear-gradient(135deg,#0f172a 0%,#1e3a5f 60%,#0f172a 100%)}
#login-gate.hidden{display:none}
.login-card{width:100%;max-width:360px;background:#fff;border-radius:16px;padding:34px 30px 26px;box-shadow:0 24px 70px rgba(0,0,0,.4)}
.login-logo{width:56px;height:56px;margin:0 auto 14px;border-radius:14px;background:linear-gradient(135deg,#3b82f6,#1e293b);
  color:#fff;display:flex;align-items:center;justify-content:center;font-size:24px;font-weight:800;letter-spacing:1px}
.login-card h2{text-align:center;font-size:20px;margin:0 0 2px}
.login-sub{text-align:center;font-size:12px;color:#64748b;margin-bottom:22px}

/* ===== v30.6 借鉴快工单列表样式：工序进度环 + 优先级徽章 + KPI/快捷筛选 ===== */
/* 单号列：单号在上，优先级/延期徽章在下 */
.cell-no{display:flex;flex-direction:column;gap:2px;align-items:flex-start;min-width:96px}
.cell-no .clickable{font-weight:600}
.prio-chip{display:inline-flex;align-items:center;gap:4px;font-size:10px;line-height:1.5;padding:0 7px;border-radius:99px;font-weight:500;white-space:nowrap}
.prio-chip::before{content:'';width:5px;height:5px;border-radius:50%;background:currentColor}
.prio-chip.red{background:var(--red-light);color:var(--red-text)}
.prio-chip.slate{background:var(--slate-light);color:var(--slate)}
/* 工序进度详情列：每道工序一个小环形进度 + 工序名 + 百分比 */
.step-rings{display:flex;gap:5px;overflow-x:auto;max-width:600px;padding:2px 0 3px;scrollbar-width:thin}
.step-ring-item{display:flex;flex-direction:column;align-items:center;min-width:32px;flex:0 0 auto}
.step-ring-item .sr-name{font-size:10px;color:var(--text-mid);white-space:nowrap;line-height:1.25}
.step-ring-item .sr-pct{font-size:9px;color:var(--text-light);line-height:1.2;font-variant-numeric:tabular-nums}
.step-ring-item.confirmed .sr-name{color:var(--green-text)}
.step-ring-item.rework .sr-name,.step-ring-item.scrapped .sr-name{color:var(--red-text)}
/* 工单池顶部 KPI（总计划数/实际生产数） */
.pool-kpis{display:flex;gap:12px;margin-bottom:12px;flex-wrap:wrap}
.pool-kpi{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:12px 18px;min-width:170px}
.pool-kpi .pk-label{font-size:12px;color:var(--text-light);margin-bottom:4px}
.pool-kpi .pk-value{font-size:24px;font-weight:700;line-height:1.1;color:var(--slate)}
.pool-kpi.green .pk-value{color:var(--green-text)}
.pool-kpi .pk-sub{font-size:11px;color:var(--text-faint);margin-top:3px}
/* 快捷视图 chips（七天到期/急单/本月订单/待生产） */
.quick-chips{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.quick-chip{display:inline-flex;align-items:center;gap:5px;padding:5px 12px;border:1px solid var(--border);border-radius:99px;background:var(--card);font-size:12px;font-family:var(--font);color:var(--text-mid);cursor:pointer;transition:all .15s}
.quick-chip:hover{border-color:var(--blue);color:var(--blue)}
.quick-chip.active{background:var(--blue);border-color:var(--blue);color:#fff;font-weight:500}
.quick-chip span{font-size:11px;padding:0 6px;border-radius:9px;background:var(--slate-light);color:var(--text-mid)}
.quick-chip.active span{background:rgba(255,255,255,.25);color:#fff}
.login-card .form-group{margin-bottom:14px}
.login-card label{display:block;font-size:12.5px;color:#475569;margin-bottom:5px;font-weight:600}
.login-card input{width:100%;padding:10px 12px;border:1px solid #cbd5e1;border-radius:8px;font-size:14px;box-sizing:border-box;font-family:var(--font)}
.login-card input:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px rgba(59,130,246,.15)}
#lg-btn{width:100%;padding:11px;border:none;border-radius:8px;background:#2563eb;color:#fff;font-size:15px;font-weight:600;cursor:pointer;margin-top:4px;font-family:var(--font)}
#lg-btn:disabled{opacity:.6;cursor:wait}
#lg-error{color:#dc2626;font-size:12.5px;min-height:18px;margin:2px 0 6px;text-align:center}
.login-hint{margin-top:18px;padding:10px;background:#f1f5f9;border-radius:8px;font-size:11.5px;color:#64748b;line-height:1.7}
.login-ver{text-align:center;font-size:11px;color:#94a3b8;margin-top:12px}
.logout-btn{margin-top:10px;width:100%;padding:6px;border:1px solid rgba(255,255,255,.18);background:transparent;color:#cbd5e1;border-radius:7px;font-size:12px;cursor:pointer;font-family:var(--font)}
.logout-btn:hover{background:rgba(255,255,255,.08);color:#fff}

/* v30.11.1 页内打印区：替代 window.open+document.write（现代浏览器切断弹窗句柄导致空白页） */
#print-area{display:none}
@media print{
  body.printing>*:not(#print-area){display:none!important}
  body.printing #print-area{display:block!important;margin:0;padding:0}
  #print-area h1{font-size:20px;border-bottom:2px solid #1890ff;padding-bottom:8px;margin-bottom:16px;color:#333}
  #print-area table{width:100%;border-collapse:collapse;margin-bottom:16px}
  #print-area td{border:1px solid #ddd;padding:6px 10px;font-size:13px;color:#333}
  #print-area td.k{background:#f5f5f5;font-weight:600;width:90px;white-space:nowrap}
  #print-area .qr-box{text-align:center;margin-top:16px}
  #print-area .qr-box img{border:1px solid #ddd;padding:8px;border-radius:4px}
  #print-area .qr-box div{font-size:12px;color:#999;margin-top:6px}
  #print-area .footer{margin-top:24px;text-align:right;font-size:11px;color:#999}
}

/* v30.11.2 工单进度圆圈流：完成=绿底白✓，在制=蓝圈+完成度，未开工=灰圈0%，逾期单每圈右上角红底白"逾" */
.step-flow{display:flex;align-items:flex-start;max-width:100%;overflow-x:auto;padding:10px 2px 2px}
.sf-item{display:flex;flex-direction:column;align-items:center;flex:none;width:52px}
.sf-circle{position:relative;width:40px;height:40px;border-radius:50%;border:3px solid #cbd5e1;background:#fff;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;color:#94a3b8;box-sizing:border-box}
.sf-item.done .sf-circle{border-color:var(--green);background:var(--green);color:#fff}
.sf-item.doing .sf-circle{border-color:var(--blue);color:var(--blue)}
.sf-check{font-size:18px;line-height:1}
.sf-overdue{position:absolute;top:-9px;right:-9px;width:18px;height:18px;border-radius:50%;background:#ef4444;color:#fff;font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center;border:2px solid #fff;box-sizing:border-box}
/* v30.42 加急订单圆圈右上角橙底白"急"（逾期红"逾"优先，定位复用 .sf-overdue） */
.sf-urgent{position:absolute;top:-9px;right:-9px;width:18px;height:18px;border-radius:50%;background:#f59e0b;color:#fff;font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center;border:2px solid #fff;box-sizing:border-box}
.sf-name{margin-top:4px;font-size:11px;color:var(--text-mid);white-space:nowrap}
.sf-line{flex:1;min-width:10px;height:2px;background:#cbd5e1;margin-top:19px}
/* v30.11.3 圆圈可点击（打开工序详情）+ 详情定位高亮 */
.sf-item{transition:transform .15s}
.sf-item:hover{transform:translateY(-2px)}
.sf-item:hover .sf-circle{box-shadow:0 2px 8px rgba(59,130,246,.35)}
/* v30.43 在制工单全工序一行：占满剩余宽度，工序过长时显示可见横向滚动条（下方拖拽条）并支持按住拖动 */
.step-flow{flex:1 1 auto;min-width:0;cursor:grab;padding-bottom:10px;scrollbar-width:thin;scrollbar-color:#cbd5e1 var(--bg-light)}
.step-flow.dragging{cursor:grabbing;user-select:none}
.step-flow::-webkit-scrollbar{height:9px}
.step-flow::-webkit-scrollbar-track{background:var(--bg-light);border-radius:999px}
.step-flow::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:999px}
.step-flow::-webkit-scrollbar-thumb:hover{background:#94a3b8}
.process-step.flash{animation:stepFlash 1.8s ease}
@keyframes stepFlash{0%,60%{box-shadow:0 0 0 3px rgba(59,130,246,.55);border-radius:10px}100%{box-shadow:none}}

/* ============================ 工单二维码打印样式（v30.64） ============================ */
@media print {
  /* 只打印二维码预览区，隐藏侧栏/通知/其他视图 */
  .sidebar, .sidebar-header, .sidebar-nav, .sidebar-footer,
  #notif-panel, #toast-container, .modal-mask,
  .view:not(#view-qrcodes),
  #view-qrcodes > .card > .card-title,
  #view-qrcodes > .card > .filters,
  #view-qrcodes > .card > #qc-order-list { display:none !important; }
  #main { margin:0 !important; padding:0 !important; width:100% !important; }
  #view-qrcodes { display:block !important; padding:0 !important; }
  #view-qrcodes > .card { max-width:100% !important; box-shadow:none !important; border:none !important; padding:0 !important; }
  #qc-preview { display:grid !important; grid-template-columns:repeat(2,1fr) !important; gap:10px !important; }
  #qc-preview > div { break-inside:avoid; page-break-inside:avoid; }
  body { background:#fff !important; }
  @page { margin:10mm; size:A4 portrait; }
}
/* 打印时保留背景色和边框（Chrome/Edge） */
#qc-preview > div { -webkit-print-color-adjust:exact; print-color-adjust:exact; }
