
/* ========== 主题 1/6 · 晨雾蓝（默认） ========== */
:root,[data-theme="mist"]{
  --body-bg:#D8DBE1;
  --bg:#F0F1F3; --surface:#FFFFFF; --subtle:#F7F8FA; --hover:#EFF1F4; --active:#EAF1FA;
  --border:#E3E5E9; --rowborder:#F0F1F3;
  --t1:#1D2129; --t2:#4E5969; --t3:#8A9099; --t4:#C9CDD4;
  --pri:#3B7DD8; --pri-d:#2F66B2; --onpri:#FFFFFF;
  --pri-bg:#EAF1FA; --pri-fg:#2F66B2;
  --ok:#2FA36B; --ok-bg:#E8F5EE; --ok-fg:#1F7A4D;
  --warn:#D9881F; --warn-bg:#FBF1E3; --warn-fg:#B4741A;
  --up:#D0453B; --gray-bg:#F2F3F5; --gray-fg:#4E5969;
  --ava-bg:#DFE3E8; --ava-fg:#5A6472;
  --track:#EEF0F3; --bar1:#C9DDF3;
  --r-s:6px; --r-m:8px; --r-l:12px;
  --shadow:0 1px 2px rgba(16,24,40,.05);
}
/* ========== 主题 2/6 · 极夜墨（暗色，夜间/车间大屏） ========== */
[data-theme="ink"]{
  --body-bg:#0B0D10;
  --bg:#14171A; --surface:#23272D; --subtle:#2A2F36; --hover:#31363D; --active:#1E2E45;
  --border:#33393F; --rowborder:#2C3137;
  --t1:#E8EAED; --t2:#A8AFB8; --t3:#7A828C; --t4:#565D66;
  --pri:#5B93E8; --pri-d:#8FB4F2; --onpri:#101419;
  --pri-bg:#1E2E45; --pri-fg:#8FB4F2;
  --ok:#3FBF87; --ok-bg:#16302A; --ok-fg:#5FD1A0;
  --warn:#E0A03A; --warn-bg:#33291A; --warn-fg:#E8B25A;
  --up:#E8554B; --gray-bg:#2A2F36; --gray-fg:#A8AFB8;
  --ava-bg:#33383F; --ava-fg:#A8AFB8;
  --track:#2A2F36; --bar1:#2E4A6E;
  --shadow:0 1px 2px rgba(0,0,0,.45);
}
/* ========== 主题 3/6 · 暖砂米（最柔和，久看不累） ========== */
[data-theme="sand"]{
  --body-bg:#DED2BF;
  --bg:#F3EEE4; --surface:#FFFDF9; --subtle:#FAF6EF; --hover:#F2ECE1; --active:#F7EBD9;
  --border:#E6DCCB; --rowborder:#F2ECE1;
  --t1:#332A1F; --t2:#6B5B49; --t3:#9C8B76; --t4:#C4B6A2;
  --pri:#B5762F; --pri-d:#8F5B21; --onpri:#FFFFFF;
  --pri-bg:#F7EBD9; --pri-fg:#8F5B21;
  --ok:#4F8A54; --ok-bg:#EAF3E9; --ok-fg:#3D7042;
  --warn:#C1791B; --warn-bg:#F9EEDC; --warn-fg:#96601A;
  --up:#C4453A; --gray-bg:#F2ECE1; --gray-fg:#6B5B49;
  --ava-bg:#EDE2D2; --ava-fg:#7A6A56;
  --track:#EDE5D8; --bar1:#E3CDA9;
  --shadow:0 1px 2px rgba(60,40,10,.06);
}
/* ========== 主题 4/6 · 青竹绿 ========== */
[data-theme="jade"]{
  --body-bg:#CFDAD3;
  --bg:#EDF3F0; --surface:#FFFFFF; --subtle:#F6F9F8; --hover:#EBF1EE; --active:#E3F0EA;
  --border:#D9E4DE; --rowborder:#EFF4F2;
  --t1:#1A2A25; --t2:#4F625B; --t3:#8A9A93; --t4:#BFCBC5;
  --pri:#2E8B6F; --pri-d:#226553; --onpri:#FFFFFF;
  --pri-bg:#E3F0EA; --pri-fg:#226553;
  --ok:#2E8B6F; --ok-bg:#E3F0EA; --ok-fg:#226553;
  --warn:#C98A22; --warn-bg:#FBF1DF; --warn-fg:#9A6A15;
  --up:#C94037; --gray-bg:#EFF4F2; --gray-fg:#4F625B;
  --ava-bg:#DDE8E3; --ava-fg:#55766A;
  --track:#E7EFEB; --bar1:#BEDDD1;
  --shadow:0 1px 2px rgba(16,40,32,.05);
}
/* ========== 主题 5/6 · 石墨灰（无彩色，极致克制） ========== */
[data-theme="graphite"]{
  --body-bg:#D5D7D9;
  --bg:#EEF0F1; --surface:#FFFFFF; --subtle:#F7F8F8; --hover:#EBECEE; --active:#E8EAEC;
  --border:#DEE0E2; --rowborder:#F0F1F2;
  --t1:#1A1C1E; --t2:#4E5257; --t3:#8A8F95; --t4:#C4C8CC;
  --pri:#4A5058; --pri-d:#333940; --onpri:#FFFFFF;
  --pri-bg:#E8EAEC; --pri-fg:#333940;
  --ok:#3D7A5A; --ok-bg:#E7F0EB; --ok-fg:#2F6247;
  --warn:#8A6A2E; --warn-bg:#F4EEDF; --warn-fg:#6E5322;
  --up:#A6423A; --gray-bg:#EFF0F1; --gray-fg:#4E5257;
  --ava-bg:#DFE1E3; --ava-fg:#5A5F65;
  --track:#EAEBED; --bar1:#CDCFD2;
  --shadow:0 1px 2px rgba(16,24,40,.05);
}
/* ========== 主题 6/6 · 暮山紫 ========== */
[data-theme="violet"]{
  --body-bg:#D7D2E2;
  --bg:#F2F1F7; --surface:#FFFFFF; --subtle:#F9F8FB; --hover:#F0EEF5; --active:#EDE9F6;
  --border:#E1DDEA; --rowborder:#F2F0F7;
  --t1:#221C33; --t2:#574C6E; --t3:#8D84A3; --t4:#C2BCD1;
  --pri:#7A5FB0; --pri-d:#63499A; --onpri:#FFFFFF;
  --pri-bg:#EDE9F6; --pri-fg:#63499A;
  --ok:#3D8B68; --ok-bg:#E7F2EC; --ok-fg:#2F6E52;
  --warn:#B8802A; --warn-bg:#F8EEDC; --warn-fg:#8F6417;
  --up:#C0405A; --gray-bg:#F2F0F7; --gray-fg:#574C6E;
  --ava-bg:#E4DFEE; --ava-fg:#63577A;
  --track:#EDEBF4; --bar1:#D3C9E8;
  --shadow:0 1px 2px rgba(24,16,40,.05);
}
/* ========== 换肤器 ========== */
.themes{margin-left:auto;display:flex;align-items:center;gap:4px;background:#2B2F36;border-radius:8px;padding:4px}
.swatch{width:26px;height:26px;border-radius:7px;display:grid;place-items:center;font-size:11px;font-weight:700;
  color:#fff;border:2px solid transparent;transition:transform .12s}
.swatch:hover{transform:translateY(-1px)}
.swatch.on{border-color:#fff}
/* 侧栏底部主题皮肤 */
.themes-side{display:flex;gap:6px;flex-wrap:wrap}
.sfoot .swatch.on{border-color:var(--t1);box-shadow:0 0 0 1px var(--t1)}
.theme-name{color:#B8BDC6;font-size:12px;min-width:96px}
*{margin:0;padding:0;box-sizing:border-box}
body{background:var(--body-bg);font-family:"Noto Sans SC","PingFang SC","Microsoft YaHei",sans-serif;color:var(--t1);
  -webkit-font-smoothing:antialiased;font-variant-numeric:tabular-nums;}
button{font-family:inherit;cursor:pointer;border:none;background:none}
/* ========== 原型工具条 ========== */
.proto-bar{flex-wrap:wrap;position:fixed;top:0;left:0;right:0;height:52px;background:#1D2129;display:flex;align-items:center;
  gap:16px;padding:0 20px;z-index:99}
.proto-bar b{color:#fff;font-size:14px;font-weight:600}
.proto-bar span{color:#8A9099;font-size:12px}
.seg{display:flex;background:#2B2F36;border-radius:8px;padding:3px}
.seg button{color:#B8BDC6;font-size:13px;padding:5px 16px;border-radius:6px}
.seg button.on{background:var(--pri);color:var(--onpri)}
/* ========== PC ========== */
#pc{display:none;padding-top:52px;height:100vh}
#pc.show{display:flex}
.side{width:216px;background:var(--surface);border-right:1px solid var(--border);display:flex;flex-direction:column;
  padding:12px;gap:8px;flex-shrink:0}
.brand{display:flex;align-items:center;gap:10px;height:44px;padding:0 8px}
.mark{width:28px;height:28px;border-radius:8px;background:var(--pri);display:grid;place-items:center;
  color:var(--onpri);font-size:15px;font-weight:700}
.brand b{font-size:15px;font-weight:600}
.gsearch{display:flex;align-items:center;gap:8px;height:34px;background:var(--bg);border-radius:var(--r-m);padding:0 10px;
  color:var(--t3);font-size:13px}
.nav{flex:1;overflow-y:auto;padding-top:4px}
.ng{margin-bottom:2px}
.ni{display:flex;align-items:center;gap:10px;height:36px;padding:0 10px;border-radius:var(--r-m);font-size:14px;
  color:var(--t1);width:100%;text-align:left;transition:background .12s;position:relative}
.ni:hover{background:var(--hover)}
.ni.on{background:var(--active);color:var(--pri-d);font-weight:600}
.ni.on::before{content:'';position:absolute;left:-12px;top:7px;bottom:7px;width:3px;border-radius:0 3px 3px 0;
  background:var(--gc,var(--pri))}
.ni svg{width:16px;height:16px;flex-shrink:0;color:var(--gc,var(--t2));opacity:.9}
.ni.on svg{opacity:1}
/* 第二行小字（表格/卡片里用；原来和侧边栏的折叠子菜单共用了 .sub，
   而 .sub 被写成 display:none → BOM 列表的「版本·状态」「产品·规格」、用料面板的编码全都没显示出来） */
.sub{font-size:12px;color:var(--t3);line-height:1.5;margin-top:2px}
/* 侧边栏模块下的子菜单：仅这一处折叠时隐藏 */
.ng > .sub{display:none;flex-direction:column;gap:2px;padding:4px 0;margin-top:0;color:inherit;font-size:inherit}
.ng.open > .sub{display:flex}
.si{height:30px;padding:0 8px;border-radius:var(--r-s);font-size:13px;color:var(--t2);text-align:left;width:100%}
.si:hover{background:var(--hover)}
.si.on{background:var(--bg);color:var(--t1);font-weight:500}
.quick{padding:0 0 4px}
.quick small{display:block;font-size:11px;color:var(--t4);margin-bottom:8px;padding-left:2px}
.qrow{display:flex;gap:6px}
.qrow button{flex:1;height:30px;background:var(--bg);border-radius:var(--r-m);font-size:12px;color:var(--t2)}
.qrow button:hover{background:var(--hover)}
.user{display:flex;align-items:center;gap:10px;height:44px;background:var(--subtle);border-radius:var(--r-m);padding:0 8px}
.ava{width:28px;height:28px;border-radius:50%;background:var(--ava-bg);display:grid;place-items:center;color:var(--ava-fg);font-size:13px}
.user b{font-size:13px;font-weight:500;display:block}
.user small{font-size:11px;color:var(--t3)}
.main{flex:1;display:flex;flex-direction:column;min-width:0}
.top{height:56px;background:var(--surface);border-bottom:1px solid var(--border);display:flex;align-items:center;
  gap:10px;padding:0 24px;flex-shrink:0}
.crumb{font-size:13px;color:var(--t3);display:flex;align-items:center}
.crumb .gbar{width:3px;height:15px;border-radius:2px;background:var(--gc,var(--pri));margin-right:10px;flex-shrink:0}
.crumb em{font-style:normal;color:var(--t1);font-size:15px;font-weight:600}
.crumb i{font-style:normal;margin:0 6px;color:var(--t4)}
.top .sp{flex:1}
.top .date{font-size:13px;color:var(--t3)}
.tbtn{height:32px;padding:0 10px;background:var(--bg);border-radius:var(--r-m);font-size:13px;color:var(--t2);
  display:flex;align-items:center;gap:6px}
.ibtn{width:32px;height:32px;background:var(--bg);border-radius:var(--r-m);display:grid;place-items:center;color:var(--t2)}
.content{flex:1;overflow-y:auto;padding:24px}
/* 卡片 / 指标 */
.row{display:flex;gap:16px;margin-bottom:16px}
.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:20px}
.card h3{font-size:15px;font-weight:600;display:flex;align-items:baseline;gap:8px}
.card h3 small{font-size:12px;color:var(--t3);font-weight:400}
.card h3 .lnk{margin-left:auto;font-size:12px;color:var(--pri);font-weight:400;cursor:pointer}
.kpis{display:flex;gap:16px;margin-bottom:16px}
.kpi{flex:1;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:16px;
  display:flex;flex-direction:column;justify-content:space-between;height:104px}
.kpi label{font-size:13px;color:var(--t3)}
.kpi b{font-size:26px;font-weight:700}
.kpi span{font-size:12px}
.c-up{color:var(--up)} .c-down{color:var(--ok)} .c-blue{color:var(--pri)} .c-warn{color:var(--warn)}
/* 图表 */
.chart{display:flex;align-items:flex-end;gap:33px;height:180px;margin-top:18px;padding-bottom:2px;
  border-bottom:1px solid var(--border)}
.bar{flex:1;background:var(--bar1);border-radius:4px 4px 0 0;position:relative}
.bar.hi{background:var(--pri)}
/* 待办 */
.todo{width:360px;flex-shrink:0;display:flex;flex-direction:column;gap:8px}
.titem{display:flex;align-items:center;gap:10px;height:40px;background:var(--subtle);border-radius:var(--r-m);padding:0 10px}
.titem .dot{width:6px;height:6px;border-radius:50%;background:var(--t4);flex-shrink:0}
.titem .dot.b{background:var(--pri)} .titem .dot.o{background:var(--warn)}
.titem p{flex:1;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.titem time{font-size:12px;color:var(--t3)}
/* 进度 */
.pg{margin-bottom:16px}
.pg .hd{display:flex;justify-content:space-between;font-size:13px;margin-bottom:8px}
.pg .hd b{font-weight:400}
.pg .hd span{color:var(--t2);font-weight:500}
.track{height:6px;background:var(--track);border-radius:3px;overflow:hidden}
.fill{height:100%;background:var(--pri);border-radius:3px}
/* 工具栏 + 表格 */
.toolbar{display:flex;align-items:center;gap:12px;margin-bottom:16px}
.fsearch{display:flex;align-items:center;gap:8px;width:260px;height:34px;background:var(--surface);
  border:1px solid var(--border);border-radius:var(--r-m);padding:0 10px;color:var(--t3);font-size:13px}
.chip{height:32px;padding:0 12px;border-radius:var(--r-m);font-size:13px;color:var(--t2);
  background:var(--surface);border:1px solid var(--border)}
.chip.on{background:var(--active);border-color:transparent;color:var(--pri-d);font-weight:500}
.primary{height:34px;padding:0 14px;border-radius:var(--r-m);background:var(--pri);color:var(--onpri);font-size:13px;
  font-weight:500;display:flex;align-items:center;gap:6px;margin-left:auto}
.primary:hover{background:var(--pri-d)}
table{width:100%;border-collapse:separate;border-spacing:0;background:var(--surface);
  border:1px solid var(--border);border-radius:var(--r-l)}
th{background:var(--subtle);font-size:12px;font-weight:400;color:var(--t3);text-align:left;padding:14px 16px;
  white-space:nowrap;position:sticky;top:0;z-index:2;border-bottom:1px solid var(--border)}
@supports (background:color-mix(in srgb,red 5%,blue)){
  th{background:color-mix(in srgb,var(--gc,#8A9099) 7%,var(--subtle))}}
th:first-child{border-top-left-radius:var(--r-l)}
th:last-child{border-top-right-radius:var(--r-l)}
td{font-size:13.5px;line-height:1.6;padding:14px 16px;border-bottom:1px solid var(--rowborder);color:var(--t1)}
tbody tr:last-child td{border-bottom:none}
tbody tr:last-child td:first-child{border-bottom-left-radius:var(--r-l)}
tbody tr:last-child td:last-child{border-bottom-right-radius:var(--r-l)}
tbody tr:hover td{background:var(--hover)}
td.num,th.num{text-align:right}
td.num{font-weight:500}
td.money{font-weight:500}
td.dim{color:var(--t2)}
.badge{display:inline-block;padding:3px 8px;border-radius:var(--r-s);font-size:12px;white-space:nowrap}
.b-blue{background:var(--active);color:var(--pri-d)}
.b-orange{background:var(--warn-bg);color:var(--warn-fg);box-shadow:inset 0 0 0 1px var(--warn)}
.b-gray{background:var(--gray-bg);color:var(--gray-fg)}
.b-green{background:var(--ok-bg);color:var(--ok-fg)}
/* 层级：卡片 / 表格统一极淡投影，替代纯 1px 边框 */
.card,.kpi,table,.kcard,.fcard,.mkpi,.mlist,.setnav,.setcard,.fld,.mset,.mcard,.doc .tree,.doc .art,.mpill,.fnote{
  box-shadow:var(--shadow)}
.pager{display:flex;align-items:center;gap:10px;margin-top:16px}
.pager .tot{font-size:13px;color:var(--t3)}
.pager .sp{flex:1}
.pgbtn{width:30px;height:30px;border-radius:var(--r-m);background:var(--surface);border:1px solid var(--border);
  color:var(--t2);font-size:13px}
.pgbtn.on{background:var(--pri);border-color:transparent;color:var(--onpri)}
.pgbtn:disabled{opacity:.4;cursor:not-allowed}
.pgbtn:hover:not(:disabled):not(.on){border-color:var(--pri);color:var(--pri)}
.pgdots{color:var(--t3);padding:0 2px;font-size:13px;align-self:center}
/* 待办「类型」筛选行：急单 / 待产 / 待报工 / 审核 / 验收… */
.tybar{gap:6px;flex-wrap:wrap;margin-top:-6px}
.tybar .chip-sm{height:26px;padding:0 10px;font-size:12px}
.ty-urgent{color:#D84343;font-weight:600}
/* chips 上的数量角标（打印中心：该类单据有多少张） */
.chip .cnt{font-style:normal;margin-left:5px;font-size:11px;opacity:.65}
/* 看板 */
.kanban{display:flex;gap:16px;align-items:flex-start}
.col{flex:1;display:flex;flex-direction:column;gap:12px}
.col h4{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500}
.col h4 .d{width:8px;height:8px;border-radius:50%}
.col h4 small{font-size:12px;color:var(--t3);font-weight:400}
.kcard{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:14px}
.kcard b{display:block;font-size:13px;font-weight:500;margin-bottom:6px}
.kcard p{font-size:12px;color:var(--t3);margin-bottom:8px}
.kcard .ft{font-size:12px;font-weight:500}
/* 通用占位 */
.empty{background:var(--surface);border:1px dashed var(--border);border-radius:var(--r-l);padding:48px;text-align:center}
.empty b{display:block;font-size:15px;margin-bottom:8px}
.empty p{font-size:13px;color:var(--t3);line-height:1.7}
/* ========== 移动端 ========== */
#mb{display:none;padding-top:52px;height:100vh;min-height:100dvh;justify-content:center;align-items:center}
#mb.show{display:flex}
.phone{width:390px;height:780px;background:var(--bg);border-radius:40px;border:10px solid #1D2129;
  overflow:hidden;display:flex;flex-direction:column;position:relative;box-shadow:0 24px 60px rgba(0,0,0,.35)}
#mHome,#mList,#mBoard,#mOut,#mMe{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}
/* 真实窄屏（手机）自动进入移动端并铺满，不再显示手机框 */
@media(max-width:768px){
  body{background:var(--bg);overflow:hidden}
  #topwrap{display:none!important}
  #pc,#pc.show{display:none!important}
  #mb,#mb.show{display:flex!important;padding-top:0;height:100vh;min-height:100dvh;width:100vw;align-items:stretch;justify-content:stretch}
  .phone{width:100vw;height:100vh;height:100dvh;border-radius:0;border:none;box-shadow:none}
}
.mstatus{height:44px;display:flex;align-items:center;padding:0 24px;font-size:14px;font-weight:600;flex-shrink:0}
/* 底部额外留白：避免右下角 AI 悬浮球压住最后几条内容 */
.mbody{flex:1;overflow-y:auto;padding:8px 20px calc(72px + env(safe-area-inset-bottom));display:flex;flex-direction:column;gap:20px;-webkit-overflow-scrolling:touch}
/* 滚动容器内的子项一律不参与压缩：否则内容过长时 chips / 标题行会被 flex 挤扁
   （曾出现 .mchips 被压到 6px 高，筛选按钮只剩一条弧线） */
.mbody > *{flex-shrink:0}
.mhead{display:flex;align-items:center;gap:12px}
.mhead .tt{flex:1}
.mhead .tt b{font-size:20px;font-weight:700;display:block}
.mhead .tt span{font-size:13px;color:var(--t3)}
.mava{width:36px;height:36px;border-radius:50%;background:var(--ava-bg);display:grid;place-items:center;color:var(--ava-fg)}
.mgrid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.mkpi{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:14px}
.mkpi label{font-size:12px;color:var(--t3);display:block;margin-bottom:4px}
.mkpi b{font-size:20px;font-weight:700}
.msec{display:flex;align-items:baseline;justify-content:space-between}
.msec b{font-size:15px;font-weight:600}
.msec span{font-size:12px;color:var(--pri)}
.mlist{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l)}
.mitem{display:flex;align-items:center;gap:10px;height:48px;padding:0 14px}
.mitem + .mitem{border-top:1px solid var(--rowborder)}
.mitem .dot{width:6px;height:6px;border-radius:50%;background:var(--t4)}
.mitem .dot.b{background:var(--pri)} .mitem .dot.o{background:var(--warn)}
.mitem p{flex:1;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mitem time{font-size:12px;color:var(--t3)}
.mtab{flex-shrink:0;padding:12px 12px calc(18px + env(safe-area-inset-bottom))}
.mpill{display:flex;gap:2px;height:62px;background:var(--surface);border:1px solid var(--border);
  border-radius:36px;padding:4px}
.mtab-b{flex:1;border-radius:26px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  font-size:10px;color:var(--t3)}
.mtab-b.on{background:var(--pri);color:var(--onpri)}
.mtab-b svg{width:18px;height:18px}
/* 报工表单 */
.mnav{height:48px;display:flex;align-items:center;gap:8px;padding:0 16px;flex-shrink:0}
.mnav .gbar{width:3px;height:17px;border-radius:2px;background:var(--gc,var(--pri));flex-shrink:0}
.mnav b{font-size:17px;font-weight:600}
.back{width:32px;height:32px;display:grid;place-items:center;color:var(--t1);font-size:20px}
.fcard{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:14px}
.fcard label{font-size:12px;color:var(--t3);display:block;margin-bottom:8px}
.fval{display:flex;align-items:center;gap:8px;font-size:15px;font-weight:500}
.fval span{flex:1}
.fval i{font-style:normal;color:var(--t3)}
.chips{display:flex;gap:8px}
.chips button{flex:1;height:36px;border-radius:var(--r-m);background:var(--surface);border:1px solid var(--border);
  font-size:13px;color:var(--t2)}
.chips button.on{background:var(--pri);border-color:transparent;color:var(--onpri);font-weight:500}
.qty{display:flex;align-items:center;gap:12px}
.qty button{width:36px;height:36px;border-radius:10px;background:var(--bg);color:var(--t2);font-size:18px}
.qty button.plus{background:var(--pri);color:var(--onpri)}
.qty b{flex:1;text-align:center;font-size:28px;font-weight:700}
.fnote{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:14px;height:88px}
.fnote label{font-size:12px;color:var(--t3);display:block;margin-bottom:6px}
.fnote p{font-size:13px;color:var(--t4)}
.photos{display:flex;gap:10px}
.ph{width:72px;height:72px;border-radius:10px;background:var(--bar1)}
.ph.add{background:var(--surface);border:1px dashed var(--t4);display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:4px;color:var(--t3);font-size:11px}
.submit{height:48px;border-radius:var(--r-l);background:var(--pri);color:var(--onpri);font-size:15px;font-weight:600}
.hidden{display:none!important}

/* ========== 模板：设置页 ========== */
.setwrap{display:flex;gap:20px;align-items:flex-start}
.setnav{width:176px;flex-shrink:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:8px}
.setnav button{display:block;width:100%;height:34px;padding:0 12px;border-radius:var(--r-m);font-size:13px;color:var(--t2);text-align:left}
.setnav button.on{background:var(--active);color:var(--pri-d);font-weight:500}
.setpanel{flex:1;min-width:0;max-width:1120px;display:flex;flex-direction:column;gap:12px}
.setcard{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:2px 16px}
.setcard h5{font-size:13px;font-weight:600;padding:12px 0 4px}
/* 设置行改成「标签列 + 值列」的表单排布：值紧跟在标签右侧，不再被推到最右边留一大片空白 */
/* 三列：标签(固定) | 值(自适应) | 操作按钮(固定 34px)
   第三列原来写 minmax(0,1fr)，按钮会被栅格 stretch 拉成一条 700+px 的空框（很难看）。 */
.setrow{display:grid;grid-template-columns:260px minmax(0,1fr) 34px;align-items:center;column-gap:14px;
  padding:12px 0;border-top:1px solid var(--rowborder)}
.setrow:first-of-type{border-top:none}
.setrow .lb{min-width:0}
.setrow .lb b{display:block;font-size:13px;font-weight:500}
.setrow .lb small{display:block;font-size:12px;color:var(--t3);margin-top:3px;line-height:1.6}
.setrow .val{font-size:13px;color:var(--t2);min-width:0;overflow-wrap:anywhere}
.setrow > .sw{grid-column:2}
/* 设置行的编辑按钮：固定 30×30 紧贴值右侧，绝不随栅格拉伸 */
.setrow > .iop{grid-column:3;justify-self:end;width:30px;height:30px;min-width:30px;padding:0;font-size:13px}
/* 值左对齐在中间列内（不再被 auto 列拉伸），超长用省略号，点编辑可看全 */
.setrow .val{justify-self:start;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}
@media (max-width:900px){
  /* 窄屏：标签独占一行，值 + 按钮排第二行 */
  .setrow{grid-template-columns:minmax(0,1fr) 34px;row-gap:6px}
  .setrow .lb{grid-column:1/-1}
  .setrow > .sw{grid-column:2}
}
.sw{width:40px;height:22px;border-radius:11px;background:var(--t4);position:relative;flex-shrink:0;transition:background .15s}
.sw i{position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;background:#fff;transition:left .15s}
.sw.on{background:var(--pri)}
.sw.on i{left:21px}
.perm-wrap{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:180px}
.perm-wrap small{color:var(--t3);line-height:22px}
.perm-tag{display:inline-flex;align-items:center;min-height:22px;padding:0 8px;border-radius:var(--r-s);
  background:var(--gray-bg);color:var(--gray-fg);font-size:12px;line-height:22px;white-space:nowrap}
.perm-tag.money-on{background:var(--ok-bg);color:var(--ok-fg)}
.perm-tag.money-off{background:var(--warn-bg);color:var(--warn-fg)}
.checkgrid{display:flex;gap:8px;flex-wrap:wrap;padding:8px;border:1px solid var(--border);border-radius:var(--r-m);background:var(--subtle)}
.checktag{display:inline-flex;align-items:center;gap:6px;min-height:28px;padding:0 9px;border:1px solid var(--border);
  border-radius:var(--r-s);background:var(--surface);color:var(--t2);font-size:13px;cursor:pointer;user-select:none}
.checktag input{accent-color:var(--pri)}
.checktag:has(input:checked){border-color:var(--pri);background:var(--pri-bg);color:var(--pri-fg)}
.checktag.money:has(input:checked){border-color:var(--ok);background:var(--ok-bg);color:var(--ok-fg)}
/* ========== 模板：表单页 ========== */
.fgrid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.fgrid.one{grid-template-columns:1fr}
.fld{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-m);padding:10px 12px;min-height:58px}
.fld.wide{grid-column:1/-1}
.fld label{display:block;font-size:12px;color:var(--t3);margin-bottom:6px}
.fld .v{font-size:14px}
.fld .v.ph{color:var(--t4)}
.fbar{display:flex;align-items:center;gap:10px;margin-top:16px}
.fbar .sp{flex:1}
.ghost{height:34px;padding:0 14px;border-radius:var(--r-m);border:1px solid var(--border);background:var(--surface);
  color:var(--t2);font-size:13px}
textarea.fld{font-family:inherit;font-size:13px;color:var(--t1);resize:none}
/* ========== 模板：计算器 ========== */
.calc{display:flex;gap:16px;align-items:flex-start}
.calc .in{width:400px;flex-shrink:0}
.calc .out{flex:1;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:20px}
.rline{display:flex;justify-content:space-between;align-items:baseline;padding-bottom:12px;margin-bottom:12px;
  border-bottom:1px solid var(--rowborder)}
.rline span{font-size:13px;color:var(--t2)}
.rline b{font-size:20px;font-weight:700}
.rline.big b{font-size:30px;color:var(--pri)}
.rline:last-child{border-bottom:none;margin-bottom:0;padding-bottom:0}
/* ========== 模板：知识库 ========== */
.doc{display:flex;gap:16px;align-items:flex-start}
.doc .tree{width:240px;flex-shrink:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:10px}
.doc .tree button{display:block;width:100%;height:32px;padding:0 10px;border-radius:var(--r-s);font-size:13px;color:var(--t2);text-align:left}
.doc .tree button.on{background:var(--active);color:var(--pri-d);font-weight:500}
.doc .art{flex:1;min-width:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:24px}
.doc .art h2{font-size:20px;font-weight:700;margin-bottom:6px}
.doc .art .meta{font-size:12px;color:var(--t3);margin-bottom:18px}
.doc .art p{font-size:13px;color:var(--t2);line-height:2;margin-bottom:12px}
.doc .art h4{font-size:14px;font-weight:600;margin:18px 0 8px}
.doc .art ul{margin:0 0 12px 18px}
.doc .art li{font-size:13px;color:var(--t2);line-height:2}
/* ========== 模板：BOM 树形表 ========== */
tr.sub td:first-child{padding-left:36px;color:var(--t2)}
tr.sub td:first-child::before{content:'└ ';color:var(--t4)}
tr.grp td{background:var(--subtle);font-weight:500}
/* ========== 报表 ========== */
.dual{display:flex;gap:16px;margin-bottom:16px}
.dual .card{flex:1}
.legend{display:flex;gap:14px;font-size:12px;color:var(--t3)}
.legend i{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:5px}
/* ========== 通用补充 ========== */
.note{background:var(--subtle);border-radius:var(--r-m);padding:12px 14px;font-size:12px;color:var(--t2);line-height:1.9}
.pill{display:inline-block;height:22px;padding:0 10px;border-radius:11px;font-size:12px;line-height:22px}
.pill.b{background:var(--pri-bg);color:var(--pri-fg)}
.seg2{display:flex;gap:3px;background:var(--bg);border-radius:var(--r-m);padding:3px}
.seg2 button{height:28px;padding:0 14px;border-radius:6px;font-size:13px;color:var(--t2)}
.seg2 button.on{background:var(--surface);color:var(--t1);font-weight:500}
.jump{background:#2B2F36;border:1px solid #3A3F47;color:#B8BDC6;font-size:12px;height:28px;border-radius:6px;padding:0 8px}
.prevnext{display:flex;gap:8px;margin-left:auto}
.pnbtn{height:28px;padding:0 12px;border-radius:6px;background:#2B2F36;color:#B8BDC6;font-size:12px}
/* ========== 移动端补充 ========== */
.mset{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l)}
.mset .r{display:flex;align-items:center;gap:12px;height:50px;padding:0 14px}
.mset .r + .r{border-top:1px solid var(--rowborder)}
.mset .r span{flex:1;font-size:14px}
.mset .r em{font-style:normal;font-size:12px;color:var(--t3)}
.mthemes{display:flex;gap:10px;flex-wrap:wrap}
.mth{width:56px;height:56px;border-radius:14px;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:4px;font-size:11px;color:var(--t2);background:var(--surface);border:1px solid var(--border)}
.mth i{width:20px;height:20px;border-radius:50%;display:block}
.mth.on{border-color:var(--pri);border-width:2px;color:var(--t1);font-weight:500}
.mcard{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:14px;margin-bottom:10px}
.mcard .t{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:6px}
.mcard .t b{font-size:14px;font-weight:500}
.mcard .t em{font-style:normal;font-size:13px;font-weight:500}
.mcard p{font-size:12px;color:var(--t3);line-height:1.8}

/* ===== 全局搜索（Ctrl+K） ===== */
.smask{position:fixed;inset:0;background:rgba(16,20,26,.45);z-index:80;display:none}
.smask.on{display:block}
.spanel{position:fixed;left:50%;top:86px;transform:translateX(-50%);width:560px;max-width:92vw;background:var(--surface);
  border:1px solid var(--border);border-radius:14px;box-shadow:0 18px 48px rgba(16,24,40,.22);z-index:81;display:none;overflow:hidden}
.spanel.on{display:block}
.sbox{display:flex;align-items:center;gap:10px;height:52px;padding:0 16px;border-bottom:1px solid var(--border)}
.sbox input{flex:1;border:0;outline:0;background:transparent;font-size:15px;color:var(--t1);font-family:inherit}
.sbox input::placeholder{color:var(--t4)}
.sres{max-height:360px;overflow-y:auto;padding:8px}
.sitem{display:flex;align-items:center;gap:10px;height:44px;padding:0 12px;border-radius:var(--r-m);cursor:pointer}
.sitem.on{background:var(--hover)}
.sitem .k{width:18px;text-align:center;color:var(--t3);font-size:13px}
.sitem b{font-size:14px;font-weight:500}
.sitem .g{font-size:12px;color:var(--t3);margin-left:6px}
.sitem .tag{margin-left:auto;font-size:11px;color:var(--t3);background:var(--gray-bg);padding:2px 7px;border-radius:var(--r-s)}
.sitem mark{background:var(--active);color:var(--pri-d);border-radius:2px;padding:0 1px}
.sempty{padding:30px;text-align:center;color:var(--t4);font-size:13px;line-height:1.8}
.sfoot2{display:flex;justify-content:space-between;align-items:center;height:38px;padding:0 16px;
  border-top:1px solid var(--border);background:var(--subtle);font-size:11px;color:var(--t4)}
/* ===== 项目全景 · 全流程时间线 ===== */
.stages{display:flex;margin:20px 0 6px}
.stage{flex:1;text-align:center;position:relative}
.stage::before{content:'';position:absolute;top:7px;left:-50%;width:100%;height:2px;background:var(--track);z-index:0}
.stage:first-child::before{display:none}
.stage.done::before{background:var(--ok)}
.stage .dot{position:relative;z-index:1;width:16px;height:16px;border-radius:50%;margin:0 auto 10px;
  background:var(--surface);border:2px solid var(--track)}
.stage.done .dot{background:var(--ok);border-color:var(--ok)}
.stage.doing .dot{background:var(--pri);border-color:var(--pri);box-shadow:0 0 0 4px var(--active)}
.stage b{display:block;font-size:13px;font-weight:500;margin-bottom:3px}
.stage.todo b{color:var(--t4)}
.stage span{display:block;font-size:11px;color:var(--t3)}
.stage small{font-size:11px;color:var(--t4)}
.tllog{margin-top:4px}
.tllog .li{display:flex;gap:14px;padding:12px 2px;border-bottom:1px solid var(--rowborder)}
.tllog .li:last-child{border-bottom:0}
.tllog time{width:84px;flex-shrink:0;font-size:12px;color:var(--t3);padding-top:2px}
.tllog .dot{width:8px;height:8px;border-radius:50%;background:var(--track);flex-shrink:0;margin-top:6px}
.tllog .li.hi .dot{background:var(--pri)}
.tllog p{flex:1;font-size:13px;line-height:1.6}
.tllog p i{font-style:normal;color:var(--t3);font-size:12px;margin-left:8px}
/* ===== 侧栏底部分层 ===== */
.sfoot{border-top:1px solid var(--border);padding-top:8px;margin-top:2px;flex-shrink:0}
/* ===== 移动端：角色 Tab + 悬浮动作 + 时间线 ===== */
.mtab{position:relative;flex-shrink:0;padding:12px 12px calc(18px + env(safe-area-inset-bottom))}
.mpill{padding:0 4px}
.mfab{position:absolute;left:50%;transform:translateX(-50%);top:-16px;width:54px;height:54px;border-radius:50%;
  background:var(--pri);color:var(--onpri);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  font-size:10px;box-shadow:0 4px 12px rgba(16,24,40,.22);z-index:6}
.mfab svg{width:20px;height:20px}
.mroles{display:flex;gap:8px;margin-bottom:4px}
.mroles button{flex:1;height:34px;border-radius:var(--r-m);background:var(--bg);font-size:12px;color:var(--t2)}
.mroles button.on{background:var(--active);color:var(--pri-d);font-weight:600}
.mchips{display:flex;gap:8px;overflow-x:auto;padding:2px 0 4px;scrollbar-width:none}
.mchips::-webkit-scrollbar{display:none}
.mchips button{flex-shrink:0;height:30px;padding:0 12px;border-radius:15px;background:var(--bg);font-size:12px;color:var(--t2)}
.mchips button.on{background:var(--active);color:var(--pri-d);font-weight:500}
/* 移动端进度条（工作台生产进度/零售进度） */
.mprog{margin-bottom:10px}
.mprog:last-child{margin-bottom:0}
.mprog-hd{display:flex;justify-content:space-between;font-size:13px;margin-bottom:4px}
.mprog-hd b{font-weight:500}
.mprog-hd span{font-size:12px;color:var(--t3)}
.mprog-track{height:7px;border-radius:4px;background:var(--bg);overflow:hidden}
.mprog-track i{display:block;height:100%;border-radius:4px;background:var(--pri)}
/* 移动端成本页/左右布局在窄屏下堆叠 */
@media(max-width:768px){.calc{flex-direction:column}.calc .in{width:100%}}
.mtl{padding:4px 2px}
.mstage{display:flex;gap:12px}
.mstage .md{width:12px;display:flex;flex-direction:column;align-items:center;flex-shrink:0}
.mstage .md i{width:10px;height:10px;border-radius:50%;background:var(--track);margin-top:5px;flex-shrink:0}
.mstage.done .md i{background:var(--ok)}
.mstage.doing .md i{background:var(--pri);box-shadow:0 0 0 4px var(--active)}
.mstage .md u{flex:1;width:2px;background:var(--track);margin:5px 0}
.mstage:last-child .md u{display:none}
.mstage.done .md u{background:var(--ok)}
.mstage .mc{padding-bottom:16px}
.mstage .mc b{font-size:14px;display:block;margin-bottom:2px}
.mstage.todo .mc b{color:var(--t4)}
.mstage .mc span{font-size:12px;color:var(--t3)}
.mstage-row{display:flex;gap:10px;align-items:flex-start;padding:10px 0;border-bottom:1px solid var(--line)}
.mstage-row:last-child{border-bottom:0}
.mstage-row>.dot{width:10px;height:10px;border-radius:50%;background:var(--track);margin-top:4px;flex-shrink:0}
.mstage-row>.dot.b{background:var(--ok)}
.mstage-row b{display:block;font-size:13px;color:var(--t1)}
.mstage-row small{display:block;color:var(--t3);font-size:11px;margin-top:3px}
.mitem div p{font-size:13px}
.mitem div time{font-size:11px;color:var(--t3)}

/* ===== 单据模板库 ===== */
.tplwrap{display:flex;gap:16px;align-items:flex-start}
.tpllist{width:212px;flex-shrink:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);
  padding:6px;box-shadow:var(--shadow)}
.tpllist .hd{font-size:11px;color:var(--t3);padding:10px 10px 6px;letter-spacing:.5px}
.tpli{display:block;width:100%;text-align:left;padding:9px 10px;border-radius:var(--r-m);margin-bottom:2px}
.tpli:hover{background:var(--hover)}
.tpli.on{background:var(--active)}
.tpli b{display:block;font-size:13px;font-weight:600;margin-bottom:2px}
.tpli span{font-size:11px;color:var(--t3)}
.tpli em{float:right;font-size:11px;color:var(--pri);font-style:normal;margin-top:-16px}
.tplx{float:right;font-size:11px;color:var(--t4);width:18px;height:18px;line-height:18px;text-align:center;border-radius:50%;margin-top:-16px;margin-left:2px;cursor:pointer}
.tplx:hover{color:var(--warn,#e24b4a);background:var(--warn-bg,rgba(226,75,74,.1))}
.tplnew{width:100%;height:34px;border-radius:var(--r-m);background:var(--bg);font-size:12px;color:var(--t2);margin-top:8px}
.tplmain{flex:1;min-width:0;display:flex;gap:16px;align-items:flex-start}
.tplpre{flex:1;min-width:0}
.tplbar{display:flex;align-items:center;gap:8px;height:42px;margin-bottom:12px}
.tplbar b{font-size:15px;font-weight:600}
.tplbar .ver{font-size:12px;color:var(--t3)}
.tplbar .sp{flex:1}
.tplpaper{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:26px;
  box-shadow:var(--shadow);overflow-x:auto}
.tplcfg{width:316px;flex-shrink:0;align-self:flex-start;position:sticky;top:12px}
@media(max-width:1240px){.tplmain{flex-direction:column}.tplcfg{width:auto;align-self:stretch;position:static}}
/* ===== A4 单据（纸张语义：固定白底黑字） ===== */
.a4{background:#fff;color:#1D2129;border:1px solid #D9DCE0;padding:34px 36px;font-size:12px;
  box-shadow:0 1px 3px rgba(16,24,40,.08);min-width:660px}
.a4hd{text-align:center;border-bottom:2px solid #1D2129;padding-bottom:12px;margin-bottom:16px}
.a4hd .co{font-size:13px;color:#4E5969;letter-spacing:1px}
.a4hd .ti{font-size:21px;font-weight:700;letter-spacing:3px;margin:8px 0 10px}
.a4hd .no{font-size:11px;color:#8A9099}
.a4meta{display:grid;grid-template-columns:repeat(3,1fr);gap:10px 20px;margin-bottom:16px}
.a4meta .m{display:flex;gap:8px;font-size:12px;align-items:baseline}
.a4meta label{color:#8A9099;flex-shrink:0}
.a4meta span{border-bottom:1px solid #E5E6EB;flex:1;padding-bottom:2px;color:#1D2129}
.a4t{width:100%;border-collapse:collapse!important;border:1px solid #1D2129;border-radius:0!important;
  box-shadow:none!important;background:#fff}
.a4t th{position:static!important;background:#F7F8FA!important;color:#4E5969;border:1px solid #C9CDD4;
  padding:8px 9px;font-size:11px;font-weight:600;text-align:left;white-space:nowrap}
.a4t td{border:1px solid #C9CDD4;padding:8px 9px;font-size:12px;background:#fff}
.a4t td.num,.a4t th.num{text-align:right;font-variant-numeric:tabular-nums}
.a4t tbody tr:hover td{background:#fff}
.a4sum{margin-top:14px;display:flex;flex-direction:column;gap:7px;align-items:flex-end}
/* 第二张明细表小标题（工序单：工序计划 + BOM 用料 两张表） */
.a4sub2{font-size:13px;font-weight:700;color:#1D2129;margin:18px 0 8px;padding-left:8px;border-left:4px solid #1D2129}
/* 设置 → 功能排序：拖动 / ↑↓ 调整的列表 */
.sortlist{display:flex;flex-direction:column;gap:6px;padding:8px 0}
.sortrow{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--border);
  border-radius:var(--r-m);background:var(--subtle);cursor:grab}
.sortrow:hover{border-color:var(--pri);background:var(--active)}
.sortrow .hdl{color:var(--t3);font-size:15px;line-height:1;user-select:none}
.sortrow b{font-size:13px;font-weight:500}
.sortrow button[disabled]{opacity:.35;cursor:not-allowed}
.a4sum .s{display:flex;gap:12px;font-size:12px;align-items:baseline}
.a4sum label{color:#8A9099}
.a4sum b{font-weight:600;min-width:150px;text-align:right;font-variant-numeric:tabular-nums}
.a4clause{margin-top:18px;border-top:1px dashed #C9CDD4;padding-top:12px}
.a4clause p{font-size:11px;color:#4E5969;line-height:2;margin-bottom:2px}
.a4sign{display:flex;gap:36px;margin-top:30px}
.a4sign .sg{flex:1}
.a4sign label{font-size:11px;color:#8A9099}
.a4sign .ln{height:1px;background:#8A9099;margin-top:28px}

/* ===== 单据设计器 ===== */
.dsgwrap{display:grid;grid-template-columns:224px minmax(0,1fr) 272px;gap:14px;align-items:start}
.dsgcol{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);box-shadow:var(--shadow);padding:14px 14px 16px}
.dsgcol h4{font-size:12px;color:var(--t3);letter-spacing:.5px;margin:0 0 10px;display:flex;justify-content:space-between;align-items:baseline}
.dsgcol h4 em{font-style:normal;font-size:10.5px;color:var(--t4)}
.dsgcol h4+h4{margin-top:16px;padding-top:14px;border-top:1px solid var(--rowborder)}
.blk{display:flex;align-items:center;gap:9px;padding:7px 4px;border-radius:6px;cursor:pointer}
.blk:hover{background:var(--hover)}
.blk b{display:block;font-size:12.5px;font-weight:500}
.blk span{font-size:10.5px;color:var(--t3)}
.sw2{width:30px;height:17px;border-radius:9px;background:var(--border);position:relative;flex-shrink:0}
.sw2.on{background:var(--pri)}
.sw2 i{position:absolute;top:2px;left:2px;width:13px;height:13px;border-radius:50%;background:#fff}
.sw2.on i{left:15px}
.fitem{display:flex;align-items:center;gap:8px;padding:6px 2px;font-size:12px}
.fitem .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fitem.off .nm{color:var(--t4);text-decoration:line-through}
.fitem .mv{color:var(--t4);font-size:11px;padding:0 3px;cursor:pointer}
.fitem .mv:hover{color:var(--pri)}
.chk{width:15px;height:15px;border-radius:4px;border:1.5px solid var(--border);flex-shrink:0;
 display:flex;align-items:center;justify-content:center;font-size:10px;color:#fff}
.chk.on{background:var(--pri);border-color:var(--pri)}
.prop{margin-bottom:11px}
.prop>label{display:block;font-size:11.5px;color:var(--t3);margin-bottom:5px}
.prop input[type=text],.prop select,.prop textarea{width:100%;height:30px;border:1px solid var(--border);
 border-radius:6px;padding:0 8px;font-size:12.5px;background:var(--surface);color:var(--t1);font-family:inherit}
.prop textarea{height:64px;padding:6px 8px;line-height:1.6;resize:vertical}
.prop input:focus,.prop select:focus,.prop textarea:focus{outline:none;border-color:var(--pri)}
.seg{display:flex;gap:4px}
.seg button{flex:1;height:28px;border:1px solid var(--border);border-radius:6px;font-size:11.5px;
 background:var(--surface);color:var(--t2);font-family:inherit}
.seg button.on{background:var(--active);border-color:var(--pri);color:var(--pri);font-weight:600}
.dsgbar{display:flex;align-items:center;gap:8px;height:42px;margin-bottom:12px}
.dsgbar select{height:30px;border:1px solid var(--border);border-radius:6px;padding:0 8px;
 font-size:12.5px;background:var(--surface);color:var(--t1);font-family:inherit}
.dsgbar .ver{font-size:12px;color:var(--t3)}
.dsgpaper{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);
 box-shadow:var(--shadow);padding:22px 18px;overflow-x:auto}
.dsgnote{font-size:11.5px;color:var(--t3);line-height:1.8;margin-top:10px}
/* A4 变体 */
.a4{max-width:794px;margin:0 auto;position:relative;overflow:hidden}
.a4.lan{max-width:1000px}
.a4.a5{max-width:520px;padding:22px 24px}
.a4.half{max-width:700px;padding:16px 20px}
.a4.hei .a4hd .ti{font-weight:800;letter-spacing:6px}
.a4.hei .a4t th{font-weight:700}
.a4.wm::after{content:attr(data-wm);position:absolute;inset:0;display:flex;align-items:center;
 justify-content:center;font-size:86px;font-weight:800;letter-spacing:22px;color:rgba(208,69,59,.10);
 transform:rotate(-24deg);pointer-events:none}
.a4foot{display:flex;justify-content:space-between;margin-top:24px;padding-top:8px;
 border-top:1px solid #E5E6EB;font-size:10px;color:#8A9099}
.a4sign .sg{position:relative}
.a4sign .sg .seal{position:absolute;right:6px;bottom:6px;width:74px;height:74px;border:2px solid #C0392B;
 border-radius:50%;color:#C0392B;font-size:10px;display:flex;align-items:center;justify-content:center;
 text-align:center;line-height:1.4;transform:rotate(-12deg);opacity:.75;padding:8px}
@media(max-width:1240px){.dsgwrap{grid-template-columns:210px minmax(0,1fr)}.dsgcol:last-child{grid-column:1/-1}}

.dinfo{background:var(--subtle);border-radius:6px;padding:9px 10px;margin-bottom:12px}
.dinfo b{display:block;font-size:13px}
.dinfo span{display:block;font-size:10.5px;color:var(--t3);margin-top:3px}
.dsgbar .sv{font-size:11px;color:var(--warn);background:var(--warn-bg);border-radius:10px;padding:2px 8px}
.dsgbar .sv.ok{color:var(--ok-fg);background:var(--ok-bg)}
.tpli em.cs{color:var(--warn)}

/* ===== 弹窗/抽屉 增强 ===== */

/* ================== 弹窗 / 抽屉 / 反馈 ================== */
.overlay{position:fixed;inset:0;background:rgba(16,20,26,.45);z-index:200;display:none;align-items:center;justify-content:center;
  overflow-y:auto;padding:24px 16px;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}
.overlay.on{display:flex}
.dlg{background:var(--surface);border:1px solid var(--border);border-radius:14px;box-shadow:0 18px 48px rgba(16,24,40,.22);
  width:560px;max-width:100%;display:flex;flex-direction:column;margin:auto;animation:pop .16s ease}
.dlg.wide{width:840px}.dlg.narrow{width:440px}.dlg.xwide{width:1040px}
/* 修复弹窗嵌套导致的"双边框/内层变形"：当 html 自带 .dlg/.dlg.wide/.dlg.narrow 时，外层 #dlg 已承载视觉，
   内层样式仅承担结构，强制扁平化。 */
#dlg > .dlg{width:100%!important;max-width:100%!important;border:none!important;box-shadow:none!important;
  border-radius:0!important;background:transparent!important;padding:0!important;margin:0!important;display:contents!important}
#dlg > .dlg .dlg-hd:first-child{padding-top:0}
#dlg > .dlg .dlg-ft:last-child{padding-bottom:0}
/* 弹窗内部元素常规化：避免 input/select 长内容撑爆网格 */
.dlg{word-break:break-word;overflow:hidden}
.dlg .form{min-width:0}
.dlg .fd{min-width:0}
.dlg .fd input,.dlg .fd select,.dlg .fd textarea{min-width:0}
.dlg .fd select{max-width:100%}
.dlg .fd select option{white-space:normal;max-width:560px}
.dlg .fd textarea{min-height:64px;max-height:240px}
/* 长表单（如报价引用测算、用户编辑）自适应宽屏 */
@media (min-width:1200px){
  .dlg{width:600px}
  .dlg.wide{width:880px}
  .dlg.xwide{width:1080px}
}
/* 小屏：弹窗全宽、表单单列 */
@media (max-width:768px){
  .overlay{padding:14px 10px}
  .dlg,.dlg.wide,.dlg.narrow,.dlg.xwide{width:96vw;max-width:96vw}
  .dlg .form{grid-template-columns:1fr}
  .dlg-hd{padding:14px 16px 10px}
  .dlg-bd{padding:14px 16px 4px}
  .dlg-ft{padding:12px 16px 14px}
}
@keyframes pop{from{opacity:0;transform:translateY(10px) scale(.985)}to{opacity:1;transform:none}}
.dlg-hd{display:flex;align-items:center;gap:10px;padding:16px 20px 12px;border-bottom:1px solid var(--border)}
.dlg-hd .gbar{width:4px;height:18px;border-radius:2px;background:var(--gc,var(--pri));flex-shrink:0}
.dlg-hd b{font-size:16px;font-weight:600;flex:1}
.dlg-hd small{font-size:12px;color:var(--t3);font-weight:400}
.dlg-x{width:30px;height:30px;border-radius:8px;display:grid;place-items:center;color:var(--t3);font-size:16px}
.dlg-x:hover{background:var(--hover);color:var(--t1)}
.dlg-bd{padding:18px 20px 6px;overflow-y:auto;max-height:min(64vh,calc(100vh - 210px))}
.dlg-ft{display:flex;gap:10px;align-items:center;padding:14px 20px 18px;border-top:1px solid var(--rowborder)}
.dlg-ft .sp{flex:1}
.dlg .form{display:grid;grid-template-columns:1fr 1fr;gap:14px 16px}
.dlg .form .f1{grid-column:1/-1}
.dlg .fd label{display:block;font-size:12px;color:var(--t3);margin-bottom:6px}
.dlg .fd label b{color:var(--up);font-style:normal;margin-left:2px}
.dlg .fd input,.dlg .fd select,.dlg .fd textarea{width:100%;height:38px;border:1px solid var(--border);border-radius:8px;padding:0 11px;
  font-size:14px;background:var(--surface);color:var(--t1);font-family:inherit;outline:none;transition:border .12s}
.dlg .fd textarea{height:78px;padding:9px 11px;line-height:1.6;resize:vertical}
.dlg .fd input:focus,.dlg .fd select:focus,.dlg .fd textarea:focus{border-color:var(--pri)}
.dlg .fd input.ro{background:var(--subtle);color:var(--t3)}
.dlg .fd select{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--t4) 50%),linear-gradient(135deg,var(--t4) 50%,transparent 50%);
  background-position:calc(100% - 17px) 16px,calc(100% - 12px) 16px;background-size:5px 5px;background-repeat:no-repeat;padding-right:26px}
.hint{font-size:11.5px;color:var(--t4);margin-top:5px;line-height:1.6}
/* toast */
.toast{position:fixed;top:70px;left:50%;transform:translateX(-50%);z-index:300;background:#1D2129;color:#fff;font-size:13px;
  padding:9px 18px;border-radius:20px;display:flex;align-items:center;gap:8px;opacity:0;pointer-events:none;transition:opacity .18s,top .18s;box-shadow:0 6px 18px rgba(0,0,0,.25);max-width:80vw}
.toast.on{opacity:1;top:60px}
.toast svg{flex-shrink:0}
/* 行操作 */
/* 行内操作按钮：默认常显（原来只在鼠标悬停那一行才出现，用户找不到「编辑 / 打印」） */
.rowop{display:inline-flex;align-items:center;gap:6px;margin-left:8px;white-space:nowrap}
/* 操作列：宽度交给内容（auto 布局按内容收缩），不占用数据列的宽度配额 */
th.opcol,td.opcol{width:1px;white-space:nowrap}
.iop{display:inline-grid;place-items:center;min-width:26px;height:26px;padding:0 6px;
  border-radius:7px;border:1px solid var(--border);background:var(--surface);
  color:var(--t2);font-size:13px;line-height:1;cursor:pointer;vertical-align:middle;
  transition:background .15s,color .15s,border-color .15s,box-shadow .15s}
.iop:hover{background:var(--pri-bg);border-color:var(--pri);color:var(--pri-fg)}
.iop.del{color:var(--up)}
.iop.del:hover{background:var(--up);border-color:var(--up);color:#fff}
/* 带文字标签的行内按钮：图标 + 名称，一眼可见（尺寸收紧，避免挤占数据列宽度） */
.rowop .iop{display:inline-flex;align-items:center;gap:4px;height:29px;min-width:32px;padding:0 8px;
  border-radius:8px;font-size:13.5px;font-weight:500;color:var(--pri-fg)}
.rowop .iop i{font-style:normal;font-size:11.5px;font-family:inherit;font-weight:400}
.rowop .iop:hover{background:var(--pri);border-color:var(--pri);color:var(--onpri);box-shadow:0 2px 6px rgba(16,24,40,.16)}
.rowop .iop.pr{color:var(--ok-fg)}
.rowop .iop.pr:hover{background:var(--ok);border-color:var(--ok);color:#fff}
.rowop .iop.rv{color:var(--warn-fg)}
.rowop .iop.rv:hover{background:var(--warn);border-color:var(--warn);color:#fff}
.rowop .iop.alt{color:var(--t2)}
.rowop .iop.alt:hover{background:var(--t2);border-color:var(--t2);color:#fff}
.rowop .iop.del{color:var(--up)}
.rowop .iop.del:hover{background:var(--up);border-color:var(--up);color:#fff}
/* 窄屏只留图标，避免操作列过宽 */
@media (max-width:900px){
  .rowop .iop i{display:none}
  .rowop .iop{min-width:30px;padding:0 7px}
}
/* 表格空态 */
td.emptycell{text-align:center;color:var(--t4);padding:36px 0}
/* 确认框 */
.confirm-body{padding:6px 4px 10px;font-size:14px;line-height:1.9;color:var(--t2)}
.ghost,.primary{border-radius:8px;height:36px;padding:0 16px;font-size:13px;display:inline-flex;align-items:center;gap:6px}
.danger{height:36px;padding:0 16px;border-radius:8px;background:var(--up);color:#fff;font-size:13px;display:inline-flex;align-items:center;gap:6px}
.danger:hover{filter:brightness(.94)}
/* 桌面底部快捷 */
.kbd{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 4px;border-radius:4px;background:var(--gray-bg);
  color:var(--t3);font-size:11px;border:1px solid var(--border)}
/* 表单页编辑态（建档/登记） */
.fld input,.fld select{border:0;outline:0;background:transparent;width:100%;font-size:14px;color:var(--t1);font-family:inherit;height:22px}
.fld input::placeholder{color:var(--t4)}
select.plain{border:none;background:transparent;color:var(--t1);font-size:14px;outline:none;appearance:none;width:100%}
/* 用户管理 */
.usrcard .role-tag{display:inline-block;padding:2px 10px;border-radius:11px;font-size:12px;background:var(--pri-bg);color:var(--pri-fg)}
.usrcard .role-tag.off{background:var(--gray-bg);color:var(--t3)}
/* 知识库编辑按钮 */
.kb-edit{position:absolute;top:14px;right:16px}
/* 打印预览工具栏 */
.printbar{position:fixed;right:26px;bottom:26px;z-index:150;display:flex;flex-direction:column;gap:8px}
.printbar button{width:52px;height:52px;border-radius:16px;background:var(--surface);border:1px solid var(--border);box-shadow:var(--shadow);
  display:grid;place-items:center;color:var(--t2);font-size:20px}
.printbar button:hover{background:var(--pri);color:var(--onpri);border-color:transparent}
@media print{.printbar,.overlay,#topwrap,#pc,#mb,#smask,#spanel,.login-mask,#aiFab,#aiPanel,#toast,.doc-qr .doc-qr-only{display:none!important}body{background:#fff}}
/* A4 预览页 */
#printWrap{position:fixed;inset:0;background:#3A4149;z-index:190;overflow:auto;display:none;padding:26px}
#printWrap.on{display:block}
#printCard{max-width:794px;margin:0 auto}
#printCard .a4{max-width:none;box-shadow:0 8px 30px rgba(0,0,0,.3)}
.print-top{max-width:794px;margin:0 auto 14px;display:flex;align-items:center;gap:10px;color:#C9CDD4}
.print-top b{color:#fff}
/* 数值右对齐徽章列避免错位 */
td .badge{white-space:nowrap}
.mcard .t em{font-style:normal}
@media print{#printWrap .print-top{display:none!important}#printWrap{position:static!important;background:#fff!important;padding:0!important}#printCard{max-width:794px!important}#printCard .a4{box-shadow:none!important;border:none!important}}

/* ============ 登录遮罩 ============ */
.login-mask{
  position:fixed;inset:0;z-index:9999;display:none;align-items:center;justify-content:center;
  background:var(--bg,#F0F1F3);padding:20px;
}
.login-mask.on{display:flex}
.login-box{
  width:372px;max-width:calc(100vw - 40px);background:var(--surface,#fff);
  border:1px solid var(--border,#E3E5E9);border-radius:18px;padding:34px 30px;
  box-shadow:0 20px 50px rgba(0,0,0,.10);display:flex;flex-direction:column;gap:14px;
}
.login-logo{display:flex;align-items:center;gap:11px;font-size:21px;font-weight:700;color:var(--t1)}
.login-logo .mark{width:38px;height:38px;border-radius:10px;background:var(--pri);color:var(--onpri);font-size:18px}
.login-sub{font-size:12px;color:var(--t3);margin-top:-6px}
.login-form{display:flex;flex-direction:column;gap:10px;margin-top:4px}
.login-form input{
  height:44px;padding:0 14px;border:1px solid var(--border,#E3E5E9);border-radius:10px;
  font-size:14px;color:var(--t1);outline:none;background:var(--surface,#fff);width:100%;box-sizing:border-box;
}
.login-form input:focus{border-color:var(--pri);box-shadow:0 0 0 3px var(--pri-bg,transparent)}
.login-err{font-size:12px;color:#D84343;min-height:16px;line-height:1.5}
.login-btn{height:44px;border:0;border-radius:10px;background:var(--pri);color:var(--onpri);font-size:15px;font-weight:600;cursor:pointer}
.login-btn:disabled{opacity:.6;cursor:default}
.login-foot{font-size:12px;color:var(--t4);text-align:center;margin-top:-4px}
.login-box .login-sub{color:var(--t3)}
@media(max-width:768px){
  .login-mask{align-items:flex-start;padding:24px 16px;overflow:auto}
  .login-box{width:100%;max-width:420px;margin-top:24px;padding:22px;border-radius:18px}
  .login-form input{height:48px;font-size:16px}
  .login-btn{height:48px;font-size:16px}
}

/* 状态流转菜单 */
.status-flow{cursor:pointer;border-bottom:1px dashed var(--t4)}
.status-flow:hover{border-bottom-color:var(--pri)}
.sf-list{display:flex;flex-direction:column;gap:6px}
.sf-item{padding:9px 12px;border:1px solid var(--border,#e5e7eb);border-radius:8px;cursor:pointer;font-size:13.5px;display:flex;align-items:center;gap:8px;color:var(--t1)}
.sf-item:hover{border-color:var(--pri);background:var(--hover,#f8fafc)}
.sf-item.on{border-color:var(--pri);background:var(--active,#eef3fb);font-weight:500}
.sf-item .dot{width:8px;height:8px;border-radius:50%;background:var(--t4,#ccc);flex-shrink:0}
.sf-item .dot.b{background:var(--pri)}
.sf-item small{color:var(--t3);font-weight:400;margin-left:2px}

/* 顶栏主题皮肤（版本号一行最右侧） */
.themes-bar{display:flex;align-items:center;gap:6px}
.themes-bar .swatch{width:16px;height:16px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,.15);cursor:pointer;padding:0}
.themes-bar .swatch:hover{transform:scale(1.15)}

/* 状态流转：内联下拉（替代弹窗菜单） */
.status-sel{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:none;border-radius:var(--r-s);padding:3px 22px 3px 8px;font-size:12px;white-space:nowrap;cursor:pointer;outline:none;font-weight:500;font-family:inherit;line-height:1.4;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23666' fill='none' stroke-width='1.5'/%3E%3C/svg%3E") !important;background-repeat:no-repeat !important;background-position:right 6px center !important;background-size:9px !important}
.status-sel:hover{opacity:.85}
.status-sel option{background:var(--surface,#fff);color:var(--t1,#222)}

/* 单据设计器：字段行编辑 */
.mrow-wrap{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.mrow{display:flex;gap:6px;align-items:center}
.mrow input{flex:1;min-width:0;padding:6px 8px;border:1px solid var(--line,#e5e7eb);border-radius:6px;font-size:12.5px;background:var(--surface,#fff);color:var(--t1,#222)}
.mrow button{border:0;background:transparent;color:var(--t4,#94a3b8);cursor:pointer;font-size:13px;padding:2px 4px}
.mrow button:hover{color:var(--warn,#e24b4a)}
.madd{font-size:12px;color:var(--pri,#3B7DD8);cursor:pointer;padding:2px 2px 2px 0}
.madd:hover{text-decoration:underline}

/* 设计器右侧分组折叠 */
.dgseg{border-top:1px solid var(--rowborder);margin-top:2px}
.dgseg h4{cursor:pointer;display:flex;justify-content:space-between;align-items:center;user-select:none;margin:0;padding:11px 0}
.dgseg h4 span{display:flex;align-items:baseline;gap:6px}
.dgseg h4 em{font-style:normal;font-size:10.5px;color:var(--t4);font-weight:400}
.dgseg .dgfold{width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--t3);transition:transform .15s}
.dgseg.open .dgfold{transform:rotate(180deg)}
.dgseg .dgseg-bd{display:none;padding-bottom:12px}
.dgseg.open .dgseg-bd{display:block}

/* ===== 图片字段（洞口图纸 / 完工照片） ===== */
.cellimg{width:34px;height:34px;object-fit:cover;border-radius:6px;cursor:zoom-in;border:1px solid var(--border);vertical-align:middle}
.imgwrap{display:inline-flex;align-items:center;gap:4px}
.imgmore{font-style:normal;font-size:10px;color:var(--t3)}
.imged{border:1px dashed var(--border);border-radius:10px;padding:10px;background:var(--bg,#FAFBFC)}
.imgthumbs{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.imgt{position:relative;width:64px;height:64px;border-radius:8px;overflow:hidden;border:1px solid var(--border);display:inline-block;background:#fff}
.imgt img{width:100%;height:100%;object-fit:cover;cursor:zoom-in;display:block}
.imgt i{position:absolute;right:2px;top:2px;width:16px;height:16px;line-height:16px;text-align:center;font-size:10px;font-style:normal;background:rgba(226,75,74,.92);color:#fff;border-radius:50%;cursor:pointer}
.imgt.none{display:flex;align-items:center;justify-content:center;color:var(--t4);font-size:11px}
.imgupbtn{display:inline-block;padding:6px 14px;border:1px solid var(--pri);color:var(--pri);border-radius:8px;font-size:12px;cursor:pointer;background:var(--pri-bg,#EAF1FA)}
.imgupbtn:hover{background:var(--pri);color:#fff}
#imgLight{position:fixed;inset:0;z-index:9999;background:rgba(10,14,20,.82);display:flex;align-items:center;justify-content:center;flex-direction:column;gap:14px;cursor:zoom-out}
#imgLight img{max-width:92vw;max-height:86vh;border-radius:10px;box-shadow:0 12px 40px rgba(0,0,0,.5);background:#fff}
#imgLight .imgx{color:#cfd6e0;font-size:12px;letter-spacing:1px}

/* ===== 工作台可视化（环图 + 数字瓦片） ===== */
.donut{display:block}
.pflex{display:flex;gap:18px;align-items:center}
.donutbox{display:flex;flex-direction:column;align-items:center;gap:6px;cursor:pointer;flex-shrink:0}
.donutbox span{font-size:11px;color:var(--t3);text-align:center;line-height:1.4}
.pbars{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}
.progmini,.ordermini{flex:1}
.otiles{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-top:10px}
.otile{background:var(--bg,#FAFBFC);border:1px solid var(--border);border-radius:12px;padding:12px 8px;text-align:center;cursor:pointer}
.otile:hover{border-color:var(--pri)}
.otile b{display:block;font-size:24px;font-weight:700;color:var(--pri)}
.otile span{font-size:12px;color:var(--t3)}
.onote{font-size:11px;color:var(--t4);margin-top:10px}
/* 业务体检分类卡 */
.chkgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.chkcard{background:var(--bg,#FAFBFC);border:1px solid var(--border);border-radius:14px;padding:14px 16px 30px;position:relative;transition:box-shadow .15s}
.chkcard:hover{box-shadow:var(--shadow)}
.chkcard.bad{border-color:rgba(226,75,74,.35)}
.chkcard .hd{display:flex;align-items:center;gap:10px}
.chkcard .hd .ic{font-size:22px}
.chkcard .hd b{font-size:15px}
.chkcard .hd small{display:block;color:var(--t3);font-size:11px;margin-top:1px}
.chkcard .hd i.badge{margin-left:auto;font-style:normal;background:rgba(226,75,74,.12);color:#d93a39;border-radius:20px;padding:2px 10px;font-weight:700;font-size:13px}
.chkcard .hd i.ok{margin-left:auto;font-style:normal;color:var(--ok);font-weight:700}
.chkcard>p.msg{font-size:12px;color:var(--t3);margin:10px 0 8px}
.chkcard .msgs{display:flex;flex-direction:column;gap:5px;min-height:38px}
.chkcard .msgs .m{font-size:12px;color:var(--t2);display:flex;gap:6px;align-items:flex-start;line-height:1.5}
.chkcard .msgs .m em{font-style:normal;flex-shrink:0;font-size:10px;padding:0 5px;border-radius:4px;height:16px;line-height:16px}
.chkcard .msgs em.sev{background:rgba(226,75,74,.14);color:#d93a39}
.chkcard .msgs em.warn{background:rgba(240,146,55,.16);color:#d97b18}
.chkcard .msgs em.inf{background:rgba(59,130,246,.13);color:#2f66c8}
.chkcard .msgs .none{color:var(--ok);font-size:12px}
.chkcard .more{position:absolute;right:16px;bottom:12px;font-size:12px;color:var(--pri);opacity:0}
.chkcard:hover .more{opacity:1}
.pill.sev{background:rgba(226,75,74,.12);color:#d93a39;border-radius:20px;padding:2px 10px;font-size:11px}
.pill.warn{background:rgba(240,146,55,.16);color:#d97b18;border-radius:20px;padding:2px 10px;font-size:11px}
.pill.inf{background:rgba(59,130,246,.13);color:#2f66c8;border-radius:20px;padding:2px 10px;font-size:11px}
.okline{color:var(--ok);font-size:13px;background:rgba(22,163,74,.08);border:1px dashed rgba(22,163,74,.35);border-radius:10px;padding:12px 14px}
/* 生产进度页 */
.stg4{display:flex;gap:12px;flex-wrap:wrap;margin-top:12px}
.stg4i{flex:1;min-width:140px;border:1px solid var(--border);border-radius:12px;padding:12px 14px;display:flex;align-items:center;gap:10px;background:var(--bg,#FAFBFC)}
.stg4i i{width:10px;height:10px;border-radius:50%;flex-shrink:0}
.stg4i b{flex:1;font-size:14px}
.stg4i span{color:var(--t3);font-size:12px}
.prodcards{display:flex;flex-direction:column;gap:8px}
.pcard{border-radius:10px;padding:10px 12px;background:var(--bg,#FAFBFC);border:1px solid var(--border)}
.pcard b{font-size:13px;display:block}
.pcard p{font-size:12px;color:var(--t3);margin:4px 0}
.pcard span{font-size:11px;color:var(--t4)}
.procrank{display:flex;flex-direction:column;gap:8px}
@media(max-width:1240px){.chkgrid{grid-template-columns:1fr 1fr}.pflex{flex-direction:column;align-items:stretch}}
/* ============ V3.1.6：工序二维码墙（适老化：大字工序名 + 大二维码） ============ */
.qrwall-bd{max-height:64vh;overflow:auto}
.qrwall{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px;padding:4px}
.qrcard{border:1.5px solid var(--border);border-radius:12px;padding:14px 10px;text-align:center;background:var(--surface,#fff)}
.qrcard .qrc-proc{font-size:26px;font-weight:800;letter-spacing:2px;line-height:1.2;color:var(--t1)}
.qrcard .qrc-proj{font-size:12px;color:var(--t3);margin:2px 0 8px;min-height:16px}
.qrcard img{width:200px;height:200px;display:inline-block}
.qrcard .qrc-meta{font-size:13px;font-weight:600;margin-top:6px;color:var(--t2)}
.qrcard .qrc-tip{font-size:13px;font-weight:700;color:var(--ok,#16A34A);margin-top:4px}
.qrcard .qrc-url{font-size:9px;color:var(--t4);word-break:break-all;margin-top:4px;max-height:24px;overflow:hidden}
.qrcard .qrc-fail{color:var(--warn);font-size:12px;padding:40px 0}
@media(max-width:768px){.qrwall{grid-template-columns:repeat(2,1fr);gap:8px}.qrcard{padding:10px 6px}.qrcard img{width:130px;height:130px}.qrcard .qrc-proc{font-size:20px}}
/* 对账单明细预览表 */
#reconPrev table.tbl{width:100%;border-collapse:collapse;margin-top:8px}
#reconPrev table.tbl th,#reconPrev table.tbl td{border-bottom:1px solid var(--rowborder,#EEF1F5);padding:4px 6px;white-space:nowrap}
#reconPrev table.tbl th{background:var(--bg2,#F5F7FA);font-weight:600;color:var(--t2)}

/* 新增记录后的首行高亮：让用户明确看到记录已生成（保存无反馈/被筛选挡住的问题修复） */
#content tbody tr.rowflash{animation:erdRowFlash 2.6s ease-out both}
@keyframes erdRowFlash{
  0%{background:var(--pri-bg,#EAF1FA);box-shadow:inset 3px 0 0 var(--pri,#3B7DD8)}
  60%{background:var(--pri-bg,#EAF1FA);box-shadow:inset 3px 0 0 var(--pri,#3B7DD8)}
  100%{background:transparent;box-shadow:none}
}

/* 移动端分页条（每页 20 条，大按钮便于手指点按） */
.mpg{display:flex;align-items:center;gap:10px;margin:14px 0 6px}
.mpg .mpgb{flex:1;height:40px;border-radius:10px;background:var(--surface);border:1px solid var(--border);
  font-size:14px;color:var(--t1)}
.mpg .mpgb:disabled{opacity:.4}
.mpg .mpgt{font-size:12px;color:var(--t3);white-space:nowrap}

/* ============ 弹窗内的单选组（配置·模型 / 公共打印设置）============
   弹窗表单规则 .dlg .fd input{width:100%;height:38px;border:…} 会把 radio 一并拉成整行，
   导致圆点跑到中间、选项文字被挤到右侧换行（「配置 · 模型」就是这个毛病）。
   这里只在 .rdlist 内部复位，不影响其它表单字段。 */
.dlg .fd .rdlist{display:flex;flex-direction:column;gap:6px}
.dlg .fd .rdlist label.rd{display:flex;align-items:center;gap:10px;width:auto;margin:0;
  font-size:13.5px;color:var(--t1);cursor:pointer;padding:9px 12px;
  border:1px solid var(--border);border-radius:9px;background:var(--surface);transition:.14s}
.dlg .fd .rdlist label.rd:hover{border-color:var(--pri);background:var(--active)}
.dlg .fd .rdlist label.rd:has(input:checked){border-color:var(--pri);background:var(--pri-bg,var(--active));
  color:var(--pri-d);font-weight:500}
.dlg .fd .rdlist label.rd input[type=radio]{width:16px;height:16px;min-width:16px;flex:0 0 16px;
  margin:0;padding:0;border:0;accent-color:var(--pri)}
.dlg .fd .rdlist label.rd span{flex:1;min-width:0}

/* ===== V3.1.9 移动端「外出」模块 ===== */
.mo-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.mo-tile{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:14px 12px;display:flex;flex-direction:column;gap:4px}
.mo-tile i{width:26px;height:4px;border-radius:2px;display:block;margin-bottom:4px}
.mo-tile b{font-size:14px}
.mo-tile span{font-size:11px;color:var(--t3);line-height:1.5}
.mo-search input{width:100%;box-sizing:border-box;height:42px;border-radius:12px;border:1px solid var(--border);background:var(--surface);padding:0 14px;font-size:14px}
.mo-form{display:flex;flex-direction:column;gap:12px}
.mo-f label{display:block;font-size:12px;color:var(--t3);margin-bottom:5px}
.mo-f input,.mo-f select,.mo-f textarea{width:100%;box-sizing:border-box;height:44px;border-radius:12px;border:1px solid var(--border);background:var(--surface);padding:0 12px;font-size:15px;color:var(--t1)}
.mo-f textarea{height:auto;padding:10px 12px}
.mo-2col{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.mo-shots{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.mo-shot{position:relative;width:72px;height:72px;border-radius:10px;overflow:hidden;border:1px solid var(--border)}
.mo-shot img{width:100%;height:100%;object-fit:cover;display:block}
.mo-shot em{position:absolute;top:0;right:0;width:22px;height:22px;background:rgba(0,0,0,.55);color:#fff;border-radius:0 0 0 10px;display:flex;align-items:center;justify-content:center;font-style:normal;font-size:14px}
.mo-add{height:44px;border-radius:12px;border:1px dashed var(--t4);background:transparent;color:var(--t2);font-size:14px}
.mo-cache-tip{padding:8px 12px;border-radius:8px;background:var(--warnbg,#FAEEDA);color:#854F0B;font-size:12px}
.mo-sum{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.mo-sum>div{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:12px}
.mo-sum span{display:block;font-size:12px;color:var(--t3);margin-bottom:4px}
.mo-sum b{font-size:18px}
.mo-acts{margin-top:8px}
.mo-btn{display:inline-flex;align-items:center;justify-content:center;height:38px;padding:0 18px;border-radius:10px;font-size:14px;text-decoration:none;border:1px solid var(--border);color:var(--t1);background:var(--surface)}
.mo-btn.pri{background:var(--pri);color:var(--onpri);border-color:var(--pri)}
/* 加到主屏后（standalone）：隐藏假状态栏，用系统安全区替代 */
@media all and (display-mode:standalone){
  #mb,#mb.show{padding-top:env(safe-area-inset-top)}
  .mstatus{display:none}
}

/* ===== V3.1.9 底部导航中间留位（报工悬浮按钮不压 tab）+ 待办分组 ===== */
.mtab-slot{flex:1}
/* 待办条目：可点圆点完成 + 主文本 + 右侧时间，急单整行淡红底 */
.mtodo{display:flex;align-items:center;gap:10px;padding:11px 14px;cursor:pointer}
.mtodo + .mtodo{border-top:1px solid var(--rowborder)}
.mtodo.urgent{background:#FFF7F6}
.mtodo.done p{text-decoration:line-through;color:var(--t4)}
.mtodo-dot{width:16px;height:16px;border-radius:50%;border:1.5px solid var(--pri);flex-shrink:0}
.mtodo-dot.on{background:var(--pri)}
.mtodo-bd{flex:1;min-width:0}
.mtodo-bd p{font-size:13px;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mtodo-bd small{font-size:11px;color:var(--t3)}
.mtodo time{font-size:11px;color:var(--t3);flex-shrink:0}
.mgdot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;vertical-align:middle}

/* ===== 移动端 App 版界面（对齐 App 设计稿 13 屏） ===== */
/* 头部：头像 + 姓名 + 通知铃铛 */
.mh-top{display:flex;align-items:center;gap:12px}
.mh-top .ava{width:44px;height:44px;border-radius:50%;background:var(--pri);color:var(--onpri);display:grid;place-items:center;font-size:17px;font-weight:500;flex-shrink:0}
.mh-top .who{flex:1;min-width:0}
.mh-top .who b{display:block;font-size:17px;font-weight:600}
.mh-top .who span{font-size:12px;color:var(--t3);display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mh-bell{position:relative;width:40px;height:40px;flex-shrink:0;border-radius:50%;background:var(--surface);border:1px solid var(--border);display:grid;place-items:center;color:var(--t2)}
.mh-bell i{position:absolute;top:-3px;right:-3px;min-width:18px;height:18px;border-radius:9px;background:#E24B4A;color:#fff;font-size:11px;font-style:normal;line-height:18px;text-align:center;padding:0 5px}

/* 今日概览大数字卡 */
.mh-hero{background:var(--pri);border-radius:16px;padding:18px;color:var(--onpri)}
.mh-hero .hd{display:flex;justify-content:space-between;font-size:12px;opacity:.85;margin-bottom:10px}
.mh-hero .big{font-size:34px;font-weight:600;line-height:1.1;letter-spacing:-.5px}
.mh-hero .sub{font-size:12px;opacity:.82;margin-top:6px}
.mh-hero .row{display:flex;gap:14px;margin-top:14px;padding-top:14px;border-top:1px solid rgba(255,255,255,.22)}
.mh-hero .row>div{flex:1;min-width:0}
.mh-hero .row label{display:block;font-size:11px;opacity:.75}
.mh-hero .row b{font-size:15px;font-weight:600}
.mh-hero .row span{display:block;font-size:11px;opacity:.7;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* 八宫格常用功能 */
.mh-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px 8px}
.mh-tile{display:flex;flex-direction:column;align-items:center;gap:6px;cursor:pointer}
.mh-tile i{width:46px;height:46px;border-radius:14px;display:grid;place-items:center}
.mh-tile b{font-size:11px;font-weight:400;color:var(--t2);white-space:nowrap}

/* 待我处理 */
.mh-tasks{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);overflow:hidden}
.mh-task{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer}
.mh-task+.mh-task{border-top:1px solid var(--rowborder)}
/* 注意：PC 端图表有全局 .bar{flex:1}，这里必须显式关掉伸张，否则色条会被撑成大块 */
.mh-task .bar{flex:0 0 3px;width:3px;height:30px;border-radius:2px}
.mh-task .bd{flex:1;min-width:0}
.mh-task .bd b{display:block;font-size:13px;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mh-task .bd span{font-size:11px;color:var(--t3)}
.mh-task em{font-size:11px;font-style:normal;padding:2px 8px;border-radius:10px;flex-shrink:0}
.mh-empty{padding:20px;text-align:center;font-size:13px;color:var(--t4);background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l)}

/* 工人版：当前任务 / 大按钮 / 工具 / 今日报工 */
.mh-job{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:16px}
.mh-job .hd{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.mh-job .hd b{font-size:13px;font-weight:500}
.mh-job .hd em{font-size:12px;font-style:normal}
.mh-job .ti{font-size:16px;font-weight:600;margin-bottom:4px}
.mh-job .sp{font-size:12px;color:var(--t3)}
.mh-job .pr{display:flex;justify-content:space-between;font-size:12px;color:var(--t2);margin:12px 0 6px}
.mh-job .track{height:8px;border-radius:4px;background:var(--border);overflow:hidden}
.mh-job .track i{display:block;height:100%;border-radius:4px}
.mh-job .pct{font-size:12px;color:var(--t3);text-align:right;margin-top:4px}
.mh-big{width:100%;height:56px;border-radius:16px;background:var(--pri);color:var(--onpri);font-size:17px;font-weight:600;display:flex;align-items:center;justify-content:center;gap:8px;border:none}
.mh-tools{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.mh-tools>div{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:12px 4px;display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--t2)}
.mh-tools>div span{font-size:11px}
.mh-reps{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);overflow:hidden}
.mh-rep{display:flex;align-items:center;gap:10px;padding:11px 14px}
.mh-rep+.mh-rep{border-top:1px solid var(--rowborder)}
.mh-rep time{font-size:11px;color:var(--t3);flex-shrink:0;width:34px}
.mh-rep .bd{flex:1;min-width:0}
.mh-rep .bd b{display:block;font-size:13px;font-weight:400}
.mh-rep .bd span{font-size:11px;color:var(--t3)}
.mh-rep em{font-size:12px;font-style:normal;flex-shrink:0}

/* 扫码页 */
#mScan{flex:1;min-height:0;display:flex;flex-direction:column;background:#1D2129}
.ms-top{display:flex;align-items:center;gap:10px;padding:0 16px;height:52px;color:#fff;flex-shrink:0}
.ms-top b{font-size:17px;font-weight:500}
.ms-top span{font-size:13px;opacity:.7}
.ms-top button{margin-left:auto;width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.12);color:#fff;border:none;font-size:20px;line-height:1}
.ms-view{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;min-height:0}
.ms-frame{width:210px;height:210px;border:2px solid #fff;border-radius:14px;position:relative;overflow:hidden}
.ms-frame .ln{position:absolute;left:8%;right:8%;height:2px;background:#E24B4A;box-shadow:0 0 8px #E24B4A;animation:msline 2s ease-in-out infinite}
@keyframes msline{0%{top:8%}50%{top:90%}100%{top:8%}}
.ms-tip{color:rgba(255,255,255,.8);font-size:13px;margin:0}
.ms-body{background:#fff;border-radius:20px 20px 0 0;padding:16px 20px calc(16px + env(safe-area-inset-bottom));flex-shrink:0}
.ms-modes{display:flex;gap:8px;margin-bottom:14px}
.ms-modes button{flex:1;height:36px;border-radius:10px;border:1px solid var(--border);background:var(--bg);color:var(--t2);font-size:13px}
.ms-modes button.on{background:var(--pri);color:var(--onpri);border-color:transparent;font-weight:500}
.ms-acts{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:14px}
.ms-acts button{height:40px;border-radius:10px;border:1px solid var(--border);background:var(--bg);color:var(--t2);font-size:12px;display:flex;align-items:center;justify-content:center;gap:5px}
.ms-acts button i{width:8px;height:8px;border-radius:50%;background:var(--border);display:block}
.ms-stat{display:flex;justify-content:space-between;align-items:center;padding:12px 14px;background:var(--bg);border-radius:12px}
.ms-stat label{display:block;font-size:11px;color:var(--t3)}
.ms-stat b{font-size:18px}
.ms-stat div:last-child{display:flex;gap:10px;font-size:11px;color:var(--t3)}
.ms-note{font-size:11px;color:var(--t3);text-align:center;margin:10px 0 0}

/* 看板 */
.mb-kpi{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.mb-kpi>div{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:14px}
.mb-kpi label{display:block;font-size:12px;color:var(--t3);margin-bottom:4px}
.mb-kpi b{font-size:22px;font-weight:600}
.mb-kpi span{display:block;font-size:11px;color:var(--t3);margin-top:2px}
.mb-chart{display:flex;align-items:flex-end;gap:10px;height:150px;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:14px}
.mb-chart .col{flex:1;display:flex;flex-direction:column;align-items:center;height:100%;justify-content:flex-end;gap:6px}
.mb-chart .col i{width:100%;max-width:38px;border-radius:6px 6px 0 0;display:block}
.mb-chart .col span{font-size:11px;color:var(--t3)}
.mb-age{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-l);padding:14px}
.mb-age .row{display:grid;grid-template-columns:66px 1fr 76px 42px;gap:8px;align-items:center;margin-bottom:12px}
.mb-age .row:last-child{margin-bottom:0}
.mb-age .lb{font-size:12px;color:var(--t2)}
.mb-age .track{height:8px;border-radius:4px;background:var(--border);overflow:hidden}
.mb-age .track i{display:block;height:100%;border-radius:4px}
.mb-age b{font-size:12px;text-align:right}
.mb-age em{font-size:11px;color:var(--t3);font-style:normal;text-align:right}

/* 全部功能 */
.mf-g{display:flex;align-items:center;gap:12px;cursor:pointer;margin-bottom:8px}
.mf-g .bar{flex:0 0 3px;width:3px;height:32px;border-radius:2px}
.mf-g .bd{flex:1;min-width:0}
.mf-g .bd b{display:block;font-size:14px}
.mf-g .bd span{font-size:11px;color:var(--t3);display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mf-g em{font-size:12px;color:var(--t3);font-style:normal;flex-shrink:0}
.mf-i{display:flex;align-items:center;gap:10px;cursor:pointer;margin-bottom:8px}
.mf-i .bd{flex:1;min-width:0}
.mf-i .bd b{display:block;font-size:14px}
.mf-i .bd span{font-size:11.5px;color:var(--t3)}
.mf-i em{color:var(--t4);font-style:normal;font-size:16px}
.mf-note{font-size:11.5px;color:var(--t3);text-align:center;line-height:1.7;padding:4px 8px}

/* ===== AI 助手语音按钮状态 ===== */
#aiVoiceBtn.rec{background:#FCEBEB;border-color:#E24B4A;color:#E24B4A;animation:aipulse 1.1s ease-in-out infinite}
#aiSpeakBtn.on{background:#E6F1FB;border-color:#185FA5;color:#185FA5}
@keyframes aipulse{0%,100%{opacity:1}50%{opacity:.45}}

/* ===== 扫码页：实时预览 / 拍照识别双模式 ===== */
.ms-view{position:relative}
#msVideo{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0}
.ms-frame{z-index:1}
.ms-tip{z-index:1;position:relative}
.ms-nocam{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:0 28px;color:#fff}
.ms-nocam .ico{width:66px;height:66px;border-radius:20px;background:rgba(255,255,255,.12);display:grid;place-items:center;color:#fff}
.ms-nocam b{font-size:15px;font-weight:500}
.ms-nocam p{font-size:12px;line-height:1.75;color:rgba(255,255,255,.72);margin:0}
.ms-acts button.pri{background:#A32D2D;color:#fff;border-color:transparent;font-weight:500}
.ms-acts2{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:14px}
.ms-acts2 button{height:40px;border-radius:10px;border:1px solid var(--border);background:var(--bg);color:var(--t2);font-size:12px;display:flex;align-items:center;justify-content:center;gap:5px}
.ms-acts2 button i{width:8px;height:8px;border-radius:50%;background:var(--border);display:block}
.ms-last{margin-top:10px;font-size:12px;color:var(--t2);background:var(--bg);border-radius:10px;padding:8px 12px;text-align:center}
/* 移动端标题栏「扫码」按钮（原料/成品/出入库/货位/报工等页面直接进对应扫码模式） */
/* 扫码页取景区：摄像头失败重试 / 播放被系统挡住时的「点一下继续」 */
.ms-retry{margin-top:4px;height:36px;padding:0 18px;border-radius:18px;border:0;background:#fff;color:#1D2129;font-size:13.5px;font-weight:600}
.ms-resume{position:absolute;left:50%;bottom:14px;transform:translateX(-50%);height:34px;padding:0 16px;border-radius:17px;border:0;background:rgba(255,255,255,.94);color:#1D2129;font-size:13px;font-weight:600;z-index:3;box-shadow:0 2px 10px rgba(0,0,0,.28)}
.ms-nocam b{display:block}
.ms-nocam p b{font-weight:700}
.mnav-scan{margin-left:auto;height:30px;padding:0 12px;border-radius:15px;border:1px solid var(--border);background:var(--surface);color:var(--pri);font-size:12.5px;display:flex;align-items:center;gap:5px}
.mnav-scan::before{content:'';width:12px;height:12px;border:1.6px solid currentColor;border-radius:3px;box-shadow:inset 0 0 0 2px var(--surface)}
/* 扫码结果面板里内联的输入框 / 下拉（盘库、出入库快捷面板） */
.kdet-row .ff{height:34px;padding:0 10px;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--t1);font-size:13px;font-family:inherit;max-width:190px}
.kdet-row select.ff{max-width:150px}
.kdet-empty b{color:var(--t1)}

/* ===== 看板卡片详情 ===== */
.kcard.ck{cursor:pointer;transition:box-shadow .15s,transform .15s,border-color .15s}
.kcard.ck:hover{box-shadow:0 6px 18px rgba(16,24,40,.13);transform:translateY(-1px);border-color:var(--pri)}
.kdet{display:flex;flex-direction:column;gap:2px}
.kdet-hd{display:flex;align-items:flex-start;gap:10px;padding-bottom:12px;border-bottom:1px dashed var(--border);margin-bottom:8px}
.kdet-hd .bd{font-size:12px;font-weight:600;padding:3px 10px;border-radius:20px;background:var(--pri-bg);color:var(--pri-fg);white-space:nowrap}
.kdet-row{display:flex;gap:12px;padding:7px 0;border-bottom:1px solid var(--rowborder);font-size:13px}
.kdet-row:last-child{border-bottom:none}
.kdet-row .k{width:104px;flex-shrink:0;color:var(--t3)}
.kdet-row .v{flex:1;color:var(--t1);word-break:break-word}
.kdet-sec{margin-top:14px;padding-top:12px;border-top:1px dashed var(--border)}
.kdet-sec h4{font-size:13px;font-weight:600;margin:0 0 9px;color:var(--t2)}
.kdet-pl{display:flex;flex-direction:column;gap:7px}
.kdet-pl .li{display:flex;align-items:center;gap:10px;font-size:12.5px}
.kdet-pl .li .nm{width:72px;flex-shrink:0;color:var(--t2)}
.kdet-pl .li .bar{flex:1;height:8px;border-radius:5px;background:var(--track,#E8ECF2);overflow:hidden}
.kdet-pl .li .bar i{display:block;height:100%;border-radius:5px;background:var(--pri)}
.kdet-pl .li .nm2{width:104px;text-align:right;color:var(--t3);flex-shrink:0}
.kdet-empty{font-size:12.5px;color:var(--t4);padding:6px 0;line-height:1.7}
@media (max-width:768px){.kdet-row{flex-direction:column;gap:2px}.kdet-row .k{width:auto;font-size:12px}}
/* 新版本提示条（SW 接管时出现，点一下刷新） */
#updbar{position:fixed;left:50%;transform:translateX(-50%);bottom:22px;z-index:9999;display:flex;align-items:center;gap:10px;
 background:#1F2A37;color:#fff;font-size:13px;padding:9px 10px 9px 15px;border-radius:999px;box-shadow:0 6px 24px rgba(0,0,0,.24);
 animation:updin .25s ease-out}
#updbar span{opacity:.9}
#updbar button{border:0;border-radius:999px;background:var(--pri,#2E8B6F);color:#fff;font-size:13px;font-weight:600;padding:6px 13px}
#updbar button.u-x{background:transparent;color:#fff;opacity:.65;font-weight:400;font-size:14px;padding:6px 8px;border-radius:50%}
#updbar button.u-x:hover{opacity:1;background:rgba(255,255,255,.14)}
@keyframes updin{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}
@media (max-width:768px){#updbar{bottom:auto;top:calc(env(safe-area-inset-top, 0px) + 10px);max-width:92vw}}

/* 移动端账号管理：每张账号卡的操作按钮行 */
.mu-acts{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:10px}
.mu-acts button{height:36px;border-radius:10px;border:1px solid var(--border);background:var(--bg);color:var(--t2);font-size:12.5px}
/* 移动端表单页：390px 下单列更好填 */
@media(max-width:768px){.fgrid{grid-template-columns:1fr}}
/* 打印：把页面上的浮层/提示条全部排除，避免打到纸上（实测"已发布新版本"黑条会印出来） */
/* 打印预览（A4 预览层）打开时，把浮条/悬浮球/提示条全部收起：
   它们的 z-index 是 9999，而 #printWrap 只有 190，不收起就会压在纸上（截图可见）。 */
body.printing #updbar,body.printing #offbar,body.printing #aiFab,body.printing #aiPanel,body.printing #toast,body.printing #smask,body.printing #spanel{display:none!important}
@media print{#updbar,#offbar,#aiFab,#aiPanel,#toast,#smask,#spanel,.overlay,.login-mask,#printWrap .print-top{display:none!important}
  html,body{background:#fff!important}
  #printWrap{position:static!important;inset:auto!important;overflow:visible!important;padding:0!important;background:#fff!important}
  #printCard{max-width:none!important;margin:0!important}
  .a4{box-shadow:none!important;border:none!important;page-break-after:always}
  .a4t{page-break-inside:auto}.a4t tr{page-break-inside:avoid}
  *{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}}

/* 扫码页：解码组件没加载上时的常驻提示条（可点重试，不再是一闪而过的 toast） */
.ms-jsqr-warn{margin:10px 0 4px;padding:9px 11px;border-radius:10px;background:rgba(226,75,74,.13);
  border:1px solid rgba(226,75,74,.32);color:#E24B4A;font-size:12.5px;line-height:1.65;
  display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ms-jsqr-warn button{flex:none;border:0;border-radius:999px;background:#E24B4A;color:#fff;
  font-size:12px;font-weight:600;padding:5px 13px;font-family:inherit}
