/* ============================================================
   设计交付系统 — 布局框架样式
   设计令牌体系参考 SRM（99-setting\SRM-参考）的 theme.css 收敛方式：
   · 单一主色 + 中性灰阶
   · 文字 4 档语义层级
   · 间距 4 的倍数（8 档）
   · 圆角/阴影 2 档
   ============================================================ */
:root{
  /* ★ 2026-10-31 界面配色统一浅蓝（用户确认取消黑夜/白天模式）
   *   · 背景统一浅蓝灰：页面底 #eef3fa、面板 #ffffff、浅蓝底 #eef4fb
   *   · 主色保持深蓝 #1f3a5f（与规范 VI 一致），hover 亮蓝 #2c5282
   *   · 表格格线用蓝灰，表头用深蓝底白字（数据密集场景对比度最高）
   *   详细配色规范见 界面配色规范.md */
  --bg:#eef3fa;
  --panel:#ffffff;
  --panel-2:#f5f8fc;
  --panel-3:#eef4fb;
  --border:#dde5f0;
  --border-2:#e8eef7;
  --border-strong:#c9d5e6;

  /* ★ 2026-10-30 需求 6：表格格线颜色单独抽出，便于统一调整
   *   原来直接复用 --border(#e3e7ed)，偏浅，打印/投影时几乎看不见。
   *   这里给表格专用一组变量，比通用边框更深一档（浅蓝灰系）。 */
  --grid-line:#c3d0e2;          /* 表格内部格线（行线 + 列线） */
  --grid-line-outer:#adbfd6;    /* 表格外框 */
  --grid-line-strong:#9fb3cd;   /* 表头分隔、行号列分隔 */

  /* 文字层级：4 档语义（对齐 SRM --text-1..4） */
  --text:#1a2536;        /* 标题/正文强调 */
  --text-1:#1a2536;
  --text-2:#4a586e;      /* 正文 */
  --text-3:#77849a;      /* 次要 */
  --text-4:#9aa6ba;      /* 占位/辅助 */

  --brand:#1f3a5f;
  --brand-2:#2c5282;
  --brand-soft:#e3edf8;
  --brand-light:#f0f5fc;
  --accent:#c8651a;
  --accent-soft:#fff3e6;
  --ok:#1a7f5a;
  --ok-soft:#e6f5ef;
  --warn:#a8760a;
  --warn-soft:#fdf6e3;
  --danger:#b03a3a;
  --danger-soft:#fdeaea;

  /* 间距：4 的倍数 8 档 */
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px;
  --sp-5:20px; --sp-6:24px; --sp-8:32px;

  --topbar-h:58px;
  --sidebar-w:250px;
  --radius:8px;
  --radius-sm:5px;
  --radius-lg:10px;

  /* 阴影：2 档梯度 */
  --shadow-1:0 1px 2px rgba(16,24,40,.06), 0 1px 3px rgba(16,24,40,.04);
  --shadow:0 1px 2px rgba(16,24,40,.06), 0 1px 3px rgba(16,24,40,.04);
  --shadow-2:0 4px 12px rgba(16,24,40,.10);
  --shadow-lg:0 12px 32px rgba(16,24,40,.14);

  --mono:"Cascadia Mono","Consolas","SFMono-Regular",ui-monospace,monospace;
  --sans:"Microsoft YaHei","PingFang SC","Segoe UI",system-ui,sans-serif;
}

/* ★ 2026-10-31：暗黑模式已取消（用户确认）。
 *   移除 html[data-theme="dark"] 变量覆盖与主题切换按钮，
 *   所有界面只用上方唯一一套浅蓝配色，彻底规避「黑底黑字」。 */

/* 滚动条统一（参考 SRM） */
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:#c3d0e2;border-radius:4px}
::-webkit-scrollbar-thumb:hover{background:#a8bcd4}

*{box-sizing:border-box}
/* hidden 属性优先：防止下方 display:grid/flex 覆盖而致默认可见 */
[hidden]{display:none !important}
html,body{height:100%;margin:0}
body{
  font:13.5px/1.55 "Microsoft YaHei","PingFang SC","Segoe UI",system-ui,sans-serif;
  background:var(--bg); color:var(--text);
  -webkit-font-smoothing:antialiased;
}
h1,h2,h3,h4{margin:0;font-weight:600}
ul{margin:0;padding:0;list-style:none}
button,input{font:inherit;color:inherit}
button{cursor:pointer;background:none;border:none}

.app{display:flex;flex-direction:column;height:100%}

/* ---------------- 顶栏 ---------------- */
.topbar{
  height:var(--topbar-h); flex:0 0 var(--topbar-h);
  display:flex; align-items:center; gap:16px; padding:0 16px;
  background:var(--panel); border-bottom:1px solid var(--border);
  box-shadow:var(--shadow); z-index:30;
}
.brand{display:flex;align-items:center;gap:10px;min-width:210px}
.logo{
  width:32px;height:32px;border-radius:7px;flex:0 0 32px;
  display:grid;place-items:center;
  /* ★ 2026-10-31：深蓝实底改浅蓝底深字（用户要求所有背景色浅蓝化） */
  background:var(--brand-soft);
  border:1px solid var(--border-strong);
  color:var(--brand);font-weight:700;font-size:13px;letter-spacing:.5px;
}
.brand-text h1{font-size:15px;letter-spacing:.3px}
.brand-text .subtitle{font-size:11px;color:var(--text-3)}
/* ★ 2026-10-31：头部品牌区的软件版本号（随 /api/version 动态更新） */
.brand-version{
  margin-left:6px;font-family:var(--mono,Consolas,monospace);
  font-size:10px;color:var(--brand);
  padding:1px 6px;border:1px solid var(--brand-soft);border-radius:99px;
  white-space:nowrap;
}

.topbar-center{flex:1;display:flex;justify-content:center;align-items:center;gap:10px}

/* ★ 2026-11-04：顶栏项目号动态下拉（带全局记忆） */
.projbox{
  position:relative;display:flex;align-items:center;
  width:170px;flex:0 0 170px;height:34px;
  background:var(--panel-2);border:1px solid var(--border);
  border-radius:var(--radius);
  transition:border-color .15s, box-shadow .15s;
}
.projbox:focus-within{border-color:var(--brand-2);box-shadow:0 0 0 3px var(--brand-soft)}
.projbox.has-value{border-color:var(--brand-2);background:var(--brand-soft)}
.proj-ico{position:absolute;left:9px;color:var(--text-3);font-size:12px;pointer-events:none}
.projbox input{
  flex:1;height:100%;border:none;background:none;outline:none;
  padding:0 26px 0 26px;font-size:12.5px;color:var(--text);
  font-family:var(--mono,Consolas,monospace);
}
.projbox input::placeholder{font-family:var(--sans);color:var(--text-4)}
.proj-clear{
  position:absolute;right:4px;width:20px;height:20px;border:none;background:none;
  color:var(--text-3);font-size:15px;line-height:1;cursor:pointer;border-radius:4px;
}
.proj-clear:hover{background:var(--border);color:var(--text)}

.searchbox{
  position:relative;display:flex;align-items:center;
  width:min(560px,100%);height:34px;
  background:var(--panel-2);border:1px solid var(--border);
  border-radius:var(--radius); transition:border-color .15s, box-shadow .15s;
}
.searchbox:focus-within{border-color:var(--brand-2);box-shadow:0 0 0 3px var(--brand-soft)}
.search-ico{position:absolute;left:10px;color:var(--text-3);font-size:15px}
.searchbox input{
  flex:1;height:100%;border:none;background:none;outline:none;
  padding:0 56px 0 30px;font-size:13px;
}
.searchbox kbd{
  position:absolute;right:8px;font-family:var(--mono);font-size:10px;
  padding:2px 6px;border:1px solid var(--border-strong);border-radius:4px;
  color:var(--text-3);background:var(--panel);
}

.topbar-right{display:flex;align-items:center;gap:10px;min-width:210px;justify-content:flex-end}
/* ★ 2026-11-05 需求：顶栏右侧版本号徽标 .env-chip 已删除（与左上角 brandVersion 重复） */
.icon-btn{
  width:30px;height:30px;border-radius:6px;
  display:grid;place-items:center;color:var(--text-2);
  transition:background .15s,color .15s;
}
.icon-btn:hover{background:var(--brand-soft);color:var(--brand)}
.user{display:flex;align-items:center;gap:8px;padding-left:10px;border-left:1px solid var(--border)}
.avatar{
  width:30px;height:30px;border-radius:50%;flex:0 0 30px;display:grid;place-items:center;
  background:var(--brand-soft);color:var(--brand);font-size:11px;font-weight:700;
}
.user-meta{display:flex;flex-direction:column;line-height:1.25}
.user-meta strong{font-size:12px}
.user-meta em{font-size:10.5px;color:var(--text-3);font-style:normal}

/* ---------------- 主体 ---------------- */
.body{flex:1;display:flex;min-height:0}

/* ---------------- 侧边栏 ---------------- */
.sidebar{
  width:var(--sidebar-w); flex:0 0 var(--sidebar-w);
  background:var(--panel); border-right:1px solid var(--border);
  display:flex; flex-direction:column; min-height:0;
}
.side-scroll{flex:1;overflow-y:auto;padding:10px 8px 4px}
.nav-group{margin-bottom:12px}
.nav-group-title{
  font-size:12px;font-weight:700;letter-spacing:.4px;
  color:var(--text-2);padding:7px 10px 5px;
  /* ★ 2026-10-31：分组可折叠 —— 标题变可点击，加箭头与 hover */
  display:flex;align-items:center;gap:7px;
  cursor:pointer;user-select:none;border-radius:5px;
  transition:color .12s,background .12s;
}
.nav-group-title:hover{color:var(--text);background:var(--panel-2)}
.nav-group-title .nav-arrow{
  font-size:13px;width:16px;text-align:center;line-height:1;
  font-weight:700;color:var(--text-3);
  transition:transform .12s,color .12s;opacity:1;
}
.nav-group-title:hover .nav-arrow{color:var(--text-2)}
.nav-group-title .nav-group-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 折叠态：隐藏该组全部条目 */
.nav-group.collapsed .nav-item{display:none}
.nav-group.collapsed{margin-bottom:6px}
.nav-item{
  display:flex;align-items:center;gap:9px;
  padding:7px 10px;border-radius:6px;
  color:var(--text-2);font-size:13px;cursor:pointer;
  transition:background .12s,color .12s;
  user-select:none;
}
.nav-item:hover{background:var(--panel-2);color:var(--text)}
.nav-item.active{background:var(--brand-soft);color:var(--brand);font-weight:600}
.nav-item .ico{width:16px;text-align:center;font-size:13px;opacity:.85}
.nav-item .label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nav-item .badge{
  font-size:10px;font-family:var(--mono);padding:1px 6px;border-radius:99px;
  background:var(--panel-2);color:var(--text-3);border:1px solid var(--border);
}
.nav-item.active .badge{background:#fff;border-color:transparent;color:var(--brand)}
.nav-item.disabled{opacity:.45;cursor:not-allowed}
.nav-sub{padding-left:12px;margin-top:2px}
.nav-sub .nav-item{font-size:12.5px;padding:5px 10px}

.side-foot{flex:0 0 auto;padding:10px;border-top:1px solid var(--border)}

/* ---- 侧边栏折叠 ---- */
.side-collapse{
  display:flex;align-items:center;justify-content:center;gap:6px;
  width:100%;margin-top:8px;height:28px;
  border:1px solid var(--border-strong);border-radius:6px;
  background:var(--panel);color:var(--text-3);
  font-size:11.5px;cursor:pointer;transition:all .13s;
}
.side-collapse:hover{border-color:var(--brand-2);color:var(--brand);background:var(--brand-soft)}

/* 折叠态：侧边栏收成窄条，只留图标 */
.app.side-collapsed{--sidebar-w:52px}
.app.side-collapsed .sidebar{width:52px;flex-basis:52px}
.app.side-collapsed .nav-item .label,
.app.side-collapsed .nav-item .badge,
.app.side-collapsed .nav-group-title,
.app.side-collapsed .sc-txt{display:none}
.app.side-collapsed .nav-item{justify-content:center;padding:8px 0}
.app.side-collapsed .nav-item .ico{font-size:15px}
.app.side-collapsed .side-foot{padding:8px 4px}
.app.side-collapsed .side-collapse .sc-ico{transform:rotate(180deg)}
.app.side-collapsed .brand-text{display:none}
.app.side-collapsed .side-scroll{padding:10px 4px 4px}
.app.side-collapsed .nav-group{margin-bottom:8px}
.app.side-collapsed .nav-sub{padding-left:0}

/* ---------------- 工作区 ---------------- */
.workspace{flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden}

/* ★ 2026-11-03 需求：移除页面头部的面包屑 / 标题 / 副标题。
 *   现在 .page-head 只承载各页面的功能按钮（pageActions）：
 *     · 有按钮 → 紧凑的一行，右对齐，与内容区左边缘对齐
 *     · 无按钮 → JS 给 #pageHead 加 hidden，整块不占任何空间
 *   保留 .crumb / .page-desc 的样式定义仅为向后兼容（节点已从 HTML 移除）。 */
.page-head{
  flex:0 0 auto;display:flex;align-items:center;justify-content:flex-end;
  gap:16px;padding:10px 22px 0;
}
.page-head[hidden]{display:none}
.page-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}

/* 兼容旧选择器（节点已移除，保留不影响渲染） */
.crumb{flex:0 0 auto;padding:9px 22px 0;font-size:11.5px;color:var(--text-3);display:flex;gap:6px;align-items:center}
.crumb b{color:var(--text-2);font-weight:500}
.page-head h2{font-size:18px;letter-spacing:.2px}
.page-desc{font-size:12px;color:var(--text-3);margin-top:3px}

/* ============================================================
 * ★ 新建 BOM&ECN 页：操作按钮居中
 *   需求（2610261725 截图批注）：把按钮组移到页面中间。
 *   2026-11-03 起标题已移除，改成用三栏 grid 让按钮组真正居中：
 *     左：1fr 空 ｜ 中：按钮（居中）｜ 右：1fr 空
 * ============================================================ */
body[data-page="newdoc"] .page-head{
  display:grid;
  grid-template-columns:1fr auto 1fr;
  align-items:center;
}
body[data-page="newdoc"] .page-actions{
  grid-column:2;justify-self:center;
}
body[data-page="newdoc"] .page-head::after{
  content:"";
  grid-column:3;
}

/* ============================================================
 * ★ 自定义确认框（需求 261027-0334 第 2 条）
 *   · 垂直居中并略微下移（原浏览器 confirm 偏上）
 *   · 按钮带 Y / N 快捷键提示
 * ============================================================ */
.modal.cfm-centered{
  align-items:center !important;
  place-items:center !important;
  padding-top:8vh;          /* 从正中往下压一点，视觉更舒服 */
}
.modal.cfm-centered .modal-box{
  max-width:460px;
  box-shadow:0 20px 50px rgba(16,24,40,.32);
}
.cfm-box{padding:4px 2px 2px}
.cfm-msg{
  font-size:13px;color:var(--text-2);line-height:1.75;
  white-space:pre-wrap;padding:6px 0 2px;
}
.cfm-msg.danger{color:var(--text);}
.cfm-msg.danger::before{
  content:"⚠ ";
  color:var(--danger);
}
.cfm-keys{
  font-size:11.5px;color:var(--text-3);margin-top:12px;
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
}
.cfm-keys kbd{
  display:inline-block;min-width:18px;padding:1px 6px;border-radius:4px;
  border:1px solid var(--border-strong);border-bottom-width:2px;
  background:var(--panel);font-family:var(--mono,Consolas,monospace);
  font-size:10.5px;color:var(--text-2);text-align:center;
}
.cfm-actions{
  display:flex;justify-content:flex-end;gap:8px;margin-top:16px;
  padding-top:14px;border-top:1px solid var(--border);
}
.btn.danger{
  background:var(--danger);color:#fff;border-color:var(--danger);
}
.btn.danger:hover{filter:brightness(.92)}

/* 登录框「记住登录」选项 */
.lg-remember{
  display:flex;align-items:center;gap:7px;margin-top:12px;
  font-size:12px;color:var(--text-2);cursor:pointer;user-select:none;
}
.lg-remember input[type=checkbox]{
  width:14px;height:14px;cursor:pointer;accent-color:var(--brand);
}

/* ============================================================
 * ★ 未登录锁定页（需求 261027-0334 第 3 条）
 * ============================================================ */
.lock-screen{
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  min-height:60vh;gap:14px;text-align:center;padding:40px 20px;
  user-select:none;
}
.lock-icon{
  font-size:52px;line-height:1;opacity:.55;
  filter:grayscale(.2);
}
.lock-title{
  font-size:19px;font-weight:600;color:var(--text);letter-spacing:.5px;
}
.lock-desc{
  font-size:12.5px;color:var(--text-3);max-width:380px;line-height:1.8;
}
.lock-screen .btn{margin-top:6px;padding:7px 26px}

/* ============================================================
 * ★ 明细区全屏（需求 2026-10-27）
 *   .nd-fs = 卡片铺满视口
 * ============================================================ */
.nd-head-btns{
  display:flex;align-items:center;gap:6px;margin-left:10px;
}
.nd-fs-btn{
  font-size:11.5px;padding:3px 11px;border-radius:6px;
  display:inline-flex;align-items:center;gap:4px;
}

/* 全屏态：卡片脱离文档流，铺满整个视口
 * ★ 2026-10-30 修正两处：
 *   ① z-index 从 900 提到 2000 —— 原来低于顶栏的层级关系导致表格与顶栏重叠
 *   ② inset 从 0 改为 top:0;left:0;right:0;bottom:0 并显式给 100dvh，
 *      避免移动端/缩放时高度算不准 */
.card.nd-fs{
  position:fixed;
  inset:0;
  z-index:2000;
  margin:0;
  border-radius:0;
  border:none;
  display:flex;
  flex-direction:column;
  background:var(--panel);
  box-shadow:0 0 0 100vmax rgba(16,24,40,.42);
  /* ★ 保证全屏层在最上方，不被 topbar/sidebar 覆盖 */
  isolation:isolate;
}
.card.nd-fs .card-head{
  flex:0 0 auto;
  padding:11px 20px;
  border-bottom:1px solid var(--border);
  background:var(--panel-2);
}
.card.nd-fs .card-head h3{
  font-size:14px;
}
.card.nd-fs .card-body{
  flex:1 1 auto;
  min-height:0;
  padding:0;
  /* ★ 2026-10-31 修复「全屏后表格被挤到右侧、左侧一大片空白」：
   *   原来只有 display:flex（默认 row），而 card-body 里有 .nd-foot（备注行）、
   *   .nd-toolbar、.nd-grid-wrap 三个子元素，row 方向会把它们排成左右三栏，
   *   表格被推到最右边。内部结构本是纵向的，必须用 column。 */
  display:flex;
  flex-direction:column;
  overflow:hidden;            /* ★ 避免撑破导致滚动条消失 */
}
.card.nd-fs .nd-grid-wrap{
  flex:1 1 auto;
  width:100%;
  /* ★ 需求修正：横向（x）与纵向（y）都要能滚 —— 原来只写 auto 在 flex 容器里
   *   配合 table-layout:fixed + width:max-content 时，横向滚动条被 flex 压掉 */
  overflow:auto;
  overflow-x:auto;
  overflow-y:auto;
  min-width:0;                /* ★ flex 子项允许收缩，否则超出被裁 */
  max-height:none !important;
}
/* 全屏时表头吸顶更明显 */
.card.nd-fs .nd-grid thead th{
  position:sticky;top:0;z-index:2;
}
/* 全屏时禁止背景滚动 */
body.nd-fs-lock{overflow:hidden}

/* ============================================================
 * ★ 2026-10-30 需求 3：全屏「只看表格」
 *   进入全屏后隐藏：卡片头（标题行）、工具栏（添加行/上传/校验等），
 *   只保留纯表格铺满整个视口；退出时全部恢复。
 *   用 body.nd-fs-pure 作开关，避免影响非全屏态。
 * ============================================================ */
body.nd-fs-pure .card.nd-fs .card-head{
  display:none !important;
}
/* ★ 全屏只看表格：备注行、工具栏都要隐藏（2026-10-31 补 nd-foot） */
body.nd-fs-pure .card.nd-fs .nd-toolbar,
body.nd-fs-pure .card.nd-fs .nd-foot,
body.nd-fs-pure .card.nd-fs [data-fs-hidden="1"]{
  display:none !important;
}
body.nd-fs-pure .card.nd-fs .card-body{
  padding:0 !important;
  border:none !important;
  overflow:hidden;
}
/* ★ 修正：原来写死 height:100vh，把表格高度撑满整个视口，
 *   导致第一行与顶栏视觉重叠、且横向滚动条被挤到屏幕外看不见。
 *   改为 100% 由 flex 分配（父级 .card.nd-fs 已是 inset:0 全屏）。 */
body.nd-fs-pure .card.nd-fs .nd-grid-wrap{
  max-height:none !important;
  height:100% !important;
  min-width:0;
  overflow:auto !important;
  overflow-x:auto !important;
  overflow-y:auto !important;
}
body.nd-fs-pure .card.nd-fs{
  box-shadow:none;
  border-radius:0;
  top:0;left:0;right:0;bottom:0;
}
/* 极简退出提示（不占表格空间） */
body.nd-fs-pure .card.nd-fs::after{
  content:"按 F 或 Esc 退出全屏";
  position:fixed;top:6px;right:14px;z-index:2100;
  font-size:11px;color:var(--text-3);
  background:rgba(255,255,255,.85);
  padding:2px 8px;border-radius:4px;
  pointer-events:none;opacity:.7;
}

/* ============================================================
 * ★ 查询字段配置（需求 261027-0354 第 1 条）
 * ============================================================ */
.cc-wrap{min-width:0}
.cc-cols{
  display:grid;grid-template-columns:repeat(3,1fr);gap:4px 14px;
  max-height:230px;overflow-y:auto;padding:10px 12px;
  border:1px solid var(--border);border-radius:8px;background:var(--panel-2);
}
.cc-row{
  display:flex;align-items:center;gap:7px;padding:5px 6px;border-radius:5px;
  font-size:12px;cursor:pointer;user-select:none;
}
.cc-row:hover{background:var(--brand-soft)}
.cc-row input[type=checkbox]{width:14px;height:14px;cursor:pointer;accent-color:var(--brand)}
.cc-row.cc-lock{opacity:.62;cursor:default}
.cc-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cc-tag{
  font-size:9.5px;padding:0 5px;border-radius:7px;
  background:var(--hint-soft, #eef2f7);color:var(--text-3);
}
.cc-tools{
  display:flex;align-items:center;gap:7px;margin-top:9px;font-size:11.5px;
}
.cc-tools .btn{font-size:11px;padding:2px 10px}
.cc-save{
  margin-top:14px;padding-top:13px;border-top:1px dashed var(--border);
}
.cc-save-title{font-size:12px;font-weight:600;color:var(--text-2);margin-bottom:9px}
.cc-scope{
  display:flex;align-items:center;gap:6px;font-size:12px;
  padding:3px 0;cursor:pointer;user-select:none;
}
.cc-scope input[type=radio]{width:14px;height:14px;cursor:pointer;accent-color:var(--brand)}
.cc-scope .hint{font-size:11px;margin-left:2px}
.cc-cols-cell{font-size:10.5px;line-height:1.9}
.cc-cols-cell .pill{font-size:9.5px;padding:0 6px;margin-right:2px}

/* ============================================================
 * ★ 升级日志（需求 261027-0354 第 3/4 条）
 * ============================================================ */
.cl-stats{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));
  gap:10px;margin-bottom:14px;
}
.cl-stat{
  border:1px solid var(--border);border-radius:10px;padding:13px 10px;
  text-align:center;background:var(--panel);
}
.cl-stat b{
  display:block;font-size:21px;line-height:1.2;color:var(--text);
  font-family:var(--mono,Consolas,monospace);
}
.cl-stat span{display:block;font-size:10.5px;color:var(--text-3);margin-top:3px}
.cl-stat.hero{
  /* ★ 2026-10-31：深蓝渐变实底改浅蓝底 */
  background:var(--brand-soft);
  border-color:var(--brand-2);
}
.cl-stat.hero b{color:var(--brand);font-size:24px;letter-spacing:.5px}
.cl-stat.hero span{color:var(--text-3)}

.cl-ver{margin-bottom:14px}
.cl-item{
  display:flex;gap:10px;padding:11px 0;
  border-bottom:1px solid var(--border);
}
.cl-item:last-child{border-bottom:none;padding-bottom:2px}
.cl-idx{
  flex:0 0 22px;height:22px;border-radius:50%;
  display:grid;place-items:center;font-size:10.5px;font-weight:600;
  background:var(--brand-soft);color:var(--brand);
  font-family:var(--mono,Consolas,monospace);
}
.cl-body{flex:1;min-width:0}
.cl-row{display:flex;gap:8px;align-items:flex-start;padding:1px 0}
.cl-tag{
  flex:0 0 auto;font-size:9.5px;padding:1px 7px;border-radius:8px;
  background:var(--hint-soft,#eef2f7);color:var(--text-3);white-space:nowrap;
  margin-top:1px;min-width:30px;text-align:center;
}
.cl-tag.ok{background:var(--ok-soft);color:var(--ok)}
.cl-tag.brand{background:var(--brand-soft);color:var(--brand)}
.cl-tag.danger{background:var(--danger-soft);color:var(--danger)}
.cl-tag.warn{background:var(--warn-soft);color:var(--warn)}
.cl-tag-space{flex:0 0 40px}
.cl-key{
  display:inline-block;min-width:30px;font-size:10.5px;color:var(--text-3);
  margin-right:6px;
}
.cl-req{font-size:12.5px;color:var(--text);line-height:1.7}
.cl-impl{font-size:12px;color:var(--text-2);line-height:1.7}
.cl-eff{
  font-size:12px;color:var(--ok);line-height:1.7;
  padding-left:8px;border-left:2px solid var(--ok-soft);
}

/* 查询表格：配置驱动列时允许横向滚动 */
.q-table{white-space:nowrap}
.q-table td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:240px}

/* ============================================================
 * ★ ERP 回填列与行状态标记（需求 261027）
 *
 *   黄色填充 = 属性与 ERP 不符（未确认）
 *   斜体字   = ERP 无该物料编码
 *   绿色     = 已人工确认
 * ============================================================ */

/* ERP 列表头 */
th.nd-erp-th{
  background:var(--panel-2) !important;
  color:var(--text-3) !important;
  border-left:2px solid var(--brand);
  font-size:10.5px !important;
}
.erp-cmp-dot{
  display:inline-block;width:5px;height:5px;border-radius:50%;
  background:var(--warn);margin-left:4px;vertical-align:middle;
}

/* ERP 单元格：只读、灰底 */
td.nd-erp-cell{
  background:var(--panel-2);
  padding:5px 8px !important;
  border-left:1px solid var(--border);
  vertical-align:middle;
}
.nd-erp-val{
  display:block;
  font-size:11.5px;
  color:var(--text-2);
  white-space:pre-wrap;
  word-break:break-all;
  line-height:1.45;
  max-height:110px;
  overflow:hidden;
}

/* ---- 状态色 ---- */
td.nd-erp-cell.erp-mismatch{ background:#fff8e1; }
td.nd-erp-cell.erp-missing{ background:#fdecea; }

/* 整行黄色（属性不符，未确认） */
tr.nd-row-warn > td:not(.nd-erp-status){
  background:#fff8e1;
}
/* 整行绿色（已确认） */
tr.nd-row-confirmed > td:not(.nd-erp-status){
  background:#f0f9f2;
}
/* 整行斜体（ERP 无编码） */
tr.nd-row-italic .nd-cell{
  font-style:italic;
  color:var(--text-3);
}
tr.nd-row-italic > td:not(.nd-erp-status){
  background:#fdecea;
}

/* 状态单元格 */
td.nd-erp-status{
  text-align:center;
  vertical-align:middle;
  padding:4px 4px !important;
  border-left:2px solid var(--border);
}
.erp-badge{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:20px;height:20px;border-radius:50%;
  font-size:11px;font-weight:600;line-height:1;
  cursor:default;
}
.erp-badge.ok{ background:var(--ok-soft,#e8f5ec);color:var(--ok); }
.erp-badge.warn{ background:var(--warn-soft,#fff7e6);color:var(--warn);border:1px solid var(--warn); }
.erp-badge.danger{ background:var(--danger-soft,#fdecea);color:var(--danger);border:1px solid var(--danger); }
.erp-badge.hint{ background:var(--panel-2);color:var(--text-3); }

.erp-confirm-btn{
  display:block;margin:3px auto 0;
  font-size:10px;padding:1px 7px;border-radius:4px;cursor:pointer;
  border:1px solid var(--warn);background:#fff;color:var(--warn);
  font-family:inherit;
}
.erp-confirm-btn:hover{ background:var(--warn);color:#fff; }

/* 附件表格链接 */
#ndAttachBox .q-link{ cursor:pointer; text-decoration:underline; }

.content{flex:1;overflow-y:auto;padding:16px 22px 40px}
/* 列表页：外层不滚动，让表格内部滚动，避免双层滚动条 */
.content:has(.list-page){overflow:hidden;padding-bottom:16px}

/* ---------------- 通用组件 ---------------- */
.btn{
  display:inline-flex;align-items:center;gap:6px;
  height:30px;padding:0 12px;border-radius:6px;
  border:1px solid var(--border-strong);background:var(--panel);
  color:var(--text-2);font-size:12.5px;
  transition:background .13s,border-color .13s,color .13s;
}
.btn:hover{background:var(--panel-2);border-color:var(--brand-2);color:var(--brand)}
/* ★ 2026-10-31：主按钮深蓝实底改浅蓝底深字（用户确认深蓝属深色，全部浅蓝化） */
.btn.primary{background:var(--brand-soft);border-color:var(--brand-2);color:var(--brand);font-weight:600}
.btn.primary:hover{background:var(--brand-light);border-color:var(--brand-2);color:var(--brand-2)}
.btn.ghost{border-style:dashed;color:var(--text-3)}
.btn:disabled{opacity:.5;cursor:not-allowed}

.tabs{display:flex;gap:2px;border-bottom:1px solid var(--border);margin-bottom:14px;overflow-x:auto}
.tab{
  padding:8px 14px;font-size:12.5px;color:var(--text-2);cursor:pointer;
  border-bottom:2px solid transparent;white-space:nowrap;
}
.tab:hover{color:var(--brand)}
.tab.active{color:var(--brand);border-bottom-color:var(--brand);font-weight:600}

.card{
  background:var(--panel);border:1px solid var(--border);
  border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;
}
.card + .card{margin-top:14px}
.card-head{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:11px 14px;border-bottom:1px solid var(--border);background:var(--panel-2);
}
.card-head h3{font-size:13.5px}
.card-head .hint{font-size:11.5px;color:var(--text-3)}
.card-body{padding:14px}

.grid{display:grid;gap:12px}
.grid.c2{grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}
.grid.c3{grid-template-columns:repeat(auto-fit,minmax(230px,1fr))}
.grid.c4{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}

.stat{
  background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);
  padding:12px 14px;box-shadow:var(--shadow);
}
.stat .k{font-size:11.5px;color:var(--text-3)}
.stat .v{font-size:22px;font-weight:700;letter-spacing:-.5px;margin-top:2px;font-variant-numeric:tabular-nums}
.stat .d{font-size:11px;color:var(--text-3);margin-top:2px}

/* 表格 */
.tbl-wrap{overflow:auto;border:1px solid var(--grid-line-outer);border-radius:var(--radius);background:var(--panel)}
table.tbl{border-collapse:separate;border-spacing:0;width:100%;font-size:12.5px;white-space:nowrap}
table.tbl th{
  position:sticky;top:0;z-index:2;
  /* ★ 2026-10-31：表头深蓝实底改浅蓝底深字（用户确认深蓝属深色） */
  background:var(--brand-soft);color:var(--brand);font-weight:600;text-align:left;
  padding:8px 10px;border-right:1px solid var(--grid-line-strong);
}
/* ★ 需求 7：表头必填星号 —— 浅蓝底上改用红色系（深蓝底才需要黄星） */
table.tbl th .req-star{
  color:var(--danger);font-weight:900;font-size:14px;
  margin-left:2px;line-height:1;
  text-shadow:0 0 2px rgba(0,0,0,.45);
}
table.tbl td{padding:7px 10px;border-bottom:1px solid var(--grid-line);border-right:1px solid var(--grid-line)}
table.tbl tbody tr:hover{background:var(--brand-soft)}
table.tbl td.num{text-align:right;font-variant-numeric:tabular-nums;font-family:var(--mono)}
table.tbl td.mono{font-family:var(--mono);font-size:12px}
table.tbl td.neg{color:var(--danger);font-weight:600}
table.tbl .rowno{color:var(--text-3);text-align:right;font-family:var(--mono)}

.pill{
  display:inline-block;padding:1px 8px;border-radius:99px;font-size:11px;
  border:1px solid var(--border-strong);color:var(--text-2);background:var(--panel-2);
  white-space:nowrap;
}
.pill.ok{color:var(--ok);background:var(--ok-soft);border-color:transparent}
.pill.warn{color:var(--warn);background:var(--warn-soft);border-color:transparent}
.pill.danger{color:var(--danger);background:var(--danger-soft);border-color:transparent}
.pill.brand{color:var(--brand);background:var(--brand-soft);border-color:transparent}
.pill.accent{color:var(--accent);background:var(--accent-soft);border-color:transparent}

/* 拖拽上传区 */
.dropzone{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  padding:40px 20px;border:2px dashed var(--border-strong);border-radius:10px;
  background:var(--panel-2);cursor:pointer;transition:all .15s;text-align:center;
}
.dropzone:hover,.dropzone.over{border-color:var(--brand);background:var(--brand-soft)}
.dropzone .dz-icon{font-size:32px;color:var(--brand);opacity:.8}
.dropzone .dz-t{font-size:13.5px;color:var(--text);font-weight:600}
.dropzone .dz-hint{font-size:11.5px;color:var(--text-3)}


.empty{
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:8px;padding:46px 20px;color:var(--text-3);text-align:center;
}
.empty .big{font-size:30px;opacity:.35}
.empty .t{font-size:13px;color:var(--text-2)}
.empty .s{font-size:11.5px}

.skeleton{background:linear-gradient(90deg,var(--panel-2) 25%,var(--border) 37%,var(--panel-2) 63%);
  background-size:400% 100%;animation:sk 1.3s ease-in-out infinite;border-radius:5px;height:12px}
@keyframes sk{0%{background-position:100% 50%}100%{background-position:0 50%}}

.kv{display:grid;grid-template-columns:110px 1fr;gap:6px 12px;font-size:12.5px}
.kv .k{color:var(--text-3)}
.kv .v{color:var(--text);word-break:break-all}

.note{
  font-size:11.5px;color:var(--text-2);background:var(--accent-soft);
  border-left:3px solid var(--accent);border-radius:0 6px 6px 0;padding:9px 12px;
}
.note.info{background:var(--brand-soft);border-left-color:var(--brand)}
.note.ok{background:var(--ok-soft);border-left-color:var(--ok)}
.note.warn{background:var(--warn-soft);border-left-color:var(--warn)}
.note.danger{background:var(--danger-soft);border-left-color:var(--danger);color:var(--danger)}

/* ★ 2026-10-31：用户与权限 · 当前可登录工程师群体 */
.eng-pills{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px}
.eng-groups{display:flex;flex-direction:column;gap:10px}
.eng-group{border:1px solid var(--border);border-radius:8px;padding:9px 11px;background:var(--panel-2)}
.eng-group-title{font-size:12px;font-weight:600;color:var(--text);margin-bottom:7px}
.eng-group-title .eng-count{font-size:11px;font-weight:400;color:var(--text-3);margin-left:6px}
.eng-chips{display:flex;flex-wrap:wrap;gap:6px}
.eng-chip{
  display:inline-flex;flex-direction:column;align-items:flex-start;gap:1px;
  padding:3px 9px;border:1px solid var(--border-strong);border-radius:6px;
  background:var(--panel);color:var(--text);font-size:12px;cursor:pointer;
  transition:border-color .12s,background .12s,color .12s;
}
.eng-chip:hover{border-color:var(--brand);background:var(--brand-soft);color:var(--brand)}
.eng-chip .eng-name{line-height:1.35}
.eng-chip .eng-meta{font-size:10.5px;color:var(--text-3);font-family:var(--mono)}
.eng-chip:hover .eng-meta{color:var(--brand)}

/* ---------------- 粘贴录入 ---------------- */
.paste-zone{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;
  padding:34px 20px;border:2px dashed var(--border-strong);border-radius:10px;
  background:var(--panel-2);cursor:pointer;transition:all .15s;text-align:center;outline:none;
}
.paste-zone:hover,.paste-zone:focus{border-color:var(--brand);background:var(--brand-soft)}
.paste-zone.has{border-color:var(--ok);background:var(--ok-soft);border-style:solid}
.paste-zone .pz-icon{font-size:30px;color:var(--brand);opacity:.85}
.paste-zone.has .pz-icon{color:var(--ok)}
.paste-zone .pz-t{font-size:13px;color:var(--text);font-weight:600}
.paste-zone .pz-t2{font-size:12.5px;color:var(--text-2)}
.paste-zone .pz-hint{font-size:11.5px;color:var(--text-3);margin-top:3px}

.paste-kv{grid-template-columns:96px 1fr}
.paste-kv .v input[type=text]{
  font:inherit;font-size:12.5px;width:100%;padding:4px 9px;border-radius:6px;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text);
}
.paste-kv .v input[type=text]:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}

kbd{
  display:inline-block;padding:1px 6px;border-radius:4px;border:1px solid var(--border-strong);
  border-bottom-width:2px;background:var(--panel);font-family:var(--mono,Consolas,monospace);
  font-size:10.5px;color:var(--text-2);line-height:1.5;
}

.pre-debug{
  font-family:var(--mono,Consolas,monospace);font-size:11px;line-height:1.55;
  background:var(--panel-2);border:1px solid var(--border);border-radius:6px;
  padding:10px 12px;overflow-x:auto;white-space:pre;color:var(--text-2);margin-top:8px;
}

table.tbl tr.row-has-issue td{background:var(--danger-soft)}
table.tbl tr.row-has-issue:hover td{background:var(--danger-soft);filter:brightness(.97)}

/* ---------------- 缺失/错误的单元格标红（对齐 ESoft 的必填标红） ---------------- */
table.tbl td.cell-missing{
  background:var(--danger-soft) !important;
  box-shadow:inset 0 0 0 1px var(--danger);
  position:relative;
}
table.tbl td.cell-missing .miss-dot{
  position:absolute;top:2px;right:3px;width:5px;height:5px;border-radius:50%;
  background:var(--danger);display:inline-block;
}

/* ERP 差异单元格：与本地缺失区分（虚线橙色边框） */
table.tbl td.cell-erp-diff{
  background:var(--warn-soft) !important;
  box-shadow:inset 0 0 0 1px var(--warn);
  position:relative;
}
table.tbl td.cell-erp-diff .miss-dot{background:var(--warn)}

/* ERP 核对面板 */
.erp-panel{border-left:3px solid var(--brand)}
.erp-panel .stat .k{font-size:11px;color:var(--text-3)}
.erp-panel .stat .v{font-size:18px;font-family:var(--mono,Consolas,monospace);color:var(--text)}
.erp-panel .stat .d{font-size:10.5px;color:var(--text-3)}

/* 项目台数 / 总用量 横幅 */
.qty-band{
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  padding:9px 13px;border-radius:8px;background:var(--brand-soft);
  border:1px solid transparent;font-size:12.5px;
}
.qty-band.qty-zero{background:var(--warn-soft);border-color:var(--warn)}
.qty-band .qb-label{font-size:11px;color:var(--text-3)}
.qty-band .qb-pjt{font-weight:600;color:var(--brand)}
.qty-band .qb-op{color:var(--text-3)}
.qty-band .qb-val b{font-size:16px;font-family:var(--mono,Consolas,monospace);color:var(--text)}
.qty-band .qb-note{font-size:11px;color:var(--text-3)}
.qty-band .qb-rule{font-size:11px;color:var(--text-3)}
.qty-band .qb-total{
  margin-left:auto;font-size:12px;color:var(--text-2);
  padding-left:12px;border-left:1px solid var(--border);
}
.qty-band .qb-total b{font-size:15px;color:var(--ok)}

/* ============================================================
 * 新建 BOM&ECN · 22 列录入表
 * ============================================================ */
/* ★ 需求 7：必填星号。
   浅色背景上原来的 --danger(#b03a3a) 尚可，但在深色表头上几乎看不见，
   因此统一提亮：浅色场景用更饱和的红，深色表头用 #ffd24d（见上方两条规则）。 */
.req-star{color:#d92b2b;font-weight:900;margin-left:2px;font-size:1.15em;line-height:1}

.nd-head{grid-template-columns:92px 1fr 92px 1fr}
.nd-head .k{font-size:12px;color:var(--text-3);align-self:center}
.nd-head .v input[type=text]{
  font:inherit;font-size:12.5px;width:100%;padding:5px 10px;border-radius:6px;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text);
}
.nd-head .v input[type=text]:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}

/* ★ 自动识别字段的容器（输入框 + ↻ + 自动标记） */
.nd-head-v{
  display:flex;align-items:center;gap:6px;position:relative;
}
.nd-head-v input[type=text]{flex:1;min-width:0}
.auto-tag{
  font-size:9.5px;padding:1px 6px;border-radius:8px;white-space:nowrap;
  background:var(--brand-soft);color:var(--brand);border:1px solid transparent;
}
.auto-tag.manual{
  background:var(--warn-soft);color:var(--warn);border-color:var(--warn);
}
.auto-tag:empty{display:none}
.auto-reset{
  flex:0 0 auto;width:20px;height:20px;padding:0;border-radius:5px;cursor:pointer;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text-3);
  font-size:12px;line-height:1;
}
.auto-reset:hover{border-color:var(--brand);color:var(--brand);background:var(--brand-soft)}

.nd-main .card-body{padding:0}

/* 工具栏 */
.nd-toolbar{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:10px 14px;border-bottom:1px solid var(--border);background:var(--panel-2);
}
.nd-toolbar .btn{padding:4px 11px;font-size:12px}
.nd-sep{width:1px;height:18px;background:var(--border-strong);margin:0 3px}
.nd-toolbar kbd{margin:0 1px}

/* 表格容器：横向滚动 + 吸顶表头 */
.nd-grid-wrap{
  overflow:auto;max-height:calc(100vh - 400px);min-height:240px;
  outline:none;position:relative;
}
.nd-grid-wrap:focus{box-shadow:inset 0 0 0 2px var(--brand-soft)}

/* ★ 列宽由 <colgroup> 控制，可手动拖拽；table-layout:fixed 才能让 col 宽度生效 */
.nd-grid{
  border-collapse:separate;border-spacing:0;font-size:12px;
  table-layout:fixed;width:max-content;
}
/* ★ 2026-10-30 需求 C2：表头冻结（sticky）
 *   原代码有个致命笔误：同一个规则里先写 position:sticky，后面又写
 *   position:relative（为了给列宽拖拽手柄定位），后者覆盖前者，
 *   导致表头**根本没有吸顶**。现在改为 sticky + 用 ::before 做手柄锚点不再需要。
 *   sticky 生效的三个前提：① 最近的滚动祖先有 overflow ② 父级 chain 无 overflow:hidden
 *   ③ 表头单元格本身不能被 display:none。这里都满足。 */
.nd-grid thead th{
  position:sticky;top:0;z-index:6;
  /* ★ 2026-10-31：录入表表头深蓝实底改浅蓝底深字 */
  background:var(--brand-soft);color:var(--brand);font-weight:600;font-size:11.5px;
  padding:7px 6px;text-align:center;white-space:nowrap;
  border-right:1px solid var(--grid-line-strong);
  overflow:hidden;text-overflow:ellipsis;
}
/* 全屏时表头层级再抬高一档，避免被行内容盖住 */
.card.nd-fs .nd-grid thead th{
  z-index:8;
}
/* ★ 需求 7：录入表格表头的必填星号 —— 浅蓝底上改红色 */
.nd-grid thead th .req-star{
  color:var(--danger);font-weight:900;font-size:13px;
  margin-left:2px;line-height:1;
}
.nd-grid thead th.nd-rn{width:44px}
.nd-grid thead th.nd-del-h{width:34px}

/* ★ 列宽拖拽手柄 */
.nd-resizer{
  position:absolute;top:0;right:0;bottom:0;width:6px;
  cursor:col-resize;z-index:4;
  background:transparent;transition:background .12s;
}
.nd-resizer:hover,.nd-resizer.active{background:rgba(255,255,255,.45)}
.nd-grid.resizing{cursor:col-resize;user-select:none}

.nd-grid tbody td{
  padding:0;border-bottom:1px solid var(--grid-line);border-right:1px solid var(--grid-line);
  background:var(--panel);
  vertical-align:top;             /* 换行后多行顶部对齐 */
  word-break:break-word;overflow-wrap:anywhere;
}
.nd-grid tbody tr:nth-child(even) td{background:var(--panel-2)}
.nd-grid tbody tr.nd-active td{background:var(--brand-soft)}
.nd-grid tbody tr:hover td{background:var(--brand-soft)}
.nd-grid td.nd-rn{
  text-align:center;font-family:var(--mono,Consolas,monospace);
  font-size:11px;color:var(--text-3);background:var(--panel-2);
  border-right:1px solid var(--grid-line-strong);
  padding:6px 2px;
}
.nd-grid td.nd-del{text-align:center;padding:4px 0}
.nd-del-btn{
  border:none;background:transparent;color:var(--text-3);cursor:pointer;
  font-size:13px;padding:3px 6px;border-radius:4px;line-height:1;
}
.nd-del-btn:hover{background:var(--danger-soft);color:var(--danger)}

/* ★ 单元格：textarea 实现自动换行 + 自动增高 */
.nd-grid .nd-cell{
  display:block;width:100%;box-sizing:border-box;
  font:inherit;font-size:12px;
  padding:5px 7px;margin:0;
  border:none;outline:none;background:transparent;color:var(--text);
  font-family:var(--mono,Consolas,monospace);
  line-height:1.45;
  resize:none;                    /* 不用浏览器自带手柄，靠自动增高 */
  overflow:hidden;                /* 高度由 JS 自适应 */
  white-space:pre-wrap;           /* 允许换行 */
  word-break:break-word;overflow-wrap:anywhere;
  min-height:28px;
}
.nd-grid .nd-cell:focus{background:#fff;box-shadow:inset 0 0 0 2px var(--brand)}
.nd-grid .nd-cell.num{text-align:right}

/* 详情页只读表格：同样允许换行 */
.vd-table tbody td{
  white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;
  padding:5px 7px;font-size:12px;font-family:var(--mono,Consolas,monospace);
  vertical-align:top;
}
.vd-table tbody td.num{text-align:right}

/* 底部统计 */
.nd-foot{
  display:flex;align-items:center;gap:12px;padding:9px 14px;
  border-top:1px solid var(--border);background:var(--panel-2);font-size:11.5px;
}
.nd-foot b{font-family:var(--mono,Consolas,monospace);color:var(--text)}

/* ============================================================
 * 查询 BOM&ECN
 * ============================================================ */
.q-select{
  font:inherit;font-size:12.5px;padding:6px 10px;border-radius:7px;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text);
  min-width:120px;
}
.q-input{
  font:inherit;font-size:12.5px;padding:6px 11px;border-radius:7px;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text);
  width:320px;
}
.q-input:focus,.q-select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}
.q-link{color:var(--brand);text-decoration:none;font-weight:600}
.q-link:hover{text-decoration:underline}

/* （详情页表格样式统一在上方 .vd-table 定义，此处不再重复） */

/* ============================================================
 * 登录
 * ============================================================ */
.login-box input[type=text],.login-box input[type=password]{
  font:inherit;font-size:13px;padding:7px 11px;border-radius:7px;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text);
}
.login-box input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}

/* 顶栏用户区（未登录时的登录按钮 / 已登录的用户信息） */
#userBox{display:flex;align-items:center;gap:6px}
#userBox .user{display:flex;align-items:center;gap:7px}
#userBox .user-meta{display:flex;flex-direction:column;line-height:1.25}
#userBox .user-meta strong{font-size:12px;color:var(--text)}
#userBox .user-meta em{font-size:10.5px;color:var(--text-3);font-style:normal}

/* ============================================================
 * 通知铃
 * ============================================================ */
.notice-badge{
  position:absolute;top:-3px;right:-4px;min-width:15px;height:15px;
  padding:0 3px;border-radius:8px;background:var(--danger);color:#fff;
  font-size:9.5px;line-height:15px;text-align:center;font-weight:600;
  box-shadow:0 0 0 2px var(--panel);
}
.notice-list{max-height:60vh;overflow-y:auto;display:flex;flex-direction:column;gap:6px}
.notice-item{
  display:flex;gap:9px;align-items:flex-start;
  padding:9px 11px;border-radius:8px;border:1px solid var(--border);
  background:var(--panel);
}
.notice-item.unread{background:var(--brand-soft);border-color:var(--brand)}
.notice-item.read{opacity:.72}
.notice-item .ni-main{flex:1;min-width:0}
.notice-item .ni-title{font-size:12.5px;font-weight:600;color:var(--text)}
.notice-item .ni-body{font-size:11.5px;color:var(--text-2);margin-top:3px;white-space:pre-wrap}
.notice-item .ni-meta{font-size:10.5px;color:var(--text-3);margin-top:4px}
.notice-item .ni-open{font-size:11px;align-self:center;white-space:nowrap}

/* ============================================================
 * 审核进度条（互审 → 终审）
 * ============================================================ */
.review-flow{
  display:flex;align-items:center;gap:0;
  margin-top:14px;padding:11px 16px;
  background:var(--panel-2);border-radius:9px;border:1px solid var(--border);
}
.rf-step{display:flex;align-items:center;gap:7px;font-size:12px}
.rf-step .rf-dot{
  width:22px;height:22px;border-radius:50%;display:grid;place-items:center;
  font-size:11px;font-weight:600;background:var(--border-strong);color:var(--text-3);
}
.rf-step.done .rf-dot{background:var(--ok-soft);color:var(--ok)}
/* ★ 2026-10-31：流程当前节点深蓝实底改浅蓝底深字 */
.rf-step.current .rf-dot{background:var(--brand-soft);color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.rf-step .rf-lbl{color:var(--text-2);font-weight:600}
.rf-step .rf-by{font-size:11px;color:var(--text-3)}
.rf-step.done .rf-by{color:var(--ok)}
.rf-step.current .rf-by{color:var(--brand)}
.rf-line{flex:1;height:2px;background:var(--border-strong);margin:0 12px;border-radius:1px;min-width:40px}
.rf-line.done{background:var(--ok)}

/* 草稿面板 */
.draft-panel{border-left:3px solid var(--warn)}
.draft-panel .card-head h3{color:var(--warn)}

/* ============================================================
 * 粘贴确认弹窗
 * ============================================================ */
.pd-summary{
  display:grid;grid-template-columns:repeat(4,1fr);gap:9px;margin-bottom:4px;
}
.pd-stat{
  border:1px solid var(--border);border-radius:8px;padding:9px 6px;text-align:center;
  background:var(--panel);
}
.pd-stat b{display:block;font-size:20px;font-family:var(--mono,Consolas,monospace);color:var(--text);line-height:1.2}
.pd-stat span{display:block;font-size:10.5px;color:var(--text-3);margin-top:2px}
.pd-stat.ok{border-color:var(--ok);background:var(--ok-soft)}
.pd-stat.ok b{color:var(--ok)}
.pd-stat.drop{border-color:var(--danger);background:var(--danger-soft)}
.pd-stat.drop b{color:var(--danger)}
.pd-stat.warn{border-color:var(--warn);background:var(--warn-soft)}
.pd-stat.warn b{color:var(--warn)}

.pd-maptitle{font-size:12px;color:var(--text-3);margin:12px 0 6px}
.pd-mapwrap{max-height:300px;overflow-y:auto;border:1px solid var(--border);border-radius:7px}
.pd-map{font-size:11.5px;white-space:normal}
.pd-map thead th{
  position:sticky;top:0;background:var(--panel-2);color:var(--text-3);
  font-weight:400;font-size:11px;padding:6px 8px;text-align:left;
  border-bottom:1px solid var(--border);
}
.pd-map td{padding:5px 8px;border-bottom:1px solid var(--border);vertical-align:middle}
.pd-map td.mono{font-family:var(--mono,Consolas,monospace);word-break:break-all}
.pd-map td.num{text-align:center;color:var(--text-3);font-family:var(--mono,Consolas,monospace)}
.pd-map tr.pd-drop td{opacity:.62;background:var(--danger-soft)}
.pd-map .pill{font-size:10.5px;padding:1px 7px}

/* ============================================================
 * 分页控件
 * ============================================================ */
.pager{
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  padding:10px 14px;border-top:1px solid var(--border);background:var(--panel-2);
  font-size:11.5px;
}
.pager .hint{color:var(--text-3)}
.pg-size{display:flex;align-items:center;gap:5px;color:var(--text-3)}
.pg-size select{
  font:inherit;font-size:11.5px;padding:2px 5px;border-radius:5px;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text);
}
.pg-btns{margin-left:auto;display:flex;align-items:center;gap:3px}
.pg-num{
  min-width:26px;height:26px;padding:0 7px;border-radius:6px;cursor:pointer;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text-2);
  font:inherit;font-size:11.5px;font-family:var(--mono,Consolas,monospace);
}
.pg-num:hover:not(:disabled){border-color:var(--brand);color:var(--brand);background:var(--brand-soft)}
.pg-num.active{background:var(--brand-soft);border-color:var(--brand-2);color:var(--brand);font-weight:600}
.pg-num:disabled{opacity:.4;cursor:not-allowed}
.pg-gap{color:var(--text-3);padding:0 3px;font-size:11px}

/* ---------------- 字段配置表 ---------------- */
.schema-tbl{font-size:12px}
.schema-tbl th{white-space:nowrap}
.schema-tbl td{padding:3px 6px}
.schema-tbl input[type=text]{
  font:inherit;font-size:12px;width:100%;padding:2px 6px;border-radius:4px;
  border:1px solid transparent;background:transparent;color:var(--text);
}
.schema-tbl input[type=text]:hover{border-color:var(--border-strong);background:var(--panel)}
.schema-tbl input[type=text]:focus{outline:none;border-color:var(--brand);background:var(--panel)}
.schema-tbl select{
  font:inherit;font-size:11.5px;padding:2px 4px;border-radius:4px;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text);
}
.schema-tbl tr.disabled td{opacity:.45}
.schema-tbl .req-on{color:var(--danger);font-weight:700}
.schema-tbl .drag{cursor:grab;color:var(--text-3)}
.schema-tbl tr.dragging{opacity:.4}
.schema-tbl tr.drop-target td{border-top:2px solid var(--brand)}

/* ---------------- 抽屉 ---------------- */
.drawer{
  position:fixed;top:0;right:0;bottom:0;width:min(520px,92vw);
  background:var(--panel);border-left:1px solid var(--border);
  box-shadow:-8px 0 28px rgba(16,24,40,.14);
  display:flex;flex-direction:column;z-index:60;
}
.drawer-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:12px 16px;border-bottom:1px solid var(--border);
}
.drawer-head h3{font-size:14px}
.drawer-body{flex:1;overflow-y:auto;padding:16px}

/* ---------------- 弹层 ---------------- */
.modal{
  position:fixed;inset:0;background:rgba(16,24,40,.5);
  display:grid;place-items:center;z-index:80;padding:20px;
}
.modal-box{
  background:var(--panel);border-radius:10px;width:min(680px,100%);
  max-height:86vh;display:flex;flex-direction:column;box-shadow:0 18px 48px rgba(16,24,40,.3);
}
.modal-head{display:flex;align-items:center;justify-content:space-between;padding:13px 18px;border-bottom:1px solid var(--border)}
.modal-body{padding:18px;overflow-y:auto;font-size:13px}
.modal-body h4{margin:14px 0 6px;font-size:13px;color:var(--brand)}
.modal-body h4:first-child{margin-top:0}
.modal-body ul{padding-left:2px}
.modal-body li{font-size:12.5px;color:var(--text-2);padding:2px 0 2px 12px;position:relative}
.modal-body li::before{content:"·";position:absolute;left:2px;color:var(--text-3)}

.toast{
  position:fixed;bottom:22px;left:50%;transform:translateX(-50%);
  background:var(--text);color:var(--bg);padding:9px 16px;border-radius:8px;
  font-size:12.5px;z-index:90;box-shadow:0 6px 20px rgba(0,0,0,.25);
}

/* 滚动条 */
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:99px;border:2px solid var(--panel)}
::-webkit-scrollbar-thumb:hover{background:var(--text-3)}
::-webkit-scrollbar-track{background:transparent}

/* ============================================================
 * ★ 2026-10-30 需求 1：单据ID 实时校验提示
 * ============================================================ */
.docid-tip{
  font-size:10.5px;line-height:1.4;margin-top:3px;
  color:var(--text-3);white-space:normal;
}
.docid-tip.ok{color:var(--ok);font-weight:600}
.docid-tip.bad{color:var(--danger);font-weight:600}
/* ============================================================
 * ★ 2026-10-30 需求 C1/C9：备注上移 + 筛选面板 + 排序指示
 * ============================================================ */
/* 备注类信息移到表格上方（原在表格底部占高度） */
.nd-foot.nd-foot-top{
  border-top:none;
  border-bottom:1px solid var(--grid-line);
  padding:6px 12px;
  margin-bottom:0;
  background:var(--panel-2);
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  font-size:11.5px;
}
/* 筛选面板容器 */
.nd-filter-bar{
  border-bottom:1px solid var(--border);
  background:var(--panel-2);
  padding:0 10px 8px;
  max-height:340px;
  overflow:auto;
}
.nd-filter-bar[hidden]{display:none !important}

/* 表头可排序光标 */
.nd-grid thead th[data-th]{cursor:pointer;user-select:none}
.nd-grid thead th[data-th]:hover{background:color-mix(in srgb, var(--brand) 84%, #fff)}

/* 排序箭头 */
.nd-sort-mark{
  font-size:9px;opacity:.95;margin-left:2px;
  display:inline-block;vertical-align:middle;
}
/* ============================================================
 * ★ 2026-11-08：BOM 行 ERP 流程着色（优先级 5>4>3>2>1）
 *   黄 = 无工单；无色 = 有工单；浅绿 = 有请购；绿 = 有采购；
 *   浅蓝 = 有入库；蓝 = 有出库
 * ============================================================ */
#vdGrid tbody tr.vd-no-wo > td{
  background:#fde68a !important;
  color:#78350f !important;
  border-color:#fcd34d !important;
}
#vdGrid tbody tr.vd-req-match > td{
  background:#dcfce7 !important;
  color:#14532d !important;
  border-color:#bbf7d0 !important;
}
#vdGrid tbody tr.vd-po-match > td{
  background:#86efac !important;
  color:#14532d !important;
  border-color:#4ade80 !important;
}
#vdGrid tbody tr.vd-stock-in > td{
  background:#e0f2fe !important;
  color:#0c4a6e !important;
  border-color:#bae6fd !important;
}
#vdGrid tbody tr.vd-stock-out > td{
  background:#93c5fd !important;
  color:#1e3a8a !important;
  border-color:#60a5fa !important;
}
#vdGrid tbody tr.vd-no-wo:hover > td{ background:#fcd34d !important; }
#vdGrid tbody tr.vd-req-match:hover > td{ background:#bbf7d0 !important; }
#vdGrid tbody tr.vd-po-match:hover > td{ background:#4ade80 !important; }
#vdGrid tbody tr.vd-stock-in:hover > td{ background:#bae6fd !important; }
#vdGrid tbody tr.vd-stock-out:hover > td{ background:#60a5fa !important; }

/* 图例（深绿色块） */
.req-legend{
  display:inline-block;padding:0 6px;border-radius:3px;
  background:#14532d;color:#f0fdf4;font-size:11px;
}
.req-legend-badge{
  border:1px solid #14532d;border-radius:999px;padding:0 8px;
  color:#14532d;background:#f0fdf4;font-size:11px;
}
/* ============================================================
 * ★ 2026-11-02 V1.1.0：插件（一个插件 = 侧边栏一个按钮）
 * ============================================================ */
.plugin-page{ display:flex; flex-direction:column; gap:14px; }
.plugin-hero{ display:flex; align-items:flex-start; justify-content:space-between; gap:16px;
  background:linear-gradient(135deg,#f8fafc,#eef2ff); border:1px solid #e2e8f0;
  border-radius:12px; padding:16px 18px; }
.plugin-hero h3{ margin:4px 0 6px; font-size:18px; }
.plugin-kicker{ font-size:12px; color:#6366f1; font-weight:600; letter-spacing:.02em; }
.plugin-badge{ flex:0 0 auto; background:#eef2ff; color:#4338ca; border:1px solid #c7d2fe;
  border-radius:999px; font-size:12px; padding:3px 10px; }
.plugin-card{ background:#fff; border:1px solid #e5e7eb; border-radius:12px; padding:14px 16px; }
.plugin-actions{ display:flex; gap:8px; margin-bottom:10px; flex-wrap:wrap; }
.plugin-textarea{ width:100%; box-sizing:border-box; border:1px solid #d1d5db; border-radius:8px;
  padding:10px 12px; font:13px/1.6 Consolas,'Microsoft YaHei',monospace; resize:vertical; outline:none; }
.plugin-textarea:focus{ border-color:#6366f1; box-shadow:0 0 0 3px rgba(99,102,241,.12); }
.plugin-result{ margin-top:12px; }
.plugin-hint{ color:#64748b; font-size:13px; }
.plugin-summary{ display:flex; gap:8px; margin-bottom:10px; flex-wrap:wrap; }
.plugin-pill{ border-radius:999px; padding:2px 10px; font-size:12px; border:1px solid #e2e8f0; background:#f8fafc; }
.plugin-pill.ok{ background:#ecfdf5; border-color:#a7f3d0; color:#047857; }
.plugin-pill.warn{ background:#fffbeb; border-color:#fde68a; color:#b45309; }
.plugin-pill.bad{ background:#fef2f2; border-color:#fecaca; color:#b91c1c; }
.plugin-table-wrap{ overflow:auto; border:1px solid #eef2f7; border-radius:8px; }
.plugin-table{ width:100%; border-collapse:collapse; font-size:12px; }
.plugin-table th,.plugin-table td{ padding:7px 9px; border-bottom:1px solid #f1f5f9; text-align:left; vertical-align:top; }
.plugin-table th{ background:#f8fafc; color:#475569; font-weight:600; white-space:nowrap; }
.plugin-table tr.bad td{ background:#fff7f7; }
.plugin-table tr.ok td:first-child{ color:#047857; }
.plugin-section-title{ font-weight:600; margin-bottom:8px; }
.plugin-canon{ display:flex; flex-wrap:wrap; gap:6px; }
.plugin-canon-item{ display:inline-flex; align-items:center; gap:5px; border:1px solid #e2e8f0;
  background:#f8fafc; border-radius:6px; padding:3px 8px; font-size:12px; }
.plugin-canon-item b{ color:#6366f1; font-weight:600; }
.plugin-manager{ display:flex; flex-direction:column; gap:14px; }
.plugin-manager-head{ display:flex; align-items:flex-start; justify-content:space-between; gap:16px; }
.plugin-manager-head h3{ margin:0 0 6px; }
.plugin-manager-summary{ font-size:13px; color:#475569; background:#f8fafc; border:1px solid #e2e8f0;
  border-radius:8px; padding:8px 12px; white-space:nowrap; }
.plugin-manager-list{ display:flex; flex-direction:column; gap:10px; }
.plugin-row{ display:flex; align-items:center; justify-content:space-between; gap:18px;
  border:1px solid #e5e7eb; border-radius:10px; padding:12px 14px; background:#fff; }
.plugin-row-main{ min-width:0; }
.plugin-row-title{ display:flex; align-items:center; gap:8px; font-weight:600; flex-wrap:wrap; }
.plugin-row-ico{ font-size:18px; }
.plugin-tag{ font-size:11px; color:#64748b; background:#f1f5f9; border-radius:4px; padding:1px 6px; font-weight:400; }
.plugin-tag.bad{ background:#fef2f2; color:#b91c1c; }
.plugin-row-desc{ font-size:12px; color:#475569; margin-top:4px; }
.plugin-row-meta{ font-size:11px; color:#94a3b8; margin-top:4px; word-break:break-all; }
.plugin-switch{ display:inline-flex; align-items:center; gap:8px; cursor:pointer; flex:0 0 auto; }
.plugin-switch input{ position:absolute; opacity:0; width:0; height:0; }
.plugin-switch-ui{ width:38px; height:22px; border-radius:999px; background:#cbd5e1; position:relative; transition:.18s; }
.plugin-switch-ui::after{ content:''; position:absolute; top:3px; left:3px; width:16px; height:16px; border-radius:50%;
  background:#fff; box-shadow:0 1px 3px rgba(0,0,0,.2); transition:.18s; }
.plugin-switch input:checked + .plugin-switch-ui{ background:#10b981; }
.plugin-switch input:checked + .plugin-switch-ui::after{ left:19px; }
.plugin-switch-text{ font-size:12px; color:#64748b; min-width:36px; }
.plugin-page-wrap{ min-height:200px; }
.plugin-loading{ color:#64748b; font-size:13px; padding:20px; }
/* ★ 2026-11-02 物料属性核对弹窗（BOM vs ERP e_ 并排） */
.erp-cmp{ display:flex; flex-direction:column; gap:10px; }
.erp-cmp-head{ display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap; padding-bottom:8px; border-bottom:1px solid var(--border); }
.erp-cmp-head .mono{ margin:0 6px; color:var(--brand); }
.erp-cmp-tbl{ width:100%; font-size:12.5px; }
.erp-cmp-tbl th:nth-child(1), .erp-cmp-tbl td:nth-child(1){ width:96px; }
.erp-cmp-tbl th:nth-child(2), .erp-cmp-tbl td:nth-child(2),
.erp-cmp-tbl th:nth-child(3), .erp-cmp-tbl td:nth-child(3){ width:37%; }
.erp-cmp-tbl th:nth-child(4), .erp-cmp-tbl td:nth-child(4){ width:84px; text-align:center; }
.erp-cmp-tbl th{ background:#f1f5f9; color:var(--text-2); font-weight:600; text-align:left; }
.erp-cmp-tbl td{ vertical-align:top; }
.erp-cmp-attr{ color:var(--text-2); white-space:nowrap; }
.erp-cmp-val{ overflow-wrap:anywhere; }
.erp-cmp-bad td{ background:#fff7ed; }
.erp-cmp-res .pill{ padding:1px 7px; font-size:11px; }
.erp-cmp-actions{ display:flex; justify-content:flex-end; gap:8px; padding-top:4px; }
.erp-cmp .note{ margin:0; }
/* ★ 2026-11-02 详情页：可点击的 ERP 核对行 */
.vd-table tbody tr.vd-row-erp{ cursor:pointer; }
.vd-table tbody tr.vd-row-erp:hover > td{ background:#f1f5f9; }
.vd-table tbody tr.vd-row-erp > td.nd-rn .erp-badge{ margin-left:3px; vertical-align:middle; }
/* ★ 2026-11-02 物料档案完整字段（自检弹窗） */
.erp-cmp-profile{ display:flex; flex-direction:column; gap:8px; border-top:1px solid var(--border); padding-top:8px; }
.erp-cmp-sec-title{ font-weight:600; font-size:12.5px; color:var(--text-1); }
.erp-cmp-fields{ display:grid; grid-template-columns:96px minmax(150px,1fr) 96px minmax(150px,1fr); gap:5px 10px; font-size:12px; align-items:start; }
.erp-cmp-k{ color:var(--text-2); background:#f8fafc; border-radius:3px; padding:3px 6px; }
.erp-cmp-v{ padding:3px 6px; overflow-wrap:anywhere; color:var(--text-1); }
.erp-cmp-all{ border:1px solid var(--border); border-radius:4px; padding:6px 8px; background:#fcfdff; }
.erp-cmp-all summary{ cursor:pointer; color:var(--brand); font-size:12px; }
.erp-cmp-all .erp-cmp-fields{ margin-top:6px; max-height:240px; overflow:auto; }
.erp-cmp-cand{ font-size:12px; }
.erp-cmp-cand th{ background:#f1f5f9; }
.erp-cmp-cand td{ vertical-align:top; }
/* ★ 2026-11-02 查询页 ERP 单据号链接 + 明细弹窗 */
.erp-bill-link{ color:var(--brand); text-decoration:underline; text-underline-offset:2px; }
.erp-bill-link:hover{ color:var(--brand-2,#1d4ed8); }
.erp-bill-sep{ color:var(--text-3); }
.erp-doc{ display:flex; flex-direction:column; gap:10px; }
.erp-doc-head{ display:flex; flex-direction:column; gap:6px; }
.erp-doc-kv{ display:grid; grid-template-columns:72px minmax(140px,1fr) 72px minmax(140px,1fr); gap:5px 10px; font-size:12px; }
.erp-doc-kv .k{ color:var(--text-2); background:#f8fafc; padding:3px 6px; border-radius:3px; }
.erp-doc-kv .v{ padding:3px 6px; overflow-wrap:anywhere; }
.erp-doc-tbl{ font-size:12px; }
.erp-doc-tbl th{ background:#f1f5f9; white-space:nowrap; }
.erp-doc-tbl td{ vertical-align:top; }
/* ★ 2026-11-02 差异行确认原因 */
.erp-reason{ display:flex; flex-direction:column; gap:8px; }
.erp-reason-label{ font-weight:600; font-size:12.5px; color:var(--text-1); }
.erp-reason-input{ width:100%; min-height:92px; resize:vertical; padding:8px 10px; border:1px solid var(--border);
  border-radius:5px; font-family:inherit; font-size:13px; line-height:1.5; }
.erp-reason-input:focus{ outline:none; border-color:var(--brand); box-shadow:0 0 0 2px rgba(37,99,235,.12); }
/* ★ 2026-11-02 设计投单：数量为负 → 整行黄色 */
tr.nd-row-negative > td,
.vd-table tbody tr.vd-row-negative > td{
  background:#fff3cd !important;
}
tr.nd-row-negative > td .nd-cell{ background:transparent; }
.vd-table tbody tr.vd-row-negative:hover > td{ background:#ffe8a3 !important; }
/* ============================================================
 * ★ 2026-11-02 新需求：项目一览表
 * ============================================================ */
.pj-tbl th.num, .pj-tbl td.num{text-align:right;font-family:var(--mono,Consolas,monospace)}
.pj-tbl tbody tr.pj-row{cursor:pointer}
.pj-tbl tbody tr.pj-row:hover td{background:var(--brand-soft)}
.pj-toggle{white-space:nowrap}
.pj-toggle .pj-arrow{
  display:inline-block;width:12px;color:var(--text-3);
  font-size:10px;margin-right:4px;
}
.pj-toggle b{color:var(--brand);font-weight:600}
/* 展开后的组件行 */
.pj-tbl tbody tr.pj-comp-row td{
  background:var(--panel-2);padding:8px 12px;
  border-bottom:1px solid var(--grid-line);
}
.pj-comps{display:flex;flex-wrap:wrap;gap:6px}
.pj-chip{
  display:inline-flex;align-items:center;gap:6px;
  padding:3px 9px;border-radius:6px;
  background:var(--panel);border:1px solid var(--border-strong);
  font-size:11.5px;
}
.pj-chip b{color:var(--text);font-weight:600}
.pj-chip em{color:var(--text-3);font-style:normal;font-size:10.5px;font-family:var(--mono,Consolas,monospace)}
/* ============================================================
 * ★ 2026-11-03：表头字段说明小圆点（悬停显示口径）
 * ============================================================ */
.th-tip{
  display:inline-block;width:12px;height:12px;line-height:12px;
  margin-left:3px;border-radius:50%;
  background:rgba(255,255,255,.55);color:var(--brand);
  font-size:9px;font-weight:700;text-align:center;
  cursor:help;vertical-align:middle;
}
/* ============================================================
 * ★ 2026-11-03：快捷键一览 / 项目BOM汇总
 * ============================================================ */
.sc-tbl kbd{
  display:inline-block;min-width:22px;padding:1px 6px;
  font-family:var(--mono,Consolas,monospace);font-size:11px;
  border:1px solid var(--border-strong);border-bottom-width:2px;
  border-radius:4px;background:var(--panel-2);color:var(--text-2);
  text-align:center;margin:0 1px;
}
.sc-plus{color:var(--text-3);font-size:10px;margin:0 1px}
.bs-tbl tfoot td{background:var(--brand-soft);font-weight:600}
.bs-tbl td.num, .bs-tbl th.num{text-align:right;font-family:var(--mono,Consolas,monospace)}
/* ============================================================
 * ★ 2026-11-03 P0-B：详情页 ERP 卡片懒加载
 *   默认收起，点标题展开才查询；不可查的卡片显示业务说明
 * ============================================================ */
.erp-lazy .erp-caret{
  display:inline-block;font-size:10px;color:var(--text-3);
  margin-left:4px;transition:transform .12s;
  vertical-align:middle;
}
.erp-lazy .card-head h3[data-erp-toggle]:hover{color:var(--brand-2)}
.erp-lazy .card-head h3[data-erp-toggle]:hover .erp-caret{color:var(--brand-2)}
/* 状态门控：不适用 ERP 查询的卡片淡一点，视觉上退到次要 */
.erp-lazy.erp-skipped{opacity:.72}
.erp-lazy.erp-skipped .card-head h3{color:var(--text-2)}

/* ============================================================
 * 2026-11-04 需求：顶栏「多条件查询」搜索框
 *   范围下拉（全部字段/单据ID/物料编码/...） + 关键词 + 清空按钮
 * ============================================================ */
.gs-scope{
  flex:0 0 auto;height:24px;margin-left:6px;padding:0 4px;
  max-width:104px;
  border:1px solid var(--border-strong);border-radius:5px;
  background:var(--panel);color:var(--text-2);
  font-size:11.5px;cursor:pointer;outline:none;
}
.gs-scope:hover{border-color:var(--brand-2);color:var(--brand)}
.gs-scope:focus{border-color:var(--brand);color:var(--brand)}
.gs-clear{
  flex:0 0 auto;width:18px;height:18px;margin-right:4px;
  border:none;border-radius:50%;background:var(--border-strong);
  color:#fff;font-size:12px;line-height:1;cursor:pointer;
  display:grid;place-items:center;padding:0;
}
.gs-clear:hover{background:var(--text-3)}
/* 搜索图标可点击执行 */
.searchbox .search-ico:hover{color:var(--brand)}

/* ============================================================
 * 2026-11-04 需求：查询页「字段勾选」搜索区
 * ============================================================ */
.qs-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.qs-fields-btn{position:relative}
.qs-cnt{
  display:inline-grid;place-items:center;min-width:16px;height:16px;
  margin-left:4px;padding:0 4px;border-radius:8px;
  background:var(--brand-soft);color:var(--brand);
  font-size:10.5px;font-weight:700;
}
.qs-input{
  flex:1 1 320px;min-width:220px;height:30px;padding:0 10px;
  border:1px solid var(--border-strong);border-radius:6px;
  background:var(--panel);color:var(--text);font-size:12.5px;outline:none;
}
.qs-input:focus{border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}
.qs-chips{display:inline-flex;gap:5px;flex-wrap:wrap;align-items:center}
.qs-chip{
  display:inline-block;padding:2px 7px;border-radius:4px;
  background:var(--brand-soft);color:var(--brand);
  font-size:11px;line-height:1.4;
}

/* 字段勾选面板 */
.qsp-mask{
  position:fixed;inset:0;z-index:3000;
  background:rgba(16,24,40,.42);
  display:grid;place-items:center;padding:20px;
}
.qsp-box{
  width:min(720px,94vw);max-height:84vh;display:flex;flex-direction:column;
  background:var(--panel);border:1px solid var(--border-strong);
  border-radius:10px;box-shadow:0 18px 48px rgba(16,24,40,.3);
  overflow:hidden;
}
.qsp-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:12px 16px;border-bottom:1px solid var(--border);
}
.qsp-head b{font-size:14px}
.qsp-x{
  width:24px;height:24px;border:none;background:transparent;
  color:var(--text-3);font-size:18px;cursor:pointer;line-height:1;
}
.qsp-x:hover{color:var(--text)}
.qsp-tip{padding:8px 16px;font-size:11.5px;color:var(--text-3);background:var(--panel-2)}
.qsp-body{flex:1 1 auto;overflow:auto;padding:6px 16px 12px}
.qsp-group{margin-top:10px}
.qsp-gtitle{
  display:flex;align-items:center;gap:8px;
  font-size:12px;font-weight:700;color:var(--brand);
  padding:5px 0;border-bottom:1px solid var(--border-2);margin-bottom:6px;
}
.qsp-all,.qsp-none{
  font-size:11px;padding:1px 6px;border-radius:4px;cursor:pointer;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text-2);
}
.qsp-all:hover,.qsp-none:hover{border-color:var(--brand-2);color:var(--brand)}
.qsp-all{margin-left:auto}
.qsp-items{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:2px 12px}
.qsp-item{
  display:flex;align-items:center;gap:6px;
  padding:4px 6px;border-radius:5px;cursor:pointer;font-size:12px;
}
.qsp-item:hover{background:var(--brand-light)}
.qsp-item input{margin:0;cursor:pointer}
.qsp-lb{color:var(--text)}
.qsp-tag{
  font-size:10px;padding:0 4px;border-radius:3px;
  background:#fff4d6;color:#8a5a00;border:1px solid #f0dca8;
}
.qsp-desc{font-size:10.5px;color:var(--text-4);margin-left:auto}
.qsp-foot{
  display:flex;align-items:center;gap:10px;
  padding:10px 16px;border-top:1px solid var(--border);background:var(--panel-2);
}
.qsp-foot .hint{margin-right:auto;font-size:11.5px}

/* ============================================================
 * 2026-11-04 需求：顶栏「全局查询」区
 *   字段勾选按钮 + 关键词输入 + 查询按钮（不用 Enter）
 * ============================================================ */
.topsearch{width:min(660px,100%);gap:4px;padding-left:6px}
.ts-fields{
  flex:0 0 auto;height:24px;padding:0 8px;
  border:1px solid var(--border-strong);border-radius:5px;
  background:var(--panel);color:var(--text-2);
  font-size:11.5px;cursor:pointer;white-space:nowrap;
  display:inline-flex;align-items:center;gap:3px;
}
.ts-fields:hover{border-color:var(--brand-2);color:var(--brand);background:var(--brand-light)}
.ts-cnt{
  display:inline-grid;place-items:center;min-width:15px;height:15px;
  padding:0 4px;border-radius:8px;
  background:var(--brand-soft);color:var(--brand);
  font-size:10.5px;font-weight:700;
}
.ts-go{
  flex:0 0 auto;height:24px;padding:0 12px;margin-right:3px;
  border:1px solid var(--brand-2);border-radius:5px;
  background:var(--brand-soft);color:var(--brand);
  font-size:12px;font-weight:600;cursor:pointer;white-space:nowrap;
}
.ts-go:hover{background:var(--brand-light);color:var(--brand-2)}
/* 顶栏输入框让位给按钮 */
.topsearch #globalSearch{flex:1 1 auto;min-width:80px}
/* 窄屏隐藏 placeholder 长文案 */
@media (max-width:1280px){
  .topsearch{width:min(520px,100%)}
}

/* ====
/* ============================================================
 * ★ 2026-11-05 系统设置页（仅 admin）—— ERP 地址与运行参数
 * ============================================================ */
.ss-tbl td{vertical-align:middle}
.ss-tbl td input.ss-ipt{width:100%}
.ss-tbl th{white-space:nowrap}

/* 输入框：统一浅蓝底 + 聚焦蓝框（与全站风格一致） */
.ss-ipt{
  width:100%;height:30px;padding:0 9px;
  border:1px solid var(--border);border-radius:var(--radius-sm);
  background:var(--panel-2);color:var(--text);
  font-size:12.5px;outline:none;
  transition:border-color .13s, box-shadow .13s, background .13s;
}
.ss-ipt:hover{border-color:var(--border-strong)}
.ss-ipt:focus{
  border-color:var(--brand-2);background:var(--panel);
  box-shadow:0 0 0 3px var(--brand-soft);
}
.ss-ipt::placeholder{color:var(--text-4);font-family:var(--sans)}

/* 运行参数：两列 + 说明 */
.ss-params{
  display:flex;gap:18px;flex-wrap:wrap;align-items:flex-end;
}
.ss-field{
  display:flex;flex-direction:column;gap:4px;
  width:190px;flex:0 0 190px;
}
.ss-lbl{font-size:12px;color:var(--text-2);font-weight:600}
.ss-tip{
  flex:1 1 260px;min-width:220px;
  font-size:11.5px;line-height:1.6;color:var(--text-3);
}

/* 保存后的状态提示 */
#ssMsg{margin-left:2px;font-size:12px}
#ssMsg.note{margin:0;padding:4px 10px}

/* ★ 2026-11-06：屏蔽浏览器给 type=search 输入框加的原生清除叉（与自己做的 × 重复） */
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;appearance:none;display:none}

/* ★ 2026-11-08 项目状态一览表（v2.1.0，本地资源 /projects-app/）嵌入页 */
body[data-page="projects"] .content{ padding:0; overflow:hidden; }
.ps-embed-wrap{ height:calc(100vh - var(--topbar-h)); display:flex; flex-direction:column; background:#eef2f7; }
.ps-embed-frame{ flex:1 1 auto; width:100%; min-height:0; border:0; display:block; background:#fff; }
.ps-embed-foot{ flex:0 0 auto; padding:3px 12px; font-size:11px; color:var(--text-3);
  background:#f8fafc; border-top:1px solid var(--border); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.ps-embed-foot a{ color:var(--brand); text-decoration:underline; text-underline-offset:2px; }
/* ★ 2026-11-08 详情页附件表：固定列宽，长文件名换行，操作列不被挤出 */
.vd-attach-tbl td:nth-child(2){ word-break:break-all; white-space:normal; }
.vd-attach-tbl th:nth-child(6), .vd-attach-tbl td:nth-child(6){ text-align:center; }
.vd-attach-tbl .btn{ padding:2px 8px; font-size:11px; white-space:nowrap; }
/* ★ 2026-11-08 ERP进度查询弹窗 */
.erp-progress{ display:flex; flex-direction:column; gap:8px; }
.erp-progress-tbl{ font-size:12px; }
.erp-progress-tbl th{ background:#f1f5f9; }
.erp-progress-tbl td{ vertical-align:top; }
.erp-progress-tbl .erp-stage-name{ font-weight:600; color:var(--text-1); white-space:nowrap; }
.erp-progress-tbl .mono{ margin-right:2px; }
/* ★ ERP进度查询：3 列表格 + 自动换行，关键信息不被挤出 */
.erp-progress-tbl{ table-layout:fixed; width:100%; }
.erp-progress-tbl th:nth-child(1), .erp-progress-tbl td:nth-child(1){ width:150px; }
.erp-progress-tbl th:nth-child(2), .erp-progress-tbl td:nth-child(2){ width:118px; }
.erp-progress-tbl td{ white-space:normal; overflow-wrap:anywhere; word-break:break-all; }
.erp-stage-codes{ line-height:1.6; }
.erp-stage-extra{ margin-top:4px; white-space:normal; }
.erp-progress-tbl .erp-stage-name{ white-space:nowrap; word-break:normal; }
/* 行着色图例色块 */
.req-legend-badge .stock-legend-in,
.req-legend-badge .stock-legend-out{
  display:inline-block; padding:1px 5px; border-radius:3px; margin:0 2px; font-size:11px;
}
.req-legend-badge .stock-legend-in{ background:#e0f2fe; color:#0c4a6e; border:1px solid #bae6fd; }
.req-legend-badge .stock-legend-out{ background:#93c5fd; color:#1e3a8a; border:1px solid #60a5fa; }
/* ★ 2026-11-08 出入库小节：标题可折叠 */
.vd-stock-sec{ margin-top:12px; }
.vd-stock-sec-head{
  display:flex; align-items:center; gap:4px; flex-wrap:wrap;
  padding:6px 8px; border-radius:6px; cursor:pointer; user-select:none;
  font-size:12px; font-weight:600; color:var(--text);
  background:color-mix(in srgb, var(--brand) 7%, #fff);
}
.vd-stock-sec-head:hover{ background:color-mix(in srgb, var(--brand) 13%, #fff); }
.vd-stock-sec-head .hint{ font-weight:400; }
.vd-stock-caret{ display:inline-block; width:14px; text-align:center; color:#111; transition:transform .12s; }
.vd-stock-sec-body[hidden]{ display:none !important; }
/* BOM 流程颜色图例 */
.stage-legend{ display:inline-block; padding:0 4px; border-radius:3px; font-size:11px; margin-right:1px; }
.stage-legend-nowo{ background:#fde68a; color:#78350f; }
.stage-legend-wo{ background:#fff; border:1px dashed #94a3b8; color:#475569; }
.stage-legend-req{ background:#dcfce7; color:#14532d; }
.stage-legend-po{ background:#86efac; color:#14532d; }
.stage-legend-in{ background:#e0f2fe; color:#0c4a6e; }
.stage-legend-out{ background:#93c5fd; color:#1e3a8a; }
/* ============================================================
 * ★ 2026-11-08：ECN 负数量行 —— 浅灰色（优先级高于流程色）
 * ============================================================ */
#vdGrid tbody tr.vd-neg-qty > td,
#ndGrid tbody tr.nd-row-neg-ecn > td{
  background:#f1f5f9 !important;
  color:#64748b !important;
  border-color:#e2e8f0 !important;
}
#vdGrid tbody tr.vd-neg-qty > td.num,
#ndGrid tbody tr.nd-row-neg-ecn > td.num{ color:#475569 !important; }
#vdGrid tbody tr.vd-neg-qty:hover > td,
#ndGrid tbody tr.nd-row-neg-ecn:hover > td{ background:#e2e8f0 !important; }
#ndGrid tbody tr.nd-row-neg-ecn > td .nd-cell{ background:transparent !important; }
/* ★ 2026-11-08 账号管理：点击姓名编辑 */
.up-name-link{ color:var(--brand); cursor:pointer; font-weight:600; border-bottom:1px dotted var(--brand); }
.up-name-link:hover{ color:var(--brand-2,#1d4ed8); border-bottom-style:solid; }
/* ★ 2026-11-08 全屏明细顶部流程颜色图例 */
#vdFsLegend{
  position:fixed; top:0; left:0; right:0; height:44px; z-index:2590;
  display:flex; align-items:center; padding:0 360px 0 16px; box-sizing:border-box;
  background:rgba(255,255,255,.97); border-bottom:1px solid #e2e8f0;
  font-size:11.5px; color:var(--text-2);
}
#vdFsLegend .req-legend-badge{
  border:0; background:transparent; padding:0; color:var(--text-2);
  font-size:12px; white-space:nowrap;
}
body.vd-fs-with-legend .card.nd-fs .card-body{
  padding-top:46px !important;
}
@media (max-width: 1100px){
  #vdFsLegend{ font-size:10.5px; padding:0 8px; }
  #vdFsLegend .req-legend-badge{ font-size:11px; }
}

/* ★ 2026-11-08 快捷键页面压缩为每页一行 */
.sc-tbl .sc-group{ vertical-align:top; white-space:nowrap; }
.sc-tbl .sc-group .hint{ font-size:10.5px; margin-top:2px; }
.sc-tbl .sc-line{ line-height:2.1; white-space:normal; vertical-align:top; }
.sc-tbl .sc-line kbd{ margin-right:2px; }
.sc-sep{ color:var(--text-3); margin:0 7px; }
/* 查询表格：隶属组件多值折叠显示，完整内容在 title 中 */
.q-table td.q-component{ cursor:help; }
/* 查询表格：固定列宽，避免状态/短列被自动摊宽 */
.q-table{ table-layout:fixed; width:max-content; min-width:100%; }
.q-table th, .q-table td{ overflow:hidden; text-overflow:ellipsis; }
/* 查询表格列宽微调：类型列不省略，组件列略紧凑 */
.q-table td.q-type{ text-overflow:clip; }
.q-table td.q-component{ font-size:10.5px; }

/* ★ 2026-11-10：详情行编辑入口 + 核对弹窗内编码修正 */
.nd-grid td.nd-rn{ position:relative; }
.vd-row-edit{
  border:0; background:transparent; color:var(--brand); cursor:pointer;
  font-size:11px; line-height:1; padding:1px 2px; margin-left:2px;
  border-radius:3px; vertical-align:middle;
}
.vd-row-edit:hover{ background:var(--brand-soft); color:var(--brand-strong,var(--brand)); }
.ec-code-edit{
  border:1px solid #bfdbfe; background:#eff6ff; border-radius:7px;
  padding:8px 10px; margin:2px 0;
}
.ec-code-title{ font-size:12.5px; font-weight:700; color:var(--text-1); margin-bottom:2px; }