/* 金蝶云星空风格 · 成品库存管理系统 Web 版 */
:root{
  --kd:#1478FF; --kd-dark:#0D5FD6; --kd-light:#EAF2FF; --kd-border:#D6E4FF;
  --canvas:#F0F2F5; --card:#FFFFFF; --border:#E4E7EC; --text:#1F2329;
  --muted:#606B7A; --orange:#FA8C16; --orange-light:#FFF3E6;
  --red:#F52225; --green:#52C41A; --purple:#722ED1; --cyan:#00AEEF;
  --radius:8px; --shadow:0 1px 4px rgba(31,35,41,.08);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
/* 左侧模块导航占位：内容整体右移 64px；topbar 负 margin 拉回全宽 */
/* 侧栏固定宽度：--snw 常量（不随展开/收起变化，避免内容区左右跳动） */
body{--snw:92px;padding-left:var(--snw)}
.topbar{margin-left:calc(-1 * var(--snw))}
/* 窗口右侧纵向滚动条隐藏（用户要求去掉）：滚轮/键盘仍可正常滚动，只是不再显示那条滚动框；
   宽度也不被滚动条占位，各页宽度恒定不晃 */
html{overflow-y:auto; scrollbar-width:none}
html::-webkit-scrollbar,body::-webkit-scrollbar{width:0; height:0; display:none}
body{
  background:var(--canvas); color:var(--text);
  font-family:"Microsoft YaHei","微软雅黑",-apple-system,"PingFang SC",sans-serif;
  font-size:14px; min-height:100vh;
}
.hidden{display:none !important}

/* ---------- 顶栏（标题居中，对照原表主界面）---------- */
.topbar{background:linear-gradient(120deg, var(--kd-dark) 0%, var(--kd) 55%, #3E9BFF 100%); color:#fff;
  box-shadow:0 2px 12px rgba(13,95,214,.35); position:sticky; top:0; z-index:100}
.topbar::after{content:""; position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(600px 120px at 18% 120%, rgba(255,255,255,.14), transparent 70%)}
.topbar-inner{position:relative; max-width:1600px; margin:0 auto; padding:14px 20px; min-height:76px;
  display:flex; align-items:center; justify-content:center}
/* 顶栏最左：仓库/车间看板按钮（2026-10-16 用户定版位置，与右侧 topbar-right 镜像） */
.topbar-left{position:absolute; left:20px; top:50%; transform:translateY(-50%); display:flex; align-items:center; gap:10px}
.brand{text-align:center}
.brand-cn{font-size:21px; font-weight:700; letter-spacing:2px}
.brand-en{font-size:19px; font-weight:700; letter-spacing:1.5px; margin-top:3px; opacity:.95}
.topbar-right{position:absolute; right:20px; top:50%; transform:translateY(-50%); display:flex; align-items:center; gap:12px}
.badge{background:rgba(255,255,255,.18); padding:4px 10px; border-radius:12px; font-size:12px}
.btn-ghost{background:transparent; border:1px solid rgba(255,255,255,.6); color:#fff; padding:5px 14px;
  border-radius:6px; cursor:pointer; font-size:13px; font-family:inherit}
.btn-ghost:hover{background:rgba(255,255,255,.16)}

/* ---------- 多标签页签栏（仿 ERP：同时开多个页面，点标签切换不丢状态，× 关闭） ---------- */
.tabbar{max-width:1600px;margin:10px auto 0;padding:0 20px;display:flex;align-items:flex-end;gap:4px;
  overflow-x:auto;scrollbar-width:none;
  position:sticky;top:120px;z-index:90;background:var(--canvas)}   /* 吸顶：贴在蓝色顶栏正下方（120=实测顶栏高度，JS 会再动态校准） */
.tabbar::-webkit-scrollbar{display:none}
.tabbar .tb{flex:0 0 auto;max-width:220px;display:flex;align-items:flex-end;gap:6px;padding:9px 14px 4px 16px;
  font-size:13px;font-weight:600;color:var(--muted);background:transparent;border:1px solid transparent;
  border-bottom:none;border-radius:8px 8px 0 0;cursor:pointer;user-select:none;white-space:nowrap;overflow:hidden}
.tabbar .tb:hover{color:var(--kd);background:rgba(20,120,255,.06)}
.tabbar .tb.on{color:var(--kd);background:var(--card);border-color:var(--border);position:relative;top:1px}
.tabbar .tb-ico{width:14px;height:14px;flex:0 0 auto;display:inline-flex}
.tabbar .tb-ico svg{width:14px;height:14px;display:block}
/* 标签之间的竖线分隔（两个都非激活的标签之间才插，激活白底块两侧不插） */
.tabbar .tb-sep{flex:0 0 1px;width:1px;height:14px;background:var(--border);align-self:center}
/* 关闭叉号：只在当前选中的标签上显示 */
.tabbar .tb-x{flex:0 0 auto;width:16px;height:16px;line-height:14px;text-align:center;border-radius:4px;
  font-size:15px;font-weight:400;color:var(--muted);opacity:.55;display:none}
.tabbar .tb.on .tb-x{display:block}
.tabbar .tb-x:hover{opacity:1;background:#FDEAEA;color:var(--red)}

/* ---------- 左侧模块导航（仿 ERP：竖排图标+名称，点击弹出功能面板） ---------- */
.sidenav{position:fixed;left:0;top:76px;bottom:0;width:var(--snw);z-index:90;background:var(--card);
  border-right:1px solid var(--border);display:flex;flex-direction:column;align-items:stretch;overflow-y:auto;scrollbar-width:none}
.sidenav::-webkit-scrollbar{display:none}
.sn-home{display:flex;flex-direction:column;align-items:center;gap:3px;padding:12px 4px;cursor:pointer;
  color:var(--muted);border-bottom:1px solid var(--border)}
.sn-home:hover{color:var(--kd);background:var(--kd-light)}
.sn-home svg{width:20px;height:20px;display:block}
.sn-home span{font-size:11px;font-weight:600}
/* 一级菜单：深色粗体 13px + 16px 图标，白底，与二级拉开对比 */
.sn-item{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:7px;
  padding:12px 7px;cursor:pointer;color:#2B3444;background:var(--card);
  border-bottom:1px solid #EAEEF4;user-select:none;white-space:nowrap;overflow:hidden}
.sn-item:hover,.sn-item.on{color:var(--kd);background:var(--kd-light)}
.sn-item.sn-soon{opacity:.4}
.sn-item svg{width:16px;height:16px;flex:0 0 16px;display:block;color:var(--snc,#5A6B85)}
.sn-txt{font-size:13px;font-weight:700;line-height:1.2;text-align:left}
.sn-caret{margin-left:auto;opacity:.7;transition:transform .16s}
.sn-item .sn-caret{width:10px;height:10px;flex:0 0 10px;color:#8A94A3}
.sn-ware.open .sn-caret{transform:rotate(180deg)}
/* 二级菜单：缩进 + 浅灰底 + 12px 常规字重灰字，一眼看出是从属关系 */
.sn-sub{display:none;align-items:center;gap:6px;padding:7px 5px 7px 20px;cursor:pointer;
  font-size:12px;font-weight:500;color:#6E7A8A;background:#F6F8FB;border-bottom:1px solid #EFF3F8;
  user-select:none;white-space:nowrap;overflow:hidden}
.sidenav.open .sn-sub{display:flex}
.sn-sub .dot{width:5px;height:5px;border-radius:50%;flex:0 0 5px}
.sn-sub:hover{background:var(--kd-light);color:var(--kd)}
.sn-sub.on{background:var(--kd-light);color:var(--kd);font-weight:700;box-shadow:inset 4px 0 0 var(--kd)}
.sn-sub.sn-sub-soon{color:#AEB7C2}
.sn-sub.sn-sub-soon:hover{background:#F6F8FB;color:#AEB7C2}
/* 功能面板：鼠标滑过分组即弹出（点击同样生效），浮在内容区上方（按模块横向分栏，一个分区即一列，四列等宽） */
.sn-panel{position:fixed;left:var(--snw);top:76px;z-index:95;background:var(--card);border:1px solid var(--border);
  border-radius:0 8px 8px 0;box-shadow:0 8px 24px rgba(31,35,41,.14);padding:14px 16px 16px;
  display:grid;grid-auto-flow:column;grid-auto-columns:118px;column-gap:14px;align-items:start;
  max-width:calc(100vw - var(--snw) - 24px);max-height:calc(100vh - 90px);overflow:auto;
  animation:snIn .12s ease-out}
@keyframes snIn{from{opacity:0;transform:translateX(-4px)}to{opacity:1;transform:none}}
/* 分栏：列头 = 分区主题色小字 + 同色浅横线，下面纯文字条目 */
.sn-sec{padding:0 10px}
.sn-cap{font-size:12px;font-weight:600;color:var(--sec,var(--muted));letter-spacing:.4px;
  padding:0 10px 12px;margin:0 -10px 6px;border-bottom:1px solid var(--secline,var(--border))}
.sn-sec .sn-cap{color:var(--sec)}
.sn-col{display:flex;flex-direction:column}
.sn-func{display:block;padding:6px 10px;margin:0 -10px;border-radius:6px;cursor:pointer;white-space:nowrap;
  font-size:14px;font-weight:500;line-height:1.35;color:#2B3038}
.sn-func:hover{background:var(--kd-light);color:var(--kd)}
/* 窄屏（手机）隐藏侧栏：Web 端以桌面为主，防御性处理 */
@media (max-width:760px){
  body{padding-left:0}
  .topbar{margin-left:0}
  .sidenav,.sn-panel{display:none}
}

/* ---------- 容器 ---------- */
.view{max-width:1600px; margin:0 auto; padding:16px 20px 52px}   /* 底部留白给固定备案栏(单行)+置底横条 */
/* fit 页（整页一张表，如原始计划单）：页面不滚动，底部留白收紧让表格多露几行；
   老浏览器不支持 :has 时自动回退 52px 留白，仅表格略短，功能不受影响 */
body:has(.tbl-wrap[data-fit]) .view{padding-bottom:0}   /* fit 页内容底直接贴备案栏顶（2026-11-03 用户要求）；横条占位由 js core.js fit() 按需预留 */

/* ---------- 主界面（金蝶云星空风格：左模块标签 + 内容区 + 磁贴卡片）---------- */
.home-shell{display:flex; gap:12px; align-items:flex-start}
.home-side{flex:0 0 150px; width:150px; background:var(--card); border:1px solid var(--border);
  border-radius:var(--radius); box-shadow:var(--shadow); overflow:hidden; position:sticky; top:96px}
.hs-cap{padding:12px 16px 6px; font-size:12px; font-weight:700; color:var(--muted); letter-spacing:2px}
.hs-item{padding:12px 16px; font-size:14px; font-weight:600; color:var(--text); cursor:pointer;
  border-left:3px solid transparent; transition:background .15s, color .15s, border-color .15s}
.hs-item:hover{background:var(--kd-light); color:var(--kd)}
.hs-item.on{background:var(--kd-light); color:var(--kd); border-left-color:var(--kd)}
.home-main{flex:1; min-width:0}
.lib-soon-ico{width:64px; height:64px; margin:0 auto; border-radius:16px; background:var(--kd-light);
  display:flex; align-items:center; justify-content:center; color:var(--kd)}
.lib-soon-ico svg{width:32px; height:32px}
.home-grid{display:grid; gap:12px}
.section-card{background:var(--card); border:1px solid var(--border); border-radius:var(--radius);
  box-shadow:var(--shadow); display:flex; overflow:hidden; min-height:150px}
.section-label{width:200px; flex:0 0 200px;
  background:linear-gradient(160deg, var(--kd) 0%, var(--kd-dark) 100%);
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  color:#fff; padding:16px 10px; text-align:center; position:relative}
.section-label::after{content:""; position:absolute; right:8px; top:12px; width:26px; height:26px;
  border-radius:50%; background:rgba(255,255,255,.10)}
.section-label .cn{font-size:18px; font-weight:700; letter-spacing:2px}
.section-label .en{font-size:12px; font-weight:600; margin-top:6px; letter-spacing:.5px; opacity:.82}
.section-body{flex:1; display:flex; flex-wrap:wrap; align-items:center; gap:12px 14px; padding:16px 26px}
/* 商务磁贴：白卡 + 金蝶云星空式彩色图标底座 + 名称，hover 上浮描边 */
.menu-item{flex:0 0 calc(25% - 14px); min-width:168px; max-width:230px; box-sizing:border-box;
  display:flex; align-items:center; gap:12px; padding:13px 16px;
  background:#FBFCFE; border:1px solid var(--border); border-radius:10px; cursor:pointer;
  transition:border-color .18s, box-shadow .18s, transform .18s, background .18s; user-select:none}
.menu-item:hover{background:#fff; border-color:var(--kd); transform:translateY(-2px);
  box-shadow:0 8px 20px rgba(20,120,255,.16)}
.menu-item:active{transform:translateY(0); box-shadow:0 3px 8px rgba(20,120,255,.12)}
.mi-ico{width:42px; height:42px; flex:0 0 42px; border-radius:10px;
  background:#EEF4FF;
  display:flex; align-items:center; justify-content:center; color:var(--mi-c2, #2E6BE6);
  transition:background .18s, transform .18s}
.mi-ico svg{width:24px; height:24px; display:block; stroke-width:2}
.menu-item:hover .mi-ico{background:#E1ECFF; transform:scale(1.05)}
.mi-name{font-size:14px; font-weight:600; color:var(--text); transition:color .18s}
.menu-item:hover .mi-name{color:var(--kd)}

/* ---------- 通用卡片 / 标题 ---------- */
.card{background:var(--card); border:1px solid var(--border); border-radius:var(--radius);
  box-shadow:var(--shadow); margin-bottom:14px}
.card-hd{padding:12px 16px; border-bottom:1px solid var(--border); display:flex; align-items:center;
  justify-content:space-between; gap:12px; flex-wrap:wrap}
.card-hd h3{margin:0; font-size:15px; font-weight:700}
.card-hd h3::before{content:""; display:inline-block; width:3px; height:14px; background:var(--kd);
  margin-right:8px; vertical-align:-2px; border-radius:2px}
.card-bd{padding:14px 16px}
.card-bd.flush{padding:0}
/* 表格两边留 0.5cm（2026-10-30 用户定，10-30 下午更正量法）：原始计划单 / 基础资料 / 弃用资料 /
   库存查询 / 生产数据库 —— 照抄「原料数据库」「订单录入」的老做法：不是给卡片内边距，而是页面容器
   取消 1600px 限宽 + 左右各留 0.5cm，表格直接贴卡片边。
   原来写成 .card-bd 内 padding，宽屏下 .view 仍按 1600px 居中、左右空出 3cm+，用户一量就发现不对了。 */
.view[data-tab="plan-order"],.view[data-tab="plan-base"],.view[data-tab="deprecated"],
.view[data-tab="stock"],.view[data-tab="plan-db"],.view[data-tab="base"]{max-width:none; padding-left:.5cm; padding-right:.5cm}

/* ---------- 表单控件 ---------- */
.toolbar{display:flex; flex-wrap:wrap; gap:10px; align-items:flex-end}
.field{display:flex; flex-direction:column; gap:4px}
.field label{font-size:12px; color:var(--muted)}
input[type=text],input[type=number],input[type=date],input[type=password],select,textarea{
  border:1px solid var(--border); border-radius:6px; padding:6px 10px; font-size:13px;
  font-family:inherit; background:#fff; color:var(--text); outline:none; min-width:120px}
input:focus,select:focus,textarea:focus{border-color:var(--kd); box-shadow:0 0 0 2px rgba(20,120,255,.12)}
input[readonly]{background:#FAFBFC; color:var(--muted)}
.btn{border:1px solid var(--kd); background:#fff; color:var(--kd); border-radius:6px; padding:7px 16px;
  font-size:13px; cursor:pointer; font-family:inherit; font-weight:600; transition:all .15s}
.btn:hover{background:var(--kd); color:#fff}
.btn.primary{background:var(--kd); color:#fff}
.btn.primary:hover{background:var(--kd-dark)}
.btn.warn{border-color:var(--orange); color:var(--orange)}
.btn.warn:hover{background:var(--orange); color:#fff}
.btn.danger{border-color:var(--red); color:var(--red)}
.btn.danger:hover{background:var(--red); color:#fff}
.btn.sm{padding:4px 10px; font-size:12px}
.btn.gray{border-color:var(--border); color:var(--muted)}
.btn.gray:hover{background:#F5F6F8; color:var(--text)}
.btn:disabled{opacity:.5; cursor:not-allowed}

/* ---------- 表格 ---------- */
.tbl-wrap{overflow:auto; max-height:70vh}
table.tbl{width:100%; border-collapse:collapse; font-size:13px; white-space:nowrap}
table.tbl th{background:var(--kd-light); color:var(--kd); font-weight:700; padding:8px 10px; text-align:left;
  border-bottom:1px solid var(--kd-border); position:sticky; top:0; z-index:2; text-align:left}
table.tbl td{padding:7px 10px; border-bottom:1px solid #F0F1F3}
table.tbl tbody tr:hover{background:#F7FAFF}
table.tbl tbody tr.sel{background:#FFF6D9}
table.tbl td.num,table.tbl th.num{text-align:right; font-variant-numeric:tabular-nums}
table.tbl td.ctr,table.tbl th.ctr{text-align:center}
table.tbl tfoot td{background:#FAFBFC; font-weight:700; border-top:1px solid var(--border)}
/* 窄列截断（App.table 列 clip:true）：内容超宽截断加省略号，悬停 title 看全称 */
.cell-clip{overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
/* 表格横向滚动条（固定置底，App.table 通用）：只要表格横向超宽就常驻显示，
   固定钉在备案页脚正上方（备案单行横排后腾出的空间），不随页面/表格滚动而消失；
   与表格横向滚动双向同步；表格不超宽或切页后自动隐藏 */
.hsb{position:fixed; left:0; bottom:0; display:none; height:16px; z-index:58; overflow-x:auto; overflow-y:hidden;
  background:#E9EEF5; border-top:1px solid var(--border); box-shadow:0 -1px 5px rgba(30,50,80,.08)}
.hsb-in{height:1px}
.hsb::-webkit-scrollbar{height:16px}
.hsb::-webkit-scrollbar-thumb{background:#93A3B8; border-radius:8px; border:3px solid #E9EEF5}
.hsb::-webkit-scrollbar-thumb:hover{background:#6F82A0}
.hsb::-webkit-scrollbar-track{background:#E9EEF5}
/* 表格自带原生滚动条：纵向 12px 保留，横向隐藏（由固定置底横条接管，避免出现两条横条） */
.tbl-wrap::-webkit-scrollbar{width:12px; height:0}
.tbl-wrap::-webkit-scrollbar-thumb{background:#A9B6C7; border-radius:6px; border:2px solid #F2F5F9}
.tbl-wrap::-webkit-scrollbar-thumb:hover{background:#8FA0B6}
.tbl-wrap::-webkit-scrollbar-track{background:#F2F5F9}
/* keepHead 空表：0 行时表头/合计保留，空提示为通栏薄行（不加额外宽度，避免切换跳动） */
table.tbl tbody tr.empty-row td{padding:10px; text-align:center; color:#8A94A6; background:#fff}
table.tbl.zebra tbody tr.empty-row td{background:#fff}
/* 隔行各色（App.table zebra:true，与出入库单据表一致：偶数行浅蓝） */
table.tbl.zebra tbody tr:nth-child(even) td{background:#F4F8FF}
table.tbl.zebra tbody tr:hover td{background:#EAF3FF}
table.tbl.zebra tbody tr.sel td{background:#FFF6D9}
table.tbl.zebra tbody tr:nth-child(even) td.pin-r{background:#F4F8FF}
table.tbl.zebra tbody tr:hover td.pin-r{background:#EAF3FF}
table.tbl.zebra tbody tr.sel td.pin-r{background:#FFF6D9}
/* 数字列表头点击筛选（≠0）：可点、悬停变色、激活反蓝 */
table.tbl th.th-flt{cursor:pointer; user-select:none}
table.tbl th.th-flt:hover{background:#DCE9FF}
table.tbl th.flt-on{background:var(--kd) !important; color:#fff !important}
table.tbl th.flt-on::after{content:' ≠0'; font-size:11px; font-weight:700}
/* 右侧冻结列（App.table 列 pin:'right'）：横向滚动时钉在可视区右缘 */
table.tbl th.pin-r, table.tbl td.pin-r{position:sticky; z-index:1; border-left:1px solid var(--border);
  box-shadow:-6px 0 6px -6px rgba(30,40,60,.18)}
table.tbl td.pin-r{background:#fff}
table.tbl th.pin-r{background:var(--kd-light); z-index:3}
table.tbl tfoot td.pin-r{background:#FAFBFC; z-index:3}
/* 日报表（差补件统计表）：金蝶云星空风格 —— 两块汇总面板（数据项对齐原 Excel）+ 浅色表头表格 */
.dr-panels{display:flex; flex-wrap:wrap; gap:12px; padding:14px 16px 8px; align-items:stretch}   /* wrap：窄窗口下两个面板换行，别把整页顶宽（2026-11-03） */
.dr-panel{background:#fff; border:1px solid #E5E8EF; border-radius:8px; padding:12px 16px 14px; box-shadow:0 1px 3px rgba(30,40,60,.05); flex:0 0 auto}
.dr-panel > .dr-tbl{height:calc(100% - 32px)}
.dr-panel-hd{display:flex; align-items:center; gap:8px; font-size:13px; font-weight:600; color:#1D2129; margin-bottom:10px}
.dr-panel-hd i{flex:none; width:3px; height:14px; background:#2D6AFF; border-radius:2px}
.dr-panel-hd .dr-day{margin-left:auto; font-weight:400; color:#86909C; font-size:12px; padding-left:18px}
.dr-tbl{width:auto; border-collapse:collapse; font-size:12.5px}
.dr-tbl th{background:#EAF1FF; color:#2D6AFF; font-weight:600; padding:7px 16px; border:1px solid #DCE6FF; text-align:center; white-space:nowrap}
.dr-tbl td{padding:7px 16px; border:1px solid #F0F1F3; text-align:right; color:#1D2129; font-variant-numeric:tabular-nums; white-space:nowrap}
.dr-tbl td:first-child{text-align:center; font-weight:600; color:#4E5969; background:#FAFBFC}
.dr-tbl td.dr-neg{color:#F53F3F; font-weight:700}
.dr-tbl td.dr-tname{text-align:center}
/* 完成比例条形图（金蝶蓝） */
.dr-pbar{display:inline-flex; align-items:center; gap:8px}
.dr-pbar .trk{width:96px; height:10px; background:#EEF2F8; border-radius:5px; overflow:hidden; flex:none}
.dr-pbar .trk i{display:block; height:100%; border-radius:5px}
.dr-pbar .trk i.good{background:#22A45D}
.dr-pbar .trk i.warn{background:#E8850C}
.dr-pbar .trk i.bad{background:#F04438}
.dr-pval{font-variant-numeric:tabular-nums; font-size:12px; min-width:44px; text-align:left}
.dr-pval.good{color:#0A7B36}
.dr-pval.warn{color:#C86A00}
.dr-pval.bad{color:#D92D20}
.dr-card .tbl thead th{background:#EAF1FF; color:#2D6AFF; font-weight:600; border-bottom:2px solid #2D6AFF; padding:8px 5px; font-size:12px; white-space:nowrap}
.dr-card .tbl td{padding:7px 5px}
.dr-card .tbl tbody tr:hover{background:#F7FAFF}
/* 入库日期+1 / 差补件数 两列：淡蓝底，冻结右缘 */
.dr-card .tbl td.dr-due-c, .dr-card .tbl td.dr-lack-bg{background:#F0F6FF}
.dr-card .tbl td.dr-due-c .dr-date{color:#86909C}
.dr-card .tbl td.dr-lack-bg .dr-lack{color:#F53F3F}
.tag{display:inline-block; padding:1px 8px; border-radius:10px; font-size:11px; font-weight:700}
.tag.blue{background:var(--kd-light); color:var(--kd)}
.tag.red{background:#FFECE8; color:var(--red)}
.tag.green{background:#E8F8E0; color:var(--green)}
.tag.orange{background:var(--orange-light); color:var(--orange)}
.tag.gray{background:#F0F1F3; color:var(--muted)}
.empty{padding:36px; text-align:center; color:var(--muted)}

/* ---------- 看板 ---------- */
.kpi-row{display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:12px}
.kpi{background:#fff; border:1px solid var(--border); border-radius:var(--radius); padding:14px 16px; position:relative; overflow:hidden}
.kpi .k-label{font-size:13px; color:var(--muted)}
.kpi .k-value{font-size:28px; font-weight:800; margin-top:6px; font-variant-numeric:tabular-nums}
.kpi .k-sub{font-size:12px; color:var(--muted); margin-top:4px}
.kpi .k-bar{position:absolute; left:0; top:0; bottom:0; width:4px}
.kpi.c-in .k-bar{background:var(--kd)} .kpi.c-out .k-bar{background:var(--orange)}
.kpi.c-trip .k-bar{background:var(--cyan)} .kpi.c-bal .k-bar{background:var(--purple)}
/* 实色 KPI 卡（VBA 原版样式：整卡填充、白字，绿/蓝/橙/紫） */
.kpi.solid{border:none; color:#fff}
.kpi.solid .k-label{color:rgba(255,255,255,.92)}
.kpi.solid .k-value{color:#fff; text-align:center}
.kpi.solid .k-foot{display:flex; justify-content:space-between; font-size:12px; margin-top:8px; color:rgba(255,255,255,.88)}
.kpi.solid .k-foot.center{justify-content:center}
/* 双口径（2026-10-30 方案4）：大数字=套，紧跟小字单位「套」，再用更小的字附件数 */
.kpi .k-unit{font-size:15px; font-weight:700; font-style:normal; opacity:.8; margin-left:2px}
.kpi .k-pcs{font-size:12px; font-weight:600; opacity:.68; margin-left:5px; white-space:nowrap}
.kpi .k-pcs .k-pu{font-style:normal; font-size:11px; font-weight:600; margin-left:2px; opacity:.9}
.kpi.solid.c-in{background:#0FA958}
.kpi.solid.c-out{background:#1478FF}
.kpi.solid.c-trip{background:#FA8C16}
/* 总览关键数据环（方案C：五环形仪表，点环跳页签） */
.ov-rings{display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:12px}
@media (max-width:1100px){ .ov-rings{grid-template-columns:repeat(3,minmax(0,1fr))} }
.ov-ring-card{background:#fff; border:1px solid var(--border); border-radius:var(--radius); padding:10px 8px 8px; text-align:center; cursor:pointer; transition:border-color .15s, box-shadow .15s}
.ov-ring-card:hover{border-color:#9DBEFF; box-shadow:0 2px 10px rgba(20,120,255,.12)}
.ov-ring-box{position:relative; height:120px}
.ov-ring-box .chart{width:100%; height:120px}
.ov-ring-mid{position:absolute; left:0; right:0; top:50%; transform:translateY(-54%); pointer-events:none}
.ov-ring-mid b{display:block; font-size:19px; font-weight:700; line-height:1.15; font-variant-numeric:tabular-nums}
.ov-ring-mid span{display:block; font-size:11px; color:var(--muted); margin-top:3px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 6px}
.ov-ring-name{margin-top:6px; font-size:13px; color:var(--text); font-weight:600}
.kpi.solid.c-bal{background:#7C4DE8}
.kpi.solid.c-red{background:#E5484D}
/* 库龄区间徽章（对应饼图四色：绿/蓝/橙/红） */
.ag-badge{display:inline-block; padding:2px 10px; border-radius:10px; font-size:12px; font-weight:600}
.ag-badge.ag0{background:#E8F5EC; color:#009639}
.ag-badge.ag1{background:#E8F1FF; color:#1476FF}
.ag-badge.ag2{background:#FBF0E0; color:#D97706}
.ag-badge.ag3{background:#FDEBEB; color:#DC2626}
/* 库龄分析：左侧标签栏（KPI+筛选竖排） + 右侧饼图/数据 */
.ag-layout{display:grid; grid-template-columns:230px 1fr; gap:18px; align-items:start}
.ag-side{min-width:0}
.ag-main{min-width:0}
.ag-side-h{font-size:12px; color:#606B7A; margin:14px 0 8px; font-weight:500}
.ag-kpis-v{display:flex; flex-direction:column; gap:8px}
.ag-kpi{background:#F7F8FA; border-radius:8px; padding:10px 14px}
.ag-kpi-l{font-size:12px; color:#606B7A}
.ag-kpi-v{font-size:20px; font-weight:700; margin-top:2px; color:#1F2329}
.ag-kpi-v.bad{color:#DC2626}
.ag-chips-v{display:flex; flex-direction:column; gap:6px}
.ag-chips-v .ag-chip{display:block; width:100%; text-align:left}
.ag-filter{display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin-bottom:10px}
.ag-chip{padding:4px 12px; border-radius:14px; border:1px solid #D8DCE5; background:#fff; font-size:12px; color:#444; cursor:pointer}
.ag-chip.c-ag0.on{background:#E8F5EC; border-color:#009639; color:#009639}
.ag-chip.c-ag1.on{background:#E8F1FF; border-color:#1476FF; color:#1476FF}
.ag-chip.c-ag2.on{background:#FBF0E0; border-color:#D97706; color:#D97706}
.ag-chip.c-ag3.on{background:#FDEBEB; border-color:#DC2626; color:#DC2626}
.ag-sel,.ag-inp{padding:5px 10px; border:1px solid #D8DCE5; border-radius:6px; font-size:12px; color:#333}
.ag-inp{width:170px}
@media (max-width: 900px){ .ag-layout{grid-template-columns:1fr} }
.ag-view{display:inline-flex; border:1px solid #D8DCE5; border-radius:6px; overflow:hidden}
.ag-vbtn{padding:4px 12px; border:0; background:#fff; font-size:12px; color:#444; cursor:pointer}
.ag-vbtn.on{background:#1478FF; color:#fff}
.ag-vbtn + .ag-vbtn{border-left:1px solid #D8DCE5}
.ag-st{display:inline-block; padding:2px 10px; border-radius:10px; font-size:12px; font-weight:600}
.ag-st.st0{background:#E8F5EC; color:#009639}
.ag-st.st2{background:#FBF0E0; color:#D97706}
.ag-st.st3{background:#FDEBEB; color:#DC2626}
th.ag-sort{cursor:pointer; user-select:none}
th.ag-sort:hover{color:#1478FF}
.up{color:var(--red)} .down{color:var(--green)}
.chart{width:100%; height:300px}
/* 收发分析：趋势图+TOP10 并排（窄屏自动单列）；图表高度加高更大气 */
.recv-grid{display:grid; grid-template-columns:1.55fr 1fr; gap:14px; margin-top:14px}
@media (max-width:1100px){ .recv-grid{grid-template-columns:1fr} }
/* 班组产能：左图 + 右侧当期目标达成汇总（VBA 版式，墨绿/欠产红） */
.team-flex{display:flex; gap:16px; align-items:stretch}
.team-flex .chart{flex:1; min-width:0}
.team-sum{width:230px; flex-shrink:0; display:flex; flex-direction:column; justify-content:center; gap:10px; border-left:1px solid var(--border); padding-left:16px}
.ts-note{font-size:12px; color:var(--muted); margin-bottom:2px}
.ts-row{display:flex; justify-content:space-between; align-items:center}
.ts-row span{font-size:13px; color:var(--muted)}
.ts-row b{font-size:16px; font-weight:800; color:#006633; font-variant-numeric:tabular-nums}
.ts-row b.bad{color:#D64545}
@media (max-width:1100px){ .team-flex{flex-direction:column} .team-sum{width:100%; border-left:none; padding-left:0; border-top:1px solid var(--border); padding-top:12px} }
/* 班组产能：可点提示（点柱子/明细行 → 收发明细查询弹窗） */
#teamTable tbody tr{cursor:pointer}
#teamTable tbody tr:hover td{background:#F0F6FF}
/* 收发明细查询弹窗（VBA 产量统计到班组 版式：班组×每日矩阵 + 达标绿/未达粉 + 汇总浅蓝） */
.recv-wrap{overflow-x:auto; border:1px solid #E3E8F0; border-radius:6px}
table.recv{border-collapse:separate; border-spacing:0; font-size:12px; white-space:nowrap; width:100%}
table.recv th, table.recv td{border-right:1px solid #E9EDF3; border-bottom:1px solid #E9EDF3; padding:5px 8px; text-align:center; min-width:44px; font-variant-numeric:tabular-nums}
table.recv thead th{background:#F5F7FA; font-weight:600; color:#1F2329}
table.recv th.c1, table.recv td.c1, table.recv th.c2, table.recv td.c2, table.recv th.c3, table.recv td.c3{position:sticky; z-index:2; background:#fff}
table.recv thead th.c1, table.recv thead th.c2, table.recv thead th.c3{z-index:3; background:#F5F7FA}
table.recv th.c1, table.recv td.c1{left:0; min-width:40px; width:40px; padding:5px 4px}
table.recv th.c2, table.recv td.c2{left:40px; min-width:60px; width:60px}
table.recv th.c3, table.recv td.c3{left:100px; min-width:66px; width:66px; font-weight:600}
table.recv td.rc-good{background:#C6EFCE}
table.recv td.rc-bad{background:#FFC7CE}
table.recv tr.rc-sum td{background:#EAF2FF; font-weight:700}
table.recv td.rc-focus{outline:2px solid #2D6AFF; outline-offset:-2px; font-weight:700}
table.recv tr.rc-row-focus td.c2{color:#2D6AFF; font-weight:700}
.recv-note{margin-top:8px; color:#8A94A6; font-size:12px}
.recv-note .rc-dot{display:inline-block; width:12px; height:12px; border-radius:3px; vertical-align:-2px; margin:0 3px 0 6px}
.recv-note .rc-dot.rc-good{background:#C6EFCE}
.recv-note .rc-dot.rc-bad{background:#FFC7CE}
/* 订单齐套：绿/红双卡（VBA 写齐套核对卡片复刻），每页 3 行 + 翻页 + 明细查询 */
.kit-grid{display:grid; grid-template-columns:1fr 1fr; gap:14px}
@media (max-width:1100px){ .kit-grid{grid-template-columns:1fr} }
.kit-card{border-radius:var(--radius); padding:12px 14px; border:1px solid transparent}
.kit-card.ok{background:#EAF7EF; border-color:#B7E4C7}
.kit-card.bad{background:#FDEEEE; border-color:#F5C6C6}
.kit-card .kit-hd{display:flex; justify-content:space-between; align-items:center; margin-bottom:8px}
.kit-card .kit-hd b{font-size:14px}
.kit-card.ok .kit-hd b{color:#0A7B36} .kit-card.bad .kit-hd b{color:#C0392B}
.kit-card .btn{background:#fff}
.kit-rows{display:flex; flex-direction:column; gap:6px; min-height:96px}
.kit-row{display:flex; align-items:center; gap:10px; background:#fff; border-radius:6px; padding:7px 10px; font-size:13px}
.kit-row .kr-no{font-weight:700; min-width:110px}
.kit-row .kr-d{color:var(--muted); min-width:86px}
.kit-row .kr-r{font-weight:700}
.kit-card.ok .kr-r{color:#0A7B36} .kit-card.bad .kr-r{color:#C0392B}
.kit-row .kr-g{margin-left:auto; color:var(--muted); font-size:12px}
.kit-card .kit-ft{display:flex; justify-content:flex-end; margin-top:8px}
.kit-empty{display:flex; align-items:center; justify-content:center; min-height:96px; color:var(--muted); font-size:13px}
.kit-pick{max-height:420px; overflow:auto; display:flex; flex-direction:column; gap:6px}
.kit-row.pick{cursor:pointer} .kit-row.pick:hover{background:#F0F6FF}
.kit-row.pick.on{outline:2px solid #1478FF; background:#F0F6FF}
/* 点行展开的核对明细表（VBA：蓝表头 + 齐套绿/不齐套红 + 合计行） */
.kit-detail{margin-top:14px; background:#fff; border:1px solid var(--border); border-radius:var(--radius); overflow:hidden}
/* 下钻弹窗固定数据区高度（10 行）：kt-fixed 由 JS 按实际行高设定 height，超出滚动、表头/合计驻留 */
.kit-detail.kt-fixed{overflow:auto}
.kit-detail.kt-fixed .tbl thead th{position:sticky; top:0; z-index:2}
.kit-detail.kt-fixed .tbl tfoot td{position:sticky; bottom:0; z-index:2}
.kit-detail .tbl thead th{background:#1478FF; color:#fff; border-color:transparent}
.kit-detail .tbl td{font-size:13px}
/* 下钻弹窗内可点行（再下钻产品明细） */
.kit-detail tbody tr.kit-row-link{cursor:pointer}
.kit-detail tbody tr.kit-row-link:hover td{background:#F0F6FF}
.kit-detail .tbl tfoot td{background:#F5F7FA}
.kd-ok{color:#0A7B36; font-weight:700}
.kd-bad{color:#C0392B; font-weight:700}
tr.kit-bad-tr td{color:#C0392B}
.tfoot-sum td, .tbl tfoot td{font-weight:700; border-top:2px solid var(--border); background:#FAFBFC}
.recv-grid .chart{height:340px}
.recv-note{font-size:12px; color:var(--muted)}
.tabs{display:flex; gap:4px; border-bottom:1px solid var(--border); padding:0 16px}
.tabs .tab{flex:0 0 118px; width:118px; text-align:center; padding:9px 0; cursor:pointer; font-size:13px; font-weight:600; color:var(--muted);
  border-bottom:2px solid transparent; margin-bottom:-1px; transition:color .15s, border-color .15s, background .15s}
.tabs .tab:hover{color:var(--kd); background:var(--kd-light)}
.tabs .tab.on{color:var(--kd); border-bottom-color:var(--kd)}
/* 看板分页：统一最小高度 + 淡入过渡，切换无顿挫 */
.pane{min-height:560px}
.pane:not(.hidden){animation:paneIn .18s ease}
@keyframes paneIn{from{opacity:0; transform:translateY(4px)} to{opacity:1; transform:none}}

/* ---------- 单据 ---------- */
.doc-head{display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:10px}
.doc-title{font-size:18px; font-weight:800; text-align:center; margin-bottom:4px}
.doc-sub{text-align:center; font-size:12px; color:var(--muted); margin-bottom:10px}
.grid-table input{border:1px solid transparent; background:transparent; width:100%; padding:4px 6px}
.grid-table input:hover{border-color:var(--border)}
.grid-table input:focus{background:#fff; border-color:var(--kd)}

/* ---------- 单据版式（金蝶云星空风格：工具栏 / 字段行 / 表格 / 底部条）---------- */
.voucher{display:flex; flex-direction:column; background:var(--card);
  border:1px solid var(--border); border-radius:8px; overflow:hidden;
  box-shadow:0 1px 4px rgba(31,45,61,.06)}
/* 订单录入页：左右各只留 0.5cm（写死），宽屏不再两边大片留白；表格列随宽度自动摊开。
   用 #view[data-tab] 精确限定当前激活页（原写法是 :has(.entry-v)，但标签页是常驻 DOM，
   :has 会被隐藏标签命中，切到别的页也会贴边——2026-10-27 修正） */
.view[data-tab="plan-entry"]{max-width:none; padding-left:0.5cm; padding-right:0.5cm}
/* 顶部工具栏：单据标题居左，操作按钮居右 */
.v-head{display:flex; align-items:center; justify-content:space-between; gap:10px; flex-wrap:wrap;
  padding:10px 14px; border-bottom:1px solid var(--border);
  background:linear-gradient(180deg,#FBFDFF 0%,#F3F8FF 100%)}
.v-head-title{font-size:16px; font-weight:700; color:#1F2D3D; letter-spacing:1px; white-space:nowrap;
  padding-left:10px; border-left:3px solid var(--kd); line-height:1.2}
.v-head-actions{display:flex; gap:6px; flex-wrap:wrap}
.v-head-actions .btn{height:30px; min-width:86px; padding:0 10px; font-size:13px; border-radius:4px;
  justify-content:center; text-align:center}
/* 表头字段行：单号/日期/班组等横排 */
.v-fields{display:flex; align-items:center; gap:8px 20px; flex-wrap:wrap; padding:10px 14px;
  border-bottom:1px solid var(--border); background:#fff}
/* 左侧单据信息组（字段多了在组内自然换行成两排），右侧按钮组永远贴右（订单录入 2026-10-14 用户定版） */
.vf-left{display:flex; align-items:center; gap:8px 20px; flex-wrap:wrap; flex:1; min-width:0}
.vf-left .vf input,.vf-left .vf select{flex:1; min-width:0; width:auto}
/* 订单录入按钮组缩小一号（2026-10-14 用户要求） */
.entry-v .v-head-actions .btn{height:26px; min-width:60px; padding:0 10px; font-size:12px}
/* 单据编号输入框缩短（2026-10-14 用户要求） */
.entry-v #docNo{width:140px !important; flex:none}
/* 标签自然宽度（2026-10-14 晚用户要求：去两端撑满字距后，56px 定宽的右侧空隙也不要） */
.vf{display:flex; align-items:center; gap:6px}
.vf>label{font-size:12px; color:var(--muted); white-space:nowrap}
.vf input,.vf select{border:1px solid var(--border); border-radius:3px; padding:5px 8px;
  font-family:inherit; font-size:13px; outline:none; background:#fff}
.vf input:focus,.vf select:focus{border-color:var(--kd); box-shadow:0 0 0 2px rgba(20,120,255,.12)}
.vf-spacer{flex:1}
/* 表格区贴边满宽；scrollbar-gutter 稳定预留滚动条槽位，出现/消失不挤动列宽 */
.voucher-grid-wrap{overflow:auto; max-height:622px; scrollbar-gutter:stable}   /* 表头29+20行×28+合计27≈618，20行恰好全见 */
table.voucher-grid{width:100%; border-collapse:collapse; font-size:12.5px; table-layout:fixed}
/* table-layout:fixed —— 列宽严格按 colgroup 定宽执行，点击扩行/加行后列宽分毫不动 */
table.voucher-grid th{position:sticky; top:0; z-index:2; background:var(--kd); color:#fff; font-weight:700; text-align:center;
  padding:6px 2px; border:1px solid #3F8DFF; white-space:nowrap}   /* 左右2px：58px列可容4字表头(50px)不溢出 */
table.voucher-grid td{border:1px solid #D5DEEA; padding:0; text-align:center}
/* 行高统一 28px：占位行与有效行等高，点击扩展/加行时下方内容不再跳动 */
table.voucher-grid tbody tr{height:28px}
table.voucher-grid tfoot td{position:sticky; bottom:0; z-index:2}
table.voucher-grid tbody tr:nth-child(even) td{background:#F4F8FF}
table.voucher-grid tbody tr:hover td{background:#EDF5FF}
table.voucher-grid tbody tr.row-sel td{background:#FFF3D6}
table.voucher-grid td input{width:100%; min-width:0; height:26px; border:0; background:transparent; padding:2px 6px;
  font-family:inherit; font-size:12.5px; outline:none}   /* min-width:0 抵消全局表单 min-width:120px，否则窄列 input 溢出画进隔壁格 */
table.voucher-grid td input:focus{background:#E8F1FF; box-shadow:inset 0 0 0 1px var(--kd)}
table.voucher-grid td input::placeholder{color:#B6BFCB}
table.voucher-grid td.num input{text-align:left}   /* 用户要求：数量/比例等数字列左侧对齐 */
/* 序号格：悬停/选中时序号数字直接变成齿轮（仿 T+）。
   序号与齿轮绝对定位同位叠放，切换时格子尺寸零变化——彻底消除 hover 抖动 */
table.voucher-grid td.seq-cell{position:relative}
.seq-num{display:block; text-align:center; line-height:26px; font-size:12.5px; user-select:none}
.seq-gear{display:none; position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
  cursor:pointer; font-size:14px; line-height:1; color:var(--kd); padding:3px 6px; border-radius:3px}
.seq-gear:hover{background:#E3EEFF}
table.voucher-grid tbody tr:hover td.seq-cell .seq-num,
table.voucher-grid tbody tr.row-sel td.seq-cell .seq-num{display:none}
table.voucher-grid tbody tr:hover td.seq-cell .seq-gear,
table.voucher-grid tbody tr.row-sel td.seq-cell .seq-gear{display:inline-block}
/* 行操作菜单 */
.row-menu{position:fixed; z-index:1500; background:#fff; border:1px solid var(--border); border-radius:6px;
  box-shadow:0 6px 24px rgba(31,45,61,.16); padding:4px; min-width:150px}
.row-menu-item{display:flex; justify-content:space-between; align-items:center; gap:16px;
  padding:7px 12px; font-size:13px; cursor:pointer; border-radius:4px; color:var(--text)}
.row-menu-item:hover{background:#EDF5FF; color:var(--kd)}
.row-menu-item.danger{color:var(--red)}
.row-menu-item.danger:hover{background:#FFF1F1}
.rm-key{color:var(--muted); font-size:11px; font-weight:400}
table.voucher-grid tfoot td{background:#EAF2FF; border:1px solid #D5DEEA; font-weight:700; padding:5px 6px; text-align:center; white-space:nowrap; overflow:hidden}
table.voucher-grid tfoot td input{width:100%; min-width:0; border:0; background:transparent; font-family:inherit;
  font-size:12.5px; outline:none; padding:2px 6px; text-align:left}
/* 底部条：整单备注 + 制单人 */
.v-foot{display:flex; align-items:center; gap:12px 24px; flex-wrap:wrap; padding:10px 14px;
  border-top:1px solid var(--border); background:#FAFBFD}
.v-foot .vf{flex:1 1 380px}
.v-foot .vf input{width:100%}
.v-foot .vf.fix{flex:0 0 auto}
.v-foot .vf.fix input{width:100px}
/* 锁定字段（制单人=登录姓名 / 录单时间=系统记录）：灰底只读，不可编辑 */
.v-foot input[readonly]{background:#F2F4F7; color:#5A6270; cursor:default}
.v-foot input[readonly]:focus{border-color:var(--border); box-shadow:none}
.btn.red-text{border-color:#F5C2C2; color:var(--red)}
.btn.red-text:hover{background:#FFF1F1; color:var(--red)}

/* ---------- 弹窗 ---------- */
.mask{position:fixed; inset:0; background:rgba(31,35,41,.45); z-index:1000; display:flex;
  align-items:center; justify-content:center; padding:20px}
.mask .dlg{background:#fff; border-radius:10px; box-shadow:0 12px 40px rgba(0,0,0,.22);
  max-width:92vw; max-height:88vh; display:flex; flex-direction:column; overflow:hidden}
.dlg-hd{padding:12px 18px; border-bottom:1px solid var(--border); font-weight:700; font-size:15px;
  display:flex; justify-content:space-between; align-items:center}
.dlg-hd .x{cursor:pointer; color:var(--muted); font-size:20px; line-height:1}
.dlg-bd{padding:14px 18px; overflow:auto; flex:1}
.dlg-ft{padding:12px 18px; border-top:1px solid var(--border); display:flex; justify-content:flex-end; gap:10px}
/* 固定尺寸弹窗（opt.fixed）—— 资料查询专用：
   数据区恒定高度（内滚），说明行/按钮行按内容自然排布，任何环境下都不会被裁切；
   各区块高度恒定 → 弹窗整体尺寸恒定 = 窗体大小锁定 */
.mask .dlg.dlg-fixed{height:auto}
.mask .dlg.dlg-fixed .dlg-bd{display:flex; flex-direction:column; overflow:visible; padding:10px 14px 8px}
.mask .dlg.dlg-fixed .py-pick{display:flex; flex-direction:column; gap:8px}
.mask .dlg.dlg-fixed .py-pg1,
.mask .dlg.dlg-fixed .py-pg2{display:flex; flex-direction:column; gap:8px}
.mask .dlg.dlg-fixed .py-pg2.hidden,
.mask .dlg.dlg-fixed .py-pg1.hidden{display:none}
/* 数据区：恒定高度，内部滚动 */
.mask .dlg.dlg-fixed .py-pg1 .py-grid-wrap{flex:0 0 auto; height:min(46vh, 500px); max-height:none}
/* 说明行、底部按钮区：内容自然高度，永不参与伸缩、永不被裁 */
.mask .dlg.dlg-fixed .py-foot{flex:0 0 auto}
.mask .dlg.dlg-fixed .py-bbar{flex:0 0 auto; flex-wrap:wrap; row-gap:6px}
/* AB包转换页：列表恒高、右栏自然高度（确定转换按钮始终可见） */
.mask .dlg.dlg-fixed .py-ab{flex:0 0 auto}
.mask .dlg.dlg-fixed .py-ab-main{display:flex; flex-direction:column; gap:8px}
.mask .dlg.dlg-fixed .py-ab-main .py-grid-wrap{height:min(40vh, 430px)}
.mask .dlg.dlg-fixed .py-recwrap{height:min(20vh, 200px); max-height:none}
.mask .dlg.dlg-fixed .py-abconv{margin-top:6px}

/* ---------- Toast ---------- */
/* z-index 2000 时会被大屏问题反馈抽屉（遮罩 3200 / 面板 3201）盖住，抽屉里操作的 ok/err 提示看不见 → 抬到 3300（2026-10-29） */
.toast-root{position:fixed; top:70px; right:20px; z-index:3300; display:flex; flex-direction:column; gap:8px}
.toast{background:#fff; border-left:4px solid var(--kd); border-radius:6px; padding:10px 16px;
  box-shadow:0 4px 16px rgba(0,0,0,.14); font-size:13px; min-width:180px; animation:slideIn .2s}
.toast.ok{border-left-color:var(--green)} .toast.err{border-left-color:var(--red)}
.toast.warn{border-left-color:var(--orange)}
@keyframes slideIn{from{opacity:0; transform:translateX(30px)}to{opacity:1; transform:none}}

/* ---------- 杂项 ---------- */
.row{display:flex; gap:10px; align-items:center; flex-wrap:wrap}
.spacer{flex:1}
.muted{color:var(--muted)}
.small{font-size:12px}
.right{text-align:right}
.nowrap{white-space:nowrap}
.mono{font-variant-numeric:tabular-nums}
.pager{display:flex; gap:8px; align-items:center; justify-content:flex-end; padding:10px 16px}
.hint{background:var(--kd-light); border:1px solid var(--kd-border); color:var(--kd-dark);
  padding:8px 12px; border-radius:6px; font-size:12px; margin-bottom:12px}

/* ================= 资料查询（frm资料查询 移植） =================
   配色沿用 VBA：表头 金蝶蓝底白字、文字 RGB(31,35,41)、
   选中行 RGB(234,242,255)、命中单元格 红# F52225 加粗、边框 RGB(217,217,217) */
.py-pick{display:flex; flex-direction:column; gap:10px}
.py-bar{display:flex; align-items:center; gap:10px; flex-wrap:wrap}
.py-bar .py-lb{font-weight:700; color:var(--kd-dark); font-size:13px}
.py-bar .py-kw{flex:1; min-width:280px; height:34px; border:1px solid var(--kd);
  border-radius:5px; padding:0 10px; font-size:14px; font-family:inherit}
.py-bar .py-kw:focus{outline:none; box-shadow:0 0 0 3px rgba(20,118,255,.16)}
.py-scopes{display:flex; gap:12px; align-items:center}
.py-scopes label{display:inline-flex; align-items:center; gap:4px; cursor:pointer;
  font-size:13px; color:var(--muted); user-select:none}
.py-scopes input{margin:0; accent-color:var(--kd)}
.py-scopes input:checked + span{color:var(--kd); font-weight:700}
.py-cnt{font-size:12px}

.py-grid-wrap{border:1px solid #D9D9D9; border-radius:5px; overflow:auto; max-height:56vh; background:#fff}
.py-grid{border-collapse:collapse; width:100%; table-layout:fixed; font-size:12.5px}
.py-grid th{position:sticky; top:0; z-index:2; background:var(--kd); color:#fff; font-weight:700;
  padding:7px 8px; text-align:left; white-space:nowrap; border-right:1px solid rgba(255,255,255,.28)}
.py-grid th:last-child{border-right:none}
.py-grid th.sortable{cursor:pointer; user-select:none}
.py-grid th.sortable:hover{background:#0F63D6}
.py-grid td{padding:4px 8px; border-bottom:1px solid #EDEDED; border-right:1px solid #F0F0F0;
  color:#1F2329; white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.py-grid td:last-child{border-right:none}
.py-grid tbody tr{cursor:pointer}
.py-grid tbody tr:hover td{background:#F7FAFF}
.py-grid tbody tr.sel td{background:#EAF2FF}
/* 右键转换完成后刚拆出的行：黄色高亮（放在 hover 后，覆盖悬停浅蓝） */
.py-grid tbody tr.hl td{background:#FFF1A0}
.py-grid tbody tr.hl td:first-child{box-shadow:inset 3px 0 0 #F5A623}
/* 命中搜索词的单元格：红字加粗（VBA 渲染逻辑，差额列除外） */
.py-grid td.hit{color:#F52225; font-weight:700}
/* 差额列着色：<0 红加粗；0<x<10 绿加粗 */
.py-grid td.neg{color:#F52225; font-weight:700}
.py-grid td.low{color:#00B050; font-weight:700}
.py-grid td.empty{text-align:center; color:#BBB; padding:22px}
.py-foot{display:flex; flex-direction:column; gap:4px; font-size:12px}
.py-foot b{color:var(--kd)}

/* 独立页面版：占满卡片宽度 */
.py-page .py-grid-wrap{max-height:calc(100vh - 300px); min-height:420px}

/* 资料查询：自动清除 / 状态行（对应 VBA ob自动清除 与 Me.Caption） */
.py-auto{display:inline-flex; align-items:center; gap:4px; cursor:pointer; font-size:12.5px;
  color:var(--muted); user-select:none; border-left:1px solid var(--border); padding-left:10px}
.py-auto input{margin:0; accent-color:var(--kd)}
.py-auto input:checked + span{color:var(--kd); font-weight:700}
.py-status{color:var(--kd); font-weight:700}

/* ================= 资料查询 1:1 版式（MultiPage 页签 / 双搜索框 / 底部按钮区） ================= */
.py-tabs{display:flex; gap:2px; border-bottom:2px solid var(--kd); margin-bottom:10px}
.py-tab{border:1px solid var(--kd-border); border-bottom:none; background:#F5F8FF; color:var(--muted);
  padding:7px 26px; cursor:pointer; font-size:13px; font-weight:700; font-family:inherit;
  border-radius:6px 6px 0 0; position:relative; top:2px}
.py-tab.on{background:var(--kd); color:#fff; border-color:var(--kd)}
.py-top1{display:flex; align-items:center; gap:8px; margin-bottom:8px; flex-wrap:wrap}
.py-top1 .py-lb{font-weight:700; color:var(--kd-dark); font-size:13px; white-space:nowrap;
  border:1px solid var(--kd-border); background:var(--kd-light); padding:5px 10px; border-radius:4px}
.py-top1 .py-kw2{width:120px; height:32px; border:1px solid var(--border); border-radius:5px; padding:0 8px; font-size:13px; font-family:inherit}
.py-top1 .py-kw{flex:1; min-width:260px; height:34px; border:1px solid var(--kd);
  border-radius:5px; padding:0 10px; font-size:14px; font-family:inherit}
.py-top1 .py-kw:focus{outline:none; box-shadow:0 0 0 3px rgba(20,118,255,.16)}
.py-bbar{display:flex; align-items:center; gap:8px; margin-top:10px; flex-wrap:wrap}
.py-rgroup{display:inline-flex; align-items:center; gap:10px; font-size:12.5px; color:var(--muted);
  border-left:1px solid var(--border); padding-left:12px}
.py-rgroup b{color:#1F2329; font-weight:700; white-space:nowrap}
.py-rgroup label{display:inline-flex; align-items:center; gap:4px; cursor:pointer; user-select:none; white-space:nowrap}
.py-rgroup input{margin:0; accent-color:var(--kd)}
.py-rgroup input:checked + span{color:var(--kd); font-weight:700}

/* AB包转换页 */
.py-ab{display:flex; gap:12px; align-items:stretch}
.py-ab-main{flex:1; min-width:0}
.py-ab-side{width:320px; flex:0 0 320px; display:flex; flex-direction:column; gap:10px;
  border:1px solid var(--kd-border); background:var(--kd-light); border-radius:6px; padding:10px}
.py-ab-box{display:flex; flex-direction:column; gap:6px}
.py-ab-box .py-lb{font-weight:700; color:var(--kd-dark); font-size:12.5px}
.py-ab-box .row{display:flex; gap:6px}
.py-ab-box input[type=number]{flex:1; height:32px; border:1px solid var(--kd); border-radius:5px; padding:0 8px; font-family:inherit}
.py-recwrap{max-height:200px; min-height:120px}
.py-abconv{margin-top:auto; padding:9px; font-weight:700}
.py-editform .edit-grid{display:grid; grid-template-columns:1fr 1fr; gap:10px}

/* ---------- 外协装车单打印（复刻 m装车单打印.写一联内容：金蝶蓝表头/浅蓝合计/A4三联） ---------- */
#truckPrintArea{display:none}
.truck-copy{width:100%;box-sizing:border-box;padding:4px 0 6mm;font-family:'Microsoft YaHei','微软雅黑',sans-serif;color:#1F2329}
.truck-copy .tc-title{font-size:14pt;font-weight:700;text-align:center;padding:5px 0;letter-spacing:4px}
.truck-copy .tc-date{font-size:10pt;font-weight:700;text-align:right;padding:2px 4px 6px}
.truck-copy table{width:100%;border-collapse:collapse}
.truck-copy th{background:#1478FF;color:#fff;font-size:10pt;font-weight:700;padding:4px;border:1px solid #969696;text-align:center;-webkit-print-color-adjust:exact;print-color-adjust:exact}
.truck-copy td{font-size:10pt;padding:3px 4px;border:1px solid #969696;text-align:center;min-height:20px;height:24px}
.truck-copy td.num{text-align:center}
.truck-copy tr.tc-sum td{background:#EAF2FF;font-weight:700;-webkit-print-color-adjust:exact;print-color-adjust:exact}
.truck-copy .tc-sign{font-size:10pt;text-align:right;padding:6px 130px 2px 4px}
@media print{
  @page{size:A4 portrait;margin:8mm 9mm}
  body{background:#fff;margin:0;padding:0}
  /* 打印时隐藏全部界面元素：含多标签页签栏(#tabbar)/左侧导航(#sidenav)/浮层提示，
     2026-10-04 修复：页签栏此前未隐藏被打到第一联顶部 */
  body.print-truck .topbar,body.print-truck #view,body.print-truck #modalRoot,body.print-truck .crumb,
  body.print-truck #sidenav,body.print-truck #tabbar,body.print-truck #toastRoot,body.print-truck footer{display:none !important}
  body.print-truck #truckPrintArea{display:block}
  .truck-copy{page-break-inside:avoid;break-inside:avoid}
}
/* ---------- 订单核对总表（复刻 m订单核对总表：左绿齐套/右红不齐套横幅） ---------- */
.m-banner{color:#fff;font-weight:700;font-size:14px;text-align:center;padding:9px 0;border-radius:8px 8px 0 0;letter-spacing:1px}
/* 点行下钻逐产品明细（VBA「齐套情况」弹窗） */
#mBody tr.tr-pick{cursor:pointer}
#mBody tr.tr-pick:hover td{background:#F0F6FF}
.kit-total{margin-top:10px;text-align:center;font-size:13px;color:#334; background:#F5F7FA;border:1px solid var(--border);border-radius:6px;padding:7px 10px}
/* 下钻弹窗内缺件/差额红色用正红（VBA 同款） */
.kit-pop .kd-bad{color:#FF0000}

/* 单据查询弹窗（入库/出库）高度锁定：弹窗整体不滚动，唯一滚动条在数据区 .res —— 修双滚动条（2026-09-30 用户反馈） */
.mask .dlg.dlg-fit{height:min(86vh, 800px)}
.mask .dlg.dlg-fit .dlg-bd{display:flex; flex-direction:column; overflow:hidden}
.mask .dlg.dlg-fit .res{flex:1 1 auto; min-height:0; overflow:auto}
.mask .dlg.dlg-fit .res .tbl-wrap{max-height:none}   /* 解除表格容器自带 70vh 限高：否则 .res 和 .tbl-wrap 各出一条竖滚动条 */
/* 查询弹窗表头冻结：数据区滚动时表头钉在顶部 */
.dlg-fit .res thead th{position:sticky; top:0; z-index:2}

/* ---------- 原始计划单 A/B包 快速录入（点单元格编辑，回车跳下一行） ---------- */
.ab-cell{cursor:pointer;display:inline-block;min-width:26px;text-align:center;padding:1px 8px;border-radius:4px;border:1px dashed transparent}
tr:hover .ab-cell{border-color:#2D6AFF;color:#2D6AFF}
.ab-cell.empty{color:#b9c2d0}
tr:hover .ab-cell.empty{background:rgba(45,106,255,.06)}
/* 编辑态：输入框绝对定位悬浮在单元格上，不参与布局 —— 行高列宽零变化，页面不跳（2026-09-30 用户反馈） */
td.ab-editing{position:relative}
.ab-input{position:absolute;left:2px;top:2px;right:2px;bottom:2px;width:calc(100% - 4px);height:calc(100% - 4px);box-sizing:border-box;text-align:center;border:1px solid #2D6AFF;border-radius:4px;padding:0;margin:0;font:inherit;color:inherit;background:#fff;outline:none;box-shadow:0 0 0 2px rgba(45,106,255,.15);z-index:5;-moz-appearance:textfield;appearance:textfield}
.ab-input::-webkit-outer-spin-button,.ab-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}

/* ---------- 原始计划单 批量选择/批量操作 ---------- */
.row-sel{width:15px;height:15px;cursor:pointer;vertical-align:middle;accent-color:#2D6AFF}
.batch-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:#F0F5FF;border:1px solid #C7D7FF;border-radius:6px;padding:8px 14px;margin:0 14px 4px}
.batch-bar input[type=number]{padding:4px 8px;border:1px solid #C7D7FF;border-radius:4px}

/* ---------- 原始计划单 提取·工作表选择弹窗（VBA frm工作表选择） ---------- */
.shk-list{max-height:52vh;overflow-y:auto;padding:2px}
.shk-toolbar{display:flex;align-items:center;gap:8px;padding:2px 2px 10px;border-bottom:1px solid #E5E8EF;margin-bottom:6px}
.shk-file{font-weight:600;font-size:13px;color:#1D2129;padding:8px 2px 4px}
.shk-file .shk-err{font-weight:400;color:#D92D20;margin-left:8px;font-size:12px}
.shk-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer}
.shk-item:hover{background:#F0F5FF}
.shk-item input[type=checkbox]{width:15px;height:15px;cursor:pointer;accent-color:#2D6AFF;flex:none}
.shk-name{font-size:13px;color:#1D2129}
.shk-meta{margin-left:auto;font-size:12px;color:#86909C}
.shk-item.no-title .shk-name{color:#98A2B3}
.shk-item.no-title .shk-meta{color:#C0C8D4}

/* ---------- 装车单打印预览（WPS 风格：白纸逐页预览，「打印…」调起系统打印对话框选打印机） ---------- */
.tk-prev-bar{display:flex;align-items:center;gap:10px;padding:8px 14px;background:#F0F5FF;border-bottom:1px solid #C7D7FF;border-radius:8px 8px 0 0}
.tk-prev{background:#525659;padding:26px 14px 8px;overflow:auto;height:calc(82vh - 130px);border-radius:0 0 8px 8px}
.tk-page{width:794px;min-height:1123px;box-sizing:border-box;background:#fff;box-shadow:0 2px 12px rgba(0,0,0,.4);margin:0 auto 22px;padding:8mm 9mm;position:relative}
.tk-page-no{position:absolute;top:-20px;left:0;right:0;text-align:center;color:#e2e2e2;font-size:12px}

/* ---------- 权限设置树（账号 → 库 → 功能，经典树形：连接线 + 折叠箭头 + 勾选框） ---------- */
.pt-tree,.pt-tree ul{list-style:none;margin:0;padding:0}
.pt-tree{border:1px solid #E5E9F2;border-radius:8px;background:#fff;padding:10px 14px}
.pt-tree ul{padding-left:28px}
.pt-tree ul ul li{position:relative}
.pt-tree ul ul li::before{content:'';position:absolute;left:9px;top:0;bottom:0;border-left:1px solid #DCE1EA}
.pt-tree ul ul li::after{content:'';position:absolute;left:9px;top:18px;width:15px;border-top:1px solid #DCE1EA}
.pt-tree ul ul li:last-child::before{height:18px;bottom:auto}
.pt-tree li:not(.tr-open)>ul{display:none}
.tr-row{display:flex;align-items:center;gap:7px;padding:4px 10px 4px 2px;border-radius:6px;cursor:pointer;user-select:none}
.tr-row:hover{background:#F5F8FF}
.tr-caret{color:#8A94A6;font-size:10px;width:12px;text-align:center;flex:none;transition:transform .15s;display:inline-block}
.pt-tree li.tr-open>.tr-row>.tr-caret{transform:rotate(90deg)}
.tr-caret.leaf{visibility:hidden}
.tr-label{font-size:13px;color:#333B4A}
.tr-label.strong{font-weight:600;color:#1F2329;font-size:14px}
.tr-label.sub{font-size:12px;color:#5A6478}
.tr-realname{color:#8A94A6;font-size:12px}
.tr-count{color:#A0A8B8;font-size:12px}
.tr-check{width:14px;height:14px;cursor:pointer;accent-color:#2D6AFF;flex:none}
.pt-badge{margin-left:auto;font-size:12px;color:#5A6478;background:#F0F2F7;border-radius:10px;padding:2px 10px;white-space:nowrap}
.btn.mini{padding:2px 12px;font-size:12px;margin-left:8px;flex:none}
.btn.mini:disabled{opacity:.5;cursor:default}
.pt-user.pt-admin .pt-badge{background:#FFF3D6;color:#9A6B00;font-weight:600}
.pt-lib.pt-soon .tr-label{color:#A0A8B8}
.pt-lib.pt-soon .tr-count{color:#C0C6D2}

/* ---------- 订单齐套核对（输入即算，VBA 订单库存核对 移植） ---------- */
.oc-input{border:1px solid #E4EAF2;border-radius:8px;overflow:hidden;max-width:860px}
.oc-row{display:grid;grid-template-columns:1.25fr 1fr 0.95fr 1.1fr 0.7fr 34px;align-items:center;border-bottom:1px solid #EEF1F6;background:#fff}
.oc-cust{display:block;width:100%;height:31px;box-sizing:border-box;border:1px solid #E0E6EF;border-radius:6px;padding:5px 8px;font-size:13px;font-weight:600;color:#333B4A;background:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.oc-row:last-child{border-bottom:none}
.oc-head{background:#EAF2FF;color:#1478FF;font-weight:700;font-size:13px}
.oc-head span{padding:8px 10px;text-align:center}
.oc-row:not(.oc-head)>span{padding:4px 8px}
.oc-row input[type=text],.oc-row input[type=date]{width:100%;height:31px;border:1px solid #E0E6EF;border-radius:6px;padding:5px 8px;font-size:13px;font-weight:600;box-sizing:border-box}
.oc-row input:focus{outline:none;border-color:#1478FF}
.oc-res,.oc-gap{text-align:center;font-weight:700;font-size:13px;min-height:22px}
.oc-gap.over{color:#F5222D}
.oc-del{border:none;background:none;color:#B0B8C4;font-size:16px;cursor:pointer;padding:4px 8px}
.oc-del:hover{color:#F5222D}
.oc-tag{display:inline-block;padding:2px 10px;border-radius:10px;font-size:12px;font-weight:700;white-space:nowrap}
.oc-tag.ok{background:#EDFFF6;color:#52C41A}
.oc-tag.bad{background:#FFEBE6;color:#F5222D}
.oc-tag.warn{background:#FFF8E6;color:#D4890D}
.oc-summary{padding:8px 12px;background:#EAF2FF;border-radius:8px;font-size:13px;color:#5A6478;max-width:860px}
.oc-summary.good{color:#52C41A}
.oc-summary.bad{color:#F5222D}
.oc-tbl tbody tr.oc-sep td{background:#D6E4FF;height:8px;padding:0}
.oc-tbl tbody tr.oc-nf td{background:#FFF8E6;color:#D4890D;font-weight:600}
.oc-tbl tbody tr.oc-line.ok td{background:#F3FFF7}
.oc-tbl tbody tr.oc-line.bad td{background:#FFF8F6}
.oc-tbl tbody tr.oc-line{cursor:pointer}

/* ---------- 订单号联想下拉（拼音提示） ---------- */
.oc-ac{position:fixed;z-index:1300;background:#fff;border:1px solid #D9E2EF;border-radius:8px;box-shadow:0 8px 24px rgba(20,40,80,.16);max-height:330px;overflow:auto;font-size:13px;display:none}
.oc-ac-item{padding:7px 12px;cursor:pointer;border-bottom:1px solid #F2F5F9}
.oc-ac-item:last-of-type{border-bottom:none}
.oc-ac-item:hover,.oc-ac-item.on{background:#F0F5FF}
.oc-ac-item .l1{display:flex;align-items:center;gap:8px}
.oc-ac-item .l1 b{color:#1478FF;white-space:nowrap}
.oc-ac-item .l1 .sm{color:#A0A8B8;font-size:11px}
.oc-ac-item .l1 .oc-ac-dep{flex:none;font-size:10px;line-height:16px;padding:0 6px;border-radius:8px;background:#FDF0E3;color:#C4761A;font-weight:500}
.oc-ac-item .l1 .cust{margin-left:auto;color:#333B4A;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:45%}
.oc-ac-item .l2{color:#8A94A6;font-size:12px;margin-top:2px;display:flex;gap:8px}
.oc-ac-item .l2 span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.oc-ac-item .l2 i{font-style:normal;margin-left:auto;color:#5A6478;white-space:nowrap}
.oc-ac-cap{padding:5px 12px;color:#B0B8C4;font-size:11px;background:#FAFBFD;position:sticky;bottom:0}

/* ---------- 订单核对明细：右键转 A/B包 ---------- */
.oc-ctx{position:fixed;z-index:1400;background:#fff;border:1px solid #D9E2EF;border-radius:8px;box-shadow:0 8px 24px rgba(20,40,80,.18);font-size:13px;display:none;min-width:230px;overflow:hidden}
.oc-ctx-hd{padding:8px 12px;background:#F0F5FF;font-weight:600;color:#1F2A3D;display:flex;align-items:center;gap:8px}
.oc-ctx-hd span{margin-left:auto;font-weight:400;color:#5A6478;font-size:12px;white-space:nowrap;max-width:45%;overflow:hidden;text-overflow:ellipsis}
.oc-ctx-item{padding:8px 12px;cursor:pointer;border-bottom:1px solid #F2F5F9;display:flex;align-items:center;gap:8px}
.oc-ctx-item:last-of-type{border-bottom:none}
.oc-ctx-item:hover{background:#F0F5FF;color:#1478FF;font-weight:600}
.oc-ctx-item.cur{color:#52C41A;font-weight:600}
.oc-ctx-item.cur::after{content:'当前';margin-left:auto;font-size:11px;font-weight:400;background:#EDFFF6;color:#52C41A;padding:1px 8px;border-radius:8px}
.oc-ctx-item.danger{color:#F5222D;border-top:1px solid #FFE1D6}
.oc-ctx-item.danger:hover{background:#FFEBE6;color:#D4380D;font-weight:600}
.oc-ctx-cap{padding:5px 12px;color:#B0B8C4;font-size:11px;background:#FAFBFD}
.oc-tbl .oc-ab{cursor:pointer;color:#1478FF;font-weight:700;padding:0 6px;border-bottom:1px dashed #1478FF}
.oc-tbl .oc-ab-empty{color:#8C8C8C;font-weight:400}

/* ---------- 录入历史下拉（结算人员等，输入过一次就记住） ---------- */
.hist-dd{position:fixed;z-index:3000;background:#fff;border:1px solid #C7D7FF;border-radius:6px;box-shadow:0 8px 20px rgba(20,60,150,.15);max-height:220px;overflow:auto;padding:3px}
.hist-dd-item{padding:6px 10px;cursor:pointer;font-size:13px;color:#1F2A3D;border-radius:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hist-dd-item:hover,.hist-dd-item.on{background:#F0F5FF;color:#1478FF}

/* ---------- 齐套核对：点行过滤明细 ---------- */
.oc-row:not(.oc-head){cursor:pointer}
.oc-row:not(.oc-head) input{cursor:text}
/* 选中行：不染任何底色；用 ::after 覆盖层画「左亮蓝条 + 整行淡蓝描边」——
   必须画在单元格之上（格子的白底会把行自身的 box-shadow 盖住，导致标记显示不出来/线断开） */
.oc-row.sel{position:relative}
.oc-row.sel::after{content:'';position:absolute;inset:0;pointer-events:none;box-shadow:inset 3px 0 0 #1478FF, inset 0 0 0 1px #BCD7FF}
.oc-row.sel>span{background:#fff}
.oc-filter-bar{display:flex;align-items:center;gap:8px;margin:0 0 8px;padding:6px 12px;background:#EAF2FF;border:1px solid #BCD7FF;border-radius:6px;font-size:13px;color:#1478FF}
/* 明细网格上方提示条：列宽拖拽说明 + 恢复默认列宽按钮 */
.oc-grid-bar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 6px;padding:4px 10px;font-size:12px;color:#9AA5B4}
.oc-grid-bar a{color:#1478FF;text-decoration:none;font-size:12px}
.oc-grid-bar a:hover{text-decoration:underline}
.oc-filter-bar b{color:#0F66E0}
.oc-filter-bar .fclr{margin-left:auto;cursor:pointer;font-weight:700;color:#5A6478;padding:0 6px;font-size:15px;line-height:1}
.oc-filter-bar .fclr:hover{color:#F5222D}

/* ---------- 单品台账：产品资料卡 + A/B包 分节 ---------- */
.il-info{display:flex;flex-wrap:wrap;gap:6px 28px;padding:10px 16px;margin:0 0 4px;background:#F0F6FF;border:1px solid #9DBEFF;border-radius:8px}
.il-info .il-f{display:flex;align-items:baseline;gap:8px;font-size:13px;min-width:120px}
.il-info .il-f span{color:#6B7280;white-space:nowrap}
.il-info .il-f b{color:#1F2329;font-weight:700;word-break:break-all}
.il-sec{display:flex;justify-content:space-between;align-items:center;margin:14px 0 6px;padding:6px 12px;background:#EAF2FF;border-left:4px solid #4A7DFF;border-radius:4px;font-weight:700;font-size:14px;color:#1F2329}
.il-sec .il-bal{font-weight:400;color:#6B7280;font-size:13px;white-space:nowrap}
.il-sec .il-bal b{color:#1F2329;font-weight:700}
/* 多本账时标题可点击：只看该产品明细，再点一次恢复 */
.il-sec.clickable{cursor:pointer;transition:background .12s}
.il-sec.clickable:hover{background:#D6E4FF}
.il-sec.clickable .il-name{text-decoration:underline dotted #4A7DFF;text-underline-offset:3px}
.il-filterbar{display:flex;align-items:center;margin:12px 0 4px;padding:6px 12px;background:#FFF7E6;border:1px solid #FFD591;border-radius:4px;font-size:13px;color:#614700}
.il-filterbar b{color:#1F2329}
.il-filterbar .btn{margin-left:auto;padding:2px 12px;font-size:12px}

/* ---------- 盘点表 ---------- */
/* 585 行长表滚动时表头吸顶（.tbl-wrap 是滚动容器） */
.pd-tbl thead th{position:sticky;top:0;z-index:2}
/* 出入库单同款网格：蓝头白字 + 满格框线 + 合计行吸底。
   用 .tbl.pd-tbl 双类提权重（同分靠文件位置靠后取胜），压过 .dr-card .tbl thead th 等页面级旧样式 */
table.tbl.pd-tbl th{background:var(--kd);color:#fff;border:1px solid #3F8DFF;text-align:center}
table.tbl.pd-tbl td{border:1px solid #D5DEEA}
table.tbl.pd-tbl tbody tr:hover td{background:#EDF5FF}
table.tbl.pd-tbl tfoot td{position:sticky;bottom:0;z-index:2;background:#EAF2FF;border:1px solid #D5DEEA;font-weight:700;text-align:center;white-space:nowrap}
/* 截图/打印时取消合计行驻留：sticky 的 tfoot 在 html2canvas 长图里会被画到「可视区末尾」（表格超一屏时正好落在数据中间），
   打印分页时也会每页冒出来；body.shooting 由一键截图临时挂上，截完移除（2026-10-29 日报截图合计插数据中间修复） */
body.shooting table.tbl.pd-tbl tfoot td{position:static}
@media print{ table.tbl.pd-tbl tfoot td{position:static} }
table.tbl.pd-tbl .grip:hover::before,body.pd-colresizing table.tbl.pd-tbl .grip::before{background:rgba(255,255,255,.85)}   /* 蓝头上的拖拽线用白色 */
/* 打印空白盘点表：body.print-stock 由按钮临时挂上，打完移除。
   解除 .tbl-wrap 70vh 限高与裁剪，否则只能打出滚动可视区那一截 */
@media print{
  body.print-stock .tbl-wrap{max-height:none !important;overflow:visible !important}
  body.print-stock .card-hd .btn{display:none !important}   /* 按钮不打，日期/筛选字段保留 */
  body.print-stock .card-hd{border-bottom:none}
}
/* 列宽拖拽（仿用友T+）：手柄贴表头右缘，悬停/拖动显蓝线；表格右侧富余留灰底 */
/* 列宽拖拽（仿用友T+）：手柄贴表头右缘，悬停/拖动显蓝线；App.table colDrag 表格通用 */
/* 手柄必须完全落在本列内：原来 right:-3px 会伸进下一列表头，而 sticky 表头同 z-index 时后面的兄弟在上层，
   于是手柄被下一列盖住、点下去落在下一列上完全没反应（2026-10-30 修）。改成本列右边缘内侧 9px。 */
table.tbl .grip{position:absolute;top:0;right:0;width:9px;height:100%;cursor:col-resize;z-index:6}
table.tbl .grip::before{content:'';position:absolute;top:3px;bottom:3px;left:auto;right:2px;width:1px;background:transparent}
table.tbl .grip:hover::before,body.pd-colresizing table.tbl .grip::before{background:rgba(20,120,255,.55)}
body.pd-colresizing{cursor:col-resize !important;user-select:none !important}
#list .tbl-wrap{background:#fff}          /* 表格未铺满时的右侧/下方留白 */
@media print{ body.print-stock .pd-tbl .grip{display:none !important} }
/* pd-tbl 网格打印：保住蓝头/斑马/合计的底色（浏览器默认不打印背景色） */
@media print{
  table.pd-tbl th,table.pd-tbl tfoot td,table.pd-tbl tbody tr:nth-child(even) td{
    -webkit-print-color-adjust:exact;print-color-adjust:exact}
}
/* 蓝头网格上的「≠0」筛选表头状态（pd-tbl th 本身就是 --kd 蓝，悬停/激活要换色才看得出来） */
table.tbl.pd-tbl th.th-flt:hover{background:#3F8DFF}
table.tbl.pd-tbl th.flt-on{background:#0B57C2 !important}
/* 成品数据库单元格就地编辑：输入框/下拉贴满格子（全局 input min-width:120px 必须压掉） */
table.tbl.pd-tbl td.cell-editing{padding:1px 3px; background:#FFFDF2 !important}
table.tbl.pd-tbl td.cell-editing .cell-inp{width:100%;min-width:0;box-sizing:border-box;height:24px;padding:1px 4px;font-size:13px;line-height:20px}

/* 原料库·数据库（2026-10-27 用户定版：「我要这种贴边 0.5cm」）
   照抄「订单录入」页的做法：页面容器左右各留 0.5cm、取消 1600px 限宽，表格直接贴卡片边。
   用 #view[data-tab] 精确限定——只有原料数据库页生效，其它页面的 .view 内边距一概不动。 */
.view[data-tab="raw-db"]{max-width:none; padding-left:.5cm; padding-right:.5cm}

/* 原料库·库存查询（2026-10-27 用户要求「两边空一样宽度」）：
   按物料模式列宽固定、表格往往比容器窄，默认靠左导致右侧空白比左侧宽；改成整表居中，两侧留白相等。
   表格比容器宽时 margin:auto 不生效，仍可横向滚动，不影响。 */
.card-bd.rstock-list .tbl-wrap > table.tbl{margin-left:auto; margin-right:auto}

/* 原料库·库存查询 / 盘库（2026-10-27 定版）：表头、数据、合计行一律居中，整表一条中轴。
   只作用于带 raw-num-r 类的表，不动日报表等既有 pd-tbl 页面。 */
table.tbl.pd-tbl.raw-num-r th,
table.tbl.pd-tbl.raw-num-r td,
table.tbl.pd-tbl.raw-num-r tfoot td{text-align:center}



/* ================= 技术部小 ERP（2026-10-06） ================= */
/* ---- 筛选 seg ---- */
.tk-segrow{display:flex;gap:18px;flex-wrap:wrap;padding-bottom:8px}
.tk-seg{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.tk-segcap{font-size:12px;color:var(--muted);margin-right:2px}
.tk-seg .btn.on{background:var(--kd);border-color:var(--kd);color:#fff}
/* ---- KPI ---- */
.tk-kpis{display:flex;gap:10px;flex-wrap:wrap;padding-bottom:10px}
.tk-kpi{flex:1;min-width:110px;background:#F7F9FC;border:1px solid var(--border);border-radius:8px;padding:8px 12px}
.tk-kpi-lb{font-size:12px;color:var(--muted);margin-bottom:2px}
.tk-kpi-vl{font-size:20px;font-weight:700;line-height:1.2}
/* ---- 泳道看板 ---- */
.tk-wrap{display:flex;gap:10px;overflow-x:auto;padding:2px 2px 10px;align-items:flex-start;min-height:200px}
.tk-col{flex:0 0 216px;background:#F7F9FC;border:1px solid var(--border);border-radius:10px}
.tk-colhd{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;border-bottom:1px solid var(--border)}
.tk-colname{font-size:13px;font-weight:700;cursor:default}
.tk-colcnt{font-size:12px;color:var(--muted);background:#fff;border:1px solid var(--border);border-radius:10px;padding:0 8px}
.tk-colbd{padding:8px;display:flex;flex-direction:column;gap:8px;max-height:calc(100vh - 340px);overflow-y:auto;min-height:60px}
.tk-empty{text-align:center;color:#B9C2CE;font-size:12px;padding:10px 0}
.tk-card{background:#fff;border:1px solid var(--border);border-radius:8px;padding:8px 10px;cursor:pointer;transition:.12s}
.tk-card:hover{border-color:var(--kd);box-shadow:0 2px 8px rgba(20,120,255,.12)}
.tk-card.late{border-left:3px solid var(--red)}
.tk-card.soon{border-left:3px solid var(--orange)}
.tk-no{font-size:11px;color:var(--muted)}
.tk-urg{color:#fff;background:var(--red);font-size:11px;border-radius:4px;padding:0 4px;font-weight:700}
.tk-name{font-size:13px;font-weight:600;margin:2px 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tk-meta{font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tk-due{font-size:11px;color:var(--muted);margin-top:3px}
.tk-done{background:#F2FBF6}
.tk-donecard{border:1px dashed var(--green);border-radius:8px;color:var(--green);text-align:center;padding:14px 6px;font-size:13px;cursor:pointer}
.tk-donecard:hover{background:#E8F8EF}
/* ---- 详情/表单 ---- */
.tk-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px 12px}
.tk-info{display:flex;flex-direction:column;gap:2px;font-size:13px}
.tk-info span{font-size:12px;color:var(--muted)}
.tk-prochint{margin-top:10px;font-size:12px;color:var(--muted);background:#F7F9FC;border-left:3px solid var(--kd);padding:6px 10px;border-radius:0 6px 6px 0}
.tk-tag{font-size:12px;font-weight:700;align-self:center;margin-left:auto}
/* ---- 通用小表格（结案汇总 / 制程说明） ---- */
.tk-tb{width:100%;border-collapse:collapse;font-size:13px}
.tk-tb th,.tk-tb td{border-bottom:1px solid var(--border);padding:7px 8px;text-align:left}
.tk-tb th{color:var(--muted);font-weight:600;background:#F7F9FC}
.tk-dot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:6px;vertical-align:1px}
/* ---- 基础数据字典 ---- */
.tk-dictgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px}
.tk-dictcol{border:1px solid var(--border);border-radius:10px;padding:10px 12px}
.tk-dictcap{font-weight:700;font-size:13px;margin-bottom:8px}
.tk-dictitem{display:flex;align-items:center;justify-content:space-between;padding:5px 0;border-bottom:1px dashed var(--border);font-size:13px}
.tk-dictitem:last-child{border-bottom:none}
.tk-dictops{display:flex;gap:4px;opacity:0;transition:.15s}
.tk-dictitem:hover .tk-dictops{opacity:1}
.tk-newinput{flex:1;border:1px solid var(--border);border-radius:6px;padding:5px 8px;font-size:13px;outline:none}
.tk-newinput:focus{border-color:var(--kd)}

/* —— 日工作计划深色分组视图（复用 tech-board.css 的 .tkb 体系，仅补本页交互所需） —— */
.tkb .btn[disabled]{opacity:.38;cursor:not-allowed}
.tkb .dtask.tksel{background:#1c2b3f;box-shadow:inset 3px 0 0 var(--blue)}
.tkb .dtask .row-sel{accent-color:#4c8dff;width:14px;height:14px;cursor:pointer;flex:none;margin-top:3px}
.tkb input[type="date"].tkb-date{background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:5px 10px;color:var(--tx);outline:none}
.tkb input[type="date"].tkb-date:focus{border-color:var(--blue)}
.tkb .cell-inp{background:#1b212a;border:1px solid #4c8dff;color:#e8ecf2;border-radius:6px;padding:2px 8px;font-size:13px;outline:none;width:100%;max-width:460px}
.tkb .cell-inp[type="date"]{max-width:150px;padding:1px 6px;color-scheme:dark}
/* 日工作计划：顶栏+KPI 卡整体吸顶（tk-daily 专属，优先级高于 tech-board.css 对 .topbar 的 relative 覆盖）。
   top:76px = 系统蓝色顶栏(.topbar sticky z-100, topbar-inner min-height:76px)的高度，吸在其正下方，否则会被盖住 */
.tk-daily .tkhead{position:sticky;top:76px;z-index:60;background:var(--bg);box-shadow:0 6px 14px rgba(0,0,0,.35)}
.tk-daily .topbar{position:relative;z-index:auto}
/* 日工作计划：不紧急不重要优先级改绿色（仅本页，看板保持大屏原配色）。
   用 .tkb.tk-daily 双类提权(0,4,0)：tech-board.css 在 app.css 之后加载，同 specificity 的 .tkb .pri.p-ni 会盖掉绿色 */
.tkb.tk-daily .pri.p-ni{background:rgba(47,191,113,.14);color:var(--green)}
.tkb .dtxt[data-field]{cursor:text}
.tkb .dno{flex:none;width:22px;height:22px;border-radius:50%;background:#223047;color:#9fb6d4;font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;margin-top:1px}
.tkb .dcarry{flex:none;font-size:11px;color:#f5a623;border:1px solid rgba(245,166,35,.5);border-radius:6px;padding:1px 7px;margin-left:8px;margin-top:2px;white-space:nowrap}
.tkb .dstime{font-size:12px;color:#8fa3bd;background:#1b2432;border-radius:8px;padding:2px 10px;white-space:nowrap}
.tkb .pri[data-field],.tkb .st[data-field],.tkb .dhrs[data-field],.tkb .drem[data-field],.tkb .dstime[data-field]{cursor:pointer}
.tkb .pri[data-field]:hover,.tkb .st[data-field]:hover,.tkb .dhrs[data-field]:hover,.tkb .dstime[data-field]:hover{filter:brightness(1.3)}
/* ---- 样品台账：pd-tbl 蓝白网格 + 合并单元格（2026-10-06） ---- */
.xl-wrap{overflow:auto;max-height:calc(100vh - 296px)}
.xl-tbl td{height:32px;padding:0 8px;vertical-align:middle}
.xl-tbl thead th{height:34px}
.xl-tbl td.merged{font-weight:600}
.xl-tbl .cell-clip{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.xl-urg{color:var(--red);font-weight:700}
.xl-tbl .cell-inp{width:100%;height:28px;border:2px solid #2F7BFF;border-radius:3px;padding:0 6px;font-size:13px;outline:none;box-sizing:border-box}
.xl-tbl select.cell-inp{padding:0 2px}
.xl-tbl td.c:not([data-k]){cursor:pointer}   /* 勾选格/序号格可点选整行 */
.tk-grid .field{min-width:0}   /* 4列弹窗里日期框等不被内容撑破（min-width:auto 兜底） */
/* 吸顶表头残影/漏字修复：sticky 表头在 Chrome 滚动时会把经过的行内容留成半透明残影，
   给滚动容器与吸顶表头各提升独立合成层后消失 */
.xl-wrap{transform:translateZ(0)}
.xl-tbl thead th{transform:translateZ(0);z-index:3}
/* ---- 序号格齿轮行操作菜单（VBA 单据式：增行/插行/复制行/删行） ---- */
.xl-tbl td.xl-no{position:relative}
.xl-tbl .no-gear{position:absolute;right:2px;top:50%;transform:translateY(-50%);width:18px;height:18px;border:none;background:transparent;border-radius:4px;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .12s}
.xl-tbl tr:hover .no-gear{opacity:1}
.xl-tbl .no-gear:hover{background:#DFEAFF}
.rowmenu{position:fixed;z-index:3000;display:none;background:#fff;border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 28px rgba(31,54,91,.18);padding:4px;min-width:150px}
.rowmenu .rm-it{display:flex;justify-content:space-between;align-items:center;gap:18px;padding:7px 12px;font-size:13px;cursor:pointer;border-radius:5px;color:#1F2329}
.rowmenu .rm-it:hover{background:#EDF5FF}
.rowmenu .rm-it.danger{color:var(--red)}
.rowmenu .rm-it small{color:#98A2B3;font-size:11px;font-weight:400}

/* ---- 订单录入·导入通知单选引擎（2026-10-27）：点「导入通知单」弹窗二选一，单击卡片即选中并进入选文件 ---- */
.pe-picks{display:flex;flex-direction:column;gap:10px}
.pe-pick{border:1px solid var(--border);border-radius:var(--radius);padding:11px 13px;cursor:pointer;transition:border-color .12s,background .12s,box-shadow .12s}
.pe-pick:hover{border-color:var(--kd);background:var(--kd-light);box-shadow:0 2px 8px rgba(20,120,255,.12)}
.pe-pick-hd{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text)}
.pe-pick-hd b{font-size:14px}

/* ---- 通知单识别进度浮层（2026-10-27）：识别一次 5~20 秒，只给一句 toast 会被当成卡死 ---- */
.np-mask{position:fixed;inset:0;background:rgba(31,35,41,.32);z-index:1200;display:flex;align-items:center;justify-content:center;padding:20px}
.np-box{width:430px;max-width:92vw;background:#fff;border-radius:12px;box-shadow:0 14px 44px rgba(0,0,0,.24);
  padding:20px 22px 16px;position:relative;overflow:hidden}
.np-box::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;background:linear-gradient(90deg,var(--kd),#5AA9FF);transition:background .2s}
.np-hd{display:flex;align-items:center;gap:9px;font-size:15px;font-weight:700;color:var(--text)}
.np-hd .np-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.np-spin{width:14px;height:14px;flex:0 0 auto;border:2px solid var(--kd-border);border-top-color:var(--kd);border-radius:50%;animation:np-spin .8s linear infinite}
@keyframes np-spin{to{transform:rotate(360deg)}}
/* 终态不再转圈：完成/失败用标题文字+配色表达，避免留一个停住的方块 */
.np-box.ok .np-spin,.np-box.err .np-spin{display:none}
.np-pct{font-size:14px;font-weight:700;color:var(--kd);font-variant-numeric:tabular-nums;flex:0 0 auto;min-width:42px;text-align:right}
.np-bar{margin:13px 0 9px;height:8px;border-radius:5px;background:#EDF1F7;overflow:hidden}
.np-bar>i{display:block;height:100%;width:0;border-radius:5px;background:linear-gradient(90deg,var(--kd),#5AA9FF);transition:width .18s linear}
.np-msg{font-size:12.5px;color:var(--muted);line-height:1.75;min-height:22px}
.np-msg b{color:var(--text);font-weight:600}
.np-time{margin-top:5px;font-size:11.5px;color:#98A2B3;font-variant-numeric:tabular-nums}
.np-ft{display:flex;justify-content:flex-end;gap:9px;margin-top:12px}
.np-ft.hidden{display:none!important}
/* 状态色：成功=绿、兜底=橙、失败=红 */
.np-box.ok::before{background:linear-gradient(90deg,#52C41A,#95DE64)}
.np-box.ok .np-pct{color:#389E0D}
.np-box.ok .np-bar>i{background:linear-gradient(90deg,#52C41A,#95DE64)}
.np-box.warn::before{background:linear-gradient(90deg,var(--orange),#FFC069)}
.np-box.warn .np-pct{color:#D46B08}
.np-box.warn .np-bar>i{background:linear-gradient(90deg,var(--orange),#FFC069)}
.np-box.err::before{background:linear-gradient(90deg,var(--red),#FF7875)}
.np-box.err .np-hd{color:#CF1322}
.np-box.err .np-pct{color:#CF1322}
.np-box.err .np-bar>i{background:linear-gradient(90deg,var(--red),#FF7875)}
