:root {
  --primary: #fe661a;
  --primary-dark: #e05510;
  --bg: #fff7f0;
  --card: #ffffff;
  --text: #1c1917;
  --muted: #64748b;
  --danger: #dc2626;
  --border: #fed7aa;
  --radius: 0;
  --safe-bottom: env(safe-area-inset-bottom, 0px);
  font-family: "Microsoft YaHei";
}

/* 订单列表行内编辑（2026-10-02）：可编辑单元格悬停提示（双击进入编辑） */
.data-table td.so-editable:hover {
  cursor: text;
  background: #f0fdfa;
  box-shadow: inset 0 0 0 1px #99f6e4;
}
/* 行内日期编辑隐藏原生日历图标（2026-10-02 用户：移除日期图标；双击 showPicker 弹面板） */
input.so-inp-date::-webkit-calendar-picker-indicator { display: none; }
input.so-inp-date::-webkit-inner-spin-button,
input.so-inp-date::-webkit-outer-spin-button { display: none; }

* { box-sizing: border-box; }
html, body {
  margin: 0;
  padding: 0;
  background: var(--bg);
  color: var(--text);
  height: 100%;
  overflow: hidden; /* 禁止整页滚动，避免侧栏跟着列表一起动 */
  font-size: 12px;
  font-family: "Microsoft YaHei";
  line-height: 1.4;
}
body { -webkit-tap-highlight-color: transparent; }

#app {
  max-width: none;
  width: 100%;
  margin: 0;
  height: 100%;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.view {
  padding: 12px 16px calc(12px + var(--safe-bottom));
  flex: 1;
  display: flex;
  flex-direction: column;
  min-height: 0;
  overflow: auto; /* 登录页等可单独滚动 */
}

#view-login.view { display: block; }
#view-shell.shell {
  display: flex;
  flex-direction: column;
  flex: 1;
  height: 100%;
  min-height: 0;
  padding: 0;
  background: var(--bg);
  overflow: hidden;
  position: relative;
}
#view-shell[hidden],
.view[hidden],
.shell[hidden] { display: none !important; }

/* 已登录启动：首帧不闪登录（新标签页） */
html.mf-authed-boot #view-login {
  display: none !important;
}
html.mf-authed-boot #view-shell,
html.mf-authed-boot #view-shell[hidden] {
  display: flex !important;
}

/* —— 主内容区 —— */
.shell-main {
  flex: 1;
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
  padding: 0;
  position: relative;
  overflow: hidden;
  background: var(--card);
}

/* —— 顶部应用内标签栏（对标国桉康，替代多开浏览器窗口） —— */
.tab-bar {
  display: flex;
  align-items: center;
  height: 32px;
  background: #f8f9fb;
  border-bottom: 1px solid var(--border);
  padding: 0 8px;
  flex-shrink: 0;
  z-index: 20;
}
.tab-bar-list {
  display: flex;
  align-items: center;
  flex: 1;
  overflow-x: auto;
  overflow-y: hidden;
  gap: 2px;
  min-width: 0;
}
.tab-bar-list::-webkit-scrollbar {
  height: 12px;
}
.tab-bar-list::-webkit-scrollbar-thumb {
  background: #cbd5e1;
  border-radius: 0;
}
.tab-item {
  display: flex;
  align-items: center;
  gap: 6px;
  height: 26px;
  padding: 0 10px;
  background: #fff;
  border: none;
  border-bottom: 1px solid #e2e8f0;
  border-radius: 0;
  cursor: pointer;
  font-size: 11px;
  font-weight: 400;
  color: #475569;
  white-space: nowrap;
  flex-shrink: 0;
  max-width: 160px;
}
.tab-item:hover {
  background: #f1f5f9;
  border-bottom-color: #cbd5e1;
}
.tab-item.active {
  background: #fff;
  border-bottom: 2px solid var(--primary);
  color: var(--primary);
  box-shadow: none;
}
.tab-item .tab-title {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.tab-item .tab-close {
  width: 16px;
  height: 16px;
  border: none;
  background: transparent;
  color: #94a3b8;
  cursor: pointer;
  border-radius: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 12px;
  line-height: 1;
  padding: 0;
  flex-shrink: 0;
}
.tab-item .tab-close:hover {
  background: #e2e8f0;
  color: #475569;
}
.tab-item.home-tab .tab-close {
  display: none;
}
.tab-bar-actions {
  display: flex;
  align-items: center;
  gap: 4px;
  margin-left: 8px;
  flex-shrink: 0;
}
.tab-bar-btn {
  height: 22px;
  padding: 0 8px;
  border: none;
  background: #fff;
  border-radius: 0;
  font-size: 10px;
  font-weight: 400;
  color: #64748b;
  cursor: pointer;
  font-family: inherit;
}
.tab-bar-btn:hover {
  background: #f1f5f9;
  color: #334155;
}
.tab-bar-btn:disabled {
  opacity: 0.45;
  cursor: default;
}

/* —— 底栏：右侧统计 —— */
.shell-foot {
  flex-shrink: 0;
  height: 36px;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 12px;
  background: #fff;
  border-top: 1px solid var(--border);
  z-index: 30;
}
.shell-menu-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border: none;
  background: transparent;
  color: var(--text);
  font-size: 12px;
  padding: 4px 10px;
  border-radius: 0;
  cursor: pointer;
  line-height: 1.4;
  flex-shrink: 0;
}
.shell-menu-btn:hover,
.shell-menu-btn[aria-expanded="true"] {
  background: #e6f4f2;
  color: var(--primary-dark);
}
.shell-foot-spacer { flex: 1; min-width: 8px; }
.shell-foot-pager {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  flex-shrink: 0;
  margin-right: 8px;
}
.foot-page-btn {
  width: 26px;
  height: 24px;
  padding: 0;
  border: 1px solid var(--border);
  border-radius: 0;
  background: #fff;
  color: var(--text);
  cursor: pointer;
  line-height: 1;
  font-size: 16px;
}
.foot-page-btn:hover:not(:disabled) {
  border-color: var(--accent, #0D9488);
  color: var(--accent, #0D9488);
}
.foot-page-btn:disabled {
  opacity: 0.4;
  cursor: not-allowed;
}
.foot-page-info {
  min-width: 52px;
  text-align: center;
  font-size: 12px;
  color: var(--text);
  white-space: nowrap;
}
.shell-foot-status {
  font-size: 12px;
  color: var(--text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
  flex-shrink: 0;
  padding-right: 4px;
  text-align: right;
}

/* —— 常驻左侧导航（对齐国桉康） —— */
.nav-popup {
  position: fixed;
  left: 0;
  top: 0;
  bottom: 0;
  z-index: 40;
  width: 140px;
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  background: #fafbfc;
  border-right: 1px solid #e2e8f0;
  box-shadow: 1px 0 3px rgba(15, 23, 42, 0.04);
  overflow: visible; /* 允许状态 flyout 向右侧溢出 */
  pointer-events: auto;
  transition: width 0.22s ease;
}
.nav-popup.open,
.nav-popup.locked { width: 140px; }
.nav-popup.collapsed { width: 48px; }
.nav-popup[hidden] { display: none !important; }
/* shell 可见时：强制显示导航（覆盖 hidden 属性） */
#view-shell:not([hidden]) .nav-popup {
  display: flex !important;
}
#view-shell:not([hidden]) .nav-popup:not(.collapsed) { width: 140px; }
#view-shell:not([hidden]) .nav-popup.collapsed { width: 48px; }
/* 主内容区左偏移：展开 140px / 收起 48px */
#view-shell:not([hidden]) .shell-main {
  margin-left: 140px;
  transition: margin-left 0.22s ease;
}
body.nav-collapsed #view-shell:not([hidden]) .shell-main { margin-left: 48px; }
.nav-popup-body {
  display: flex;
  flex-direction: row;
  align-items: stretch;
  min-height: 0;
  height: 100%;
  width: 100%;
}
.nav-popup-main {
  width: 100%;
  min-width: 0;
  max-width: 100%;
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow-y: auto;
  overflow-x: hidden;
  box-sizing: border-box;
  position: relative;
  z-index: 2;
}
/* 收起态：主区收窄为图标条，隐藏文字/非图标元素 */
.nav-popup.collapsed .nav-popup-main {
  width: 48px; min-width: 48px; max-width: 48px; flex-basis: 48px;
}
.nav-popup.collapsed .nav-popup-user,
.nav-popup.collapsed .nav-popup-user-dropdown,
.nav-popup.collapsed .nav-popup-sep,
.nav-popup.collapsed .nav-popup-change-pwd,
.nav-popup.collapsed .nav-popup-logout { display: none; }
.nav-popup.collapsed .nav-item,
.nav-popup.collapsed .nav-group-toggle {
  justify-content: center; padding-left: 0; padding-right: 0;
}
.nav-popup.collapsed .nav-item > span:not(.nav-ico):not(.nav-badge):not(.nav-nested-chevron),
.nav-popup.collapsed .nav-group-label,
.nav-popup.collapsed .nav-group-chevron,
.nav-popup.collapsed .nav-sub,
.nav-popup.collapsed .nav-popup-name,
.nav-popup.collapsed .nav-popup-role { display: none; }
.nav-popup.collapsed .nav-nested-head { justify-content: center; }
.nav-popup.collapsed .nav-nested-chevron { display: none; }
.nav-popup.collapsed .nav-popup-side { display: none !important; }
.nav-popup-side {
  flex: 0 0 auto;
  width: max-content;
  min-width: 148px;
  max-width: min(260px, calc(100vw - 24px));
  position: absolute;
  left: 100%;
  top: 0;
  z-index: 50;
  margin: 0;
  padding: 4px 0;
  background: #fff;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  box-shadow: 4px 4px 12px rgba(15, 23, 42, 0.08);
  display: none;
  flex-direction: column;
  max-height: 100%;
  overflow-x: hidden;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  box-sizing: border-box;
}
.nav-popup.wo-expanded .nav-popup-side#nav-wo-status-sub,
.nav-popup.wms-expanded .nav-popup-side#nav-wms-region-sub,
.nav-popup.wms-func-expanded .nav-popup-side#nav-wms-func-sub {
  display: flex;
}
.nav-popup-side[hidden] {
  display: none !important;
}
.nav-popup.wo-expanded .nav-popup-side#nav-wo-status-sub[hidden],
.nav-popup.wms-expanded .nav-popup-side#nav-wms-region-sub[hidden],
.nav-popup.wms-func-expanded .nav-popup-side#nav-wms-func-sub[hidden] {
  display: flex !important;
}
.nav-popup-user {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  background: #f5f7fa;
  cursor: pointer;
  transition: background 0.15s ease;
}
.nav-popup-user:hover,
.nav-popup-user:focus-visible {
  background: #e8f5f3;
  outline: none;
}
.nav-popup-user-chevron {
  margin-left: auto;
  color: #94a3b8;
  transition: transform 0.2s ease;
  flex-shrink: 0;
}
.nav-popup-user.is-open .nav-popup-user-chevron {
  transform: rotate(180deg);
}
.nav-popup-user-dropdown {
  display: none;
  flex-direction: column;
  background: #fff;
  border-bottom: 1px solid #e2e8f0;
  padding: 4px 0;
  position: relative;
  z-index: 10;
}
.nav-popup-user-dropdown[hidden] { display: none; }
.nav-popup-user.is-open + .nav-popup-user-dropdown { display: flex; }
.nav-popup-change-pwd {
  width: 100%; border: none; background: transparent; flex-shrink: 0;
  text-align: left; padding: 8px 16px; cursor: pointer; font-size: 13px; color: #0f766e;
  box-sizing: border-box; display: flex; align-items: center; gap: 6px;
}
.nav-popup-change-pwd:hover { background: #ecfdf5; }
.nav-popup-change-pwd .nav-ico { width: 20px; display: inline-flex; justify-content: center; }
.nav-popup-avatar {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: linear-gradient(135deg, #0d9488, #0f766e);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: 13px;
  flex-shrink: 0;
}
.nav-popup-user-meta { min-width: 0; }
.nav-popup-name {
  font-size: 13px;
  font-weight: 600;
  color: var(--text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.nav-popup-role {
  font-size: 12px;
  color: var(--muted);
  margin-top: 2px;
}
.nav-popup-sep {
  height: 1px;
  background: var(--border);
}
.nav-popup-list {
  display: flex;
  flex-direction: column;
  padding: 4px 0;
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}
.nav-popup-user,
.nav-popup-logout {
  flex-shrink: 0;
}
.nav-popup-logout {
  width: 100%; border: none; background: transparent; flex-shrink: 0;
  text-align: left; padding: 8px 16px; cursor: pointer; font-size: 13px; color: #b91c1c;
  box-sizing: border-box;
}
.nav-popup-logout:hover { background: #fef2f2; }
/* data-nav 元素按权限设 hidden 后必须真正消失：作者级 display 规则（如 .nav-item 的
   display:flex）会压过 UA 的 [hidden]{display:none}，导致 DOM 隐藏、视觉照显（2026-10-02） */
[data-nav][hidden] { display: none !important; }
.nav-item {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  border: none;
  background: transparent;
  color: var(--text);
  text-align: left;
  padding: 8px 16px;
  cursor: pointer;
  font-size: 13px;
  box-sizing: border-box;
  white-space: nowrap;
}
.nav-item:hover {
  background: #e6f4f2;
  color: var(--primary-dark);
}
.nav-item.active {
  background: #ccfbf1;
  color: var(--primary-dark);
  font-weight: 600;
}
.nav-ico {
  width: 20px;
  text-align: center;
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.nav-ico svg {
  width: 14px;
  height: 14px;
  vertical-align: -2px;
}
.nav-badge {
  margin-left: auto;
  min-width: 18px;
  height: 18px;
  line-height: 18px;
  padding: 0 5px;
  border-radius: 0;
  background: #dc2626;
  color: #fff;
  font-size: 11px;
  font-weight: 600;
  text-align: center;
  box-sizing: border-box;
  flex-shrink: 0;
}
.nav-group { width: 100%; }
.nav-group-toggle {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  border: none;
  background: transparent;
  color: var(--text);
  text-align: left;
  padding: 8px 16px;
  cursor: pointer;
  font-size: 13px;
  box-sizing: border-box;
  white-space: nowrap;
}
.nav-group-toggle:hover {
  background: #e6f4f2;
  color: var(--primary-dark);
}
.nav-group-toggle.is-open,
.nav-group-toggle.has-active {
  color: var(--primary-dark);
  font-weight: 600;
}
.nav-group-label { flex: 1; min-width: 0; white-space: nowrap; }
.nav-group-chevron {
  font-size: 11px;
  color: var(--muted);
  transition: transform 0.15s ease;
  flex-shrink: 0;
}
.nav-group-toggle[aria-expanded="true"] .nav-group-chevron {
  transform: rotate(90deg);
}
.nav-sub {
  padding: 0 0 4px;
}
.nav-sub[hidden] { display: none !important; }
.nav-sub-item {
  padding-left: 36px;
  font-size: 12.5px;
}
.nav-nested-head {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
}
.nav-nested-label {
  flex: 1;
  min-width: 0;
  text-align: left;
}
.nav-nested-chevron {
  font-size: 10px;
  color: #94a3b8;
  margin-left: auto;
  padding: 2px 4px;
}
.nav-popup.wo-expanded .nav-nested-head[data-mod="work-orders"] .nav-nested-chevron,
.nav-popup.wms-expanded .nav-nested-head[data-wms-nest] .nav-nested-chevron,
.nav-nested-head[aria-expanded="true"] .nav-nested-chevron {
  color: #0d9488;
}
.nav-nested-head.has-active {
  color: var(--primary, #0d9488);
  font-weight: 600;
}
.nav-flyout-item {
  padding: 8px 12px;
  font-size: 12px;
  color: #334155;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.nav-flyout-item:hover {
  background: #e6f4f2;
  color: var(--primary-dark, #0f766e);
}
.nav-flyout-item.active {
  background: #ccfbf1;
  color: var(--primary-dark, #0f766e);
  font-weight: 600;
}
.nav-popup-logout {
  display: block;
  width: 100%;
  border: none;
  background: transparent;
  color: var(--danger, #dc2626);
  text-align: left;
  padding: 8px 16px;
  cursor: pointer;
  font-size: 13px;
}
.nav-popup-logout:hover {
  background: #fef2f2;
}

.topbar {
  display: none;
}
.mod-nav { display: none; }
.mod-tab { display: none; }

.list-pane {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-height: 0;
  min-width: 0; /* 宽表时由内部 table-wrap 横向滚动 */
  background: var(--card);
  border: none;
  border-radius: 0;
  overflow: hidden;
  font-size: 12px;
  font-family: "Microsoft YaHei";
  line-height: 1.4;
}
.list-pane[hidden] { display: none !important; }

.module-placeholder {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  min-height: 280px;
  padding: 40px 24px;
  color: var(--muted);
}
.module-placeholder-ico {
  font-size: 36px;
  line-height: 1;
  margin-bottom: 12px;
}
.module-placeholder-title {
  font-size: 16px;
  font-weight: 600;
  color: var(--primary-dark);
  margin-bottom: 8px;
}
.module-placeholder-desc {
  margin: 0;
  max-width: 360px;
  font-size: 13px;
  line-height: 1.6;
  color: var(--muted);
}

/* —— 登录页（流行 SaaS 左右分栏 + 实心主按钮） —— */
#view-login.view-login {
  padding: 0;
  overflow: hidden;
  background:
    radial-gradient(1200px 600px at 10% -10%, rgba(254, 102, 26, 0.26), transparent 55%),
    radial-gradient(900px 500px at 100% 100%, rgba(224, 85, 16, 0.16), transparent 50%),
    linear-gradient(160deg, #fff7ed 0%, #fffbeb 45%, #e2e8f0 100%);
}
.login-shell {
  display: flex;
  width: 100%;
  height: 100%;
  min-height: 100%;
}
.login-hero {
  display: none;
  flex: 1.05;
  align-items: center;
  justify-content: center;
  padding: 48px;
  background:
    linear-gradient(145deg, rgba(224, 85, 16, 0.96), rgba(254, 102, 26, 0.9)),
    url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.06'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
  color: #fff;
  position: relative;
  overflow: hidden;
}
.login-hero::after {
  content: "";
  position: absolute;
  width: 420px;
  height: 420px;
  border-radius: 50%;
  right: -120px;
  bottom: -140px;
  background: rgba(255, 255, 255, 0.08);
}
.login-hero-inner {
  position: relative;
  z-index: 1;
  max-width: 420px;
}
.login-mark {
  width: auto;
  max-width: 280px;
  height: auto;
  min-height: 56px;
  border-radius: 0;
  background: transparent;
  border: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  margin-bottom: 20px;
  box-sizing: border-box;
}
.login-mark-img {
  display: block;
  width: 100%;
  max-width: 248px;
  height: auto;
  object-fit: contain;
}
.login-hero-title {
  font-size: 28px !important;
  font-weight: 700 !important;
  letter-spacing: 0.02em;
  margin-bottom: 8px;
}
.login-hero-mods {
  margin: 0 0 12px;
  font-size: 16px !important;
  font-weight: 650 !important;
  letter-spacing: 0.08em;
  color: rgba(255, 255, 255, 0.95);
}
.login-hero-desc {
  margin: 0;
  font-size: 14px !important;
  line-height: 1.7 !important;
  color: rgba(255, 255, 255, 0.88);
}
.login-panel {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 28px 20px;
}
.login-card {
  width: 100%;
  max-width: 400px;
  margin: 0;
  background: rgba(255, 255, 255, 0.92);
  border-radius: 0;
  padding: 36px 32px 28px;
  box-shadow:
    0 1px 2px rgba(15, 23, 42, 0.04),
    0 16px 40px rgba(254, 102, 26, 0.14);
  border: 1px solid rgba(255, 255, 255, 0.8);
  backdrop-filter: blur(10px);
}
.login-card-head {
  margin-bottom: 22px;
}
.login-card .brand {
  font-size: 22px !important;
  font-weight: 700 !important;
  color: #e05510;
  letter-spacing: 0.02em;
}
.login-card .sub {
  color: #64748b;
  margin: 8px 0 0;
  font-size: 13px !important;
  line-height: 1.5 !important;
}
.login-card .field {
  margin-bottom: 16px;
}
.login-card .field span {
  font-size: 12px !important;
  font-weight: 600 !important;
  color: #334155;
  margin-bottom: 8px;
}
.login-card .field input {
  padding: 12px 14px;
  border-radius: 0;
  border: 1px solid #fed7aa;
  background: #fffaf5;
  transition: border-color .15s, box-shadow .15s, background .15s;
}
.login-card .field input:hover {
  border-color: #fdba74;
}
.login-card .field input:focus {
  outline: none;
  background: #fff;
  border-color: #fe661a;
  box-shadow: 0 0 0 4px rgba(254, 102, 26, 0.18);
}
.login-card .error {
  margin: 0 0 12px;
}
/* remember1（2026-10-07 用户截图智邦国际登录页红框）：记住用户名/密码 复选框行 */
.login-remember {
  display: flex;
  align-items: center;
  gap: 24px;
  margin: 2px 0 4px;
}
.login-remember label {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12.5px !important;
  color: #64748b;
  cursor: pointer;
  user-select: none;
}
.login-remember input[type="checkbox"] {
  width: 14px;
  height: 14px;
  margin: 0;
  accent-color: #fe661a;
  cursor: pointer;
}
.btn-login {
  -webkit-appearance: none;
  appearance: none;
  width: 100%;
  margin-top: 8px;
  padding: 13px 16px;
  border: none;
  border-radius: 0;
  cursor: pointer;
  font-family: "Microsoft YaHei" !important;
  font-size: 15px !important;
  font-weight: 700 !important;
  letter-spacing: 0.12em;
  color: #fff !important;
  background: linear-gradient(135deg, #ff8a3d 0%, #fe661a 55%, #e05510 100%);
  box-shadow: 0 10px 24px rgba(254, 102, 26, 0.35);
  transition: transform .12s ease, box-shadow .12s ease, filter .12s ease;
}
.btn-login:hover {
  filter: brightness(1.05);
  box-shadow: 0 12px 28px rgba(254, 102, 26, 0.42);
}
.btn-login:active {
  transform: translateY(1px);
  filter: brightness(0.98);
}
.btn-login:disabled {
  opacity: 0.6;
  cursor: default;
  box-shadow: none;
}
.login-foot-tip {
  margin: 16px 0 0;
  text-align: center;
  color: #94a3b8;
  font-size: 12px !important;
}
.login-tabs {
  display: flex;
  gap: 6px;
  margin-bottom: 18px;
  padding: 4px;
  border-radius: 0;
  background: #fff4eb;
}
.login-tab {
  flex: 1;
  border: none;
  background: transparent;
  border-radius: 0;
  padding: 9px 10px;
  cursor: pointer;
  font-family: "Microsoft YaHei" !important;
  font-size: 13px !important;
  font-weight: 600 !important;
  color: #64748b;
}
.login-tab.active {
  background: #fff;
  color: #e05510;
  box-shadow: 0 1px 3px rgba(15, 23, 42, 0.08);
}
#reg-hwid {
  font-family: Consolas, "Courier New", monospace !important;
  font-size: 12px !important;
  letter-spacing: 0.04em;
  color: #e05510;
  background: #fff7ed !important;
}
.btn-linkish {
  display: block;
  width: 100%;
  margin-top: 10px;
  border: none;
  background: transparent;
  color: #fe661a;
  cursor: pointer;
  font-family: "Microsoft YaHei" !important;
  font-size: 13px !important;
  text-decoration: underline;
  text-underline-offset: 3px;
}
.ok-msg {
  margin: 0 0 12px;
  color: #047857;
  font-size: 13px !important;
}
.menu-perm-body {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  padding: 12px 16px 16px;
  -webkit-overflow-scrolling: touch;
}
.menu-perm-body .tabs {
  margin-bottom: 12px;
}
.menu-perm-body > .col-set-hint,
.menu-perm-body > .status-line {
  flex: 0 0 auto;
}
#menu-perm-matrix.perm-pane {
  flex: 1;
  min-height: 0;
  margin-bottom: 0;
  max-width: 100%;
  display: flex;
  flex-direction: column;
}
#menu-perm-matrix .perm-scroll {
  flex: 1;
  min-height: 0;
  overflow: auto;
  max-width: 100%;
  -webkit-overflow-scrolling: touch;
  border: 1px solid var(--border);
  border-radius: 0;
  background: #fff;
}
.settings-body {
  flex: 1;
  overflow: auto;
  padding: 16px 20px 24px;
}
.settings-tabs {
  max-width: 960px;
  margin: 0 auto 14px;
}
.settings-tabs .tab {
  flex: 1;
  min-width: 0;
}
.settings-tab-pane {
  width: 100%;
  max-width: 960px;
  margin: 0 auto;
}
.settings-tab-pane[hidden] {
  display: none !important;
}
.settings-card {
  max-width: none;
  width: 100%;
  margin: 0;
  background: #fff;
  border: 1px solid var(--border);
  border-radius: 0;
  padding: 20px 20px 16px;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
  box-sizing: border-box;
}
.settings-fields-2 {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0 14px;
}
@media (min-width: 560px) {
  .settings-fields-2 {
    grid-template-columns: 1fr 1fr;
  }
}
.settings-hw-toolbar {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0 14px;
  margin-bottom: 12px;
  align-items: end;
}
@media (min-width: 900px) {
  .settings-hw-toolbar {
    grid-template-columns: minmax(200px, 1.2fr) auto minmax(200px, 1.2fr) minmax(140px, 0.8fr) auto;
  }
  .settings-hw-toolbar .field {
    margin-bottom: 0;
  }
  .settings-hw-auth-btn {
    margin-bottom: 0;
    padding-bottom: 2px;
  }
}
.hw-auth-list {
  display: grid;
  grid-template-columns: 1fr;
  gap: 8px;
}
.user-mail-list {
  display: grid;
  grid-template-columns: 1fr;
  gap: 8px;
}
.user-mail-item {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 4px 12px;
  align-items: start;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: 0;
  background: #f8fffe;
}
.user-mail-item.is-off {
  background: #f8fafc;
  opacity: 0.92;
}
.user-mail-main {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}
.user-mail-name {
  font-weight: 600;
  color: #0f172a;
}
.user-mail-email {
  font-family: Consolas, "Courier New", monospace !important;
  font-size: 12px !important;
  color: #0f766e;
  word-break: break-all;
}
.user-mail-email.is-empty {
  color: #94a3b8;
  font-family: inherit !important;
}
.user-mail-meta {
  grid-column: 1 / -1;
  color: #94a3b8;
  font-size: 12px !important;
}
.user-mail-badge {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 11px !important;
  font-weight: 600;
  white-space: nowrap;
}
.user-mail-badge.is-on {
  background: #ccfbf1;
  color: #0f766e;
}
.user-mail-badge.is-off {
  background: #e2e8f0;
  color: #64748b;
}
@media (min-width: 700px) {
  .hw-auth-list {
    grid-template-columns: 1fr 1fr;
  }
  .user-mail-list {
    grid-template-columns: 1fr 1fr;
  }
}
@media (min-width: 1100px) {
  .hw-auth-list {
    grid-template-columns: 1fr 1fr 1fr;
  }
  .user-mail-list {
    grid-template-columns: 1fr 1fr 1fr;
  }
}
.settings-card-title {
  margin: 0 0 8px;
  font-size: 15px !important;
  font-weight: 700 !important;
  color: #0f766e;
}
.settings-card-desc {
  margin: 0 0 16px;
  color: #64748b;
  line-height: 1.6 !important;
}
.settings-meta {
  margin: -6px 0 14px;
  color: #94a3b8;
  font-size: 12px !important;
}
.settings-switch-row {
  display: flex !important;
  align-items: center;
  gap: 10px;
  margin: 0 0 16px;
  font-size: 14px;
}
.settings-switch-row input[type="checkbox"] {
  width: 16px;
  height: 16px;
  margin: 0;
  flex-shrink: 0;
  accent-color: #0f766e;
  cursor: pointer;
}
.settings-switch-row em {
  font-style: normal;
  color: #94a3b8;
  font-size: 12px !important;
}
.field-check {
  display: flex !important;
  align-items: center;
  gap: 10px;
  margin-bottom: 16px;
}
.field-check input[type="checkbox"] {
  width: 16px;
  height: 16px;
  margin: 0;
  flex-shrink: 0;
}
.field-check span {
  display: inline !important;
  margin: 0 !important;
  color: #334155;
  font-weight: 500 !important;
}
.field-check .field-hint {
  display: inline !important;
  margin: 0 !important;
  color: #94a3b8;
  font-weight: 400 !important;
  font-style: normal;
  font-size: 12px;
}
.settings-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.hw-auth-item {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 6px 10px;
  align-items: center;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: 0;
  background: #f8fffe;
}
.hw-auth-main {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}
.hw-auth-main code {
  font-family: Consolas, "Courier New", monospace !important;
  font-size: 12px !important;
  color: #0f766e;
  word-break: break-all;
}
.hw-auth-note { color: #64748b; }
.hw-auth-meta {
  grid-column: 1 / -1;
  color: #94a3b8;
  font-size: 12px !important;
}
.hw-auth-item .btn-revoke-hw {
  grid-row: 1 / span 1;
  grid-column: 2;
}
@media (min-width: 860px) {
  .login-hero { display: flex; }
  .login-panel { padding: 40px; }
  .login-card {
    max-width: 420px;
    padding: 40px 36px 32px;
  }
}

.field { display: block; margin-bottom: 14px; }
.field span {
  display: block;
  font-size: 12px;
  color: var(--muted);
  margin-bottom: 6px;
}
.field input, .field select, .search-bar input {
  width: 100%;
  padding: 12px 14px;
  border: 1px solid var(--border);
  border-radius: 0;
  font-size: 12px;
  background: #f8fffe;
  color: #002FA7;
}
.field input:focus, .field select:focus, .search-bar input:focus {
  outline: none;
  border-color: #14b8a6;
  background: #fff;
  box-shadow: 0 0 0 3px rgba(45, 212, 191, 0.2);
}
/* ctshift4（2026-10-22 虫哥「下拉内容仅显示业务员，支持编辑输入」）：
   「业务员」可输入下拉（combobox）——输入框外观沿用 .field input，下拉层绝对定位浮在上面 */
.mf-combo { position: relative; }
.mf-combo-list {
  position: absolute;
  left: 0;
  right: 0;
  top: calc(100% + 2px);
  z-index: 60;
  max-height: 240px;
  overflow-y: auto;
  border: 1px solid var(--border);
  background: #fff;
  box-shadow: 0 6px 18px rgba(15, 23, 42, 0.12);
}
.mf-combo-list[hidden] { display: none !important; }
.mf-combo-item {
  padding: 7px 10px;
  font-size: 12px;
  color: #0f172a;
  cursor: pointer;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.mf-combo-item:hover, .mf-combo-item.is-active { background: rgba(20, 184, 166, 0.12); }
.mf-combo-item.is-empty { color: var(--muted); }
.mf-combo-empty { padding: 8px 10px; font-size: 12px; color: var(--muted); }
.field textarea {
  width: 100%;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: 0;
  font-size: 12px;
  font: inherit;
  background: #f8fffe;
  color: #002FA7;
  resize: vertical;
}
.field textarea:focus {
  outline: none;
  border-color: #14b8a6;
  background: #fff;
  box-shadow: 0 0 0 3px rgba(45, 212, 191, 0.2);
}

/* 日期时间选择器：整框 flex，图标与文字同一行垂直居中 */
.mf-dt {
  position: relative;
  display: flex;
  flex-direction: row;
  align-items: center;
  width: 100%;
  box-sizing: border-box;
  min-height: 44px;
  padding: 0;
  border: 1px solid var(--border, #e2e8f0);
  border-radius: 0;
  background: #fff;
  overflow: hidden;
}
.mf-dt:focus-within {
  outline: 2px solid rgba(13, 148, 136, 0.35);
  border-color: var(--primary, #0d9488);
}
.field .mf-dt .mf-dt-text,
.mf-dt .mf-dt-text {
  flex: 1 1 auto;
  min-width: 0;
  width: auto !important;
  min-height: 42px !important;
  height: auto !important;
  margin: 0 !important;
  padding: 8px 8px 8px 12px !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: transparent !important;
  box-shadow: none !important;
  outline: none !important;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.01em;
}
.field .mf-dt .mf-dt-text:focus,
.mf-dt .mf-dt-text:focus {
  outline: none !important;
  box-shadow: none !important;
  border: 0 !important;
}
.mf-dt-pick {
  position: relative;
  flex: 0 0 40px;
  width: 40px;
  height: 40px;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--muted, #64748b);
  cursor: pointer;
  z-index: 1;
  line-height: 0;
  align-self: center;
  -webkit-appearance: none;
  appearance: none;
}
.mf-dt-pick svg {
  display: block;
  width: 18px;
  height: 18px;
  margin: 0;
  flex-shrink: 0;
}
.field .mf-dt .mf-dt-native,
.mf-dt .mf-dt-native {
  /* 移出布局与可视区域，杜绝系统日历图标贴在框内右上角 */
  position: absolute !important;
  left: -9999px !important;
  top: 0 !important;
  width: 1px !important;
  height: 1px !important;
  min-width: 0 !important;
  min-height: 0 !important;
  max-width: 1px !important;
  margin: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  opacity: 0 !important;
  pointer-events: none !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0);
}
.mf-dt:hover .mf-dt-pick,
.mf-dt:focus-within .mf-dt-pick {
  color: var(--primary-dark, #0f766e);
}
.mes-mobile-pane .mf-dt,
.wms-mobile-pane .mf-dt {
  min-height: 44px;
  border-color: #cbd5e1;
}
.mes-mobile-pane .mf-dt-pick,
.wms-mobile-pane .mf-dt-pick {
  flex-basis: 42px;
  width: 42px;
  height: 42px;
}
.mes-mobile-pane .field .mf-dt .mf-dt-text,
.wms-mobile-pane .field .mf-dt .mf-dt-text {
  min-height: 42px !important;
  font-size: 16px;
}
.mes-mobile-pane .field .mf-dt .mf-dt-native,
.wms-mobile-pane .field .mf-dt .mf-dt-native {
  left: -9999px !important;
  width: 1px !important;
  height: 1px !important;
  min-height: 0 !important;
  opacity: 0 !important;
  pointer-events: none !important;
}

/* 自定义联想下拉：宽度与输入框一致（原生 datalist 会被浏览器压窄） */
.mf-suggest {
  position: relative;
  width: 100%;
}
.mf-suggest > input {
  width: 100%;
}
.mf-suggest-menu {
  position: absolute;
  left: 0;
  right: 0;
  top: calc(100% + 4px);
  z-index: 120;
  width: 100%;
  min-width: 100%;
  max-width: 100%;
  box-sizing: border-box;
  max-height: min(280px, 42vh);
  overflow: auto;
  margin: 0;
  padding: 4px 0;
  background: #fff;
  border: 1px solid var(--border);
  border-radius: 0;
  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.14);
}
.mf-suggest-item {
  display: block;
  width: 100%;
  box-sizing: border-box;
  margin: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: var(--text);
  text-align: left;
  padding: 10px 12px;
  font-size: 12px;
  line-height: 1.4;
  cursor: pointer;
  white-space: normal;
  word-break: break-word;
}
.mf-suggest-menu.wms-model-menu .mf-suggest-item {
  white-space: normal;
  word-break: break-all;
}
.mf-suggest-item:hover,
.mf-suggest-item:focus {
  background: #e6f4f2;
  color: var(--primary-dark);
  outline: none;
}
#view-wms-txn .mf-suggest-menu,
.wms-mobile-pane .mf-suggest-menu {
  z-index: 140;
}
/* 明细产品编号：挂到 body + fixed，避免 table-wrap overflow 裁切 */
#view-wms-txn .detail-table .wms-model-suggest {
  position: relative;
  min-width: 140px;
  overflow: visible;
}
#view-wms-txn .detail-table td {
  overflow: visible;
}
.mf-suggest-menu.wms-model-menu {
  max-width: none;
}
.mf-suggest-empty {
  padding: 12px;
  font-size: 12px;
  color: var(--muted);
  text-align: left;
}

.btn {
  -webkit-appearance: none;
  appearance: none;
  border: none;
  border-radius: 0;
  padding: 8px 14px;
  font-size: 12px;
  font-weight: 500;
  cursor: pointer;
  background: transparent;
  color: var(--primary-dark);
  box-shadow: none;
  outline: none;
}
.btn:hover {
  background: #e6f4f2;
  color: var(--primary-dark);
}
.btn:active {
  background: #ccfbf1;
}
.btn:focus,
.btn:focus-visible {
  outline: none;
  box-shadow: none;
}
.btn.primary,
.btn.ghost {
  border: none;
  background: transparent;
  color: var(--primary-dark);
  font-weight: 500;
}
.btn.primary:hover,
.btn.ghost:hover {
  background: #e6f4f2;
  color: var(--primary-dark);
}
.btn.primary:active,
.btn.ghost:active {
  background: #ccfbf1;
}
.btn.block { width: 100%; padding: 14px; margin-top: 8px; }
.btn:disabled { opacity: 0.55; cursor: default; }

.error {
  color: var(--danger);
  font-size: 12px;
  margin: 0 0 8px;
  background: #fef2f2;
  border: 1px solid #fecaca;
  border-radius: 0;
  padding: 8px 10px;
}
.error.ok-msg {
  color: #065f46;
  background: #ecfdf5;
  border-color: #a7f3d0;
}

.page-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 8px 12px;
  background: linear-gradient(180deg, #f7fffe 0%, #eef9f7 100%);
  border-bottom: 1px solid var(--border);
  flex-wrap: wrap;
  flex-shrink: 0;
}
.page-header-left {
  display: flex;
  align-items: center;
  gap: 4px;
  min-width: 0;
  flex-shrink: 0;
}
.crm-mod-tabs {
  display: flex;
  flex: 1 1 auto;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px;
  min-width: 0;
  padding: 0 4px;
}
.crm-mod-tabs[hidden] {
  display: none !important;
}
/* 2026-10-05 modtabs1 用户「红框内容统一式样」：模块页签改药丸式
   （与退料记录页 .mf-ret-tabs 同款——白底描边圆角、当前页深青绿底白字） */
.crm-mod-tab {
  border: 1px solid #e2e8f0;
  background: #fff;
  color: #475569;
  border-radius: 999px;
  padding: 4px 14px;
  font-size: 12.5px;
  line-height: 1.3;
  cursor: pointer;
  white-space: nowrap;
  transition: all 0.12s ease;
}
.crm-mod-tab:hover {
  border-color: #0f766e;
  color: #0f766e;
  background: #fff;
}
.crm-mod-tab.active {
  background: #0f766e;
  border-color: #0f766e;
  color: #fff;
  font-weight: 600;
}
/* so-blue2（2026-10-06 用户「文字 蓝色 没有生效」）：so-blue1 的 .so-link-val 单类
   特异性低于 .data-table td 的 color，被覆盖回黑。提到 .data-table td.so-link-val。 */
.data-table td.so-link-val {
  color: #2563eb;
  font-weight: 600;
}
.page-title {
  font-size: 12px;
  font-weight: 400;
  color: var(--primary-dark);
  white-space: nowrap;
}
.toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: center;
  justify-content: flex-end;
  flex-shrink: 0;
}
.tb-btn {
  border: none;
  background: transparent;
  color: var(--primary-dark);
  border-radius: 0;
  padding: 5px 9px;
  font-size: 12px;
  font-weight: 400;
  font-family: "Microsoft YaHei";
  line-height: 1.4;
  cursor: pointer;
  white-space: nowrap;
  box-shadow: none;
  outline: none;
}
.tb-btn:hover {
  background: #e6f4f2;
  color: var(--primary-dark);
}
.tb-btn:active {
  background: #ccfbf1;
}
.tb-btn.tb-btn-success {
  color: #15803d;
  font-weight: 600;
}
.tb-btn.tb-btn-success:hover {
  background: #dcfce7;
  color: #166534;
}
.data-table td.col-ops .tb-btn.act-approve,
.data-table td[data-col="操作"] .tb-btn.act-approve {
  color: #15803d;
  font-weight: 600;
}
.data-table td.col-ops .tb-btn.act-approve:hover,
.data-table td[data-col="操作"] .tb-btn.act-approve:hover {
  background: #dcfce7;
  color: #166534;
}
/* 订单行右键菜单（原操作列，2026-09-29） */
#so-ctx-menu .so-ctx-item:hover:not(:disabled) { background: #f1f5f9; }
#so-ctx-menu .so-ctx-item:disabled { color: #9ca3af !important; cursor: not-allowed; }
.tb-btn:focus,
.tb-btn:focus-visible {
  outline: none;
  box-shadow: none;
}
/* 统一式样：无边框，不区分 primary / warn / danger */
.tb-btn.primary,
.tb-btn.warn,
.tb-btn.danger {
  border: none;
  background: transparent;
  color: var(--primary-dark);
  font-weight: 400;
}
.tb-btn.primary:hover,
.tb-btn.warn:hover,
.tb-btn.danger:hover {
  background: #e6f4f2;
  color: var(--primary-dark);
}
.tb-btn[hidden] { display: none !important; }
.tb-pool-days {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin: 0 2px 0 4px;
  font-size: 12px;
  color: var(--text-muted, #64748b);
  white-space: nowrap;
}
.tb-pool-days[hidden] { display: none !important; }
.tb-pool-days input[type="number"] {
  width: 56px;
  height: 28px;
  border: 1px solid #d0d7de;
  border-radius: 0;
  padding: 0 6px;
  font-size: 12px;
  font-family: "Microsoft YaHei", sans-serif;
  text-align: center;
  color: var(--text, #1e293b);
  background: #fff;
}
.tb-pool-days input[type="number"]:focus {
  outline: none;
  border-color: var(--primary, #fe661a);
  box-shadow: 0 0 0 2px rgba(254, 102, 26, 0.15);
}
.tb-pool-days .tb-btn {
  padding: 4px 8px;
}
.settings-smtp-row {
  display: flex;
  flex-wrap: wrap;
  gap: 12px 16px;
  align-items: flex-end;
  margin-bottom: 8px;
}
.settings-smtp-row .field {
  margin-bottom: 0;
  min-width: 100px;
}
.settings-smtp-row .field-check {
  padding-bottom: 6px;
}
.tb-dd {
  position: relative;
  display: inline-flex;
  align-items: center;
}
.tb-dd[hidden] { display: none !important; }
.tb-dd-menu {
  position: absolute;
  top: calc(100% + 4px);
  right: 0;
  z-index: 80;
  min-width: 148px;
  padding: 4px;
  background: #fff;
  border: 1px solid #d1e7e3;
  border-radius: 0;
  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12);
}
.tb-dd-menu[hidden] { display: none !important; }
.tb-dd-item {
  display: block;
  width: 100%;
  border: none;
  background: transparent;
  color: var(--primary-dark);
  text-align: left;
  border-radius: 0;
  padding: 7px 10px;
  font-size: 12px;
  font-family: "Microsoft YaHei";
  cursor: pointer;
  white-space: nowrap;
}
.tb-dd-item:hover { background: #e6f4f2; }
.tb-dd-item[hidden] { display: none !important; }
.tb-dd-tip {
  cursor: default;
  color: var(--muted, #64748b);
  font-size: 11px;
  pointer-events: none;
}
.tb-dd-tip.is-all { color: #0f766e; }
.tb-dd-tip.is-own { color: #b45309; }
.tb-dd-tip:hover { background: transparent; }
.tb-scope-tip {
  display: inline-flex;
  align-items: center;
  padding: 0 10px;
  font-size: 12px;
  color: #64748b;
  white-space: nowrap;
}
.tb-scope-tip.is-own {
  color: #b45309;
}
.tb-scope-tip.is-all {
  color: #0f766e;
}
.tb-scope-tip[hidden] { display: none !important; }
.tb-btn.active {
  background: #ccfbf1;
  color: var(--primary-dark);
}

.list-pane .search-bar {
  padding: 8px 14px 0;
  margin-bottom: 0;
}
.list-body {
  flex: 1;
  min-height: 0;
  min-width: 0; /* 宽表时勿被内容撑开，否则横向滚动跑到外层 */
  display: flex;
  flex-direction: column;
  overflow: hidden;
  padding: 0;
}
/* display:flex 会盖掉原生 [hidden] —— 用户管理页内的两个列表互斥切换全靠它，必须显式隐藏 */
.list-body[hidden] { display: none !important; }
.list-body .table-wrap {
  border: none;
  border-radius: 0;
  max-height: none;
  flex: 1;
  height: auto;
  width: 100%;
  max-width: 100%;
  min-width: 0;
  min-height: 0;
  overflow: auto; /* 列表唯一横/纵滚动容器：操作列 sticky 相对本容器 */
}
.list-body .empty {
  padding: 48px 16px;
}
/* 产品明细 中英文页签（2026-10-07 cplang1） */
#pane-crm-product .cp-lang-tabs {
  display: flex;
  align-items: center;
  gap: 2px;
  padding: 0 16px;
  border-bottom: 1px solid #eee;
  background: #fff;
  flex: 0 0 auto;
}
#pane-crm-product .cp-lang-tab {
  position: relative;
  appearance: none;
  border: 0;
  background: transparent;
  padding: 9px 14px;
  font-size: 13px;
  color: #666;
  cursor: pointer;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  transition: color .15s, border-color .15s;
}
#pane-crm-product .cp-lang-tab:hover { color: #ff5000; }
#pane-crm-product .cp-lang-tab.is-active {
  color: #ff5000;
  font-weight: 600;
  border-bottom-color: #ff5000;
}
#pane-crm-product .cp-lang-count {
  display: inline-block;
  min-width: 18px;
  margin-left: 5px;
  padding: 0 6px;
  border-radius: 9px;
  font-size: 11px;
  line-height: 17px;
  text-align: center;
  background: #f2f2f2;
  color: #888;
  vertical-align: middle;
}
#pane-crm-product .cp-lang-tab.is-active .cp-lang-count {
  background: #fff0e8;
  color: #ff5000;
}
/* 描述/包装长文本浮显（2026-10-07 cplang2；cptip1 字段化排版） */
#cp-longtip {
  position: fixed;
  left: 0; top: 0;
  z-index: 9999;
  display: none;
  pointer-events: none;
  max-width: 460px;
  max-height: 76vh;
  overflow: hidden;
  padding: 9px 12px 10px;
  border-radius: 6px;
  background: rgba(22, 34, 50, .97);
  border: 1px solid rgba(255, 157, 77, .38);
  color: #e8eef6;
  font-size: 12px;
  /* ⚠️ 必须 !important：app.css 10429 有无作用域的
     `span, div { font-weight:400 !important; line-height:1.4 !important }` 全局锁，
     浮层挂 body 下也中招（2026-10-07 cptip1 实测被压回 400）。 */
  line-height: 1.5 !important;
  text-align: left;
  white-space: normal;
  word-break: break-word;
  box-shadow: 0 8px 26px rgba(10, 22, 38, .36);
}
#cp-longtip .cp-tip-head {
  margin: 0 0 6px;
  padding: 0 0 5px;
  border-bottom: 1px solid rgba(255, 255, 255, .14);
  color: #ff9d4d;
  font-size: 12px;
  font-weight: 700 !important;
  letter-spacing: .5px;
}
/* 键名/值两列网格对齐：所有值左边缘严格对齐（长键名不再把值顶歪），
   行间虚线分隔；.cp-tip-row 用 display:contents 让 k/sep/v 直接参与网格列。 */
#cp-longtip .cp-tip-body {
  display: grid;
  grid-template-columns: max-content max-content minmax(0, 1fr);
  align-items: baseline;
}
#cp-longtip .cp-tip-row { display: contents; }
#cp-longtip .cp-tip-row > span { padding: 2.5px 0; }
#cp-longtip .cp-tip-row:not(:first-child) > span { border-top: 1px dashed rgba(255, 255, 255, .07); }
#cp-longtip .cp-tip-k {
  color: #ffb066;
  font-weight: 600 !important;
  white-space: nowrap;
}
#cp-longtip .cp-tip-sep { color: #ffb066; }
#cp-longtip .cp-tip-v { color: #dfe7f0; }
#cp-longtip .cp-tip-plain > .cp-tip-v { grid-column: 1 / -1; color: #c7d2de; }
/* 包装图大图灯箱（2026-10-07 cplang2） */
#cp-imgview {
  position: fixed;
  inset: 0;
  z-index: 10000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 40px;
  background: rgba(0, 0, 0, .72);
}
#cp-imgview[hidden] { display: none !important; }
#cp-imgview img {
  max-width: 88vw;
  max-height: 88vh;
  object-fit: contain;
  background: #fff;
  border-radius: 6px;
  box-shadow: 0 12px 44px rgba(0, 0, 0, .5);
}
#cp-imgview .cp-imgview-x {
  position: absolute;
  top: 18px; right: 22px;
  width: 36px; height: 36px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, .92);
  color: #333;
  font-size: 15px;
  line-height: 36px;
  cursor: pointer;
}
#cp-imgview .cp-imgview-x:hover { background: #fff; }
/* 产品明细卡片视图（2026-10-07 cpcard4，淘宝风满信息商品卡） */
#crm-product-list .cp-cards {
  flex: 1;
  min-height: 0;
  overflow: auto;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(272px, 1fr));
  gap: 16px;
  padding: 16px;
  align-content: start;
}
.cp-card {
  position: relative;
  display: flex;
  flex-direction: column;
  min-height: 360px;
  border: 1px solid #ededed;
  border-radius: 10px;
  background: #fff;
  overflow: hidden;
  cursor: pointer;
  transition: border-color .15s, box-shadow .15s;
}
.cp-card:hover { border-color: #ff5000; box-shadow: 0 8px 22px rgba(0,0,0,.12); }
.cp-card.is-selected { border-color: #ff5000; box-shadow: 0 0 0 2px rgba(255,80,0,.35); }
/* 追加模式：已在当前报价单中的产品（cpadd2）——绿色标记、不可再选，防重复追加 */
.cp-card.is-in-quote {
  cursor: default;
  border-color: #a5d6a7;
  background: #f7fdf7;
  box-shadow: none;
}
.cp-card.is-in-quote:hover {
  border-color: #a5d6a7;
  box-shadow: 0 0 0 1px #a5d6a7 inset;
}
.cp-card.is-in-quote .cp-card-check { accent-color: #2e7d32; }
.cp-card.is-in-quote .cp-card-check:disabled { cursor: not-allowed; }
.cp-card-badge.cp-inquote { background: #e8f5e9; color: #2e7d32; font-weight: 600; }
.cp-card-check {
  position: absolute;
  top: 10px; left: 10px;
  z-index: 3;
  width: 18px; height: 18px;
  margin: 0;
  padding: 0;
  accent-color: #ff5000;
  cursor: pointer;
  border-radius: 4px;
  background: #fff;
  box-shadow: 0 1px 4px rgba(0,0,0,.25);
}
.cp-card-img {
  position: relative;
  aspect-ratio: 4 / 3;
  box-sizing: border-box;
  background: #fafafa;
  border-bottom: 1px solid #f2f2f2;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
.cp-card-img img { max-width: 100%; max-height: 100%; object-fit: contain; }
.cp-card-img .cp-img-empty {
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  color: #c4c4c4; font-size: 11px;
}
.cp-card-img .cp-img-empty b {
  font-size: 30px; font-weight: 700; color: #d9d9d9; line-height: 1;
}
.cp-card-img .cp-img-empty i { font-style: normal; }
.cp-card-main-img { width: 100%; height: 100%; object-fit: contain; }
.cp-card-zoom {
  position: absolute; top: 8px; right: 8px; z-index: 3;
  width: 28px; height: 28px; padding: 0;
  border: 0; border-radius: 50%;
  background: rgba(255,255,255,.9); color: #ff5000;
  font-size: 14px; line-height: 28px; text-align: center; cursor: pointer;
  box-shadow: 0 1px 5px rgba(0,0,0,.2);
}
.cp-card-zoom:hover { background: #fff; }
.cp-card-thumbs {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
  display: flex; gap: 6px; padding: 6px 6px 4px;
  background: linear-gradient(to top, rgba(0,0,0,.3), rgba(0,0,0,0));
}
.cp-card-thumb {
  width: 38px; height: 38px; border-radius: 4px; overflow: hidden;
  border: 2px solid rgba(255,255,255,.85); box-shadow: 0 1px 4px rgba(0,0,0,.2);
  cursor: pointer; background: #fff;
}
.cp-card-thumb.is-active { border-color: #ff5000; }
.cp-card-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cp-card-body { flex: 1; padding: 10px 12px 12px; display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.cp-card-price { color: #ff5000; font-weight: 700; font-size: 20px; line-height: 1.15; }
.cp-card-price-sym { font-size: 12px; font-weight: 700; margin-right: 1px; }
.cp-card-title {
  font-size: 14px;
  line-height: 1.4;
  font-weight: 600;
  color: #222;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.cp-card-subtitle {
  font-size: 12px;
  line-height: 1.4;
  color: #888;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.cp-card-desc, .cp-card-packtxt {
  font-size: 11px;
  line-height: 1.45;
  color: #777;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.cp-card-desc-label {
  display: inline-block;
  margin-right: 4px;
  padding: 0 5px;
  border-radius: 3px;
  font-size: 10px;
  line-height: 1.7;
  color: #ff5000;
  background: #fff0e8;
  vertical-align: middle;
}
.cp-card-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: 12px; color: #999; margin-top: 2px; }
.cp-card-badge { display: inline-block; padding: 1px 8px; border-radius: 3px; font-size: 11px; line-height: 1.6; background: #fff0e8; color: #ff5000; }
.cp-card-badge.off { background: #f5f5f5; color: #999; }
.cp-card-badge.cp-qcount { background: #fff0e8; color: #ff5000; }
.cp-card-badge.cp-qcount.hot { background: #ff5000; color: #fff; font-weight: 600; }
.cp-card-muted, .cp-muted { color: #bbb; font-weight: 400; }
.cp-card-foot {
  margin-top: auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 8px 12px;
  border-top: 1px solid #f5f5f5;
  background: #fafafa;
}
.cp-card-seq { font-size: 11px; color: #bbb; }
.cp-card-actions { display: inline-flex; gap: 6px; }
.cp-card-actions .link-btn { font-size: 12px; }
.page-footer {
  display: none; /* 统计文案改到底栏 shell-foot，与菜单同行 */
}

/* 订单评审：左列表 + 右合同预览分栏 */
#pane-order-review .or-split {
  flex: 1;
  min-height: 0;
  min-width: 0;
  display: flex;
  align-items: stretch;
  user-select: none;
}
#pane-order-review .or-list-col {
  flex: 0 0 var(--or-left-width, 54%);
  min-width: 260px;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
#pane-order-review .or-list-col .data-table tbody tr.or-row.selected {
  background: #eef2ff;
}
#pane-order-review .or-list-col .data-table tbody tr.or-row.selected:hover {
  background: #e0e7ff;
}
#pane-order-review .or-list-col .data-table tbody tr.or-row.selected td:first-child {
  box-shadow: inset 3px 0 0 #6366f1;
}
#pane-order-review .or-splitter {
  flex: 0 0 5px;
  cursor: col-resize;
  background: #e7e5e4;
  border-left: 1px solid #f5f5f4;
  border-right: 1px solid #f5f5f4;
  transition: background 0.15s;
  touch-action: none;
}
#pane-order-review .or-splitter:hover,
#pane-order-review .or-splitter.dragging {
  background: #0d9488;
}
#pane-order-review .or-preview-col {
  flex: 0 0 var(--or-mid-width, 34%);
  min-width: 300px;
  min-height: 0;
  display: flex;
  flex-direction: column;
  background: #fafaf9;
  overflow: hidden;
}
#pane-order-review .or-review-col {
  flex: 1 1 auto;
  min-width: 320px;
  min-height: 0;
  display: flex;
  flex-direction: column;
  background: #ffffff;
  overflow: hidden;
}
#pane-order-review .or-review {
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 14px 16px 24px;
}
#pane-order-review .or-review-empty {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  color: #a8a29e;
  font-size: 14px;
}
#pane-order-review .or-preview {
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 16px 18px 24px;
}
#pane-order-review .or-preview-empty {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  color: #a8a29e;
  font-size: 14px;
}
#pane-order-review .or-preview-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 14px;
}
#pane-order-review .or-preview-title {
  font-size: 17px;
  font-weight: 650;
  color: #0f172a;
  line-height: 1.35;
}
#pane-order-review .or-preview-badge {
  display: inline-block;
  margin-left: 8px;
  padding: 1px 8px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 500;
  vertical-align: 2px;
  background: #eef2ff;
  color: #4338ca;
}
#pane-order-review .or-preview-badge.done {
  background: #ecfdf5;
  color: #047857;
}
#pane-order-review .or-preview-actions {
  display: flex;
  gap: 8px;
  flex-shrink: 0;
}
#pane-order-review .or-preview-meta {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px 18px;
  padding: 12px 14px;
  margin-bottom: 16px;
  background: #fff;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  font-size: 13px;
}
#pane-order-review .or-preview-meta .meta-item {
  display: flex;
  align-items: baseline;
  gap: 8px;
  min-width: 0;
}
#pane-order-review .or-preview-meta .meta-label {
  flex-shrink: 0;
  color: #78716c;
}
#pane-order-review .or-preview-meta .meta-value {
  color: #1e293b;
  font-weight: 500;
  word-break: break-all;
}
#pane-order-review .or-preview-sec {
  font-size: 13px;
  font-weight: 600;
  color: #44403c;
  margin: 16px 0 8px;
}
/* 明细表对齐合同管理页（hub-ct-lines-table）样式 */
:is(#pane-order-review, #or-detail-modal) .or-ct-table-wrap {
  background: #fff;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  overflow: auto;
  max-height: 480px;
}
/* orcst5→orcst10（2026-10-07 订单评审左列表最终形态）：四列固定像素
   （行号50/客户代码100/客户名称180/审核阶段100，colgroup 输出、col 不再弹性），
   表格回全局 max-content（=430px 精确），左栏收窄到表格宽实现「红框左右侧贴合」
   （flex:0 0 auto + width:max-content），中/右栏允许收缩避免窄屏横向溢出；
   td/th 全局 nowrap+ellipsis 超长省略号截断，容器禁横向滚动兜底，列宽不可拖拽 */
#pane-order-review .or-list-col {
  flex: 0 0 auto;
  width: max-content;
  min-width: 280px;
}
/* orcol1（2026-10-09 用户「删除 客户名称列，客户代码、审核阶段 列宽自适应宽度」）：
   左列表 table-layout:auto + th/td nowrap（覆盖全局 .data-table 的 fixed+ellipsis），
   列宽=内容宽（表头不再竖排断行），colgroup 已不输出固定像素 */
#pane-order-review #order-review-table {
  table-layout: auto;
  width: max-content;
  min-width: 100%;
}
#pane-order-review #order-review-table th,
#pane-order-review #order-review-table td {
  white-space: nowrap;
  max-width: none;
  text-overflow: clip;
}
#pane-order-review .or-preview-col {
  flex: 1 1 var(--or-mid-width, 34%);
  min-width: 260px;
}
#pane-order-review .or-review-col {
  min-width: 270px;
}
#pane-order-review .table-wrap {
  overflow-x: hidden;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-table {
  width: max-content;
  min-width: 100%;
  border-collapse: collapse;
  table-layout: fixed;
  font-size: 12px;
  background: #fff;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-table th,
:is(#pane-order-review, #or-detail-modal) .or-ct-table td {
  border-bottom: 1px solid #e8efee;
  border-right: 1px solid #e8efee;
  padding: 6px 8px;
  text-align: center;
  vertical-align: middle;
  overflow: visible;
  max-width: none;
  color: #1e293b;
  font-weight: 400;
  white-space: normal;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-table th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: #f3f4f6;
  color: #374151;
  white-space: nowrap;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-table .pl-line-row td {
  min-height: 160px;
  height: auto;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-table td.pl-desc-cell,
:is(#pane-order-review, #or-detail-modal) .or-ct-table td.pl-pack-cell {
  vertical-align: top;
  text-align: left;
  white-space: pre-wrap;
  word-break: break-word;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-table td.pl-img-cell {
  width: 140px;
  vertical-align: middle;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-img img {
  display: block;
  max-width: 120px;
  max-height: 120px;
  margin: 0 auto;
  object-fit: contain;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-img {
  position: relative;
  display: inline-block;
  vertical-align: middle;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-img .or-img-ops {
  position: absolute;
  left: 50%;
  bottom: 2px;
  transform: translateX(-50%);
  display: none;
  gap: 4px;
  white-space: nowrap;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-img.editable:hover .or-img-ops {
  display: flex;
}
:is(#pane-order-review, #or-detail-modal) .or-img-ops button {
  border: none;
  border-radius: 0;
  padding: 2px 6px;
  font-size: 11px;
  line-height: 1.4;
  color: #fff;
  background: rgba(13, 148, 136, 0.9);
  cursor: pointer;
}
:is(#pane-order-review, #or-detail-modal) .or-img-ops button.or-img-clear {
  background: rgba(220, 38, 38, 0.88);
}
:is(#pane-order-review, #or-detail-modal) .or-img-drop {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 120px;
  height: 120px;
  margin: 0 auto;
  border: 1px dashed #94a3b8;
  border-radius: 0;
  color: #64748b;
  font-size: 12px;
  cursor: pointer;
  background: #f8fafc;
  box-sizing: border-box;
}
:is(#pane-order-review, #or-detail-modal) .or-img-drop:hover {
  border-color: #0d9488;
  color: #0d9488;
  background: #f0fdfa;
}
:is(#pane-order-review, #or-detail-modal) .or-ct-table td.hc-line-amt {
  white-space: nowrap;
}
:is(#pane-order-review, #or-detail-modal) .or-preview-total {
  margin-top: 10px;
  text-align: right;
  font-size: 13px;
  color: #334155;
}
:is(#pane-order-review, #or-detail-modal) .or-preview-total b {
  color: #dc2626;
  font-weight: 700;
}
#pane-order-review .or-converted-tag {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 12px;
  color: #047857;
  background: #ecfdf5;
  border: 1px solid #a7f3d0;
  vertical-align: middle;
}

/* ---------- 订单评审表（右栏） ---------- */
#pane-order-review .or-review-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 12px;
}
#pane-order-review .or-review-title {
  font-size: 16px;
  font-weight: 650;
  color: #0f172a;
}
#pane-order-review .or-review-sub {
  display: flex;
  align-items: center;
  font-size: 12px;
  color: #64748b;
  margin-bottom: 10px;
}
/* orsub1（2026-10-09）：订单编号靠右；标题行已删（.or-review-head/.or-review-title 不再使用） */
#pane-order-review .or-review-sub .or-sub-order-no {
  margin-left: auto;
  color: #64748b;
}
#pane-order-review .or-rv-save {
  border: none;
  border-radius: 0;
  padding: 6px 16px;
  font-size: 13px;
  color: #fff;
  background: #0d9488;
  cursor: pointer;
}
#pane-order-review .or-rv-save:hover { background: #0f766e; }
#pane-order-review .or-rv-save:disabled { opacity: 0.5; cursor: not-allowed; }

/* 表头信息网格 */
#pane-order-review .or-rv-meta {
  display: grid;
  /* orgrid1（2026-10-09 用户「当前是3组；现在要求改为2组」）：字段区每行 3 组 → 2 组 */
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 6px 10px;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  padding: 10px 12px;
  margin-bottom: 12px;
  background: #f8fafc;
}
#pane-order-review .or-rv-meta .rv-item {
  display: flex;
  align-items: center;
  gap: 6px;
  min-width: 0;
}
#pane-order-review .or-rv-meta .rv-label {
  flex: 0 0 auto;
  font-size: 12px;
  color: #64748b;
}
#pane-order-review .or-rv-meta .rv-label::after { content: "："; }
#pane-order-review .or-rv-meta .rv-val {
  flex: 1 1 auto;
  min-width: 0;
  font-size: 13px;
  font-weight: 550;
  color: #1e293b;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
#pane-order-review .or-rv-meta input.rv-val {
  border: 1px solid #e7e5e4;
  border-radius: 0;
  padding: 2px 6px;
  font-weight: 400;
  background: #fff;
}
#pane-order-review .or-rv-meta input.rv-val:focus {
  outline: none;
  border-color: #0d9488;
}

/* 评审矩阵（分部门卡片） */
#pane-order-review .or-rv-sections {
  margin-bottom: 12px;
}
#pane-order-review .or-rv-sections-title {
  font-size: 13px;
  font-weight: 600;
  color: #334155;
  margin: 14px 0 6px;
}
#pane-order-review .or-rv-dept-card {
  background: #fff;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  margin-bottom: 10px;
  overflow: hidden;
}
#pane-order-review .or-rv-dept-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 8px 12px;
  background: #f0fdfa;
  border-bottom: 1px solid #e7e5e4;
}
#pane-order-review .or-rv-dept-name {
  font-weight: 650;
  font-size: 13px;
  color: #0f766e;
  white-space: nowrap;
}
#pane-order-review .or-rv-dept-signs {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: #334155;
  white-space: nowrap;
}
#pane-order-review .or-rv-dept-signs .rv-concl,
#pane-order-review .or-rv-dept-signs .rv-sign {
  width: 74px;
  min-width: 60px;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  padding: 3px 6px;
  font-size: 12px;
  box-sizing: border-box;
}
#pane-order-review .or-rv-dept-signs input:focus {
  outline: none;
  border-color: #0d9488;
}
#pane-order-review .or-rv-dept-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
#pane-order-review .or-rv-dept-table th,
#pane-order-review .or-rv-dept-table td {
  border: 1px solid #d6d3d1;
  padding: 6px 8px;
  text-align: left;
  vertical-align: middle;
  color: #1e293b;
  font-weight: 400;
}
#pane-order-review .or-rv-dept-table th {
  background: #f3f4f6;
  color: #374151;
  text-align: center;
  white-space: nowrap;
  font-weight: 600;
}
#pane-order-review .or-rv-dept-table td.rv-item-name {
  width: 96px;
  min-width: 88px;
  max-width: 120px;
  background: #fafaf9;
  white-space: normal;
  word-break: break-all;
  line-height: 1.5;
  vertical-align: middle;
  text-align: center;
}
#pane-order-review .or-rv-dept-table td.rv-record {
  width: 280px;
  min-width: 220px;
}
#pane-order-review .or-rv-dept-table .rv-record-cell {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
#pane-order-review .or-rv-dept-table .rv-record textarea {
  width: 100%;
  min-height: 42px;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  padding: 4px 6px;
  font-family: inherit;
  font-size: 12px;
  resize: vertical;
  box-sizing: border-box;
  background: #fff;
}
#pane-order-review .or-rv-dept-table .rv-record textarea:focus {
  outline: none;
  border-color: #0d9488;
}
#pane-order-review .or-rv-dept-table .rv-record .rv-tip {
  display: block;
  margin-top: 4px;
  font-size: 11px;
  color: #94a3b8;
  white-space: pre-wrap;
}
/* 可勾选选项 */
#pane-order-review .or-rv-dept-table .rv-record-combo {
  display: flex;
  flex-direction: column;
  gap: 5px;
}
#pane-order-review .or-rv-dept-table .rv-check-row {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
#pane-order-review .or-rv-dept-table .rv-check-prefix {
  font-size: 12px;
  color: #475569;
  white-space: pre-wrap;
}
/* 填空（（  ）→ 输入框） */
#pane-order-review .or-rv-dept-table .rv-fill-line {
  font-size: 12px;
  color: #475569;
  white-space: pre-wrap;
  line-height: 1.8;
}
#pane-order-review .or-rv-dept-table .rv-fill-wrap {
  display: inline-flex;
  align-items: center;
  gap: 3px;
}
#pane-order-review .or-rv-dept-table .rv-fill {
  display: inline-block;
  width: 100px;
  max-width: 140px;
  border: 1px solid #e7e5e4;
  border-bottom: 1px dashed #0d9488;
  border-radius: 0;
  padding: 2px 6px;
  font-size: 12px;
  font-family: inherit;
  color: #1e293b;
  background: #fff;
  box-sizing: border-box;
}
#pane-order-review .or-rv-dept-table .rv-fill:focus {
  outline: none;
  border-color: #0d9488;
}
#pane-order-review .or-rv-dept-table .rv-fill-pick {
  border: 1px solid #e7e5e4;
  border-radius: 0;
  background: #fff;
  color: #0d9488;
  font-size: 12px;
  line-height: 1;
  padding: 3px 4px;
  cursor: pointer;
}
#pane-order-review .or-rv-dept-table .rv-fill-pick:hover {
  background: #f0fdfa;
  border-color: #0d9488;
}
#pane-order-review .or-rv-dept-table .rv-fill-static {
  color: #1e293b;
}
#pane-order-review .or-rv-dept-table .rv-checks {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
#pane-order-review .or-rv-dept-table .rv-check {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  padding: 3px 8px;
  font-size: 12px;
  color: #1e293b;
  background: #fafaf9;
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
}
#pane-order-review .or-rv-dept-table .rv-check:hover {
  border-color: #0d9488;
}
/* rvtag1（2026-10-07 用户「能不能不要打勾，改其他方式」）：去掉 ☐/☑ 勾选符号，
   改「标签高亮」——未选中=浅底描边，选中=实心填充+白字（选中态一眼可辨） */
#pane-order-review .or-rv-dept-table .rv-check.checked {
  background: #0d9488;
  border-color: #0d9488;
  color: #fff;
  font-weight: 600;
}
#pane-order-review .or-rv-dept-table .rv-check.checked:hover {
  background: #0f766e;
  border-color: #0f766e;
}
#pane-order-review .or-rv-dept-table .rv-check.readonly {
  cursor: default;
}

/* 只读样式 */
#pane-order-review .or-rv-dept-table.readonly textarea {
  border-color: transparent;
  background: transparent;
  resize: none;
}
#pane-order-review .or-rv-dept-head .rv-concl.readonly,
#pane-order-review .or-rv-dept-head .rv-sign.readonly {
  border-color: transparent;
  background: transparent;
}

/* 评审明细表 */


.search-bar {
  display: flex;
  gap: 8px;
  margin-bottom: 10px;
}
.search-bar input { flex: 1; }

.status-line {
  font-size: 12px;
  color: var(--muted);
  margin: 0 0 10px;
}

/* 系统设置页：状态行醒目（成功绿底 / 失败红底） */
.settings-body .status-line.ok-msg {
  background: #ecfdf5;
  border: 1px solid #a7f3d0;
  border-radius: 0;
  padding: 6px 10px;
  font-size: 13px !important;
}
.settings-body .status-line:not(.ok-msg):not([hidden]) {
  background: #fef2f2;
  border: 1px solid #fecaca;
  border-radius: 0;
  padding: 6px 10px;
  font-size: 13px !important;
  color: #b91c1c;
}

/* 保存/测试按钮结果反馈 */
.tb-btn.save-ok {
  color: #047857 !important;
  border-color: #a7f3d0 !important;
  background: #ecfdf5 !important;
}
.tb-btn.save-err {
  color: #b91c1c !important;
  border-color: #fecaca !important;
  background: #fef2f2 !important;
}

.card-list { display: flex; flex-direction: column; gap: 10px; }

.table-wrap {
  position: relative;
  width: 100%;
  overflow: auto;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 0;
  max-height: 100%;
}

.data-table {
  width: max-content;
  /* 有操作列时由 syncTableWidth 写像素宽；勿用 100% 把末列撑出空白表头 */
  min-width: 0;
  border-collapse: separate;
  border-spacing: 0;
  table-layout: fixed;
  font-size: 12px;
}
.data-table.has-ops-pin {
  min-width: 0;
}
/* 有操作列：表宽由 syncTableWidth 按像素合计（+ col-fill 差额），禁止 CSS 强制 width:100% */
/* 占位列（操作列左侧）：表短于容器时吃差额，宽表时为 0 */
.data-table col.col-fill {
  min-width: 0;
}
.data-table th.col-fill,
.data-table td.col-fill {
  padding: 0 !important;
  border-left: none !important;
  border-right: none !important;
  pointer-events: none;
  max-width: none !important;
  overflow: hidden;
  line-height: 0;
  font-size: 0;
  color: transparent;
}
.data-table th.col-fill {
  background: #0d9488;
}
.data-table tbody tr:nth-child(even) td.col-fill { background: #f8fffe; }
.data-table tbody tr:hover td.col-fill { background: #e6f4f2; }
.data-table tbody tr.selected td.col-fill { background: #99f6e4 !important; }
.data-table.resizable th {
  position: sticky;
  top: 0;
  /* 手柄在 th 内 absolute，须 visible 才能点到（GAK-WEB-COL-W-001） */
  overflow: visible;
}
.data-table col.col-hidden {
  visibility: collapse;
  width: 0 !important;
  max-width: 0 !important;
  display: none !important;
}
.col-resizer {
  position: absolute;
  top: 0;
  right: 0; /* 必须在本列内，否则会被右侧 th 盖住点不到 */
  width: 10px;
  height: 100%;
  cursor: col-resize;
  z-index: 5;
  user-select: none;
  touch-action: none;
}
.col-resizer::after {
  content: "";
  position: absolute;
  top: 20%;
  bottom: 20%;
  right: 3px;
  width: 2px;
  border-radius: 0;
  background: transparent;
}
.col-resizer:hover::after,
body.col-resizing .col-resizer:hover::after {
  background: rgba(255, 255, 255, 0.85);
}
body.col-resizing {
  cursor: col-resize !important;
  user-select: none !important;
}
body.col-resizing * {
  cursor: col-resize !important;
}
.data-table th,
.data-table td {
  padding: 5px 8px;
  border-right: 1px solid #e8efee;
  border-bottom: 1px solid #e8efee;
  text-align: center;
  white-space: nowrap;
  vertical-align: middle;
  font-size: 12px;
  font-weight: 400;
  font-family: "Microsoft YaHei";
  color: var(--text);
  line-height: 1.4;
  overflow: hidden;
  text-overflow: ellipsis;
  /* fixed 布局下强制单元格遵守列宽，避免文字画到邻列 */
  max-width: 0;
}
.data-table th {
  /* 表头全局统一浅灰（2026-10-02 用户：全局改，同订单列表/BOM 明细定版） */
  background: #f3f4f6;
  color: #374151;
  font-weight: 600;
  position: sticky;
  top: 0;
  z-index: 2;
  /* 表头允许换行（2026-09-29）：窄列时长表头自动折行显示，不再省略号截断；
     CJK 可任意断字，拉丁词整体下移；单元格仍受 fixed 布局列宽约束 */
  white-space: normal;
  overflow-wrap: break-word;
  word-break: break-word;
  overflow: hidden;
  text-overflow: clip;
}
.data-table tbody tr { cursor: pointer; }
.data-table tbody tr:nth-child(even) { background: #f8fffe; }
.data-table tbody tr:hover { background: #e6f4f2; }
.data-table tbody tr.selected { background: #99f6e4 !important; }
.data-table col.col-idx,
.data-table th.col-idx,
.data-table td.col-idx {
  width: 50px !important;
  min-width: 50px !important;
  max-width: 50px !important;
  padding-left: 4px !important;
  padding-right: 4px !important;
  box-sizing: border-box !important;
  color: var(--muted);
  font-variant-numeric: tabular-nums;
  background: #f0fdfa;
  text-align: center;
  overflow: hidden;
  text-overflow: clip;
}
.data-table th.col-idx { background: #f3f4f6; color: #374151; }
/* 左侧冻结列（行号 + 显/隐「冻结」连续前缀；对标国桉康） */
.data-table th.mf-sticky-left,
.data-table td.mf-sticky-left {
  position: sticky;
  z-index: 3;
}
.data-table th.mf-sticky-left {
  z-index: 4;
  background: #f3f4f6;
  color: #374151;
}
.data-table th.mf-sticky-left.col-idx,
.data-table th.mf-sticky-left.col-sel {
  background: #f3f4f6;
}
.data-table td.mf-sticky-left {
  background: #fff;
}
.data-table td.mf-sticky-left.col-idx,
.data-table td.mf-sticky-left.col-sel {
  background: #f0fdfa;
}
.data-table tbody tr:nth-child(even) td.mf-sticky-left {
  background: #f8fffe;
}
.data-table tbody tr:nth-child(even) td.mf-sticky-left.col-idx,
.data-table tbody tr:nth-child(even) td.mf-sticky-left.col-sel {
  background: #f0fdfa;
}
.data-table tbody tr:hover td.mf-sticky-left {
  background: #e6f4f2;
}
.data-table tbody tr:hover td.mf-sticky-left.col-idx,
.data-table tbody tr:hover td.mf-sticky-left.col-sel {
  background: #ccfbf1;
}
.data-table tbody tr.selected td.mf-sticky-left {
  background: #99f6e4 !important;
}
/* 冻结边界阴影已移除（2026-10-02 用户指示 qbinline17）：冻结列靠背景色区分边界 */
.data-table td.mf-sticky-left-last,
.data-table th.mf-sticky-left-last {
  box-shadow: none;
}
#mes-schedule-table col.col-idx,
#mes-schedule-table th.col-idx,
#mes-schedule-table td.col-idx {
  width: 88px !important;
  min-width: 88px !important;
  max-width: 88px !important;
  padding-left: 6px !important;
  padding-right: 6px !important;
}
.data-table .col-muted { color: var(--muted); }
.data-table th.col-hidden,
.data-table td.col-hidden,
.data-table .col-hidden { display: none !important; }
/* 用户管理：按地区分隔行 */
.data-table tr.user-region-sep td {
  background: linear-gradient(180deg, #e6f4f2 0%, #d8efec 100%);
  color: #0f766e;
  font-weight: 600;
  font-size: 13px;
  padding: 8px 12px;
  border-top: 2px solid #99f6e4;
  border-bottom: 1px solid #b6e2dc;
  text-align: left;
  white-space: nowrap;
}
.data-table tr.user-region-sep .user-region-sep-label {
  margin-right: 10px;
}
.data-table tr.user-region-sep .user-region-sep-count {
  font-weight: 400;
  color: #64748b;
  font-size: 12px;
}
.data-table th.hf-th,
.data-table th.col-reorderable {
  cursor: grab;
  user-select: none;
  /* 触屏（手机/平板）拖拽列必须：否则浏览器把拖动当页面滚动 */
  touch-action: none;
}
.data-table th.hf-th:hover,
.data-table th.col-reorderable:hover {
  filter: brightness(1.06);
}
.data-table th.col-dragging {
  opacity: 0.45;
}
.data-table th.col-drop-before {
  box-shadow: inset 3px 0 0 #fbbf24;
}
.data-table th.col-drop-after {
  box-shadow: inset -3px 0 0 #fbbf24;
}
body.col-reordering,
body.col-reordering * {
  cursor: grabbing !important;
  user-select: none !important;
}
.data-table th.hf-active {
  background: #0f766e;
  color: #fff; /* 深绿高亮底必须配白字（2026-10-02 表头全局改灰后补） */
  box-shadow: inset 0 -3px 0 #fbbf24;
}
.data-table td.empty-row {
  text-align: center;
  color: var(--muted);
  padding: 24px 12px;
  white-space: normal;
}

/* 表头筛选下拉
   必须高于 .modal(2500) / Hub 子弹窗(~2800) / 产品选择(3000)，
   否则 CRM Hub 内点 ▾ 会「没反应」（面板在弹窗背后） */
.hf-dropdown {
  position: fixed;
  z-index: 11000;
  background: #fff;
  border: 1px solid var(--border);
  border-radius: 0;
  box-shadow: 0 12px 32px rgba(15, 23, 42, 0.18);
  display: flex;
  flex-direction: column;
  max-height: min(420px, calc(100vh - 24px));
  overflow: hidden;
}
.hf-accent {
  height: 2px;
  background: var(--primary);
  flex-shrink: 0;
}
.hf-head {
  padding: 10px 14px 6px;
}
.hf-title {
  font-size: 12px;
  font-weight: 700;
  color: #1a1a2e;
}
.hf-search-wrap {
  padding: 0 14px 8px;
}
.hf-search {
  width: 100%;
  border: 1px solid #ddd;
  border-radius: 0;
  padding: 6px 10px;
  font-size: 12px;
}
.hf-list {
  flex: 1;
  overflow: auto;
  padding: 4px 8px 8px;
  border-top: 1px solid #f0f0f0;
  min-height: 80px;
}
.hf-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 8px;
  border-radius: 0;
  cursor: pointer;
  font-size: 12px;
  color: var(--text);
}
.hf-item:hover { background: #f0fdfa; }
.hf-item.hf-all {
  font-weight: 600;
  border-bottom: 1px solid #f0f0f0;
  margin-bottom: 4px;
  border-radius: 0;
}
.hf-item input { flex-shrink: 0; }
.hf-item span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.hf-foot {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
  padding: 8px 14px 10px;
  border-top: 1px solid #f0f0f0;
  background: #fafafa;
}
.hf-btn {
  border: none;
  background: transparent;
  color: #666;
  padding: 4px 8px;
  border-radius: 0;
  cursor: pointer;
  font-size: 12px;
}
.hf-btn:hover { background: #f0f0f0; }
.hf-btn.danger { color: var(--danger); }
.hf-btn.danger:hover { background: #fef2f2; }

.badge {
  display: inline-block;
  font-size: 12px;
  padding: 2px 8px;
  border-radius: 999px;
  background: #ccfbf1;
  color: var(--primary-dark);
  white-space: nowrap;
}

.modal {
  position: fixed;
  inset: 0;
  background: rgba(15, 23, 42, 0.35);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 2500;
  padding: 16px;
}
.modal[hidden] { display: none !important; }
.modal-card {
  width: min(420px, 100%);
  background: #fff;
  border-radius: 0;
  border: 1px solid var(--border);
  box-shadow: 0 16px 40px rgba(0,0,0,.18);
  max-height: 90vh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.modal.modal-md .modal-card {
  width: min(720px, 100%);
}
.modal.modal-lg .modal-card {
  width: min(1100px, 100%);
}
/* 大弹窗中间区用 flex 吃剩余高度 + 内部滚动；禁止再写死 max-height，
   否则固定窗高时底栏下方会留白（看起来像底栏特别高） */

/* ---------- 发送邮件弹窗（宽屏 · 专业撰写） ---------- */
#view-mail.modal-mail {
  padding: 20px;
  background: rgba(28, 25, 23, 0.42);
}
#view-mail .mail-compose-card {
  width: min(1600px, 100%) !important;
  height: min(900px, 94vh) !important;
  max-height: min(900px, 94vh) !important;
  border-radius: 0;
  border: 1px solid #e7e5e4;
  box-shadow: 0 20px 48px rgba(28, 25, 23, 0.22);
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
#view-mail .mail-compose-head {
  padding: 14px 20px;
  border-bottom: 1px solid #e7e5e4;
  background: #fafaf9;
  min-height: 56px;
}
#view-mail .mail-compose-head-main {
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
#view-mail .mail-compose-kicker {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.06em;
  color: var(--primary-dark);
  text-transform: uppercase;
}
#view-mail .mail-compose-head .modal-title {
  font-size: 16px;
  font-weight: 700;
  color: #1c1917;
  line-height: 1.35;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: min(780px, 78vw);
}
#view-mail .mail-compose-close {
  flex-shrink: 0;
  width: 32px;
  height: 32px;
  border-radius: 0;
  color: #78716c;
}
#view-mail .mail-compose-body {
  flex: 1;
  min-height: 0;
  padding: 16px 20px 12px;
  overflow: auto;
  background: #fff;
  display: flex;
  flex-direction: column;
}
#view-mail .mail-compose-error {
  margin: 0 0 12px;
}
#view-mail .mail-send-result {
  margin: 0 0 12px;
  padding: 12px 14px;
  border-radius: 0;
  font-size: 14px;
  font-weight: 700;
  line-height: 1.5;
  border: 1px solid transparent;
}
#view-mail .mail-send-result[hidden] {
  display: none !important;
}
#view-mail .mail-send-result.is-fail {
  background: #fef2f2;
  border-color: #fecaca;
  color: #b91c1c;
}
#view-mail .mail-send-result.is-ok {
  background: #ecfdf5;
  border-color: #a7f3d0;
  color: #047857;
}
#view-mail .mail-send-result.is-pending {
  background: #fffbeb;
  border-color: #fde68a;
  color: #b45309;
}
#view-mail .mail-send-result .mail-send-result-sub {
  display: block;
  margin-top: 4px;
  font-size: 12px;
  font-weight: 500;
  opacity: 0.92;
}
#view-mail .mail-compose-banner {
  margin: 0 0 14px;
  padding: 10px 12px;
  border-radius: 0;
  font-size: 12px;
  line-height: 1.45;
  border: 1px solid transparent;
}
#view-mail .mail-compose-banner[hidden] {
  display: none !important;
}
#view-mail .mail-compose-banner.is-warn {
  background: #fff7ed;
  border-color: #fed7aa;
  color: #9a3412;
}
#view-mail .mail-compose-banner.is-ok {
  background: #f0fdf4;
  border-color: #bbf7d0;
  color: #166534;
}
#view-mail .mail-compose-fields {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  overflow: hidden;
  background: #fff;
}
#view-mail .mail-compose-row {
  display: grid;
  grid-template-columns: 72px 1fr;
  align-items: center;
  gap: 0 12px;
  min-height: 44px;
  padding: 0 14px;
  border-bottom: 1px solid #f1f0ef;
}
#view-mail .mail-compose-lab {
  font-size: 12px;
  font-weight: 600;
  color: #57534e;
  margin: 0;
}
#view-mail .mail-compose-input {
  width: 100%;
  border: none !important;
  outline: none;
  box-shadow: none !important;
  background: transparent;
  padding: 10px 0;
  font-size: 13px;
  font-family: "Microsoft YaHei", sans-serif;
  color: #1c1917;
  line-height: 1.4;
}
#view-mail .mail-compose-input::placeholder {
  color: #a8a29e;
}
#view-mail .mail-compose-editor {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 280px;
  background: #fff;
}
#view-mail .mail-compose-editor-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 8px 14px 0;
  font-size: 12px;
  font-weight: 600;
  color: #57534e;
}
#view-mail .mail-compose-attach-tools {
  display: flex;
  align-items: center;
  gap: 6px;
}
#view-mail .mail-attach-btn {
  height: 28px;
  padding: 0 10px;
  font-size: 12px;
  font-weight: 500;
  border: 1px solid #d6d3d1;
  background: #fff;
  color: #44403c;
  border-radius: 0;
  cursor: pointer;
}
#view-mail .mail-attach-btn:hover {
  border-color: var(--primary);
  color: var(--primary);
}
#view-mail .mail-compose-textarea {
  width: 100%;
  flex: 1;
  min-height: 220px;
  border: none !important;
  outline: none;
  box-shadow: none !important;
  resize: vertical;
  padding: 10px 14px 14px;
  font-size: 13px;
  line-height: 1.65;
  font-family: "Microsoft YaHei", sans-serif;
  color: #1c1917;
  background: #fff;
}
#view-mail .mail-compose-textarea::placeholder {
  color: #a8a29e;
}
/* —— 富文本正文（内嵌图片 / 表格） —— */
#view-mail .mail-compose-tools {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px;
  margin-right: auto;
}
#view-mail .mail-fmt-btn {
  min-width: 30px;
  height: 28px;
  padding: 0 8px;
  font-size: 13px;
  line-height: 1;
  border: 1px solid #d6d3d1;
  background: #fff;
  color: #44403c;
  border-radius: 4px;
  cursor: pointer;
}
#view-mail .mail-fmt-btn:hover {
  border-color: var(--primary);
  color: var(--primary);
}

/* 富文本工具栏：字体/字号/段落下拉 */
#view-mail .mail-fmt-sel {
  height: 28px;
  padding: 0 6px;
  font-size: 12px;
  line-height: 1;
  border: 1px solid #d6d3d1;
  background: #fff;
  color: #44403c;
  border-radius: 4px;
  cursor: pointer;
}
#view-mail .mail-fmt-sel:focus {
  outline: none;
  border-color: var(--primary);
}

/* 工具栏分组竖线分隔 */
#view-mail .mail-fmt-sep {
  width: 1px;
  align-self: stretch;
  margin: 2px 4px;
  background: #e7e5e4;
}

/* 字体色 / 背景色按钮（A + 底部色条） */
#view-mail .mail-fmt-color {
  position: relative;
  padding-bottom: 5px;
}
#view-mail .mail-fmt-color .mf-a {
  font-weight: 700;
  font-style: italic;
}
#view-mail .mail-fmt-color .mf-bar {
  position: absolute;
  left: 4px;
  right: 4px;
  bottom: 3px;
  height: 3px;
  border-radius: 2px;
}

/* 表情弹出层：向左展开，避免被 card 右缘 overflow 裁切 */
#view-mail .mail-fmt-anchor {
  position: relative;
}
#view-mail .mail-fmt-pop {
  display: none;
  position: absolute;
  top: calc(100% + 6px);
  right: 0;
  z-index: 60;
  grid-template-columns: repeat(7, 30px);
  gap: 2px;
  padding: 6px;
  background: #fff;
  border: 1px solid #d6d3d1;
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.14);
}
#view-mail .mail-fmt-pop:not([hidden]) {
  display: grid;
}
#view-mail .mail-fmt-pop button {
  width: 30px;
  height: 30px;
  border: none;
  background: transparent;
  border-radius: 6px;
  font-size: 18px;
  line-height: 1;
  cursor: pointer;
}
#view-mail .mail-fmt-pop button:hover {
  background: #f4f5f7;
}
#view-mail .mail-editor-wrap {
  position: relative;
}
#view-mail .mail-rich-editor {
  width: 100%;
  min-height: 240px;
  max-height: 60vh;
  overflow-y: auto;
  border: none;
  outline: none;
  box-shadow: none;
  padding: 10px 14px 14px;
  font-size: 13px;
  line-height: 1.65;
  font-family: "Microsoft YaHei", sans-serif;
  color: #1c1917;
  background: #fff;
}
#view-mail .mail-rich-editor:empty:before {
  content: attr(data-placeholder);
  color: #a8a29e;
  pointer-events: none;
}
#view-mail .mail-rich-editor img {
  max-width: 100%;
  height: auto;
  border: 0;
  vertical-align: baseline;
}
#view-mail .mail-rich-editor table {
  border-collapse: collapse;
  width: 100%;
  max-width: 100%;
  margin: 6px 0;
}
#view-mail .mail-rich-editor table td,
#view-mail .mail-rich-editor table th {
  border: 1px solid #c9d2dc;
  padding: 4px 8px;
  min-width: 64px;
}
/* 富文本编辑器内容：全局重置（#app *{font-*:12px !important} 等）会逐个元素用 !important 强制字体，
   导致嵌套 span 的继承字体/字重被自身元素上的重置覆盖，JS 注入的内联 !important 也无法在“未直接设置该属性”的子 span 上生效。
   这里用更高优先级把内容改回继承，由 JS 注入的内联样式继续决定实际渲染；元素自身带有内联 !important 的属性仍优先胜出。 */
#view-mail .mail-rich-editor,
#view-mail .mail-rich-editor * {
  font-family: inherit !important;
  font-weight: inherit !important;
  font-size: inherit !important;
  line-height: inherit !important;
}
#view-mail .mail-rich-editor {
  font-size: 13px !important;
  line-height: 1.65 !important;
  font-family: "Microsoft YaHei", sans-serif !important;
  font-weight: 400 !important;
}
/* 段落格式：覆盖全局重置对 h1/h2/h3 的 12px 压制（置于继承规则之后以保证优先级胜出） */
#view-mail .mail-rich-editor h1 {
  font-size: 22px !important;
  font-weight: 700 !important;
  line-height: 1.4 !important;
}
#view-mail .mail-rich-editor h2 {
  font-size: 18px !important;
  font-weight: 700 !important;
  line-height: 1.4 !important;
}
#view-mail .mail-rich-editor h3 {
  font-size: 15px !important;
  font-weight: 700 !important;
  line-height: 1.4 !important;
}
#view-mail .mail-rich-editor code,
#view-mail .mail-rich-editor pre {
  font-family: Consolas, "Courier New", monospace !important;
}
#view-mail .mail-editor-drop-hint {
  position: absolute;
  inset: 0;
  display: none;
  align-items: center;
  justify-content: center;
  font-size: 15px;
  color: var(--primary);
  background: rgba(22, 74, 142, 0.06);
  border: 2px dashed var(--primary);
  border-radius: 6px;
  pointer-events: none;
}
#view-mail .mail-editor-drop-hint.is-active {
  display: flex;
}
#view-mail .mail-attach-list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding: 4px 14px 8px;
  background: #fff;
}
#view-mail .mail-attach-list[hidden] {
  display: none !important;
}
#view-mail .mail-attach-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  max-width: 100%;
  padding: 4px 8px;
  border: 1px solid #e7e5e4;
  border-radius: 999px;
  background: #fafaf9;
  font-size: 12px;
  font-weight: 400;
  color: #44403c;
}
#view-mail .mail-attach-chip.is-image {
  border-color: #fed7aa;
  background: #fff7ed;
}
#view-mail .mail-attach-chip-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 180px;
}
#view-mail .mail-attach-chip-size {
  color: #a8a29e;
  flex-shrink: 0;
}
#view-mail .mail-attach-chip-rm {
  border: none;
  background: transparent;
  color: #a8a29e;
  cursor: pointer;
  padding: 0 2px;
  line-height: 1;
  font-size: 14px;
}
#view-mail .mail-attach-chip-rm:hover {
  color: #dc2626;
}
#view-mail .mail-attach-hint {
  padding: 0 14px 10px;
  font-size: 11px;
  font-weight: 400;
  color: #a8a29e;
}
#view-mail .mail-compose-opts {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 14px;
}
#view-mail .mail-compose-opt {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0;
  padding: 0;
  font-size: 12px;
  color: #57534e;
  cursor: pointer;
  user-select: none;
}
#view-mail .mail-compose-opt[hidden] {
  display: none !important;
}
#view-mail .mail-compose-opt input {
  width: 15px;
  height: 15px;
  accent-color: var(--primary);
}
#view-mail .mail-quota-hint {
  margin: 8px 0 0;
  font-size: 12px;
  line-height: 1.45;
  color: #0f766e;
  background: #ecfdf5;
  border: 1px solid #a7f3d0;
  border-radius: 0;
  padding: 8px 10px;
}
#view-mail .mail-quota-hint.is-warn {
  color: #9a3412;
  background: #fff7ed;
  border-color: #fed7aa;
}
#view-mail .mail-bulk-preview {
  margin-top: 10px;
}
#view-mail .mail-bulk-toggle {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  margin: 0;
  padding: 7px 10px;
  font-size: 12px;
  color: #0f766e;
  background: #ecfdf5;
  border: 1px solid #a7f3d0;
  border-radius: 0;
  cursor: pointer;
  user-select: none;
}
#view-mail .mail-bulk-toggle:hover {
  background: #d1fae5;
}
#view-mail .mail-bulk-toggle-arrow {
  font-size: 11px;
  transition: transform 0.15s ease;
}
#view-mail .mail-bulk-toggle.is-open .mail-bulk-toggle-arrow {
  transform: rotate(180deg);
}
#view-mail .mail-bulk-preview-list {
  max-height: 168px;
  overflow-y: auto;
  margin-top: 6px;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  padding: 4px 0;
}
#view-mail .mail-bulk-preview-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 5px 10px;
  font-size: 12px;
  color: #44403c;
  line-height: 1.4;
}
#view-mail .mail-bulk-preview-item:nth-child(odd) {
  background: #fafaf9;
}
#view-mail .mail-bulk-preview-item .mbp-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 58%;
}
#view-mail .mail-bulk-preview-item .mbp-mail {
  color: #78716c;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 42%;
}
.mail-policy-box {
  margin: 0 0 14px;
  padding: 12px 14px;
  border-radius: 0;
  background: #fff7ed;
  border: 1px solid #fdba74;
  color: #9a3412;
}
.mail-policy-title {
  font-weight: 700;
  font-size: 13px;
  margin-bottom: 6px;
}
.mail-policy-list {
  margin: 0;
  padding-left: 1.15em;
  font-size: 12px;
  line-height: 1.55;
  color: #7c2d12;
}
.mail-smtp-guide {
  margin: 0 0 12px;
  padding: 10px 12px;
  border-radius: 0;
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  color: #334155;
}
.mail-smtp-guide-title {
  font-weight: 700;
  font-size: 12px;
  margin-bottom: 6px;
  color: #0f172a;
}
.mail-smtp-guide-list {
  margin: 0;
  padding-left: 1.15em;
  font-size: 12px;
  line-height: 1.55;
}
.mail-smtp-guide-list li {
  margin: 2px 0;
}
.mail-smtp-guide-list code {
  font-size: 11px;
  background: #e2e8f0;
  padding: 1px 5px;
  border-radius: 0;
}
.mail-smtp-guide-note {
  margin: 8px 0 0;
  font-size: 11px;
  color: #64748b;
  line-height: 1.45;
}
/* 个人资料：标签左、输入右 */
#view-profile .profile-form-grid {
  margin-top: 4px;
}
#view-profile .profile-form-grid .field > span {
  flex: 0 0 5.5em;
  text-align: right;
}
#view-profile .profile-smtp-enable {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 8px 0 10px;
}
#view-profile .profile-smtp-enable > span {
  margin: 0;
  font-size: 13px;
  color: #334155;
}
#view-profile .profile-smtp-port-row > .profile-smtp-port-controls {
  display: flex;
  flex: 1;
  min-width: 0;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 14px;
}
#view-profile .profile-smtp-port-controls > input[type="number"] {
  width: 88px;
  flex: 0 0 auto;
  padding: 8px 10px;
  font-size: 12px;
  background: #f8fffe;
  color: #002FA7;
  border: 1px solid #d7e5e3;
  border-radius: 0;
}
#view-profile .profile-smtp-port-controls .field-check {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin: 0;
  padding: 0;
  white-space: nowrap;
}
@media (max-width: 720px) {
  #view-profile .profile-form-grid.form-grid-2 {
    grid-template-columns: 1fr;
  }
  #view-profile .profile-form-grid .field > span {
    flex: 0 0 4.8em;
  }
}

/* 收件箱 */
#view-mail-inbox.modal-mail-inbox {
  z-index: 1200;
}
#view-mail-inbox .mail-inbox-card {
  width: min(1600px, 100%);
  height: min(900px, 94vh);
  max-height: min(900px, 94vh);
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
}
#view-mail-inbox .mail-inbox-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  padding: 14px 16px 12px;
  border-bottom: 1px solid #e7e5e4;
}
#view-mail-inbox .mail-inbox-head-main {
  min-width: 0;
}
#view-mail-inbox .mail-inbox-meta {
  margin-top: 4px;
  font-size: 12px;
  color: #64748b;
}
#view-mail-inbox .mail-inbox-head-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
}
#view-mail-inbox .mail-inbox-tabs {
  display: flex;
  align-items: center;
  gap: 0;
  padding: 0 12px;
  border-bottom: 1px solid #e7e5e4;
  background: #fafaf9;
  overflow-x: auto;
}
#view-mail-inbox .mail-inbox-tab-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: 10px;
  flex-shrink: 0;
}
#view-mail-inbox .mail-inbox-tab {
  border: 0;
  background: transparent;
  padding: 10px 12px;
  font-size: 13px;
  color: #78716c;
  cursor: pointer;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  white-space: nowrap;
}
#view-mail-inbox .mail-inbox-tab.is-active {
  color: #002FA7;
  font-weight: 600;
  border-bottom-color: #002FA7;
}
#view-mail-inbox .mail-inbox-provider-hint {
  margin: 0;
  padding: 8px 14px;
  font-size: 12px;
  color: #9a3412;
  background: #fff7ed;
  border-bottom: 1px solid #fed7aa;
}
#view-mail-inbox .mail-inbox-provider-hint[hidden] {
  display: none !important;
}
#view-mail-inbox .mail-inbox-list-tools {
  padding: 10px 12px 8px;
  border-bottom: 1px solid #ece7e3;
  background: #fff;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
#view-mail-inbox #mail-inbox-q {
  width: 100%;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  padding: 8px 10px;
  font-size: 13px;
}
#view-mail-inbox .mail-inbox-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
#view-mail-inbox .mail-inbox-filter {
  border: 1px solid #e7e5e4;
  background: #fff;
  border-radius: 999px;
  padding: 4px 10px;
  font-size: 12px;
  color: #57534e;
  cursor: pointer;
}
#view-mail-inbox .mail-inbox-filter.is-active {
  border-color: #002FA7;
  color: #002FA7;
  background: #eef2ff;
  font-weight: 600;
}
#view-mail-inbox .mail-inbox-view-sep {
  width: 1px;
  height: 18px;
  background: #e7e5e4;
  margin: 0 2px;
  align-self: center;
}
#view-mail-inbox .mail-inbox-item.is-thread-head {
  background: #fafaf9;
}
#view-mail-inbox .mail-inbox-item.is-thread-child {
  padding-left: 28px;
  background: #fff;
}
#view-mail-inbox .mail-inbox-item.is-thread-child .mail-inbox-item-subj {
  font-size: 12px;
}
#view-mail-inbox .mail-inbox-thread-toggle {
  flex: 0 0 auto;
  width: 22px;
  height: 22px;
  margin-top: 2px;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: #78716c;
  font-size: 11px;
  line-height: 1;
  cursor: pointer;
  padding: 0;
}
#view-mail-inbox .mail-inbox-thread-toggle:hover {
  background: #e7e5e4;
  color: #1e293b;
}
#view-mail-inbox .mail-inbox-thread-toggle.is-placeholder {
  visibility: hidden;
  pointer-events: none;
}
#view-mail-inbox .mail-inbox-thread-count {
  display: inline-block;
  margin-left: 6px;
  padding: 0 6px;
  border-radius: 999px;
  background: #e2e8f0;
  color: #334155;
  font-size: 11px;
  font-weight: 600;
  vertical-align: middle;
}
#view-mail-inbox .mail-inbox-batch-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  background: #eff6ff;
  border-bottom: 1px solid #bfdbfe;
  font-size: 12px;
  color: #1e3a8a;
}
#view-mail-inbox .mail-inbox-batch-bar[hidden] {
  display: none !important;
}
#view-mail-inbox .mail-inbox-move-wrap {
  position: relative;
  display: inline-flex;
}
#view-mail-inbox .mail-inbox-move-menu {
  position: absolute;
  top: calc(100% + 4px);
  left: 0;
  z-index: 40;
  min-width: 140px;
  padding: 6px;
  border-radius: 0;
  border: 1px solid #e2e8f0;
  background: #fff;
  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12);
  display: flex;
  flex-direction: column;
  gap: 2px;
}
#view-mail-inbox .mail-inbox-move-menu[hidden] {
  display: none !important;
}
#view-mail-inbox .mail-inbox-move-menu button {
  border: 0;
  background: transparent;
  text-align: left;
  padding: 8px 10px;
  border-radius: 0;
  font-size: 13px;
  color: #1e293b;
  cursor: pointer;
}
#view-mail-inbox .mail-inbox-move-menu button:hover {
  background: #eff6ff;
  color: #1d4ed8;
}
#view-mail-inbox .mail-inbox-check-all {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
#view-mail-inbox .mail-inbox-item {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  width: 100%;
  text-align: left;
  border: 0;
  border-bottom: 1px solid #ece7e3;
  background: transparent;
  padding: 10px 12px;
  cursor: default;
}
#view-mail-inbox .mail-inbox-item:hover {
  background: #f1f5f9;
}
#view-mail-inbox .mail-inbox-item.is-active {
  background: #e8eefc;
}
#view-mail-inbox .mail-inbox-item-check {
  flex: 0 0 auto;
  margin-top: 4px;
}
#view-mail-inbox .mail-inbox-unread-dot {
  flex: 0 0 8px;
  width: 8px;
  height: 8px;
  margin-top: 6px;
  border-radius: 50%;
  background: transparent;
}
#view-mail-inbox .mail-inbox-item.is-unseen .mail-inbox-unread-dot {
  background: #2563eb;
}
#view-mail-inbox .mail-inbox-item-main {
  min-width: 0;
  flex: 1;
  border: 0;
  background: transparent;
  text-align: left;
  padding: 0;
  cursor: pointer;
}
#view-mail-inbox .mail-inbox-item.is-unseen .mail-inbox-item-subj,
#view-mail-inbox .mail-inbox-item.is-unseen .mail-inbox-item-from {
  font-weight: 700;
  color: #0f172a;
}
#view-mail-inbox .mail-inbox-item-subj {
  font-size: 13px;
  color: #1e293b;
  margin-bottom: 4px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#view-mail-inbox .mail-inbox-att-ico {
  margin-left: 6px;
  font-size: 12px;
}
#view-mail-inbox .mail-inbox-item-from,
#view-mail-inbox .mail-inbox-item-date {
  font-size: 11px;
  color: #78716c;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#view-mail-inbox .mail-inbox-star-btn {
  flex: 0 0 auto;
  border: 0;
  background: transparent;
  color: #a8a29e;
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
  padding: 2px 4px;
}
#view-mail-inbox .mail-inbox-item.is-flagged .mail-inbox-star-btn,
#view-mail-inbox .mail-inbox-star-btn:hover {
  color: #f59e0b;
}
#view-mail-inbox .mail-inbox-tab.has-unread {
  color: #1d4ed8;
  font-weight: 700;
}
#view-mail-inbox .mail-inbox-sync-tip {
  padding: 6px 14px;
  font-size: 12px;
  color: #0369a1;
  background: #e0f2fe;
  border-bottom: 1px solid #bae6fd;
}
#view-mail-inbox .mail-inbox-detail-toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 12px;
}
#view-mail-inbox .mail-inbox-att-chip {
  display: inline-block;
  padding: 4px 8px;
  border-radius: 0;
  background: #f1f5f9;
  border: 1px solid #e2e8f0;
  cursor: pointer;
  font: inherit;
  color: #1d4ed8;
}
#view-mail-inbox .mail-inbox-att-chip:hover {
  background: #e0e7ff;
}
#view-mail-inbox .mail-inbox-body {
  flex: 1;
  min-height: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
}
#view-mail-inbox .mail-inbox-body > .error {
  margin: 10px 14px 0;
}
#view-mail-inbox .mail-inbox-layout {
  flex: 1;
  min-height: 0;
  display: grid;
  grid-template-columns: minmax(240px, 34%) 1fr;
}
#view-mail-inbox .mail-inbox-list-pane {
  border-right: 1px solid #e7e5e4;
  overflow: auto;
  background: #fafaf9;
}
#view-mail-inbox .mail-inbox-list {
  display: flex;
  flex-direction: column;
}
#view-mail-inbox .mail-inbox-empty,
#view-mail-inbox .mail-inbox-detail-empty {
  padding: 28px 16px;
  color: #78716c;
  font-size: 13px;
  text-align: center;
}
#view-mail-inbox .mail-inbox-item {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  width: 100%;
  text-align: left;
  border: 0;
  border-bottom: 1px solid #ece7e3;
  background: transparent;
  padding: 12px 14px;
  cursor: pointer;
}
#view-mail-inbox .mail-inbox-item:hover {
  background: #f1f5f9;
}
#view-mail-inbox .mail-inbox-item.is-active {
  background: #e8eefc;
}
#view-mail-inbox .mail-inbox-unread-dot {
  flex: 0 0 8px;
  width: 8px;
  height: 8px;
  margin-top: 6px;
  border-radius: 50%;
  background: transparent;
}
#view-mail-inbox .mail-inbox-item.is-unseen .mail-inbox-unread-dot {
  background: #2563eb;
}
#view-mail-inbox .mail-inbox-item-main {
  min-width: 0;
  flex: 1;
}
#view-mail-inbox .mail-inbox-item.is-unseen .mail-inbox-item-subj,
#view-mail-inbox .mail-inbox-item.is-unseen .mail-inbox-item-from {
  font-weight: 700;
  color: #0f172a;
}
#view-mail-inbox .mail-inbox-item-subj {
  font-size: 13px;
  color: #1e293b;
  margin-bottom: 4px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#view-mail-inbox .mail-inbox-item-from,
#view-mail-inbox .mail-inbox-item-date {
  font-size: 11px;
  color: #78716c;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#view-mail-inbox .mail-inbox-tab.has-unread {
  color: #1d4ed8;
  font-weight: 700;
}
#view-mail-inbox .mail-inbox-sync-tip {
  padding: 6px 14px;
  font-size: 12px;
  color: #0369a1;
  background: #e0f2fe;
  border-bottom: 1px solid #bae6fd;
}
#view-mail-inbox .mail-inbox-detail-pane {
  overflow: auto;
  background: #fff;
}
#view-mail-inbox .mail-inbox-detail {
  padding: 16px 18px 24px;
}
#view-mail-inbox .mail-inbox-detail-subject {
  font-size: 18px;
  font-weight: 650;
  color: #0f172a;
  margin-bottom: 12px;
  line-height: 1.35;
}
#view-mail-inbox .mail-inbox-detail-meta {
  display: grid;
  gap: 6px;
  margin-bottom: 12px;
  padding-bottom: 12px;
  border-bottom: 1px solid #e7e5e4;
  font-size: 12px;
  color: #64748b;
}
#view-mail-inbox .mail-inbox-detail-meta span {
  display: inline-block;
  min-width: 3.5em;
  margin-right: 8px;
}
#view-mail-inbox .mail-inbox-detail-meta b {
  font-weight: 500;
  color: #334155;
}
#view-mail-inbox .mail-inbox-detail-attach {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 12px;
  font-size: 12px;
  color: #475569;
}
#view-mail-inbox .mail-inbox-detail-body {
  font-size: 13px;
  line-height: 1.6;
  color: #1e293b;
  white-space: pre-wrap;
  word-break: break-word;
}
#view-mail-inbox .mail-inbox-html-frame {
  width: 100%;
  min-height: 360px;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  background: #fff;
}
@media (max-width: 800px) {
  #view-mail-inbox .mail-inbox-layout {
    grid-template-columns: 1fr;
    grid-template-rows: minmax(180px, 38%) 1fr;
  }
  #view-mail-inbox .mail-inbox-list-pane {
    border-right: 0;
    border-bottom: 1px solid #e7e5e4;
  }
}

#view-mail .mail-compose-foot {
  padding: 12px 20px;
  background: #fafaf9;
  border-top: 1px solid #e7e5e4;
  gap: 10px;
}
#view-mail .mail-btn-cancel {
  min-width: 88px;
  height: 36px;
  padding: 0 16px !important;
  border-radius: 0 !important;
  border: 1px solid #d6d3d1 !important;
  background: #fff !important;
  color: #44403c !important;
  font-size: 13px !important;
  font-weight: 600 !important;
}
#view-mail .mail-btn-cancel:hover {
  background: #f5f5f4 !important;
  color: #1c1917 !important;
}
#view-mail .mail-btn-send {
  min-width: 112px;
  height: 36px;
  padding: 0 18px !important;
  border-radius: 0 !important;
  border: none !important;
  background: var(--primary) !important;
  color: #fff !important;
  font-size: 13px !important;
  font-weight: 700 !important;
  box-shadow: 0 1px 2px rgba(254, 102, 26, 0.35);
}
#view-mail .mail-btn-send:hover {
  background: var(--primary-dark) !important;
  color: #fff !important;
}
#view-mail .mail-btn-send:disabled {
  opacity: 0.65;
  cursor: not-allowed;
}
@media (max-width: 720px) {
  #view-mail .mail-compose-card {
    width: 100% !important;
  }
  #view-mail .mail-compose-row {
    grid-template-columns: 56px 1fr;
    padding: 0 10px;
  }
  #view-mail .mail-compose-textarea {
    min-height: 200px;
  }
}

/* 合同编辑弹窗：加宽加高，便于基本信息+附件并列 */
#view-form.modal-lg .modal-card {
  width: min(1360px, 100%) !important;
  max-height: min(92vh, 920px) !important;
}
/* 桌面弹窗壳 mf-desk：顶栏/底栏统一 40px（编辑客户 · CRM Hub · 跟进等同壳） */
.modal.mf-desk .modal-head {
  padding: 8px 16px;
  min-height: 40px;
  height: 40px;
  box-sizing: border-box;
  background: #fff;
  border-bottom: 1px solid #E8EAED;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  flex-shrink: 0;
}
.modal.mf-desk .modal-head .modal-title {
  color: #134e4a;
  font-weight: 600;
  font-size: 14px;
}
.modal.mf-desk .modal-head .btn-text {
  border: none;
  background: transparent;
  color: #64748b;
  font-size: 13px;
  padding: 4px 6px;
  cursor: pointer;
  font-family: inherit;
  line-height: 1.2;
}
.modal.mf-desk .modal-head .btn-text:hover {
  color: #0d9488;
}
.modal.mf-desk .modal-foot {
  min-height: 40px;
  height: 40px;
  max-height: 40px;
  padding: 2px 16px;
  background: #fff;
  border-top: 1px solid #E8EAED;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 12px;
  box-sizing: border-box;
  flex: 0 0 40px;
  overflow: hidden;
}
.modal.mf-desk .modal-title-wrap {
  align-items: center;
  min-height: 0;
}
.modal.mf-desk .head-code-field {
  height: 28px;
}
.modal.mf-desk .head-code-field input {
  height: 28px;
  padding: 2px 8px;
  font-size: 12px;
}

/* 客户 CRM 中心弹窗：对标国桉康 gak-desk / CrmHub 1600×900 */
#view-crm-hub.mf-desk {
  padding: 12px;
  background: #2b2d30;
}
#view-crm-hub.modal-lg .modal-card.modal-crm-hub-card,
#view-crm-hub .modal-crm-hub-card {
  width: min(1600px, 100%) !important;
  height: min(900px, 94vh) !important;
  max-height: min(900px, 94vh) !important;
  display: flex;
  flex-direction: column;
  border-radius: 0;
  border: 1px solid #DADCE0;
  box-shadow: 0 8px 28px rgba(32, 33, 36, 0.28);
  overflow: hidden;
  background: #fff;
}
#view-crm-hub .crm-hub-sub {
  padding: 6px 16px;
  font-size: 12px;
  color: #64748b;
  background: #f8fffe;
  border-bottom: 1px solid #e8eaed;
  flex-shrink: 0;
}
#view-crm-hub .crm-hub-sub strong {
  color: #0f766e;
  font-weight: 600;
}
#view-crm-hub .crm-hub-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 2px;
  padding: 6px 12px 0;
  background: #F0F2F5;
  border-bottom: 1px solid #e8eaed;
  flex-shrink: 0;
  margin: 0;
}
#view-crm-hub .crm-hub-tab {
  border: none;
  background: transparent;
  color: #475569;
  font-size: 12px;
  font-family: inherit;
  padding: 8px 12px;
  border-radius: 0;
  cursor: pointer;
  white-space: nowrap;
}
#view-crm-hub .crm-hub-tab:hover {
  background: #e6f4f2;
  color: #0f766e;
}
#view-crm-hub .crm-hub-tab.active {
  background: #fff;
  color: #0f766e;
  font-weight: 600;
  box-shadow: 0 -1px 0 #fff;
}
#view-crm-hub .crm-hub-tab em {
  font-style: normal;
  color: #94a3b8;
  margin-left: 4px;
  font-weight: 500;
}
#view-crm-hub .crm-hub-tab.active em {
  color: #0d9488;
}
#view-crm-hub.modal-lg .modal-body.hub-body.crm-hub-body,
#view-crm-hub .crm-hub-body {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  max-height: none !important;
  overflow: hidden !important;
  display: flex;
  flex-direction: column;
  padding: 12px 20px 16px !important;
  background: #F0F2F5 !important;
}
#view-crm-hub .hub-pane {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  display: flex;
  flex-direction: column;
  background: transparent;
  border-radius: 0;
  padding: 0;
}
/* display:flex 会盖掉原生 [hidden]，必须显式隐藏，否则切页签多页叠在一起 */
#view-crm-hub .hub-pane[hidden] {
  display: none !important;
}
#view-crm-hub .desk-btn-primary {
  color: #0d9488 !important;
  font-weight: 600;
  padding: 4px 10px;
  border-radius: 0;
  font-size: 13px;
  border: none;
  background: transparent;
  cursor: pointer;
  font-family: inherit;
}
#view-crm-hub .desk-btn-primary:hover {
  background: #e6f4f2;
}
#view-crm-hub .crm-hub-panel {
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-height: 0;
  flex: 1;
}
#view-crm-hub .crm-hub-toolbar,
#view-crm-hub .hub-toolbar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
  margin-bottom: 0;
}
#view-crm-hub .crm-hub-toolbar .tb-btn,
#view-crm-hub .hub-toolbar .tb-btn {
  min-height: 28px;
  border: none;
  background: transparent;
  color: #0f766e;
  border-radius: 0;
  padding: 5px 9px;
  font-size: 12px;
  cursor: pointer;
  font-family: inherit;
}
#view-crm-hub .crm-hub-toolbar .tb-btn:hover,
#view-crm-hub .hub-toolbar .tb-btn:hover {
  background: #e6f4f2;
}
#view-crm-hub .crm-hub-toolbar .tb-btn.danger-text,
#view-crm-hub .hub-toolbar .tb-btn.danger-text {
  color: #b91c1c;
}
#view-crm-hub .crm-hub-table-wrap,
#view-crm-hub .hub-list {
  flex: 1;
  min-height: 0;
  max-height: none;
  overflow: auto;
  border: 1px solid #DADCE0;
  background: #fff;
  margin-bottom: 0;
}
#view-crm-hub .hub-list-orders {
  max-height: none;
}
#view-crm-hub .crm-hub-table,
#view-crm-hub .hub-list table {
  width: max-content;
  min-width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
/* 有操作列：禁 min-width:100% 撑开末列，改由 MfColResize 像素总宽 + col-fill 贴右 */
#view-crm-hub .hub-list .data-table.has-ops-pin {
  min-width: 0;
  width: auto;
}
/* opsnopin1（2026-10-09 用户截图 Hub 客户管理→报价页签「操作列转为普通列，取消冻结功能」）：
   全局规则 `.data-table td.col-ops / td[data-col="操作"]` 是无条件
   `position:sticky !important; right:0 !important`（MF-WEB-OPS-STICKY-001），
   必须反向覆盖才能让该表的操作列随表横向滚动（MfColResize 的 opsPin:false 分支已不再加
   has-ops-pin、也不再插 col-fill 占位列，故用 :not(.has-ops-pin) 精准命中）。 */
#view-crm-hub .hub-list .data-table:not(.has-ops-pin) th.col-ops,
#view-crm-hub .hub-list .data-table:not(.has-ops-pin) th[data-col="操作"],
#view-crm-hub .hub-list .data-table:not(.has-ops-pin) td.col-ops,
#view-crm-hub .hub-list .data-table:not(.has-ops-pin) td[data-col="操作"] {
  position: static !important;
  right: auto !important;
  z-index: auto !important;
  box-shadow: none !important;
}
/* Hub 列表走 data-table：separate 才能左侧冻结；表头筛选手柄需 overflow:visible */
#view-crm-hub .hub-list .data-table,
#view-crm-hub .hub-list .crm-hub-data-table {
  border-collapse: separate;
  border-spacing: 0;
}
#view-crm-hub .hub-list .data-table.resizable th {
  overflow: visible;
}
#view-crm-hub .crm-hub-table th,
#view-crm-hub .crm-hub-table td,
#view-crm-hub .hub-list th,
#view-crm-hub .hub-list td {
  border-bottom: 1px solid #e8efee;
  border-right: 1px solid #e8efee;
  padding: 6px 8px;
  text-align: center;
  white-space: nowrap;
  max-width: 280px;
  overflow: hidden;
  text-overflow: ellipsis;
}
#view-crm-hub .crm-hub-table th,
#view-crm-hub .hub-list th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: #f3f4f6;
  color: #374151;
  font-weight: 600;
}
#view-crm-hub .crm-hub-table tbody tr:nth-child(even),
#view-crm-hub .hub-list tbody tr:nth-child(even) {
  background: #f8fffe;
}
#view-crm-hub .crm-hub-table tbody tr:hover,
#view-crm-hub .hub-list tbody tr:hover {
  background: #e6f4f2;
}
#view-crm-hub .crm-hub-table tbody tr.selected,
#view-crm-hub .crm-hub-table tbody tr.active,
#view-crm-hub .hub-list tbody tr.selected,
#view-crm-hub .hub-list tbody tr.active {
  background: #99f6e4 !important;
}
#view-crm-hub .crm-hub-table tbody tr,
#view-crm-hub .hub-list tbody tr {
  cursor: pointer;
}

/* Hub 列表悬停详情浮层 */
.hub-cell-tip {
  position: fixed;
  z-index: 10050;
  max-width: min(420px, calc(100vw - 16px));
  padding: 8px 10px;
  border-radius: 0;
  border: 1px solid #99f6e4;
  background: #0f172a;
  color: #f8fafc;
  font-size: 12px;
  line-height: 1.45;
  white-space: pre-wrap;
  word-break: break-word;
  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.28);
  pointer-events: none;
}
.hub-cell-tip.is-pinned {
  pointer-events: auto;
  border-color: #5eead4;
  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.38), 0 0 0 2px rgba(45, 212, 191, 0.35);
  max-height: min(60vh, 480px);
  overflow: auto;
  cursor: text;
  user-select: text;
}
.hub-cell-tip .hub-src-quote {
  color: #5eead4;
  text-decoration: underline;
  padding: 0;
  font: inherit;
  cursor: pointer;
}
.hub-cell-tip .hub-src-quote:hover {
  color: #99f6e4;
}
.crm-hub-data-table .hub-src-quote {
  padding: 0;
  white-space: nowrap;
}
.hub-quo-converted {
  color: var(--muted, #64748b);
  font-size: 12px;
  white-space: nowrap;
}
.tb-btn.hub-quo-opened-ct {
  background: #f1f5f9;
  color: #334155;
  border-color: #cbd5e1;
}
.hub-cell-tip[hidden] {
  display: none !important;
}

/* CRM Hub · 合同编辑弹窗：大窗 + 明细表 */
#view-hub-ct-form {
  z-index: 2800;
}
#view-hub-ct-form.modal-lg .modal-card.hub-ct-form-card {
  width: min(1600px, 100%) !important;
  height: min(900px, 92vh) !important;
  max-height: min(900px, 92vh) !important;
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
}
#view-hub-ct-form .hub-ct-form-body {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  padding: 14px 16px;
  background: #f0f2f5;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
#view-hub-ct-form .hub-ct-form-body .form-section.flat {
  background: #fff;
  border-radius: 0;
  padding: 12px 14px 14px;
  margin: 0;
  flex: 0 0 auto;
}
#view-hub-ct-form .hub-ct-lines-panel {
  flex: 1 1 auto;
  min-height: 220px;
  background: #fff;
  border-radius: 0;
  border: 1px solid #e8eaed;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
#view-hub-ct-form .hub-ct-lines-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 8px 12px;
  border-bottom: 1px solid #e8eaed;
  flex: 0 0 auto;
}
#view-hub-ct-form .hub-ct-lines-wrap {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
}
#view-hub-ct-form .hub-ct-lines-table {
  width: max-content;
  min-width: 100%;
  border-collapse: collapse;
  table-layout: fixed;
  font-size: 12px;
  background: #fff;
}
#view-hub-ct-form .hub-ct-lines-table th,
#view-hub-ct-form .hub-ct-lines-table td {
  border-bottom: 1px solid #e8efee;
  border-right: 1px solid #e8efee;
  padding: 6px 8px;
  text-align: center;
  vertical-align: middle;
  overflow: visible;
  max-width: none;
  color: #1e293b;
  font-weight: 400;
  white-space: normal;
}
#view-hub-ct-form .hub-ct-lines-table th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: #f3f4f6;
  color: #374151;
  white-space: nowrap;
}
#view-hub-ct-form .hub-ct-lines-table .pl-line-row td {
  min-height: 160px;
  height: auto;
}
#view-hub-ct-form .hub-ct-lines-table input,
#view-hub-ct-form .hub-ct-lines-table textarea {
  width: 100%;
  min-width: 0;
  box-sizing: border-box;
  border: 1px solid #d1d5db;
  border-radius: 0;
  padding: 4px 6px;
  font-size: 12px;
  font-family: inherit;
}
#view-hub-ct-form .hub-ct-lines-table textarea {
  min-height: 120px;
  resize: vertical;
  text-align: left;
  white-space: pre-wrap;
}
#view-hub-ct-form .hub-ct-lines-table td.pl-desc-cell,
#view-hub-ct-form .hub-ct-lines-table td.pl-pack-cell {
  vertical-align: top;
  text-align: left;
}
#view-hub-ct-form .hub-ct-lines-table .pl-img-cell {
  width: 140px;
  vertical-align: middle;
}
#view-hub-ct-form .hub-ct-lines-table .pl-img-drop {
  min-height: 120px;
}
#view-hub-ct-form .hub-ct-lines-table .pl-img-cell img {
  max-width: 120px;
  max-height: 120px;
  object-fit: contain;
}
#view-hub-ct-form .hub-ct-lines-table .pl-idx-cell {
  position: relative;
  white-space: nowrap;
}
#view-hub-ct-form .hub-ct-lines-table .ss-rm-line {
  display: block;
  margin: 4px auto 0;
  font-size: 11px;
}

/* ── ctbody1（2026-10-09 用户「弹窗式样要调整并优化专业点」）──
   收窄幅面 + 字段精修 + 明细表专业化（表头/斑马纹/数字右对齐/统一行高/隐藏 spinner） */
#view-hub-ct-form.modal-lg .modal-card.hub-ct-form-card {
  width: min(1580px, 96%) !important; /* ctwiden1（2026-10-09 用户「弹窗左右宽度+300px」）：1280+300=1580 */
  height: min(780px, 88vh) !important;
  max-height: min(780px, 88vh) !important;
}
#view-hub-ct-form .modal-head {
  border-bottom: 1px solid #e8eaed;
  background: #fff;
}
#view-hub-ct-form .modal-title {
  font-size: 15px;
  font-weight: 700;
  color: #0f172a;
}
/* 表单字段区：label 统一 6em 右对齐、字段高度一致、只读框灰底 */
#view-hub-ct-form .hub-ct-form-body .form-grid-5 {
  gap: 12px 14px;
}
#view-hub-ct-form .hub-ct-form-body .form-grid-5 .field > span {
  flex: 0 0 6em;
  width: 6em;
  color: #475569;
  font-weight: 500;
}
#view-hub-ct-form .hub-ct-form-body .form-grid-5 .field > input,
#view-hub-ct-form .hub-ct-form-body .form-grid-5 .field > select {
  padding: 7px 10px;
  min-height: 32px;
  border-color: #cbd5e1;
  color-scheme: light;
}
#view-hub-ct-form .hub-ct-form-body .form-grid-5 .field > input[readonly],
#view-hub-ct-form .hub-ct-form-body .form-grid-5 .field > input:disabled {
  background: #f1f5f9;
  color: #64748b;
}
/* cticon1（2026-10-09 用户红框「红框内容移除，点击日期直接显示选择器」）：
   隐藏日期字段原生日历图标，点击输入框由 JS showPicker() 直弹选择器 */
#view-hub-ct-form input[type="date"]::-webkit-calendar-picker-indicator { display: none !important; -webkit-appearance: none; appearance: none; }
#view-hub-ct-form .hub-ct-form-body .form-grid-5 .field > input[type="number"] {
  text-align: right;
}
/* 明细区块标题条 */
#view-hub-ct-form .hub-ct-lines-head {
  background: #f8fafc;
  padding: 9px 14px;
}
#view-hub-ct-form .hub-ct-lines-head strong {
  position: relative;
  padding-left: 10px;
  font-size: 13px;
  font-weight: 700;
  color: #0f172a;
}
#view-hub-ct-form .hub-ct-lines-head strong::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  width: 3px;
  height: 14px;
  background: #0d9488;
}
/* 表头加重 */
#view-hub-ct-form .hub-ct-lines-table th {
  background: #f1f5f9;
  color: #334155;
  font-weight: 600 !important; /* 全局字体锁 12px !important 会压字重，须同级提权（ctbody1） */
  border-bottom: 1px solid #e2e8f0;
}
/* 斑马纹 + hover */
#view-hub-ct-form .hub-ct-lines-table .pl-line-row:nth-child(even) td {
  background: #fafcfc;
}
#view-hub-ct-form .hub-ct-lines-table .pl-line-row:hover td {
  background: #f0fdfa;
}
/* 行内输入统一：textarea 定高、数字右对齐、去 spinner */
#view-hub-ct-form .hub-ct-lines-table textarea {
  min-height: 108px;
  line-height: 1.6;
  background: #fff;
}
#view-hub-ct-form .hub-ct-lines-table input[type="number"] {
  text-align: right;
}
#view-hub-ct-form .hub-ct-lines-table input[type="number"]::-webkit-outer-spin-button,
#view-hub-ct-form .hub-ct-lines-table input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
#view-hub-ct-form .hub-ct-lines-table input[type="number"] {
  -moz-appearance: textfield;
  appearance: textfield;
}
#view-hub-ct-form .hub-ct-lines-table input:focus,
#view-hub-ct-form .hub-ct-lines-table textarea:focus {
  outline: none;
  border-color: #0d9488;
  box-shadow: 0 0 0 2px rgba(13, 148, 136, 0.15);
}
/* 图片缩略图统一 */
#view-hub-ct-form .hub-ct-lines-table .pl-img-drop {
  min-height: 104px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px dashed #cbd5e1;
  background: #fafbfc;
}
#view-hub-ct-form .hub-ct-lines-table .pl-img-cell img {
  max-width: 96px;
  max-height: 96px;
}
/* 总价列强调 */
#view-hub-ct-form .hub-ct-lines-table td.hc-line-amt {
  font-weight: 600;
  color: #0f172a;
  text-align: right;
  white-space: nowrap;
}
/* ctauto1（2026-10-09 用户「编辑合同时，自动保存；删除"保存"按钮」）：头部自动保存状态提示
   qsavetip2（2026-10-11 用户红框「删除红框内容」）：报价弹窗 #hq-save-tip 已移除，
   仅保留合同弹窗 #hc-save-tip 样式。 */
#view-hub-ct-form .hc-save-tip {
  font-size: 12px !important;
  line-height: 1;
  padding: 3px 8px;
  border: 1px solid transparent;
  white-space: nowrap;
  color: #64748b;
}
#view-hub-ct-form .hc-save-tip.is-on,
#view-hub-ct-form .hc-save-tip.is-ok {
  color: #15803d;
  border-color: #bbf7d0;
  background: #f0fdf4;
}
#view-hub-ct-form .hc-save-tip.is-pending { color: #b45309; border-color: #fde68a; background: #fffbeb; }
#view-hub-ct-form .hc-save-tip.is-saving { color: #1d4ed8; border-color: #bfdbfe; background: #eff6ff; }
#view-hub-ct-form .hc-save-tip.is-err { color: #b91c1c; border-color: #fecaca; background: #fef2f2; }
/* ctunappr1（2026-10-09 用户「需要反审功能，同按钮显示（审核/反审切换态）」）：
   已审核态下按钮文案变「↩ 反审」并用琥珀色提示（撤回语义），避免和「审核」同色看不出切换 */
#view-hub-ct-form .tb-btn#btn-hc-approve.is-unapprove,
#view-hub-quo-form .tb-btn#btn-hq-approve.is-unapprove {
  color: #b45309 !important;
  border-color: #fcd34d !important;
  background: #fffbeb !important;
}
/* 型号/名称输入居中保持与单元格一致 */
#view-hub-ct-form .hub-ct-lines-table td:nth-child(-n + 3) input {
  text-align: center;
}
/* ctghost1（2026-10-09 用户「隐藏输入框」）：明细行输入框透明化——平时无边框无底色呈纯文本观感，
   行 hover 显浅边提示可编辑，focus 白底高亮进入编辑态（功能不变，仅视觉隐藏） */
#view-hub-ct-form .hub-ct-lines-table input,
#view-hub-ct-form .hub-ct-lines-table textarea {
  border-color: transparent;
  background: transparent;
  box-shadow: none;
}
#view-hub-ct-form .hub-ct-lines-table .pl-line-row:hover td input,
#view-hub-ct-form .hub-ct-lines-table .pl-line-row:hover td textarea {
  border-color: #e2e8f0;
}
#view-hub-ct-form .hub-ct-lines-table input:focus,
#view-hub-ct-form .hub-ct-lines-table textarea:focus {
  background: #fff;
}
/* ctwrap1（2026-10-09 用户「显示不完整是需要换行显示」）：
   型号/名称 input→textarea 可换行；通用 textarea 小高度自适应（JS fitTa 撑高），
   描述/包装两列保持 108px 大高度；型号/名称保持居中、禁手动拖拽 */
#view-hub-ct-form .hub-ct-lines-table textarea[data-ct-f] {
  min-height: 30px;
  height: 30px;
  resize: none;
  overflow: hidden;
}
#view-hub-ct-form .hub-ct-lines-table td.pl-desc-cell textarea,
#view-hub-ct-form .hub-ct-lines-table td.pl-pack-cell textarea {
  min-height: 108px;
  resize: vertical;
}
#view-hub-ct-form .hub-ct-lines-table td:nth-child(-n + 3) textarea[data-ct-f] {
  text-align: center;
}

/* CRM Hub · 跟进编辑弹窗：1600×900；内容与微信切图同行 */
#view-hub-act-form {
  z-index: 2800;
}
#view-hub-act-form.modal-lg .modal-card {
  width: min(1600px, 100%);
  height: min(900px, 92vh);
  max-height: min(900px, 92vh);
  display: flex;
  flex-direction: column;
}
#view-hub-act-form .modal-body {
  flex: 1 1 auto;
  min-height: 0;
  max-height: none;
  overflow: auto;
  padding: 14px 16px;
  background: #f0f2f5;
}
#view-hub-act-form .form-section.flat {
  background: #fff;
  border-radius: 0;
  padding: 12px 14px 14px;
  margin: 0;
  height: 100%;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
}
#view-hub-act-form .form-grid-5 {
  flex: 1 1 auto;
  min-height: 0;
  align-content: start;
  grid-template-columns: repeat(6, minmax(0, 1fr));
}
#view-hub-act-form .form-grid-5 > .field:not(.span-all) > span {
  flex: 0 0 4.2em;
  width: 4.2em;
}
#view-hub-act-form #ha-filler {
  background: #f8fafc;
  color: #334155;
  cursor: default;
}
#view-hub-act-form .hub-act-content-row {
  display: flex;
  flex-direction: row;
  align-items: stretch;
  gap: 12px;
  grid-column: 1 / -1;
  min-height: 420px;
  margin-top: 4px;
}
#view-hub-act-form .hub-act-content-field {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-direction: row;
  align-items: stretch;
  gap: 8px;
  margin: 0;
}
#view-hub-act-form .hub-act-content-field > span {
  flex: 0 0 4.5em;
  width: 4.5em;
  padding-top: 8px;
  text-align: right;
  white-space: nowrap;
}
#view-hub-act-form .hub-act-content-pane {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 420px;
  height: 100%;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
#view-hub-act-form .hub-act-chat {
  flex: 1 1 auto;
  min-height: 420px;
  max-height: none;
  overflow: auto;
  padding: 12px 14px;
  border: 1px solid #d7e5e3;
  border-radius: 0;
  background: #ededed;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
#view-hub-act-form .hub-act-chat[hidden] {
  display: none !important;
}
#view-hub-act-form .hub-act-chat-bar {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;
  margin-top: -2px;
}
/* actdrop1（2026-10-10）：编辑跟进弹窗——内容区拖拽图片上传后的缩略图条 */
#view-hub-act-form .hub-act-content-pane.ha-dragover {
  outline: 2px dashed #4f8ef7;
  outline-offset: -3px;
}
#view-hub-act-form .ha-img-strip {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 2px 0 0;
}
#view-hub-act-form .ha-img-strip[hidden] {
  display: none !important;
}
#view-hub-act-form .ha-img-item {
  position: relative;
  width: 64px;
  height: 64px;
  border: 1px solid #d7e5e3;
  background: #fafafa;
  overflow: hidden;
}
#view-hub-act-form .ha-img-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  cursor: zoom-in;
}
#view-hub-act-form .ha-img-del {
  position: absolute;
  top: 0;
  right: 0;
  width: 18px;
  height: 18px;
  border: none;
  background: rgba(17, 24, 39, 0.62);
  color: #fff;
  font-size: 11px !important;
  line-height: 18px;
  padding: 0;
  cursor: pointer;
}
#view-hub-act-form .ha-img-del:hover {
  background: rgba(220, 38, 38, 0.85);
}
#view-hub-act-form .ha-img-uploading {
  font-size: 12px;
  color: #6b7280;
}
/* actlite1（2026-10-10）：跟进图片应用内灯箱预览（替代 namecard/download 直开触发下载） */
#hub-act-img-lightbox {
  position: fixed;
  inset: 0;
  z-index: 12000;
  background: rgba(15, 23, 42, 0.72);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 32px;
  cursor: zoom-out;
}
#hub-act-img-lightbox[hidden] {
  display: none !important;
}
#hub-act-img-lightbox .hub-act-lightbox-inner {
  max-width: 100%;
  max-height: 100%;
}
#hub-act-img-lightbox img {
  max-width: 92vw;
  max-height: 90vh;
  object-fit: contain;
  display: block;
  background: #fff;
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35);
}
#view-hub-act-form .hub-act-chat-bar[hidden] {
  display: none !important;
}
#view-hub-act-form .hub-act-chat-bar .btn-text {
  font-size: 12px;
  color: #0d9488;
  padding: 2px 4px;
  cursor: pointer;
  border: none;
  background: transparent;
  font-family: inherit;
}
#view-hub-act-form .hub-act-chat-bar .btn-text:hover {
  color: #0f766e;
  text-decoration: underline;
}
#view-hub-act-form .hub-act-chat-row {
  display: flex;
  width: 100%;
}
#view-hub-act-form .hub-act-chat-row.is-left {
  justify-content: flex-start;
}
#view-hub-act-form .hub-act-chat-row.is-right {
  justify-content: flex-end;
}
#view-hub-act-form .hub-act-chat-col {
  display: flex;
  flex-direction: column;
  max-width: min(72%, 520px);
}
#view-hub-act-form .hub-act-chat-meta {
  font-size: 11px;
  color: #64748b;
  margin-bottom: 3px;
  padding: 0 2px;
}
#view-hub-act-form .hub-act-chat-row.is-right .hub-act-chat-meta {
  text-align: right;
}
#view-hub-act-form .hub-act-chat-bubble {
  max-width: 100%;
  padding: 8px 12px;
  border-radius: 0;
  font-size: 13px;
  line-height: 1.5;
  white-space: pre-wrap;
  word-break: break-word;
  box-shadow: 0 1px 1px rgba(15, 23, 42, 0.06);
}
#view-hub-act-form .hub-act-chat-row.is-left .hub-act-chat-bubble {
  background: #fff;
  color: #1e293b;
  border-top-left-radius: 2px;
}
#view-hub-act-form .hub-act-chat-row.is-right .hub-act-chat-bubble {
  background: #95ec69;
  color: #14532d;
  border-top-right-radius: 2px;
}
#view-hub-act-form #ha-content {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 420px;
  height: 100%;
  width: 100%;
  resize: vertical;
  box-sizing: border-box;
}
/* 有气泡预览时只显示气泡，不叠第二块输入框 */
#view-hub-act-form .hub-act-content-pane.has-chat #ha-content {
  display: none !important;
}
#view-hub-act-form .hub-act-content-pane.is-editing-raw.has-chat #ha-content {
  display: block !important;
  min-height: 420px;
  height: 100%;
  flex: 1 1 auto;
}
#view-hub-act-form .hub-act-content-pane.is-editing-raw.has-chat #ha-content-chat,
#view-hub-act-form .hub-act-content-pane.is-editing-raw.has-chat #ha-content-chat-bar {
  display: none !important;
}
#view-hub-act-form .hub-act-wx-drop {
  flex: 0 0 180px;
  width: 180px;
  min-width: 180px;
  max-width: 180px;
  min-height: 420px;
  border: 1px dashed #99d5cd;
  border-radius: 0;
  background: linear-gradient(165deg, #f8fffe 0%, #eef8f6 100%);
  padding: 10px 8px;
  cursor: pointer;
  outline: none;
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
}
#view-hub-act-form .hub-act-wx-preview {
  display: block;
  width: 100%;
  max-height: 260px;
  object-fit: contain;
  border-radius: 0;
  background: #fff;
  border: 1px solid #d7e5e3;
  margin-bottom: 4px;
}
#view-hub-act-form .hub-act-wx-preview[hidden] {
  display: none !important;
}
#view-hub-act-form .hub-act-wx-drop.has-preview {
  align-items: stretch;
}
#view-hub-act-form .hub-act-wx-drop.has-preview .hub-act-wx-drop-inner {
  width: 100%;
  justify-content: flex-start;
}
#view-hub-act-form .hub-act-wx-drop:hover,
#view-hub-act-form .hub-act-wx-drop.is-dragover {
  border-color: #0d9488;
  background: #f0fdfa;
}
#view-hub-act-form .hub-act-wx-drop-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  text-align: center;
}
#view-hub-act-form .hub-act-wx-title {
  font-size: 13px;
  font-weight: 600;
  color: #0f766e;
  letter-spacing: 0.04em;
}
#view-hub-act-form .hub-act-wx-drop .attach-drop-hint {
  margin: 0;
  font-size: 11px;
  line-height: 1.45;
  color: #64748b;
}
#view-hub-act-form .hub-act-wx-status {
  margin-top: 2px;
  font-size: 11px;
  color: #64748b;
  word-break: break-all;
}
#view-hub-act-form .hub-act-wx-status.is-busy {
  color: #0d9488;
}
#view-hub-act-form .hub-act-wx-status.is-ok {
  color: #15803d;
}
#view-hub-act-form .hub-act-wx-status.is-err {
  color: #b91c1c;
}
@media (max-width: 900px) {
  #view-hub-act-form .hub-act-content-row {
    flex-direction: column;
  }
  #view-hub-act-form .hub-act-wx-drop {
    flex: 0 0 auto;
    width: 100%;
    max-width: none;
    min-height: 96px;
  }
}
#view-crm-hub .hub-list-activity {
  flex: 1 1 auto;
  min-height: 0;
  max-height: none;
}

#view-crm-hub .hub-form.crm-hub-form-card,
#view-crm-hub .hub-form.form-section {
  flex-shrink: 0;
  margin: 0;
  padding: 10px 12px 12px;
  background: #fff;
  border: 1px solid #DADCE0;
  border-radius: 0;
  box-shadow: none;
}
#view-crm-hub .hub-form .section-title {
  color: #134e4a;
  font-size: 13px;
  font-weight: 600;
  margin-bottom: 8px;
  padding-bottom: 6px;
  border-bottom: 1px solid #E8EAED;
}
#view-crm-hub .hub-basic-body {
  background: transparent;
  border: none;
  padding: 0;
  flex: 1 1 auto;
  min-height: 0;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
#view-crm-hub .hub-basic-form-host {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  background: #f0f2f5;
  padding: 12px 14px;
  border-radius: 0;
}
#view-crm-hub .hub-basic-readonly .hub-basic-code-row {
  margin-bottom: 12px;
  padding: 10px 14px;
}
#view-crm-hub .hub-basic-readonly .hub-basic-code-field {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0;
}
#view-crm-hub .hub-basic-readonly .hub-basic-code-field > input {
  width: min(220px, 40vw);
  font-weight: 600;
  color: var(--primary-dark);
  background: #f8fafc;
}
#view-crm-hub .hub-basic-readonly input:disabled,
#view-crm-hub .hub-basic-readonly select:disabled,
#view-crm-hub .hub-basic-readonly textarea:disabled {
  opacity: 1;
  color: #202124;
  background: #f8fafc;
  cursor: default;
}
#view-crm-hub .hub-basic-readonly .cust-namecard-empty.is-readonly:hover {
  border-color: #99d5cd;
  background: linear-gradient(165deg, #f8fffe 0%, #eef8f6 100%);
}
#view-crm-hub .hub-basic-v {
  color: #002FA7;
}
#view-crm-hub .hub-nc-card {
  border-radius: 0;
  border-color: #DADCE0;
}
.form-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 0 14px;
}
.form-grid-2 {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px 16px;
}
.form-grid-3 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 8px 12px;
}
.form-grid-2 .field,
.form-grid-3 .field {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 8px;
  margin-bottom: 0;
}
.form-grid-2 .field[hidden],
.form-grid-3 .field[hidden],
.field[hidden] {
  display: none !important;
}
.form-grid-2 .field > span,
.form-grid-3 .field > span {
  flex: 0 0 4.2em;
  margin-bottom: 0;
  text-align: right;
  white-space: nowrap;
  font-size: 12px;
  color: var(--muted);
}
.form-grid-2 .field > input,
.form-grid-2 .field > select,
.form-grid-3 .field > input,
.form-grid-3 .field > select {
  flex: 1;
  min-width: 0;
  padding: 8px 10px;
  font-size: 12px;
  background: #f8fffe;
  color: #002FA7;
  border: 1px solid #d7e5e3;
}
.form-grid-3 .field > input[type="date"] {
  min-height: 34px;
  color-scheme: light;
}
/* 4 列网格（BOM 表单等）— 对齐 form-grid-3 字段式样 */
.form-grid-4 {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px 12px;
}
.form-grid-4 .field {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 8px;
  margin-bottom: 0;
}
.form-grid-4 .field[hidden] {
  display: none !important;
}
.form-grid-4 .field > span {
  flex: 0 0 4.2em;
  margin-bottom: 0;
  text-align: right;
  white-space: nowrap;
  font-size: 12px;
  color: var(--muted);
}
.form-grid-4 .field > input,
.form-grid-4 .field > select {
  flex: 1;
  min-width: 0;
  padding: 8px 10px;
  font-size: 12px;
  background: #f8fffe;
  color: #002FA7;
  border: 1px solid #d7e5e3;
}
.form-grid-4 .field > input[type="date"] {
  min-height: 34px;
  color-scheme: light;
}
.form-grid-4 .field.field-span-2 {
  grid-column: span 2;
}
.form-grid-4 .field.field-span-3 {
  grid-column: span 3;
}
.form-grid-4 .field.field-span-4 {
  grid-column: 1 / -1;
}
.form-grid .field input[readonly],
.form-grid .field input:disabled,
.form-grid .field select:disabled {
  background: #f1f5f9;
  color: #64748b;
  cursor: default;
}

/* 客户 CRM 弹窗：对齐国桉康 5 列标签左置 */
.form-grid-5 {
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 10px 10px;
}
.form-grid-5 .field {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 6px;
  margin-bottom: 0;
  min-width: 0;
}
.form-grid-5 .field > span {
  flex: 0 0 5.5em;
  width: 5.5em;
  margin-bottom: 0;
  text-align: right;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: 12px;
  color: #5f6368;
  line-height: 1.2;
}
.form-grid-5 .field > input,
.form-grid-5 .field > select {
  flex: 1;
  min-width: 0;
  padding: 7px 10px;
  font-size: 12px;
  border: 1px solid #d7e5e3;
  border-radius: 0;
  background: #f8fffe;
  color: #002FA7;
}
.form-grid-5 .field > input:focus,
.form-grid-5 .field > select:focus {
  outline: none;
  border-color: #14b8a6;
  background: #fff;
  box-shadow: 0 0 0 3px rgba(45, 212, 191, 0.2);
}
.form-grid-5 .field > textarea {
  flex: 1;
  min-width: 0;
  padding: 7px 10px;
  font-size: 12px;
  border: 1px solid #d7e5e3;
  border-radius: 0;
  background: #f8fffe;
  color: #002FA7;
  resize: vertical;
}
.form-grid-5 .field > textarea:focus {
  outline: none;
  border-color: #14b8a6;
  background: #fff;
  box-shadow: 0 0 0 3px rgba(45, 212, 191, 0.2);
}
.form-grid-5 .field.span-all {
  grid-column: 1 / -1;
}
.mf-cust-form .field.field-cust-level {
  grid-column: span 2;
}
.mf-cust-form .field.field-cust-level > select {
  font-size: 12px;
}
@media (max-width: 900px) {
  .mf-cust-form .field.field-cust-level {
    grid-column: 1 / -1;
  }
}
.form-grid-5 .field.span-all > span {
  flex: 0 0 5.5em;
  width: 5.5em;
}
.form-grid-5 .field.field-filler {
  visibility: hidden;
  pointer-events: none;
  min-height: 0;
}
.form-grid-5 .field.addr-cascade {
  display: flex;
  align-items: center;
  gap: 6px;
}
.form-grid-5 .field.addr-cascade > span {
  flex: 0 0 5.5em;
  width: 5.5em;
  margin: 0;
}
.addr-cascade-row {
  display: flex;
  flex: 1;
  flex-wrap: nowrap;
  gap: 6px;
  min-width: 0;
  align-items: stretch;
}
/* 省/市/区固定宽 · 详细地址弹性占满 */
.addr-cascade-row select:nth-child(1),
.addr-cascade-row select:nth-child(2) {
  width: 108px;
  flex: 0 0 108px;
  min-width: 96px;
  max-width: 108px;
}
.addr-cascade-row select:nth-child(3) {
  width: 140px;
  flex: 0 0 140px;
  min-width: 120px;
  max-width: 160px;
}
.addr-cascade-row input[type="text"] {
  flex: 1 1 auto;
  min-width: 0;
}
.mf-cust-form .form-subhead {
  grid-column: 1 / -1;
  font-size: 13px;
  font-weight: 600;
  color: #5f6368;
  padding: 10px 0 4px;
  margin-top: 4px;
  border-bottom: 1px dashed #e8eaed;
}
@media (max-width: 720px) {
  .form-grid-5 .field.addr-cascade {
    flex-direction: column;
    align-items: stretch;
  }
  .form-grid-5 .field.addr-cascade > span {
    flex-basis: auto;
  }
  .addr-cascade-row {
    flex-wrap: wrap;
  }
  .addr-cascade-row select:nth-child(1),
  .addr-cascade-row select:nth-child(2) {
    width: 80px;
    flex: 0 0 80px;
    min-width: 72px;
    max-width: 80px;
  }
  .addr-cascade-row select:nth-child(3) {
    width: 100px;
    flex: 0 0 100px;
    min-width: 90px;
    max-width: 110px;
  }
  .addr-cascade-row input[type="text"] {
    flex: 1 1 100%;
    min-width: 8em;
  }
}
.modal-title-wrap {
  display: flex;
  align-items: center;
  gap: 16px;
  min-width: 0;
  flex: 1;
}
.modal-title-wrap .modal-title {
  flex-shrink: 0;
}
.head-code-field {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0;
  min-width: 0;
}
.head-code-field > span {
  font-size: 12px;
  color: #5f6368;
  white-space: nowrap;
}
.head-code-field > input {
  width: min(200px, 36vw);
  padding: 6px 10px;
  font-size: 13px;
  font-weight: 600;
  color: var(--primary-dark);
  border: 1px solid #e8eaed;
  border-radius: 0;
  background: #f8fafc;
}
#view-cust-form.modal-lg .modal-card {
  width: min(1600px, 100%);
  height: min(900px, 92vh);
  max-height: min(900px, 92vh);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
#view-cust-form .modal-body {
  background: #f0f2f5;
  padding: 12px 14px;
}
.mf-cust-form .form-section {
  background: #fff;
  border: none;
  box-shadow: none;
  margin-bottom: 12px;
  padding: 12px 14px 14px;
  border-radius: 0;
}
.mf-cust-form .section-title {
  color: #202124;
  font-size: 14px;
  padding-bottom: 8px;
  margin-bottom: 12px;
  border-bottom: 1px solid #e8eaed;
}
/* 基本信息：三列 = 输入区 | 正面 | 反面 */
.mf-cust-form .cust-basic-title {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}
.mf-cust-form .cust-basic-title .cust-namecard-clear {
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0;
  color: #64748b;
}
.mf-cust-form .cust-basic-3col {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.5fr) minmax(0, 0.5fr);
  gap: 12px;
  align-items: stretch;
}
.mf-cust-form .cust-basic-fields {
  min-width: 0;
}
.mf-cust-form .cust-basic-fields .form-grid-2 {
  gap: 8px 10px;
}
.mf-cust-form .cust-basic-fields .field.span-all {
  grid-column: 1 / -1;
}
.mf-cust-form .cust-basic-fields .field.addr-cascade {
  display: flex;
  align-items: center;
  gap: 6px;
}
.mf-cust-form .cust-basic-fields .field.addr-cascade > span {
  flex: 0 0 4.5em;
  width: 4.5em;
  margin: 0;
  text-align: right;
  white-space: nowrap;
  font-size: 12px;
  color: #5f6368;
}
.mf-cust-form .cust-basic-fields .addr-cascade-row {
  flex-wrap: wrap;
  gap: 6px;
}
.mf-cust-form .cust-basic-fields .addr-cascade-row select:nth-child(1),
.mf-cust-form .cust-basic-fields .addr-cascade-row select:nth-child(2) {
  width: 108px;
  flex: 0 0 108px;
  min-width: 108px;
  max-width: none;
}
.mf-cust-form .cust-basic-fields .addr-cascade-row select:nth-child(3) {
  width: 148px;
  flex: 0 0 148px;
  min-width: 148px;
  max-width: none;
}
.mf-cust-form .cust-basic-fields .addr-cascade-row input[type="text"] {
  flex: 1 1 calc(100% - 4px);
  min-width: 12em;
}
.mf-cust-form .nc-side {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
  min-height: 0;
  height: 100%;
  align-self: stretch;
  border: 1px solid #d7e5e3;
  border-radius: 0;
  background: #f8fffe;
  padding: 8px;
  box-sizing: border-box;
}
.mf-cust-form .nc-side-label {
  font-size: 12px;
  font-weight: 600;
  color: #0f766e;
  letter-spacing: 0.06em;
  text-align: center;
  flex: 0 0 auto;
}
.mf-cust-form .cust-namecard-empty,
.mf-cust-form .cust-namecard-preview {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
  border-radius: 0;
}
.mf-cust-form .cust-namecard-empty[hidden],
.mf-cust-form .cust-namecard-preview[hidden] {
  display: none !important;
}
.mf-cust-form .cust-namecard-empty {
  align-items: center;
  justify-content: center;
  gap: 4px;
  text-align: center;
  border: 1px dashed #99d5cd;
  background: linear-gradient(165deg, #f8fffe 0%, #eef8f6 100%);
  padding: 16px 8px;
  cursor: pointer;
  /* 与左侧字段区同高：占满 nc-side 剩余高度，不再锁横版比例 */
  aspect-ratio: auto;
  height: 100%;
}
.mf-cust-form .cust-namecard-empty:hover {
  border-color: #0d9488;
  background: #f0fdfa;
}
.mf-cust-form .nc-upload-icon {
  font-size: 22px;
  line-height: 1;
  opacity: 0.85;
}
.mf-cust-form .nc-upload-title {
  font-size: 13px;
  font-weight: 600;
  color: #0f172a;
}
.mf-cust-form .nc-upload-hint {
  font-size: 11px;
  color: #64748b;
  margin-bottom: 2px;
}
.mf-cust-form .cust-namecard-preview {
  gap: 6px;
  height: 100%;
  min-height: 0;
  overflow: hidden;
}
.mf-cust-form .cust-namecard-preview img {
  width: 100%;
  flex: 1 1 auto;
  min-height: 0;
  height: 0;
  max-height: none;
  aspect-ratio: auto;
  object-fit: contain;
  object-position: center;
  border-radius: 0;
  background: #fff;
  border: 1px solid #e2e8f0;
  display: block;
}
.mf-cust-form .nc-slot-actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  flex: 0 0 auto;
}
.mf-cust-form .nc-ocr-status {
  flex: 0 0 auto;
  margin-top: 2px;
  padding: 6px 8px;
  border-radius: 0;
  font-size: 11px;
  line-height: 1.35;
  color: #0f766e;
  background: #ecfdf5;
  border: 1px solid #a7f3d0;
  word-break: break-word;
}
.mf-cust-form .nc-ocr-status.is-busy {
  color: #0369a1;
  background: #e0f2fe;
  border-color: #7dd3fc;
}
.mf-cust-form .nc-ocr-status.is-ok {
  color: #047857;
  background: #ecfdf5;
  border-color: #6ee7b7;
}
.mf-cust-form .nc-ocr-status.is-err {
  color: #b45309;
  background: #fff7ed;
  border-color: #fdba74;
}
.mf-cust-form .nc-ocr-status-global {
  grid-column: 1 / -1;
}
.mf-cust-form .nc-ocr-status-global[hidden] {
  display: none !important;
}
/* CRM 信息区 · 四格图片（拖拽上传） */
.mf-cust-form .cust-crm-images {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 10px;
  margin-top: 12px;
  padding-top: 4px;
}
.mf-cust-form .crm-img-slot {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 0;
}
.mf-cust-form .crm-img-label {
  font-size: 12px;
  color: #475569;
  font-weight: 600;
}
.mf-cust-form .crm-img-empty,
.mf-cust-form .crm-img-preview {
  position: relative;
  height: 200px;
  min-height: 200px;
  border: 1.5px dashed #94a3b8;
  border-radius: 0;
  background: #f8fafc;
  overflow: hidden;
}
.mf-cust-form .crm-img-empty {
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  color: #0d9488;
  font-size: 12px;
  text-align: center;
  padding: 8px;
  box-sizing: border-box;
}
.mf-cust-form .crm-img-empty:hover,
.mf-cust-form .crm-img-empty.is-drag {
  border-color: #0d9488;
  background: #f0fdfa;
}
.mf-cust-form .crm-img-empty[hidden],
.mf-cust-form .crm-img-preview[hidden] {
  display: none !important;
}
.mf-cust-form .crm-img-preview img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  background: #f1f5f9;
  display: block;
}
.mf-cust-form .crm-img-preview .crm-img-clear {
  position: absolute;
  right: 6px;
  bottom: 4px;
  background: rgba(255, 255, 255, 0.92);
  padding: 2px 6px;
  border-radius: 0;
  font-size: 11px;
}
.mf-cust-form .crm-img-hint {
  line-height: 1.35;
}
@media (max-width: 900px) {
  .mf-cust-form .cust-crm-images {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 560px) {
  .mf-cust-form .cust-crm-images {
    grid-template-columns: 1fr;
  }
}
/* 调查表长标签（采购负责人电话等） */
.mf-cust-form .form-section:last-of-type .form-grid-5 .field > span {
  flex: 0 0 7em;
  width: 7em;
}
@media (max-width: 1100px) {
  .mf-cust-form .cust-basic-3col {
    grid-template-columns: minmax(0, 1fr) minmax(0, 0.5fr) minmax(0, 0.5fr);
  }
}
@media (max-width: 900px) {
  .mf-cust-form .cust-basic-3col {
    grid-template-columns: 1fr 1fr;
  }
  .mf-cust-form .cust-basic-fields {
    grid-column: 1 / -1;
  }
}
@media (max-width: 560px) {
  .mf-cust-form .cust-basic-3col {
    grid-template-columns: 1fr;
  }
}
.hub-sub {
  font-size: 12px;
  color: #5f6368;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.hub-body {
  background: #f0f2f5;
}
.hub-tabs { margin-bottom: 10px; flex-shrink: 0; }
.hub-pane {
  min-height: 0;
  flex: 1 1 auto;
  overflow: auto;
}
.hub-toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 10px;
}
.hub-basic-body {
  display: flex;
  flex-direction: column;
  gap: 14px;
  min-height: 0;
}
.hub-basic-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px 16px;
}
.hub-basic-row {
  display: flex;
  gap: 8px;
  font-size: 13px;
  line-height: 1.45;
  padding: 6px 0;
  border-bottom: 1px solid #eef2f7;
}
.hub-basic-k {
  flex: 0 0 88px;
  color: #64748b;
}
.hub-basic-v {
  flex: 1;
  color: #0f172a;
  word-break: break-word;
}
.hub-basic-cards {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  align-items: start;
}
.hub-nc-card {
  min-width: 0;
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  padding: 10px;
}
.hub-nc-label {
  font-size: 13px;
  font-weight: 600;
  color: #334155;
  margin-bottom: 8px;
}
.hub-nc-frame {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 10;
  border-radius: 0;
  overflow: hidden;
  background: #fff;
  border: 1px dashed #cbd5e1;
}
.hub-nc-empty {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #94a3b8;
  font-size: 13px;
}
.hub-nc-preview {
  position: absolute;
  inset: 0;
}
.hub-nc-preview img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  background: #fff;
}
.hub-nc-status {
  margin-top: 6px;
  font-size: 12px;
  color: #64748b;
  line-height: 1.35;
  word-break: break-all;
}
@media (max-width: 720px) {
  .hub-basic-cards { grid-template-columns: 1fr; }
}

/* CRM Hub · 联系人表单 = 新增客户同款三列（字段 | 正面 | 反面） */
#view-crm-hub .hub-ctt-basic-title .cust-namecard-clear {
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0;
  color: #64748b;
}
#view-crm-hub .hub-ctt-3col {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.5fr) minmax(0, 0.5fr);
  gap: 12px;
  align-items: start;
}
#view-crm-hub .hub-ctt-form-fields {
  min-width: 0;
}
#view-crm-hub .hub-ctt-form-fields .form-grid-2 {
  gap: 8px 10px;
}
#view-crm-hub .hub-ctt-form-fields .field.span-all {
  grid-column: 1 / -1;
}
#view-crm-hub .hub-ctt-3col .nc-side {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
  border: 1px solid #d7e5e3;
  border-radius: 0;
  background: #f8fffe;
  padding: 8px;
  height: auto;
  align-self: start;
}
#view-crm-hub .hub-ctt-3col .nc-side-label {
  font-size: 12px;
  font-weight: 600;
  color: #0f766e;
  letter-spacing: 0.06em;
  text-align: center;
  flex: 0 0 auto;
}
#view-crm-hub .hub-ctt-3col .cust-namecard-empty,
#view-crm-hub .hub-ctt-3col .cust-namecard-preview {
  display: flex;
  flex-direction: column;
  flex: 0 0 auto;
  border-radius: 0;
}
#view-crm-hub .hub-ctt-3col .cust-namecard-empty[hidden],
#view-crm-hub .hub-ctt-3col .cust-namecard-preview[hidden] {
  display: none !important;
}
#view-crm-hub .hub-ctt-3col .cust-namecard-empty {
  align-items: center;
  justify-content: center;
  gap: 4px;
  text-align: center;
  border: 1px dashed #99d5cd;
  background: linear-gradient(165deg, #f8fffe 0%, #eef8f6 100%);
  padding: 16px 8px;
  cursor: pointer;
  aspect-ratio: 16 / 10;
  min-height: 0;
}
#view-crm-hub .hub-ctt-3col .cust-namecard-empty:hover {
  border-color: #0d9488;
  background: #f0fdfa;
}
#view-crm-hub .hub-ctt-3col .nc-upload-icon {
  font-size: 22px;
  line-height: 1;
  opacity: 0.85;
}
#view-crm-hub .hub-ctt-3col .nc-upload-title {
  font-size: 13px;
  font-weight: 600;
  color: #0f172a;
}
#view-crm-hub .hub-ctt-3col .nc-upload-hint {
  font-size: 11px;
  color: #64748b;
  margin-bottom: 2px;
}
#view-crm-hub .hub-ctt-3col .cust-namecard-preview {
  gap: 6px;
  min-height: 0;
  overflow: hidden;
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
}
#view-crm-hub .hub-ctt-3col .cust-namecard-preview img {
  width: 100%;
  flex: 1 1 auto;
  height: 0;
  max-height: none;
  min-height: 0;
  aspect-ratio: auto;
  object-fit: contain;
  object-position: center;
  border-radius: 0;
  background: #fff;
  border: 1px solid #e2e8f0;
  display: block;
}
#view-crm-hub .hub-ctt-3col .nc-slot-actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  flex: 0 0 auto;
}
#view-crm-hub .hub-ctt-3col .nc-ocr-status {
  flex: 0 0 auto;
  margin-top: 2px;
  padding: 6px 8px;
  border-radius: 0;
  font-size: 11px;
  line-height: 1.35;
  color: #0f766e;
  background: #ecfdf5;
  border: 1px solid #a7f3d0;
  word-break: break-word;
}
#view-crm-hub .hub-ctt-3col .nc-ocr-status.is-busy {
  color: #0369a1;
  background: #e0f2fe;
  border-color: #7dd3fc;
}
#view-crm-hub .hub-ctt-3col .nc-ocr-status.is-err {
  color: #b45309;
  background: #fffbeb;
  border-color: #fcd34d;
}
#view-crm-hub .hub-ctt-3col .nc-ocr-status.is-ok {
  color: #047857;
}
@media (max-width: 900px) {
  #view-crm-hub .hub-ctt-3col {
    grid-template-columns: 1fr;
  }
}

/* CRM Hub · 联系人：每人一块完整表单分区 */
#view-crm-hub .hub-ctt-form-stack {
  display: flex;
  flex-direction: column;
  gap: 12px;
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  padding: 2px 2px 10px;
}
#view-crm-hub .hub-ctt-form-stack .hub-ctt-form-block {
  flex: 0 0 auto;
  margin: 0;
}
#view-crm-hub .hub-ctt-form-stack .hub-ctt-form-block.is-active {
  border-color: #14b8a6;
  box-shadow: 0 0 0 2px rgba(20, 184, 166, 0.18);
}
#view-crm-hub .hub-ctt-form-actions {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-left: auto;
}
#view-crm-hub .hub-ctt-form-actions .danger-text {
  color: #b91c1c;
}
#view-crm-hub .hub-ctt-basic-title {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
#view-crm-hub .hub-contact-empty {
  padding: 28px 16px;
  text-align: center;
  color: #94a3b8;
  font-size: 13px;
  border: 1px dashed #cbd5e1;
  border-radius: 0;
  background: #f8fafc;
}
@media (max-width: 720px) {
  .hub-basic-grid { grid-template-columns: 1fr; }
}
.hub-list { margin-bottom: 12px; max-height: 240px; overflow: auto; }
.hub-list-orders { max-height: min(560px, 58vh); }
.hub-hint {
  flex: 1;
  font-size: 12px;
  color: #5f6368;
  min-width: 0;
}
.hub-list table { width: 100%; border-collapse: collapse; font-size: 12px; }
.hub-list th, .hub-list td {
  border-bottom: 1px solid #e8eaed;
  padding: 6px 8px;
  text-align: left;
}
.hub-list th { background: #f3f4f6; color: #374151; font-weight: 600; }
.hub-list tr { cursor: pointer; }
.hub-list tr:hover { background: #f0fdfa; }
.hub-list tr.active,
.hub-list tr.selected { background: #99f6e4; }
.hub-form .form-grid-5 { margin-top: 4px; }
.hub-form textarea {
  width: 100%;
  min-height: 52px;
  resize: vertical;
  font: inherit;
  padding: 6px 8px;
  border: 1px solid #d7e5e3;
  border-radius: 0;
  box-sizing: border-box;
  background: #f8fffe;
  color: #002FA7;
}
.hub-form textarea:focus {
  outline: none;
  border-color: #14b8a6;
  background: #fff;
  box-shadow: 0 0 0 3px rgba(45, 212, 191, 0.2);
}
.hub-inline-error {
  margin: 0 0 8px;
  padding: 6px 10px;
}
.hub-form .section-title {
  font-size: 13px;
  margin-bottom: 8px;
  color: var(--primary-dark);
}
.quote-lines { width: 100%; border-collapse: collapse; font-size: 12px; margin-top: 0; }
.quote-lines th, .quote-lines td { border: 1px solid #e8eaed; padding: 4px; vertical-align: top; }
.quote-lines input, .quote-lines select, .quote-lines textarea {
  width: 100%;
  border: 1px solid #e8eaed;
  border-radius: 0;
  padding: 4px 6px;
  font-size: 12px;
  font-family: inherit;
  box-sizing: border-box;
}
.quote-lines textarea { min-height: 56px; resize: vertical; }

/* 报价弹窗 · 对标《中文/英文价格表》Excel；须高于 CRM Hub(2500)，同跟进弹窗 */
#view-hub-quo-form {
  z-index: 2800;
  --pl-line: #111;
  --pl-border: 1px solid var(--pl-line);
}
#view-hub-quo-form .hub-quo-form-card {
  width: min(1600px, 100%) !important;
  height: min(900px, 94vh) !important;
  max-height: min(900px, 94vh) !important;
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
}
#view-hub-quo-form .hub-quo-form-body {
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 10px 14px 12px;
  background: #e7e5e4;
}
/* 报价单弹窗底部栏已移除（qhead2）：导出/取消/保存/删除 全部上移到 .modal-head（「关闭」左侧），
   导出菜单随之改为在头部向下弹出（见下方 #view-hub-quo-form .hq-export-menu） */
/* 报价单弹窗：「＋ 加行 / ＋ 追加产品」从底部字段行上移到头部，「关闭」左侧（cphead1） */
#view-hub-quo-form.mf-desk .modal-head .tb-btn {
  height: 26px;
  padding: 0 10px;
  font-size: 12px;
  line-height: 1;
  display: inline-flex;
  align-items: center;
}
#view-hub-quo-form.mf-desk .modal-head .modal-head-actions [hidden] { display: none !important; }
/* crm10/ctool1 续：Hub / 编辑跟进 / 合同 三个弹窗底部栏按钮上移头部（与报价单 #view-hub-quo-form 同款），底部不再放按钮 */
#view-crm-hub.mf-desk .modal-head .tb-btn,
#view-hub-act-form.mf-desk .modal-head .tb-btn,
#view-hub-ct-form.mf-desk .modal-head .tb-btn {
  height: 26px;
  padding: 0 10px;
  font-size: 12px;
  line-height: 1;
  display: inline-flex;
  align-items: center;
}
#view-crm-hub.mf-desk .modal-head .modal-head-actions [hidden],
#view-hub-act-form.mf-desk .modal-head .modal-head-actions [hidden],
#view-hub-ct-form.mf-desk .modal-head .modal-head-actions [hidden] { display: none !important; }
/* cfhead1（2026-10-09 用户「红框按钮移到标题栏 关闭 按钮左侧显示」）：编辑客户弹窗底部按钮上移头部 */
#view-cust-form.mf-desk .modal-head .tb-btn {
  height: 26px;
  padding: 0 10px;
  font-size: 12px;
  line-height: 1;
  display: inline-flex;
  align-items: center;
}
#view-cust-form.mf-desk .modal-head .modal-head-actions [hidden] { display: none !important; }
#view-hub-quo-form .hq-export-wrap {
  position: relative;
}
/* ctexp2（2026-10-09 用户「选中记录弹窗需要导出功能」）：导出菜单样式扩展到合同弹窗 */
#view-hub-ct-form .hq-export-wrap,
#view-hub-quo-form .hq-export-wrap {
  position: relative;
}
#view-hub-ct-form .hq-export-menu,
#view-hub-quo-form .hq-export-menu {
  position: absolute;
  right: 0;
  top: calc(100% + 6px);
  bottom: auto;
  min-width: 128px;
  padding: 4px;
  background: #fff;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.14);
  z-index: 120;
}
#view-hub-ct-form .hq-export-menu button,
#view-hub-quo-form .hq-export-menu button {
  display: block;
  width: 100%;
  text-align: left;
  padding: 8px 12px;
  border: none !important;
  background: transparent !important;
  border-radius: 0;
  cursor: pointer;
  font-size: 13px;
  color: #0f172a !important;
}
#view-hub-ct-form .hq-export-menu button:hover,
#view-hub-quo-form .hq-export-menu button:hover {
  background: #e6f4f2 !important;
  color: var(--primary-dark) !important;
}
/* 合同导出态：隐藏「删」按钮与图片清除钮（截图不含交互元素） */
#view-hub-ct-form.hq-exporting .ss-rm-line,
#view-hub-ct-form.hq-exporting .pl-img-clear {
  display: none !important;
}
#view-hub-quo-form.hq-exporting .ss-rm-line,
#view-hub-quo-form.hq-exporting .pl-img-clear,
#view-hub-quo-form.hq-exporting .pl-pick-prod,
#view-hub-quo-form.hq-exporting #btn-hub-quo-add-line {
  display: none !important;
}
/* 导出截图时去掉编辑态虚线框，版式与屏幕纸面/Excel 一致 */
#view-hub-quo-form.hq-exporting .pl-img-drop {
  border: none !important;
  background: transparent !important;
  border-radius: 0;
  cursor: default;
  min-height: 0;
  padding: 0;
}
#view-hub-quo-form.hq-exporting .pl-img-drop .pl-img-empty {
  display: none !important;
}
#view-hub-quo-form.hq-exporting .pl-date-inline input[type="date"] {
  border: none !important;
  border-bottom: none !important;
  background: transparent !important;
  color: #000 !important;
  -webkit-appearance: none;
  appearance: none;
}
#view-hub-quo-form.hq-exporting .pl-doc input,
#view-hub-quo-form.hq-exporting .pl-doc textarea {
  border: none !important;
  background: transparent !important;
  box-shadow: none !important;
  color: #000 !important;
  overflow: hidden;
}
#view-hq-product-pick {
  z-index: 3000;
}
#view-hq-product-pick .hq-pick-card {
  width: min(1100px, 100%);
  max-height: min(90vh, 900px);
}
#view-hq-product-pick .hq-pick-body {
  display: flex;
  flex-direction: column;
  min-height: 0;
  flex: 1;
}
.hq-pick-toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  align-items: center;
  margin-bottom: 10px;
  flex: 0 0 auto;
}
.hq-pick-toolbar input {
  flex: 1 1 220px;
  min-width: 160px;
  height: 34px;
  padding: 0 10px;
  border: 1px solid #d6d3d1;
  border-radius: 0;
  font-size: 13px;
}
.hq-pick-hint {
  font-size: 12px;
  color: #78716c;
}
#hq-pick-list.hq-pick-list {
  flex: 1 1 auto;
  min-height: 240px;
  max-height: min(58vh, 520px);
  overflow: auto;
}
#hq-pick-list .data-table tbody tr {
  cursor: pointer;
}
#hq-pick-list .data-table tbody tr:hover {
  background: #f0f9ff;
}
.pl-model-cell {
  position: relative;
  padding: 2px !important;
}
.pl-model-cell .pl-model-wrap {
  display: flex;
  align-items: stretch;
  gap: 2px;
  min-height: 100%;
}
.pl-model-cell input {
  flex: 1 1 auto;
  min-width: 0;
  width: 100%;
}
.pl-pick-prod {
  flex: 0 0 auto;
  align-self: center;
  width: 22px;
  height: 22px;
  padding: 0;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  background: #f8fafc;
  color: #334155;
  font-size: 12px;
  line-height: 20px;
  cursor: pointer;
}
.pl-pick-prod:hover {
  background: #e0f2fe;
  border-color: #7dd3fc;
  color: #0369a1;
}
#view-hub-quo-form.hq-exporting .pl-img-drop {
  border: none !important;
  background: #fff !important;
  min-height: 0;
  cursor: default;
}
#view-hub-quo-form.hq-exporting .pl-img-drop .pl-img-empty {
  color: #a8a29e;
}
.pl-sys-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 12px;
  margin-bottom: 10px;
  padding: 8px 10px;
  background: #fff;
  border: 1px solid #d6d3d1;
  font-size: 12px;
  color: #57534e;
}
.pl-sys-row label {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  white-space: nowrap;
}
/* 字段行与纸面左右对齐（qrow1）：.pl-paper 有 max-width:1520px + 居中，宽屏时纸面收窄居中，
   字段行不加约束会超出纸面 → 同 max-width + 居中，二者左右边缘对齐 */
#view-hub-quo-form .pl-sys-row {
  max-width: 1520px;
  margin-left: auto;
  margin-right: auto;
}
/* 模块级一次性提示条（qtax2：新增报价跳产品明细引导） */
.mf-mod-hint {
  background: #fef3c7;
  color: #92400e;
  border: 1px solid #f59e0b;
  padding: 6px 10px;
  margin: 0 14px 8px;
  font-size: 12px;
}
.mf-mod-hint[hidden] { display: none !important; }
.pl-sys-row input,
.pl-sys-row select {
  height: 28px;
  border: 1px solid #d6d3d1;
  border-radius: 0;
  padding: 0 8px;
  font-size: 12px;
  background: #fff;
  min-width: 88px;
}
.pl-sys-grow { flex: 1 1 180px; min-width: 160px; }
.pl-sys-grow input { flex: 1; width: 100%; min-width: 120px; }
/* 报价单弹窗内「客户」下拉（独立模式：从「产品明细」生成报价时显示） */
#hq-cust-wrap { font-weight: 600; color: #b45309; }
#hq-cust-wrap select { min-width: 200px; max-width: 320px; border-color: #f59e0b; }
#hq-cust-wrap .hq-req { color: #dc2626; }
/* 字段行内 label 的 [hidden] 兜底：.pl-sys-row label 为 inline-flex，会盖掉原生 [hidden]
   （用于「客户」下拉与「语言」下拉按模式隐藏——语言跟随来源页签自动带入，qulang1） */
#view-hub-quo-form .pl-sys-row label[hidden] { display: none !important; }
/* 「计价」单选（qtax5/qtax6/qtax7）：上方 .pl-sys-row input 的 height:28px + min-width:88px 会把
   radio 撑成大圆 → 压回 13px 原生小圆点；浅底分段框与相邻输入框区隔，radio+文字 成对紧凑 */
#hq-tax-wrap {
  color: #57534e;
  background: #faf9f8;
  border: 1px solid #e7e5e4;
  padding: 5px 10px;
  gap: 10px;
}
#hq-tax-wrap .hq-tax-opt { display: inline-flex; align-items: center; gap: 3px; }
#hq-tax-wrap input[type="radio"] {
  width: 13px;
  height: 13px;
  min-width: 0;
  padding: 0;
  margin: 0;
  accent-color: #2563eb;
  flex: 0 0 auto;
}
/* 字段行两行左缘对齐（qtax8）：第一行「客户」与第二行「备注」堆叠，标签文字定宽后
   两行输入框左缘对齐；「电话」加 pl-sys-grow 弹性撑满 → 右缘与「备注」/纸面对齐 */
#view-hub-quo-form .pl-sys-row .hq-lab-w { display: inline-block; width: 36px; }
/* qhead1（2026-10-08 用户）：报价单弹窗头部「报价单号 / 有效期」输入框过宽
   （内容仅 11 字符 BJ_YYYYMMDD / 「30天」），收缩到贴合内容；省下的宽度让给「客户」下拉
   （客户名长，常被 … 截断）。离线真实 CSS 实测：报价单号内容 74px → 框 100px；
   有效期占位「30天 / 1 month」87px → 框 108px；客户下拉 max-width 320 → 440px，
   使最长客户名（文本约 372px + 下拉箭头/内边距）可完整显示。 */
#view-hub-quo-form #hq-no { width: 100px; min-width: 0; }
#view-hub-quo-form #hq-valid { width: 108px; min-width: 0; }
#view-hub-quo-form #hq-cust-wrap select { min-width: 200px; max-width: 440px; }
.pl-paper {
  position: relative;
  background: #fff;
  padding: 8px 10px 16px;
  max-width: 1520px;
  margin: 0 auto;
  color: #000;
  font-family: "SimSun", "Songti SC", "Noto Serif SC", serif;
  font-size: 12px;
}
.pl-doc {
  width: 100%;
  border-collapse: collapse;
  table-layout: fixed;
  border: var(--pl-border);
}
.pl-doc th,
.pl-doc td {
  border: var(--pl-border);
  padding: 3px 4px;
  vertical-align: middle;
  text-align: center;
  word-break: break-word;
}
.pl-col-a { width: 3.5%; }
.pl-col-b { width: 6%; }
.pl-col-c { width: 8.6%; }
.pl-col-d { width: 15%; }
.pl-col-e { width: 14.7%; }
.pl-col-f { width: 17.2%; }
.pl-col-g { width: 14%; }
.pl-col-h { width: 5.2%; }
.pl-col-i { width: 7.8%; }
.pl-col-j { width: 8%; }
/* 表头对标 Excel：左侧 Logo(含 ISO/BSCI) + 双公司居中 */
.pl-r1 td {
  height: 95px;
  padding: 6px 10px;
  vertical-align: middle;
  text-align: left;
}
.pl-head-banner {
  display: flex;
  align-items: center;
  gap: 14px;
  min-height: 88px;
}
.pl-logo-left {
  flex: 0 0 auto;
  width: 148px;
  height: auto;
  max-height: 96px;
  object-fit: contain;
  object-position: left center;
}
.pl-co-twin {
  flex: 1 1 auto;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 6px 28px;
  align-items: center;
  font-size: 20px;
  font-weight: 700;
  line-height: 1.3;
  text-align: center;
  white-space: pre-line;
}
.pl-co-twin .pl-co-sub {
  margin-top: 4px;
  font-size: 11px;
  font-weight: 400;
  line-height: 1.4;
}
/* quoent1（2026-10-20 公司主体二选一）：只剩一家公司时占满整行并居中，
   不再挤在网格左半栏（英文抬头自带 inline text-align:left，优先级更高不受影响） */
.pl-co-twin > div:only-child {
  grid-column: 1 / -1;
  text-align: center;
}
.pl-r2 td {
  height: 27px;
  font-size: 12px;
  font-family: Arial, "SimSun", sans-serif;
  text-align: center;
  letter-spacing: 0.02em;
}
.pl-date-inline {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: normal;
  white-space: nowrap;
  max-width: none;
}
.pl-date-inline .pl-date-prefix {
  white-space: nowrap;
  word-break: keep-all;
  flex-shrink: 0;
}
.pl-date-inline input[type="date"] {
  height: 24px;
  border: none;
  border-bottom: 1px solid #000;
  border-radius: 0;
  padding: 0 4px;
  font-size: 12px;
  font-family: inherit;
  background: transparent;
  flex-shrink: 0;
  width: auto;
  min-width: 9.5em;
  -webkit-appearance: none;
  -moz-appearance: textfield;
  appearance: none;
}
.pl-date-inline input[type="date"]::-webkit-calendar-picker-indicator {
  display: none;
}
.pl-r4 td {
  height: 49px;
  font-size: 24px;
  font-weight: 700;
  letter-spacing: 0.35em;
  text-align: center;
  color: #0000ff;
}
.pl-cell-title .pl-title-row {
  display: flex;
  align-items: center;
}
.pl-cell-title .pl-title-row #hq-doc-title {
  flex: 1;
  text-align: center;
  /* ⚠️ 必须 !important：全局字体锁（10456-10469）对 span 标签级 font-size/font-weight 12px/400 !important，
     弹窗移挂在 body 下时 #app * 不命中但 span 标签锁仍命中，不加会被压回 12px（qrow1 量到 fs=12px） */
  font-size: 24px !important;
  font-weight: 700 !important;
  letter-spacing: 0.35em;
  color: #0000ff;
}
.pl-cell-title .pl-title-row .pl-date-inline {
  flex: 0 0 auto;
}
.pl-r5 th {
  height: 45px;
  font-weight: 700;
  font-size: 12px;
  background: #fff;
  vertical-align: middle;
}
.pl-line-row td { min-height: 220px; height: auto; vertical-align: middle; position: relative; }
.pl-doc input,
.pl-doc textarea {
  width: 100%;
  border: none;
  background: transparent;
  font-size: 11px;
  font-family: inherit;
  line-height: 1.35;
  box-sizing: border-box;
  resize: none;
  text-align: left;
  outline: none;
  vertical-align: middle;
}
.pl-doc input { text-align: center; padding: 2px; }
.pl-doc textarea {
  min-height: 120px;
  height: auto;
  padding: 4px;
  overflow: hidden;
  display: block;
  field-sizing: content;
}
/* 产品描述 / 包装资料：对标 Excel — 左对齐、顶对齐、逐行换行 */
.pl-line-row td.pl-desc-cell,
.pl-line-row td.pl-pack-cell {
  vertical-align: top !important;
  text-align: left;
}
.pl-line-row td.pl-desc-cell textarea,
.pl-line-row td.pl-pack-cell textarea {
  text-align: left;
  white-space: pre-wrap;
  word-break: break-word;
  line-height: 1.35;
  font-size: 11px;
  padding: 2px 4px;
  vertical-align: top;
}
/* 导出 PDF/图片：短字段垂直居中；描述/包装顶对齐 + pre-wrap 文本块 */
#view-hub-quo-form.hq-exporting .pl-line-row td {
  vertical-align: middle !important;
}
#view-hub-quo-form.hq-exporting .pl-line-row td.pl-desc-cell,
#view-hub-quo-form.hq-exporting .pl-line-row td.pl-pack-cell {
  vertical-align: top !important;
}
#view-hub-quo-form.hq-exporting .pl-model-wrap {
  min-height: 0 !important;
  height: auto !important;
  align-items: center !important;
}
#view-hub-quo-form.hq-exporting .pl-line-row td > input,
#view-hub-quo-form.hq-exporting .pl-model-cell input {
  height: auto !important;
  min-height: 0 !important;
  align-self: center;
}
#view-hub-quo-form.hq-exporting .pl-export-text {
  display: block;
  width: 100%;
  box-sizing: border-box;
  margin: 0;
  padding: 2px 4px;
  font-size: 11px;
  line-height: 1.35;
  font-family: inherit;
  color: #000;
  text-align: left;
  white-space: pre-wrap;
  word-break: break-word;
  overflow: visible;
}
.pl-img-cell {
  padding: 4px !important;
  background: #fff;
  vertical-align: middle !important;
}
.pl-img-cell img {
  display: block;
  max-width: 100%;
  max-height: 200px;
  margin: 0 auto;
  object-fit: contain;
}
.pl-img-empty { color: #a8a29e; }
#view-hub-quo-form .pl-img-drop {
  position: relative;
  min-height: 120px;
  border: 1.5px dashed #cbd5e1;
  border-radius: 0;
  background: #f8fafc;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 4px;
  box-sizing: border-box;
  outline: none;
  transition: border-color 0.15s, background 0.15s;
}
#view-hub-quo-form .pl-img-drop:hover,
#view-hub-quo-form .pl-img-drop.is-drag {
  border-color: #0d9488;
  background: #f0fdfa;
}
#view-hub-quo-form .pl-img-drop img {
  max-height: 180px;
}
#view-hub-quo-form .pl-img-drop .pl-img-empty {
  color: #0d9488;
  font-size: 12px;
  text-align: center;
  line-height: 1.35;
  padding: 0 6px;
  pointer-events: none;
}
#view-hub-quo-form .pl-img-clear {
  position: absolute;
  right: 4px;
  bottom: 4px;
  z-index: 2;
  border: 0;
  background: rgba(255, 255, 255, 0.92);
  color: #b91c1c;
  font-size: 11px;
  padding: 2px 6px;
  border-radius: 0;
  cursor: pointer;
}
#view-hub-quo-form .pl-img-drop[data-readonly="1"] {
  cursor: default;
  border-style: solid;
  border-color: #e7e5e4;
  background: #fff;
}
.pl-total {
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  vertical-align: middle !important;
}
/* 行删按钮与样品申请表统一：link-btn danger ss-rm-line「删」 */
.pl-line-row .pl-idx-cell {
  position: relative;
  padding-right: 28px !important;
}
.pl-line-row:hover .ss-rm-line,
.pl-idx-cell:hover .ss-rm-line {
  opacity: 1;
  pointer-events: auto;
}

/* 产品明细 / 报价选用：行随内容增高；单元格垂直居中；图/长文本完整显示 */
#crm-product-list .data-table tbody tr,
#hq-pick-list .data-table tbody tr {
  height: auto;
  min-height: 120px;
}
#crm-product-list .data-table td,
#hq-pick-list .data-table td {
  max-width: none !important;
  white-space: normal !important;
  overflow: visible !important;
  text-overflow: clip !important;
  vertical-align: middle !important;
}
#crm-product-list .data-table td[data-col="产品图片"],
#crm-product-list .data-table td[data-col="包装图片"],
#hq-pick-list .data-table td[data-col="产品图片"],
#hq-pick-list .data-table td[data-col="包装图片"] {
  height: auto;
  min-height: 120px;
  padding: 6px !important;
  vertical-align: middle !important;
  overflow: hidden !important;
}
#crm-product-list img.cp-thumb,
#hq-pick-list img.cp-thumb {
  display: block;
  width: 100%;
  height: auto;
  max-height: 220px;
  max-width: none;
  margin: 0 auto;
  object-fit: contain;
  object-position: center;
}
#crm-product-list .data-table td[data-col="产品名称"],
#crm-product-list .data-table td[data-col="产品描述"],
#crm-product-list .data-table td[data-col="包装资料"],
#hq-pick-list .data-table td[data-col="产品名称"],
#hq-pick-list .data-table td[data-col="产品描述"],
#hq-pick-list .data-table td[data-col="包装资料"] {
  text-align: left;
  vertical-align: middle !important;
  padding-top: 8px;
  padding-bottom: 8px;
}
#crm-product-list .cp-cell-full,
#hq-pick-list .cp-cell-full {
  display: block;
  white-space: pre-wrap !important;
  word-break: break-word;
  overflow-wrap: anywhere;
  line-height: 1.45;
  text-align: left;
  overflow: visible !important;
}

/* 产品明细编辑弹窗：基本信息 → 双图 → 双栏文案 */
#view-crm-product-form {
  z-index: 2800;
}
#view-crm-product-form .cp-form-card {
  width: min(920px, 100%) !important;
  max-width: min(920px, 100%) !important;
  max-height: min(92vh, 860px);
  display: flex;
  flex-direction: column;
}
#view-crm-product-form .cp-form-body {
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 12px 18px 10px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
#view-crm-product-form .cp-form-sec {
  margin: 0;
  padding: 0;
  border: 0;
}
#view-crm-product-form .cp-form-sec-title {
  font-size: 12px;
  font-weight: 600;
  color: #64748b;
  letter-spacing: 0.02em;
  margin: 0 0 8px;
  padding-bottom: 6px;
  border-bottom: 1px solid #e2e8f0;
}
#view-crm-product-form .cp-form-grid {
  display: grid;
  gap: 10px 12px;
  align-items: start;
}
#view-crm-product-form .cp-form-grid-basic {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}
#view-crm-product-form .cp-form-grid-media,
#view-crm-product-form .cp-form-grid-text {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}
#view-crm-product-form .cp-field {
  display: flex;
  flex-direction: column;
  gap: 5px;
  font-size: 12px;
  color: #475569;
  font-weight: 500;
  min-width: 0;
}
#view-crm-product-form .cp-field-lab {
  font-size: 12px;
  color: #475569;
  font-weight: 500;
}
#view-crm-product-form .cp-field-full {
  grid-column: 1 / -1;
}
#view-crm-product-form .cp-field input,
#view-crm-product-form .cp-field select,
#view-crm-product-form .cp-field textarea {
  width: 100%;
  box-sizing: border-box;
  border: 1px solid #d1d5db;
  border-radius: 0;
  padding: 7px 10px;
  font-size: 13px;
  font-family: inherit;
  color: #0f172a;
  background: #fff;
  min-height: 36px;
}
#view-crm-product-form .cp-field input:focus,
#view-crm-product-form .cp-field select:focus,
#view-crm-product-form .cp-field textarea:focus {
  outline: none;
  border-color: #0d9488;
  box-shadow: 0 0 0 2px rgba(13, 148, 136, 0.15);
}
#view-crm-product-form .cp-field textarea {
  min-height: 168px;
  height: 168px;
  resize: vertical;
  line-height: 1.45;
  white-space: pre-wrap;
}
#view-crm-product-form .cp-img-drop {
  position: relative;
  border: 1.5px dashed #94a3b8;
  border-radius: 0;
  background: #f8fafc;
  cursor: pointer;
  outline: none;
  transition: border-color 0.15s, background 0.15s;
}
#view-crm-product-form .cp-img-drop:hover,
#view-crm-product-form .cp-img-drop.is-drag {
  border-color: #0d9488;
  background: #f0fdfa;
}
#view-crm-product-form .cp-img-drop:focus-visible {
  box-shadow: 0 0 0 2px rgba(13, 148, 136, 0.25);
}
#view-crm-product-form .cp-img-box {
  height: 148px;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  padding: 8px;
  box-sizing: border-box;
}
#view-crm-product-form .cp-img-box img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  display: block;
}
#view-crm-product-form .cp-img-box .pl-img-empty {
  color: #0d9488;
  font-size: 12px;
  text-align: center;
  line-height: 1.4;
  padding: 0 8px;
}
#view-crm-product-form .cp-img-clear {
  position: absolute;
  right: 6px;
  bottom: 6px;
  border: 0;
  background: rgba(255, 255, 255, 0.92);
  color: #b91c1c;
  font-size: 11px;
  padding: 2px 8px;
  border-radius: 0;
  cursor: pointer;
  z-index: 2;
}
#view-crm-product-form .cp-img-clear[hidden] {
  display: none !important;
}
#view-crm-product-form #crm-product-form-error {
  margin: 0;
}
@media (max-width: 720px) {
  #view-crm-product-form .cp-form-grid-basic {
    grid-template-columns: 1fr 1fr;
  }
  #view-crm-product-form .cp-form-grid-media,
  #view-crm-product-form .cp-form-grid-text {
    grid-template-columns: 1fr;
  }
  #view-crm-product-form .cp-field-full {
    grid-column: 1 / -1;
  }
}

.pl-rem-row td {
  text-align: left !important;
  vertical-align: middle;
  height: 34px;
  padding: 4px 8px;
  font-size: 12px;
  line-height: 1.45;
  white-space: pre-line;
}
.pl-rem-row.pl-rem-title-row td { height: 36px; font-weight: 700; }
/* 银行信息：名称 / 账号 / 开户行 分 3 行左对齐 */
.pl-rem-row.pl-bank-row td {
  height: 91px;
  vertical-align: middle;
  font-family: Arial, "SimSun", sans-serif;
  font-size: 14px;
  line-height: 1.55;
  padding: 8px 12px;
  white-space: normal;
  text-align: left !important;
}
.pl-bank-block {
  white-space: pre-line;
  line-height: 1.55;
  text-align: left;
}
/* 可编辑时不改版式：无边框/底色，仅允许光标 */
#hq-remarks-body [contenteditable="true"],
#hq-sign-body [contenteditable="true"] {
  outline: none;
  cursor: text;
  -webkit-user-modify: read-write-plaintext-only;
}
#hq-remarks-body [contenteditable="true"]:focus,
#hq-sign-body [contenteditable="true"]:focus {
  outline: none;
  background: transparent;
}
.pl-sign-gap td { height: 18px; border-left: none; border-right: none; }
.pl-sign-lab-row td {
  height: 19px;
  text-align: left !important;
  font-weight: 700;
  border-top: none;
  vertical-align: top;
  padding: 4px 8px;
}
.pl-sign-name-row td {
  height: 20px;
  text-align: left !important;
  border-top: none;
  padding: 4px 8px 10px;
}
@media (max-width: 1100px) {
  .form-grid-5 {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}
@media (max-width: 860px) {
  .form-grid-3 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .form-grid-5 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .modal-title-wrap {
    flex-wrap: wrap;
  }
}
@media (max-width: 560px) {
  .form-grid-3 {
    grid-template-columns: 1fr;
  }
  .form-grid-3 .field > span {
    flex-basis: 4.5em;
  }
  .form-grid-5 {
    grid-template-columns: 1fr;
  }
  .head-code-field > input {
    width: 140px;
  }
}
.form-section.flat {
  border: none;
  padding: 0;
  margin: 0;
  background: transparent;
}
#view-form .form-footer,
#view-user-form .form-footer,
#view-perm .form-footer {
  display: none;
}
.modal-foot .btn,
.modal-foot .tb-btn,
.modal-foot button {
  -webkit-appearance: none;
  appearance: none;
  min-width: auto;
  border: none !important;
  background: transparent !important;
  color: var(--primary-dark) !important;
  box-shadow: none !important;
  font-weight: 500;
  padding: 6px 12px;
  border-radius: 0;
  font-size: 12px;
}
.modal-foot .btn:hover,
.modal-foot .tb-btn:hover,
.modal-foot button:hover {
  background: #e6f4f2 !important;
  color: var(--primary-dark) !important;
}
.modal-foot .btn:active,
.modal-foot .tb-btn:active,
.modal-foot button:active {
  background: #ccfbf1 !important;
}
.modal-foot .danger-text,
.modal-foot .danger-text:hover {
  color: var(--danger) !important;
}

.modal-head, .modal-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 12px 14px;
  border-bottom: 1px solid var(--border);
}
.modal-foot {
  border-bottom: none;
  border-top: 1px solid var(--border);
  justify-content: flex-end;
}
.modal-title { font-weight: 700; }
.modal-body {
  padding: 10px 14px;
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
}
.modal .col-check,
.col-set-body .col-check {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 0;
  font-size: 12px;
}
/* 显/隐列设置弹窗：对齐国桉康 gak-desk 桌面壳（4px 圆角 + 浅灰边框 + 阴影） */
.modal.mf-desk .modal-card-desk {
  border-radius: 0;
  border: 1px solid #DADCE0;
  box-shadow: 0 8px 28px rgba(32, 33, 36, 0.28);
  overflow: hidden;
  background: #fff;
}
.modal.mf-desk .modal-card-desk-md {
  width: min(720px, 100%);
  height: auto;
  max-height: min(80vh, 720px);
}
.modal-card-cols {
  width: min(720px, 100%);
  max-height: min(80vh, 720px);
}
/* —— AI 助手弹窗（DeepSeek-V4-Flash） —— */
.modal.mf-desk .ai-assist-card {
  width: min(720px, 100%);
  height: min(76vh, 620px);
  display: flex;
  flex-direction: column;
  background: #fff;
  position: relative;
}
.ai-assist-card .ai-assist-resizer {
  position: absolute;
  right: 0;
  bottom: 0;
  width: 16px;
  height: 16px;
  cursor: nwse-resize;
  background: linear-gradient(135deg, transparent 50%, #94a3b8 50%, #94a3b8 58%, transparent 58%);
  opacity: 0.55;
  z-index: 6;
}
.ai-assist-card .ai-assist-resizer:hover {
  opacity: 1;
}
.ai-assist-body {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-height: 0;
  padding: 10px 14px;
}
.ai-assist-messages {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 4px 2px;
}
.ai-assist-msg {
  display: flex;
  flex-direction: column;
  gap: 2px;
  max-width: 92%;
}
.ai-assist-msg.is-user { align-self: flex-end; align-items: flex-end; }
.ai-assist-msg.is-ai { align-self: flex-start; align-items: flex-start; }
.ai-assist-msg .ai-role {
  font-size: 11px;
  color: var(--muted, #64748b);
}
.ai-assist-msg .ai-assist-msg-bubble {
  padding: 8px 10px;
  border-radius: 0;
  font-size: 13px;
  line-height: 1.6;
  word-break: break-word;
}
.ai-assist-msg.is-user .ai-assist-msg-bubble {
  background: #0f766e;
  color: #fff;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble {
  background: #f1f5f9;
  color: #0f172a;
  border: 1px solid #e2e8f0;
}
.ai-assist-msg.is-ai.is-loading .ai-assist-msg-bubble {
  color: #64748b;
  font-style: italic;
}
/* AI 回复 Markdown 元素 */
.ai-assist-msg.is-ai .ai-assist-msg-bubble > *:first-child { margin-top: 0; }
.ai-assist-msg.is-ai .ai-assist-msg-bubble > *:last-child { margin-bottom: 0; }
.ai-assist-msg.is-ai .ai-assist-msg-bubble p,
.ai-assist-msg.is-ai .ai-assist-msg-bubble ul,
.ai-assist-msg.is-ai .ai-assist-msg-bubble ol,
.ai-assist-msg.is-ai .ai-assist-msg-bubble pre {
  margin: 6px 0;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble ul,
.ai-assist-msg.is-ai .ai-assist-msg-bubble ol {
  padding-left: 18px;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble li {
  margin: 2px 0;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble h1,
.ai-assist-msg.is-ai .ai-assist-msg-bubble h2,
.ai-assist-msg.is-ai .ai-assist-msg-bubble h3,
.ai-assist-msg.is-ai .ai-assist-msg-bubble h4 {
  margin: 8px 0 4px;
  font-size: 14px;
  line-height: 1.4;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble h1 { font-size: 15px; }
.ai-assist-msg.is-ai .ai-assist-msg-bubble table {
  width: 100%;
  border-collapse: collapse;
  margin: 6px 0;
  font-size: 12px;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble th,
.ai-assist-msg.is-ai .ai-assist-msg-bubble td {
  border: 1px solid #e2e8f0;
  padding: 4px 6px;
  text-align: left;
  vertical-align: top;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble th {
  background: #e2e8f0;
  font-weight: 600;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble tr:nth-child(even) td {
  background: #f8fafc;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble code {
  background: #e2e8f0;
  border-radius: 0;
  padding: 1px 4px;
  font-size: 12px;
  font-family: Consolas, Monaco, monospace;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble pre {
  background: #0f172a;
  color: #e2e8f0;
  border-radius: 0;
  padding: 8px 10px;
  overflow-x: auto;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble pre code {
  background: transparent;
  color: inherit;
  padding: 0;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble hr {
  border: none;
  border-top: 1px solid #e2e8f0;
  margin: 8px 0;
}
/* 覆盖全局 font-weight:400!important 锁，保留 AI 回复内 Markdown 强调语义 */
#app .ai-assist-msg-bubble strong,
#app .ai-assist-msg-bubble b {
  font-weight: 700 !important;
}
#app .ai-assist-msg-bubble th {
  font-weight: 600 !important;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble .ai-table-export {
  display: inline-block;
  margin: 4px 0 0;
  padding: 2px 12px;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  background: #f8fafc;
  color: #0f766e;
  font-size: 12px;
  cursor: pointer;
}
.ai-assist-msg.is-ai .ai-assist-msg-bubble .ai-table-export:hover {
  background: #e2e8f0;
}
.ai-assist-composer {
  display: flex;
  flex-direction: column;
  gap: 8px;
  border-top: 1px solid var(--border, #e2e8f0);
  padding-top: 10px;
}
.ai-assist-composer textarea {
  width: 100%;
  box-sizing: border-box;
  resize: vertical;
  min-height: 64px;
  max-height: 160px;
  padding: 8px 10px;
  border: 1px solid var(--border, #e2e8f0);
  border-radius: 0;
  font-family: inherit;
  font-size: 13px;
  line-height: 1.5;
  outline: none;
}
.ai-assist-composer textarea:focus {
  border-color: #0f766e;
}
.ai-assist-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 8px;
}
.col-set-body {
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-height: 0;
}
.col-set-ops {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
}
.col-set-width-lab {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--muted, #64748b);
  margin-left: auto;
}
.col-set-width-lab input {
  width: 72px;
  padding: 4px 6px;
  border: 1px solid var(--border, #e2e8f0);
  border-radius: 0;
  font-size: 12px;
}
.col-set-sort {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  background: #f0fdfa;
  border: 1px solid #99f6e4;
  border-radius: 0;
}
.col-set-sort-title {
  font-size: 12px;
  font-weight: 700;
  color: #0f766e;
}
.col-set-sort-lab {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--muted, #64748b);
}
.col-set-sort select {
  min-width: 120px;
  padding: 4px 8px;
  border: 1px solid var(--border, #e2e8f0);
  border-radius: 0;
  font-size: 12px;
  background: #fff;
  color: #0f172a;
}
.col-set-sort-tip {
  font-size: 11px;
  color: #0d9488;
  margin-left: auto;
}
.col-set-table .col-set-sort-col {
  width: 88px;
  text-align: center;
}
.col-set-sort-btns {
  display: inline-flex;
  gap: 4px;
  justify-content: center;
}
.col-set-sort-btns button {
  min-width: 28px;
  padding: 2px 6px;
  font-size: 11px;
  line-height: 1.4;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  background: #fff;
  color: #64748b;
  cursor: pointer;
}
.col-set-sort-btns button:hover {
  border-color: #0d9488;
  color: #0f766e;
}
.col-set-sort-btns button.active {
  background: #0d9488;
  border-color: #0d9488;
  color: #fff;
  font-weight: 600;
}
.col-set-sort-btns button:disabled {
  opacity: 0.35;
  cursor: not-allowed;
}
.col-set-table-wrap {
  border: 1px solid var(--border, #e2e8f0);
  border-radius: 0;
  overflow: auto;
  max-height: min(48vh, 360px);
}
.col-set-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
.col-set-table th,
.col-set-table td {
  padding: 7px 10px;
  border-bottom: 1px solid #f1f5f9;
  text-align: left;
}
.col-set-table th {
  background: #f3f4f6;
  font-weight: 600;
  position: sticky;
  top: 0;
  z-index: 1;
}
.col-set-table .col-set-vis,
.col-set-table .col-set-freeze,
.col-set-table .col-set-w {
  width: 72px;
  text-align: center;
}
.col-set-table tbody tr {
  cursor: pointer;
  user-select: none;
}
.col-set-table tbody tr:hover {
  background: #f0fdfa;
}
.col-set-table tbody tr.selected {
  background: #ccfbf1;
  outline: 2px solid #0d9488;
  outline-offset: -2px;
}
.col-set-table tbody tr.dragging {
  opacity: 0.45;
}
.col-set-table tbody tr.drag-over {
  box-shadow: inset 0 2px 0 #0d9488;
}
.col-set-table tbody tr.locked {
  color: #94a3b8;
}
/* 指针拖拽排序：按住整行任意位置拖动（替代 HTML5 drag，避免文本选择抢占） */
body.col-set-dragging,
body.col-set-dragging * {
  cursor: grabbing !important;
  user-select: none !important;
}
body.col-set-dragging .col-set-table tbody tr.drag-over {
  box-shadow: inset 0 2px 0 #0d9488, inset 0 -2px 0 #0d9488;
}
.col-set-name {
  display: flex;
  align-items: center;
  gap: 8px;
  /* 触屏（手机/平板）行拖拽必须：拖拽起点在列名区（含 ⋮⋮ 手柄），
     pointerdown 时才设 touch-action 已太晚（浏览器手势判定先行） */
  touch-action: none;
}
.col-set-drag {
  color: #94a3b8;
  letter-spacing: -2px;
  cursor: grab;
  user-select: none;
  font-size: 12px;
  /* 触屏：⋮⋮ 手柄本身也禁止滚动抢占 */
  touch-action: none;
}
.col-set-table tbody tr.dragging .col-set-drag {
  cursor: grabbing;
}
.col-set-table input[type="checkbox"] {
  width: 16px;
  height: 16px;
  cursor: pointer;
}
/* 行内宽度可编辑（对齐国桉康）：每行「宽度」列直接输入，无需选中后改顶部输入框 */
.col-set-table .col-set-w input[type="number"] {
  width: 56px;
  padding: 2px 4px;
  border: 1px solid #E8EAED;
  border-radius: 0;
  font: inherit;
  font-size: 12px;
  text-align: center;
  color: #202124;
  box-sizing: border-box;
}
.col-set-table .col-set-w input[type="number"]:focus {
  border-color: #0d9488;
  outline: none;
}
.col-set-table tr.locked .col-set-w input[type="number"] {
  color: #0d9488;
  font-weight: 600;
}
.col-set-hint {
  margin: 0;
  font-size: 11px;
  color: #94a3b8;
}

.order-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 0;
  padding: 14px;
  text-align: left;
  cursor: pointer;
  width: 100%;
  color: inherit;
  font: inherit;
}
.order-card:active { background: #f0fdfa; }
.order-card .row1 {
  display: flex;
  justify-content: space-between;
  gap: 8px;
  margin-bottom: 6px;
}
.order-card .no {
  font-weight: 700;
  color: var(--primary-dark);
}
.order-card .cust { font-size: 12px; margin-bottom: 4px; }
.order-card .meta {
  font-size: 12px;
  color: var(--muted);
  display: flex;
  flex-wrap: wrap;
  gap: 8px 12px;
}

.detail-body {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 0;
  padding: 8px 4px;
}
.kv {
  display: grid;
  grid-template-columns: 96px 1fr;
  gap: 6px 10px;
  padding: 10px 12px;
  border-bottom: 1px solid #eef2f3;
  font-size: 12px;
}
.kv:last-child { border-bottom: none; }
.kv .k { color: var(--muted); }
.kv .v { word-break: break-all; }

.empty {
  text-align: center;
  color: var(--muted);
  padding: 40px 12px;
}
.empty.small { padding: 16px 8px; font-size: 12px; }

.toolbar-row { margin-bottom: 10px; }
.toolbar-row.dual {
  display: flex;
  gap: 8px;
}
.toolbar-row.dual .btn { flex: 1; }

input.masked, select:disabled {
  background: #f1f5f4;
  color: var(--muted);
}

.mes-subtabs {
  display: flex;
  gap: 2px;
  flex-shrink: 0;
  margin: 0;
  padding: 6px 12px 0;
  background: #F0F2F5;
  border-bottom: 1px solid #e8eaed;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.mes-subtabs .tab,
.mes-subtabs .mes-subtab {
  flex: 0 0 auto;
  min-width: 72px;
  padding: 8px 12px;
  border: none;
  border-radius: 0;
  background: transparent;
  color: #475569;
  cursor: pointer;
  font-size: 12px;
  font-family: inherit;
  white-space: nowrap;
}
.mes-subtabs .tab:hover,
.mes-subtabs .mes-subtab:hover {
  background: #e6f4f2;
  color: #0f766e;
}
.mes-subtabs .tab.active,
.mes-subtabs .mes-subtab.active {
  background: #fff;
  color: #0f766e;
  border-color: transparent;
  font-weight: 600;
  box-shadow: 0 -1px 0 #fff;
}
#mes-std-hours-subtabs {
  flex-wrap: wrap;
  gap: 4px 2px;
  padding-bottom: 4px;
}
#mes-std-hours-subtabs .std-proc-tab {
  min-width: 0;
  padding: 6px 10px;
  border-radius: 0;
  border: 1px solid transparent;
  border-bottom-width: 2px;
  font-size: 12px;
}
#mes-std-hours-subtabs .std-tone-weld { border-bottom-color: #0d9488; }
#mes-std-hours-subtabs .std-tone-motor { border-bottom-color: #2563eb; }
#mes-std-hours-subtabs .std-tone-laser { border-bottom-color: #7c3aed; }
#mes-std-hours-subtabs .std-tone-parts { border-bottom-color: #d97706; }
#mes-std-hours-subtabs .std-tone-assy { border-bottom-color: #059669; }
#mes-std-hours-subtabs .std-tone-aging { border-bottom-color: #e11d48; }
#mes-std-hours-subtabs .std-tone-packParts { border-bottom-color: #0891b2; }
#mes-std-hours-subtabs .std-tone-pack { border-bottom-color: #4f46e5; }
#mes-std-hours-subtabs .std-tone-extra { border-bottom-color: #64748b; }
#mes-std-hours-subtabs .std-proc-tab.active.std-tone-weld { background: #f0fdfa; color: #0f766e; }
#mes-std-hours-subtabs .std-proc-tab.active.std-tone-motor { background: #eff6ff; color: #1d4ed8; }
#mes-std-hours-subtabs .std-proc-tab.active.std-tone-laser { background: #f5f3ff; color: #6d28d9; }
#mes-std-hours-subtabs .std-proc-tab.active.std-tone-parts { background: #fffbeb; color: #b45309; }
#mes-std-hours-subtabs .std-proc-tab.active.std-tone-assy { background: #ecfdf5; color: #047857; }
#mes-std-hours-subtabs .std-proc-tab.active.std-tone-aging { background: #fff1f2; color: #be123c; }
#mes-std-hours-subtabs .std-proc-tab.active.std-tone-packParts { background: #ecfeff; color: #0e7490; }
#mes-std-hours-subtabs .std-proc-tab.active.std-tone-pack { background: #eef2ff; color: #4338ca; }
#mes-std-hours-subtabs .std-proc-tab.active.std-tone-extra { background: #f1f5f9; color: #334155; }
#mes-std-hours-table th.std-th-tone-base,
#mes-std-hours-table th.std-th-tone-extra { background: #0f766e; color: #fff; }
#mes-std-hours-table th.std-th-tone-weld { background: #0d9488; color: #fff; }
#mes-std-hours-table th.std-th-tone-motor { background: #2563eb; color: #fff; }
#mes-std-hours-table th.std-th-tone-laser { background: #7c3aed; color: #fff; }
#mes-std-hours-table th.std-th-tone-parts { background: #d97706; color: #fff; }
#mes-std-hours-table th.std-th-tone-assy { background: #059669; color: #fff; }
#mes-std-hours-table th.std-th-tone-aging { background: #e11d48; color: #fff; }
#mes-std-hours-table th.std-th-tone-packParts { background: #0891b2; color: #fff; }
#mes-std-hours-table th.std-th-tone-pack { background: #4f46e5; color: #fff; }
#mes-std-hours-table th.col-ops,
#mes-std-hours-table th[data-col="操作"] {
  background: #0d9488 !important;
  color: #fff !important;
  font-weight: 600;
  text-align: center;
}
#mes-std-hours-table td.std-td-tone-weld { background: rgba(240, 253, 250, 0.7); }
#mes-std-hours-table td.std-td-tone-motor { background: rgba(239, 246, 255, 0.7); }
#mes-std-hours-table td.std-td-tone-laser { background: rgba(245, 243, 255, 0.7); }
#mes-std-hours-table td.std-td-tone-parts { background: rgba(255, 251, 235, 0.75); }
#mes-std-hours-table td.std-td-tone-assy { background: rgba(236, 253, 245, 0.7); }
#mes-std-hours-table td.std-td-tone-aging { background: rgba(255, 241, 242, 0.7); }
#mes-std-hours-table td.std-td-tone-packParts { background: rgba(236, 254, 255, 0.7); }
#mes-std-hours-table td.std-td-tone-pack { background: rgba(238, 242, 255, 0.7); }
#mes-std-hours-table td.std-td-tone-extra { background: rgba(241, 245, 249, 0.8); }
#mes-std-hours-table tr.selected td[class*="std-td-tone-"] {
  filter: saturate(1.05);
}
.data-table col.col-sel,
.data-table th.col-sel,
.data-table td.col-sel {
  width: 44px !important;
  min-width: 44px !important;
  max-width: 44px !important;
  padding-left: 4px !important;
  padding-right: 4px !important;
  box-sizing: border-box !important;
  text-align: center;
  overflow: visible;
  text-overflow: clip;
  vertical-align: middle;
}
.data-table th.col-sel {
  background: #f3f4f6;
  color: #374151;
}
.data-table td.col-sel input[type="checkbox"],
.data-table th.col-sel input[type="checkbox"] {
  width: 16px;
  height: 16px;
  margin: 0;
  vertical-align: middle;
  cursor: pointer;
}
.mes-sch-edit {
  width: 100%;
  max-width: 100%;
  box-sizing: border-box;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  padding: 2px 4px;
  font-size: 12px;
  font-family: inherit;
  background: #fff;
  color: var(--text);
}
.mes-sch-edit:focus {
  outline: none;
  border-color: var(--primary, #0d9488);
  box-shadow: 0 0 0 2px rgba(13, 148, 136, 0.15);
}
.mes-sch-date {
  min-width: 0;
  font-variant-numeric: tabular-nums;
}
.mes-sch-num {
  text-align: center;
}
/* 排产数量列：输入框贴合单元格边框（2026-10-02） */
#mes-schedule-table td.td-sch-qty {
  padding: 0;
}
#mes-schedule-table td.td-sch-qty .mes-sch-edit {
  display: block;
  width: 100%;
  height: 100%;
  min-height: 27px;
  border: 0;
  border-radius: 0;
  background: transparent;
}
#mes-schedule-table td.td-sch-qty .mes-sch-edit:focus {
  background: #f0fdfa;
  box-shadow: inset 0 0 0 2px rgba(13, 148, 136, 0.35);
}
.mes-subpane {
  flex: 1;
  min-height: 0;
}
.mes-kpi {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding: 8px 12px;
  background: #f8fffe;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}
.mes-kpi[hidden] { display: none !important; }
.mes-kpi-card {
  min-width: 108px;
  flex: 1 1 108px;
  background: #fff;
  border: 1px solid var(--border);
  border-radius: 0;
  padding: 8px 10px;
}
.mes-kpi-label {
  font-size: 11px;
  color: var(--muted);
  margin-bottom: 2px;
}
.mes-kpi-value {
  font-size: 16px;
  font-weight: 700;
  color: var(--primary-dark);
  font-variant-numeric: tabular-nums;
}
.mes-attend-panel {
  max-width: min(1280px, 100%);
  padding: 12px 16px 24px;
}
.mes-attend-panel-wide {
  max-width: none;
  width: 100%;
  box-sizing: border-box;
}
.mes-attend-panel h3 {
  margin: 0 0 8px;
  font-size: 15px;
  font-weight: 650;
  color: var(--text);
}
.mes-attend-hint {
  margin: 0 0 14px;
  font-size: 12px;
  color: #64748b;
  line-height: 1.45;
}
.mes-attend-section {
  margin-bottom: 18px;
  padding: 12px 14px;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  background: #fff;
}
.mes-attend-section-title {
  margin: 0 0 10px;
  font-size: 13px;
  font-weight: 600;
  color: var(--text);
}
.mes-attend-defaults {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: 32px 40px;
  align-items: stretch;
  width: 100%;
}
.mes-attend-defaults .mes-attend-time-row {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 6px;
  min-width: 0;
  width: 100%;
  white-space: normal;
  margin: 0;
  padding: 10px 8px 8px;
  border-radius: 0;
  border: 1px solid transparent;
  border-top-width: 3px;
  box-sizing: border-box;
  background: #f8fafc;
}
.mes-attend-defaults .mes-attend-tone-label {
  text-align: center;
  font-weight: 700;
  font-size: 12px;
  letter-spacing: 0.02em;
  line-height: 1.2;
}
.mes-attend-defaults .mes-attend-time-inputs {
  display: flex;
  width: 100%;
  justify-content: space-between;
  gap: 4px;
}
.mes-attend-defaults .mes-attend-time-inputs input[type="time"] {
  flex: 1 1 0;
  min-width: 0;
  width: auto;
  max-width: none;
  box-sizing: border-box;
  background: #fff;
}
.mes-attend-tone-work {
  border-color: #99f6e4;
  border-top-color: #0d9488;
  background: #f0fdfa;
}
.mes-attend-tone-work .mes-attend-tone-label { color: #0f766e; }
.mes-attend-tone-am {
  border-color: #bfdbfe;
  border-top-color: #2563eb;
  background: #eff6ff;
}
.mes-attend-tone-am .mes-attend-tone-label { color: #1d4ed8; }
.mes-attend-tone-noon {
  border-color: #fde68a;
  border-top-color: #d97706;
  background: #fffbeb;
}
.mes-attend-tone-noon .mes-attend-tone-label { color: #b45309; }
.mes-attend-tone-pm {
  border-color: #ddd6fe;
  border-top-color: #7c3aed;
  background: #f5f3ff;
}
.mes-attend-tone-pm .mes-attend-tone-label { color: #6d28d9; }
.mes-attend-tone-eve {
  border-color: #fecdd3;
  border-top-color: #e11d48;
  background: #fff1f2;
}
.mes-attend-tone-eve .mes-attend-tone-label { color: #be123c; }
.mes-attend-tone-ot {
  border-color: #fdba74;
  border-top-color: #ea580c;
  background: #fff7ed;
}
.mes-attend-tone-ot .mes-attend-tone-label { color: #c2410c; }
.mes-attend-day-table th.th-slot-work { color: #0f766e; background: #f0fdfa; }
.mes-attend-day-table th.th-slot-am { color: #1d4ed8; background: #eff6ff; }
.mes-attend-day-table th.th-slot-noon { color: #b45309; background: #fffbeb; }
.mes-attend-day-table th.th-slot-pm { color: #6d28d9; background: #f5f3ff; }
.mes-attend-day-table th.th-slot-eve { color: #be123c; background: #fff1f2; }
.mes-attend-day-table th.th-slot-ot { color: #c2410c; background: #fff7ed; }
.mes-attend-day-table td.col-slot-work { background: rgba(240, 253, 250, 0.45); }
.mes-attend-day-table td.col-slot-am { background: rgba(239, 246, 255, 0.45); }
.mes-attend-day-table td.col-slot-noon { background: rgba(255, 251, 235, 0.55); }
.mes-attend-day-table td.col-slot-pm { background: rgba(245, 243, 255, 0.5); }
.mes-attend-day-table td.col-slot-eve { background: rgba(255, 241, 242, 0.5); }
.mes-attend-day-table td.col-slot-ot { background: rgba(255, 247, 237, 0.55); }
@media (max-width: 1100px) {
  .mes-attend-defaults {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}
@media (max-width: 640px) {
  .mes-attend-defaults {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
.mes-attend-month-bar {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  margin-bottom: 8px;
}
.mes-attend-month-bar strong {
  min-width: 5.5em;
  text-align: center;
  font-size: 14px;
}
.mes-attend-month-summary {
  margin: 0 0 8px;
  font-size: 12px;
  color: #64748b;
}
.mes-attend-day-list {
  max-height: min(62vh, 560px);
  overflow: auto;
  border: 1px solid #e2e8f0;
  border-radius: 0;
}
.mes-attend-day-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
.mes-attend-day-table-wide {
  min-width: 1100px;
}
.mes-attend-day-table th,
.mes-attend-day-table td {
  padding: 4px 6px;
  border-bottom: 1px solid #f1f5f9;
  text-align: left;
  white-space: nowrap;
  vertical-align: middle;
}
.mes-attend-day-table th {
  position: sticky;
  top: 0;
  background: #f8fafc;
  z-index: 1;
  font-weight: 600;
  color: #475569;
}
.mes-attend-day-table tr.is-sunday {
  background: #fff7ed;
}
.mes-attend-day-table tr.is-rest .col-flag {
  color: #b45309;
}
.mes-attend-day-table tr.is-work .col-flag {
  color: #0f766e;
}
.mes-attend-day-table tr.is-ot .col-ot {
  color: #c2410c;
  font-weight: 600;
}
.mes-attend-day-table tr.is-rest .col-slot {
  opacity: 0.45;
}
.mes-attend-day-table td.col-ot .mes-attend-toggle input:disabled + span {
  opacity: 0.55;
}
.mes-attend-toggle {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  cursor: pointer;
  user-select: none;
}
.mes-attend-toggle input {
  width: 14px;
  height: 14px;
  margin: 0;
}
.mes-attend-slot {
  display: inline-flex;
  align-items: center;
  gap: 2px;
}
.mes-attend-slot input[type="time"] {
  padding: 2px 3px;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  font-size: 11px;
  font-family: inherit;
  background: #fff;
  width: 6.6em;
}
.mes-attend-slot .tilde,
.mes-attend-time-inputs .tilde {
  color: #94a3b8;
  font-size: 12px;
}
.mes-attend-time-row {
  display: inline-flex;
  flex-direction: row;
  align-items: center;
  gap: 6px;
  margin: 0;
  white-space: nowrap;
}
.mes-attend-time-row > span:first-child {
  font-size: 12px;
  color: var(--muted, #64748b);
}
.mes-attend-time-inputs {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.mes-attend-time-inputs input[type="time"] {
  padding: 4px 6px;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  font-size: 12px;
  font-family: inherit;
  background: #fff;
  width: 7.2em;
}
.mes-filter-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  border-bottom: 1px solid var(--border);
  background: #fff;
  flex-shrink: 0;
}
.mes-filter-input {
  height: 32px;
  border: 1px solid var(--border);
  border-radius: 0;
  padding: 0 10px;
  font-size: 13px;
  min-width: 160px;
  background: #fff;
}
.mes-filter-input.mes-filter-sm {
  min-width: 120px;
  max-width: 150px;
}
.mes-filter-sep {
  color: var(--muted);
  font-size: 12px;
}
.mes-board-body {
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 10px 12px 16px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.mes-board-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}
.mes-board-card,
.mes-board-section {
  background: #fff;
  border: 1px solid var(--border);
  border-radius: 0;
  padding: 10px 12px;
}
.mes-board-card-title {
  font-size: 13px;
  font-weight: 700;
  color: var(--primary-dark);
  margin-bottom: 8px;
}
.mes-board-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.mes-board-chip {
  min-width: 88px;
  background: #f8fffe;
  border: 1px solid var(--border);
  border-radius: 0;
  padding: 8px 10px;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.mes-board-chip span {
  font-size: 11px;
  color: var(--muted);
}
.mes-board-chip b {
  font-size: 16px;
  font-variant-numeric: tabular-nums;
}
.mes-board-section .table-wrap {
  max-height: 320px;
  overflow: auto;
}
.mes-board-table th,
.mes-board-table td {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.mes-board-table col.col-idx,
.mes-board-table th.col-idx,
.mes-board-table td.col-idx {
  width: 56px !important;
  min-width: 56px !important;
  max-width: 56px !important;
}
/* PLM / WMS 列表：固定列宽，避免 table-layout:fixed 压扁 */
#pane-plm .table-wrap,
#pane-wms .table-wrap {
  overflow: auto;
}
.plm-table th,
.plm-table td,
.wms-table th,
.wms-table td {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.plm-table col.col-idx,
.plm-table th.col-idx,
.plm-table td.col-idx,
.wms-table col.col-idx,
.wms-table th.col-idx,
.wms-table td.col-idx {
  width: 56px !important;
  min-width: 56px !important;
  max-width: 56px !important;
}
/* 操作列：贴 .table-wrap 可视区最右侧（MF-WEB-OPS-STICKY-001 / 对齐国桉康） */
.data-table th.col-ops,
.data-table td.col-ops,
.data-table th[data-col="操作"],
.data-table td[data-col="操作"] {
  position: sticky !important;
  right: 0 !important;
  z-index: 6;
  min-width: 40px;
  max-width: none !important;
  overflow: visible;
  text-overflow: clip;
  white-space: nowrap;
  text-align: center;
  background: #fff;
  box-shadow: -4px 0 8px rgba(15, 23, 42, 0.06);
  box-sizing: border-box;
}
.data-table th.col-ops,
.data-table th[data-col="操作"] {
  top: 0; /* 表头同时贴顶 + 贴右 */
  z-index: 8;
  background: #f3f4f6;
  color: #374151;
  font-weight: 600;
  box-shadow: -4px 0 8px rgba(15, 23, 42, 0.12);
  overflow: visible;
}
/* 操作列贴右：调宽手柄必须在左缘（右缘被滚动条/视口边挡住点不到） */
.data-table th.col-ops .col-resizer,
.data-table th[data-col="操作"] .col-resizer {
  left: 0;
  right: auto;
  width: 10px;
  z-index: 16;
  cursor: col-resize;
}
.data-table th.col-ops .col-resizer::after,
.data-table th[data-col="操作"] .col-resizer::after {
  left: 3px;
  right: auto;
  width: 3px;
  background: rgba(255, 255, 255, 0.55);
}
.data-table th.col-ops .col-resizer:hover::after,
.data-table th[data-col="操作"] .col-resizer:hover::after,
body.col-resizing .data-table th.col-ops .col-resizer::after {
  background: #fff;
}
/* 操作列自动收起：按钮在表头左侧；收起后右侧热区悬停展开 */
.table-wrap > .ops-hover-rail {
  display: none;
  position: absolute;
  top: 0;
  right: 0;
  width: 28px;
  height: 100%;
  z-index: 15;
  cursor: pointer;
  background: transparent;
}
.table-wrap.ops-rail-on > .ops-hover-rail {
  display: block;
}
.data-table th.col-ops,
.data-table th[data-col="操作"] {
  padding-left: 36px;
  padding-right: 28px;
}
.data-table th.col-ops .ops-fold-btn,
.data-table th[data-col="操作"] .ops-fold-btn {
  position: absolute;
  left: 12px;
  top: 50%;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  padding: 0;
  min-width: 22px;
  width: 22px;
  height: 22px;
  border: none;
  border-radius: 0;
  background: rgba(255, 255, 255, 0.18);
  color: #fff;
  font-size: 16px;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
  z-index: 13;
}
.data-table th.col-ops .ops-fold-btn:hover,
.data-table th[data-col="操作"] .ops-fold-btn:hover {
  background: rgba(255, 255, 255, 0.32);
}
/* 操作列锁定：表头右侧 🔐，对齐工具栏「权限」图标；锁定后禁止自动收起 */
.data-table th.col-ops .ops-lock-btn,
.data-table th[data-col="操作"] .ops-lock-btn {
  position: absolute;
  right: 2px;
  top: 50%;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  padding: 0;
  min-width: 22px;
  width: 22px;
  height: 22px;
  border: none;
  border-radius: 0;
  background: rgba(255, 255, 255, 0.14);
  color: #fde68a;
  font-size: 13px;
  line-height: 1;
  cursor: pointer;
  z-index: 13;
  opacity: 0.85;
}
.data-table th.col-ops .ops-lock-btn:hover,
.data-table th[data-col="操作"] .ops-lock-btn:hover {
  background: rgba(255, 255, 255, 0.28);
  opacity: 1;
}
.data-table th.col-ops .ops-lock-btn.is-locked,
.data-table th[data-col="操作"] .ops-lock-btn.is-locked,
.data-table.ops-fold-locked th.col-ops .ops-lock-btn,
.data-table.ops-fold-locked th[data-col="操作"] .ops-lock-btn {
  background: rgba(253, 230, 138, 0.35);
  opacity: 1;
  box-shadow: inset 0 0 0 1px rgba(253, 230, 138, 0.55);
}
.data-table.ops-collapsed th.col-ops .ops-lock-btn,
.data-table.ops-collapsed th[data-col="操作"] .ops-lock-btn {
  display: none;
}
.data-table.ops-collapsed th.col-ops,
.data-table.ops-collapsed td.col-ops,
.data-table.ops-collapsed th[data-col="操作"],
.data-table.ops-collapsed td[data-col="操作"] {
  width: 28px !important;
  min-width: 28px !important;
  max-width: 28px !important;
  padding: 0 !important;
  overflow: hidden;
  cursor: pointer;
}
.data-table.ops-collapsed th.col-ops {
  font-size: 0;
  letter-spacing: 0;
  padding-left: 0 !important;
}
.data-table.ops-collapsed th.col-ops .ops-fold-btn {
  left: 0;
  top: 0;
  transform: none;
  width: 100%;
  height: 100%;
  min-height: 28px;
  border-radius: 0;
  font-size: 18px;
}
.data-table.ops-collapsed td.col-ops .tb-btn,
.data-table.ops-collapsed td.col-ops .btn,
.data-table.ops-collapsed td[data-col="操作"] .tb-btn,
.data-table.ops-collapsed td[data-col="操作"] .btn {
  display: none !important;
}
.data-table tbody tr:nth-child(even) td.col-ops,
.data-table tbody tr:nth-child(even) td[data-col="操作"] { background: #f8fffe; }
.data-table tbody tr:hover td.col-ops,
.data-table tbody tr:hover td[data-col="操作"] { background: #e6f4f2; }
.data-table tbody tr.selected td.col-ops,
.data-table tbody tr.selected td[data-col="操作"] { background: #99f6e4; }
/* 操作列内：透明底文字链，编辑/反审青绿、删除红 */
.data-table td.col-ops .tb-btn,
.data-table td.col-ops .btn,
.data-table td.col-ops .btn.ghost,
.data-table td[data-col="操作"] .tb-btn,
.data-table td[data-col="操作"] .btn,
.data-table td[data-col="操作"] .btn.ghost {
  margin: 0 2px;
  padding: 2px 6px;
  font-size: 12px;
  font-weight: 400;
  border: none;
  background: transparent;
  box-shadow: none;
  color: var(--primary-dark, #0f766e);
  border-radius: 0;
  vertical-align: middle;
}
.data-table td.col-ops .tb-btn:hover,
.data-table td.col-ops .btn:hover,
.data-table td[data-col="操作"] .tb-btn:hover,
.data-table td[data-col="操作"] .btn:hover {
  background: #e6f4f2;
  color: var(--primary-dark, #0f766e);
}
.data-table td.col-ops .danger-text,
.data-table td[data-col="操作"] .danger-text {
  color: #b91c1c !important;
}
.data-table td.col-ops .danger-text:hover,
.data-table td[data-col="操作"] .danger-text:hover {
  background: #fef2f2;
  color: #991b1b !important;
}
.data-table td.col-ops .tb-btn:disabled,
.data-table td.col-ops .btn:disabled,
.data-table td[data-col="操作"] .tb-btn:disabled,
.data-table td[data-col="操作"] .btn:disabled {
  opacity: 0.4;
  cursor: not-allowed;
  color: #94a3b8 !important;
  pointer-events: none;
}

/* 用户管理：操作列不贴右；表头仍纵向 sticky，避免滚动后「操作」表头消失 */
[data-col-kind="users"] th.col-ops,
[data-col-kind="users"] th[data-col="操作"] {
  position: sticky !important;
  top: 0 !important;
  right: auto !important;
  left: auto !important;
  box-shadow: none !important;
  padding-left: 8px;
  padding-right: 8px;
  z-index: 8;
}
[data-col-kind="users"] td.col-ops,
[data-col-kind="users"] td[data-col="操作"] {
  position: static !important;
  right: auto !important;
  left: auto !important;
  box-shadow: none !important;
  padding-left: 8px;
  padding-right: 8px;
  z-index: auto;
}
[data-col-kind="users"] th.col-ops .ops-fold-btn,
[data-col-kind="users"] th.col-ops .ops-lock-btn,
[data-col-kind="users"] th[data-col="操作"] .ops-fold-btn,
[data-col-kind="users"] th[data-col="操作"] .ops-lock-btn {
  display: none !important;
}
[data-col-kind="users"] th.col-ops .col-resizer,
[data-col-kind="users"] th[data-col="操作"] .col-resizer {
  left: auto;
  right: 0;
}
.data-table td.col-ops .danger-text:disabled,
.data-table td[data-col="操作"] .danger-text:disabled {
  color: #f1a8a8 !important;
}
/* ===== 用户管理 · 列表内联编辑（2026-09-14） =====
   用户名/部门=文本框，角色/状态=下拉，改完自动保存；行尾无表头图标列（重置密码/删除），悬停显形 */
[data-col-kind="users"] td[data-col="用户名"],
[data-col-kind="users"] td[data-col="部门"],
[data-col-kind="users"] td[data-col="角色"],
[data-col-kind="users"] td[data-col="状态"] {
  padding: 2px 4px;
}
[data-col-kind="users"] .cell-inline {
  display: block;
  width: 100%;
  height: 26px;
  padding: 0 6px;
  border: 1px solid transparent;
  background: transparent;
  border-radius: 0;
  font: inherit;
  font-size: 13px;
  color: inherit;
  outline: none;
  box-sizing: border-box;
}
[data-col-kind="users"] .cell-inline-select {
  padding: 0 2px;
  cursor: pointer;
  /* 去掉原生下拉三角箭头（用户 2026-09-14 要求，四列：角色/地区/部门/状态） */
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  background-image: none;
  text-indent: 0;
}
[data-col-kind="users"] .cell-inline:hover { border-color: #d5dde6; background: #fbfdff; }
[data-col-kind="users"] .cell-inline:focus {
  border-color: #93c5fd;
  background: #fff;
  box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.12);
}
[data-col-kind="users"] .cell-inline.is-saving { opacity: 0.55; }
[data-col-kind="users"] .cell-inline.is-saved { border-color: #86efac; background: #f0fdf4; }
[data-col-kind="users"] .cell-ro { display: block; padding: 0 6px; line-height: 26px; color: #334155; }
[data-col-kind="users"] .cell-ro.masked { color: #94a3b8; letter-spacing: 1px; }
/* 设备管理页对非管理员只读：灰字+斜体，与可编辑态区分 */
[data-col-kind="users"][data-readonly="1"] .cell-ro { color: #64748b; font-style: italic; }
[data-col-kind="users"][data-readonly="1"] .cell-ro.masked { color: #a3b0bf; font-style: normal; }
/* 整表内容居中（分组分隔行、行尾图标列除外）—— 用户 2026-09-14 要求。
   注意：input / select 不继承 td 的 text-align（UA 默认靠左），必须显式指定，否则控件内文字仍靠左 */
[data-col-kind="users"] thead th { text-align: center; }
[data-col-kind="users"] tbody tr.user-row > td:not(.col-rowops) { text-align: center; }
[data-col-kind="users"] tbody tr.user-row > td .cell-inline,
[data-col-kind="users"] tbody tr.user-row > td .cell-inline-select,
[data-col-kind="users"] tbody tr.user-row > td .cell-ro { text-align: center; }
[data-col-kind="users"] th.col-rowops {
  position: sticky !important;
  top: 0 !important;
  z-index: 8;
  padding: 0 10px;
  white-space: nowrap;
  text-align: left;
}
[data-col-kind="users"] td.col-rowops {
  padding: 0 10px;
  white-space: nowrap;
  text-align: left;
}
/* opsw2（2026-10-09 用户截图「排版显示不整齐」）：
   原先整组居中 → 每行元素个数不同（admin 无「删除」、未绑设备无「解绑」）导致组起点漂移；
   改左对齐 + 四类元素定宽，让 重置密码/删除/🔒徽章/解绑 竖向成列 */
[data-col-kind="users"] td.col-rowops .row-ico-btn,
[data-col-kind="users"] td.col-rowops .hw-bind-chip {
  box-sizing: border-box;
  text-align: center;
}
[data-col-kind="users"] td.col-rowops .user-reset-btn { width: 72px; }
[data-col-kind="users"] td.col-rowops .user-del-btn,
[data-col-kind="users"] td.col-rowops .user-unbind-btn { width: 48px; }
[data-col-kind="users"] td.col-rowops .hw-bind-chip { width: 96px; }
/* opsw3：admin 行「删除」缺席占位槽（与 .user-del-btn 同宽同距，徽章/解绑不左移） */
[data-col-kind="users"] td.col-rowops .rowops-slot {
  display: inline-block;
  width: 48px;
  margin-left: 4px;
}
/* 行尾操作列：与「菜单权限 / 可见范围」统一为胶囊按钮（2026-09-27 用户要求「统一按钮式样」） */
[data-col-kind="users"] .row-ico-btn {
  display: inline-block;
  min-width: 34px;
  margin-left: 4px;
  padding: 2px 10px;
  border: 1px solid #4a90d9;
  border-radius: 999px;
  background: #eef5fd;
  color: #2b6cb0;
  font-size: 12px;
  line-height: 1.4;
  cursor: pointer;
  vertical-align: middle;
  transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}
[data-col-kind="users"] .row-ico-btn:focus-visible { outline: 2px solid #93c5fd; outline-offset: 1px; }
[data-col-kind="users"] .row-ico-btn:hover { border-color: #2b6cb0; background: #dceafb; }
[data-col-kind="users"] .row-ico-btn.danger-text { border-color: #dc2626; background: #fef2f2; color: #b91c1c; }
[data-col-kind="users"] .row-ico-btn.danger-text:hover { border-color: #b91c1c; background: #fee2e2; }
[data-col-kind="users"] .hw-bind-chip {
  display: inline-block;
  margin-left: 4px;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 11px;
  line-height: 1.4;
  vertical-align: middle;
  border: 1px solid #cbd5e1;
  background: #f1f5f9;
  color: #475569;
}
[data-col-kind="users"] .hw-bind-chip.on { border-color: #16a34a; background: #f0fdf4; color: #15803d; }
[data-col-kind="users"] .hw-bind-chip.off { border-color: #cbd5e1; background: #f8fafc; color: #94a3b8; }
/* hwquick（2026-10-09）：🔒徽章点击切换绑定开关，加可点击反馈 */
[data-col-kind="users"] .hw-bind-chip.hw-bind-toggle { cursor: pointer; }
[data-col-kind="users"] .hw-bind-chip.hw-bind-toggle:hover { box-shadow: 0 0 0 2px rgba(148,163,184,0.35); }
[data-col-kind="users"] .hw-bind-chip.hw-bind-toggle:focus-visible { outline: 2px solid #93c5fd; outline-offset: 1px; }
[data-col-kind="users"] .hw-bind-chip.hw-bind-toggle:active { transform: translateY(0.5px); }
/* hwtip1（2026-10-09）：🔒徽章完整提示浮层（挂 body 不受 .table-wrap 裁剪，多行不截断） */
.hw-bind-tip {
  position: fixed;
  z-index: 10000;
  max-width: 380px;
  padding: 8px 12px;
  border-radius: 6px;
  background: #0f172a;
  color: #fff;
  font-size: 12px !important;
  line-height: 1.7;
  white-space: pre-line;
  word-break: break-all;
  text-align: left;
  pointer-events: none;
  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.28);
}
.hw-bind-tip[hidden] { display: none !important; }
/* ustate1（2026-10-09 用户「删除状态，老是造成页面上下跳动」）：
   用户管理/设备管理两条状态行原是文档流内 <p>，显示/消失会把表格整体推下/弹回。
   改为底部悬浮 toast（脱离文档流），保留全部提示信息但不再引起任何布局跳动。
   仅 ID 提权，不影响 .status-line 全局类（系统设置页仍在用）。 */
#user-list-status,
#equipment-list-status {
  position: fixed;
  left: 50%;
  bottom: 28px;
  transform: translateX(-50%);
  z-index: 10000;
  margin: 0;
  padding: 8px 16px;
  border-radius: 6px;
  background: #0f172a;
  color: #fff !important;
  font-size: 12px !important;
  line-height: 1.7;
  white-space: pre-line;
  max-width: min(520px, calc(100vw - 48px));
  text-align: center;
  pointer-events: none;
  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.28);
}
#user-list-status[hidden],
#equipment-list-status[hidden] { display: none !important; }
#user-list-status.is-inline-error,
#equipment-list-status.is-inline-error {
  background: #7f1d1d;
  color: #fff !important;
}
.empty-inline {
  color: var(--muted);
  font-size: 13px;
}
@media (max-width: 900px) {
  .mes-board-grid { grid-template-columns: 1fr; }
}
.mes-status-select {
  max-width: 110px;
  font-size: 12px;
  padding: 2px 4px;
}
/* 默认两列；勿覆盖 form-grid-2 / form-grid-3 / form-grid-4 / form-grid-5 */
.form-grid:not(.form-grid-2):not(.form-grid-3):not(.form-grid-4):not(.form-grid-5) {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px 12px;
}
.form-grid .field { margin: 0; }
.form-grid .field-span-2 { grid-column: 1 / -1; }
.form-grid.form-grid-2 {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px 16px;
}
.form-grid.form-grid-3 {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 8px 12px;
}
@media (max-width: 640px) {
  .form-grid:not(.form-grid-2):not(.form-grid-3):not(.form-grid-4):not(.form-grid-5),
  .form-grid.form-grid-2,
  .form-grid.form-grid-4 { grid-template-columns: 1fr; }
}
.tabs {
  display: flex;
  gap: 6px;
  margin-bottom: 12px;
}
.tabs .tab {
  flex: 1;
  border: 1px solid var(--border);
  background: #fff;
  border-radius: 0;
  padding: 10px 8px;
  font-size: 12px;
  color: var(--muted);
  cursor: pointer;
}
.tabs .tab.active {
  background: var(--primary);
  border-color: var(--primary);
  color: #fff;
  font-weight: 600;
}

#view-perm.modal-lg .modal-card {
  width: min(920px, 100%);
  height: min(780px, 92vh);
  max-height: min(780px, 92vh);
}
#view-perm .modal-body {
  display: flex;
  flex-direction: column;
  min-height: 0;
}
/* display:flex 会盖掉 [hidden]，导致按角色页漏出指定用户区 */
#view-perm .perm-pane[hidden] {
  display: none !important;
}
#view-perm #perm-pane-user:not([hidden]) {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
}
.perm-pane { margin-bottom: 12px; }
.perm-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.perm-user-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 10px 14px;
  margin-bottom: 8px;
}
.perm-user-pick {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-size: 12px;
  color: #475569;
  font-weight: 500;
  flex: 1 1 220px;
  min-width: 180px;
}
.perm-user-pick select {
  width: 100%;
  min-height: 36px;
  border: 1px solid #d1d5db;
  border-radius: 0;
  padding: 6px 10px;
  font-size: 13px;
  font-family: inherit;
  background: #fff;
}
.perm-user-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: center;
}
.perm-user-status {
  margin: 0 0 10px;
  font-size: 12px;
  color: #64748b;
  line-height: 1.45;
}
.perm-badge {
  display: inline-block;
  font-size: 11px;
  font-weight: 600;
  padding: 1px 8px;
  border-radius: 999px;
  background: #e2e8f0;
  color: #334155;
  margin-right: 6px;
  vertical-align: middle;
}
.perm-badge-ov {
  background: #ffedd5;
  color: #c2410c;
}
.perm-user-body {
  min-height: 120px;
}
.sales-scope-page-body {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  padding: 12px 16px 16px;
  gap: 10px;
  -webkit-overflow-scrolling: touch;
}
.sales-scope-page-body > .sales-scope-hint,
.sales-scope-page-body > .error {
  flex: 0 0 auto;
}
.sales-scope-page-body .sales-scope-matrix {
  flex: 1 1 auto;
  min-height: 280px;
  max-height: none;
}
.sales-scope-body {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-height: 0;
}
.sales-scope-hint {
  margin: 0;
  font-size: 13px;
  color: #475569;
  line-height: 1.5;
}
.sales-scope-matrix {
  flex: 1 1 auto;
  min-height: 320px;
  max-height: min(62vh, 560px);
  overflow: auto;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  /* 2026-09-14：卡片浮在浅灰底上，左右/底部留白（参考 CRM 区块卡式样）。
     padding-top 保持 0 —— 否则 sticky 的 thead 会与 padding-box 顶边错位。
     ⚠️ 此底色必须与卡片间的 border-top 间距色一致（见下方「用户卡片」段）。 */
  padding: 0 10px 10px;
  background: #f1f4f6;
  -webkit-overflow-scrolling: touch;
}
.sales-scope-matrix .sales-scope-empty {
  padding: 24px 16px;
  color: #94a3b8;
  font-size: 13px;
}
/* ---------- 可见范围：卡片版式（2026-09-14 重做，用户要求「不要表格的形式」） ----------
   一人一张卡：.ss-cards > .ssc-card
     .ssc-head   卡头 = 勾选 + 头像 + 姓名 + 地区 + 已授权 N/M + 卡级按钮
     .ssc-body   卡体 = 按地区分组的查看人勾选块（.ssc-chip）
   式样对齐参考图（CRM 区块卡）：白卡 + 1px 淡描边 + 卡间 12px 灰缝 + 卡片浮在浅灰底上。 */
.ss-cards {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
/* 「折叠/展开」= 收起全部卡体，只留卡头（卡片版：一人一张卡，18 张卡时便于扫读） */
.ss-cards.is-folded .ssc-body {
  display: none;
}
.ssc-card {
  border: 1px solid #d4e8e7;
  background: #fff;
}
.ssc-card.ssc-card-sel {
  border-color: #34d399;
  box-shadow: inset 0 0 0 1px #34d399;
}
.ssc-head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 6px 10px;
  background: #f1f9f8;
  border-bottom: 1px solid #d6edeb;
}
.ssc-card-sel .ssc-head {
  background: #e7fbf3;
  border-bottom-color: #a7f3d0;
}
.ssc-pick {
  display: inline-flex;
  align-items: center;
  cursor: pointer;
}
.ssc-avatar {
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  line-height: 20px;
  text-align: center;
  background: #0f766e;
  color: #fff;
  font-size: 11px;
  font-weight: 600;
  overflow: hidden;
}
.ssc-name {
  font-size: 13px;
  font-weight: 600;
  color: #0f172a;
  max-width: 240px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.ssc-region {
  padding: 0 5px;
  border: 1px solid #cbd5e1;
  background: #fff;
  color: #64748b;
  font-size: 10px;
  line-height: 15px;
  white-space: nowrap;
}
.ssc-region-empty {
  color: #94a3b8;
  font-style: italic;
}
.ssc-stat {
  margin-left: auto;
  font-size: 11px;
  color: #64748b;
}
.ssc-stat b {
  color: #0f766e;
  font-size: 12px;
}
.ssc-ops {
  display: inline-flex;
  gap: 6px;
}
.ssc-btn {
  border: 1px solid #cbeae5;
  background: #fff;
  color: #0f766e;
  font-family: inherit;
  font-size: 11px;
  line-height: 20px;
  padding: 0 8px;
  cursor: pointer;
}
.ssc-btn:hover {
  background: #e6f4f2;
  border-color: #99f6e4;
}
/* ---------- 卡内「只显示已选中」＋「＋添加」挑选模式（2026-09-15，用户「没有选中的一直显示出来，太占空间了」） ----------
   ⚠️ 未选中块仍渲染在 DOM（ssCollectChanges 数据契约），仅 CSS 隐藏；「＋添加」= 卡加 .ss-picking 临时全显示。 */
.ssc-card:not(.ss-picking) .ssc-chip:not(.is-on) { display: none !important; }
.ssc-card:not(.ss-picking) .ssc-group[hidden] { display: none !important; }
/* 折叠态下进入挑选模式：该卡强制展开卡体 */
.ssc-card.ss-picking .ssc-body { display: flex !important; }
.ss-pick-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 8px;
  border: 1px dashed #cbeae5;
  background: #f8fffe;
  font-size: 11px;
  color: #0f766e;
}
.ss-pick-bar[hidden] { display: none !important; }
.ss-pick-bar input[type="search"] {
  height: 24px;
  border: 1px solid #cbd5e1;
  background: #fff;
  font-family: inherit;
  font-size: 12px;
  padding: 0 6px;
  min-width: 180px;
}
.ssc-empty {
  font-size: 11px;
  color: #94a3b8;
  padding: 2px 0 4px;
}
.ssc-body {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 8px 10px 10px;
}
.ssc-group-head {
  display: flex;
  align-items: center;
  gap: 6px;
  padding-bottom: 4px;
  border-bottom: 1px dashed #e6eef0;
  font-size: 11px;
  color: #0f766e;
}
.ssc-group-region {
  font-weight: 600;
}
.ssc-group-count {
  font-weight: 400;
  color: #94a3b8;
}
.ssc-group-btn {
  border: 0;
  background: transparent;
  color: #0f766e;
  font-family: inherit;
  font-size: 11px;
  padding: 0;
  cursor: pointer;
}
.ssc-group-btn:hover {
  text-decoration: underline;
}
/* ⚠️ 不要给组头按钮加 margin-left:auto —— 会把「全选/清空」推到卡片最右侧，离地区名太远 */
.ssc-chips {
  /* 等宽网格：同一地区的查看人对齐成排（卡片很宽时比 flex-wrap 整齐得多） */
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
  gap: 6px;
  padding-top: 6px;
}
/* 勾选块 = 一个查看人（替代原表格的一格） */
.ssc-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  border: 1px solid #e2e8f0;
  background: #fff;
  padding: 3px 8px;
  font-size: 12px;
  color: #334155;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
}
.ssc-chip:hover {
  border-color: #99f6e4;
  background: #f7fffd;
}
.ssc-chip.is-on {
  border-color: #34d399;
  background: #ecfdf5;
  color: #047857;
  font-weight: 600;
}
.ssc-chip.is-full {
  border-color: #0f766e;
  background: #e6f4f2;
  color: #0f766e;
}
.ssc-chip input[type="checkbox"] {
  width: 14px;
  height: 14px;
  margin: 0;
  cursor: pointer;
}
/* .ssc-chip.is-self 已废弃（2026-09-15：卡内不再渲染卡主自己的选项） */
.ssc-chip-dept {
  border: 1px solid #e2e8f0;
  background: #f8fafc;
  color: #94a3b8;
  font-size: 10px;
  line-height: 14px;
  padding: 0 4px;
}
.ssc-head input[type="checkbox"] {
  width: 16px;
  height: 16px;
  margin: 0;
  cursor: pointer;
}

/* ---------- 菜单权限卡片版（2026-09-15：用户要求「改成卡片方式」） ----------
   形态与「可见范围」卡片版一致：**一个菜单一张卡**
     .mpc-head  卡头 = 菜单名 + 已授权 N/M + 卡级「全部开通 / 全部关闭」
     .mpc-body  卡体 = 按地区分组的用户勾选块（.mpc-chip）
   命名前缀 .mpc- / .mp-，刻意与 .ssc- / .ss- 分开，两页样式互不干扰。
   ⚠️ 原表格版规则（.perm-table.menu-user-matrix / .mp-* ）保留未删，作为回退时的参考。 */
#menu-perm-matrix.perm-pane.mp-mode {
  /* 覆盖 .perm-pane 的 flex 列布局：卡片列表自己就是滚动内容，不再套 .perm-scroll 表框 */
  display: block;
  overflow: auto;
  padding-right: 2px;
}
.mp-cards {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.mpc-card {
  border: 1px solid #d4e8e7;
  background: #fff;
}
/* 按部门筛选 = card.hidden 视觉隐藏（DOM 保留）；防御 hidden 被 display 覆盖 */
.mpc-card[hidden] { display: none !important; }
.mpc-head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 6px 10px;
  background: #f1f9f8;
  border-bottom: 1px solid #d6edeb;
}
.mpc-name {
  font-size: 13px;
  font-weight: 600;
  color: #0f172a;
  max-width: 260px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.mpc-stat {
  margin-left: auto;
  font-size: 11px;
  color: #64748b;
}
.mpc-stat b {
  color: #0f766e;
  font-size: 12px;
}
.mpc-ops {
  display: inline-flex;
  gap: 6px;
}
.mpc-btn {
  border: 1px solid #cbeae5;
  background: #fff;
  color: #0f766e;
  font-family: inherit;
  font-size: 11px;
  line-height: 20px;
  padding: 0 8px;
  cursor: pointer;
}
.mpc-btn:hover {
  background: #e6f4f2;
  border-color: #99f6e4;
}
/* 卡级「复制权限」选择条（2026-09-15：把指定用户的权限设置复制过来） */
.mp-copy-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 8px;
  border: 1px dashed #cbeae5;
  background: #f8fffe;
  font-size: 11px;
  color: #0f766e;
}
.mp-copy-bar[hidden] { display: none !important; }
.mp-copy-lbl { white-space: nowrap; }
.mp-select.mp-copy-src {
  /* ⚠️ 全局 .mp-select 的 max-width:160px 会把来源下拉压窄、选项文字截断（用户 2026-09-15「内容要显示完整」）
     → 双类名提权压掉 max-width：不设 width 时由最长 option 撑开，min-width 保底 */
  max-width: none;
  min-width: 220px;
  width: auto;
}
.mpc-lock {
  font-size: 11px;
  color: #94a3b8;
}
.mpc-body {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 8px 10px 10px;
}
.mpc-group-head {
  display: flex;
  align-items: center;
  gap: 6px;
  padding-bottom: 4px;
  border-bottom: 1px dashed #e6eef0;
  font-size: 11px;
  color: #0f766e;
}
.mpc-group-region {
  font-weight: 600;
}
.mpc-group-count {
  font-weight: 400;
  color: #94a3b8;
}
.mpc-group-btn {
  border: 0;
  background: transparent;
  color: #0f766e;
  font-family: inherit;
  font-size: 11px;
  padding: 0;
  cursor: pointer;
}
.mpc-group-btn:hover {
  text-decoration: underline;
}
/* ⚠️ 同 .ssc-group-btn：组头按钮不要加 margin-left:auto（会把「全选/清空」推到卡片最右） */
.mpc-chips {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
  gap: 6px;
  padding-top: 6px;
}
/* 勾选块 = 一个用户（替代原表格的一格） */
.mpc-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  border: 1px solid #e2e8f0;
  background: #fff;
  padding: 3px 8px;
  font-size: 12px;
  color: #334155;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
}
.mpc-chip:hover {
  border-color: #99f6e4;
  background: #f7fffd;
}
.mpc-chip.is-on {
  border-color: #34d399;
  background: #ecfdf5;
  color: #047857;
  font-weight: 600;
}
.mpc-chip.is-admin {
  border-color: #cbd5e1;
}
.mpc-chip.is-lock {
  background: #f8fafc;
  color: #94a3b8;
  cursor: default;
}
.mpc-chip input[type="checkbox"] {
  width: 14px;
  height: 14px;
  margin: 0;
  cursor: pointer;
}
.mpc-chip.is-lock input[type="checkbox"] {
  cursor: not-allowed;
  opacity: 0.45;
}
.mpc-chip-meta {
  border: 1px solid #e2e8f0;
  background: #f8fafc;
  color: #94a3b8;
  font-size: 10px;
  line-height: 14px;
  padding: 0 4px;
}
/* ---- 用户卡维度（2026-09-15 对调：一个用户一张卡，卡内勾菜单）----
   旧「只显示已选中用户」的隐藏规则已随维度对调删除：菜单块全显示，
   数据契约（input[data-mp-user][data-mp-action] 全量留 DOM + collect 按 DOM 收）不变。 */
.mpc-user-region {
  border: 1px solid #e2e8f0;
  background: #f8fafc;
  color: #94a3b8;
  font-size: 10px;
  line-height: 14px;
  padding: 0 4px;
}
.mpc-empty {
  font-size: 12px;
  color: #94a3b8;
  padding: 4px 0 2px;
}
.mpc-empty[hidden] {
  display: none !important;
}
.mp-pick-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  padding: 6px 8px;
  border: 1px dashed #99f6e4;
  background: #f7fffd;
}
.mp-pick-bar[hidden] {
  display: none !important;
}
.mp-pick-search {
  flex: 0 1 220px;
  height: 26px;
  padding: 0 8px;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  background: #fff;
  color: #0f172a;
  font-family: inherit;
  font-size: 12px;
}
.mp-pick-search:focus {
  outline: none;
  border-color: #0f766e;
}
.mp-pick-hint {
  font-size: 11px;
  color: #64748b;
}
/* 菜单权限：部门筛选精简栏（2026-09-16 mpick1，恢复用户需要的部门筛选；其余批量按钮不回来） */
.mp-tools {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0 0 10px;
}
.mp-tools-lbl {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: #64748b;
}
.mp-tools .mp-select {
  max-width: 220px;
}
/* 部门基线面板（2026-09-27「同部门统一权限」）：容器 + 头部说明 + 基准卡描边区分 */
.mp-dept-baselines {
  border: 1px solid #cfe0f2;
  border-radius: 8px;
  background: #f5f9fe;
  padding: 10px 12px;
  margin: 0 0 12px;
}
.mp-db-head {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: 8px;
}
.mp-db-title {
  font-weight: 700;
  font-size: 14px;
  color: #1f4e79;
}
.mp-db-tip {
  font-size: 12px;
  color: #64748b;
}
.mp-db-list .mp-cards {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
/* 部门基线独立页（2026-09-27 mpmerge13）：#pane-dept-baseline 内的容器与说明 */
.db-page-body { padding: 12px 14px; }
/* dbspin1（2026-10-09 用户截图「无法看见屏幕下方的内容」）：#dept-baseline-view 复用了
   .list-body（overflow:hidden，滚动委托给内部 .table-wrap），但部门基线内容是普通 div
   （.db-page-body + #mp-dept-baseline-list），没有 .table-wrap → 超高内容被裁掉、滚不下去。
   改为本容器自担纵向滚动（ID 特异性压过 .list-body；mes-pane-modal 内同构兼容）。 */
#dept-baseline-view {
  display: block;
  overflow-y: auto;
}
.db-tip { font-size: 12px; color: #64748b; margin: 0 0 12px; }
#mp-dept-baseline-list .mp-cards { display: flex; flex-direction: column; gap: 8px; }
/* 基准卡：浅蓝描边 + 左上蓝色色条，与用户卡（白底）视觉区分 */
.mp-db-card {
  border: 1px solid #9ec5ec !important;
  border-left: 4px solid #4a90d9 !important;
  background: #ffffff;
  border-radius: 8px;
  padding: 8px 10px;
  box-shadow: none;
}
.mp-db-card .mpc-head {
  background: transparent;
  border-bottom: 1px dashed #d8e6f5;
  margin: -8px -10px 8px;
  padding: 8px 10px;
}
.mp-db-card .mpc-stat {
  color: #1f4e79;
}
/* 个人特别权限标记（2026-09-27）：用户卡/行内网格区分「继承部门基线」与「个人特别」 */
.mpc-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  margin-left: 4px;
  font-size: 11px;
  line-height: 1;
  font-weight: 700;
  border-radius: 8px;
}
.mp-badge-special { background: #4a90d9; color: #fff; }   /* 蓝：个人特别追加 */
.mp-badge-revoked { background: #f0a020; color: #fff; }   /* 橙：个人特别收回（关掉部门菜单） */
.mpc-stat2 { font-size: 12px; color: #4a90d9; margin-left: 8px; }
.mpc-stat2 b { color: #4a90d9; }
/* 个人特别收回：未勾选的 chip 默认被隐藏（CSS 规则 .mpc-card:not(.mp-picking)...），
   这里强制显示，便于一眼看出「部门菜单被该用户单独关掉」。特异性高于隐藏规则。 */
.mpc-card:not(.mp-picking) .mpc-chip.is-revoked { display: inline-flex !important; }
.mpc-chip.is-revoked { opacity: .9; }
.mpc-chip.is-revoked .mpc-chip-name { text-decoration: line-through; color: #94a3b8; }
.mpc-chip.is-special { border-color: #4a90d9; box-shadow: 0 0 0 1px #4a90d9 inset; }
/* 菜单权限：卡内只显示已勾选菜单（2026-09-16 mpick1，同可见范围 sspick 方案：
   未选中 chip 留 DOM 仅 CSS 隐藏（collectMenuPermMatrix 按 DOM 收数据，契约零改动），
   卡头「＋添加」= 卡加 .mp-picking 临时全展开 + 挑选条搜索，点「完成」收起） */
.mpc-card:not(.mp-picking) .mpc-chip:not(.is-on) {
  display: none !important;
}
/* 顶部「按用户」批量条 = 原表格「列头全选/反选」的等价能力（去表格后必须补上） */
.menu-perm-body > .mp-bulk {
  flex: 0 0 auto;
  margin: 0 0 10px;
}
.mp-bulk {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
}
.mp-bulk-count {
  font-size: 12px;
  color: #94a3b8;
}

/* ── 菜单权限行内编辑（合并进用户管理，状态列右侧；仅管理员可见）── */
.col-mp-perm { text-align: center; }
.mp-inline-btn {
  display: inline-block; padding: 2px 10px; border: 1px solid #4a90d9; border-radius: 999px;
  background: #eef5fd; color: #2b6cb0; font-size: 12px; cursor: pointer; white-space: nowrap;
}
.mp-inline-btn:hover { background: #dceafb; }
/* 无个人特别时的「继承基线」：幽灵样式（仍可点开网格配置），与「个人特别 N 项」蓝胶囊区分 */
.mp-inline-btn-ghost { border-color: #d7dee7; background: #fff; color: #7b8794; }
.mp-inline-btn-ghost:hover { background: #f1f4f8; color: #2b6cb0; border-color: #4a90d9; }
.mp-cell-tag { font-size: 12px; color: #94a3b8; }
/* teamscope1（2026-11-02）：业务部主管自动可见组员客户——可见范围格的「自动」小标 */
.ss-auto-tag {
  display: inline-block; margin-right: 4px; padding: 0 4px; vertical-align: 1px;
  font-style: normal; font-size: 10px; line-height: 15px; color: #0f766e;
  background: #ecfdf5; border: 1px solid #cdeae4; white-space: nowrap;
}
.mp-cell-muted { color: #c0c7d1; }
.mp-inline-row > .mp-inline-cell { padding: 0 !important; background: #f7f9fc; }
.mp-inline-grid { padding: 12px 16px; border-top: 2px solid #4a90d9; border-bottom: 2px solid #4a90d9; }
.mp-inline-bar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 10px; }
.mp-inline-bar .mpc-btn { font-size: 12px; padding: 2px 10px; }
.mp-inline-stat { margin-left: auto; font-size: 12px; color: #64748b; }
.mp-inline-stat b { color: #2b6cb0; }
/* 网格左侧说明（2026-09-27：网格用来解释 蓝特/橙收） */
.mp-inline-hint { font-size: 12px; color: #94a3b8; }
/* 行内网格分区（2026-09-27：网格渲染全部菜单后按 个人特别 / 部门基线 / 其他 分段） */
.mp-inline-sec { margin-bottom: 10px; }
.mp-inline-sec:last-child { margin-bottom: 0; }
.mp-inline-sec-t { font-size: 12px; color: #64748b; margin-bottom: 6px; }

/* ── 可见范围行内编辑（合并进用户管理，菜单权限列右侧；仅可配置者可见）── */
.col-ss-scope { text-align: center; }
.ss-inline-row > .ss-inline-cell { padding: 0 !important; background: #f7f9fc; }
.ss-inline-grid { padding: 12px 16px; border-top: 2px solid #4a90d9; border-bottom: 2px solid #4a90d9; }
.ss-inline-bar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 10px; }
.ss-inline-bar .mpc-btn { font-size: 12px; padding: 2px 10px; }
.ss-inline-stat { margin-left: auto; font-size: 12px; color: #64748b; }
.ss-inline-stat b { color: #2b6cb0; }
.mp-bulk-count b {
  font-size: 13px;
  color: #0f766e;
}
.mp-bulk-btn {
  height: 26px;
  padding: 0 10px;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  background: #fff;
  color: #334155;
  font-family: inherit;
  font-size: 12px;
  cursor: pointer;
}
.mp-bulk-btn:hover {
  border-color: #0f766e;
  color: #0f766e;
}
.mp-bulk-sep {
  width: 1px;
  align-self: stretch;
  margin: 0 2px;
  background: #e2e8f0;
}
.mp-bulk-user {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  color: #475569;
}
.mp-select {
  height: 24px;
  border: 1px solid #cbd5e1;
  background: #fff;
  color: #1e293b;
  font-family: inherit;
  font-size: 12px;
  padding: 0 4px;
  max-width: 160px;
}

/* ---------- 可见范围改造：搜索 / 批量 / 折叠分组（2026-09-14） ---------- */
.ss-tools {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
}
.ss-search {
  flex: 0 1 260px;
  height: 28px;
  padding: 0 8px;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  background: #fff;
  color: #0f172a;
  font-family: inherit;
  font-size: 12px;
}
.ss-search:focus {
  outline: none;
  border-color: #0f766e;
}
.ss-bulk {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
}
.ss-bulk-count {
  font-size: 12px;
  color: #94a3b8;
}
.ss-bulk.has-sel .ss-bulk-count {
  color: #0f766e;
}
.ss-bulk-count b {
  font-size: 13px;
}
.ss-bulk-btn {
  height: 26px;
  padding: 0 10px;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  background: #fff;
  color: #334155;
  font-family: inherit;
  font-size: 12px;
  cursor: pointer;
}
.ss-bulk-btn:hover:not(:disabled) {
  border-color: #0f766e;
  color: #0f766e;
}
.ss-bulk-btn:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}
/* 「按查看人批量」＝原表格版「整列全选」的等价能力（2026-09-14 去表格后新增） */
.ss-bulk-sep {
  width: 1px;
  align-self: stretch;
  margin: 0 2px;
  background: #e2e8f0;
}
.ss-bulk-viewer {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  color: #475569;
}
.ss-select {
  height: 24px;
  border: 1px solid #cbd5e1;
  background: #fff;
  color: #1e293b;
  font-family: inherit;
  font-size: 12px;
  padding: 0 4px;
  max-width: 160px;
}


@media (max-width: 720px) {
  .sales-scope-matrix {
    max-height: min(70vh, 480px);
  }
  .ssc-head {
    gap: 6px;
  }
  .ssc-avatar {
    display: none;
  }
  .ssc-stat {
    margin-left: 0;
  }
}

.perm-user-table th.perm-col-allow,
.perm-user-table td.perm-col-allow,
.perm-user-table th.perm-col-role,
.perm-user-table td.perm-col-role {
  text-align: center;
  width: 88px;
}
.perm-user-table td.perm-col-role {
  color: #64748b;
}
.perm-user-sens-title {
  margin: 14px 0 8px;
  font-size: 13px;
  font-weight: 600;
  color: #334155;
}
.perm-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 0;
}
/* 菜单权限：列多时按内容撑开，才能横向滚动 */
.perm-table.menu-user-matrix {
  width: max-content;
  min-width: 100%;
  table-layout: auto;
  border: none;
  border-radius: 0;
}
.perm-table th, .perm-table td {
  border-bottom: 1px solid var(--border);
  padding: 8px 6px;
  text-align: center;
  white-space: nowrap;
}
/* 冻结首列（菜单名） */
.perm-table.menu-user-matrix th:first-child,
.perm-table.menu-user-matrix td:first-child {
  text-align: left;
  position: sticky;
  left: 0;
  min-width: 120px;
  max-width: 160px;
  background: #f8fffe;
  z-index: 2;
  box-shadow: 2px 0 4px rgba(15, 23, 42, 0.06);
}
/* 固定双行表头 */
.perm-table.menu-user-matrix thead tr:first-child th {
  position: sticky;
  top: 0;
  z-index: 4;
  background: #e6f4f2;
}
.perm-table.menu-user-matrix thead tr:nth-child(2) th {
  position: sticky;
  top: var(--mp-head1, 34px);
  z-index: 4;
  background: #f8fffe;
  box-shadow: 0 1px 0 var(--border);
}
.perm-table.menu-user-matrix thead tr:first-child th:first-child {
  left: 0;
  z-index: 6;
  background: #d8efe9;
}
.perm-table.menu-user-matrix thead tr:nth-child(2) th:first-child {
  left: 0;
  z-index: 6;
  background: #eef8f6;
}
.perm-table.menu-user-matrix th.mp-user {
  min-width: 72px;
  max-width: 96px;
  vertical-align: bottom;
  font-weight: 500;
  line-height: 1.25;
  padding: 8px 4px;
}
.perm-table.menu-user-matrix th.mp-user .mp-user-name {
  display: block;
  white-space: normal;
  word-break: break-all;
  font-size: 12px;
  color: var(--text);
}
.perm-table.menu-user-matrix th.mp-user .mp-user-meta {
  display: block;
  margin-top: 2px;
  font-size: 10px;
  color: var(--muted);
  font-weight: 400;
}
.perm-table.menu-user-matrix th.mp-region {
  background: #e6f4f2;
  color: #0f766e;
  font-weight: 600;
  border-bottom: 1px solid #b6e2dc;
}
.perm-table.menu-user-matrix th.mp-admin,
.perm-table.menu-user-matrix td.mp-admin {
  background: #f1f5f9;
}
.perm-table.menu-user-matrix .mp-col-all,
.perm-table.menu-user-matrix .mp-row-all {
  margin-top: 4px;
  font-size: 11px;
  color: var(--primary);
  cursor: pointer;
  border: none;
  background: none;
  padding: 0;
  text-decoration: underline;
}
.perm-table.menu-user-matrix td.mp-menu-label {
  white-space: normal;
  line-height: 1.3;
}
.perm-table.menu-user-matrix .mp-menu-name {
  display: block;
}
.perm-table.menu-user-matrix .mp-row-all {
  display: inline-block;
  margin-top: 2px;
}
.check-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 4px;
  font-size: 12px;
}

.form-section {
  background: var(--card);
  border: 1px solid var(--border);
  /* 全站表单区块边框取消圆角（用户 2026-09-08） */
  border-radius: 0;
  padding: 12px 14px 10px;
  margin-bottom: 10px;
}
/* 合同弹窗：基本信息 | 图片附件 = 3:1 */
#view-form .form-top-row {
  display: grid;
  grid-template-columns: 3fr 1fr;
  gap: 10px;
  margin-bottom: 10px;
  align-items: stretch;
}
#view-form .form-top-row > .form-section {
  margin-bottom: 0;
  min-width: 0;
  display: flex;
  flex-direction: column;
}
/* PLM 物料弹窗：基本信息外框（含图片附件）——字段 3fr | 图片附件 1fr 同框左右分栏 */
#view-plm-form .plm-form-top-row {
  display: grid;
  grid-template-columns: 1fr;
  gap: 10px;
  margin-bottom: 0;
  align-items: stretch;
}
#view-plm-form .plm-form-top-row > .form-section {
  margin-bottom: 0;
  min-width: 0;
  display: flex;
  flex-direction: column;
}
/* 基本信息外框内：字段（material/product 互斥）| 图片附件 = 2:1 同框分栏 */
#view-plm-form .plm-form-top-row > .form-section.form-section-basic {
  display: grid;
  grid-template-columns: 2fr 1fr;
  gap: 10px;
  position: relative;
  /* 行高由左列内容决定（行数×34 固定）；右列绝对定位跟随左列高度，
     左右底部对齐备注行、高度不跳、无留白 */
  align-items: stretch;
}
/* BOM 明细区：与上方基本信息区保持上下间距（form-top-row margin-bottom 已归零） */
#view-plm-form #plm-bom-detail-section {
  margin-top: 14px;
}#view-plm-form .form-section-basic > .plm-basic-fields {
  min-width: 0;
  display: flex;
  flex-direction: column;
}
#view-plm-form .form-section-basic > .plm-basic-fields > .plm-material-wrap {
  /* 不再 flex:1 撑满：高度 = 行数 × 34，固定不跳 */
  flex: none;
  min-width: 0;
}
#view-plm-form .form-section-basic > #plm-attach-section {
  /* 绝对定位：不参与 grid 轨道高度计算（行高由左列表单决定），
     铺满左列右侧剩余空间 → 右列高度 = 左列高度，底部对齐、高度固定 */
  position: absolute;
  /* top 跟随 .form-section-basic 的 padding-top(12px)：与左侧字段区顶部严格对齐，
     避免右侧图片区比左侧内容「凸出」12px；
     bottom 跟随 padding-bottom(10px)：与左侧字段区底部严格对齐，
     否则右侧会高出 10px（差量 = padding-bottom），左右不同高 */
  top: 12px;
  right: 0;
  bottom: 10px;
  left: calc(66.6667% + 3.34px); /* 2fr 列宽 + gap 10px 的一半 */
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  /* 图片附件不再有独立最外框：与基本信息同处 .form-section-basic 一个大外框内，
     移除自身边框避免出现「框中框」（编辑物料 / 编辑产品统一） */
  background: var(--card);
  border: none;
  border-radius: 0;
  /* 顶部 padding 为 0：让「图片附件」标题贴到与左侧「基本信息」标题同一水平线
     （左侧标题贴 .form-section-basic 内容区顶部 top=12px，右侧若保留 padding-top 会低 12px，
     再加 .section-bar 居中 5px → 标题差 17px 不同行）；
     左右/底部 padding 保持 12px，保证图片内边框到外边框间距一致 */
  padding: 0 12px 12px;
  margin: 0;
  box-sizing: border-box;
}
/* 右侧「图片附件」标题行：标题贴顶（align-items: flex-start），
   与左侧「基本信息」标题严格同一水平线；上传按钮随行右侧 */
#view-plm-form #plm-attach-section .section-bar {
  align-items: flex-start;
  /* 取消全局 .section-bar 的 margin-bottom: 8px：
     左侧标题(margin-bottom:10px) → 表格顶部 grid top=148，
     右侧若留 8px → attach-list top=156 比左侧低 8px（有附件数据时明显错位）。
     归零后 attach-list 顶部与左侧表格顶部严格对齐（148）。 */
  margin-bottom: 0;
}
/* WMS 入库/出库等：基本信息 | 图片附件 左右并列 */
#view-wms-txn.modal-lg .modal-card {
  width: min(1600px, 100%) !important;
}
#view-wms-txn .wms-txn-top-row {
  display: grid;
  grid-template-columns: 4fr 1fr;
  gap: 10px;
  margin-bottom: 10px;
  align-items: stretch;
}
#view-wms-txn .wms-txn-top-row > .form-section {
  margin-bottom: 0;
  min-width: 0;
  display: flex;
  flex-direction: column;
}
#view-wms-txn #wms-attach-section .attach-list {
  flex: 1;
  min-height: 120px;
  max-height: 258px;
  overflow: auto;
}
#view-wms-txn #wms-attach-section .attach-item {
  flex-direction: column;
  align-items: stretch;
  gap: 6px;
  padding: 8px;
}
#view-wms-txn #wms-attach-section .attach-actions {
  width: 100%;
  justify-content: flex-end;
}
#view-wms-txn #wms-attach-section .attach-thumb {
  display: block;
  width: 100%;
  max-height: 140px;
  object-fit: contain;
  background: #fff;
}
#view-plm-form .plm-material-wrap {
  margin: 0;
  padding: 0;
  border: none;
  background: transparent;
  /* 表单 grid 行高固定 34px：高度稳定，打开/切行不跳 */
  display: flex;
  flex-direction: column;
}
#view-plm-form .plm-material-wrap[hidden] {
  display: none !important;
}
#view-plm-form .plm-material-wrap > .form-grid {
  /* 行高固定后不再 flex 拉伸：高度 = 行数 × 34，稳定不跳 */
  flex: none;
  min-height: 0;
  align-content: start;
}
#view-plm-form #plm-attach-section .attach-list {
  flex: 1;
  min-height: 0;
  /* 列表高度由附件卡片剩余空间决定（卡片高度跟随左列表单行数），
     图片多时内部滚动，不撑高卡片 → 高度不跳 */
  overflow: auto;
}
/* 空状态：无附件时提示文字在附件框内上下垂直居中；有附件时隐藏 */
#view-plm-form #plm-attach-section.attach-empty .attach-list {
  flex: 0;
  display: none;
}
#view-plm-form #plm-attach-section .attach-drop-hint {
  display: none;
  margin: 0;
  flex: 1;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-size: 13px;
  color: #94a3b8;
  line-height: 1.5;
}
#view-plm-form #plm-attach-section.attach-empty .attach-drop-hint {
  display: flex;
}
#view-plm-form #plm-attach-section .attach-item {
  flex-direction: column;
  align-items: stretch;
  gap: 6px;
  padding: 8px;
}
#view-plm-form #plm-attach-section .attach-actions {
  width: 100%;
  justify-content: flex-end;
}
#view-plm-form #plm-attach-section .attach-preview {
  display: block;
  border-radius: 0;
  overflow: hidden;
  background: #f1f5f9;
  border: 1px solid var(--border);
}
#view-plm-form #plm-attach-section .attach-thumb {
  display: block;
  width: 100%;
  max-height: 220px;
  object-fit: contain;
  background: #fff;
}
/* ── PLM 产品/物料/BOM 基本信息：表格式表单（每行 1 组「标签(左) | 输入(右)」左右排列，1px 网格线） ── */
#view-plm-form .plm-material-wrap > .form-grid-2,
#view-plm-form #plm-form-bom > .form-grid-2 {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1px;
  background: var(--border);      /* gap 露出的背景色 = 网格线 */
  border: 1px solid var(--border);
  border-radius: 0;
  overflow: hidden;
  padding: 0;
  margin: 0;
  /* 左右排列行高固定 34px（表格化一行一字段） */
  grid-auto-rows: 34px;
  align-content: start;
}
/* 每个字段 = 「标签(左) | 输入(右)」横向两格单元格 */
#view-plm-form .plm-material-wrap > .form-grid-2 > .field,
#view-plm-form #plm-form-bom > .form-grid-2 > .field {
  display: grid;
  /* 左右排列：标签(92px) | 输入，单行；1px 列 gap 即标签/输入间网格线 */
  grid-template-columns: 92px minmax(0, 1fr);
  gap: 1px;
  background: var(--border);
  margin: 0;
  min-height: 0;
}
/* 标签格：灰底、右对齐、垂直居中、下缘与输入格分隔 */
#view-plm-form .plm-material-wrap > .form-grid-2 > .field > span,
#view-plm-form #plm-form-bom > .form-grid-2 > .field > span {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  padding: 8px 10px;
  background: #f1f5f9;
  color: var(--muted);
  font-size: 12px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  text-align: right;
  margin: 0;
  min-height: 34px;
  box-sizing: border-box;
}
/* 输入格：白底、无独立边框（网格线由外层 gap 提供） */
#view-plm-form .plm-material-wrap > .form-grid-2 > .field > input,
#view-plm-form .plm-material-wrap > .form-grid-2 > .field > select,
#view-plm-form #plm-form-bom > .form-grid-2 > .field > input,
#view-plm-form #plm-form-bom > .form-grid-2 > .field > select {
  width: 100%;
  min-width: 0;
  padding: 8px 10px;
  font-size: 12px;
  border: 0;
  border-radius: 0;
  background: #fff;
  color: #000;
  text-align: center; /* 内容居中 + 黑色（用户 2026-09-29） */
  box-sizing: border-box;
  min-height: 34px;
}
/* 跨整行字段（备注等）：标签格+输入格 横跨整行 */
#view-plm-form .plm-material-wrap > .form-grid-2 > .field.field-span-2,
#view-plm-form #plm-form-bom > .form-grid-2 > .field.field-span-2 {
  grid-column: 1 / -1;
}
/* 窄屏（手机）：每行 1 组「标签|输入」，网格线仍保留 */
@media (max-width: 640px) {
  #view-plm-form .plm-material-wrap > .form-grid-2,
  #view-plm-form #plm-form-bom > .form-grid-2 {
    grid-template-columns: 1fr;
  }
}
/* 只读/禁用：保持灰底弱化（覆盖上方白底输入格） */
#view-plm-form .plm-material-wrap > .form-grid-2 > .field > input[readonly],
#view-plm-form .plm-material-wrap > .form-grid-2 > .field > input:disabled,
#view-plm-form .plm-material-wrap > .form-grid-2 > .field > select:disabled,
#view-plm-form #plm-form-bom > .form-grid-2 > .field > input[readonly],
#view-plm-form #plm-form-bom > .form-grid-2 > .field > input:disabled,
  #view-plm-form #plm-form-bom > .form-grid-2 > .field > select:disabled {
  background: #f1f5f9;
  color: #000; /* 只读/禁用内容同样黑色（用户 2026-09-29），灰底弱化保留 */
  cursor: default;
}
/* date 输入（BOM 生效日期）：表格格内高度一致 */
#view-plm-form #plm-form-bom > .form-grid-2 > .field > input[type="date"] {
  min-height: 34px;
  color-scheme: light;
}
/* 创建人字段：只读输入框（式样与其它字段统一，灰底弱化表示不可编辑） */
#view-plm-form .field .plm-creator:read-only {
  background: #eef2f7;
  color: #000; /* 与其它只读字段一致：内容黑色（用户 2026-09-29） */
  cursor: default;
}
/* 产品编号「派生」按钮：绝对定位在输入格右侧（脱离表格网格流） */
#view-plm-form .plm-material-wrap > .form-grid-2 > .field:has(#btn-plm-derive:not([hidden])) {
  position: relative;
}
#view-plm-form .plm-material-wrap > .form-grid-2 > .field:has(#btn-plm-derive:not([hidden])) > input {
  padding-right: 66px;
}
#view-plm-form .field #btn-plm-derive {
  position: absolute;
  right: 6px;
  bottom: 6px; /* 贴输入格右下角（输入格 = 字段最右列） */
  margin: 0;
  padding: 6px 12px;
  font-size: 12px;
  line-height: 1;
  z-index: 2;
}
/* BOM（半成品）物料代码「派生」按钮：与产品页同一式样（绝对定位脱离 grid 流，
   否则作为 field 第三个子项被 grid 自动放置到新行，按钮掉到 field 下方不可见） */
#view-plm-form #plm-form-bom > .form-grid-2 > .field:has(#btn-plm-derive-bom:not([hidden])) {
  position: relative;
}
#view-plm-form #plm-form-bom > .form-grid-2 > .field:has(#btn-plm-derive-bom:not([hidden])) > input {
  padding-right: 66px;
}
#view-plm-form #plm-form-bom .field #btn-plm-derive-bom {
  position: absolute;
  right: 6px;
  bottom: 6px;
  margin: 0;
  padding: 6px 12px;
  font-size: 12px;
  line-height: 1;
  z-index: 2;
}
/* 物料代码「派生」按钮：与产品/BOM 页同一式样（绝对定位脱离 grid 流，
   否则作为 field 第三个子项被 grid 自动放置到新行，按钮掉到 field 下方不可见） */
#view-plm-form #plm-form-material > .form-grid-2 > .field:has(#btn-plm-derive-material:not([hidden])) {
  position: relative;
}
#view-plm-form #plm-form-material > .form-grid-2 > .field:has(#btn-plm-derive-material:not([hidden])) > input,
#view-plm-form #plm-form-material > .form-grid-2 > .field:has(#btn-m-create-bom:not([hidden])) > input {
  /* 物料代码输入框定宽（2026-09-30 用户：「派生按钮与物料代码间距100px」）——
     输入框定宽后按钮组用 left 锚定，间距恒定不随右侧空位漂移 */
  flex: 0 0 150px;
  width: 150px;
  padding-right: 10px;
}
/* ═══ 物料代码行改 flex 排布（2026-09-30 用户「红框内容 调整间距=100px;同行显示」）═══
   旧做法 = 按钮绝对定位 + left 魔数 321px（按旧版式标签 63px 算）；新版卡片标签列 92px，
   输入框右移，间距缩水成 ~79px。改为 field 转 flex 行：标签列锁 92px 与其他行同线、
   输入框 150px、派生 margin-left 100px —— 间距=100px 恒定成立，不再依赖标签宽度。
   按钮回归文档流（flex 内不会掉行），垂直由 align-items:center 对齐。 */
#view-plm-form #plm-form-material > .form-grid-2 > .field:has(#btn-plm-derive-material:not([hidden])),
#view-plm-form #plm-form-material > .form-grid-2 > .field:has(#btn-m-create-bom:not([hidden])) {
  /* ⚠️ 必须 !important：13538 基础 field 规则（#pane-plm .plm-split-right 前缀）优先级更高，
     不加会被压回 grid，按钮作为多余 grid 项自动掉到输入框下一行（2026-09-30 实测踩坑） */
  display: flex !important;
  align-items: center !important;
  flex-wrap: nowrap !important;
}
#view-plm-form #plm-form-material > .form-grid-2 > .field:has(#btn-plm-derive-material:not([hidden])) > span,
#view-plm-form #plm-form-material > .form-grid-2 > .field:has(#btn-m-create-bom:not([hidden])) > span {
  flex: 0 0 92px;
  width: 92px;
}
#view-plm-form #plm-form-material .field #btn-plm-derive-material {
  position: static;
  margin: 0 0 0 100px; /* 与物料代码输入框间距 100px（用户 2026-09-30） */
  padding: 6px 12px;
  font-size: 12px;
  line-height: 1;
}
/* 物料代码「创建 BOM」按钮（2026-09-30）：与「派生」同行并排（在其右侧）。
   无派生按钮时（如非研发只读态仅显示 打开 BOM）：距输入框同样 100px；
   有派生按钮时：跟在派生右侧 10px。 */
#view-plm-form #plm-form-material .field #btn-m-create-bom {
  position: static;
  margin: 0 0 0 100px;
  padding: 6px 12px;
  font-size: 12px;
  line-height: 1;
}
#view-plm-form #plm-form-material .field #btn-plm-derive-material:not([hidden]) ~ #btn-m-create-bom {
  margin-left: 10px;
}
/* ═══ 物料/产品/半成品资料卡新版（2026-09-30 用户「删除旧版」）：旧版橙色网格整体替换为
   白底扁平卡片（同新 BOM 明细弹窗风格）。字段/按钮/保存逻辑零改动，纯样式替换：
   --border 变量在三个表单作用域内由橙(#fed7aa)改中性灰(#e5e7eb)，
   网格线/边框/附件框/明细表格一并变灰；区块标题改深灰。 ═══ */
#view-plm-form #plm-form-material,
#view-plm-form #plm-form-product,
#view-plm-form #plm-form-bom {
  --border: #e5e7eb;
}
/* 顶部操作行（卡片标题/新增/删除/取消）被移入分栏头，不在表单节点内，单独换色 */
#plm-split-right-head #plm-form-actions-row {
  --border: #e5e7eb;
}
#view-plm-form #plm-form-material .section-title,
#view-plm-form #plm-form-product .section-title,
#view-plm-form #plm-form-bom .section-title,
#plm-split-right-head #plm-form-card-title {
  color: #374151;
}
#view-form #attach-section .attach-list {
  flex: 1;
  min-height: 120px;
  max-height: 260px;
  overflow: auto;
}
#view-form #attach-section .attach-item {
  flex-direction: column;
  align-items: stretch;
  gap: 6px;
  padding: 8px;
}
#view-form #attach-section .attach-actions {
  width: 100%;
  justify-content: flex-end;
}
#view-form #attach-section .attach-preview {
  display: block;
  border-radius: 0;
  overflow: hidden;
  background: #f1f5f9;
  border: 1px solid var(--border);
}
#view-form #attach-section .attach-thumb {
  display: block;
  width: 100%;
  max-height: 160px;
  object-fit: contain;
  cursor: pointer;
  background: #f8fafc;
}
#view-form #attach-section .attach-thumb-fail {
  min-height: 48px;
  padding: 12px;
  text-align: center;
  color: var(--muted);
}
#view-form #attach-section .attach-name-row {
  display: flex;
  align-items: flex-start;
  gap: 4px;
}
#view-form #attach-section .attach-name-row > a {
  flex: 1;
  min-width: 0;
}
#view-form #attach-section .btn-rename-att {
  flex-shrink: 0;
  padding: 0 4px;
  font-size: 12px;
  color: var(--primary-dark);
}
#view-form #attach-section .attach-open,
#view-form #attach-section .attach-name-plain {
  display: block;
  font-size: 12px;
  color: var(--text);
  text-decoration: none;
  word-break: break-all;
  line-height: 1.35;
}
#view-form #attach-section .attach-open {
  color: var(--primary-dark);
  cursor: pointer;
}
#view-form #attach-section .attach-open:hover {
  text-decoration: underline;
}
#view-form #attach-section .attach-size {
  color: var(--muted);
}
#view-form #attach-section .attach-item.is-file .attach-open {
  padding: 4px 2px;
}
@media (max-width: 860px) {
  #view-form .form-top-row,
  #view-plm-form .plm-form-top-row,
  #view-plm-form .form-section-basic,
  #view-wms-txn .wms-txn-top-row {
    grid-template-columns: 1fr;
  }
  /* 单列布局：附件卡片恢复正常流（不再绝对定位铺右），放基本信息下方 */
  #view-plm-form .form-section-basic > #plm-attach-section {
    position: static;
    left: auto;
    right: auto;
    top: auto;
    bottom: auto;
    width: auto;
  }
}
.section-title {
  font-weight: 700;
  margin-bottom: 10px;
  color: var(--primary-dark);
}
.section-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 8px;
}
.section-bar .section-title { margin-bottom: 0; }

.readonly-hint {
  font-size: 12px;
  color: var(--muted);
  margin: 0 0 10px;
  padding: 8px 10px;
  background: #f0fdfa;
  border-radius: 0;
}

.line-list { margin-bottom: 8px; }
.detail-table-wrap {
  max-height: 320px;
  border-radius: 0;
}
.detail-table {
  min-width: 100%;
  width: 100%;
}
.detail-table th {
  background: #0f766e;
}
.detail-table td {
  padding: 4px 6px;
}
/* 明细行号列：不受主列表 max-width:0 / ellipsis 挤压（否则「行号」变「行」、数字异常） */
.detail-table col.col-idx,
.detail-table th.col-idx,
.detail-table td.col-idx {
  width: 50px !important;
  min-width: 50px !important;
  max-width: 50px !important;
  overflow: hidden;
  text-overflow: clip;
  white-space: nowrap;
  text-align: center;
  padding-left: 4px;
  padding-right: 4px;
  box-sizing: border-box;
}
.detail-table td.col-idx {
  color: var(--muted);
  font-variant-numeric: tabular-nums;
  background: #f0fdfa;
}
#view-wms-txn .detail-table {
  min-width: 960px;
}
#view-wms-txn .detail-table .wms-mat-name,
#view-wms-txn .detail-table .wms-mat-model,
#view-wms-txn .detail-table .wms-mat-spec {
  max-width: 180px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: #334155;
  font-size: 13px;
}
#view-wms-txn .detail-table .wms-mat-name {
  max-width: 220px;
}
.detail-table input {
  width: 100%;
  min-width: 0;
  padding: 0;
  margin: 0;
  border: none;
  border-radius: 0;
  outline: none;
  box-shadow: none;
  font: inherit;
  font-size: 12px;
  line-height: inherit;
  text-align: center;
  background: transparent;
  color: var(--text);
}
.detail-table input:focus {
  outline: none;
  background: #e6f4f2;
}
/* BOM 明细「工序」下拉（2026-10-03 bomproc1）：对齐 input 视觉——无边框透明居中 */
.detail-table select {
  width: 100%;
  min-width: 0;
  padding: 0;
  margin: 0;
  border: none;
  border-radius: 0;
  outline: none;
  box-shadow: none;
  font: inherit;
  font-size: 12px;
  line-height: inherit;
  text-align: center;
  text-align-last: center;
  background: transparent;
  color: var(--text);
  cursor: pointer;
}
.detail-table select:focus {
  outline: none;
  background: #e6f4f2;
}
/* 订单列表「排产」列（2026-10-03 sched3 用户）：列宽 = 一个汉字（22px），
   表头「排产」允许换行竖排两行（排/产），单元格 ✅ / — 居中不截断 */
#sales-orders-table th[data-col="排产"] {
  white-space: normal;
  line-height: 1.2;
  padding-left: 3px;
  padding-right: 3px;
}
#sales-orders-table td[data-col="排产"] {
  padding-left: 2px;
  padding-right: 2px;
}
.detail-table input.masked {
  background: transparent;
  color: var(--muted);
}
.detail-table tbody tr { cursor: default; }
.detail-table tbody tr:hover { background: #f8fffe; }
.detail-table .btn-del-line {
  padding: 4px 8px;
  font-size: 12px;
}

.line-card {
  background: var(--card);
  border: 1px dashed var(--border);
  border-radius: 0;
  padding: 10px 10px 2px;
  background: #fafefe;
}
.line-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 12px;
  color: var(--muted);
  margin-bottom: 6px;
}
.danger-text { color: var(--danger) !important; }
.link-btn {
  border: 0;
  background: transparent;
  color: var(--primary-dark, #0f766e);
  cursor: pointer;
  padding: 0 4px;
  font: inherit;
  text-decoration: underline;
}
.link-btn.danger,
.link-btn.danger-text { color: var(--danger) !important; }

.attach-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 4px; }
.attach-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
  padding: 10px;
  border: 1px solid var(--border);
  border-radius: 0;
  background: #fff;
}
.attach-drop-hint {
  margin: 4px 0 0;
  font-size: 12px;
  color: #64748b;
  line-height: 1.4;
}
.mf-attach-dropzone {
  outline: none;
  border: 2px solid transparent;
  border-radius: 0;
  box-sizing: border-box;
  /* 避免拖入时整窗黑屏：不做透明度/阴影/滤镜动画 */
  transition: none !important;
  transform: none !important;
  filter: none !important;
  backdrop-filter: none !important;
}
.mf-attach-dropzone.is-dragover {
  border-color: #0d9488;
  background: #f0fdfa;
}
.mf-attach-dropzone.is-dragover .attach-drop-hint {
  color: #0f766e;
  font-weight: 600;
}
.attach-name { font-size: 12px; word-break: break-all; flex: 1; }
.attach-actions { display: flex; gap: 4px; flex-shrink: 0; }
.file-btn { display: inline-flex; align-items: center; cursor: pointer; margin: 0; }



.form-footer {
  position: sticky;
  bottom: 0;
  padding: 12px 0 calc(8px + var(--safe-bottom));
  background: linear-gradient(transparent, var(--bg) 30%);
}

@media (min-width: 640px) {
  /* 保留断点占位；登录布局见 .view-login / min-width:860px */
}

/* —— 全局字体锁：仅微软雅黑 12px，禁止第二种字体 —— */
:root {
  --font: "Microsoft YaHei";
  font-family: "Microsoft YaHei";
  font-size: 12px;
}
html, body, #app,
#app *:not(script):not(style) {
  font-family: "Microsoft YaHei" !important;
  font-size: 12px !important;
  font-weight: 400 !important;
  line-height: 1.4 !important;
}
button, input, select, textarea, table, th, td, label, a, span, p, div,
.shell-foot, .shell-menu-btn, .nav-popup, .nav-item, .btn, .page-footer,
.data-table, .data-table th, .data-table td, .modal, .modal-title, .tab {
  font-family: "Microsoft YaHei" !important;
  font-size: 12px !important;
  font-weight: 400 !important;
}
/* 「表头白字保留」已删除（2026-10-02）：绿底表头时代遗物，#fff !important
   压过全局表头灰字，导致无 ID 级覆盖的表（我的客户等）浅灰底白字不可见。
   深底色标表头（标准工时 th.std-th-tone-* 等）均自带 color:#fff，不受影响。 */
/* 列表页标题行 + 工具栏：相对正文 +1 → 13px；标题再 +2 → 15px */
.list-pane .page-header,
.list-pane .page-header .toolbar,
.list-pane .page-header .tb-btn,
.list-pane .page-header .btn {
  font-family: "Microsoft YaHei" !important;
  font-size: 13px !important;
  font-weight: 400 !important;
}
.list-pane .page-header .page-title {
  font-family: "Microsoft YaHei" !important;
  font-size: 15px !important;
  font-weight: 400 !important;
}

/* 登录页字号/按钮不受列表 12px 锁压制 */
#view-login .login-mark {
  font-size: inherit !important;
  font-weight: inherit !important;
}
#view-login .login-hero-title {
  font-size: 28px !important;
  font-weight: 700 !important;
}
#view-login .login-hero-mods {
  font-size: 16px !important;
  font-weight: 650 !important;
}
#view-login .login-hero-desc {
  font-size: 14px !important;
  font-weight: 400 !important;
  line-height: 1.7 !important;
}
#view-login .login-card .brand {
  font-size: 22px !important;
  font-weight: 700 !important;
}
#view-login .login-card .sub {
  font-size: 13px !important;
}
#view-login .btn-login {
  font-size: 15px !important;
  font-weight: 700 !important;
  color: #fff !important;
  background: linear-gradient(135deg, #ff8a3d 0%, #fe661a 55%, #e05510 100%) !important;
}

/* 首页介绍：保留设计稿字号（全局 12px 锁例外） */
.home-intro-brand {
  font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif !important;
  font-size: clamp(1.85rem, 4.2vw, 2.55rem) !important;
  font-weight: 800 !important;
  line-height: 1.1 !important;
}
.home-intro-kicker { font-size: 10px !important; font-weight: 700 !important; line-height: 1.4 !important; }
.home-intro-lead { font-size: 14px !important; font-weight: 400 !important; line-height: 1.5 !important; }
.home-intro-flow span { font-size: 11px !important; font-weight: 800 !important; line-height: 1.4 !important; }
.home-intro-orbit b { font-size: 28px !important; font-weight: 800 !important; line-height: 1 !important; }
.home-intro-orbit small { font-size: 10px !important; font-weight: 400 !important; line-height: 1.4 !important; }
.home-intro-sec-head strong { font-size: 15px !important; font-weight: 800 !important; line-height: 1.4 !important; }
.home-intro-sec-head span { font-size: 13px !important; font-weight: 400 !important; line-height: 1.4 !important; }
.home-intro-card-title { font-size: 18px !important; font-weight: 800 !important; line-height: 1.4 !important; }
.home-intro-card.is-primary .home-intro-card-title { font-size: 21px !important; }
.home-intro-card-desc { font-size: 13.5px !important; font-weight: 400 !important; line-height: 1.55 !important; }
.home-intro-mark { font-size: 13px !important; font-weight: 800 !important; line-height: 1.4 !important; }
.home-intro-card.is-primary .home-intro-mark { font-size: 14px !important; }
.home-intro-step { font-size: 12px !important; font-weight: 800 !important; line-height: 1.4 !important; }
.home-intro-tip { font-size: 13px !important; font-weight: 650 !important; line-height: 1.4 !important; }
.home-intro-tags em { font-size: 11px !important; font-weight: 650 !important; line-height: 1.4 !important; }
.home-intro-card-go { font-size: 13px !important; font-weight: 750 !important; line-height: 1.4 !important; }
.home-intro-sub { font-size: 13px !important; font-weight: 400 !important; line-height: 1.45 !important; }
.nav-item { font-size: 13px !important; }
.nav-item.active { font-weight: 600 !important; }
.nav-sub-item { font-size: 12.5px !important; }
.nav-group-toggle { font-size: 13px !important; font-weight: 600 !important; }
@media (max-width: 640px) {
  .home-intro-brand { font-size: 1.7rem !important; }
}

/* —— 正式排程甘特图 —— */
.mes-gantt {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-height: 0;
  height: 100%;
}
.mes-gantt-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 14px;
  align-items: center;
  padding: 0 2px;
  color: #64748b;
}
.mes-gantt-legend span {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  white-space: nowrap;
}
.mes-gantt-hint {
  color: #94a3b8;
  margin-left: auto;
}
.mes-gantt-swatch,
.mes-gantt-due-mark {
  display: inline-block;
  width: 12px;
  height: 12px;
  border-radius: 0;
  flex: 0 0 auto;
}
.mes-gantt-due-mark {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #e11d48;
  box-shadow: 0 0 0 2px rgba(225, 29, 72, 0.25);
}
.mes-gantt-swatch.tone-base { background: #94a3b8; }
.mes-gantt-swatch.tone-weld { background: #0d9488; }
.mes-gantt-swatch.tone-motor { background: #2563eb; }
.mes-gantt-swatch.tone-laser { background: #7c3aed; }
.mes-gantt-swatch.tone-parts { background: #d97706; }
.mes-gantt-swatch.tone-assy { background: #059669; }
.mes-gantt-swatch.tone-aging { background: #e11d48; }
.mes-gantt-swatch.tone-packParts { background: #0891b2; }
.mes-gantt-swatch.tone-pack { background: #4f46e5; }

.mes-gantt-scroll {
  position: relative;
  overflow: auto;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  background: #fff;
  flex: 1;
  min-height: 280px;
}
.mes-gantt-head {
  display: flex;
  position: sticky;
  top: 0;
  z-index: 3;
  background: #f8fafc;
  border-bottom: 1px solid #e2e8f0;
  min-width: max-content;
}
.mes-gantt-corner {
  position: sticky;
  left: 0;
  z-index: 4;
  width: var(--gantt-label-w, 612px);
  min-width: var(--gantt-label-w, 612px);
  display: flex;
  align-items: stretch;
  padding: 0;
  background: #f1f5f9;
  border-right: 1px solid #e2e8f0;
  color: #334155;
  box-sizing: border-box;
}
.mes-gantt-label {
  position: sticky;
  left: 0;
  /* z=2（2026-10-02）：必须压过日期格数量徽标 .mes-gantt-day-qty（z=1，DOM 靠后），
     否则横向滚动时徽标浮在冻结信息列上造成文字重叠（用户报「左侧背景透明重叠」） */
  z-index: 2;
  width: var(--gantt-label-w, 612px);
  min-width: var(--gantt-label-w, 612px);
  display: flex;
  align-items: stretch;
  padding: 0;
  background: #fff;
  border-right: 1px solid #e2e8f0;
  box-sizing: border-box;
}
.mes-gantt-col {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  padding: 3px 8px;
  box-sizing: border-box;
  border-right: 1px solid #e2e8f0;
  overflow: hidden;
  min-width: 0;
  white-space: nowrap;
  text-overflow: ellipsis;
  text-align: center;
}
.mes-gantt-col:last-child {
  border-right: none;
}
.mes-gantt-col.col-line {
  width: 56px;
  min-width: 56px;
  flex: 0 0 56px;
  color: #0f766e;
  font-weight: 600;
}
.mes-gantt-col.col-drag {
  width: 36px;
  min-width: 36px;
  flex: 0 0 36px;
  padding: 4px 2px;
  color: #94a3b8;
}
.mes-gantt-drag {
  display: inline-block;
  cursor: grab;
  user-select: none;
  letter-spacing: -1px;
  font-size: 14px;
  line-height: 1;
  padding: 6px 4px;
  border-radius: 0;
  color: #64748b;
}
.mes-gantt-drag:hover {
  color: #0f766e;
  background: #ecfdf5;
}
.mes-gantt-drag:active {
  cursor: grabbing;
}
.mes-gantt-row.dragging {
  opacity: 0.45;
}
.mes-gantt-row.drag-over-before .mes-gantt-label,
.mes-gantt-row.drag-over-before .mes-gantt-track {
  box-shadow: inset 0 2px 0 #0d9488;
}
.mes-gantt-row.drag-over-after .mes-gantt-label,
.mes-gantt-row.drag-over-after .mes-gantt-track {
  box-shadow: inset 0 -2px 0 #0d9488;
}
.mes-gantt-col.col-proc {
  width: 56px;
  min-width: 56px;
  flex: 0 0 56px;
  color: #334155;
}
.mes-gantt-col.col-cap {
  width: 56px;
  min-width: 56px;
  flex: 0 0 56px;
  color: #334155;
  line-height: 1.15;
}
.mes-gantt-col.col-wo {
  width: 100px;
  min-width: 100px;
  flex: 0 0 100px;
  color: #0f172a;
}
/* 产品列（2026-10-02 用户：宽度自适应内容——JS 量当前行最宽产品名，
   经 --gantt-product-w / --gantt-label-w 统一套用保证各行列对齐；默认 140=原 flex 占宽） */
.mes-gantt-col.col-product {
  flex: 0 0 var(--gantt-product-w, 140px);
  width: var(--gantt-product-w, 140px);
  min-width: var(--gantt-product-w, 140px);
  color: #334155;
  text-align: left;
}
.mes-gantt-col.col-code {
  flex: 1 1 0;
  min-width: 0;
  color: #475569;
}
/* 排产数量列（2026-10-01 用户定版：列宽与「小时/产能」一致固定 56px，表头两行；
   2026-10-02 用户：padding 0 让行内输入框边框拉满贴合单元格四周，同 col-swap 手法） */
.mes-gantt-col.col-qty {
  width: 56px;
  min-width: 56px;
  flex: 0 0 56px;
  color: #475569;
  line-height: 1.15;
  padding: 0;
}
/* 齐套列（2026-10-04 用户追加：排产数量右侧；列宽以「齐」一字为固定值 30px；
   表头「齐/套」竖排两行；数据 齐=绿 欠=红） */
.mes-gantt-col.col-kit {
  width: 30px;
  min-width: 30px;
  flex: 0 0 30px;
  color: #475569;
  line-height: 1.15;
  padding: 0;
  text-align: center;
}
.mes-gantt-col.col-kit .mfp-kit-ok {
  display: inline-block;
  min-width: 18px;
  margin: 0 auto;
  padding: 1px 4px;
  border-radius: 9px;
  font-size: 11px;
  line-height: 16px;
  color: #fff;
  background: #16a34a;
}
/* 欠=原样红字无底色（2026-10-04 用户：欠保持原样、仅齐用徽章，形态差异更清楚） */
.mes-gantt-col.col-kit .mfp-kit-no {
  color: #dc2626;
  font-weight: 600;
}
/* 订单列表「齐套」列复用同款徽章（2026-10-04 用户：排产右侧；样式与甘特齐套列一致） */
.mfp-kit-ok {
  display: inline-block;
  min-width: 18px;
  padding: 1px 4px;
  border-radius: 9px;
  font-size: 11px;
  line-height: 16px;
  color: #fff;
  background: #16a34a;
  text-align: center;
}
.mfp-kit-no {
  color: #dc2626;
  font-weight: 600;
}

/* 即时库存页（2026-10-05 用户「为什么滚动条还存在」）：旧 auto 覆盖规则已删——
   两类选择器优先级高于 JS 注入的单类 fixed，把布局改回 auto 后长规格文本
   撑宽表格、横向滚动条复现。布局由 mes_stock_live.js 注入样式统一控制
   （table-layout:fixed + colgroup 比例列宽），此处只补单元格超长省略 */
.mf-stocklive-tbl th,
.mf-stocklive-tbl td {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.mf-stocklive-tbl td.nw {
  font-variant-numeric: tabular-nums;
}
.mes-gantt-corner .mes-gantt-col.col-kit {
  padding: 8px 0;
}
/* 颜色列（2026-10-01 用户追加：产品列右侧，列宽与「小时/产能/排产数量」一致固定 56px；
   2026-10-02 用户：宽度自适应内容、上限 120px 下限 56px，--gantt-color-w 渲染时由 JS 写入） */
.mes-gantt-col.col-color {
  width: var(--gantt-color-w, 56px);
  min-width: var(--gantt-color-w, 56px);
  flex: 0 0 var(--gantt-color-w, 56px);
  color: #475569;
}
/* 换线时间列（2026-10-02 用户追加：排产数量左侧，直改分钟数；宽度同 56px；
   2026-10-02 用户：padding 0 让输入框边框拉满贴合单元格周边） */
.mes-gantt-col.col-swap {
  width: 56px;
  min-width: 56px;
  flex: 0 0 56px;
  color: #475569;
  padding: 0;
}
.mes-gantt-corner .mes-gantt-col {
  font-weight: 600;
  color: #334155;
  padding: 8px;
}
.mes-gantt-days {
  display: flex;
}
.mes-gantt-day-h {
  width: 54px;
  min-width: 54px;
  box-sizing: border-box;
  padding: 4px 0;
  text-align: center;
  border-right: 1px solid #e2e8f0;
  color: #475569;
  line-height: 1.2;
}
.mes-gantt-day-h small {
  display: block;
  color: #94a3b8;
}
.mes-gantt-day-h.is-sun,
.mes-gantt-day-h.is-rest {
  background: #fff1f2;
  color: #be123c;
}
.mes-gantt-day-h.is-today {
  background: #ecfdf5;
  color: #0f766e;
}
.mes-gantt-body {
  position: relative;
  min-width: max-content;
}
.mes-gantt-today-line {
  display: none;
}
.mes-gantt-row {
  display: flex;
  min-height: 34px;
  border-bottom: 1px solid #e2e8f0;
  cursor: pointer;
}
.mes-gantt-row:hover {
  background: #f8fafc;
}
.mes-gantt-row.selected {
  background: #f0fdfa;
}
.mes-gantt-row:hover .mes-gantt-label,
.mes-gantt-row.selected .mes-gantt-label {
  background: inherit;
}
.mes-gantt-label-main {
  color: #0f172a;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.mes-gantt-label-sub {
  color: #64748b;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.mes-gantt-track {
  position: relative;
  display: flex;
  flex: 0 0 auto;
  align-items: stretch;
  min-height: 34px;
}
.mes-gantt-cell {
  width: 54px;
  min-width: 54px;
  box-sizing: border-box;
  border-right: 1px solid #e2e8f0;
}
.mes-gantt-cell.is-sun,
.mes-gantt-cell.is-rest { background: rgba(255, 241, 242, 0.55); }
.mes-gantt-cell.is-today { background: rgba(236, 253, 245, 0.7); }
/* 超交期日格（交期次日 ~ 生产结束）：红底，需盖过休息日/今日底色 */
.mes-gantt-cell.is-late { background: #fecaca !important; }
.mes-gantt-span {
  display: none;
}
.mes-gantt-span.tone-base,
.mes-gantt-span.tone-weld,
.mes-gantt-span.tone-motor,
.mes-gantt-span.tone-laser,
.mes-gantt-span.tone-parts,
.mes-gantt-span.tone-assy,
.mes-gantt-span.tone-aging,
.mes-gantt-span.tone-packParts,
.mes-gantt-span.tone-pack,
.mes-gantt-span.is-overdue { display: none; }
.mes-gantt-row.is-mismatch .mes-gantt-label-sub { color: #b91c1c; }
.mes-gantt-row.is-excluded {
  opacity: 0.45;
}
.mes-gantt-row.is-excluded .mes-gantt-label-sub { color: #94a3b8; }
.mes-gantt-row.is-summary {
  background: #f1f5f9;
  font-weight: 700;
  border-bottom: 1px solid #cbd5e1;
  pointer-events: none;
  user-select: none;
}
.mes-gantt-row.is-summary .mes-gantt-label {
  background: #f1f5f9;
  color: #0f172a;
}
.mes-gantt-row.is-summary .mes-gantt-col.col-proc,
.mes-gantt-row.is-summary .mes-gantt-col.col-wo {
  color: #0f766e;
}
.mes-gantt-row.is-summary .mes-gantt-col.col-model {
  color: #b45309;
  font-variant-numeric: tabular-nums;
}
.mes-gantt-line-sep {
  display: flex;
  align-items: center;
  min-height: 14px;
  pointer-events: none;
  user-select: none;
  min-width: max-content;
}
.mes-gantt-sep-rule-full {
  height: 0;
  border-top: 1px dashed #94a3b8;
  margin: 4px 0;
}
.mes-gantt-sep-label {
  position: sticky;
  left: 0;
  z-index: 1;
  width: 200px;
  min-width: 200px;
  padding: 2px 10px;
  background: #fff;
  border-right: 1px solid #e2e8f0;
  color: #94a3b8;
  letter-spacing: 0;
  white-space: nowrap;
  overflow: hidden;
}
.mes-gantt-sep-track {
  position: relative;
  display: flex;
  align-items: center;
  min-height: 22px;
}
.mes-gantt-sep-rule {
  height: 0;
  border-top: 1px dashed #cbd5e1;
}
.mes-sch-no-aps td {
  background: #f8fafc;
  color: #94a3b8;
}
.mes-sch-no-aps .mes-sch-edit {
  opacity: 0.85;
}
.mes-gantt-day-qty {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  height: auto;
  min-height: 0;
  border-radius: 0;
  background: transparent !important;
  color: #0f172a;
  text-align: center;
  line-height: 1.2;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  z-index: 1;
  box-shadow: none !important;
  border: none !important;
  outline: none !important;
  overflow: visible;
  display: flex;
  align-items: center;
  justify-content: center;
}
.mes-gantt-day-qty.tone-base,
.mes-gantt-day-qty.tone-weld,
.mes-gantt-day-qty.tone-motor,
.mes-gantt-day-qty.tone-laser,
.mes-gantt-day-qty.tone-parts,
.mes-gantt-day-qty.tone-assy,
.mes-gantt-day-qty.tone-aging,
.mes-gantt-day-qty.tone-packParts,
.mes-gantt-day-qty.tone-pack {
  background: transparent !important;
  color: #0f172a;
}
.mes-gantt-day-qty.is-overdue {
  color: #b91c1c;
  outline: none;
  outline-offset: 0;
}
.mes-gantt-day-qty.is-sum,
.mes-gantt-day-qty.is-sum.is-today-sum {
  background: transparent !important;
  color: #0f172a;
  font-weight: 800;
  box-shadow: none !important;
  border: none !important;
  border-radius: 0 !important;
  outline: none !important;
}
.mes-gantt-day-qty.is-sum.is-today-sum {
  color: #0f766e;
}
.mes-gantt-bar {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  height: auto;
  border-radius: 0;
  background: transparent !important;
  color: #64748b;
  padding: 0 2px;
  box-sizing: border-box;
  overflow: visible;
  white-space: nowrap;
  text-overflow: clip;
  line-height: 1.2;
  z-index: 1;
  box-shadow: none !important;
  border: none !important;
  display: flex;
  align-items: center;
  justify-content: center;
}
.mes-gantt-bar.tone-base,
.mes-gantt-bar.tone-weld,
.mes-gantt-bar.tone-motor,
.mes-gantt-bar.tone-laser,
.mes-gantt-bar.tone-parts,
.mes-gantt-bar.tone-assy,
.mes-gantt-bar.tone-aging,
.mes-gantt-bar.tone-packParts,
.mes-gantt-bar.tone-pack {
  background: transparent !important;
  color: #64748b;
}
.mes-gantt-bar.is-overdue {
  color: #b91c1c;
  outline: none;
  outline-offset: 0;
}
.mes-gantt-due {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: #e11d48;
  box-shadow: 0 0 0 2px rgba(225, 29, 72, 0.2);
  z-index: 2;
  pointer-events: none;
}

.mes-sch-line-sep td {
  padding: 6px 0 !important;
  background: #fff;
  border-bottom: none;
}
.mes-sch-drag-cell {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  white-space: nowrap;
}
.mes-sch-drag {
  color: #64748b;
  letter-spacing: -1px;
  cursor: grab;
  user-select: none;
  font-size: 14px;
  line-height: 1;
  padding: 4px 6px;
  flex: 0 0 auto;
  border-radius: 0;
}
.mes-sch-drag:hover {
  color: #0f766e;
  background: #ecfdf5;
}
.mes-sch-drag:active {
  cursor: grabbing;
}
.mes-sch-rowno {
  flex: 0 0 auto;
  min-width: 1.2em;
  text-align: center;
}
.mes-sch-row.dragging {
  opacity: 0.45;
}
.mes-sch-row.drag-over-before td {
  box-shadow: inset 0 2px 0 #0d9488;
}
.mes-sch-row.drag-over-after td {
  box-shadow: inset 0 -2px 0 #0d9488;
}
.mes-line-pri-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.mes-line-pri-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 8px;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  background: #f8fafc;
}
.mes-line-pri-rank {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: #0d9488;
  color: #fff;
  text-align: center;
  line-height: 22px;
  flex: 0 0 auto;
}
.mes-line-pri-name {
  flex: 1;
  color: #0f172a;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.mes-line-pri-name strong {
  font-weight: 600;
}
.mes-wo-pri-meta {
  color: #64748b;
  font-size: 12px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.mes-wo-pri-line-head {
  margin: 10px 0 4px;
  padding: 4px 2px;
  color: #0f766e;
  font-weight: 600;
  font-size: 13px;
  border-bottom: 1px dashed #99f6e4;
}
.mes-wo-pri-line-head:first-child {
  margin-top: 0;
}
.mes-line-pri-up,
.mes-line-pri-down {
  min-width: 36px;
}
.mes-aging-defect-title {
  margin: 12px 0 8px;
  font-weight: 600;
  color: var(--text);
}
.modal-card-wide {
  width: min(960px, 100%);
  max-width: 960px;
}

/* 标准工时弹窗：顶栏基础字段 + 工序矩阵（贴合内容） */
#view-mes-std-hours .msh-modal-card,
#view-mes-std-hours .modal-card-wide {
  width: min(680px, 100%);
  max-width: 680px;
  max-height: min(92vh, 900px);
}
#view-mes-std-hours .modal-body {
  padding: 12px 14px 8px;
  overflow: auto;
}
#view-mes-std-hours .modal-foot {
  padding: 10px 14px;
}
#view-mes-std-hours #btn-mes-std-save {
  background: #0d9488;
  color: #fff;
  border-color: #0d9488;
}
#view-mes-std-hours #btn-mes-std-save:hover {
  background: #0f766e;
  border-color: #0f766e;
  color: #fff;
}
.msh-form {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.msh-form-base {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 10px 12px;
  padding: 10px 12px;
  background: #f8fafc;
  border: 1px solid #e8eef0;
  border-radius: 0;
}
.msh-field {
  display: flex;
  flex-direction: column;
  gap: 5px;
  margin: 0;
  min-width: 0;
}
.msh-field > span {
  font-size: 12px;
  color: #64748b;
  line-height: 1.3;
  white-space: nowrap;
}
.msh-field > span em {
  color: #e11d48;
  font-style: normal;
  margin-left: 2px;
}
.msh-field > input,
.msh-field > select,
.msh-date {
  width: 100%;
  box-sizing: border-box;
}
.msh-field > input,
.msh-field > select,
.msh-date > input[type="text"] {
  width: 100%;
  box-sizing: border-box;
  min-height: 34px;
  padding: 7px 10px;
  border: 1px solid #dbe3e8;
  border-radius: 0;
  font-size: 12px;
  background: #fff;
  color: var(--text);
}
.msh-field > select {
  cursor: pointer;
  appearance: auto;
}
.msh-field > input:focus,
.msh-field > select:focus,
.msh-date > input[type="text"]:focus {
  outline: 2px solid rgba(13, 148, 136, 0.28);
  border-color: #0d9488;
}
.msh-date {
  position: relative;
  display: flex;
  align-items: center;
}
.msh-date > input[type="text"] {
  padding-right: 34px;
}
.msh-date-btn {
  position: absolute;
  right: 4px;
  top: 50%;
  transform: translateY(-50%);
  width: 28px;
  height: 28px;
  border: none;
  background: transparent;
  border-radius: 0;
  cursor: pointer;
  font-size: 14px;
  line-height: 1;
  padding: 0;
  color: #64748b;
}
.msh-date-btn:hover {
  background: #eef6f5;
  color: #0f766e;
}
.msh-date-native {
  position: absolute;
  opacity: 0;
  pointer-events: none;
  width: 0;
  height: 0;
  border: 0;
  padding: 0;
}
.msh-form-matrix {
  display: flex;
  flex-direction: column;
  gap: 0;
  border: 1px solid #dbe7e4;
  border-radius: 0;
  overflow: hidden;
  background: #fff;
}
.msh-form-head,
.msh-form-row {
  display: grid;
  grid-template-columns: 118px repeat(3, minmax(0, 1fr));
  align-items: center;
  gap: 8px;
  padding: 7px 10px;
  min-height: 40px;
}
.msh-form-head {
  background: #f0fafa;
  border-bottom: 1px solid #dbe7e4;
  font-size: 11px;
  font-weight: 600;
  color: #0f766e;
  min-height: 34px;
  padding-top: 6px;
  padding-bottom: 6px;
}
.msh-form-head > span {
  text-align: center;
}
.msh-form-head > span:first-child {
  text-align: left;
  padding-left: 2px;
}
.msh-form-row {
  border-bottom: 1px solid #eef4f2;
}
.msh-form-row:last-child {
  border-bottom: none;
}
.msh-form-row:nth-child(even) {
  background: #fafcfb;
}
.msh-proc {
  font-size: 12px;
  font-weight: 600;
  color: var(--text, #0f172a);
  line-height: 1.25;
  padding-right: 2px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.msh-cell {
  display: block;
  margin: 0;
  min-width: 0;
}
.msh-cell-label {
  display: none;
}
.msh-cell > input {
  width: 100%;
  box-sizing: border-box;
  min-height: 30px;
  padding: 5px 8px;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  font-size: 12px;
  text-align: center;
  background: #fff;
  color: var(--text);
}
.msh-cell > input:focus {
  outline: 2px solid rgba(13, 148, 136, 0.28);
  border-color: #0d9488;
}
.msh-form-row.std-tone-weld .msh-proc { color: #0f766e; }
.msh-form-row.std-tone-motor .msh-proc { color: #1d4ed8; }
.msh-form-row.std-tone-laser .msh-proc { color: #6d28d9; }
.msh-form-row.std-tone-parts .msh-proc { color: #b45309; }
.msh-form-row.std-tone-assy .msh-proc { color: #047857; }
.msh-form-row.std-tone-aging .msh-proc { color: #be123c; }
.msh-form-row.std-tone-packParts .msh-proc { color: #0e7490; }
.msh-form-row.std-tone-pack .msh-proc { color: #4338ca; }
@media (max-width: 640px) {
  .msh-form-base {
    grid-template-columns: 1fr;
  }
  .msh-form-head {
    display: none;
  }
  .msh-form-row {
    grid-template-columns: 1fr;
    gap: 6px;
    padding: 10px;
    min-height: 0;
  }
  .msh-proc {
    margin-bottom: 2px;
    white-space: normal;
  }
  .msh-cell-label {
    display: block;
    font-size: 11px;
    color: var(--muted, #64748b);
    margin-bottom: 2px;
  }
  .msh-cell > input {
    text-align: left;
  }
}

/* —— 手机出入库端口 —— */
.wms-mobile-pane {
  width: 100%;
  max-width: none;
}
.wms-mobile-pane .wms-mobile-body {
  width: 100%;
  max-width: none;
  margin: 0;
  padding: 12px 12px 28px;
  overflow: auto;
  box-sizing: border-box;
}
body.wms-mobile-active #pane-wms-mobile,
body.wms-mobile-active #pane-wms-mobile .wms-mobile-body {
  width: 100%;
  max-width: none;
}
.wms-m-type {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
  margin-bottom: 14px;
}
.wms-m-type-btn {
  min-height: 48px;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  background: #fff;
  font-size: 17px;
  font-weight: 600;
  color: #334155;
  cursor: pointer;
}
.wms-m-type-btn.active {
  background: #0f766e;
  border-color: #0f766e;
  color: #fff;
}
.wms-m-type-btn[data-type="出库"].active {
  background: #b45309;
  border-color: #b45309;
}
.wms-m-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  margin-bottom: 10px;
}
.wms-m-grid[hidden] {
  display: none !important;
}
.wms-mobile-pane .field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-bottom: 10px;
}
.wms-mobile-pane .field[hidden] {
  display: none !important;
}
.wms-mobile-pane .field > span {
  font-size: 13px;
  color: #64748b;
  font-weight: 600;
}
.wms-mobile-pane .field input:not(.mf-dt-native),
.wms-mobile-pane .field select {
  min-height: 46px;
  font-size: 16px;
  border-radius: 0;
  border: 1px solid #cbd5e1;
  padding: 8px 12px;
  width: 100%;
  box-sizing: border-box;
}
.wms-m-code-field input,
.wms-m-qty-field input {
  min-height: 54px !important;
  font-size: 20px !important;
  font-weight: 600;
}
.wms-m-meta {
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  padding: 10px 12px;
  margin-bottom: 12px;
  display: grid;
  gap: 6px;
  font-size: 14px;
  color: #0f172a;
}
.wms-m-meta .wms-m-k {
  display: inline-block;
  min-width: 2.5em;
  color: #64748b;
  margin-right: 8px;
}
.wms-m-stock {
  color: #0f766e;
  font-weight: 600;
}
.wms-m-msg {
  margin: 8px 0 12px;
  padding: 10px 12px;
  border-radius: 0;
  font-size: 15px;
  font-weight: 600;
}
.wms-m-msg.is-ok {
  background: #ecfdf5;
  color: #047857;
}
.wms-m-msg.is-error {
  background: #fef2f2;
  color: #b91c1c;
}
.wms-m-actions {
  display: grid;
  grid-template-columns: 1fr 2fr;
  gap: 10px;
  margin-top: 8px;
}
.wms-m-actions .tb-btn {
  min-height: 52px;
  font-size: 17px;
  border-radius: 0;
}
.wms-m-submit {
  background: #0f766e !important;
  color: #fff !important;
  border-color: #0f766e !important;
}
body.wms-mobile-active #pane-wms-mobile .page-header {
  padding-bottom: 6px;
}
@media (max-width: 640px) {
  .wms-mobile-pane .wms-mobile-body {
    padding: 10px 10px 28px;
  }
}

.wms-m-code-row {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 8px;
  align-items: stretch;
}
.wms-m-code-row .mf-suggest {
  min-width: 0;
}
.wms-m-code-row .mf-suggest > input {
  min-height: 54px;
  font-size: 16px;
}
.mf-suggest-menu.wms-m-code-menu {
  max-width: none;
}
.mf-suggest-menu.wms-m-code-menu .mf-suggest-item {
  white-space: normal;
  word-break: break-all;
  font-size: 13px;
  padding: 12px;
}
.wms-m-scan-btn {
  min-width: 72px;
  min-height: 54px !important;
  font-size: 16px !important;
  font-weight: 700;
  background: #0f766e !important;
  color: #fff !important;
  border-color: #0f766e !important;
  border-radius: 0 !important;
}
.wms-scan-modal .wms-scan-card {
  width: min(560px, 100%);
}
.wms-scan-reader {
  position: relative;
  width: 100%;
  min-height: 320px;
  background: #0f172a;
  border-radius: 0;
  overflow: hidden;
}
.wms-scan-reader video,
#wms-scan-video {
  width: 100% !important;
  max-height: 70vh;
  object-fit: cover;
  border-radius: 0;
  display: block;
  background: #000;
}
.wms-scan-hint {
  margin: 10px 0 0;
  text-align: center;
  color: #0f766e;
  font-size: 14px;
  font-weight: 700;
}

/* 手机出入库防呆 */
.wms-m-context {
  display: grid;
  grid-template-columns: 88px 1fr;
  gap: 10px;
  align-items: center;
  margin-bottom: 12px;
  padding: 10px 12px;
  border-radius: 0;
  border: 2px solid #0f766e;
  background: #ecfdf5;
  z-index: 5;
}
.wms-m-context[hidden] {
  display: none !important;
}
#pane-wms-mobile[data-txn="出库"] .wms-m-context {
  border-color: #c2410c;
  background: #fff7ed;
}
.wms-m-ctx-type {
  min-height: 56px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 0;
  font-size: 22px;
  font-weight: 800;
  color: #fff;
  background: #0f766e;
}
.wms-m-ctx-type.is-out {
  background: #c2410c;
}
.wms-m-ctx-wh {
  font-size: 18px;
  font-weight: 800;
  color: #0f172a;
  line-height: 1.25;
}
.wms-m-ctx-loc {
  margin-top: 2px;
  font-size: 13px;
  color: #64748b;
}
.wms-m-context.flash,
.wms-m-place-box.flash {
  animation: wms-m-flash 0.7s ease;
}
@keyframes wms-m-flash {
  0%, 100% { box-shadow: none; }
  40% { box-shadow: 0 0 0 3px rgba(15, 118, 110, 0.45); }
}
#pane-wms-mobile[data-txn="出库"] .wms-m-context.flash,
#pane-wms-mobile[data-txn="出库"] .wms-m-place-box.flash {
  animation-name: wms-m-flash-out;
}
@keyframes wms-m-flash-out {
  0%, 100% { box-shadow: none; }
  40% { box-shadow: 0 0 0 3px rgba(194, 65, 12, 0.45); }
}
.wms-m-place-box {
  margin-bottom: 12px;
  padding: 10px;
  border-radius: 0;
  border: 1px dashed #94a3b8;
  background: #f8fafc;
}
.wms-m-place-title {
  font-size: 13px;
  font-weight: 700;
  color: #b45309;
  margin-bottom: 8px;
}
#pane-wms-mobile[data-txn="出库"] .wms-m-place-title {
  color: #c2410c;
}
.wms-m-wh-field select {
  font-weight: 700;
  border-color: #f59e0b !important;
  background: #fffbeb !important;
}
#pane-wms-mobile[data-txn="出库"] {
  background: linear-gradient(180deg, #fff7ed 0, transparent 120px);
}
#pane-wms-mobile[data-txn="入库"] {
  background: linear-gradient(180deg, #ecfdf5 0, transparent 120px);
}
#pane-wms-mobile[data-txn="调整"] {
  background: linear-gradient(180deg, #e0f2fe 0, transparent 120px);
}
#pane-wms-mobile[data-txn="出库"] .wms-m-type-btn.active {
  background: #c2410c;
  border-color: #c2410c;
}
#pane-wms-mobile .wms-m-submit.is-out,
#pane-wms-mobile .wms-m-confirm-ok.is-out {
  background: #c2410c !important;
  border-color: #c2410c !important;
  color: #fff !important;
}
#pane-wms-mobile .wms-m-submit.is-in {
  background: #0f766e !important;
  border-color: #0f766e !important;
}
#pane-wms-mobile .wms-m-submit.is-corr,
#pane-wms-mobile .wms-m-confirm-ok.is-corr {
  background: #0369a1 !important;
  border-color: #0369a1 !important;
  color: #fff !important;
}
#pane-wms-mobile .wms-m-submit.is-adj,
#pane-wms-mobile .wms-m-confirm-ok.is-adj {
  background: #a16207 !important;
  border-color: #a16207 !important;
  color: #fff !important;
}
.wms-m-meta.has-product {
  border-color: #0f766e;
  background: #f0fdfa;
}
.wms-m-meta strong {
  font-size: 15px;
  color: #0f172a;
}
.wms-m-stock.is-zero {
  color: #b91c1c;
}
.wms-m-confirm-modal .wms-m-confirm-card {
  width: min(440px, 100%);
}
.wms-m-confirm-type {
  text-align: center;
  font-size: 36px;
  font-weight: 900;
  letter-spacing: 0.12em;
  padding: 12px;
  border-radius: 0;
  color: #fff;
  background: #0f766e;
  margin-bottom: 12px;
}
.wms-m-confirm-type.is-out {
  background: #c2410c;
}
.wms-m-confirm-type.is-corr {
  background: #0369a1;
}
.wms-m-confirm-type.is-adj {
  background: #a16207;
}
.wms-m-confirm-dl {
  margin: 0;
  display: grid;
  gap: 8px;
}
.wms-m-confirm-dl > div {
  display: grid;
  grid-template-columns: 72px 1fr;
  gap: 8px;
  padding: 8px 10px;
  border-radius: 0;
  background: #f8fafc;
}
.wms-m-confirm-dl dt {
  margin: 0;
  color: #64748b;
  font-size: 13px;
}
.wms-m-confirm-dl dd {
  margin: 0;
  font-weight: 700;
  font-size: 15px;
  color: #0f172a;
  word-break: break-all;
}
.wms-m-confirm-warn {
  margin: 12px 0 0;
  padding: 10px 12px;
  border-radius: 0;
  background: #ecfdf5;
  color: #047857;
  font-size: 14px;
  font-weight: 600;
}
.wms-m-confirm-warn.is-danger {
  background: #fef2f2;
  color: #b91c1c;
}
.wms-m-confirm-check {
  display: flex;
  gap: 8px;
  align-items: flex-start;
  margin-top: 12px;
  font-size: 14px;
  font-weight: 600;
  color: #334155;
}
.wms-m-confirm-check input {
  width: 18px;
  height: 18px;
  margin-top: 2px;
}
.wms-m-grid .field-span-2 {
  grid-column: 1 / -1;
}

/* 手机出入库 · 入口选择（按地点上下分区，铺满屏宽） */
.wms-m-home {
  padding: 2px 0 16px;
  width: 100%;
  box-sizing: border-box;
}
.wms-m-home-tip {
  font-size: 14px;
  font-weight: 600;
  color: #64748b;
  margin-bottom: 12px;
  text-align: center;
}
.wms-m-home-grid {
  display: flex;
  flex-direction: column;
  gap: 18px;
  width: 100%;
}
.wms-m-home-section {
  display: flex;
  flex-direction: column;
  gap: 10px;
  width: 100%;
}
.wms-m-home-col {
  display: block;
  text-align: center;
  font-size: 18px;
  font-weight: 800;
  color: #0f172a;
  padding: 12px 0;
  border-radius: 0;
  background: #e2e8f0;
  letter-spacing: 0.12em;
}
.wms-m-home-cards {
  display: grid;
  grid-template-columns: 1fr;
  gap: 10px;
  width: 100%;
}
.wms-m-home-cell {
  background: #fff;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  padding: 12px 12px 14px;
  display: grid;
  grid-template-columns: 72px 1fr;
  gap: 10px;
  align-items: center;
  width: 100%;
  box-sizing: border-box;
}
.wms-m-home-cat {
  font-size: 16px;
  font-weight: 800;
  color: #334155;
  text-align: center;
}
.wms-m-home-pair {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
}
.wms-m-home-btn {
  min-height: 52px;
  border-radius: 0;
  border: 2px solid #0f766e;
  background: #ecfdf5;
  padding: 10px 6px;
  cursor: pointer;
  text-align: center;
  font-size: 16px;
  font-weight: 800;
  color: #0f766e;
  line-height: 1.2;
}
.wms-m-home-btn.is-out {
  border-color: #c2410c;
  background: #fff7ed;
  color: #c2410c;
}
.wms-m-home-btn.is-corr {
  border-color: #0369a1;
  background: #e0f2fe;
  color: #0369a1;
}
.wms-m-home-btn.is-adj {
  border-color: #a16207;
  background: #fefce8;
  color: #a16207;
}
.wms-m-home-btn:active {
  transform: scale(0.97);
  filter: brightness(0.96);
}
.wms-m-home-region,
.wms-m-home-main {
  display: none;
}
@media (min-width: 720px) {
  .wms-m-home-cards {
    grid-template-columns: 1fr 1fr;
  }
  .wms-m-home-cell {
    grid-template-columns: 1fr;
    gap: 10px;
  }
  .wms-m-home-cat {
    text-align: center;
  }
}
.wms-m-ops-bar {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 8px;
  align-items: center;
  margin-bottom: 10px;
}
.wms-m-ops-mode {
  font-size: 15px;
  font-weight: 800;
  color: #0f766e;
  text-align: right;
}
.wms-m-ops-mode.is-out {
  color: #c2410c;
}
.wms-m-ops-mode.is-corr {
  color: #0369a1;
}
.wms-m-ops-mode.is-adj {
  color: #a16207;
}
.wms-m-ctx-type.is-corr {
  background: #0369a1;
}
.wms-m-ctx-type.is-adj {
  background: #a16207;
}

.wms-m-ctx-loc-row {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 6px;
}
.wms-m-ctx-loc-lab {
  font-size: 13px;
  color: #64748b;
  font-weight: 600;
  flex: 0 0 auto;
}
.wms-m-loc-inline {
  flex: 1;
  min-height: 36px;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  padding: 4px 8px;
  font-size: 15px;
  font-weight: 600;
  background: #fff;
}

/* —— 手机生产报工 —— */
.mes-mobile-pane .mes-mobile-body {
  padding: 12px;
  overflow: auto;
}
body.mes-mobile-active #pane-mes-mobile,
body.mes-mobile-active #pane-mes-mobile .mes-mobile-body {
  max-width: none;
}
.mes-mobile-pane .field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-bottom: 10px;
}
.mes-mobile-pane .field > span {
  font-size: 13px;
  font-weight: 700;
  color: #475569;
}
.mes-mobile-pane .field input:not(.mf-dt-native),
.mes-mobile-pane .field select {
  min-height: 44px;
  font-size: 16px;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  padding: 8px 12px;
  background: #fff;
}
.mes-m-search-row {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 8px;
  margin-bottom: 10px;
}
.mes-m-search-row input {
  min-height: 44px;
  font-size: 16px;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  padding: 8px 12px;
}
.mes-m-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.mes-m-card {
  text-align: left;
  width: 100%;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  background: #fff;
  padding: 12px;
  cursor: pointer;
}
.mes-m-card:active {
  background: #f8fafc;
}
.mes-m-card-top {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
  margin-bottom: 4px;
}
.mes-m-card-top strong {
  font-size: 16px;
  color: #0f172a;
}
.mes-m-pill {
  font-size: 12px;
  font-weight: 700;
  color: #0f766e;
  background: #ccfbf1;
  border-radius: 999px;
  padding: 2px 8px;
}
.mes-m-card-row {
  font-size: 14px;
  color: #334155;
  margin-bottom: 6px;
}
.mes-m-card-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  font-size: 13px;
  color: #64748b;
}
.mes-m-card-meta .is-remain,
.mes-m-meta-qty .is-remain {
  color: #c2410c;
  font-weight: 700;
}
.mes-m-ops-bar {
  margin-bottom: 10px;
}
.mes-m-meta {
  border: 1px solid #e2e8f0;
  border-radius: 0;
  background: #f8fafc;
  padding: 12px;
  margin-bottom: 12px;
  display: grid;
  gap: 6px;
}
.mes-m-meta .mes-m-k {
  display: inline-block;
  min-width: 3.2em;
  color: #64748b;
  font-size: 13px;
  font-weight: 600;
  margin-right: 6px;
}
.mes-m-meta-qty {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin-top: 4px;
  font-size: 14px;
  color: #475569;
}
.mes-m-row2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
}
.mes-m-qty-field input {
  font-size: 22px;
  font-weight: 800;
}
.mes-m-msg {
  margin: 4px 0 10px;
  padding: 8px 10px;
  border-radius: 0;
  font-size: 14px;
  background: #f1f5f9;
  color: #334155;
}
.mes-m-msg.is-ok {
  background: #ecfdf5;
  color: #047857;
}
.mes-m-msg.is-error {
  background: #fef2f2;
  color: #b91c1c;
}
.mes-m-actions {
  display: grid;
  grid-template-columns: 1fr 2fr;
  gap: 8px;
  margin-bottom: 16px;
}
.mes-m-actions .tb-btn {
  min-height: 46px;
  font-size: 16px;
}
.mes-m-submit {
  background: #0f766e !important;
  color: #fff !important;
  border-color: #0f766e !important;
  font-weight: 800;
}
.mes-m-recent-title {
  font-size: 13px;
  font-weight: 800;
  color: #64748b;
  margin-bottom: 8px;
}
.mes-m-recent {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding-bottom: 24px;
}
.mes-m-recent-item {
  border: 1px solid #e2e8f0;
  border-radius: 0;
  padding: 8px 10px;
  background: #fff;
}
.mes-m-recent-main {
  display: flex;
  justify-content: space-between;
  gap: 8px;
  font-size: 14px;
}
.mes-m-recent-main strong {
  color: #0f766e;
  font-size: 16px;
}
.mes-m-recent-sub {
  margin-top: 2px;
  font-size: 12px;
  color: #94a3b8;
}
.mes-m-recent-empty {
  font-size: 13px;
  color: #94a3b8;
  padding: 8px 0;
}
body.mes-mobile-active #pane-mes-mobile .page-header {
  position: sticky;
  top: 0;
  z-index: 5;
  background: #fff;
}

/* —— 系统功能介绍首页（商务科技 · 链路分栏） —— */
@keyframes home-hero-in {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes home-card-in {
  from { opacity: 0; transform: translateY(20px) scale(0.98); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes home-flow-pulse {
  0%, 100% { opacity: 0.35; transform: scaleX(0.8); }
  50% { opacity: 1; transform: scaleX(1); }
}
@keyframes home-orbit-spin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}
@keyframes home-shine {
  0% { transform: translateX(-120%) skewX(-18deg); }
  100% { transform: translateX(220%) skewX(-18deg); }
}

.home-intro-body {
  padding: 0 0 28px;
  background:
    radial-gradient(ellipse 70% 36% at 90% 8%, rgba(254, 102, 26, 0.12), transparent 55%),
    radial-gradient(ellipse 50% 30% at 10% 70%, rgba(224, 85, 16, 0.08), transparent 50%),
    linear-gradient(180deg, #fff7ed 0%, #fffaf5 22%, #ffffff 100%);
  position: relative;
  overflow: auto;
}
.home-intro-stage {
  position: relative;
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 18px;
  align-items: center;
  padding: 18px 22px 16px;
  margin: 0;
  background:
    radial-gradient(ellipse 65% 140% at -5% 40%, rgba(255, 180, 120, 0.28), transparent 55%),
    radial-gradient(ellipse 45% 90% at 100% -20%, rgba(255, 140, 60, 0.22), transparent 50%),
    linear-gradient(125deg, #e05510 0%, #fe661a 48%, #ff8a3d 100%);
  color: #fff;
  overflow: hidden;
  animation: home-hero-in 0.5s ease both;
}
.home-intro-stage::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255,255,255,0.08) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,0.08) 1px, transparent 1px);
  background-size: 28px 28px;
  mask-image: linear-gradient(100deg, rgba(0,0,0,0.5), transparent 70%);
  pointer-events: none;
}
.home-intro-stage::after {
  content: "";
  position: absolute;
  width: 220px;
  height: 220px;
  right: -40px;
  top: -70px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255,255,255,0.2), transparent 68%);
  pointer-events: none;
}
.home-intro-hero {
  position: relative;
  z-index: 1;
  max-width: 720px;
}
.home-intro-kicker {
  margin: 0 0 6px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.28em;
  color: rgba(204, 251, 241, 0.92);
  text-transform: uppercase;
}
.home-intro-brand {
  font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
  font-size: clamp(1.85rem, 4.2vw, 2.55rem);
  font-weight: 800;
  letter-spacing: 0.01em;
  color: #fff;
  line-height: 1.1;
  text-shadow: 0 8px 28px rgba(0, 0, 0, 0.18);
}
.home-intro-brand span {
  color: #99f6e4;
}
.home-intro-lead {
  margin: 8px 0 0;
  font-size: 14px;
  color: rgba(240, 253, 250, 0.92);
  line-height: 1.5;
  max-width: 34em;
}
.home-intro-flow {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 7px;
  margin: 14px 0 0;
}
.home-intro-flow span {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 50px;
  padding: 6px 11px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 800;
  letter-spacing: 0.08em;
  color: #0f766e;
  background: rgba(255, 255, 255, 0.94);
  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12);
}
.home-intro-flow i {
  width: 16px;
  height: 3px;
  border-radius: 0;
  background: linear-gradient(90deg, rgba(153,246,228,0.3), #99f6e4, rgba(153,246,228,0.3));
  animation: home-flow-pulse 1.6s ease-in-out infinite;
}
.home-intro-flow i:nth-child(4) { animation-delay: 0.12s; }
.home-intro-flow i:nth-child(6) { animation-delay: 0.24s; }
.home-intro-flow i:nth-child(8) { animation-delay: 0.36s; }
.home-intro-flow i:nth-child(10) { animation-delay: 0.48s; }

.home-intro-hero-aside {
  position: relative;
  z-index: 1;
  padding-right: 6px;
}
.home-intro-orbit {
  width: 88px;
  height: 88px;
  border-radius: 50%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  background: rgba(255, 255, 255, 0.14);
  border: 1px solid rgba(255, 255, 255, 0.35);
  box-shadow: 0 10px 28px rgba(0, 0, 0, 0.16);
  position: relative;
}
.home-intro-orbit::before {
  content: "";
  position: absolute;
  inset: -7px;
  border-radius: 50%;
  border: 1px dashed rgba(255, 255, 255, 0.4);
  animation: home-orbit-spin 16s linear infinite;
}
.home-intro-orbit b {
  font-size: 28px;
  font-weight: 800;
  line-height: 1;
  color: #fff;
}
.home-intro-orbit small {
  margin-top: 3px;
  font-size: 10px;
  letter-spacing: 0.08em;
  color: rgba(236, 253, 245, 0.9);
}

.home-intro-panels {
  position: relative;
  width: min(1720px, calc(100% - 32px));
  max-width: 1720px;
  margin: 0 auto;
  padding: 20px 0 0;
}
.home-intro-panel + .home-intro-panel {
  margin-top: 22px;
}
.home-intro-sec-head {
  display: flex;
  align-items: baseline;
  justify-content: center;
  gap: 12px;
  margin: 0 0 14px;
}
.home-intro-sec-head strong {
  font-size: 15px;
  font-weight: 800;
  color: #0f172a;
  letter-spacing: 0.02em;
}
.home-intro-sec-head span {
  font-size: 13px;
  color: #64748b;
}
.home-intro-sub {
  margin: 18px 0 0;
  font-size: 13px;
  color: #94a3b8;
  line-height: 1.45;
  text-align: center;
}

.home-intro-grid {
  position: relative;
  display: grid;
  gap: 18px;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  grid-auto-flow: row dense;
}
.home-intro-grid.is-primary,
.home-intro-grid.is-support {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

.home-intro-card {
  --accent: #0d9488;
  --accent-deep: #0f766e;
  --accent-soft: rgba(13, 148, 136, 0.14);
  display: flex;
  flex-direction: column;
  align-items: stretch;
  text-align: left;
  padding: 0;
  border: 1px solid rgba(15, 23, 42, 0.06);
  border-radius: 0;
  background: #fff;
  box-shadow: 0 12px 30px rgba(15, 23, 42, 0.06);
  cursor: pointer;
  color: inherit;
  font: inherit;
  position: relative;
  overflow: hidden;
  transition: transform 0.22s ease, box-shadow 0.22s ease, border-color 0.22s ease;
  animation: home-card-in 0.48s ease both;
  animation-delay: calc(var(--i, 0) * 0.06s + 0.1s);
}
.home-intro-card.is-primary {
  min-height: 268px;
  box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08);
}
.home-intro-card.is-support {
  min-height: 228px;
}
.home-intro-card-shine {
  position: absolute;
  inset: 0;
  width: 40%;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,0.35), transparent);
  transform: translateX(-120%) skewX(-18deg);
  pointer-events: none;
  z-index: 2;
  opacity: 0;
}
.home-intro-card:hover .home-intro-card-shine {
  opacity: 1;
  animation: home-shine 0.7s ease;
}
.home-intro-card:hover {
  transform: translateY(-7px) scale(1.01);
  border-color: var(--accent);
  box-shadow: 0 24px 44px rgba(15, 23, 42, 0.14);
}
.home-intro-card:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
}
.home-intro-card.accent-crm { --accent: #14b8a6; --accent-deep: #0f766e; --accent-soft: rgba(20, 184, 166, 0.16); }
.home-intro-card.accent-mes { --accent: #0ea5e9; --accent-deep: #0369a1; --accent-soft: rgba(14, 165, 233, 0.16); }
.home-intro-card.accent-srm { --accent: #f97316; --accent-deep: #c2410c; --accent-soft: rgba(249, 115, 22, 0.16); }
.home-intro-card.accent-wms { --accent: #10b981; --accent-deep: #047857; --accent-soft: rgba(16, 185, 129, 0.16); }
.home-intro-card.accent-plm { --accent: #2dd4bf; --accent-deep: #0f766e; --accent-soft: rgba(45, 212, 191, 0.16); }
.home-intro-card.accent-qms { --accent: #f59e0b; --accent-deep: #b45309; --accent-soft: rgba(245, 158, 11, 0.16); }
.home-intro-card.accent-usr { --accent: #64748b; --accent-deep: #334155; --accent-soft: rgba(100, 116, 139, 0.14); }

.home-intro-card-band {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 64px;
  padding: 14px 16px;
  background:
    radial-gradient(circle at 100% 0%, rgba(255,255,255,0.26), transparent 42%),
    linear-gradient(135deg, var(--accent-deep), var(--accent));
  color: #fff;
}
.home-intro-card.is-primary .home-intro-card-band {
  min-height: 88px;
  padding: 18px 20px;
}
.home-intro-step {
  font-size: 12px;
  font-weight: 800;
  letter-spacing: 0.12em;
  color: rgba(255, 255, 255, 0.75);
  min-width: 24px;
}
.home-intro-mark {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 60px;
  height: 34px;
  padding: 0 12px;
  border-radius: 0;
  font-size: 13px;
  font-weight: 800;
  letter-spacing: 0.1em;
  color: var(--accent-deep);
  background: rgba(255, 255, 255, 0.96);
  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.14);
}
.home-intro-card.is-primary .home-intro-mark {
  min-width: 68px;
  height: 36px;
  font-size: 14px;
}
.home-intro-tip {
  margin-left: auto;
  font-size: 13px;
  font-weight: 650;
  letter-spacing: 0.06em;
  color: rgba(255, 255, 255, 0.92);
}
.home-intro-card-body {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 9px;
  padding: 16px 18px 18px;
  flex: 1;
}
.home-intro-card.is-primary .home-intro-card-body {
  padding: 18px 20px 20px;
}
.home-intro-card-title {
  font-size: 18px;
  font-weight: 800;
  color: #0f172a;
  letter-spacing: 0.01em;
}
.home-intro-card.is-primary .home-intro-card-title {
  font-size: 21px;
}
.home-intro-card-desc {
  font-size: 13.5px;
  color: #64748b;
  line-height: 1.55;
  flex: 1;
}
.home-intro-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.home-intro-tags em {
  font-style: normal;
  font-size: 11px;
  font-weight: 650;
  padding: 3px 8px;
  border-radius: 999px;
  color: var(--accent-deep);
  background: var(--accent-soft);
}
.home-intro-card-go {
  margin-top: 2px;
  font-size: 13px;
  font-weight: 750;
  color: var(--accent-deep);
  letter-spacing: 0.02em;
}
/* 2026-10-03 pickrec12：功能介绍卡片内直达链接（领料/退料/超领/即时库存） */
.home-intro-links {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.home-intro-card-link {
  font-size: 12px;
  font-weight: 700;
  padding: 4px 10px;
  border-radius: 999px;
  color: #fff;
  background: var(--accent-deep, #2563eb);
  cursor: pointer;
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.home-intro-card-link:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(15, 23, 42, 0.25);
  text-decoration: underline;
}
.home-intro-card-go::after {
  content: " →";
  display: inline-block;
  transition: transform 0.2s ease;
}
.home-intro-card:hover .home-intro-card-go::after {
  transform: translateX(5px);
}

/* 主链路桌面 4 列：卡片自动换行填位，不再画三列流程箭头 */
.home-intro-grid.is-primary {
  position: relative;
}
.home-intro-grid.is-primary::before,
.home-intro-grid.is-primary::after {
  display: none;
}

@media (max-width: 1100px) {
  .home-intro-grid.is-primary,
  .home-intro-grid.is-support {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
@media (max-width: 960px) {
  .home-intro-grid.is-primary,
  .home-intro-grid.is-support { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .home-intro-hero-aside { display: none; }
  .home-intro-stage { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  .home-intro-stage { padding: 16px 14px 14px; }
  .home-intro-panels {
    width: calc(100% - 24px);
    padding: 14px 0 0;
  }
  .home-intro-sec-head { justify-content: flex-start; flex-wrap: wrap; }
  .home-intro-sub { text-align: left; }
  .home-intro-grid.is-primary,
  .home-intro-grid.is-support { grid-template-columns: 1fr; gap: 10px; }
  .home-intro-brand { font-size: 1.7rem; }
  .home-intro-card.is-primary,
  .home-intro-card.is-support { min-height: 0; }
}

/* ---------- 样品流转单（对标纸质单） ---------- */
/* 全单线条统一：1px / #111（含 PDF html2canvas 导出） */
#view-sample-slip {
  --ss-line: #111;
  --ss-border: 1px solid var(--ss-line);
}
#view-sample-slip.modal-sample-slip {
  /* 须高于 CRM Hub(.modal 2500) / 跟进弹窗(2800)，否则 Hub 内点新增看不见 */
  z-index: 2900;
}
#view-sample-slip .sample-slip-card {
  width: min(1600px, 100%) !important;
  height: min(900px, 94vh) !important;
  max-height: min(900px, 94vh) !important;
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
  border-radius: 0;
  border: 1px solid #DADCE0;
  box-shadow: 0 8px 28px rgba(32, 33, 36, 0.28);
  background: #fff;
}
/* 样品弹窗顶栏/底栏走 mf-desk 40px；导出菜单向上弹出，底栏禁止裁切 */
#view-sample-slip.mf-desk .ss-form-foot {
  justify-content: flex-end;
  overflow: visible;
  max-height: none;
}
#view-sample-slip.mf-desk .ss-form-foot-right {
  display: flex;
  align-items: center;
  gap: 12px;
  height: 100%;
}
#view-sample-slip.mf-desk .ss-form-foot .tb-btn {
  height: 28px;
  padding: 0 12px;
  font-size: 13px;
  line-height: 1;
}
#view-sample-slip .sample-slip-form-body {
  flex: 1;
  min-height: 0;
  overflow: auto;
  padding: 10px 14px 12px;
  background: #e7e5e4;
}
.ss-paper {
  background: #fff;
  border: var(--ss-border);
  padding: 12px 14px 16px;
  max-width: 1180px;
  margin: 0 auto;
  color: #1c1917;
  font-size: 13px;
}
.ss-doc-head {
  display: grid;
  grid-template-columns: 168px minmax(0, 1fr) auto;
  align-items: center;
  gap: 12px 16px;
  min-height: 88px;
  padding: 10px 0 12px;
  margin-bottom: 10px;
  border-bottom: var(--ss-border);
  box-sizing: border-box;
}
.ss-logo {
  width: 160px;
  height: auto;
  max-height: 72px;
  object-fit: contain;
  object-position: left center;
  opacity: 1;
  justify-self: start;
}
#view-sample-slip .ss-doc-titles {
  text-align: center;
  min-width: 0;
}
#view-sample-slip .ss-co {
  font-size: 30px !important;
  font-weight: 700;
  letter-spacing: 2px;
  line-height: 1.2;
  color: #111;
}
#view-sample-slip .ss-doc-title {
  font-size: 30px !important;
  font-weight: 700;
  margin-top: 4px;
  letter-spacing: 4px;
  line-height: 1.2;
  color: #111;
}
.ss-doc-codes {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 2px;
  justify-self: end;
}
.ss-barcode {
  max-width: 260px;
  height: 56px;
}
.ss-print-time {
  font-size: 12px;
  color: #44403c;
}
.ss-sys-row {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 14px;
  margin-bottom: 8px;
  font-size: 12px;
  color: #57534e;
}
.ss-sys-row label {
  display: flex;
  align-items: center;
  gap: 6px;
}
.ss-sys-row .ss-grow {
  flex: 1 1 auto;
  min-width: 180px;
  width: 100%;
}
.ss-sys-row .ss-grow input {
  flex: 1 1 auto;
  min-width: 0;
  width: 100%;
}
.ss-sys-row input,
.ss-sys-row select {
  height: 28px;
  border: var(--ss-border);
  border-radius: 0;
  padding: 0 8px;
  font-size: 12px;
  text-align: center;
  background: #fff;
}
.ss-sheet {
  width: 100%;
  border-collapse: collapse;
  table-layout: fixed;
  background: #fff;
  margin-bottom: 0;
  border: 0;
}
.ss-sheet td,
.ss-sheet th {
  border: var(--ss-border);
  padding: 4px 6px;
  vertical-align: middle;
}
.ss-sheet th {
  background: #f5f5f4;
  font-weight: 600;
  text-align: center;
}
.ss-lab {
  background: #fafaf9;
  font-weight: 600;
  white-space: nowrap;
  width: 96px;
}
.ss-c,
.ss-sheet input.ss-c,
.ss-sheet input.ss-test {
  text-align: center;
}
.ss-sheet input,
.ss-sheet select,
.ss-sheet textarea {
  width: 100%;
  border: none;
  outline: none;
  background: transparent;
  font-size: 13px;
  padding: 2px 0;
  box-sizing: border-box;
  text-align: center;
}
.ss-sheet select { height: 28px; }
/* 抬头表六列等宽：合同主题/客户与下单日期同列宽对齐 */
.ss-head-sheet col {
  width: 16.6667%;
}
.ss-head-sheet .ss-lab {
  width: auto;
  text-align: center;
}
.ss-head-sheet td {
  text-align: center;
}
.ss-head-sheet input,
.ss-head-sheet select {
  text-align: center;
}
.ss-sec-title {
  display: flex;
  align-items: center;
  justify-content: space-between;
  border: var(--ss-border);
  border-bottom: none;
  margin-top: 8px;
  padding: 6px 8px;
  font-weight: 700;
  background: #fafaf9;
}
/* 产品详情：产品行连续一张表；检测区在下方 */
.ss-product-blocks { margin-top: 0; }
.ss-product-lines-table {
  margin: 0;
  border: none;
}
.ss-product-lines-table > colgroup > col { width: 18%; }
.ss-product-lines-table > colgroup > col.ss-col-idx { width: 56px; }
.ss-product-lines-table > colgroup > col.ss-col-unit,
.ss-product-lines-table > colgroup > col.ss-col-qty { width: 72px; }
.ss-product-units { margin-top: 0; }
.ss-product-unit {
  margin: 0;
  border: none;
  background: #fff;
}
.ss-product-unit + .ss-product-unit {
  margin-top: 8px;
}
.ss-product-unit .ss-product-unit-table {
  margin: 0;
  border: none;
}
.ss-product-unit-table > colgroup > col {
  width: 20%;
}
#view-sample-slip .ss-head-sheet td {
  overflow: visible;
}
/* 客户名称可筛选联想：输入框与下拉项一律左对齐（覆盖抬头表居中） */
#view-sample-slip .ss-head-sheet td:has(.ss-customer-suggest) {
  text-align: left;
}
#view-sample-slip .ss-customer-suggest {
  position: relative;
  width: 100%;
  text-align: left;
}
#view-sample-slip .ss-customer-suggest > input {
  width: 100%;
  text-align: left !important;
  padding: 2px 6px;
}
#view-sample-slip .ss-customer-menu {
  z-index: 220;
  border-radius: 0;
  border: var(--ss-border);
  box-shadow: 0 8px 20px rgba(0, 0, 0, 0.12);
  max-height: min(320px, 46vh);
  text-align: left;
}
#view-sample-slip .ss-customer-menu .mf-suggest-item {
  text-align: left !important;
}
#view-sample-slip.ss-exporting .ss-customer-menu {
  display: none !important;
}
.ss-split-head {
  padding: 0 !important;
}
.ss-split-head-wrap,
.ss-split-wrap {
  display: flex;
  align-items: stretch;
  width: 100%;
  min-height: 100%;
}
.ss-split-head-wrap span,
.ss-split-wrap input {
  flex: 1 1 0;
  width: 0;
  min-width: 0;
  box-sizing: border-box;
  padding: 4px 6px;
}
.ss-split-head-wrap span {
  text-align: center;
}
.ss-split-wrap input {
  border: none !important;
  outline: none !important;
  box-shadow: none !important;
  background: transparent !important;
  padding: 4px 6px !important;
}
/* 独立 1px 竖线：与表框同色同粗 */
.ss-split-v {
  flex: 0 0 1px;
  width: 1px;
  align-self: stretch;
  margin: 0;
  padding: 0;
  border: 0;
  background: var(--ss-line);
  font-style: normal;
}
.ss-split-cell {
  padding: 0 !important;
}
.ss-r,
.ss-sheet input.ss-r {
  text-align: right;
}
.ss-test-lab {
  text-align: left;
  padding-left: 8px !important;
  padding-right: 4px !important;
}
.ss-remark-cell {
  position: relative;
  padding-right: 28px !important;
}
.ss-rm-line {
  position: absolute;
  right: 4px;
  top: 50%;
  transform: translateY(-50%);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.12s ease;
}
.ss-line-row:hover .ss-rm-line,
.ss-remark-cell:hover .ss-rm-line,
.ss-rm-line:focus {
  opacity: 1;
  pointer-events: auto;
}
.ss-test-groups { margin-top: 8px; }
.ss-test-block { margin-top: 0; }
.ss-test-block col {
  width: 20%;
}
.ss-note-cell input {
  font-size: 12px;
  color: #44403c;
}
.ss-sw-lab { width: auto; text-align: center; }
.ss-proto-cell {
  width: 22%;
  background: #fafaf9;
  vertical-align: top;
  padding: 4px !important;
  height: 1px; /* 配合子元素 height:100% 拉满 rowspan 单元格 */
}
.ss-proto-wrap {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 4px;
  height: 100%;
  min-height: 100%;
  box-sizing: border-box;
}
.ss-proto-lab {
  writing-mode: horizontal-tb;
  letter-spacing: 0;
  font-size: 12px;
  color: #57534e;
  font-weight: 600;
  text-align: center;
  flex: 0 0 auto;
}
.ss-proto-img-box {
  flex: 1 1 auto;
  width: 100%;
  min-height: 220px;
  height: 100%;
  border: var(--ss-border);
  border-radius: 0;
  padding: 6px;
  background: #fff;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
  box-sizing: border-box;
  cursor: pointer;
  position: relative;
  transition: border-color 0.15s ease, background 0.15s ease;
}
.ss-proto-img-box:hover,
.ss-proto-img-box.drag-over {
  border-color: #3b82f6;
  background: #eff6ff;
}
.ss-proto-img-box.has-img {
  border: var(--ss-border);
  cursor: default;
}
.ss-proto-img-box.has-img.drag-over {
  border-color: #3b82f6;
  background: #eff6ff;
}
.ss-proto-preview {
  flex: 1 1 auto;
  width: 100%;
  max-width: 100%;
  min-height: 0;
  height: 100%;
  object-fit: contain;
  display: block;
}
.ss-proto-empty {
  font-size: 12px;
  color: #a8a29e;
  text-align: center;
  padding: 12px 4px;
  line-height: 1.5;
  pointer-events: none;
}
.ss-proto-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  justify-content: center;
  flex: 0 0 auto;
}
.ss-proto-up-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 2px 10px;
  font-size: 12px;
  color: #1d4ed8;
  border: 1px solid #93c5fd;
  border-radius: 0;
  background: #eff6ff;
  cursor: pointer;
  user-select: none;
}
.ss-proto-up-btn:hover {
  background: #dbeafe;
}
.ss-tg-proto {
  display: none;
}
.ss-model-head { width: auto; }
.ss-tg-model {
  width: calc(100% - 40px);
  border: none !important;
  border-bottom: none !important;
  margin-left: 2px;
  outline: none;
  background: transparent;
}
.ss-test-lab {
  white-space: nowrap;
  background: #fafaf9;
  width: auto;
  text-align: left;
  padding-left: 8px;
}
.ss-foot-sheet { margin-top: 8px; }
.ss-foot-sheet col {
  width: 20%;
}
.ss-foot-sheet .ss-lab {
  width: auto;
}
.ss-ship-cell {
  height: 88px;
  vertical-align: top;
  background: #fafaf9;
}
.ss-ship-hint {
  font-size: 12px;
  color: #78716c;
  margin-bottom: 6px;
}
.ss-ship-cell input {
  background: #fff !important;
  border: var(--ss-border) !important;
  border-radius: 0;
  padding: 4px 6px !important;
  margin-bottom: 4px;
  text-align: center;
}
.ss-sign-cell {
  vertical-align: top;
  text-align: center;
  min-height: 88px;
}
.ss-sign-tip {
  font-size: 11px;
  color: #78716c;
  margin-bottom: 4px;
}
.ss-sign-display {
  white-space: pre-line;
  font-size: 13px;
  font-weight: 600;
  color: #1c1917;
  min-height: 36px;
  line-height: 1.35;
  margin-bottom: 4px;
}
.ss-sign-actions {
  display: flex;
  gap: 8px;
  justify-content: center;
  align-items: center;
  flex-wrap: wrap;
}
.ss-sign-btn {
  height: 26px !important;
  padding: 0 10px !important;
  font-size: 12px !important;
}
.ss-sign-set-card {
  width: min(640px, 100%);
  max-width: 640px;
}
.ss-sign-set-list {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.ss-sign-set-row {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.ss-sign-set-lab {
  font-size: 13px;
  font-weight: 600;
  color: #292524;
}
.ss-sign-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  min-height: 34px;
  padding: 8px;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  background: #fafaf9;
}
.ss-sign-empty {
  font-size: 12px;
  color: #a8a29e;
  line-height: 18px;
}
.ss-sign-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 8px;
  border-radius: 999px;
  background: #fff;
  border: 1px solid #d6d3d1;
  font-size: 12px;
  color: #1c1917;
}
.ss-sign-chip-x {
  border: none;
  background: transparent;
  color: #78716c;
  cursor: pointer;
  font-size: 14px;
  line-height: 1;
  padding: 0 2px;
}
.ss-sign-chip-x:hover { color: #b91c1c; }
.ss-sign-set-add {
  width: 100%;
  height: 34px;
  border: 1px solid #d6d3d1;
  border-radius: 0;
  padding: 0 8px;
  font-size: 13px;
  background: #fff;
  box-sizing: border-box;
}
@media (max-width: 900px) {
  .ss-doc-head {
    grid-template-columns: 1fr;
    justify-items: center;
    gap: 8px;
  }
  .ss-logo {
    width: 120px;
    max-height: 56px;
    justify-self: center;
  }
  #view-sample-slip .ss-co,
  #view-sample-slip .ss-doc-title {
    font-size: 30px !important;
  }
  .ss-doc-codes { justify-self: center; }
  .ss-proto-lab { writing-mode: horizontal-tb; }
}

/* 样品流转单 · 导出菜单 */
#view-sample-slip .ss-form-foot {
  justify-content: flex-end;
}
#view-sample-slip .ss-form-foot-right {
  display: flex;
  align-items: center;
  gap: 12px;
}
#view-sample-slip .ss-export-wrap {
  position: relative;
}
#view-sample-slip .ss-export-menu {
  position: absolute;
  right: 0;
  bottom: calc(100% + 6px);
  min-width: 128px;
  padding: 4px;
  background: #fff;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.14);
  z-index: 80;
}
#view-sample-slip .ss-export-menu button {
  display: block;
  width: 100%;
  text-align: left;
  padding: 8px 12px;
  border: none !important;
  background: transparent !important;
  border-radius: 0;
  cursor: pointer;
  font-size: 13px;
  color: #0f172a !important;
}
#view-sample-slip .ss-export-menu button:hover {
  background: #e6f4f2 !important;
  color: var(--primary-dark) !important;
}
#view-sample-slip.ss-exporting #btn-ss-add-line,
#view-sample-slip.ss-exporting .ss-rm-line,
#view-sample-slip.ss-exporting .ss-sign-actions,
#view-sample-slip.ss-exporting .ss-proto-actions,
#view-sample-slip.ss-exporting .ss-proto-empty {
  display: none !important;
}
/* 导出：去掉内嵌控件描边，线条一律 1px #111 */
#view-sample-slip.ss-exporting .ss-sys-row input,
#view-sample-slip.ss-exporting .ss-sys-row select,
#view-sample-slip.ss-exporting .ss-ship-cell input {
  border: var(--ss-border) !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  outline: none !important;
}
#view-sample-slip.ss-exporting .ss-proto-img-box {
  border: var(--ss-border) !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  background: #fff !important;
}
#view-sample-slip.ss-exporting .ss-sheet {
  border: 0 !important;
  border-collapse: collapse !important;
}
#view-sample-slip.ss-exporting .ss-sheet td,
#view-sample-slip.ss-exporting .ss-sheet th {
  border: var(--ss-border) !important;
  outline: 0 !important;
  box-shadow: none !important;
}
#view-sample-slip.ss-exporting .ss-sec-title {
  border: var(--ss-border) !important;
  border-bottom: none !important;
}
#view-sample-slip.ss-exporting .ss-paper {
  border: var(--ss-border) !important;
}
#view-sample-slip.ss-exporting .ss-doc-head {
  border-bottom: var(--ss-border) !important;
}
#view-sample-slip.ss-exporting .ss-split-v {
  background: var(--ss-line) !important;
  width: 1px !important;
  flex-basis: 1px !important;
}

/* —— 流程设置 / 脱敏（对齐国桉康 AuditWorkflowConfigDialog） —— */
.modal.mf-desk .modal-card-desk.modal-card-desk-wf {
  width: max-content;
  max-width: min(100%, 1400px);
  min-width: min(560px, 100%);
  height: auto;
  max-height: min(92vh, 900px);
  display: flex;
  flex-direction: column;
}
.modal.mf-desk .modal-card-desk-wf .modal-body-desk {
  padding: 12px 20px 14px;
}
.modal.mf-desk .modal-card-desk.modal-wf-sensitive {
  width: min(760px, 100%);
  height: auto;
  max-height: min(92vh, 900px);
  display: flex;
  flex-direction: column;
}
.modal.mf-desk .modal-wf-sensitive .modal-body-desk {
  padding: 12px 20px 14px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  flex: 1;
  min-height: 0;
  background: #F0F2F5;
}
.modal.mf-desk .modal-wf-sensitive .wf-banner {
  margin: 0;
  flex: 0 0 auto;
}
/* 须盖过 .modal-foot button 的 background/color !important，否则「确定」白字透明底看不见 */
.modal.mf-desk .modal-foot .desk-btn-primary {
  color: #fff !important;
  background: #0d9488 !important;
  border: none !important;
  font-weight: 500;
  padding: 4px 14px;
  border-radius: 0;
  font-size: 13px;
  cursor: pointer;
  font-family: inherit;
}
.modal.mf-desk .modal-foot .desk-btn-primary:hover {
  background: #0f766e !important;
  color: #fff !important;
}
.modal.mf-desk .modal-foot .desk-btn-secondary {
  color: #334155;
  background: transparent;
  border: 1px solid #cbd5e1;
  font-weight: 500;
  padding: 4px 12px;
  border-radius: 0;
  font-size: 13px;
  cursor: pointer;
  font-family: inherit;
}
.modal.mf-desk .modal-foot .desk-btn-secondary:hover {
  background: #f1f5f9;
}
.wf-banner {
  margin: 0 0 8px;
  padding: 6px 10px;
  background: #E8F0FE;
  color: #174EA6;
  border-radius: 0;
  line-height: 1.45;
  font-size: 13px;
}
.wf-matrix-wrap {
  max-height: min(48vh, 420px);
  overflow: auto;
  border: 1px solid #C5CDD6;
  border-radius: 0;
  background: #fff;
}
.wf-matrix {
  border-collapse: separate;
  border-spacing: 0;
  width: max-content;
  min-width: 100%;
  font-size: 13px;
}
.wf-matrix th,
.wf-matrix td {
  border-bottom: 1px solid #E8ECF0;
  border-right: 1px solid #E8ECF0;
  padding: 4px 6px;
  text-align: center;
  white-space: nowrap;
  vertical-align: middle;
}
.wf-matrix thead th {
  position: sticky;
  top: 0;
  z-index: 2;
  background: #EEF1F6;
  font-weight: 700;
  color: #3C4043;
  padding: 8px 6px;
}
.wf-matrix .wf-user-th {
  position: sticky;
  left: 0;
  z-index: 1;
  text-align: left;
  min-width: 96px;
  max-width: 160px;
  padding-left: 12px;
  padding-right: 8px;
  overflow: hidden;
  text-overflow: ellipsis;
  background: #fff;
  font-weight: 500;
  color: #202124;
}
.wf-matrix thead .wf-user-th {
  z-index: 3;
  background: #EEF1F6;
  color: #3C4043;
  font-weight: 700;
}
.wf-feat-th {
  min-width: 72px;
}
.wf-feat-name {
  font-weight: 700;
  color: #3C4043;
}
.wf-matrix tbody tr.wf-row-odd td,
.wf-matrix tbody tr.wf-row-odd .wf-user-th {
  background: #F5F7FA;
}
.wf-matrix tbody tr:hover td,
.wf-matrix tbody tr:hover .wf-user-th {
  background: #E8F0FE;
}
.wf-ck {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  user-select: none;
  margin: 0;
  position: relative;
}
.wf-ck input {
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
  pointer-events: none;
}
.wf-ck-box {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  box-sizing: border-box;
  border: 1px solid #B0B6BE;
  background: #fff;
  border-radius: 0;
  flex: 0 0 16px;
}
.wf-ck-box::after {
  content: "";
  font-size: 12px;
  font-weight: 700;
  line-height: 1;
  color: #fff;
}
.wf-ck input:checked + .wf-ck-box {
  background: #1A73E8;
  border-color: #1A73E8;
}
.wf-ck input:checked + .wf-ck-box::after {
  content: "✓";
}
.wf-ck-row {
  display: flex;
  justify-content: flex-start;
  gap: 8px;
  padding: 4px 0;
  width: 100%;
}
.wf-ck-text {
  color: #202124;
  font-size: 13px;
  line-height: 1.4;
}
.wf-hint {
  margin: 6px 0 0;
  font-size: 12px;
  color: #5F6368;
  line-height: 1.45;
  word-break: break-word;
}
.wf-sens-matrix {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  align-items: stretch;
  flex: 1;
  min-height: 0;
}
.wf-sens-col {
  display: flex;
  flex-direction: column;
  min-height: 0;
  min-width: 0;
  border: 1px solid #C5CDD6;
  background: #fff;
}
.wf-sens-col-head {
  flex: 0 0 auto;
  padding: 8px 12px;
  background: #EEF1F6;
  border-bottom: 1px solid #C5CDD6;
  font-weight: 700;
  font-size: 13px;
  color: #3C4043;
}
.wf-sens-col-body {
  flex: 1;
  min-height: 220px;
  max-height: min(56vh, 520px);
  overflow: auto;
  background: #fff;
}
.wf-sens-row {
  padding: 2px 8px;
  border-bottom: 1px solid #E8ECF0;
  background: #fff;
}
.wf-sens-row.wf-sens-row-odd {
  background: #F5F7FA;
}
.wf-sens-row:hover {
  background: #E8F0FE;
}
.wf-sens-row .wf-ck-row {
  padding: 4px 0;
  width: 100%;
}
#modal-workflow .modal-body .error,
#modal-workflow .modal-body-desk .error {
  margin: 8px 0 0;
  color: #dc2626;
  font-size: 13px;
  display: none;
}
#modal-workflow .error[hidden] {
  display: none;
}
#modal-workflow .error:not([hidden]) {
  display: block;
}
#modal-workflow .empty {
  padding: 24px;
  text-align: center;
  color: #94a3b8;
  font-size: 13px;
}

/* ── PLM 物料管理：左右分栏（左列表 + 右表单，对标国桉康）── */
#pane-plm.is-plm-split-page .plm-split {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: row;
  align-items: stretch;
  overflow: hidden;
}
/* 非分栏（产品/BOM/工艺/文档单页）：分栏容器占满高度，左区撑开可滚动 */
#pane-plm:not(.is-plm-split-page) .plm-split {
  flex: 1 1 auto;
  min-height: 0;
  display: block;
  overflow: hidden;
}
#pane-plm:not(.is-plm-split-page) .plm-split-left {
  height: 100%;
  flex: 1 1 auto;
  min-height: 0;
}
#pane-plm .plm-split-left {
  /* plmsplit1（2026-11-01 虫哥「就按照当前区域宽度固定不动 → 对，是这个持久化」）：
     左栏宽度改由 --plm-split-left-w 控制（默认 600px），拖分隔条调到多少就记住多少。
     flex-grow / flex-shrink 仍为 0 —— 只有拖拽能改，不随内容/窗口自动伸缩。 */
  flex: 0 0 var(--plm-split-left-w, 600px);
  width: var(--plm-split-left-w, 600px);
  max-width: calc(100% - 320px);
  min-width: 260px;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background: #fff;   /* 物料列表页左右栏白底（用户 2026-10-06 截图红框「背景色改为白色」；
                         2026-09-14 曾改灰底 #eef1f4，现按新要求改回白） */
}
/* 左侧列表 / 文件夹树一律透底，不再各自铺白 */
#pane-plm .plm-split-left #plm-body,
#pane-plm .plm-split-left .plm-tree,
#pane-plm .plm-split-left .table-wrap {
  background: transparent;
}
#pane-plm .plm-split-left #plm-body {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  padding: 0;
}
#pane-plm .plm-split-left #plm-body .table-wrap {
  flex: 1 1 auto;
  height: auto;
  min-height: 0;
  overflow: auto;
  overscroll-behavior: contain; /* 滚动到边缘不连带滚页面/右侧 */
  -webkit-overflow-scrolling: touch;
}
/* plmsplit1：分隔条恢复可用（2026-09-13 曾整条去掉；11-01 虫哥要求「拖过的宽度要记住」）——
   5px 热区，hover/拖拽时高亮，双击回默认 600px */
#pane-plm .plm-split-resizer {
  display: block;
  flex: 0 0 5px;
  width: 5px;
  cursor: col-resize;
  background: transparent;
  border: 0;
  padding: 0;
  pointer-events: auto;
  touch-action: none;
}
#pane-plm .plm-split-resizer:hover,
body.plm-split-dragging #pane-plm .plm-split-resizer {
  background: #7dd3fc;
}
#pane-plm .plm-split-right {
  flex: 1 1 var(--plm-split-right, 42%);
  min-width: 0;
  min-height: 0;
  overflow: hidden;
  background: #fff;   /* 右栏白底（用户 2026-10-06「背景色改为白色」，原 #eef1f4） */
  border-left: 1px solid #cfd6de;
  display: flex;
  flex-direction: column;
}
#pane-plm .plm-split-right .plm-split-right-head {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 8px 12px;
  background: linear-gradient(180deg, #f7fffe 0%, #eef9f7 100%);
  border-bottom: 1px solid #e2e8f0;
}
#pane-plm .plm-split-right .plm-split-right-title {
  font-size: 14px;
  font-weight: 600;
  color: #0f766e;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  flex: 0 1 auto;
  min-width: 0;
}
#pane-plm .plm-split-right .plm-split-right-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 8px;
  margin-left: auto;
  flex: 0 0 auto;
  flex-wrap: nowrap;
  white-space: nowrap;
}
#pane-plm .plm-split-right .plm-split-right-actions .tb-btn {
  margin-left: 0;
}
/* plmtools1（2026-11-01 虫哥「有些用户不习惯右键，在工具栏追加一样的入口」）：
   页头工具栏 新增 / 删除 / 物料类型 —— 与资料卡右键菜单同一套动作与显隐 */
#pane-plm #plm-toolbar .plm-ct-btn {
  font-size: 12px;
  line-height: 1.2;
  padding: 5px 9px;
  border: 1px solid transparent;
  border-radius: 0;
  color: #0f766e;
  background: transparent;
}
#pane-plm #plm-toolbar .plm-ct-btn:hover { background: #e6f4f2; }
#pane-plm #plm-toolbar .plm-ct-btn[hidden] { display: none !important; }
#pane-plm #plm-toolbar #plm-ct-del { color: #dc2626; }
#pane-plm #plm-toolbar #plm-ct-del:hover { background: #fef2f2; }
#pane-plm .plm-split-right .plm-split-right-body {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  /* plmfix2（2026-10-07 用户「点击物料行打开资料卡仍被裁顶半行」）：禁滚动锚定——
     表单搬移/内容变化时 Chrome 自动调 scrollTop 会把顶部推出视口约半行 */
  overflow-anchor: none;
  /* 顶部不留白，内容拉满面板顶部（用户 2026-09-08） */
  padding: 0 10px 10px;
}
#pane-plm .plm-split-right .plm-split-right-empty {
  padding: 40px 16px;
  text-align: center;
  color: #94a3b8;
  font-size: 13px;
}
/* 分栏内嵌表单：去掉弹窗遮罩/居中，填满右侧面板 */
#pane-plm .plm-split-right #view-plm-form {
  position: static;
  inset: auto;
  background: transparent;
  display: flex;
  flex-direction: column;
  height: 100%;
  min-height: 0;
  padding: 0;
  z-index: auto;
  /* plmfix9（2026-10-07 信标数据定案根因）：弹窗态的垂直居中（justify-content:center）
     在此继承生效——内容高于容器时溢出量上下均摊，顶部裁掉 (内容-容器)/2，
     图片加载后内容长高 → 卡头被顶出右栏、盖进顶栏（用户「裁顶」真因，与滚动无关）。
     改顶端对齐后溢出只向下，由右栏外层滚动条承接（用户习惯的拖拽位置）。
   plmfix10（2026-10-07 用户「滚动条操作不了」）：卡片不压缩、随内容撑高，
     表单 min-height:100% 允许高于右栏 → 溢出向下、右栏外层出现纵向滚动条，
     与 plmfix9 前用户的滚动习惯完全一致，且顶端对齐保证卡头不被裁 */
  justify-content: flex-start;
  align-items: stretch;
  height: auto;
  min-height: 100%;
}
#pane-plm .plm-split-right #view-plm-form[hidden] { display: none !important; }
#pane-plm .plm-split-right #view-plm-form .modal-card {
  width: 100%;
  max-height: none;
  border-radius: 0;
  border: 1px solid #e2e8f0;
  box-shadow: 0 2px 10px rgba(15, 23, 42, 0.06);
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  /* plmfix3（2026-10-07）：hidden 可被程序滚动（scrollTop>0 裁掉卡头且拖不回），
     clip 同样裁剪但 scrollTop 恒为 0，从机制上杜绝卡头被滚出视口 */
  overflow: clip;
  /* plmfix10：撤销 plmfix9 的 min-height:0——卡片随内容撑高，
     溢出交给右栏外层滚动条（用户习惯），顶端对齐保证不裁顶 */
}
#pane-plm .plm-split-right #view-plm-form .modal-head {
  display: none;
}
#pane-plm .plm-split-right #view-plm-form .modal-body {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  /* plmfix1（2026-10-07 用户「打开时需要显示顶部内容」）：禁用浏览器滚动锚定——
     异步内容（图片/textarea 撑高）插入时 Chrome 会自动调整 scrollTop 保持锚点，
     把打开时的顶部定位推离；配合 plm.js 多时点兜底清零 */
  overflow-anchor: none;
}
#pane-plm .plm-split-right #view-plm-form .modal-foot {
  display: none;
}

/* ══════════════════════════════════════════════════════════════════
   移除左侧列表栏（用户 2026-09-13）：物料 / 产品 / 半成品分栏页不再显示左列表，
   右侧表单区独占整个工作区宽度（A5 纸张居中呈现）。
   如需恢复左侧列表：整段删除即可（列表 DOM 与加载逻辑均未改动）。
   ══════════════════════════════════════════════════════════════════ */
/* 左侧列表栏恢复（用户 2026-09-13「红框位置显示物料资料」）：
   下面这段隐藏规则是当天上午「移除左列表」时加的，现在整段注释掉即恢复原列表。
   ⚠️ 列表 DOM 与加载逻辑一直没动，纯 CSS 隐藏，注释即可还原。 */
/* #pane-plm.is-plm-split-page:not(.is-plm-doc-page) .plm-split-left,
#pane-plm.is-plm-split-page:not(.is-plm-doc-page) .plm-split-resizer {
  display: none !important;
}
#pane-plm.is-plm-split-page:not(.is-plm-doc-page) .plm-split-right {
  flex: 1 1 100%;
  border-left: none;
} */
/* 物料/产品/半成品页：左侧列表宽度改为自适应（随窗口按 32% 伸缩、最小 360px，
   替代原固定 600px；用户 2026-09-30「左侧区域宽度改为自适应宽度」）。
   注意：此前一度误收缩为 0 导致列表不可见，已纠正。文档页左侧文件夹树不受影响。 */
/* 物料/产品/半成品页：左侧列表宽度跟随内容（2026-09-30 三次调整，用户：
   「左边的内容需要完整显示出来」）——fit-content 让面板按最宽行撑开，名称不截断、
   徽标不被裁；300px 下限防过窄，640px 封顶防挤压右侧表单。文档页不受影响，
   拖拽分隔条的内联宽度仍优先。 */
#pane-plm.is-plm-split-page:not(.is-plm-doc-page) .plm-split-left {
  /* plmsplit1（2026-11-01 虫哥「按当前区域宽度固定不动」→「对，是这个持久化」）：
     原 2026-09-30 的 fit-content 会让左栏随内容宽度变（长名字把面板顶宽），
     现改为「拖到多少就是多少」的定宽：默认 600px，拖分隔条调整并记忆，双击回默认。
     名称超长由 treew1 的省略号处理，不再靠面板变宽来容纳。 */
  flex: 0 0 var(--plm-split-left-w, 600px);
  width: var(--plm-split-left-w, 600px);
  max-width: calc(100% - 320px);
  min-width: 260px;
}
/* fit-content 下面板可能被纵向滚动条吃掉一截行宽 → 最宽行名称又被截。
   预留滚动条槽位，让内在宽度计算把滚动条算进去（Chrome/Edge 支持）。 */
#pane-plm.is-plm-split-page:not(.is-plm-doc-page) .plm-split-left .plm-tree {
  scrollbar-gutter: stable;
}
/* 工作区中央「➕ 新增」入口：左列表移除后，未打开表单时页面唯一的录入入口。
   空态容器铺满整个工作区并双向居中，把按钮顶到工作区正中间。 */
#pane-plm .plm-split-right .plm-split-right-empty {
  height: 100%;
  box-sizing: border-box;
  padding: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}
#pane-plm .plm-split-right .plm-split-right-empty[hidden] {
  display: none !important;
}
#pane-plm .plm-split-right #btn-plm-new-center {
  padding: 16px 52px;
  font-size: 16px;
  letter-spacing: 2px;
  /* .tb-btn 是无边框透明底，放到空工作区中央看不出可点区域，这里显式给边框与底 */
  border: 1px solid var(--primary-dark);
  background: #fff;
  color: var(--primary-dark);
  box-shadow: 0 2px 10px rgba(15, 23, 42, 0.08);
}
#pane-plm .plm-split-right #btn-plm-new-center:hover {
  background: #e6f4f2;
}
#pane-plm .plm-split-right #btn-plm-new-center[hidden] {
  display: none !important;
}

/* ══════════════════════════════════════════════════════════════════
   A4 横向纸张版式 v2（2026-09-13 重排；用户反馈「UI 排版作业性太差」）
   把原「白纸 + 浅橙网格 + 克莱因蓝字」的草稿感，改成接近打印级的专业表单：
     ① 纸张四周补 1px 中性灰边界；纸内不再出现第二个框（原左右各一个 .form-section 橙框）
     ② 顶部 36px 工具条承载「审核/反审/删除/取消/保存」，按钮不再漂浮在纸张外
     ③ 网格线由浅橙 var(--border) 改中性灰 #e8edf3，并改由每格 border 画（线连续、无断口）
     ④ 标签格 #f7f9fb 浅底灰字、值改深色 #1f2937，10px 字号下靠颜色与字重分层
     ⑤ 右栏「图片附件」用虚线空态区撑满，与左栏等高；左右栏之间一条分隔线
   半成品页含 BOM 明细（行数不定）时不套用，避免明细被压进固定纸张。
   ══════════════════════════════════════════════════════════════════ */

/* ── 纸张 ── */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .modal-card {
  /* A4 横版 297mm；面板不够宽 / 屏幕不够高时按宽等比缩小，始终保持横版纸张观感 */
  width: min(297mm, 100%, calc((100vh - 240px) * 1.4143));
  aspect-ratio: 297 / 210;
  height: auto;
  max-height: none;
  flex: 0 0 auto;
  margin: auto;
  background: #fff;
  border: 1px solid #dbe2ea;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
  overflow: hidden;
}
/* ── 卡片标题「物料资料卡」——放在**顶部工具条那一行**、水平居中、字号 30px
   （用户 2026-09-13：「红框内容移到箭头位置，字体=30px」）──
   工具条本身只有 36px 高，所以标题用绝对定位浮在中间：不挤占「⚙ 物料类型」
   与右侧「审核/打印/取消/保存」的位置，也不改变工具条高度。
   文字由 plm.js 的 showForm() 按页设置（物料 / 产品 / 半成品 / 工艺 / 文档资料卡）。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row {
  position: relative;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #plm-form-card-title {
  position: absolute;
  left: 50%;
  top: 0;
  transform: translateX(-50%);
  margin: 0;
  height: 36px;
  /* ⚠️ 必须 !important：app.css 9108-9114 有全局字体锁
     `html, body, #app, #app *:not(script):not(:style) { font-size:12px !important;
     font-weight:400 !important; line-height:1.4 !important }`，
     不加 !important 的话 30px 会被压回 12px（2026-09-13 踩过，量到 fs=12px）。 */
  line-height: 36px !important;
  font-size: 30px !important;
  /* 用户 2026-09-15：「标题不要粗体显示」→ 700 → 400（与全局字体锁的 400 一致，
     仍显式写 !important，避免被其它 .modal-title 规则改粗） */
  font-weight: 400 !important;
  color: #111;
  white-space: nowrap;
  pointer-events: none;   /* 别挡住按钮点击 */
}
/* ── 内容区：工具条 + 表单主体两段直连；内距归零，改由各区自管 ── */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .modal-body {
  display: flex;
  flex-direction: column;
  gap: 0;
  /* 顶部留 8px：标题「物料资料卡」(30px) 原来几乎贴着纸张上边缘
     （用户 2026-09-13：「料资料卡上方太靠近边了」） */
  padding: 8px 0 0;
  overflow: hidden;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .modal-body > #plm-form-error:not([hidden]) {
  flex: 0 0 auto;
  margin: 0;
  padding: 6px 12px;
}

/* ── ① 顶部工具条：⚙ 物料类型 靠左，操作按钮靠右 ── */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row {
  flex: 0 0 auto;
  height: 36px;
  padding: 0 12px;
  /* 该元素 HTML 上带内联 margin，必须 !important 才能归零 */
  margin: 0 !important;
  background: #fff;
  /* 工具条下边线去掉（用户 2026-09-13：「删除料资料卡下方的横线」）。
     表格自己有 border-top，下面还有一条线，不至于整块断开。 */
  border-bottom: none;
}
/* 工具条内的排列由 order 显式定序（不依赖 DOM 顺序 —— 取消/保存是 JS 从 .modal-foot
   搬进来的，DOM 顺序随插入时机变化）：
   右端依次：审核/反审/删除 → 🖨 打印 → 取消 → 保存
   ⚠️「⚙ 物料类型」按钮 **已不在本行**（2026-09-15 用户终版要求：「应该与 基本信息 同行显示」）——
     它现在位于左栏 .plm-material-wrap > .section-title 内，见下方该选择器的规则。
     plm.js 的 placePlmSplitActions() 同步把 insertBefore(btn, matTypesBtn) 改成了 appendChild
     （引用节点不在父容器内时 insertBefore 会抛 NotFoundError）。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-approve,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-unapprove,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-delete {
  order: 2;
}
/* v3.3：「➕ 新增」按钮插在 删除(order:2) 左侧 → order:1（flex 右对齐容器里 order 小者居左） */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-new {
  order: 1;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-print {
  order: 3;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-cancel {
  order: 4;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-save {
  order: 5;
}
/* 保存 = 实心主按钮；取消 = 描边次按钮；审核/反审/删除 保持文字按钮 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-save {
  height: 24px;
  padding: 0 14px;
  background: var(--primary);
  border: 1px solid var(--primary);
  color: #fff;
  font-weight: 600;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-save:hover {
  background: var(--primary-dark);
  border-color: var(--primary-dark);
  color: #fff;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-cancel {
  height: 24px;
  padding: 0 14px;
  background: #fff;
  border: 1px solid #d5dde6;
  color: #334155;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-actions-row > #btn-plm-form-cancel:hover {
  background: #f8fafc;
  border-color: #b8c4d2;
  color: #1e293b;
}

/* ── 表单主体：左字段栏 | 右附件栏 ── */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .form-top-row.plm-form-top-row {
  flex: 1 1 auto;
  min-height: 0;
  gap: 0;
  margin: 0;
  /* 行高显式 1fr：否则 grid 行高按内容收缩，表单区撑不到纸张高度 */
  grid-template-rows: minmax(0, 1fr);
  align-content: stretch;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .form-section-basic {
  min-height: 0;
  padding: 16px 18px 18px;
  gap: 0;
  grid-template-columns: minmax(0, 2.1fr) minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr);
  /* 纸张内不再套第二个框：去掉 .form-section 的橙边框与卡片底 */
  background: transparent;
  border: none;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-basic-fields {
  flex: 1 1 auto;
  min-height: 0;
  /* 顶部对齐：与右侧「图片附件」标题同一条水平线（改成居中会让两个标题错位） */
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
/* 三块（material / product / bom）互斥，显式挡住 [hidden]（否则上面的 display:flex 会穿透） */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap[hidden] {
  display: none !important;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .section-title {
  flex: 0 0 auto;
  /* ── 标题区高度锁死 20px（行高同值，文字垂直居中），下方固定 10px 边距 ──
     左栏总高 = 20 + 10 = 30px，右栏 .section-bar 也锁 30px（见下），
     于是「表格上边框」与「图片附件下划线」落在同一像素 → 用户 2026-09-13 要求的横向对齐。
     ⚠️ 不锁的话：左栏标题只有 ~14px 高，右栏被「上传」撑到 ~24px + padding-bottom 8px，
        两条线会差 8px（实测 121 vs 129）。
     ⚠️ 2026-09-15 起改为 flex 行：「⚙ 物料类型」按钮搬进本行（用户：「应该与 基本信息 同行显示」，
        「基本信息在左」）。height 仍是 20px —— 按钮必须压到 20px 才撑不破，见下一条规则。 */
  display: flex;
  align-items: center;
  gap: 12px;
  height: 20px;
  line-height: 20px;
  margin: 0 0 10px;
  letter-spacing: 0.5px;
}
/* 「⚙ 物料类型」：从顶部工具条搬到「基本信息」同一行右侧（用户 2026-09-15）。
   .tb-btn 默认 padding 5px 9px + line-height 1.4 → 实际高 ≈ 27px；塞进 20px 的行会被
   行高撑开（flex 行高 = 最高子项）→ 左栏标题区变 27 + 10 = 37px，与右栏 .section-bar 的 30px
   错位，「表格上边框」与「图片附件下划线」不再同线。所以这里显式压到 20px。
   ⚠️ line-height 必须 !important：app.css 9348-9354 全局锁
      `html, body, #app, #app *:not(script):not(style) { line-height: 1.4 !important }`
      会把行高压回 16.8px（本选择器 3 个 ID，特异性足够盖过锁）。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .section-title > #btn-plm-form-mat-types {
  flex: 0 0 auto;
  height: 20px;
  line-height: 20px !important;
  padding: 0 6px;
  margin: 0 0 0 auto; /* 推到「基本信息」行右端（用户 2026-09-29） */
}

/* ── ② 字段区：真正的表格线（中性灰 #e8edf3），线连续无断口 ── */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 {
  /* 撑满左栏剩余高度：普通行固定 44px，最后一行（备注）吃掉余量 → 纸张不留大片空白 */
  flex: 1 1 auto;
  min-height: 0;
  margin: 0;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-auto-rows: 44px;
  /* gap 与容器背景色不再承担网格线（原方案字段数为奇数时末位空格会露出橙块）。
     横向线改用容器 repeating-gradient 画满整宽 —— 这样「单数字段行的空白半格」也有线，
     不会出现断口；纵向线由每个 .field 的 border-right 提供。 */
  gap: 0;
  background-color: #fff;
  /* ── 横向线：**唯一来源**（用户 2026-09-13「线条要统一，不要粗细不一」）──
     之前是「容器 gradient + 每格 border-bottom」两个来源画同一条线，两者差 1px 叠成 2px。
     现在横向线只由本 gradient 提供，且线画在每行**底边**（43px→44px），
     与容器 border-top 不重叠 → 上外框 1px、每行分隔线 1px，全部一致。
     必须限制到「普通行」总高度，否则 44px 周期线会穿过加高的备注行。
     各页行数不同，具体高度见下方 #plm-form-* 规则。 */
  background-image: repeating-linear-gradient(
    180deg,
    transparent 0,
    transparent 43px,
    #000 43px,
    #000 44px
  );
  background-repeat: no-repeat;
  background-size: 100% 264px; /* 6 行 × 44（material 的普通行高度） */
  /* 外框：上/左/下由容器画，右由最后一列 .field 的 border-right 画 → 每条线只有一个来源 */
  border: 1px solid #000;
  border-right: none;
  overflow: visible;
}
/* 每种页面行数不同，显式给定，让备注行吃掉剩余高度。
   material 现在的行构成（2026-09-29 追加「产品型号」字段，通列要求不变）：
     row1 物料代码|曾用编号 → row2 物料名称(通列) → row3 规格型号(通列)
     → row4 产品型号|物料类型 → row5 仓库名称(通列) → row6 安全库存|最大库存
     → row7 单位|状态 → row8 供应商(通列,44px) → row9 备注(通列,吃余量)  共 9 行
   product 9 个可见单选 → 5 行；bom 10 个 → 5 行。
   （「创建人」要求不显示，已在 index.html 加 hidden；「客户名称」本例同样 hidden。
     隐藏字段用 .field[hidden] 的 !important 兜底，不占网格位 → 行数按「可见字段」算。） */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-material > .form-grid-2 {
  /* ── 物料名称 / 规格型号 / 备注 改成换行字段后行高不再统一 ──
     容器 gradient 只能画「等距」线，行高不等就会错位 → 这里关掉它，
     横向线改由每格自己的 border-bottom 画（每格一条，绝不叠加）。
     flex: 0 0 auto → 高度按内容，备注收缩后表格内不会出现空洞。 */
  flex: 0 0 auto;
  background-image: none;
  /* ── 行高：9 行固定 44px（2026-09-29 追加「产品型号」字段后 8→9 行）──
     44px 紧凑行 + 卡片高度改由内容决定（见下方 .modal-card 覆盖），表格下方不留空白。 */
  flex: 0 0 auto;
  background-image: none;
  /* minmax(44px, auto)：行高下限 44px，内容（textarea 自动长高）超过时行跟着长，
     这样换行字段既能「内容垂直居中」又不会被行高裁掉（用户 2026-09-13）。 */
  grid-template-rows: repeat(9, minmax(44px, auto));
}
/* 物料页：卡片高度改由**内容**决定 —— 行高固定 44px 后整张表只有 8×44=352px，
   若仍按 A4 纸张比例会在表格下方留一大片空白；取消 aspect-ratio 让纸张正好裹住内容。 */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  .modal-card {
  width: min(297mm, 100%);
  aspect-ratio: auto;
  height: auto;
  max-height: none;
}
/* ── 2026-09-29（用户截图「宽度-40%」）：物料资料卡整体宽度再收 40% → 面板宽 60%。
      卡片不再铺满右侧面板；margin:auto（继承上方 13077 规则）→ 水平居中。
      仅物料页生效（本页 aspect-ratio:auto、高度随内容）；产品/半成品 A4 横版纸张版式不动。
      ⚠️ 窄屏（<1200px）媒体查询仍在源文件更后方，会把宽度重置回 100% —— 与既有设计一致。 ── */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  .modal-card {
  width: min(297mm, 60%);
}

/* ══════════════════════════════════════════════════════════════════
   2026-09-29 v2（用户截图：红框「物料名称 / 规格型号 / 供应商」需**通列 + 单行**显示）
   在 3 列网格基础上，把这 3 个长文本字段改回**通栏**（grid-column:1/-1，值单行不换行），
   并用 CSS order 重排字段顺序，使其余 9 个单格字段正好铺满 3 行×3（无空位）：
     Row1 物料代码 | 曾用编号 | 产品型号
     Row2 物料名称(通栏)     Row3 规格型号(通栏)
     Row4 物料类型 | 仓库名称 | 安全库存
     Row5 最大库存 | 单位 | 状态
     Row6 供应商(通栏)       Row7 备注(通栏)          共 7 行
   成品（显示「客户名称」/隐藏「供应商」）时，「客户名称」占同栏位、同通栏 → 两种版式都无空位。
   「仓库名称」值短，留在 3 列流里（用户未要求通栏）。
   ══════════════════════════════════════════════════════════════════ */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
  grid-template-rows: repeat(7, minmax(44px, auto));
}
/* ① 只有「仓库名称」取消通栏（.plm-span-2 默认 grid-column:1/-1）；
      物料名称/规格型号/供应商 保留通栏 */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field.plm-span-2:has(#plm-m-warehouse) {
  grid-column: auto;
}
/* ②「客户名称」（成品时替代供应商显示）与供应商同栏位、同通栏 */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-customer) {
  grid-column: 1 / -1;
}
/* ③ order 重排：9 个单格字段 = 3 行×3，无空位 */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-code)      { order: 1; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-old-code)  { order: 2; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-model)     { order: 3; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-name)      { order: 4; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-spec)      { order: 5; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-type)      { order: 6; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-warehouse) { order: 7; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-safety)    { order: 8; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-maxstock)  { order: 9; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-unit)      { order: 10; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-status)    { order: 11; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-supplier)  { order: 12; }
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field:has(#plm-m-note)      { order: 13; }
/* 每格自己画下边线（行高不等时唯一可行的横向线来源） */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-material > .form-grid-2 > .field {
  border-bottom: 1px solid #000;
}
/* 最后一格（备注）不画下边线：表格下缘由容器 border-bottom 收口，否则会有 2px */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-material > .form-grid-2 > .field:last-child {
  border-bottom: none;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-product > .form-grid-2,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-form-bom > .form-grid-2 {
  grid-template-rows: repeat(5, 44px) minmax(44px, 1fr);
  background-size: 100% 220px; /* 5 行 × 44 */
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field {
  display: grid;
  /* 左右排列：标签(92px) | 输入 */
  grid-template-columns: 92px minmax(0, 1fr);
  align-items: stretch;
  gap: 0;
  margin: 0;
  min-height: 0;
  background: transparent;
  /* 纵向网格线由每格 border-right 画（每列只有一条，不叠加）。
     ⚠️ 横向线**不要**在这里画 —— 与容器 gradient 叠加会变成 2px（用户 2026-09-13 投诉点）。 */
  border-right: 1px solid #000;
  box-shadow: none;
}
/* 供应商：整行通列（用户 2026-09-13：供应商下移到备注上方、通列显示）。
   用独立 class 而不是复用 .field-span-2 —— 后者带「输入体顶到行首 / 标签顶部对齐」的备注专用样式，
   套到普通字段上会让 44px 行里的标签/输入错位。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field.plm-span-2 {
  grid-column: 1 / -1;
}
/* 备注（field-span-2）：与其它行**等高、同高**（用户 2026-09-13：
   「备注行高度要改成一样的高度」），标签与输入体都按普通行处理 ——
   标签垂直居中、无 padding-top；textarea 撑满行高，内容完整显示（超出才滚动）。
   注意 .field 本身是 <label> 包着控件，所以点这块空白任意位置都能聚焦备注框。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field.field-span-2 > textarea {
  align-self: center;
  height: auto;
  max-height: none;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field.field-span-2 > span {
  align-items: center;
  padding-top: 0;
}
/* 标签格：**无底色** + 纯黑 1px 单元格线，标签居中
   （对标国桉康销售合同 .sc-detail th/td：border-collapse + 1px solid #000 + 居中 + font-weight 400）。
   用户 2026-09-13：「我需要表格，参考国桉康的销售合同的表格」 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field > span {
  align-self: stretch;
  justify-content: center;
  padding: 0 6px;
  background: transparent;
  color: #111;
  font-weight: 400;
  border-right: 1px solid #000;
  margin: 0;
}
/* 输入格：无边框、无底色，值用深色（原为克莱因蓝 #002FA7，在纸上偏刺眼）
   连带覆盖只读态原灰底：只读现在靠灰字 + 白底区分。
   ⚠️ textarea 必须一起列进来 —— 物料名称/规格型号/备注 是换行字段，
      否则会被 base 的 `.field textarea { border:1px solid; background:#f8fffe; color:#002FA7 }` 命中，
      在表格里出现「框中框 + 浅蓝底」。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field > input,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field > select,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field > textarea {
  align-self: stretch;
  background: transparent;
  border: none;
  box-shadow: none;
  color: #000;
  text-align: center; /* 内容居中 + 黑色（用户 2026-09-29，占位符仍灰） */
  padding: 0 8px;
  min-height: 0;
}
/* 换行字段（物料名称 / 规格型号 / 备注）专属：textarea 自动换行、内容从顶部起排、不显示滚动条 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field > textarea {
  width: 100%;
  min-width: 0;
  /* 高度按内容走（rows=1 → 单行），由 .field 的 align-self:center 垂直居中；
     实际像素高由 JS growPlmTextareas() 按内容精确设置（多行时行高跟着长） */
  height: auto;
  padding: 5px 8px;
  margin: 0;
  font: inherit;
  line-height: 1.35;
  resize: none;
  overflow-y: auto;          /* 内容超出才出细滚动条，不用 hidden（会截断长文本） */
  overflow-x: hidden;
  scrollbar-width: thin;     /* 细滚动条，尽量不破坏表格观感 */
  white-space: pre-wrap;     /* 自动换行 + 保留手动换行 */
  word-break: break-word;
}
/* 换行字段（物料名称 / 规格型号）在**普通行**里：输入体撑满行高。
   行高现在是「撑满纸张的等分行」（约 60-70px），所以内容能完整显示；
   内容真的超过行高时框内滚动，而不是被行高裁掉半行（用户 2026-09-13
   「输入框需要自动调整高度，当前显示不完整」——根因就是行高太矮，不是框的问题）。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field.plm-span-2 > textarea {
  /* 高度按内容走（JS growPlmTextareas() 设 inline height），行内垂直居中；
     单行时与旁边 input 视觉对齐，多行时行高跟着长 */
  align-self: center;
  height: auto;
  max-height: none;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field > input[readonly],
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field > input:disabled,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field > select:disabled,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field > textarea[readonly] {
  background: transparent;
  color: #000; /* 只读内容同样黑色（用户 2026-09-29），灰底弱化保留 */
}
/* 「物料代码」：内容水平居中 + 纯黑 + 粗体（用户 2026-09-13）。
   ⚠️ font-weight 必须 !important —— app.css 9108-9114 全局锁
   `html, body, #app, #app * { font-weight: 400 !important }` 会把粗体压掉。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap > .form-grid-2 > .field:has(#plm-m-code) > input {
  text-align: center;
  color: #000;
  font-size: 12px !important;
  font-weight: 700 !important;
}

/* ══════════════════════════════════════════════════════════════════
   2026-09-29 v3（用户截图：取消表格的呈现方式，改为逐行显示；v3.1 修黑线权重；v3.2 行高 36→30px；v3.3 标签右对齐 + 新增按钮）
   推翻 2026-09-13「我需要表格」的网格观感，仅物料页生效：
     · 网格 3 列 → 单列：每个字段独占一行（order 规则保留，顺序不变）
     · 撤掉全部黑线：容器外框 / 每格右边线 / 每格下边线 / 标签右边线
     · 内容由居中 → 左对齐（表单逐行观感）
     · 行与行之间用少量内边距留白，不再画任何分隔线
   产品/半成品仍各自保留原版式（本块仅命中 #plm-form-material）。
   ══════════════════════════════════════════════════════════════════ */
/* ① 3 列 → 单列，每个字段一行；行高收紧凑（v3.2：36→30px，用户反馈「再收缩小一点」） */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 {
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: none;
  grid-auto-rows: minmax(30px, auto);
  gap: 0;
}
/* ② 撤容器外框黑线（仅物料页） */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  .plm-material-wrap > .form-grid-2 {
  border: none;
}
/* ③ 撤每格纵向线 / 横向线（v3.1 修正）
   ⚠️ 选择器必须用 #plm-form-material —— 横向线 base 规则（app.css 13461）用的是
      `#plm-form-material > .form-grid-2 > .field`（**4 个 id**）；若这里写 .plm-material-wrap
      就只有 3 个 id，权重被压制 → 黑线不消失（v3 首版即踩此坑，用户截图仍见横线）。
   padding 去掉：行高交给 ① 的 36px，不再用上下留白。 */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field {
  border-right: none;
  border-bottom: none;
  padding: 0;
}
/* ④ 撤标签右边线，标签右对齐（v3.3 用户截图：标签右对齐） */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  .plm-material-wrap > .form-grid-2 > .field > span {
  border-right: none;
  justify-content: flex-end;
}
/* ⑤ 输入体左对齐（逐行表单观感） */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  .plm-material-wrap > .form-grid-2 > .field > input,
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  .plm-material-wrap > .form-grid-2 > .field > select,
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  .plm-material-wrap > .form-grid-2 > .field > textarea {
  text-align: left;
}
/* ⑥ 物料代码不再强制居中 */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  .plm-material-wrap > .form-grid-2 > .field:has(#plm-m-code) > input {
  text-align: left;
}
/* ⑦a 标签格收高：base 9394 是 min-height:34px + padding:8px 10px —— 不降压到 30px 以下，
      标签内容会把行顶回 34px、① 的网格 min(30px) 就白设了。 */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field > span {
  min-height: 30px;
  padding: 4px 10px;
}
/* ⑦b 输入/下拉/文本域 min-height 也压到 30px。
      ⚠️ 只改 min-height、**不碰 padding** —— 物料代码「派生」按钮靠
      `.field:has(#btn-plm-derive-material) > input { padding-right:66px }` 避让，
      在这里覆盖 padding 会把按钮和文字叠在一起。 */
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field > input,
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field > select,
#pane-plm .plm-split-right
  #view-plm-form:has(#plm-form-material:not([hidden]))
  #plm-form-material > .form-grid-2 > .field > textarea {
  min-height: 30px;
}

/* ── ③ 右栏「图片附件」：左侧一条分隔线，空态虚线区撑满 ── */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .form-section-basic > #plm-attach-section {
  position: static;
  inset: auto;
  padding: 0 0 0 18px;
  /* ⚠️ -1px 让本栏的 border-left 与表格右边框**完全重叠**成一条 1px 线。
     不加的话两条 1px 线紧挨着排（相邻不重叠）→ 看起来是 2px，就是用户投诉的「粗细不一」。
     本栏的线同时还覆盖表格以上的标题行，所以不能简单删掉其中一条。 */
  margin: 0 0 0 -1px;
  border: none;
  /* 左右栏之间的分隔线（原方案是左右各一个完整橙框，看起来像两个框并排） */
  border-left: 1px solid #000;
  background: transparent;
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .form-section-basic > #plm-attach-section.is-dragover {
  border-left-color: var(--primary);
  background: #fff7f0;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .section-bar {
  flex: 0 0 auto;
  /* 整体锁 30px、标题贴顶（align-items: flex-start + line-height: 20px），
     保证「基本信息」「图片附件」两个标题文字同高。
     原在此处画的 border-bottom 下划线已删（2026-10-01 用户：删除「图片附件」
     标题行下方的横线；该线是旧左右分栏版式为对齐左栏表格所设，改上下结构后无意义）。 */
  height: 30px;
  box-sizing: border-box;
  align-items: flex-start;
  margin: 0 0 10px;
  padding-bottom: 0;
  background: transparent;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .section-bar .section-title {
  line-height: 20px;
}
/* 空态沿用 base 已有机制：无附件时 #plm-attach-section 带 .attach-empty，
   .attach-list 被 display:none、.attach-drop-hint 用 flex:1 撑满整块并自身居中。
   ⚠️ 这里千万不要给 .attach-drop-hint 设 flex（会把 base 的 flex:1 顶掉，
      提示文字会缩到该栏顶部，整块留白）—— v2 第一版就是这么踩的。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-list {
  min-height: 0;
  margin: 0 0 8px;
  overflow: auto;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-drop-hint {
  margin: 0;
  color: #94a3b8;
  letter-spacing: 0.5px;
}
/* 空态整块做成虚线投放区，文字居中（有附件后该 class 移除，自动恢复正常列表观感）。
   底色去掉（用户 2026-09-13：不要底色），只留虚线框标示这是一块可贴图的区域 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section.attach-empty .attach-drop-hint {
  border: 1px dashed #000;
  background: transparent;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section #plm-attach-status {
  flex: 0 0 auto;
  margin: 4px 0 0;
}

/* ── ④「无底色 + 表格式样」（用户 2026-09-13 明确要求：不要底色，要表格式样）──
   纸张内除输入控件自身外，任何填充色块全部去掉：区块标题 / 标签格 / 附件空态 / 工具条 / 附件条目
   一律白底，整页只靠 1px 表格线分格，读起来是一张打印表格。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .section-title,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .section-bar,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .plm-material-wrap,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-list,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-item {
  background: transparent;
}

/* 图片最大化显示（用户 2026-09-14）：附件列表 flex 占满右侧可用高度，单图时预览区撑满剩余空间 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-list {
  display: flex;
  flex-direction: column;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-item {
  flex: 1 1 auto;
  min-height: 0;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-preview {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-thumb {
  max-height: none;
  max-width: 100%;
  height: 100%;
  width: auto;
  object-fit: contain;
}
/* 附件操作按钮与文件名同行，文件名超长时省略号（用户 2026-09-14） */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-name-row {
  display: flex;
  align-items: center;
  gap: 8px;
  overflow: hidden;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-name-row > a {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 4px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section .attach-actions-inline {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: auto;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .modal-card,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .modal-body,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .form-section-basic {
  background: #fff;
}

/* ── 基本信息 | 图片附件 = 6:4（用户 2026-09-13）──
   原来 base 里是 2fr 1fr（≈6.7:3.3），图片附件偏窄、贴图区放不开；
   改为 3fr 2fr = 6:4 的整数比。窄屏（<1200px）已单独退回单列，不受影响。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .form-section-basic {
  grid-template-columns: 3fr 2fr;
}

/* ── A4 表单内所有文字统一 10px（用户 2026-09-13）：
      区块标题 / 字段标签 / 输入值与下拉 / 按钮 / 附件提示，一律同一字号。
      用后代通配一次性覆盖，避免逐个选择器漏项；层级别靠颜色与字重做 ── */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .modal-card,
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .modal-card * {
  font-size: 10px;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .modal-card .section-title {
  font-weight: 700;
}
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .modal-card #plm-form-actions-row > #btn-plm-form-save {
  font-weight: 600;
}

/* ── 窄屏（视口 < 1200px）：A4 纸张放不下双栏，整体退回原「撑满面板 + 滚动」版式 ── */
@media (max-width: 1200px) {
  #pane-plm .plm-split-right
    #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
    .modal-card {
    width: 100%;
    aspect-ratio: auto;
    height: auto;
    flex: 1 1 auto;
    margin: 0;
    border: none;
    box-shadow: none;
  }
  #pane-plm .plm-split-right
    #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
    #plm-form-actions-row {
    height: auto;
    padding: 6px 12px;
  }
  #pane-plm .plm-split-right
    #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
    .modal-body {
    display: block;
    padding: 10px 14px;
    overflow: auto;
  }
  #pane-plm .plm-split-right
    #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
    .form-section-basic {
    grid-template-columns: minmax(0, 1fr);
    grid-template-rows: auto;
    padding: 0;
  }
  #pane-plm .plm-split-right
    #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
    .plm-material-wrap > .form-grid-2 {
    grid-template-columns: minmax(0, 1fr);
    grid-auto-rows: 40px;
  }
  #pane-plm .plm-split-right
    #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
    .form-section-basic > #plm-attach-section {
    padding: 14px 0 0;
    margin-top: 16px;
    border-left: none;
    border-top: 1px solid #e8edf3;
  }
  #pane-plm .plm-split-right
    #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
    #plm-attach-section .attach-list {
    min-height: 120px;
  }
}

/* ══════════════════════════════════════════════════════════════════
   2026-09-29（用户：「红框内容[图片附件]移到基本信息下方显示（上下结构排列）」）
   原版式：.form-section-basic = 左「基本信息」3fr ｜ 右「图片附件」2fr 同框左右分栏
           （附件区 position:absolute 铺右列，两栏之间一条**竖**线）
   新版式：改成单列上下结构 —— 基本信息在上、图片附件在下，中间一条**横**线分隔。
   ⚠️ 附件区原为绝对定位（top/bottom 撑出确定高度，空态虚线区靠 flex:1 填满）；
      改 static 后高度由内容决定 → 必须给空态虚线区 / 列表一个 min-height，
      否则虚线框会塌成一行文字（flex:1 在 auto 高度容器里没有可分配空间）。
   ══════════════════════════════════════════════════════════════════ */

/* ① 基本信息外框：双栏 → 单栏（左栏在上一行、附件区在下一行） */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .form-section-basic {
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: auto auto;
}
/* 弹窗（非分栏）语境下同一份 DOM 也要上下结构，保持一致 */
#view-plm-form .plm-form-top-row > .form-section.form-section-basic {
  grid-template-columns: minmax(0, 1fr);
}

/* ② 附件区：取消绝对定位与竖向分隔线，落到字段区下方，用**顶部横线**分隔 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  .form-section-basic > #plm-attach-section {
  position: static;
  inset: auto;
  margin: 14px 0 0;
  padding: 14px 0 0;
  border: none;
  border-top: 1px solid #000;   /* 原 border-left 竖线 → 顶部横线 */
}
#view-plm-form .form-section-basic > #plm-attach-section {
  position: static;
  inset: auto;
  margin: 14px 0 0;
  padding: 14px 0 0;
  border: none;
  border-top: 1px solid #000;
}

/* ③ 附件区不再有确定高度（原绝对定位 top/bottom 撑高），给空态虚线区补一个高度下限。
   ⚠️ 只能给 .attach-drop-hint，**不能**给 .attach-list：
      分栏语境下 app.css 13645 有更高优先级的 `.attach-list { display:flex }`，
      空态时靠 base 的 `.attach-empty .attach-list { flex:0 }`（basis 0 + 不 grow）自然塌成 0 高；
      若给 .attach-list 设 min-height，它会被撑成一块**空白**（2026-09-29 实测：标题下方多出 189px 白块）。 */
#pane-plm .plm-split-right
  #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
  #plm-attach-section.attach-empty .attach-drop-hint,
#view-plm-form #plm-attach-section.attach-empty .attach-drop-hint {
  min-height: 180px;
}

/* 非分栏页（产品/BOM/工艺/文档）：右面板与分隔条隐藏，列表全宽 */
#pane-plm .plm-split-resizer[hidden],
#pane-plm .plm-split-right[hidden] {
  display: none !important;
}

/* ── 物料页「文件夹树」视图：大类 → 中类 → 代码（左列表）── */
#pane-plm .plm-tree {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
  padding: 6px 8px 14px;
}
#pane-plm .plm-tree .pt-children {
  /* 层级缩进区分层级（用户 2026-09-30「缩进 显示区分层级」，覆盖 2026-09-13
     「移除缩进，左边对齐」旧要求）：子级容器整体缩进，大类 → 中类 → 叶子逐层递进。
     只动 PLM，不影响 WMS 的同名树。 */
  margin-left: 14px;
}
#pane-plm .plm-tree .pt-row {
  display: flex;
  align-items: center;
  gap: 6px;
  height: 28px;
  padding: 0 6px;
  border-radius: 0;
  cursor: pointer;
  user-select: none;
  color: #334155;
  white-space: nowrap;
}
#pane-plm .plm-tree .pt-row:hover {
  background: #e6f4f2;
}
#pane-plm .plm-tree .pt-cat-row .pt-label {
  color: #1e293b;
}
#pane-plm .plm-tree .pt-arrow {
  flex: 0 0 auto;
  width: 7px;
  height: 7px;
  margin-left: 2px;
  border-right: 1.5px solid #94a3b8;
  border-bottom: 1.5px solid #94a3b8;
  transform: rotate(-45deg); /* ▸ 收起 */
  transition: transform 0.12s;
}
#pane-plm .plm-tree .pt-node[data-open="1"] > .pt-row > .pt-arrow {
  transform: rotate(45deg); /* ▾ 展开 */
}
#pane-plm .plm-tree .pt-folder {
  flex: 0 0 auto;
  width: 14px;
  height: 14px;
  color: var(--primary);
}
#pane-plm .plm-tree .pt-label {
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}
#pane-plm .plm-tree .pt-cnt {
  flex: 0 0 auto;
  margin-left: auto;
  padding-left: 8px;
  font-size: 11px;
  color: #94a3b8;
}
#pane-plm .plm-tree .pt-leaf {
  display: flex;
  align-items: center;
  gap: 0;
  height: 28px;
  padding: 0 8px;
  border-radius: 0;
  cursor: pointer;
  color: #475569;
  white-space: nowrap;
  overflow: hidden;
}
#pane-plm .plm-tree .pt-leaf:hover {
  background: #e6f4f2;
}
#pane-plm .plm-tree .pt-leaf .pt-code {
  /* 统一宽度（用户 2026-09-30）：代码列固定宽，长短代码的「|」分隔线与名称列垂直对齐，
     视觉整齐；超长代码省略号（title 悬浮看全码）。2026-09-13 的「按内容自适应」废弃。 */
  flex: 0 0 92px;
  max-width: 46%;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-family: Consolas, "Courier New", monospace;
  color: var(--primary-dark);
}
#pane-plm .plm-tree .pt-leaf .pt-name {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  color: #64748b;
}
/* BOM 存在状态徽标（2026-09-30）：叶子行右侧，无 BOM=浅灰文字，有 BOM=彩色药丸
   bomflat1（2026-11-01 虫哥「去掉外框」）：不再描边，只留浅色底+文字色（药丸轮廓去掉）*/
#pane-plm .plm-tree .pt-leaf .pt-bom {
  flex: 0 0 auto;
  margin-left: 8px;
  font-size: 11px;
  line-height: 1;
  padding: 3px 8px;
  border-radius: 999px;
  border: 0;
  background: transparent;
  color: #cbd5e1;
  white-space: nowrap;
}
#pane-plm .plm-tree .pt-leaf .pt-bom.is-none {
  color: #cbd5e1;
}

/* ═══ BOM 明细「替换料」行（2026-09-30）：行号与上一行一致，整行文字绿色
   （用户纠正：蓝色 → 绿色，与 BOM 状态徽标「发布」绿一致）═══ */
#plm-bom-detail-table tr.bom-row-repl > td { color: #059669; }
#plm-bom-detail-table tr.bom-row-repl > td .bom-row-no,
#plm-bom-detail-table tr.bom-row-repl > td .bom-row-drag { color: #059669; }
#plm-bom-detail-table tr.bom-row-repl > td input,
#plm-bom-detail-table tr.bom-row-repl > td textarea { color: #059669; }
/* 明细行右键菜单（与物料树右键菜单同风格） */
.bom-line-ctx {
  position: fixed;
  z-index: 12000;
  min-width: 128px;
  padding: 4px;
  background: #fff;
  border: 1px solid #e5e7eb;
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);
}
.bom-line-ctx .bom-line-ctx-item {
  padding: 7px 12px;
  font-size: 13px;
  color: #334155;
  border-radius: 6px;
  cursor: pointer;
  white-space: nowrap;
}
.bom-line-ctx .bom-line-ctx-item:hover { background: #e6f4f2; color: #0f766e; }
.bom-line-ctx .bom-line-ctx-item.is-disabled { color: #cbd5e1; cursor: default; }
.bom-line-ctx .bom-line-ctx-item.is-disabled:hover { background: transparent; color: #cbd5e1; }

/* ═══ 快速 BOM 弹窗隐藏「派生」按钮（2026-09-30 用户红框删除）═══
   按钮随 BOM编号字段搬进弹窗才显形；仅弹窗内隐藏，半成品资料卡不受影响 */
#view-quick-bom #btn-plm-derive-bom { display: none !important; }
#view-quick-bom .field:has(#btn-plm-derive-bom) > input { padding-right: 8px; }
/* bomflat2（2026-11-01 虫哥「背景色也要去掉」）：底色一并去掉，只剩彩色文字；
   padding 保留（透明不可见），行高与字号位置不跳 */
#pane-plm .plm-tree .pt-leaf .pt-bom.is-pub {
  background: transparent;
  color: #059669;
  padding: 4px 9px;
}
#pane-plm .plm-tree .pt-leaf .pt-bom.is-draft {
  background: transparent;
  color: #b45309;
  padding: 4px 9px;
}
#pane-plm .plm-tree .pt-leaf .pt-bom.is-stop {
  background: transparent;
  color: #64748b;
  padding: 4px 9px;
}
/* 树叶子右键菜单（2026-09-30）：打开 BOM / 创建 BOM */
.plm-tree-ctx {
  position: fixed;
  z-index: 12000;
  min-width: 132px;
  padding: 4px;
  background: #fff;
  border: 1px solid #e5e7eb;
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);
}
.plm-tree-ctx .plm-tree-ctx-item {
  padding: 7px 12px;
  border-radius: 6px;
  font-size: 13px;
  color: #374151;
  cursor: pointer;
  white-space: nowrap;
}
.plm-tree-ctx .plm-tree-ctx-item:hover {
  background: #ecfdf5;
  color: #047857;
}
/* 菜单图标固定宽度对齐文字（2026-09-30 用户：菜单对齐一下）——emoji 宽度不一导致文字错位 */
.plm-tree-ctx .plm-ctx-ico {
  display: inline-block;
  width: 20px;
  text-align: center;
}
#pane-plm .plm-tree .pt-leaf .pt-sep {
  flex: 0 0 16px;
  text-align: center;
  color: #cbd5e1;
}
#pane-plm .plm-tree .pt-leaf .pt-old {
  flex: 0 0 110px;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  color: #94a3b8;
}
#pane-plm .plm-tree .pt-leaf .pt-sup {
  flex: 0 0 130px;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  color: #94a3b8;
}
#pane-plm .plm-tree .pt-leaf.selected {
  background: #99f6e4;
}
#pane-plm .plm-tree .pt-leaf.selected .pt-name {
  color: #334155;
}

/* ── 文档页「文件管理器」视图：左侧目录树 + 右侧文档列表（双栏）── */
#pane-plm .plm-tree.plm-doc-tree .pt-doc-all-arrow {
  flex: 0 0 auto;
  width: 7px;
  height: 7px;
  margin-left: 2px;
}
#pane-plm .plm-tree .pt-cat-row.selected {
  background: #99f6e4;
}
#pane-plm .plm-tree .pt-cat-row.selected .pt-label {
  color: #0f766e;
}
#pane-plm .plm-tree .pt-leaf .pt-doc-title {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  color: #334155;
}
#pane-plm .plm-tree .pt-leaf .pt-doc-model {
  flex: 0 0 auto;
  margin-left: 8px;
  color: #94a3b8;
  font-size: 11px;
}
#pane-plm.is-plm-doc-page .plm-split-right .plm-split-right-body {
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
#pane-plm .plm-split-right .plm-doc-list {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
#pane-plm .plm-split-right .plm-doc-list .table-wrap {
  flex: 1 1 auto;
  min-height: 0;
  max-height: none;
}

/* ── 物料树搜索框 ── */
#pane-plm .plm-tree-search {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 6px;
  margin: 8px 8px 0;
  padding: 0 10px;
  height: 34px;
  /* segui1：边框统一为浅灰，与下方分段筛选条同一套线条（原来继承 PLM 暖橙 --border，
     两颗控件像两个系统）；聚焦才亮主题色 */
  border: 1px solid #e2e8f0;
  border-radius: 0;
  background: #fff;
  box-shadow: none;
}
#pane-plm .plm-tree-search:focus-within {
  border-color: #5eead4;
  box-shadow: none;
}
#pane-plm .plm-tree-search .pt-search-icon {
  flex: 0 0 auto;
  width: 15px;
  height: 15px;
  color: #94a3b8;
}
#pane-plm .plm-tree-search input {
  flex: 1 1 auto;
  min-width: 0;
  border: 0;
  outline: none;
  background: transparent;
  font-size: 12px;
  color: #002FA7;
  height: 100%;
  padding: 0;
}
#pane-plm .plm-tree-search input::placeholder {
  color: #94a3b8;
}
#pane-plm .plm-tree-search .pt-search-clear {
  flex: 0 0 auto;
  border: 0;
  background: transparent;
  color: #94a3b8;
  font-size: 12px;
  line-height: 1;
  padding: 4px 6px;
  cursor: pointer;
  border-radius: 0;
}
#pane-plm .plm-tree-search .pt-search-clear:hover {
  color: #475569;
  background: #f1f5f9;
}
#pane-plm .plm-tree .pt-empty {
  padding: 28px 12px;
  text-align: center;
  color: #94a3b8;
  font-size: 13px;
}

/* ── WMS 入/出库/调整/盘点：左右分栏（左列表 + 右单据表单，对标国桉康）── */
#pane-wms.is-wms-split-page .wms-split {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: row;
  align-items: stretch;
  overflow: hidden;
}
/* 非分栏（库存/库位页）：分栏容器占满高度，左区撑开可滚动 */
#pane-wms:not(.is-wms-split-page) .wms-split {
  flex: 1 1 auto;
  min-height: 0;
  display: block;
  overflow: hidden;
}
#pane-wms:not(.is-wms-split-page) .wms-split-left {
  height: 100%;
  flex: 1 1 auto;
  min-height: 0;
}
#pane-wms .wms-split-left {
  flex: 1 1 var(--wms-split-left, 55%);
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background: #fff;
}
#pane-wms .wms-split-left #wms-body {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  padding: 0;
}
#pane-wms .wms-split-left #wms-body .table-wrap {
  flex: 1 1 auto;
  height: auto;
  min-height: 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
}
#pane-wms .wms-split-resizer {
  flex: 0 0 6px;
  cursor: col-resize;
  background: #d7dde4;
  border-left: 1px solid #cfd6de;
  border-right: 1px solid #cfd6de;
  touch-action: none;
}
#pane-wms .wms-split-resizer:hover,
body.wms-split-dragging #pane-wms .wms-split-resizer {
  background: #7dd3fc;
}
#pane-wms .wms-split-right {
  flex: 1 1 var(--wms-split-right, 45%);
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  border-left: 1px solid #cfd6de;
}
#pane-wms .wms-split-right .wms-split-right-head {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 8px 12px;
  background: linear-gradient(180deg, #f7fffe 0%, #eef9f7 100%);
  border-bottom: 1px solid #e2e8f0;
}
#pane-wms .wms-split-right .wms-split-right-title {
  font-size: 14px;
  font-weight: 600;
  color: #0f766e;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  flex: 0 1 auto;
  min-width: 0;
}
#pane-wms .wms-split-right .wms-split-right-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 8px;
  margin-left: auto;
  flex: 0 0 auto;
  flex-wrap: nowrap;
  white-space: nowrap;
}
#pane-wms .wms-split-right .wms-split-right-actions .tb-btn {
  margin-left: 0;
}
#pane-wms .wms-split-right .wms-split-right-body {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  padding: 0;
}
#pane-wms .wms-split-right .wms-split-right-empty {
  padding: 40px 16px;
  text-align: center;
  color: #94a3b8;
  font-size: 13px;
}
/* 分栏内嵌单据表单：去掉弹窗遮罩/居中，填满右侧面板 */
#pane-wms .wms-split-right #view-wms-txn {
  position: static;
  inset: auto;
  background: transparent;
  display: flex;
  align-items: stretch;
  justify-content: flex-start;
  flex-direction: column;
  height: 100%;
  min-height: 0;
  padding: 0;
  z-index: auto;
}
#pane-wms .wms-split-right #view-wms-txn[hidden] { display: none !important; }
#pane-wms .wms-split-right #view-wms-txn .modal-card {
  width: 100% !important; /* 压过老弹窗 min(1600px,100%) !important */
  max-width: 100%;
  max-height: none;
  border-radius: 0;
  border: 1px solid #e2e8f0;
  box-shadow: 0 2px 10px rgba(15, 23, 42, 0.06);
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
#pane-wms .wms-split-right #view-wms-txn .modal-head {
  display: none;
}
#pane-wms .wms-split-right #view-wms-txn .modal-body {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
}
#pane-wms .wms-split-right #view-wms-txn .modal-foot {
  display: none;
}
/* 非分栏页：右面板与分隔条隐藏，列表全宽 */
#pane-wms .wms-split-resizer[hidden],
#pane-wms .wms-split-right[hidden] {
  display: none !important;
}

/* ── 库存页「文件管理器」视图：左仓库树（仓库 → 物料） + 右记录详情 ── */
#pane-wms .wms-split-left #wms-body .wms-stock-tree {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
  padding: 6px 8px 14px;
}
#pane-wms .wms-stock-tree .pt-children {
  margin-left: 16px;
}
#pane-wms .wms-stock-tree .pt-row {
  display: flex;
  align-items: center;
  gap: 6px;
  height: 28px;
  padding: 0 6px;
  border-radius: 0;
  cursor: pointer;
  user-select: none;
  color: #334155;
  white-space: nowrap;
}
#pane-wms .wms-stock-tree .pt-row:hover {
  background: #e6f4f2;
}
#pane-wms .wms-stock-tree .pt-region-row {
  background: #eef7f6;
}
#pane-wms .wms-stock-tree .pt-region-row .pt-label,
#pane-wms .wms-stock-tree .pt-region-row .pt-cnt {
  color: #0f766e;
}
#pane-wms .wms-stock-tree .pt-cat-row .pt-label {
  color: #1e293b;
}
#pane-wms .wms-stock-tree .pt-arrow {
  flex: 0 0 auto;
  width: 7px;
  height: 7px;
  margin-left: 2px;
  border-right: 1.5px solid #94a3b8;
  border-bottom: 1.5px solid #94a3b8;
  transform: rotate(-45deg);
  transition: transform 0.12s;
}
#pane-wms .wms-stock-tree .pt-node[data-open="1"] > .pt-row > .pt-arrow {
  transform: rotate(45deg);
}
#pane-wms .wms-stock-tree .pt-folder {
  flex: 0 0 auto;
  width: 14px;
  height: 14px;
  color: var(--primary);
}
#pane-wms .wms-stock-tree .pt-label {
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}
#pane-wms .wms-stock-tree .pt-cnt {
  flex: 0 0 auto;
  margin-left: auto;
  padding-left: 8px;
  font-size: 11px;
  color: #94a3b8;
}
#pane-wms .wms-stock-tree .pt-leaf {
  display: flex;
  align-items: center;
  gap: 0;
  height: 28px;
  padding: 0 8px;
  border-radius: 0;
  cursor: pointer;
  color: #475569;
  white-space: nowrap;
  overflow: hidden;
}
#pane-wms .wms-stock-tree .pt-leaf:hover {
  background: #e6f4f2;
}
#pane-wms .wms-stock-tree .pt-leaf .pt-code {
  flex: 0 0 120px;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  font-family: Consolas, "Courier New", monospace;
  color: var(--primary-dark);
}
#pane-wms .wms-stock-tree .pt-leaf .pt-sep {
  flex: 0 0 12px;
  text-align: center;
  color: #cbd5e1;
}
#pane-wms .wms-stock-tree .pt-leaf .pt-name {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  color: #64748b;
}
#pane-wms .wms-stock-tree .pt-leaf.selected {
  background: #99f6e4;
}
#pane-wms .wms-stock-tree .pt-leaf.selected .pt-name {
  color: #334155;
}

/* 库存详情面板 */
#pane-wms.is-wms-stock-page .wms-split-right-body {
  display: block;
  padding: 0;
}
#pane-wms .wms-stock-detail {
  padding: 12px 14px 16px;
}
#pane-wms .wms-stock-detail .dsd-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px 16px;
}
#pane-wms .wms-stock-detail .dsd-row {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 6px 0;
  border-bottom: 1px dashed #eef2f7;
  min-width: 0;
}
#pane-wms .wms-stock-detail .dsd-label {
  flex: 0 0 64px;
  color: #94a3b8;
  font-size: 12px;
  white-space: nowrap;
}
#pane-wms .wms-stock-detail .dsd-value {
  flex: 1 1 auto;
  min-width: 0;
  color: #1e293b;
  font-size: 13px;
  overflow-wrap: anywhere;
}
#pane-wms .wms-stock-detail .dsd-section {
  margin: 14px 0 6px;
  color: #0f766e;
  font-size: 13px;
}
#pane-wms .wms-stock-detail .dsd-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
#pane-wms .wms-stock-detail .dsd-table th,
#pane-wms .wms-stock-detail .dsd-table td {
  border: 1px solid #e2e8f0;
  padding: 5px 8px;
  text-align: left;
}
#pane-wms .wms-stock-detail .dsd-table th {
  background: #f1f5f9;
  color: #475569;
}
#pane-wms .wms-stock-detail .dsd-table td.num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

/* ── WMS 单据明细表格：删按钮列贴最右（对标国桉康 GAK-WEB-DETAIL-DEL-001）── */
#view-wms-txn .wms-txn-detail-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin: 12px 0 6px;
}
#view-wms-txn .wms-txn-detail-tip {
  font-size: 12px;
  color: #64748b;
}
#view-wms-txn #wms-txn-lines .table-wrap {
  max-height: min(52vh, 460px);
}
#view-wms-txn .wms-txn-detail-table {
  border-collapse: separate;
  min-width: 100%;
}
#view-wms-txn .wms-txn-detail-table tbody td.ib-row-del-cell {
  position: sticky;
  right: 0;
  width: 30px;
  min-width: 30px;
  max-width: 30px;
  padding: 2px;
  border: 0;
  background: transparent;
  text-align: center;
  z-index: 5;
}
#view-wms-txn .wms-txn-detail-table tbody td.ib-row-del-cell .btn-text {
  display: inline-block;
  visibility: hidden;
  width: 26px;
  height: 22px;
  box-sizing: border-box;
  background: #fff;
  box-shadow: 0 1px 4px rgba(15, 23, 42, 0.18);
  border: 1px solid #e2e8f0;
  color: #dc2626;
  text-align: center;
  line-height: 20px;
}
#view-wms-txn .wms-txn-detail-table tr.ib-detail-row:hover td.ib-row-del-cell .btn-text {
  visibility: visible;
}
#view-wms-txn .wms-txn-detail-table td input {
  width: 100%;
  box-sizing: border-box;
  border: 1px solid transparent;
  background: transparent;
  border-radius: 0;
  padding: 3px 5px;
  font-size: 12px;
}
#view-wms-txn .wms-txn-detail-table td input:hover,
#view-wms-txn .wms-txn-detail-table td input:focus {
  border-color: #94a3b8;
  background: #fff;
  outline: none;
}
#view-wms-txn .wms-txn-detail-table td {
  padding: 4px 6px;
  vertical-align: middle;
}

/* ── BOM 明细表格：删按钮列贴最右（对标国桉康 GAK-WEB-DETAIL-DEL-001）── */
:is(#view-plm-form, #view-quick-bom) .bom-detail-toolbar {
  display: flex;
  align-items: center;
  gap: 10px;
  /* 顶部间距由 #plm-bom-detail-section 的 margin-top 统一提供（避免叠加过大） */
  margin: 0 0 6px;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-title {
  font-weight: 700;
  color: var(--primary-dark);
  white-space: nowrap;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-tip {
  font-size: 12px;
  color: #64748b;
  white-space: nowrap;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-spacer {
  flex: 1;
  min-width: 8px;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table {
  border-collapse: separate;
  /* 列宽锁定（2026-09-30）：!important 压过 MfColResize.syncTableWidth 的内联补宽——
     表格宽度=列宽合计，短表的差额不再均摊到各列（用量/单位/层级/损耗率保持锁定窄宽），表窄于容器时右侧留白 */
  width: max-content !important;
  min-width: 0 !important;
}
/* 明细表拉满弹窗宽（2026-10-02 用户：拉满右侧空间）：浮动弹窗内表宽 100% 跟随容器，
   min-width 保底列宽合计——窄表余量摊到各列不再右侧留白，超宽仍由 .table-wrap 横向滚动
   bomfix4（2026-10-11 用户「物料列表打开的弹窗 右侧空白」）：同样拉满资料卡/物料卡弹窗 */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table {
  width: 100% !important;
  min-width: max-content !important;
}
:is(#view-plm-form, #view-quick-bom) #plm-bom-lines .table-wrap {
  max-height: min(52vh, 460px);
}
/* bomfix3（2026-10-11 用户「物料列表打开的弹窗 表头要固定」）：资料卡/物料卡弹窗形态
   （#view-plm-form 单独弹出——不在 #plm-split-right 分屏内、也不在 #view-quick-bom 里）
   此前不在 sticky 作用域，明细表头跟随滚动。sticky 只影响滚动表现，无滚动时零变化。 */
#view-plm-form #plm-bom-detail-table thead th {
  position: sticky;
  top: 0;
  z-index: 3;
  background-clip: padding-box;
}
/* bomfix5（2026-10-11 用户「没有生效」）：物料列表右键「打开 BOM」实际走 #view-quick-bom
   快开弹窗（打印按钮/搬移链证实），此前 bomfix3/bomfix4 只覆盖了 #view-plm-form。
   ① 拉满反压：bom_card_v2 8.3 的 width:max-content!important（3id1类、后加载文件）恒胜
      上方拉满规则（2id1类）→ 表宽恒=列合计、右侧大片留白。双写 ID+双写类（3id2类）反压——
      表格拉满容器、窄表余量摊列、超宽仍由 .table-wrap 横向滚动；
   ② 表头固定：.qb-lines 是滚动容器但为块容器，子级 #plm-bom-lines/.table-wrap 的 flex:1
      全部失效、随内容长高 → sticky 表头永不钉住。改为纵向 flex 容器（.qb-card 85vh flex 壳
      已就绪），滚动落回 .table-wrap 内部，bom_card_v2 的 sticky 表头规则即生效。
      仅作用快开弹窗，分屏内嵌卡无 #qb-lines 节点、不受影响。 */
#view-quick-bom#view-quick-bom #plm-bom-detail-table.bom-detail-table.bom-detail-table {
  width: 100% !important;
  min-width: max-content !important;
}
#view-quick-bom .qb-lines#qb-lines {
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
/* bomperf1b（2026-10-11 对齐复测）：数据列 td 顶部对齐——td 默认 middle 会把高度
   不同的 textarea 各自垂直居中，首行基准随内容行数浮动（实测 r2 名称列偏上 7px、
   r31/32 备注列偏上 16px）。顶对齐后行内所有控件顶边一致，plm_bom.js 的首行对齐
   公式（bomfit3）即全部同线。只限数据列（有 data-col），行号列保持居中；
   仅作用快开弹窗，分屏内嵌卡不动。 */
#view-quick-bom .bom-detail-table td[data-col] {
  vertical-align: top;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody td.ib-row-del-cell {
  /* 删按钮列不固定在右缘：跟随表格横向滚动；鼠标移到可视区最右侧热区时全部浮现（用户要求） */
  width: 30px;
  min-width: 30px;
  max-width: 30px;
  padding: 2px;
  border: 0;
  background: transparent;
  text-align: center;
}
:is(#view-plm-form, #view-quick-bom) #plm-bom-lines .table-wrap {
  position: relative;
}
/* 右侧热区：鼠标移到可视区最右侧 → 表格加 bom-del-show：
   删按钮列临时 sticky 贴到可视区右缘（浮现出来可点击），平时跟随滚动 */
:is(#view-plm-form, #view-quick-bom) #plm-bom-lines .table-wrap > .bom-del-rail {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: 46px;
  z-index: 30;
  background: transparent;
  pointer-events: auto;
  cursor: default;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table.bom-del-show tbody td.ib-row-del-cell {
  position: sticky;
  right: 0;
  z-index: 5;
  background: rgba(255, 255, 255, 0.92);
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table.bom-del-show tr.ib-detail-row td.ib-row-del-cell .btn-text {
  visibility: visible;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody td.ib-row-del-cell .btn-text {
  display: inline-block;
  visibility: hidden;
  width: 26px;
  height: 22px;
  box-sizing: border-box;
  background: #fff;
  box-shadow: 0 1px 4px rgba(15, 23, 42, 0.18);
  border: 1px solid #e2e8f0;
  color: #dc2626;
  text-align: center;
  line-height: 20px;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tr.ib-detail-row:hover td.ib-row-del-cell .btn-text {
  visibility: visible;
}
/* BOM 明细单元格输入框紧凑化 */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td input,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td select,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td textarea {
  width: 100%;
  box-sizing: border-box;
  border: 1px solid transparent;
  background: transparent;
  padding: 4px 8px;
  font-size: 12px;
  /* 除「物料代码」外，其余列内容居中（用户要求） */
  text-align: center;
  /* 聚焦边框贴合单元格（2026-10-03 用户）：去浏览器默认黑色圆角 outline */
  outline: none;
}
/* 文本类单元格用 textarea（2026-09-30：内容过长自动换行，高度随内容自适应） */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td textarea {
  resize: none;
  overflow: hidden;
  display: block;
  line-height: 1.6;
  /* 2026-10-04 用户：与 input/select 统一 27px（原 26 导致行高 27、其他控件 25.8，
     聚焦边框上下不贴合单元格——底部露 1.1px 缝） */
  min-height: 27px;
  font-family: inherit;
}
/* 2026-10-04 用户：输入框/下拉框高度撑满单元格（27px 与行高一致，边框四边贴合）；
   宽度同步 100% 铺满列宽（flush2：工序列 select 此前按内容收缩、右侧留白不贴合） */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td input,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td select {
  height: 27px;
  width: 100%;
}
/* 工序列 select：去除原生下拉箭头（用户 2026-10-03），与输入框同款贴合单元格 */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td select {
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
}
/* 输入框四周贴合单元格边框（用户 2026-09-30）：td 内边距归零，输入框撑满格子，
   文字与边框的留白由输入框自身 padding 提供（物料代码的层级缩进为行内样式，不受影响） */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td[data-col] {
  padding: 0;
}
/* 物料代码列保持靠左（含层级缩进，由行内 padding-left 控制）；
   !important 钉死（2026-10-04 oldcode4 用户复述：内容靠左对齐） */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td input.bom-mat-code,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td input[data-k="物料代码"],
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td textarea.bom-mat-code,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td textarea[data-k="物料代码"] {
  text-align: left !important;
}
/* 规格型号列靠左（2026-10-04 用户） */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td textarea[data-k="规格型号"] {
  text-align: left !important;
}
/* 物料名称列靠左（2026-10-04 用户：明细行物料名称内容靠左对齐）；
   !important 钉死——上方 15096 基础规则与其同级特异性 (1,2,2)，不加会被盖回居中 */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td textarea[data-k="物料名称"] {
  text-align: left !important;
}
/* 曾用编号独立列（2026-10-04 oldcode2 用户：单独列，不进备注）——只读展示。
   pconprint64（2026-10-06 用户「红框文字不要特殊字体、字号，与单位列内容式样一致」）：
   去掉 oldcode3 的灰色 11px 小字方案，回归与普通单元格（单位列等）一致的
   全局 12px 黑字；编号超宽可拖列宽（宽度持久化），打印视图仍加权 140px（plm_bom.js bpW） */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td[data-col="曾用编号"] {
  position: relative;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td .bom-old-cell {
  display: block;
  box-sizing: border-box;
  width: 100%;
  padding: 4px 8px;
  /* bomw1（2026-10-09 用户「内容靠左对齐」）：原 oldcode2 定的居中改靠左 */
  text-align: left;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  pointer-events: none;
  /* pconprint69（2026-10-06 用户「为什么红框内容字号那么大」截图=BOM明细曾用编号列）：
     浏览器实测 .bom-old-cell computed=14px，同表 input/textarea=12px——div 不在
     td>input 铺满规则组内，被未知 14px 级联命中。此处显式钉回 12px（!important
     胜全局锁同优先级竞争），bom_card_v2.css 另有 4id 高特异性同构规则双保险 */
  font-size: 12px !important;
  font-weight: 400 !important;
}

/* ── BOM 打印 / 导出 PDF（2026-10-04 printbom1 用户）────────────────────────
   打印专用净表挂 body 直下 #bom-print-root（plm_bom.js 生成，纯 td 文本）：
   屏显常隐，body.print-bom-on 时（media print）隐藏页面其余节点、只显示净表。
   @page 定 A4 竖向 + 10mm 页边距；字号全部 !important 对抗全局 12px 规则 */
#bom-print-root { display: none; }
#bom-print-root .bp-title {
  font-size: 15px !important;
  font-weight: 700 !important;
  text-align: center;
  margin: 0 0 6px;
  color: #111;
}
#bom-print-root .bp-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 2px 18px;
  font-size: 10px !important;
  color: #111;
  padding-bottom: 6px;
  margin-bottom: 8px;
  border-bottom: 1px solid #999;
}
#bom-print-root .bp-meta b { font-weight: 600 !important; }
#bom-print-root .bp-table {
  width: 100%;
  table-layout: fixed;
  border-collapse: collapse;
}
#bom-print-root .bp-table th,
#bom-print-root .bp-table td {
  border: 1px solid #555;
  font-size: 9.5px !important;
  line-height: 1.45 !important;
  padding: 3px 4px;
  text-align: center;
  vertical-align: middle;
  word-break: break-all;
  color: #111;
}
#bom-print-root .bp-table th {
  background: #eee;
  font-weight: 600 !important;
  -webkit-print-color-adjust: exact;
  print-color-adjust: exact;
}
#bom-print-root .bp-table td.bp-al { text-align: left; }
#bom-print-root .bp-foot {
  font-size: 9px !important;
  color: #444;
  text-align: right;
  margin-top: 4px;
}
@media print {
  @page { size: A4 portrait; margin: 10mm; }
  body.print-bom-on > :not(#bom-print-root) { display: none !important; }
  body.print-bom-on #bom-print-root { display: block !important; }
  #bom-print-root .bp-table tr { page-break-inside: avoid; }
  #bom-print-root .bp-table thead { display: table-header-group; }
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td input:hover,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td input:focus,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td select:hover,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td select:focus,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td textarea:hover,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table td textarea:focus {
  border-color: #cbd5e1;
  background: #fff;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table th {
  font-size: 12px;
  white-space: nowrap;
  padding: 5px 4px;
}
/* ── BOM 明细行：层级变色（1 白 / 2 浅蓝 / 3 浅黄 / 4 浅绿 / 5+ 浅紫）── */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row td[data-col],
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row td.col-fill {
  background: transparent;
}
/* bomlv3（2026-10-09 用户「应该是内容变色，不是背景变色」）：行背景回归白底，
   层级色改打在**文字**上（td 直属文本 + 单元格内 input/textarea 一并覆盖）。
   色板：2 蓝 / 3 琥珀 / 4 绿 / 5+ 紫，与分屏 bom_card_v2.css 同步 */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-2 td[data-col],
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-2 td[data-col] > input,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-2 td[data-col] > textarea,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-2 td[data-col] > select { color: #2563eb !important; }
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-3 td[data-col],
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-3 td[data-col] > input,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-3 td[data-col] > textarea,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-3 td[data-col] > select { color: #b45309 !important; }
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-4 td[data-col],
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-4 td[data-col] > input,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-4 td[data-col] > textarea,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-4 td[data-col] > select { color: #16a34a !important; }
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-5 td[data-col],
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-5 td[data-col] > input,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-5 td[data-col] > textarea,
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.bom-lv-5 td[data-col] > select { color: #9333ea !important; }
/* 偶数行不覆盖层级底色：层级色优先（BOM 明细行不应用 zebra） */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr:nth-child(even) td[data-col] { background: inherit; }
/* 悬停仍给浅灰提示，但弱化避免盖住层级色 */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row:hover td[data-col] {
  background: #f1f5f9 !important;
}
/* 行号单元格：保持原有浅绿底色（不随层级变色，避免拖动手柄视觉混乱） */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody td.col-idx {
  background: #f9fafb !important;
  cursor: grab;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.dragging td.col-idx {
  cursor: grabbing;
}
/* 行号格内拖动手柄 + 行号 */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table .bom-row-drag {
  display: inline-block;
  color: #94a3b8;
  font-weight: 700;
  letter-spacing: -2px;
  user-select: none;
  cursor: grab;
  padding: 0 2px;
  /* 触屏（手机/平板）拖拽行必须：否则浏览器把拖动当滚动 */
  touch-action: none;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table .bom-row-drag:hover { color: #475569; }
/* 非输入单元格（行内空白处）也可发起整行拖拽 */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody td:not(:has(input)):not(:has(select)):not(:has(button)) {
  cursor: grab;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.dragging td:not(:has(input)):not(:has(select)):not(:has(button)) {
  cursor: grabbing;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table .bom-row-no {
  margin-left: 2px;
  font-variant-numeric: tabular-nums;
}
/* 拖拽中的行淡化、目标行上下高亮 */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.dragging { opacity: 0.45; }
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.drag-over-before td[data-col] {
  box-shadow: inset 0 2px 0 #0ea5e9;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tbody tr.ib-detail-row.drag-over-after td[data-col] {
  box-shadow: inset 0 -2px 0 #0ea5e9;
}

/* BOM 明细「物料代码」下拉面板（对标国桉康 desk-combo-panel） */
.bom-mat-combo-panel {
  position: fixed;
  z-index: 13000;
  max-height: 240px;
  overflow-x: hidden;
  overflow-y: auto;
  background: #fff;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  box-shadow: 0 8px 20px rgba(15, 23, 42, 0.12);
  box-sizing: border-box;
  padding: 0;
  margin: 0;
  display: block;
}
/* hidden 属性必须真隐藏：上面的 display:block 会压过 UA 的 [hidden] 规则，
   关闭后的空面板会残留成一条 ~360px 的横线（2026-09-30 用户反馈的「红框横线」） */
.bom-mat-combo-panel[hidden] { display: none !important; }
.bom-mat-combo-panel .bom-mat-combo-item {
  display: block;
  width: 100%;
  box-sizing: border-box;
  text-align: left;
  border: 0;
  border-radius: 0;
  background: #fff;
  padding: 8px 10px;
  font-size: 13px;
  font-family: inherit;
  color: #1e293b;
  cursor: pointer;
  line-height: 1.35;
}
.bom-mat-combo-panel .bom-mat-combo-item:hover,
.bom-mat-combo-panel .bom-mat-combo-item.is-active {
  background: #e8f0fe;
}
.bom-mat-combo-panel .bom-mat-combo-item .bom-mat-combo-name {
  font-weight: 600;
}
.bom-mat-combo-panel .bom-mat-combo-item .bom-mat-combo-extra {
  color: #64748b;
  font-size: 12px;
  margin-top: 2px;
}
.bom-mat-combo-panel .bom-mat-combo-empty {
  padding: 10px 12px;
  color: #94a3b8;
  font-size: 13px;
}
/* 联想面板过滤状态自证行（2026-09-30）：显示搜索词与命中数 */
.bom-mat-combo-panel .bom-mat-combo-meta {
  padding: 5px 12px;
  color: #94a3b8;
  font-size: 11px;
  border-bottom: 1px solid #f1f5f9;
  background: #f8fafc;
}

/* ── 物料类型管理弹窗（对标国桉康） ── */
#modal-plm-material-types .modal-card {
  width: 720px;
  height: 560px;
}
#modal-plm-material-types .modal-body {
  flex: 1;
  min-height: 0;
  overflow: auto;
}
#modal-plm-material-types .plm-mat-types-hint {
  color: #64748b;
  font-size: 13px;
  margin: 0 0 10px;
  line-height: 1.6;
}
#modal-plm-material-types .plm-mat-types-tabs {
  display: flex;
  gap: 6px;
  margin-bottom: 10px;
  border-bottom: 1px solid #e2e8f0;
  padding-bottom: 0;
}
#modal-plm-material-types .plm-mat-types-tab {
  border: 1px solid #e2e8f0;
  border-bottom: none;
  background: #f8fafc;
  color: #475569;
  padding: 6px 16px;
  font-size: 13px;
  border-radius: 0;
  cursor: pointer;
}
#modal-plm-material-types .plm-mat-types-tab:hover {
  background: #f1f5f9;
}
#modal-plm-material-types .plm-mat-types-tab.active {
  background: #fff;
  color: #0f172a;
  font-weight: 600;
  border-color: #cbd5e1;
  box-shadow: 0 -2px 6px rgba(15, 23, 42, 0.06);
  position: relative;
  top: 1px;
}
#modal-plm-material-types .plm-mat-types-toolbar {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
}
#modal-plm-material-types .plm-mat-types-table-wrap {
  max-height: min(52vh, 440px);
  overflow: auto;
}
/* 列等宽：行号固定 50px，其余三列均分剩余宽度 */
#modal-plm-material-types .plm-mat-types-table {
  width: 100%;
  table-layout: fixed;
}
#modal-plm-material-types .plm-mat-types-table th {
  white-space: nowrap;
  text-align: center;
}
#modal-plm-material-types .plm-mat-types-table td {
  text-align: center;
}
#modal-plm-material-types .plm-mat-types-table tr.plm-mat-type-row.selected {
  background: #ecfdf5;
}
#modal-plm-material-types .plm-mat-types-table tr.plm-mat-type-row:hover {
  cursor: pointer;
}
#modal-plm-material-types .plm-mat-types-table td.col-idx {
  color: #94a3b8;
}
/* 内联编辑控件 */
#modal-plm-material-types .plm-mat-types-table td .mt-cell-text {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-height: 22px;
  line-height: 22px;
}
#modal-plm-material-types .plm-mat-types-table tr.plm-mat-type-row.editing td {
  padding: 3px 4px;
}
#modal-plm-material-types .plm-mat-types-table .mt-inline-input,
#modal-plm-material-types .plm-mat-types-table select[data-mt-field="category"] {
  width: 100%;
  box-sizing: border-box;
  height: 28px;
  padding: 2px 6px;
  font-size: 13px;
  border: 1px solid #4f6ef7;
  border-radius: 0;
  outline: none;
  background: #fff;
  color: #0f172a;
  text-align: center;
}
#modal-plm-material-types .plm-mat-types-table tr.plm-mat-type-row.editing {
  background: #f0f7ff;
}
#modal-plm-material-types .plm-mat-types-table tr.plm-mat-type-row.saving {
  opacity: 0.6;
  pointer-events: none;
}

/* ═══════════════════════════════════════════════════════════════════
   系统统一定义（MF-INPUT-BLUE-001，对标国桉康 GAK-INPUT-BLUE-001）：
   可输入/可选择控件文字统一蓝色
   ── 仅「可编辑」控件生效：文本/数字/日期/时间/下拉/文本域
   ── 只读/禁用（查看·审核·只读模式）保持灰字，明确区分「可编辑」与「只读」
   ── 排除：复选框/单选框/文件/隐藏/按钮型/范围/取色器（无文字输入语义）
   ═══════════════════════════════════════════════════════════════════ */
#app input:not([readonly]):not([disabled]):not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="hidden"]):not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="range"]):not([type="color"]),
#app select:not([disabled]),
#app textarea:not([readonly]):not([disabled]),
#app select:not([disabled]) option {
  color: #1a73e8 !important;
}
/* 编辑态输入框占位提示保持浅灰（提示语非内容，不随正文变蓝） */
#app input:not([readonly]):not([disabled])::placeholder,
#app textarea:not([readonly]):not([disabled])::placeholder {
  color: #a8b3c2 !important;
}



/* 非文档页：PLM 右侧面板不显示标题栏（用户 2026-09-08；文档页保留「文档 · 分类」标题） */
#pane-plm.is-plm-split-page:not(.is-plm-doc-page) .plm-split-right .plm-split-right-head {
  display: none;
}

/* ══════════════════════════════════════════════════════════════════
   打印输出（用户 2026-09-13：「我需要能输出打印的」）
   点工具栏「🖨 打印」或直接 Ctrl+P，出一张 A4 横向、无任何界面元素的表单纸。
   设计要点：
     ① @page 固定 A4 横版 + margin:0，打印时卡片锁 297×209mm，与屏幕版式一致
     ② 所有规则都用 body:has(#view-plm-form:not([hidden])) 守卫 ——
        只有「表单正开着」才收掉界面外壳；表单没开时 Ctrl+P 保持浏览器默认行为
     ③ 屏幕上隐藏的 .modal-head 在打印时放出来当表单标题（「新增物料」等），并去掉「✕」
     ④ print-color-adjust: exact 保住浅灰标签底与网格线（否则多数浏览器会白底输出）
     ⑤ 隐藏操作按钮组 / 上传按钮 / 拖拽提示 / 派生按钮等纯交互件
   ══════════════════════════════════════════════════════════════════ */
@page {
  size: A4 landscape;
  margin: 0;
}

@media print {
  /* 打印保色：浅灰标签底、网格线、橙色标题不被浏览器「省墨」白化 */
  * {
    -webkit-print-color-adjust: exact !important;
    print-color-adjust: exact !important;
  }
  html,
  body {
    width: auto !important;
    height: auto !important;
    margin: 0 !important;
    padding: 0 !important;
    overflow: visible !important;
    background: #fff !important;
  }

  /* ── ① 收掉界面外壳 ──
     .shell-main 下只放行 #pane-plm；#view-shell 下只放行 .shell-main。
     ⚠️ <footer class="shell-foot"> 是 #view-shell 的直接子元素（不在 .shell-main 里），
        只写 .shell-main > * 会漏掉它 —— 它会带出 1px 橙线并把内容挤到第 2 页。 ── */
  body:has(#view-plm-form:not([hidden])) #view-shell > *:not(.shell-main),
  body:has(#view-plm-form:not([hidden])) .shell-main > *:not(#pane-plm),
  body:has(#view-plm-form:not([hidden])) #view-login,
  body:has(#view-plm-form:not([hidden])) #pane-plm > .page-header,
  body:has(#view-plm-form:not([hidden])) #pane-plm > .page-footer,
  body:has(#view-plm-form:not([hidden])) #pane-plm .plm-split-left,
  body:has(#view-plm-form:not([hidden])) #pane-plm .plm-split-resizer,
  body:has(#view-plm-form:not([hidden])) #pane-plm .plm-split-right-head,
  body:has(#view-plm-form:not([hidden])) #plm-split-right-empty {
    display: none !important;
  }

  /* ── ② 祖先链摊平：去掉 flex / 100vh / 内距 / 背景，让表单自己撑出纸张 ── */
  body:has(#view-plm-form:not([hidden])) #app,
  body:has(#view-plm-form:not([hidden])) #view-shell,
  body:has(#view-plm-form:not([hidden])) .shell-main,
  body:has(#view-plm-form:not([hidden])) #pane-plm,
  body:has(#view-plm-form:not([hidden])) #pane-plm .plm-split,
  body:has(#view-plm-form:not([hidden])) #pane-plm .plm-split-right,
  body:has(#view-plm-form:not([hidden])) #plm-split-right-body {
    display: block !important;
    width: auto !important;
    height: auto !important;
    min-height: 0 !important;
    max-height: none !important;
    overflow: visible !important;
    margin: 0 !important;
    padding: 0 !important;
    border: none !important;
    background: #fff !important;
    box-shadow: none !important;
  }
  /* 表单壳本身（分栏内嵌时已被改成 static，这里兼顾非分栏页的真弹窗形态） */
  body:has(#view-plm-form:not([hidden])) #view-plm-form {
    position: static !important;
    inset: auto !important;
    display: block !important;
    height: auto !important;
    min-height: 0 !important;
    padding: 0 !important;
    overflow: visible !important;
    background: #fff !important;
    z-index: auto !important;
  }
  body:has(#view-plm-form:not([hidden])) #view-plm-form[hidden] {
    display: none !important;
  }

  /* ── ③ 非分栏页（工艺 / 技术文档）的真弹窗：铺满纸宽，不留居中浮层 ── */
  body:has(#view-plm-form:not([hidden])) #view-plm-form .modal-card {
    width: 100% !important;
    max-width: none !important;
    height: auto !important;
    max-height: none !important;
    margin: 0 !important;
    border: none !important;
    box-shadow: none !important;
  }

  /* ── ④ 物料 / 产品 / 半成品：锁死 A4 横版纸张尺寸，与屏幕版式完全一致 ── */
  body:has(#view-plm-form:not([hidden]))
    #pane-plm
    .plm-split-right
    #view-plm-form:not(:has(#plm-bom-detail-section:not([hidden])))
    .modal-card {
    width: 297mm !important;
    height: 209mm !important; /* 留 1mm 余量，避免刚好 210mm 时溢出到第 2 页 */
    aspect-ratio: auto !important;
    flex: none !important;
    margin: 0 !important;
    border: none !important;
    box-shadow: none !important;
    overflow: hidden !important;
  }

  /* ── ⑤ 用 .modal-head 当打印标题（屏幕上它是 display:none）── */
  body:has(#view-plm-form:not([hidden])) #view-plm-form .modal-head {
    display: flex !important;
    align-items: center;
    height: 36px;
    padding: 0 12px;
    margin: 0;
    background: #fff !important;
    border-bottom: 1px solid #000;
  }
  body:has(#view-plm-form:not([hidden])) #view-plm-form .modal-head .modal-title {
    font-size: 10px;
    font-weight: 700;
    color: var(--primary-dark);
  }
  body:has(#view-plm-form:not([hidden])) #view-plm-form .modal-head #btn-plm-form-close {
    display: none !important;
  }

  /* ── ⑥ 纯交互件不打印 ── */
  #plm-form-actions-row,
  #plm-form-actions-row > *,
  /* 「⚙ 物料类型」2026-09-15 起在 #plm-form-actions-row 之外（搬进了「基本信息」行），
     不再被 `#plm-form-actions-row > *` 覆盖，必须单独列出，否则会印到纸上。 */
  #btn-plm-form-mat-types,
  #plm-attach-upload-label,
  #plm-attach-status,
  #btn-plm-derive-material,
  #btn-plm-derive,
  #btn-plm-derive-bom {
    display: none !important;
  }
  /* 附件区空态：保留虚线框（纸上就是一块图片粘贴区），
     但把「微信拖入 / Ctrl+V」这种屏幕操作提示换成纸上看得懂的两个字 */
  body:has(#view-plm-form:not([hidden])) #plm-attach-section .attach-drop-hint {
    font-size: 0 !important;
  }
  body:has(#view-plm-form:not([hidden])) #plm-attach-section .attach-drop-hint::before {
    content: "图片区";
    font-size: 10px;
  }
}

/* ==========================================================================
   「设计文档」文件资源管理器（参考国桉康「保护板规格书」模块 20260914）
   来源：E:/国桉康_git/web/frontend/css/app.css 的 .win-* / .iso-docs-* 规则
   移植说明：
     1) 仅取 .win-* / .iso-docs-*，已剔除带 #id 的片段（属国桉康其它页面）；
     2) 按迈方「全站去圆角（--radius:0）」规范，border-radius 全部归零；
     3) 作用域：#pane-design-doc 内的自定义标记，类名与迈方现有类名零冲突。
   ========================================================================== */
.iso-docs-search-wrap {
display: inline-flex; align-items: center; position: relative;
  flex-shrink: 0;
}

.iso-docs-search-ico {
position: absolute; left: 6px; top: 50%; transform: translateY(-50%);
  width: 14px; height: 14px; color: #94a3b8; pointer-events: none;
}

.iso-docs-search-ico svg {
width: 14px; height: 14px;
}

.iso-docs-search {
height: 26px; width: 180px;
  padding: 0 8px 0 26px;
  font-size: 12px;
  border: 1px solid #e2e8f0; border-radius: 0;
  background: #fff; color: #334155;
  outline: none;
}

.iso-docs-search:focus {
border-color: var(--primary);
}

.iso-docs-sort {
height: 26px; font-size: 12px;
  border: 1px solid #e2e8f0; border-radius: 0;
  background: #fff; color: #334155;
  padding: 0 6px; cursor: pointer;
}

.iso-docs-sort:focus {
border-color: var(--primary); outline: none;
}

.iso-docs-view-switch {
display: inline-flex; border: 1px solid #e2e8f0; border-radius: 0; overflow: hidden;
  flex-shrink: 0;
}

.iso-docs-view-btn {
width: 28px; height: 24px;
  background: #fff; border: none; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
  color: #64748b;
}

.iso-docs-view-btn svg {
width: 14px; height: 14px;
}

.iso-docs-view-btn:hover {
background: #f1f5f9;
}

.iso-docs-view-btn.active {
background: var(--primary); color: #fff;
}

.iso-docs-main {
display: flex;
  flex: 1;
  min-height: 0;
  gap: 0;
}

.iso-docs-side {
width: 220px;
  flex-shrink: 0;
  border-right: none;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background: #fcfcfd;
}

.iso-docs-splitter {
width: 6px;
  flex-shrink: 0;
  background: transparent;
  cursor: col-resize;
  position: relative;
  transition: background 0.15s ease;
}

.iso-docs-splitter::before {
content: '';
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 1px;
  height: 100%;
  background: var(--border, #e2e8f0);
  transition: width 0.15s ease, background 0.15s ease;
}

.iso-docs-splitter:hover::before,
.iso-docs-splitter.dragging::before {
width: 3px;
  background: var(--primary);
}

.iso-docs-splitter.dragging {
background: rgba(254,102,26,0.05);
}

.iso-docs-splitter.dragging * {
user-select: none !important;
}

.iso-docs-side-head {
padding: 8px 12px;
  font-size: 12px;
  color: var(--primary-dark);
  border-bottom: 1px solid #eef2f7;
  letter-spacing: 0.5px;
}

.iso-docs-side-body {
flex: 1;
  overflow: auto;
  padding: 4px 0;
}

.iso-docs-tree-item {
display: flex; align-items: center; gap: 4px;
  padding: 5px 12px;
  font-size: 13px;
  cursor: pointer;
  white-space: nowrap;
  overflow: hidden;
  color: #334155;
}

.iso-docs-tree-item:hover {
background: #f1f5f9;
}

.iso-docs-tree-item.active {
background: #fff7f0; color: var(--primary-dark);
}

.iso-docs-tree-icon {
display: inline-flex; width: 16px; height: 16px; align-items: center; justify-content: center; color: var(--primary-dark); flex-shrink: 0;
}

.iso-docs-tree-icon svg {
width: 16px; height: 16px;
}

.iso-docs-tree-label {
flex: 1; overflow: hidden; text-overflow: ellipsis;
}

.iso-docs-tree-arrow {
color: #94a3b8; font-size: 10px; flex-shrink: 0;
}

.iso-docs-tree-children {
padding-left: 14px;
}

.iso-docs-content {
flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  position: relative;
}

.iso-docs-breadcrumb {
padding: 8px 14px;
  font-size: 13px;
  border-bottom: 1px solid #eef2f7;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 2px;
  background: #fafbfc;
}

.iso-docs-crumb {
display: inline-flex; align-items: center; gap: 4px;
  color: var(--primary-dark);
  cursor: pointer;
  text-decoration: none;
  padding: 2px 4px; border-radius: 0;
}

.iso-docs-crumb:hover {
background: #e6f4f2;
}

.iso-docs-crumb svg {
width: 14px; height: 14px;
}

.iso-docs-crumb-sep {
color: #cbd5e1; margin: 0 2px;
}

.iso-docs-crumb-current {
color: #334155;
}

.iso-docs-list {
flex: 1;
  overflow: auto;
  padding: 0;
}

.iso-docs-head {
display: flex; align-items: center;
  padding: 8px 14px;
  font-size: 12px; color: #475569; font-weight: 500;
  background: #f1f5f9;
  border-bottom: 1px solid #e2e8f0;
  position: sticky; top: 0; z-index: 2;
}

.iso-docs-head [data-sort] {
cursor: pointer; user-select: none;
}

.iso-docs-head [data-sort]:hover {
color: var(--primary-dark);
}

.iso-docs-col-check {
width: 32px; flex-shrink: 0; display: flex; align-items: center; justify-content: center;
}

.iso-docs-col-icon {
width: 36px; flex-shrink: 0; display: flex; align-items: center; justify-content: center;
}

.iso-docs-col-name {
flex: 1; min-width: 0;
}

.iso-docs-col-size {
width: 80px; flex-shrink: 0;
}

.iso-docs-col-mtime {
width: 140px; flex-shrink: 0;
}

.iso-docs-col-ops {
width: 180px; flex-shrink: 0; text-align: right;
}

.iso-docs-row {
display: flex; align-items: center;
  padding: 9px 14px;
  font-size: 13px;
  border-bottom: 1px solid #f1f5f9;
  cursor: default;
}

.iso-docs-row:nth-child(even) {
background: #fafbfc;
}

.iso-docs-row:hover {
background: #f1f5f9;
}

.iso-docs-row.selected {
background: #fff7f0;
}

.iso-docs-row.selected:hover {
background: #bae6fd;
}

.iso-docs-row .iso-docs-col-name {
overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; color: #1e293b;
}

.iso-docs-row .iso-docs-col-name:hover {
color: var(--primary-dark);
}

.iso-docs-col-size {
color: #64748b; font-size: 12px;
}

.iso-docs-col-mtime {
color: #94a3b8; font-size: 12px;
}

.iso-docs-col-ops {
display: flex; gap: 2px; justify-content: flex-end;
}

.iso-docs-icon {
display: inline-flex; width: 20px; height: 20px; align-items: center; justify-content: center; color: var(--primary);
}

.iso-docs-icon svg {
width: 20px; height: 20px;
}

.iso-docs-icon.lg {
width: 48px; height: 48px; color: var(--primary);
}

.iso-docs-icon.lg svg {
width: 48px; height: 48px;
}

.iso-docs-act {
display: inline-flex; align-items: center; gap: 3px;
  background: #fff; border: 1px solid #e2e8f0; cursor: pointer;
  font-size: 12px; padding: 3px 8px; border-radius: 0;
  color: #475569;
}

.iso-docs-act svg {
width: 13px; height: 13px;
}

.iso-docs-act:hover {
background: #f1f5f9; border-color: #cbd5e1;
}

.iso-docs-act.danger {
color: #b91c1c;
}

.iso-docs-act.danger:hover {
background: #fef2f2; border-color: #fecaca;
}

.iso-docs-cbx {
display: inline-flex; width: 16px; height: 16px;
  border: 1.5px solid #cbd5e1; border-radius: 0;
  background: #fff; cursor: pointer;
  align-items: center; justify-content: center;
  color: transparent;
  transition: all 0.12s;
}

.iso-docs-cbx svg {
width: 12px; height: 12px;
}

.iso-docs-cbx:hover {
border-color: var(--primary);
}

.iso-docs-cbx.on {
background: var(--primary); border-color: var(--primary); color: #fff;
}

.iso-docs-list.is-grid {
padding: 12px;
}

.iso-docs-grid {
display: grid;
  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
  gap: 10px;
}

.iso-docs-card {
position: relative;
  padding: 14px 10px 8px;
  border: 1px solid #e2e8f0; border-radius: 0;
  background: #fff;
  display: flex; flex-direction: column; align-items: center;
  cursor: default;
  transition: all 0.12s;
}

.iso-docs-card:hover {
border-color: var(--primary); box-shadow: 0 1px 4px rgba(254,102,26,0.08);
}

.iso-docs-card.selected {
border-color: var(--primary); background: #fff7f0;
}

.iso-docs-card-check {
position: absolute; top: 6px; left: 6px;
}

.iso-docs-card-icon {
margin-bottom: 6px;
}

.iso-docs-card-name {
font-size: 12px; color: #334155; text-align: center;
  width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  cursor: pointer;
}

.iso-docs-card-name:hover {
color: var(--primary-dark);
}

.iso-docs-card-meta {
font-size: 11px; color: #94a3b8; margin-bottom: 6px;
}

.iso-docs-card-acts {
display: flex; gap: 2px; flex-wrap: wrap; justify-content: center;
}

.iso-docs-card-acts .iso-docs-act {
padding: 1px 4px; font-size: 11px;
}

.iso-docs-card-acts .iso-docs-act span {
display: none;
}

.iso-docs-card-acts .iso-docs-act {
width: 24px; height: 22px; justify-content: center;
}

.iso-docs-empty {
padding: 60px 20px; text-align: center; color: #94a3b8; font-size: 13px;
  display: flex; flex-direction: column; align-items: center; gap: 8px;
}

.iso-docs-empty .iso-docs-icon.lg {
color: #cbd5e1;
}

.iso-docs-empty-text {
font-size: 14px; color: #64748b;
}

.iso-docs-empty-hint {
font-size: 12px; color: #94a3b8;
}

.iso-docs-drop-hint {
position: absolute;
  left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  z-index: 20; pointer-events: none;
}

.iso-docs-drop-hint-card {
display: inline-flex; align-items: center; gap: 10px;
  padding: 14px 22px;
  background: rgba(254,102,26,0.96);
  color: #fff;
  border-radius: 0;
  font-size: 14px;
  box-shadow: 0 6px 20px rgba(254,102,26,0.28);
}

.iso-docs-drop-hint-icon {
display: inline-flex; width: 20px; height: 20px; align-items: center; justify-content: center;
}

.iso-docs-drop-hint-icon svg {
width: 20px; height: 20px;
}

.iso-docs-upload-panel {
position: absolute; bottom: 0; left: 0; right: 0;
  height: 28px;
  background: #fff;
  border-top: 1px solid #e2e8f0;
  display: flex; align-items: center;
  gap: 10px; padding: 0 12px;
  z-index: 15;
  box-shadow: 0 -2px 6px rgba(0,0,0,0.04);
}

.iso-docs-upload-bar-wrap {
flex: 1; height: 6px; background: #e2e8f0; border-radius: 0; overflow: hidden;
}

.iso-docs-upload-bar {
height: 100%; width: 0; background: var(--primary);
  transition: width 0.2s ease;
}

.iso-docs-upload-text {
font-size: 12px; color: #475569; flex-shrink: 0; min-width: 140px;
}

.iso-docs-upload-cancel {
background: none; border: 1px solid #e2e8f0; cursor: pointer;
  font-size: 12px; padding: 2px 8px; border-radius: 0; color: #b91c1c;
}

.iso-docs-upload-cancel:hover {
background: #fef2f2; border-color: #fecaca;
}

.iso-docs-drawer {
position: absolute; top: 0; right: 0; bottom: 0;
  width: 60%; max-width: 800px;
  background: #fff;
  border-left: 1px solid #e2e8f0;
  box-shadow: -4px 0 16px rgba(0,0,0,0.08);
  transform: translateX(100%);
  transition: transform 0.2s ease;
  display: flex; flex-direction: column;
  z-index: 30;
}

.iso-docs-drawer.open {
transform: translateX(0);
}

.iso-docs-drawer-head {
display: flex; align-items: center; justify-content: space-between;
  padding: 8px 14px;
  border-bottom: 1px solid #eef2f7;
  background: #fafbfc;
  flex-shrink: 0;
}

.iso-docs-drawer-title {
font-size: 13px; color: #334155;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  flex: 1; min-width: 0;
}

.iso-docs-drawer-actions {
display: flex; gap: 4px; flex-shrink: 0;
}

.iso-docs-drawer-body {
flex: 1; overflow: auto; padding: 14px;
}

.iso-docs-drawer-loading {
padding: 20px; text-align: center; color: #94a3b8; font-size: 13px;
}

.iso-docs-preview-img-wrap {
text-align: center;
}

.iso-docs-preview-img {
max-width: 100%; border: 1px solid #e2e8f0; border-radius: 0;
}

.iso-docs-preview-text {
font-size: 12px; white-space: pre-wrap; word-break: break-all;
  background: #f8fafc; padding: 10px; border-radius: 0;
  border: 1px solid #eef2f7;
  font-family: "Noto Sans SC", monospace;
  line-height: 1.5;
}

.iso-docs-preview-note {
padding: 20px; text-align: center; color: #64748b; font-size: 13px;
}

.iso-docs-preview-actions {
text-align: center; margin-top: 12px;
}

.iso-docs-multi-bar {
position: absolute; bottom: 28px; left: 0; right: 0;
  height: 40px;
  background: var(--primary-dark);
  color: #fff;
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 16px;
  z-index: 25;
  box-shadow: 0 -2px 8px rgba(0,0,0,0.12);
}

.iso-docs-multi-info {
font-size: 13px;
}

.iso-docs-multi-info b {
font-size: 14px; margin: 0 2px;
}

.iso-docs-multi-acts {
display: flex; gap: 6px;
}

.iso-docs-multi-acts .tb-btn {
color: #fff; background: rgba(255,255,255,0.12); border: 1px solid rgba(255,255,255,0.2);
}

.iso-docs-multi-acts .tb-btn:hover {
background: rgba(255,255,255,0.22);
}

.iso-docs-multi-acts .tb-btn.danger-text {
color: #fecaca;
}

.iso-docs-multi-acts .tb-ico {
color: #fff;
}

.win-multi-acts {
display: flex;
  align-items: center;
  gap: 4px;
}

.win-multi-info {
font-size: 12px;
  color: var(--muted);
  margin-right: 6px;
  white-space: nowrap;
}

.win-multi-info b {
color: var(--primary);
}

.win-title {
font-size: 12px; color: #1a1a1a; margin-left: 8px;
}

.win-cmdbar {
display: flex; align-items: center; justify-content: space-between;
  padding: 4px 8px;
  background: #f9f9fa;
  border-bottom: 1px solid #e5e5e5;
  flex-shrink: 0;
  gap: 8px;
}

.win-cmdbar-left {
display: flex; align-items: center; gap: 6px; flex-shrink: 0;
}

.win-cmdbar-tools {
display: flex; align-items: center; gap: 2px; flex: 1; overflow-x: auto;
}

.win-cmdbar-right {
display: flex; align-items: center; flex-shrink: 0;
}

.win-cmd {
display: inline-flex; align-items: center; gap: 4px;
  height: 28px; padding: 0 8px;
  background: transparent; border: none; border-radius: 0;
  font-size: 12px; color: #1a1a1a; cursor: pointer; white-space: nowrap;
  transition: background 0.08s;
}

.win-cmd svg {
width: 16px; height: 16px; flex-shrink: 0;
}

.win-cmd:hover {
background: #ededed;
}

.win-cmd:active {
background: #e0e0e0;
}

.win-cmd:disabled {
color: #bbb; cursor: default; background: transparent;
}

.win-cmd-sep {
width: 1px; height: 18px; background: #e0e0e0; margin: 0 4px; flex-shrink: 0;
}

.win-cmd-sort {
position: relative;
}

.win-cmd-caret {
width: 12px !important; height: 12px !important;
}

.win-sort-menu {
position: absolute; top: 32px; left: 0;
  min-width: 180px;
  background: #fff;
  border: 1px solid #e5e5e5;
  border-radius: 0;
  box-shadow: 0 4px 16px rgba(0,0,0,0.12);
  padding: 4px;
  z-index: 100;
}

.win-sort-menu button {
display: flex; align-items: center; gap: 8px; width: 100%;
  padding: 6px 10px; border: none; background: transparent;
  font-size: 12px; color: #1a1a1a; cursor: pointer; border-radius: 0;
  text-align: left;
}

.win-sort-menu button:hover {
background: #f5f5f5;
}

.win-sort-check {
width: 16px; color: var(--primary); font-size: 12px; text-align: center;
}

.win-cmd-view {
display: inline-flex; border: 1px solid #e5e5e5; border-radius: 0; overflow: hidden;
}

.win-view-btn {
width: 32px; height: 26px; background: #fff; border: none; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; color: #616161;
}

.win-view-btn svg {
width: 16px; height: 16px;
}

.win-view-btn:hover {
background: #f5f5f5;
}

.win-view-btn.active {
background: #fff7f0; color: var(--primary);
}

.win-search-wrap {
display: inline-flex; align-items: center; position: relative;
}

.win-search-ico {
position: absolute; left: 8px; top: 50%; transform: translateY(-50%); width: 14px; height: 14px; color: #8a8a8a; pointer-events: none;
}

.win-search-ico svg {
width: 14px; height: 14px;
}

.win-search {
height: 28px; width: 200px;
  padding: 0 10px 0 28px;
  font-size: 12px; color: #1a1a1a;
  border: 1px solid #e5e5e5; border-radius: 0;
  background: #fff; outline: none;
  transition: border-color 0.1s;
}

.win-search:focus {
border-color: var(--primary); border-width: 2px; padding-left: 27px;
}

.win-navbar {
display: flex; align-items: center; gap: 4px;
  padding: 4px 8px;
  background: #f9f9fa;
  border-bottom: 1px solid #e5e5e5;
  flex-shrink: 0;
}

.win-nav-btns {
display: flex; gap: 2px; flex-shrink: 0;
}

.win-nav-btn {
width: 30px; height: 28px;
  background: transparent; border: none; border-radius: 0;
  cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  color: #1a1a1a;
  transition: background 0.08s;
}

.win-nav-btn svg {
width: 16px; height: 16px;
}

.win-nav-btn:hover:not(:disabled) {
background: #ededed;
}

.win-nav-btn:disabled {
color: #bbb; cursor: default;
}

.win-addr-bar {
flex: 1; min-width: 0; height: 28px;
  background: #fff;
  border: 1px solid #e5e5e5; border-radius: 0;
  display: flex; align-items: center;
  padding: 0 4px;
  overflow: hidden;
}

.win-addr-breadcrumb {
display: flex; align-items: center; flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden; scrollbar-width: none;
}

.win-addr-breadcrumb::-webkit-scrollbar {
display: none;
}

.win-crumb {
display: inline-flex; align-items: center; gap: 4px;
  background: transparent; border: none; cursor: pointer;
  font-size: 12px; color: #1a1a1a; padding: 4px 6px; border-radius: 0;
  white-space: nowrap; flex-shrink: 0;
}

.win-crumb:hover {
background: #f5f5f5; color: var(--primary);
}

.win-crumb-ico {
display: inline-flex; width: 16px; height: 16px;
}

.win-crumb-ico svg {
width: 16px; height: 16px;
}

.win-crumb-sep {
display: inline-flex; align-items: center; color: #8a8a8a; flex-shrink: 0;
}

.win-crumb-sep svg {
width: 12px; height: 12px;
}

.iso-docs-main {
display: flex;
  flex: 1;
  min-height: 0;
  gap: 0;
  background: #fff;
}

.iso-docs-side {
width: 240px;
  flex-shrink: 0;
  border-right: 1px solid #e5e5e5;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background: #fafafa;
}

.iso-docs-side-head {
padding: 8px 12px;
  font-size: 11px;
  color: #616161;
  border-bottom: 1px solid #eee;
  letter-spacing: 0.3px;
}

.iso-docs-side-body {
flex: 1; overflow: auto; padding: 2px 0;
}

.iso-docs-tree-item {
display: flex; align-items: center; gap: 4px;
  padding: 4px 12px 4px 8px;
  font-size: 12px; color: #1a1a1a;
  cursor: pointer; white-space: nowrap;
}

.iso-docs-tree-item:hover {
background: #f0f0f0;
}

.iso-docs-tree-item.active {
background: #fff7f0; color: var(--primary);
}

.iso-docs-tree-chev {
width: 16px; height: 16px;
  display: inline-flex; align-items: center; justify-content: center;
  color: #999; flex-shrink: 0;
  cursor: pointer;
  border-radius: 0;
  transition: background .15s, color .15s;
}

.iso-docs-tree-chev svg {
width: 12px; height: 12px;
  transition: transform .15s ease;
  transform: rotate(0deg);
}

.iso-docs-tree-chev:hover {
background: #e5e5e5; color: #333;
}

.iso-docs-tree-chev:hover svg {
color: var(--primary);
}

.iso-docs-tree-chev.expanded svg {
transform: rotate(90deg);
}

.iso-docs-tree-chev.empty {
cursor: default;
}

.iso-docs-tree-chev.empty:hover {
background: transparent;
}

.iso-docs-tree-chev.empty:hover svg {
color: #999;
}

.iso-docs-tree-icon {
display: inline-flex; width: 18px; height: 18px; align-items: center; justify-content: center; flex-shrink: 0;
}

.iso-docs-tree-icon svg {
width: 18px; height: 18px;
}

.iso-docs-tree-label {
flex: 1; overflow: hidden; text-overflow: ellipsis;
}

.iso-docs-tree-children {
padding-left: 12px;
}

.iso-docs-content {
flex: 1; min-width: 0;
  display: flex; flex-direction: column;
  overflow: hidden; position: relative;
  background: #fff;
}

.iso-docs-list {
flex: 1; overflow: auto; padding: 0;
}

.iso-docs-list.is-grid {
padding: 8px; overflow: auto;
}

.win-list-head {
display: flex; align-items: center;
  padding: 0 0 0 0;
  font-size: 12px; color: #616161;
  background: #fbfbfc;
  border-bottom: 1px solid #e5e5e5;
  position: sticky; top: 0; z-index: 5;
  height: 32px;
}

.win-list-head [data-sort] {
cursor: pointer; user-select: none; display: flex; align-items: center; height: 100%;
}

.win-list-head [data-sort]:hover {
color: var(--primary);
}

.win-sort-arrow {
width: 12px !important; height: 12px !important; color: var(--primary);
}

.win-col-check {
width: 36px; flex-shrink: 0; display: flex; align-items: center; justify-content: center;
}

.win-col-name {
flex: 1; min-width: 0; padding: 0 8px; display: flex; align-items: center; gap: 6px;
}

.win-col-mtime {
width: 160px; flex-shrink: 0; padding: 0 8px;
}

.win-col-type {
width: 120px; flex-shrink: 0; padding: 0 8px;
}

.win-col-size {
width: 100px; flex-shrink: 0; padding: 0 8px; text-align: right;
}

/* ── 创建 BOM 快速弹窗（订单右键，2026-09-29）：对标国桉康「BOM 明细」卡片版式 ── */
/* 隐藏：卡标题行 / 图片附件 / 底部按钮行（保存=自动保存，关闭走右上 ✕） */
#view-plm-form.plm-quick-bom #plm-form-actions-row,
#view-plm-form.plm-quick-bom #plm-attach-section,
#view-plm-form.plm-quick-bom .modal-foot {
  display: none !important;
}
/* 顶部摘要信息条：只留六项（BOM编号/产品型号/产品名称/版本号/状态/创建时间）。
   ⚠️ 必须用与 9352-9435「表格化表单」同等强选择器（>#form-grid-2>.field>）+ !important，
   否则标签格灰底/12px、.field 橙色网格底(var(--border))会透出来（2026-09-29 实测翻车） */
/* 顶部摘要信息条：只留六项（BOM编号/产品型号/产品名称/版本号/状态/创建时间）。
   扩展字段（曾用编号/物料类型/颜色/客户/生效日期/创建人/备注）已整体挪入 #plm-b-extra-grid 容器
   （2026-09-29 DOM 重构，取代此前按 .qb-hide 逐字段隐藏——该方案实测被运行时干扰失效） */
#view-plm-form.plm-quick-bom #plm-form-bom > .section-title,
#view-plm-form.plm-quick-bom #plm-b-extra-grid {
  display: none !important;
}
/* 网格：6 列、白底、去表格化网格线与固定 34px 行 */
#view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 {
  grid-template-columns: repeat(6, minmax(0, 1fr)) !important;
  gap: 4px 18px !important;
  background: transparent !important;
  border: none !important;
  grid-auto-rows: auto !important;
  padding: 0 !important;
}
/* 字段改上下结构（标签在上、值在下），去掉 [92px 标签|输入] 横向格与橙底 */
#view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field {
  display: block !important;
  background: transparent !important;
  margin: 0 !important;
}
#view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > span {
  display: block !important;
  background: transparent !important;
  padding: 0 !important;
  min-height: 0 !important;
  text-align: left !important;
  margin-bottom: 2px !important;
  font-size: 12px !important;
  color: var(--muted) !important;
  overflow: visible !important;
}
/* 换名标签：隐藏原文，用 data-label 显示样图字段名 */
#view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > span.qb-label { font-size: 0 !important; }
#view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > span.qb-label::before {
  content: attr(data-label);
  font-size: 12px !important;
  color: var(--muted) !important;
}
/* 字段顺序对齐样图：BOM编号 → 产品型号(规格) → 产品名称 → 版本号 → 状态 → 创建时间 */
#view-plm-form.plm-quick-bom label.field:has(> #plm-b-model) { order: 1; }
#view-plm-form.plm-quick-bom label.field:has(> #plm-b-spec) { order: 2; }
#view-plm-form.plm-quick-bom label.field:has(> #plm-b-name) { order: 3; }
#view-plm-form.plm-quick-bom label.field:has(> #plm-b-ver) { order: 4; }
#view-plm-form.plm-quick-bom label.field:has(> #plm-b-status) { order: 5; }
#plm-form-bom #plm-b-created-wrap { display: none !important; } /* 仅快速弹窗显示（见下），完整表单隐藏 */
#view-plm-form.plm-quick-bom #plm-b-created-wrap { display: block !important; order: 6; }
/* 输入框扁平化：白底透出（外层已铺白）、无框，贴近样图纯文本 */
#view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > input,
#view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > select {
  background: transparent !important;
  border: 0 !important;
  border-bottom: 1px solid transparent !important;
  border-radius: 0 !important;
  padding: 4px 0 !important;
  min-height: 26px !important;
  color: #1f2937 !important;
  text-align: left !important;
  box-shadow: none !important;
}
#view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > input:focus,
#view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > select:focus {
  outline: none !important;
  box-shadow: none !important;
  background: transparent !important;
  border-bottom-color: #14b8a6 !important;
}
#view-plm-form.plm-quick-bom .plm-form-top-row > .form-section-basic { display: block !important; background: transparent !important; border: none !important; padding: 6px 2px 2px !important; }
/* 绿色标题栏（样图：浅绿底 + 绿色圆角标 + 「BOM 明细」，标题文字由 openBomCreate 设置） */
#view-plm-form.plm-quick-bom .modal-head { background: #e9f6ee; border-bottom: 1px solid #d7eade; }
#view-plm-form.plm-quick-bom .modal-title { color: #1e8e4e; display: flex; align-items: center; gap: 8px; }
#view-plm-form.plm-quick-bom .modal-title::before {
  content: ""; width: 14px; height: 14px; border-radius: 4px; background: #2e9e63; flex: 0 0 auto;
}
/* 表格上方小标题由 renderBomLines 在快速模式输出「物料明细」；隐藏多级提示，贴近样图 */
#view-plm-form.plm-quick-bom .bom-detail-tip { display: none; }
/* 明细「供应商」列已删除（2026-09-30），原 .bom-sup-val 样式随之作废 */
/* 二轮补齐样图细节（2026-09-29，仅快速弹窗）：深绿表头白字 / 整卡浅绿底 / 物料明细绿字 / 标签浅绿色带 / 对齐 */
#view-plm-form.plm-quick-bom .modal-card { background: #eef7f2; }
#view-plm-form.plm-quick-bom .bom-detail-table { background: #fff; }
#view-plm-form.plm-quick-bom .bom-detail-table th {
  background: #359069 !important;
  color: #fff !important;
  border-color: rgba(255, 255, 255, 0.18) !important;
}
#view-plm-form.plm-quick-bom .bom-detail-title { color: #1e8e4e !important; }
/* 信息条：标签行浅绿色带（覆盖此前的透明底，同优先级靠后生效） */
#view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > span {
  background: #e2f0e7 !important;
  padding: 3px 8px !important;
  border-radius: 3px;
}
/* 对齐贴样图：数值列居中（供应商列已删除） */
#view-plm-form.plm-quick-bom .bom-detail-table td[data-col="用量"] input,
#view-plm-form.plm-quick-bom .bom-detail-table td[data-col="单位"] input,
#view-plm-form.plm-quick-bom .bom-detail-table td[data-col="层级"] input,
#view-plm-form.plm-quick-bom .bom-detail-table td[data-col="损耗率"] input { text-align: center; }

/* ── BOM 内嵌卡窄栏响应式（2026-10-01 bombadge24）──
   内嵌态 #view-plm-form 位于 #plm-split-right 内（弹窗态是 body 直下 fixed 遮罩，不含此作用域）。
   右栏仅 250~420px 宽，沿用弹窗 6 列摘要会压成 ~15px/列（标签竖排截断、派生按钮叠字），
   实测 2026-10-01 用户报「式样没生效」即此。内嵌态改 2 列网格：
   BOM编号+产品型号 / 产品名称+颜色 / 状态+创建时间；弹窗 6 列不受影响（作用域限定右栏内）。 */
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 {
  grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
  gap: 6px 14px !important;
}
/* 内嵌摘要同样只留弹窗同款 6 字段：派工单号（只读回显）隐藏；颜色补 order 4（弹窗路径
   物理搬移节点无此问题，内嵌路径字段留在原网格必须有完整次序，否则颜色排到最前） */
#plm-split-right #view-plm-form.plm-quick-bom #plm-b-dispatch-wrap { display: none !important; }
#plm-split-right #view-plm-form.plm-quick-bom label.field:has(> #plm-b-color) { order: 4; }
/* 派生按钮（9470 绝对定位 right/bottom）在 ~85px 窄单元里与输入框文字叠字，
   且 9467 的 padding-right:66px 会把输入区挤没——内嵌态改随流：按钮换行居右 */
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field:has(#btn-plm-derive-bom:not([hidden])) > input {
  padding-right: 4px !important;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom .field #btn-plm-derive-bom {
  position: static !important;
  display: block !important;
  width: fit-content;
  margin: 4px 0 0 auto !important;
  padding: 3px 10px !important;
}

/* ── BOM 视图：A4 竖版纸卡（2026-10-01 qbinline3，用户定「A4 尺寸竖向显示卡片」）──
   仅 BOM 列表视图生效（:has(#plm-bom-right) 只在 BOM 页命中）。
   2026-10-01 bomcard 用户要求「左侧区域宽度需要自动调整（行内容需要完整显示）」：
   删除 qbinline3 的左栏 340px 锁宽，回退通用自适应规则（fit-content，300~640px，
   见 .is-plm-split-page:not(.is-plm-doc-page) .plm-split-left 段），树行名称不再截断。 */
/* A4 竖版纸卡：表单壳随内容自适应，卡片按 A4 比例（210:297）起底、内容多自动向下加长；
   纸张阴影 + 圆角 + 四周留出桌面灰底，居中纸感。配色仍为定版薄荷绿。 */
#pane-plm .plm-split-right #view-plm-form.plm-quick-bom {
  height: auto;
  flex: 0 0 auto;
}
#pane-plm .plm-split-right #view-plm-form.plm-quick-bom .modal-card {
  flex: 0 0 auto;
  width: calc(100% - 12px); /* 必须定宽：aspect-ratio 遇 auto 宽会把明细表内容高（~1480px）反向转移成 1047px 宽；定宽后高度由比例起底、内容多自动向下加长 */
  min-width: 0; /* 明细表固定列总宽 ~1000px：禁止反撑卡片，表格在 modal-body 内横向滚动 */
  margin: 2px 6px 14px;
  border-radius: 10px;
  border: 1px solid #dbe7de;
  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.14), 0 2px 6px rgba(15, 23, 42, 0.08);
  aspect-ratio: 210 / 297;
}
/* 字号（A4 单据阅读尺寸）：标题 15 / 摘要标签 11 / 摘要值 13 / 明细表 12 */
#plm-split-right #view-plm-form.plm-quick-bom .bom-detail-title { font-size: 15px !important; }
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > span { font-size: 11px !important; }
/* 本作用域（2 id）优先级高于 16410 基础隐藏规则，必须同台重申 qb-label 原文隐藏，
   否则出现「产品型号规格型号」重影 */
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > span.qb-label { font-size: 0 !important; }
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > span.qb-label::before { font-size: 11px !important; }
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > input,
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field > select { font-size: 13px !important; }
#plm-split-right #view-plm-form.plm-quick-bom .bom-detail-table th,
#plm-split-right #view-plm-form.plm-quick-bom .bom-detail-table td { font-size: 12px !important; }
#plm-split-right #view-plm-form.plm-quick-bom .bom-detail-table td input { font-size: 12px !important; }

/* ── qbinline6：摘要表格化（2026-10-01，用户问「为什么不是同在表格内的」）──
   6 字段加井字格线，与下方明细表连成一张 A4 单据；纯 CSS 视觉，编辑/自动保存零改动。
   格线手法：gap:1px + 容器底色透出（对 order/DOM 序零依赖，隐藏字段不占格不受影响） */
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 {
  gap: 1px !important;
  padding: 0 !important;
  background: #cfe0d4 !important; /* 格线色；16387 基础块 transparent !important 压底色，必须同台 !important */
  border: 1px solid #cfe0d4 !important;
  border-radius: 6px;
  overflow: hidden;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field {
  background: #fff !important; /* 16395 基础块 transparent !important，同台压制 */
  padding: 6px 10px 7px !important;
}

/* ── qbinline8：摘要一行化（2026-10-01，用户「移到列表上方显示（同行显示）」）──
   宽屏摘要 6 字段一行排开（压缩纵向，明细表更靠上）；auto-fit 窄屏自动降列不压扁：
   ~1000px 卡=6列 / ~470px=3列 / ~314px=2列，qbinline2 窄栏成果自动保留 */
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 {
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)) !important;
}
/* BOM编号格改 flex：标签行 + 输入框与「派生」按钮同行（按钮不再独占一行撑高首行；
   align-items:flex-end 底对齐，qbinline1 的按钮 margin-left:auto 右对齐继续生效） */
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field:has(#btn-plm-derive-bom:not([hidden])) {
  display: flex !important;
  flex-wrap: wrap !important;
  align-items: flex-end;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field:has(#btn-plm-derive-bom:not([hidden])) > span {
  flex: 0 0 100%;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field:has(#btn-plm-derive-bom:not([hidden])) > input {
  flex: 1 1 auto;
  min-width: 0;
}

/* ── qbinline9：摘要移入「BOM 明细」标题行同行（2026-10-01，用户红框指定「移到红框位置显示；
   删除按钮：加行 列设置」）──
   #plm-form-bom 改 flex：标题行(order1) + 摘要格线表(order2, 弹性占余宽) 同行底对齐，
   明细表(order3) 下一行全宽。#plm-bom-detail-section 用 display:contents 把
   toolbar / table-wrap 提升为 flex item；加行/列设置按钮按用户要求隐藏（DOM 保留可回退）。 */
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom {
  display: flex !important;
  flex-direction: row !important; /* 基础块给的 column：column+wrap 会高度塌陷（实测 fbH=2px），必须显式 row */
  flex-wrap: wrap !important;
  align-items: flex-end;
  gap: 0 8px;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section {
  display: contents !important;
}
#plm-split-right #view-plm-form.plm-quick-bom .bom-detail-toolbar {
  order: 1;
  flex: 0 0 auto;
}
#plm-split-right #view-plm-form.plm-quick-bom .bom-detail-spacer {
  display: none !important; /* spacer 固有宽 203px 把 toolbar 撑到 284px；按钮已删无意义 */
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 {
  order: 2;
  flex: 1 1 0;
  min-width: 0;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section .table-wrap {
  order: 3;
  flex: 0 0 100%;
}
#plm-split-right #view-plm-form.plm-quick-bom #btn-plm-bom-add-line,
#plm-split-right #view-plm-form.plm-quick-bom #btn-plm-bom-line-cols {
  display: none !important;
}

/* ── qbinline12：BOM编号卡移入「BOM 明细」标题行左端（2026-10-01，用户「bom编号 移到行号列上方显示」；
   qbinline11 首版放在摘要行首被指「没有生效」——目标位置是标题行=紧贴表格顶部的行号列正上方）──
   DOM 事实：#plm-bom-detail-section 是 #plm-form-bom 的兄弟节点（qbinline9 的 display:contents
   从未把 toolbar 提升为表单 flex 项），故 plm.js bomModelToFront() 把 BOM编号 label 搬进
   section 内、#plm-bom-lines 之前；此处把 section 改 flex（label order:0 + toolbar order:1
   同行底对齐），#plm-bom-lines 用 display:contents 把 toolbar/table-wrap 提升为 section 的
   flex 项（table-wrap flex:0 0 100% 独占下一行）。label 在 lines 外 → renderBomLines
   host.innerHTML 重渲不销毁。卡片样式复刻 qbinline6 观感（基础 16397/16463 作用域限
   .form-grid-2 内字段，独立卡同台重写）；派生按钮沿用 qbinline2 随流右对齐。 */
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section {
  display: flex !important; /* 同优先级后行覆盖 qbinline9 16587 的 display:contents */
  flex-wrap: wrap !important;
  align-items: flex-end;
  gap: 0 8px;
}
/* display:flex/contents 会盖掉原生 [hidden]（16587 同病）：显式补隐藏，
   否则物料/产品页 bomSec.hidden=true 时残留上一张 BOM 的标题行/表格 */
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section[hidden] { display: none !important; }
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-lines { display: contents !important; }
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section > label.field:has(> #plm-b-model) {
  order: 0;
  flex: 0 0 auto;
  display: flex !important;
  flex-wrap: wrap !important;
  align-items: flex-end;
  background: #fff !important;
  border: 1px solid #cfe0d4;
  border-radius: 6px;
  padding: 6px 10px 7px !important;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section > label.field:has(> #plm-b-model) > span {
  flex: 0 0 100%;
  display: block !important;
  background: #e2f0e7 !important;
  padding: 3px 8px !important;
  border-radius: 3px;
  margin-bottom: 2px !important;
  font-size: 11px !important;
  color: var(--muted) !important;
  text-align: left !important;
  overflow: visible !important;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section > label.field:has(> #plm-b-model) > span.qb-label { font-size: 0 !important; }
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section > label.field:has(> #plm-b-model) > span.qb-label::before {
  content: attr(data-label);
  font-size: 11px !important;
  color: var(--muted) !important;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section > label.field:has(> #plm-b-model) > input {
  flex: 1 1 auto;
  min-width: 0;
  background: transparent !important;
  border: 0 !important;
  border-bottom: 1px solid transparent !important;
  border-radius: 0 !important;
  padding: 4px 0 !important;
  min-height: 26px !important;
  font-size: 13px !important;
  color: #1f2937 !important;
  text-align: left !important;
  box-shadow: none !important;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section > label.field:has(> #plm-b-model) > input:focus {
  outline: none !important;
  box-shadow: none !important;
  background: transparent !important;
  border-bottom-color: #14b8a6 !important;
}
#plm-split-right #view-plm-form.plm-quick-bom #plm-bom-detail-section > label.field:has(> #plm-b-model) #btn-plm-derive-bom {
  position: static !important;
  display: block !important;
  width: fit-content;
  margin: 4px 0 0 auto !important;
  padding: 3px 10px !important;
}

/* ── 订单右键「创建 BOM」独立弹窗（2026-09-29 全新重建）：完全对标国桉康「BOM 明细」卡片 ──
   字段与明细节点由 plm.js 运行时搬入 #view-quick-bom，旧弹窗整体隐藏；
   明细表格基础/交互样式已双作用域化（上方 #view-quick-bom .bom-detail… 各规则），
   本块只负责新卡片自身版式与配色，与旧表单的橙色「表格化」样式彻底隔离 */
#view-quick-bom { z-index: 2600; }
/* qbfix1（2026-10-10「弹窗关闭不了的」）防御规则：双写 ID 提特异性，确保任何
   display:flex/…!important 意外命中弹窗根节点时，hidden 态仍强制 display:none
   （bom_card_v2.css :is() 裸规则曾以 2id1cls 压过 .modal[hidden] 致弹窗关不掉） */
#view-quick-bom#view-quick-bom.modal[hidden] { display: none !important; }
#view-quick-bom .qb-card {
  /* qbmlg1（2026-10-09 用户「把弹窗调整尺寸到红框那么大」）：1240px/内容自适应高
     → 放大到 min(1680px, 88vw) × 85vh（1920×970 屏 ≈ 1680×824，即截图红框大小，
     两侧各留 ~120px、底部留 ~30px）。明细区 .qb-lines 本就 flex:1 占满剩余高度、
     内部滚动，卡片放大后列表自动跟着变大；行少的 BOM 卡底留白归卡片内部 */
  width: min(1680px, 88vw);
  height: 85vh;
  max-height: 92vh;
  background: #fff;
  border: 1px solid #d7eade;
  box-shadow: 0 16px 40px rgba(0, 0, 0, 0.18);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
/* 标题栏：白底深字（用户 2026-09-30 要求整个弹窗白色） */
#view-quick-bom .qb-head {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 9px 12px;
  background: #fff;
  color: #1f2937;
  border-bottom: 1px solid #e5e7eb;
}
#view-quick-bom .qb-ico {
  width: 14px; height: 14px; border-radius: 4px;
  background: #374151;
  flex: 0 0 auto;
}
#view-quick-bom .qb-title {
  font-weight: 700;
  font-size: 14px;
  letter-spacing: 1px;
  /* qbedit1b：改由标题吃剩余空间来把右侧按钮组顶到最右 —— 这样「✏ 编辑」「🖨 打印/PDF」
     谁在前都在同一组里；若还用打印按钮的 margin-left:auto，编辑按钮会留在标题旁。 */
  margin-right: auto;
}
#view-quick-bom .qb-close {
  margin-left: auto;
  border: 0;
  background: transparent;
  color: #374151;
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
  padding: 2px 6px;
  border-radius: 3px;
}
#view-quick-bom .qb-close:hover { background: #f3f4f6; }
/* 打印/PDF 按钮（2026-10-04 printbom1 用户：弹窗打印 BOM，A4 竖向）——
   静态节点随弹窗壳，分屏/产品页内嵌明细不受影响 */
#view-quick-bom .qb-print {
  margin-left: 0;
  border: 1px solid #d1d5db;
  background: #fff;
  color: #374151;
  font-size: 12px;
  line-height: 1;
  padding: 5px 10px;
  border-radius: 6px;
  cursor: pointer;
}
#view-quick-bom .qb-print:hover { background: #f3f4f6; border-color: #9ca3af; }
#view-quick-bom .qb-print + .qb-close { margin-left: 0; }
/* qbedit1（2026-11-01 虫哥「右上角 需要触发编辑功能按钮」）：与「打印/PDF」同形状的主操作按钮
   —— 不设 margin-left:auto（auto 留给打印按钮，两颗按钮作为一组一起靠右） */
#view-quick-bom .qb-edit {
  border: 1px solid #99f6e4;
  background: #f0fdfa;
  color: #0f766e;
  font-size: 12px;
  line-height: 1;
  padding: 5px 10px;
  border-radius: 6px;
  cursor: pointer;
}
#view-quick-bom .qb-edit:hover { background: #ccfbf1; border-color: #5eead4; }
#view-quick-bom .qb-edit[hidden] { display: none !important; }
/* qbedit2：内嵌 BOM 卡（BOM列表点行 → 右栏）标题行里的「✏ 编辑」——
   与「✕」同排；用 margin-left:auto 把它和 ✕ 一起顶到右侧（隐藏时不占位，标题与 ✕ 恢复两端对齐） */
#view-plm-form .modal-head #btn-plm-card-edit {
  margin-left: auto;
  border: 1px solid #99f6e4;
  background: #f0fdfa;
  color: #0f766e;
  font-size: 12px;
  line-height: 1;
  padding: 5px 10px;
  cursor: pointer;
}
#view-plm-form .modal-head #btn-plm-card-edit:hover { background: #ccfbf1; border-color: #5eead4; }
#view-plm-form .modal-head #btn-plm-card-edit[hidden] { display: none !important; }
/* 保存错误提示（旧表单已整体隐藏，错误镜像显示在此） */
#view-quick-bom .qb-error {
  flex: 0 0 auto;
  margin: 0;
  padding: 6px 14px;
  background: #fef2f2;
  color: #dc2626;
  font-size: 12px;
  border-bottom: 1px solid #fecaca;
}
/* 摘要信息条：白底六槽（标签色带在上、值在下），槽内即搬入的 label.field 节点。
   8 列（2026-10-04 用户）：派工单号全局隐藏后剩 6 字段 = 1+2+2+1+1+1 正好 8 格 */
#view-quick-bom .qb-strip {
  flex: 0 0 auto;
  display: grid !important;
  /* qbunify1（2026-10-09）：与分屏内嵌卡（bom_card_v2.css Section 4）统一为同一套 8 列模板
     —— 列序 编号/名称/型号/颜色/版本/状态/时间（末列 0.55fr 为空，对应内嵌卡隐藏的创建人槽）。
     原 10 列（含创建人、名称/型号各 span2）废弃：plm.js moveNodesIntoQuickBom 已按列序搬移，
     且不再搬创建人（与内嵌卡隐藏创建人一致），名称/型号各占 1 列（2.4fr / 1.7fr）。 */
  grid-template-columns:
    minmax(0, 1fr) minmax(0, 2.4fr) minmax(0, 1.7fr)
    minmax(0, 0.9fr) minmax(0, 0.45fr) minmax(0, 0.55fr) minmax(0, 0.75fr) minmax(0, 0.55fr) !important;
  gap: 6px 26px !important;
  padding: 14px 16px 12px !important;
  background: #fff !important;
  border: none !important;
  border-radius: 0 !important;
}
/* 派工单号所有形态均不显示（2026-10-04 用户）：弹窗摘要条 / PLM 完整表单 / 内嵌摘要
   都隐藏；输入框保留在 DOM，值照常读写（保存回写订单行匹配键不受影响） */
#plm-b-dispatch-wrap {
  display: none !important;
}
/* BOM 表头联想「＋ 新建物料」行（2026-09-30）：两个联想面板通用，绿色弱化点缀 */
#mf-bom-mat-panel .bom-mat-create-item,
#mf-bom-prod-panel .bom-mat-create-item {
  border-top: 1px solid #e5e7eb;
  color: #166534;
  background: #f4faf7;
}
#mf-bom-mat-panel .bom-mat-create-item:hover,
#mf-bom-prod-panel .bom-mat-create-item:hover {
  background: #e6f4ec;
}
/* 搬入的 label.field：去旧表单橙色网格底，改上下结构（标签在上、值在下） */
#view-quick-bom .qb-strip .field {
  display: block !important;
  background: transparent !important;
  border: none !important;
  margin: 0 !important;
  padding: 0 !important;
  min-width: 0;
}
#view-quick-bom .qb-strip .field > span {
  display: block !important;
  background: transparent !important;
  color: #8b93a1 !important; /* qbunify1：与内嵌卡标签色一致 */
  font-size: 12px !important;
  line-height: 1.4 !important;
  padding: 0 !important;
  margin: 0 0 4px !important;
  min-height: 0 !important;
  text-align: left !important;
  overflow: visible !important;
}
/* 换名标签（物料代码→BOM编号 等）：隐藏原文显示 data-label */
#view-quick-bom .qb-strip .field > span.qb-label { font-size: 0 !important; }
#view-quick-bom .qb-strip .field > span.qb-label::before {
  content: attr(data-label);
  font-size: 12px !important;
  color: #8b93a1 !important; /* qbunify1：与内嵌卡借字标签色一致 */
}
#view-quick-bom .qb-strip .field > input,
#view-quick-bom .qb-strip .field > select {
  width: 100%;
  box-sizing: border-box;
  background: transparent !important;
  border: none !important; /* qbunify1：与内嵌卡值框一致（无框纯文本） */
  border-radius: 0 !important;
  padding: 2px 0 !important; /* qbunify1：对齐内嵌卡 2px 0 */
  min-height: 22px !important; /* qbunify1：对齐内嵌卡 22px */
  color: #1f2937 !important;
  font-size: 13px !important;
  text-align: left !important;
  box-shadow: none !important;
}
#view-quick-bom .qb-strip .field > input:focus,
#view-quick-bom .qb-strip .field > select:focus {
  outline: none !important;
  box-shadow: none !important;
  background: #f2f5f8 !important; /* qbunify1：与内嵌卡聚焦态一致 */
}
/* 明细区：占满剩余高度、内部滚动 */
#view-quick-bom .qb-lines {
  flex: 1 1 auto;
  min-height: 0;
  background: #fff;
  /* qbunify1：弹窗只搬 #plm-bom-lines（无 #plm-bom-detail-section 祖先），
     :is() 的 .table-wrap 内距规则不命中 → 由本容器补齐与内嵌卡相同的 2px 16px 14px */
  padding: 2px 16px 14px;
  overflow: auto;
}
/* 工具栏按钮/表头：白底灰字（用户 2026-09-30 要求整个弹窗白色） */
#view-quick-bom .bom-detail-toolbar .tb-btn {
  border: 1px solid #d1d5db;
  background: #fff;
  color: #374151;
}
#view-quick-bom .bom-detail-toolbar .tb-btn:hover { background: #f3f4f6; }
#view-quick-bom .bom-detail-table th {
  background: #fff !important;
  color: #374151 !important;
  border-color: #e5e7eb !important;
}
#view-quick-bom .bom-detail-title { color: #1f2937 !important; }
/* 行号列「删」按钮（2026-09-30：右侧删除列取消，删按钮移入行号列，悬停行时显示、行号隐藏） */
:is(#view-plm-form, #view-quick-bom) .bom-detail-table .bom-row-del {
  display: none;
  border: 0;
  background: transparent;
  color: #dc2626;
  font-size: 12px;
  line-height: 1;
  padding: 0 2px;
  cursor: pointer;
}
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tr.ib-detail-row:hover .bom-row-del { display: inline; }
:is(#view-plm-form, #view-quick-bom) .bom-detail-table tr.ib-detail-row:hover .bom-row-no { display: none; }
/* 对齐贴样图：数值列居中（供应商列已删除） */
#view-quick-bom .bom-detail-table td[data-col="用量"] input,
#view-quick-bom .bom-detail-table td[data-col="单位"] input,
#view-quick-bom .bom-detail-table td[data-col="层级"] input,
#view-quick-bom .bom-detail-table td[data-col="损耗率"] input { text-align: center; }

/* 全局隐藏数字输入框的上下步进箭头（用户 2026-09-30：用量/层级/损耗率等，凡类似存在均删） */
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
input[type="number"] {
  -moz-appearance: textfield;
  appearance: textfield;
}

.win-col-resizer {
width: 5px;
  height: 100%;
  flex-shrink: 0;
  cursor: col-resize;
  position: relative;
  margin: 0 -2px;
  z-index: 10;
}

.win-col-resizer::before {
content: '';
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 1px;
  height: 100%;
  background: transparent;
  transition: background 0.15s ease, width 0.15s ease;
}

.win-col-resizer:hover::before,
.win-col-resizer.dragging::before {
width: 2px;
  background: #0078d4;
}

.win-col-resizer.dragging {
background: rgba(0, 120, 212, 0.05);
}

.win-col-resizer.dragging * {
user-select: none !important;
}

.win-list-body {

}

.win-row {
display: flex; align-items: center;
  height: 32px;
  font-size: 12px; color: #1a1a1a;
  border-bottom: 1px solid #f5f5f5;
  cursor: default;
}

.win-row:hover {
background: #f5f5f5;
}

.win-row.selected {
background: #cce8ff;
}

.win-row.selected:hover {
background: #b3d7ff;
}

.win-row .win-col-name {
overflow: hidden; cursor: default;
}

.win-name-text {
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.win-file-icon {
display: inline-flex; width: 20px; height: 20px; align-items: center; justify-content: center; flex-shrink: 0;
}

.win-file-icon svg {
width: 20px; height: 20px;
}

.win-col-mtime {
color: #616161;
}

.win-col-type {
color: #616161;
}

.win-col-size {
color: #616161; text-align: right;
}

.win-cbx {
display: inline-flex; width: 16px; height: 16px;
  border: 1.5px solid #8a8a8a; border-radius: 0;
  background: #fff; cursor: pointer;
  align-items: center; justify-content: center;
  color: transparent;
  transition: all 0.1s;
}

.win-cbx svg {
width: 12px; height: 12px;
}

.win-cbx:hover {
border-color: var(--primary);
}

.win-cbx.on {
background: var(--primary); border-color: var(--primary); color: #fff;
}

.win-grid {
display: grid;
  grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
  gap: 4px;
}

.win-card {
position: relative;
  padding: 10px 6px 6px;
  border: 1px solid transparent; border-radius: 0;
  background: transparent;
  display: flex; flex-direction: column; align-items: center;
  cursor: default;
  transition: background 0.08s;
}

.win-card:hover {
background: #f5f5f5;
}

.win-card.selected {
background: #cce8ff;
}

.win-card.selected:hover {
background: #b3d7ff;
}

.win-card-check {
position: absolute; top: 4px; left: 4px;
}

.win-card-icon {
display: inline-flex; width: 52px; height: 52px; align-items: center; justify-content: center; margin-bottom: 4px;
}

.win-card-icon svg {
width: 52px; height: 52px;
}

.win-card-name {
font-size: 12px; color: #1a1a1a; text-align: center;
  max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  cursor: default;
}

.iso-docs-empty {
padding: 80px 20px; text-align: center; color: #8a8a8a; font-size: 13px;
  display: flex; flex-direction: column; align-items: center; gap: 10px;
}

.iso-docs-empty-icon {
opacity: 0.3;
}

.iso-docs-empty-icon svg {
width: 72px; height: 72px;
}

.iso-docs-empty-text {
font-size: 14px; color: #616161;
}

.iso-docs-empty-hint {
font-size: 12px; color: #8a8a8a;
}

.iso-docs-drop-hint {
position: absolute; left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  z-index: 20; pointer-events: none;
}

.iso-docs-drop-hint-card {
display: inline-flex; align-items: center; gap: 10px;
  padding: 14px 22px;
  background: rgba(0, 103, 192, 0.95);
  color: #fff; border-radius: 0;
  font-size: 14px;
  box-shadow: 0 6px 20px rgba(0,103,192,0.3);
}

.iso-docs-drop-hint-icon {
display: inline-flex; width: 20px; height: 20px; align-items: center; justify-content: center;
}

.iso-docs-drop-hint-icon svg {
width: 20px; height: 20px;
}

.iso-docs-upload-panel {
position: absolute; bottom: 0; left: 0; right: 0;
  height: 28px; background: #fff;
  border-top: 1px solid #e5e5e5;
  display: flex; align-items: center; gap: 10px; padding: 0 12px;
  z-index: 15; box-shadow: 0 -2px 6px rgba(0,0,0,0.04);
}

.iso-docs-upload-panel[hidden] {
display: none !important;
}

.iso-docs-upload-bar-wrap {
flex: 1; height: 4px; background: #e5e5e5; border-radius: 0; overflow: hidden;
}

.iso-docs-upload-bar {
height: 100%; width: 0; background: var(--primary); transition: width 0.2s ease;
}

.iso-docs-upload-text {
font-size: 12px; color: #616161; flex-shrink: 0; min-width: 140px;
}

.iso-docs-upload-cancel {
background: none; border: 1px solid #e5e5e5; cursor: pointer; font-size: 12px; padding: 2px 8px; border-radius: 0; color: #c42b1c;
}

.iso-docs-upload-cancel:hover {
background: #fef2f2; border-color: #fecaca;
}

.win-ctx-menu {
position: fixed;
  min-width: 180px;
  background: #fff;
  border: 1px solid #e5e5e5;
  border-radius: 0;
  box-shadow: 0 4px 16px rgba(0,0,0,0.15);
  padding: 4px;
  z-index: 200;
}

.win-ctx-item {
display: flex; align-items: center; gap: 8px; width: 100%;
  padding: 6px 10px; border: none; background: transparent;
  font-size: 12px; color: #1a1a1a; cursor: pointer; border-radius: 0;
  text-align: left;
}

.win-ctx-item svg {
width: 16px; height: 16px; flex-shrink: 0;
}

.win-ctx-item:hover {
background: #f5f5f5;
}

.win-ctx-item.danger {
color: #c42b1c;
}

.win-ctx-item.danger:hover {
background: #fef2f2;
}

.win-ctx-sep {
height: 1px; background: #f0f0f0; margin: 4px 0;
}

.win-statusbar {
display: flex; align-items: center;
  padding: 0 12px; height: 28px;
  background: #f9f9fa;
  border-top: 1px solid #e5e5e5;
  font-size: 12px; color: #616161;
  flex-shrink: 0; gap: 8px;
}

.win-status-sep {
flex: 1;
}

.win-status-msg {
color: #616161;
}

.win-status-msg.error {
color: #c42b1c;
}

.win-status-msg.warn {
color: #b45309;
}

.win-status-right {
color: #8a8a8a;
}

.iso-docs-drawer {
position: absolute; top: 0; right: 0; bottom: 0;
  width: 60%; max-width: 800px;
  background: #fff;
  border-left: 1px solid #e5e5e5;
  box-shadow: -4px 0 16px rgba(0,0,0,0.1);
  transform: translateX(100%);
  transition: transform 0.2s ease;
  display: flex; flex-direction: column;
  z-index: 50;
}

.iso-docs-drawer.open {
transform: translateX(0);
}

.iso-docs-drawer-head {
display: flex; align-items: center; justify-content: space-between;
  padding: 6px 10px;
  border-bottom: 1px solid #eee;
  background: #f9f9fa;
  flex-shrink: 0; gap: 8px;
}

.iso-docs-drawer-title {
font-size: 13px; color: #1a1a1a; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; min-width: 0;
}

.iso-docs-drawer-actions {
display: flex; gap: 4px; flex-shrink: 0;
}

.iso-docs-drawer-body {
flex: 1; overflow: auto; padding: 14px;
}

.iso-docs-drawer-loading {
padding: 20px; text-align: center; color: #8a8a8a; font-size: 13px;
}

.iso-docs-preview-img-wrap {
text-align: center;
}

.iso-docs-preview-img {
max-width: 100%; border: 1px solid #e5e5e5; border-radius: 0;
}

.iso-docs-preview-text {
font-size: 12px; white-space: pre-wrap; word-break: break-all; background: #fafafa; padding: 10px; border-radius: 0; border: 1px solid #eee; font-family: "Noto Sans SC", monospace; line-height: 1.5;
}

.iso-docs-preview-pdf {
width: 100%; height: 100%; min-height: 420px; border: none;
}

.iso-docs-preview-note {
padding: 20px; text-align: center; color: #616161; font-size: 13px;
}

.iso-docs-preview-actions {
text-align: center; margin-top: 12px;
}

.iso-docs-multi-bar {
position: absolute; bottom: 28px; left: 0; right: 0;
  height: 40px;
  background: var(--primary); color: #fff;
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 16px; z-index: 40;
  box-shadow: 0 -2px 8px rgba(0,0,0,0.15);
}

.iso-docs-multi-info {
font-size: 13px;
}

.iso-docs-multi-info b {
font-size: 14px; margin: 0 2px;
}

.iso-docs-multi-acts {
display: flex; gap: 6px;
}

.iso-docs-multi-acts .win-cmd {
color: #fff; background: rgba(255,255,255,0.15); border-radius: 0;
}

.iso-docs-multi-acts .win-cmd:hover {
background: rgba(255,255,255,0.25);
}

.iso-docs-multi-acts .win-cmd.danger-text {
color: #ffd0cc;
}

.cert-search-wrap .win-search {
width: 240px; height: 30px;
}

.hr-content-head .win-search {
padding: 0 10px;
}

.hr-content-head .win-search,
.hr-content-head .win-cmd {
height: 30px; border-radius: 0;
}

.hr-content-head .win-search {
padding: 0 10px;
}


/* ---- 「设计文档」本地适配：display:flex 会盖掉原生 [hidden]，统一兜底 ---- */
#pane-design-doc [hidden] { display: none !important; }
/* 预览抽屉 / 上传面板 / 批量条都是 absolute，必须有定位祖先 */
#pane-design-doc { position: relative; }
/* 头部工具栏里的排序下拉需要定位父级（源自 .win-cmd-sort）*/
#pane-design-doc .win-cmd-sort { position: relative; display: inline-flex; }
/* 搜索框在迈方头部工具栏里略窄一点，避免撑破一行 */
#pane-design-doc .win-search { width: 180px; }
/* 迈方页面底栏统计（外壳底栏镜像用）*/

/* ── PLM 物料页视图切换：BOM列表 入口按钮（2026-10-01 用户定版）──
   式样对齐顶部模块页签 .crm-mod-tab；2026-10-06 pill1：模块页签 10-05 改药丸式后
   本按钮没跟着改（原 border-radius:0 写死直角、激活绿 #047857 也与页签 #0f766e 不一致），
   现全量对齐 .crm-mod-tab 药丸式：白底描边圆角、激活深青绿底白字 */
.plm-view-tab {
  border: 1px solid #e2e8f0;
  background: #fff;
  color: #475569;
  border-radius: 999px;
  padding: 4px 14px;
  font-size: 12.5px;
  line-height: 1.3;
  cursor: pointer;
  white-space: nowrap;
  transition: all 0.12s ease;
}
.plm-view-tab:hover { border-color: #0f766e; color: #0f766e; background: #fff; }
.plm-view-tab.is-on { background: #0f766e; border-color: #0f766e; color: #fff; font-weight: 600; }
/* BOM列表视图（2026-09-30 用户红框「删除红框内容」）：右侧资料卡面板整体删除，
   列表拉通全宽——plm_material.js 在 bomlist 视图给 #plm-split 挂 is-bomlist 类 */
#pane-plm .plm-split.is-bomlist .plm-split-right { display: none !important; }
#pane-plm .plm-split.is-bomlist .plm-split-left {
  flex: 1 1 auto !important;
  width: auto !important;
  max-width: none !important;
  min-width: 0 !important;
}
.plm-bomlist { padding: 0 0 8px; }
.plm-bomlist-wrap { overflow: auto; max-height: calc(100% - 30px); }
.plm-bomlist-table { width: 100%; border-collapse: collapse; font-size: 12px; color: #334155; }
/* 网格线（2026-09-30 用户：网格线）：四边全框线；表头可点击筛选 */
.plm-bomlist-table th, .plm-bomlist-table td { border: 1px solid #e2e8f0; padding: 6px 10px; text-align: left; white-space: nowrap; }
.plm-bomlist-table th { position: sticky; top: 0; background: #f8fafc; color: #64748b; font-weight: 600; z-index: 1; }
.plm-bomlist-table th[data-col] { cursor: pointer; user-select: none; }
.plm-bomlist-table th[data-col]:hover, .plm-bomlist-table th.is-filtered { color: #16a34a; }
.plm-bomlist-table tbody tr { cursor: default; }
.plm-bomlist-table tbody tr:hover { background: #f0fdf4; }
/* 表头筛选下拉（勾选值即应用） */
.plm-bomlist-filter {
  position: fixed; z-index: 1200; min-width: 150px; max-width: 280px;
  max-height: 300px; overflow: auto; background: #fff;
  border: 1px solid #d7dee8; border-radius: 8px; padding: 6px 8px;
  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14); font-size: 12px; color: #334155;
}
.plm-bomlist-filter .plm-bf-bar { display: flex; gap: 10px; padding: 0 2px 6px; margin-bottom: 4px; border-bottom: 1px solid #eef1f5; }
.plm-bomlist-filter .plm-bf-bar button { border: none; background: none; color: #16a34a; font-size: 12px; cursor: pointer; padding: 0; }
.plm-bomlist-filter .plm-bf-bar button:hover { text-decoration: underline; }
.plm-bomlist-filter label { display: flex; align-items: center; gap: 6px; padding: 3px 2px; cursor: pointer; white-space: nowrap; }
/* 行号列锁宽 50px（2026-09-30 用户：行号列=50px） */
.plm-bomlist-table .pt-rowno { width: 50px; min-width: 50px; max-width: 50px; }
.plm-bomlist-filter label:hover { background: #f0fdf4; }
.plm-bomlist-foot { padding: 6px 12px; color: #94a3b8; font-size: 11px; }

/* ═══ 2026-09-30（用户：「物料资料卡 字号小一点」）═══
   资料卡标题 30px → 22px；字段标签/值/节标题压回 12px（全局字体锁只锁 #app 内，
   资料卡分栏头/搬移容器在锁外导致偏大，这里显式压小，不带面板前缀保证各场景命中）。 */
#plm-form-card-title {
  font-size: 22px !important;
  line-height: 30px !important;
}
#view-plm-form #plm-form-material .field > span,
#view-plm-form #plm-form-material .field > input,
#view-plm-form #plm-form-material .field > select,
#view-plm-form #plm-form-material .field > textarea,
#view-plm-form #plm-form-material .section-title,
#view-plm-form #plm-form-material .section-title *,
#plm-split-right-head #plm-form-actions-row button,
#plm-split-right-head #plm-form-actions-row a {
  font-size: 12px !important;
  line-height: 1.4 !important;
}

/* ═══ 2026-09-30（用户：「仓库名称/安全库存/最大库存/单位 四字段同行显示」）═══
   四个 field 由 plm.js groupMatMetricRow() 包进 .plm-metric-row（DOM 手术，
   规避 v2 三列网格规则对部分容器不命中的场景差异）。
   row 在 grid 容器里通栏占整行；内部 flex 四等分并排，与资料卡其余字段同风格。 */
#plm-form-material .plm-metric-row {
  grid-column: 1 / -1 !important;
  display: flex !important;
  gap: 0 !important;
  border: none !important;
  background: transparent !important;
}
#plm-form-material .plm-metric-row > .field {
  flex: 1 1 25% !important;
  min-width: 0 !important;
  width: auto !important;
  border-bottom: none !important;
}
/* 兜底：若 JS 未执行（旧缓存 plm.js + 新 css），仓库名称的 plm-span-2 通栏至少取消，
   避免它独占一行与其余三字段断开 */
#plm-form-material > .form-grid-2 > .field.plm-span-2:has(#plm-m-warehouse) {
  grid-column: auto !important;
}

/* ═══ 2026-09-30 修正（用户：「不要改变原来的位置；不要有输入框显示」）═══
   ① row 未设 order 时默认 0，被 order 重排字段顶到最上面——挂 order:7 紧跟
   物料类型（order 6）回到原位置；
   ② 四字段值去掉输入框边框/底色，改纯文本观感，与资料卡其他字段一致。 */
#plm-form-material .plm-metric-row {
  order: 7 !important;
}
/* ═══ 2026-09-30 终版（用户第6轮「不要有输入框显示」+ 第7轮「仅要求同行显示」）═══
   恢复纯文本值（无边框/透明底/无内边距）——「不要输入框」是硬要求；
   label 样式由 .form-grid-2 .field > span 后代选择器自动命中（4.2em 右对齐灰字），
   与其他字段完全一致；同行排列（order:7 原位 + 四等分 flex）保持。 */
#plm-form-material .plm-metric-row > .field > input {
  border: none !important;
  background: transparent !important;
  padding: 0 !important;
  box-shadow: none !important;
}
/* ═══ 2026-09-30 终版2（用户：「仓库名称要对齐物料类型右边；字体颜色也要对齐」）═══
   真正结构：v2 分栏字段格 = field 内部 grid（92px 标签列 | 输入列）+ 右缘线
   （13532-13547）。row 内 field 不是直接子级不命中 → 标签列宽/右缘线全变。
   这里完整复刻：field 用同款 92px 两列 grid + border-right；span 在 92px 列内
   右对齐 → 右缘与「物料类型」完全同线；颜色对齐深灰 #374151（与其他行标签一致）。 */
#plm-form-material .plm-metric-row > .field {
  display: grid !important;
  grid-template-columns: 92px minmax(0, 1fr) !important;
  align-items: stretch !important;
  gap: 0 !important;
  margin: 0 !important;
  min-height: 0 !important;
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
}
#plm-form-material .plm-metric-row > .field > span {
  display: flex !important;
  align-items: center !important;
  justify-content: flex-end !important;
  padding: 0 10px 0 0 !important;
  background: transparent !important;
  border: none !important;
  color: #374151 !important;
  font-size: 12px !important;
  white-space: nowrap !important;
  overflow: visible !important;
  text-align: right !important;
}
#plm-form-material .plm-metric-row > .field > input {
  padding-left: 8px !important; /* 与 v2 输入格 padding:0 8px 一致 → 值左起与其他行内容对齐（用户 2026-09-30） */
  text-align: left !important;
}
/* 兜底：仓库名称的 plm-span-2 通栏类未被 JS 移除时（旧 plm.js 缓存），CSS 直接强制
   其 label 按统一口径对齐——对齐不依赖 JS 执行 */
#plm-form-material .plm-metric-row > .field.plm-span-2 > span,
#plm-form-material .plm-metric-row > .field.field-span-2 > span {
  flex: none;
  justify-content: flex-end;
  text-align: right;
  white-space: nowrap;
  font-size: 12px;
  color: #374151;
}

/* ── MES 仓库扫码（20261005whscan1）：领料/超领/退料共用扫码入口，移动优先 ── */
#pane-wh-scan .whscan-wrap {
  max-width: 860px;
  margin: 0 auto;
  padding: 14px 16px 24px;
  box-sizing: border-box;
}
/* pconprint67（2026-10-06 用户「电脑端页面不要拉满页面，不协调」截图=电脑端实时盘点
   「开始新盘点」绿色横幅拉满内容区）：仿上方 whscan-wrap——实时盘点页内容主体在电脑端
   （非手机全屏态）限宽 720px 居中；手机端 mf-whscan-live 挂载时全宽照旧。
   pconprint68（同日用户「红框内容保持原来不变」截图=页头「☰ 菜单+实时盘点」条）：
   页头条与页脚条从限宽清单移除，恢复原来的全宽（仅内容主体 .wms-mobile-body 限宽） */
body:not(.mf-whscan-live) #pane-stocktake-mobile .wms-mobile-body {
  max-width: 720px;
  margin-left: auto;
  margin-right: auto;
  width: 100%;
}
#pane-wh-scan .whscan-hero {
  border: 1px solid #e5e7eb;
  background: linear-gradient(180deg, #ffffff 0%, #f9fafb 100%);
  padding: 18px 16px 16px;
  text-align: center;
}
#pane-wh-scan .whscan-hero-title {
  font-size: 15px;
  font-weight: 600;
  color: #111827;
  margin-bottom: 12px;
}
#pane-wh-scan .whscan-inputrow {
  display: flex;
  gap: 8px;
  align-items: stretch;
}
#pane-wh-scan .whscan-input {
  flex: 1 1 auto;
  min-width: 0;
  box-sizing: border-box;
  font-size: 18px;
  text-align: center;
  letter-spacing: 1px;
  padding: 13px 12px;
  border: 2px solid #10b981;
  background: #fff;
  color: #111827;
}
#pane-wh-scan .whscan-input:focus {
  outline: none;
  border-color: #059669;
  box-shadow: 0 0 0 4px rgba(16, 185, 129, 0.12);
}
/* stcam1（2026-10-05 用户「摄像头怎么有背景色的，不是统一式样吗」）：
   盘点页摄像头按钮统一为仓库扫码页同款文字式（tb-btn 透明底橙字，
   原 wms-m-scan-btn 实心深青主按钮样式仅保留给 WMS 移动收货「扫码」用） */
#pane-wh-scan .whscan-cambtn,
#pane-stocktake-mobile .whscan-cambtn {
  flex: 0 0 auto;
  font-size: 15px;
  padding: 0 16px;
}
#pane-wh-scan .whscan-hint {
  margin-top: 10px;
  font-size: 12px;
  color: #9ca3af;
}
/* 结果回显：待机呼吸点 / 三色结果卡（与扫码作业页同视觉语言） */
#pane-wh-scan .whscan-result {
  margin-top: 12px;
  border: 1px solid #e5e7eb;
  background: #fff;
  padding: 16px 14px;
  text-align: center;
  min-height: 86px;
  box-sizing: border-box;
}
#pane-wh-scan .whscan-idle {
  color: #9ca3af;
  font-size: 14px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
}
#pane-wh-scan .whscan-idle-dot {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #10b981;
  animation: mf-scan-pulse 1.2s ease-in-out infinite;
}
#pane-wh-scan .whscan-big {
  font-size: 26px;
  font-weight: 800;
  letter-spacing: 2px;
}
#pane-wh-scan .whscan-result.tone-ok .whscan-big { color: #059669; }
#pane-wh-scan .whscan-result.tone-ok { border-color: #a7f3d0; background: #ecfdf5; }
#pane-wh-scan .whscan-result.tone-warn .whscan-big { color: #b45309; }
#pane-wh-scan .whscan-result.tone-warn { border-color: #fde68a; background: #fffbeb; }
#pane-wh-scan .whscan-result.tone-bad .whscan-big { color: #b91c1c; }
#pane-wh-scan .whscan-result.tone-bad { border-color: #fecaca; background: #fef2f2; }
#pane-wh-scan .whscan-msg {
  margin-top: 6px;
  font-size: 13px;
  color: #374151;
}
#pane-wh-scan .whscan-lab {
  margin-top: 6px;
  font-size: 12px;
  color: #6b7280;
  word-break: break-all;
}
/* 当日流水：KPI + 领料出库/退料接收 分组 */
#pane-wh-scan .whscan-today {
  margin-top: 14px;
  border: 1px solid #e5e7eb;
  background: #fff;
  padding: 12px;
  box-sizing: border-box;
}
#pane-wh-scan .whscan-today-head {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 10px;
}
#pane-wh-scan .whscan-today-title {
  font-size: 14px;
  font-weight: 700;
  color: #111827;
}
#pane-wh-scan .whscan-kpi {
  display: inline-flex;
  gap: 8px;
  flex: 1 1 auto;
  flex-wrap: wrap;
}
#pane-wh-scan .whscan-kpi-item {
  display: inline-block;
  padding: 3px 10px;
  font-size: 12px;
  font-weight: 600;
  border-radius: 999px;
}
#pane-wh-scan .whscan-kpi-ok { background: #ecfdf5; color: #065f46; border: 1px solid #a7f3d0; }
#pane-wh-scan .whscan-kpi-ret { background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; }
#pane-wh-scan .whscan-group { margin-bottom: 12px; }
#pane-wh-scan .whscan-group:last-child { margin-bottom: 0; }
#pane-wh-scan .whscan-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
#pane-wh-scan .whscan-table th,
#pane-wh-scan .whscan-table td {
  border: 1px solid #f3f4f6;
  padding: 6px 8px;
  text-align: left;
  vertical-align: top;
}
#pane-wh-scan .whscan-table th {
  background: #f9fafb;
  color: #6b7280;
  font-weight: 600;
  white-space: nowrap;
}
#pane-wh-scan .whscan-table tbody tr:hover { background: #f9fafb; }
#pane-wh-scan .whscan-num { white-space: nowrap; text-align: right; }
#pane-wh-scan .whscan-num b { color: #059669; font-size: 13px; }
/* 单据类型徽章（whfix1e 单表混排）：领料=灰（原样），退料类=蓝 */
#pane-wh-scan .whscan-kind.is-ret { background: #eff6ff; color: #1d4ed8; }
#pane-wh-scan .whscan-kind {
  display: inline-block;
  margin-left: 6px;
  padding: 0 6px;
  font-size: 11px;
  background: #f3f4f6;
  color: #6b7280;
  border-radius: 999px;
}
#pane-wh-scan .whscan-name {
  display: block;
  font-size: 11px;
  color: #9ca3af;
}
/* 手机端：整页收窄、输入区加大 */
@media (max-width: 640px) {
  #pane-wh-scan .whscan-wrap { padding: 10px 10px 20px; }
  #pane-wh-scan .whscan-hero { padding: 14px 10px 12px; }
  #pane-wh-scan .whscan-input { font-size: 17px; padding: 14px 10px; }
  #pane-wh-scan .whscan-cambtn,
  #pane-stocktake-mobile .whscan-cambtn { padding: 0 12px; }
  #pane-wh-scan .whscan-big { font-size: 22px; }
  #pane-wh-scan .whscan-table th:nth-child(5),
  #pane-wh-scan .whscan-table td:nth-child(5) { display: none; } /* 手机隐藏扫码人列 */
}

/* ── MES 扫码作业（20260930scan2）：工位卡片式布局 ── */
#pane-mes-scan .mf-scan-flex {
  display: flex;
  gap: 14px;
  align-items: flex-start;
}
#pane-mes-scan .mf-scan-wrap {
  padding: 16px 22px 28px;
  box-sizing: border-box;
  flex: 0 0 75%; /* 左（内容）:右（不良面板/留白）= 3:1（2026-10-02 用户） */
  max-width: 75%;
  min-width: 0;
}
#pane-mes-scan .mf-scan-defect-spacer { flex: 1 1 auto; }
/* 不良项目面板：不良登记时右侧点选后扫码（20261002scandf1）；四边 30px 边距（2026-10-02 用户） */
#pane-mes-scan .mf-scan-defects {
  flex: 1 1 auto;
  min-width: 0;
  margin: 30px;
  border: 2px solid #ef4444;
  border-radius: 10px;
  background: #fff;
  padding: 12px;
  box-sizing: border-box;
}
#pane-mes-scan .mf-scan-defects-head {
  font-size: 15px;
  font-weight: 700;
  color: #b91c1c;
  margin-bottom: 10px;
}
#pane-mes-scan .mf-scan-defects-tip {
  margin-left: 8px;
  font-size: 12px;
  font-weight: 400;
  color: #6b7280;
}
#pane-mes-scan .mf-scan-defects-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 8px;
}
#pane-mes-scan .mf-scan-defbtn {
  padding: 10px 8px;
  font-size: 14px;
  border: 1px solid #d1d5db;
  border-radius: 8px;
  background: #f9fafb;
  color: #111827;
  cursor: pointer;
  line-height: 1.2;
}
#pane-mes-scan .mf-scan-defbtn:hover { border-color: #ef4444; color: #b91c1c; }
#pane-mes-scan .mf-scan-defbtn.on {
  background: #ef4444;
  border-color: #ef4444;
  color: #fff;
  font-weight: 700;
}
#pane-mes-scan .mf-scan-defects-hint {
  margin-top: 10px;
  font-size: 12px;
  color: #6b7280;
}
/* 顶栏：环节徽章 + 操作员/时间 */
#pane-mes-scan .mf-scan-topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  border-bottom: 1px solid #e5e7eb;
  padding: 2px 2px 12px;
  margin-bottom: 16px;
}
#pane-mes-scan .mf-scan-crumb {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
#pane-mes-scan .mf-scan-chip {
  display: inline-block;
  padding: 4px 14px;
  background: #065f46;
  color: #fff;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 1px;
}
#pane-mes-scan .mf-scan-chip-line {
  background: #ecfdf5;
  color: #065f46;
  border: 1px solid #a7f3d0;
}
#pane-mes-scan .mf-scan-chip-mode {
  background: #f3f4f6;
  color: #374151;
  border: 1px solid #d1d5db;
  font-weight: 500;
}
#pane-mes-scan .mf-scan-chip-bad {
  background: #b91c1c;
  color: #fff;
  border-color: #b91c1c;
}
#pane-mes-scan .mf-scan-who {
  font-size: 12px;
  color: #6b7280;
  white-space: nowrap;
}
/* 分段选择器：线号 / 登记类型 */
#pane-mes-scan .mf-scan-setrow {
  display: flex;
  align-items: flex-end;
  gap: 32px;
  flex-wrap: wrap;
  margin-bottom: 16px;
}
#pane-mes-scan .mf-scan-setlabel {
  font-size: 11px;
  color: #9ca3af;
  letter-spacing: 2px;
  margin-bottom: 6px;
}
#pane-mes-scan .mf-scan-seg {
  display: inline-flex;
}
#pane-mes-scan .mf-scan-segbtn {
  border: 1px solid #d1d5db;
  background: #fff;
  color: #374151;
  font-size: 13px;
  padding: 9px 22px;
  cursor: pointer;
  margin-left: -1px;
}
#pane-mes-scan .mf-scan-segbtn:first-child {
  margin-left: 0;
}
#pane-mes-scan .mf-scan-segbtn:hover {
  border-color: #9ca3af;
  position: relative;
  z-index: 1;
}
#pane-mes-scan .mf-scan-segbtn.on {
  background: #10b981;
  border-color: #10b981;
  color: #fff;
  font-weight: 600;
  position: relative;
  z-index: 2;
}
#pane-mes-scan .mf-scan-segbtn-bad.on {
  background: #dc2626;
  border-color: #dc2626;
}
/* 扫码大卡（居中） */
#pane-mes-scan .mf-scan-hero {
  border: 1px solid #e5e7eb;
  background: linear-gradient(180deg, #ffffff 0%, #f9fafb 100%);
  padding: 26px 24px 22px;
  text-align: center;
}
#pane-mes-scan .mf-scan-hero-ico {
  display: inline-flex;
  width: 58px;
  height: 58px;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: #ecfdf5;
  color: #059669;
  margin-bottom: 10px;
}
#pane-mes-scan .mf-scan-hero-bad .mf-scan-hero-ico {
  background: #fef2f2;
  color: #dc2626;
}
#pane-mes-scan .mf-scan-hero-title {
  font-size: 15px;
  font-weight: 600;
  color: #111827;
  margin-bottom: 14px;
}
#pane-mes-scan .mf-scan-input {
  display: block;
  width: 100%;
  max-width: 680px;
  margin: 0 auto;
  box-sizing: border-box;
  font-size: 22px;
  text-align: center;
  letter-spacing: 2px;
  padding: 14px 18px 14px 48px;
  border: 2px solid #10b981;
  background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%2310b981' d='M4 4h6v2H6v4H4V4zm10 0h6v6h-2V6h-4V4zM4 14h2v4h4v2H4v-6zm14 0h2v6h-6v-2h4v-4zM3 11h18v2H3z'/%3E%3C/svg%3E") no-repeat 14px center;
  background-size: 22px 22px;
  color: #111827;
}
#pane-mes-scan .mf-scan-input:focus {
  outline: none;
  border-color: #059669;
  box-shadow: 0 0 0 4px rgba(16, 185, 129, 0.12);
}
#pane-mes-scan .mf-scan-hint {
  margin-top: 10px;
  font-size: 12px;
  color: #9ca3af;
}
/* 结果回显：待机呼吸点 / 三色结果卡 */
#pane-mes-scan .mf-scan-result {
  margin-top: 14px;
  padding: 14px 18px;
  border-left: 4px solid transparent;
}
#pane-mes-scan .mf-scan-idle {
  border: 1px dashed #d1d5db;
  background: #fafafa;
  color: #9ca3af;
  font-size: 13px;
  text-align: center;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
}
#pane-mes-scan .mf-scan-idle-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #10b981;
  animation: mf-scan-pulse 1.2s ease-in-out infinite;
}
@keyframes mf-scan-pulse {
  0%, 100% { opacity: 0.25; }
  50% { opacity: 1; }
}
#pane-mes-scan .mf-scan-result.tone-ok {
  border-left-color: #10b981;
  background: #ecfdf5;
}
#pane-mes-scan .mf-scan-result.tone-warn {
  border-left-color: #f59e0b;
  background: #fffbeb;
}
#pane-mes-scan .mf-scan-result.tone-bad {
  border-left-color: #ef4444;
  background: #fef2f2;
}
#pane-mes-scan .mf-scan-big {
  font-size: 24px;
  font-weight: 700;
}
#pane-mes-scan .tone-ok .mf-scan-big { color: #059669; }
#pane-mes-scan .tone-warn .mf-scan-big { color: #b45309; }
#pane-mes-scan .tone-bad .mf-scan-big { color: #dc2626; }
#pane-mes-scan .mf-scan-msg {
  margin-top: 4px;
  font-size: 13px;
  color: #374151;
}
#pane-mes-scan .mf-scan-lab {
  margin-top: 6px;
  font-size: 12px;
  color: #6b7280;
}
/* 流水 / 看板 */
#pane-mes-scan .mf-scan-today {
  margin-top: 18px;
}
#pane-mes-scan .mf-scan-today-head {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 8px;
}
#pane-mes-scan .mf-scan-today-title {
  font-size: 13px;
  font-weight: 600;
  color: #374151;
}
#pane-mes-scan .mf-scan-kpi {
  display: inline-flex;
  gap: 6px;
  flex: 1;
}
#pane-mes-scan .mf-scan-kpi-item {
  display: inline-block;
  padding: 2px 10px;
  font-size: 12px;
  font-weight: 600;
}
#pane-mes-scan .mf-scan-kpi-ok {
  background: #ecfdf5;
  color: #059669;
  border: 1px solid #a7f3d0;
}
#pane-mes-scan .mf-scan-kpi-bad {
  background: #fef2f2;
  color: #dc2626;
  border: 1px solid #fecaca;
}
#pane-mes-scan .mf-scan-today-list {
  border: 1px solid #e5e7eb;
  max-height: 340px;
  overflow: auto;
  background: #fff;
}
#pane-mes-scan .mf-scan-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
#pane-mes-scan .mf-scan-table th,
#pane-mes-scan .mf-scan-table td {
  border: 1px solid #eef0f3;
  padding: 7px 12px;
  text-align: left;
  white-space: nowrap;
}
#pane-mes-scan .mf-scan-table th {
  background: #f9fafb;
  font-weight: 600;
  color: #6b7280;
  position: sticky;
  top: 0;
}
#pane-mes-scan .mf-scan-table tbody tr:hover {
  background: #f8fafc;
}
#pane-mes-scan .mf-scan-row-bad td {
  color: #dc2626;
}
#pane-mes-scan .mf-scan-stage-badge {
  display: inline-block;
  padding: 1px 8px;
  background: #fef2f2;
  color: #dc2626;
  font-size: 12px;
}
#pane-mes-scan .mf-scan-table tbody tr[data-defect-code] {
  cursor: pointer;
}
#pane-mes-scan .mf-scan-table tbody tr[data-defect-code]:hover {
  background: #f0fdf4;
}

/* ═══ 资料卡弹窗顶部收缩（2026-10-01 用户定版：顶部间距 10px，顶栏/操作行不再占位） ═══ */
#view-plm-form .modal-head { display: none; }
#view-plm-form #plm-form-actions-row { display: none !important; }
#view-plm-form .modal-body { padding-top: 5px; }

/* ═══ 图片附件空态粘贴框上移（2026-10-01 用户：红框内容向上移动一下位置）═══
   空态（attach-empty）时虚线粘贴框向上提 12px，贴近「图片附件」标题行；
   有附件时（非空态）布局不受影响；
   内嵌版 13847 有同级但靠后的 margin:0 规则，内嵌版不受本条影响（仅弹窗版生效）。 */
#view-plm-form #plm-attach-section.attach-empty .attach-drop-hint {
  margin-top: -12px;
}

/* ═══ 内嵌右栏横向溢出修复（2026-10-01 用户：滚动不到顶部/顶部被截）═══
   根因：label.field(92px|1fr grid) 内含 物料代码输入框+派生+创建BOM 按钮，
   input/按钮默认 min-width:auto 不可收缩 → min-content(约404px) 沿 grid/flex 链
   传导撑爆内嵌右栏（可视 48~330px）→ 横向滚动条 + textarea 被挤成 16px 逐字换行
   暴涨（名称框实测 144px 高）→ 顶部内容被顶出可视区且出现横滚死区。
   修复限定内嵌态作用域，弹窗版式样零改动。 */
/* ① 斩断 min-content 传导：top-row 轨道 item 允许收缩 */
#pane-plm .plm-split-right #view-plm-form .plm-form-top-row > .form-section { min-width: 0; }
/* ② 字段内输入类元素允许收缩（杀默认 size/min-width 撑宽） */
#pane-plm .plm-split-right #view-plm-form .form-grid-2 .field > input,
#pane-plm .plm-split-right #view-plm-form .form-grid-2 .field > select,
#pane-plm .plm-split-right #view-plm-form .form-grid-2 .field > textarea { min-width: 0; }
/* ③ 内嵌态禁横向滚动：内容只纵向滚，永不出现横滚条 */
#pane-plm .plm-split-right #view-plm-form .modal-body { overflow-x: hidden; }

/* ④ 物料代码行窄栏自适应（2026-10-01）：9493 定版 input flex:0 0 150px 完全不可收缩，
   加 margin-left:100px 后该行 min-content≈404px，内嵌右栏(约330px)必然横向撑爆 →
   同表单其他行被压成 16px 宽、textarea 逐字换行暴涨、顶部内容被顶出可视区。
   内嵌态改为 input 可收缩（flex-shrink:1，下限 60px），优先保持 100px 定版间距；
   弹窗版（无 #pane-plm .plm-split-right 前缀）定版式样零改动。 */
#pane-plm .plm-split-right #view-plm-form #plm-form-material > .form-grid-2 > .field:has(#btn-plm-derive-material:not([hidden])) > input,
#pane-plm .plm-split-right #view-plm-form #plm-form-material > .form-grid-2 > .field:has(#btn-m-create-bom:not([hidden])) > input {
  flex: 0 1 150px;
  min-width: 60px;
}

/* ── PLM 空态操作流程卡（2026-10-01 qbinline14 统一式样）──
   原样式内嵌于物料页空态卡 #plm-split-right-empty 的 <style> 里；切到 BOM 页时该节点
   被 vault 移出文档 → <style> 一并失效，BOM 流程卡裸奔（默认 ol 序号、无绿圈数字）。
   移入全局 app.css：物料列表 / BOM列表 两处流程卡式样永远统一（绿圈数字+居中绿标题）。 */
.plm-empty-guide { max-width: 620px; margin: 0 auto; }
.plm-eg-title { font-size: 17px; font-weight: 700; color: #0f766e; letter-spacing: .5px; margin: 0 0 18px; text-align: center; }
.plm-eg-steps { margin: 0; padding: 0; list-style: none; max-width: 620px; text-align: left; }
.plm-eg-steps li { position: relative; padding: 12px 0 12px 40px; font-size: 13.5px; color: #475569; line-height: 1.8; border-bottom: 1px dashed #e2e8f0; }
.plm-eg-steps li:last-child { border-bottom: none; }
/* egcenter1（2026-10-06 用户「为什么不是垂直居中显示」）：数字圆点由固定 top:13px
   （贴第一行，文字折两行时明显偏上）改为相对整行垂直居中 */
.plm-eg-steps li::before { content: attr(data-n); position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 26px; height: 26px; border-radius: 50%; background: #0d9488; color: #fff; font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center; }
.plm-eg-steps b { color: #0f172a; margin-right: 8px; }

/* ── 订单列表式样：采用 BOM 列表明细行式样（2026-10-01 qbinline15 用户）──
   仅 #so-list（订单列表页）生效，不动其他模块的绿色主题：
   表头浅灰 #f3f4f6 + 灰字加粗、单元格白底、网格线 #eceef1 细线、去斑马纹、
   行号列白底同内容区（2026-10-02 用户）；选中行改浅蓝（呼应 BOM 明细替换料蓝）。 */
#so-list .data-table th {
  background: #f3f4f6 !important;
  color: #374151 !important;
  font-weight: 600 !important;
  border-right: 1px solid #e5e7eb !important;
  border-bottom: 1px solid #e5e7eb !important;
}
/* 表头灰字需压过 L9846「表头白字保留」#fff !important 与 L9839 字重 400 !important */
#so-list .data-table td {
  background: #fff;
  color: #1f2937;
  border-right: 1px solid #eceef1;
  border-bottom: 1px solid #eceef1;
}
#so-list .data-table tbody tr:nth-child(even) { background: #fff; }
/* 选中/悬停必须上到所有 td（2026-10-02 用户「点击行整行显示背景色」）：
   上面 td 白底以 ID 特异性压掉了全局 tr.selected td / tr:hover td 背景，
   导致只有冻结列（!important teal）有背景、其余列白底。此处同特异性 +
   !important 明确整行上色；选中色沿用全站 teal #99f6e4。 */
#so-list .data-table tbody tr.selected td { background: #99f6e4 !important; }
#so-list .data-table tbody tr.selected:hover td { background: #99f6e4 !important; }
#so-list .data-table tbody tr:not(.selected):hover td { background: #f8fafc !important; }
/* 行号列白底同内容区（2026-10-02 用户）；表头行仍浅灰保持一致 */
#so-list .data-table col.col-idx,
#so-list .data-table th.col-idx,
#so-list .data-table td.col-idx { background: #fff; }
#so-list .data-table th.col-idx { background: #f3f4f6; color: #374151; }
#so-list .data-table th.mf-sticky-left { background: #f3f4f6; color: #374151; }
#so-list .data-table th.mf-sticky-left.col-idx,
#so-list .data-table th.mf-sticky-left.col-sel { background: #f3f4f6; }


/* ═══ 仓库扫码手机版全屏（2026-10-05 whscan2 用户：手机版仅显示扫码核心内容，隐藏无关；
   2026-10-05 stklive1b 用户「仓库扫码也统一红框的内容」——页头恢复显示（「☰ 菜单+页名」
   与实时盘点页统一，app.js「☰ 菜单」单例按钮自动放入），右上悬浮 ☰ 圆钮废弃删除）═══
   仅窄屏(≤720px) + body.mf-whscan-live（app.js switchModule 进入/离开该页时挂/摘）生效：
   隐藏壳页签条、本页页脚、底部 shell-foot 分页器——
   页面只剩 页头(☰菜单+标题) + 扫码输入区 + 结果卡 + 当日流水；
   宽于 720px（桌面/平板横屏）零改动。 */
@media (max-width: 720px) {
  body.mf-whscan-live #tab-bar { display: none !important; }
  body.mf-whscan-live #pane-wh-scan .page-footer { display: none !important; }
  body.mf-whscan-live .shell-foot { display: none !important; }
  body.mf-whscan-live #pane-wh-scan .list-body { padding: 0 0 24px; }
  body.mf-whscan-live #pane-wh-scan .whscan-wrap { position: relative; padding: 12px 12px 24px; }
}

/* ═══ 当日流水区内部滚动（2026-10-05 whfix1b 用户「下方结果区能上下移动查看」）——
   列表限高内部滚，KPI 头保持可见；触屏惯性滚动 */
#pane-wh-scan #whscan-today-list {
  max-height: 55vh;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}

/* ═══ 仓库扫码·扫码后数量修正（2026-10-05 whfix1 用户「最好有修正数量框，实际情况
   不一定数量正确」）——结果卡内联修正行：预填标签印的数量，改完点「修正」（或框内回车）
   = 以 SET=1 改单张 payload 复扫，后端把该张记录数量改为新值并重算行累计（零后端改动）。
   手机/桌面通用。 */
.whscan-fixrow {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px dashed #d1d5db;
}
.whscan-fix-lab { font-size: 12px; color: #475569; }
.whscan-fix-q {
  width: 84px;
  padding: 6px 8px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  font-size: 15px;
  text-align: center;
  background: #fff;
}
.whscan-fix-btn {
  padding: 6px 14px;
  border: 1px solid #0d9488;
  border-radius: 6px;
  background: #0d9488;
  color: #fff;
  font-size: 13px;
  cursor: pointer;
}
.whscan-fix-btn:disabled { opacity: 0.55; cursor: wait; }
.whscan-fix-q.whscan-fix-bad { border-color: #dc2626; background: #fef2f2; }

/* ═══ 仓库扫码·流水行点击修正（2026-10-05 whlog1 用户「能否在流水区找到对应标签
   点击修正数量」）——流水行「本次」格改按钮可点 → 该行下方就地展开修正行（复用
   whfix1 的 .whscan-fixrow 系列），失败行内报错不跳页。 */
.whscan-logfix {
  appearance: none;
  border: 0;
  background: none;
  padding: 0;
  margin: 0;
  font: inherit;
  color: inherit;
  line-height: 1.35;
  text-align: inherit;
  cursor: pointer;
  width: 100%;
}
.whscan-logfix-pen { font-size: 12px; opacity: 0.55; }
.whscan-logfix:active { opacity: 0.7; }
.whscan-fixtr > td { padding: 2px 8px 10px; background: rgba(13, 148, 136, 0.06); }
.whscan-logfix-msg { font-size: 12px; color: #dc2626; }
.whscan-logfix-msg:empty { display: none; }

/* ═══ 仓库扫码手机端：常驻侧栏处理（2026-10-05 whscan6 用户「导航菜单占用太多区域，
   导致扫码区域无法正常操作」）═══
   扫码态（body.mf-whscan-live）下：
   ① 常驻左导航 #nav-popup（180px）整体隐藏，主内容 margin-left 归零——扫码区满宽；
   ② 点页面右上 ☰（#btn-whscan-menu）→ body.nav-menu-open：侧栏以覆盖层临时弹出
     （fixed + 遮罩，不挤占布局），选中菜单项/点击遮罩/Esc 自动收起。
   特异性说明：须压过 #view-shell:not([hidden]) .nav-popup 与 .shell-main 两条 !important 规则。 */
body.mf-whscan-live #nav-popup.nav-popup { display: none !important; }
body.mf-whscan-live #view-shell:not([hidden]) .shell-main { margin-left: 0 !important; }
body.mf-whscan-live.nav-menu-open #nav-popup.nav-popup {
  display: flex !important;
  /* stklive1e（2026-10-05 用户「还是太宽了」）：fit-content 已生效但内容固有宽度大
     （用户信息行：头像+「角色: user」+箭头 ≈ 217px）——压缩覆盖层内部留白让它真正收窄：
     头像 30px、用户区/菜单项 padding 与 gap 紧凑化、min-width 撤掉；仅全屏态覆盖层生效，
     桌面常驻侧栏零改动 */
  /* navw4（2026-10-11 用户：侧栏导航展开宽度 150px）：手机覆盖层此前 fit-content
     由内容固有宽度撑开（≈72vw 上限），桌面端 150px 在手机上「看着没生效」——
     改为与桌面同宽 150px 固定；min/max 留作护栏 */
  /* nav201：手机覆盖层与桌面同宽（原来写死 140，且少了个分号导致声明被整条丢弃） */
  width: var(--nav-w) !important;
  min-width: 0 !important;
  max-width: 72vw !important;
  z-index: 95;
  box-shadow: 0 0 24px rgba(15, 23, 42, 0.28);
}
body.mf-whscan-live.nav-menu-open #nav-popup .nav-popup-user {
  padding: 8px 10px !important;
  gap: 8px !important;
}
body.mf-whscan-live.nav-menu-open #nav-popup .nav-popup-avatar {
  width: 30px !important;
  height: 30px !important;
  flex: 0 0 30px !important;
  font-size: 14px !important;
}
body.mf-whscan-live.nav-menu-open #nav-popup .nav-popup-role {
  font-size: 11px !important;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 96px;
}
body.mf-whscan-live.nav-menu-open #nav-popup .nav-item,
body.mf-whscan-live.nav-menu-open #nav-popup .nav-group-toggle {
  padding-left: 12px !important;
  padding-right: 12px !important;
  gap: 8px !important;
}
/* 只展开侧栏主体；.nav-popup-side 是 WMS 废弃飞出面板（#nav-wms-region-sub /
   #nav-wms-func-sub 同名 class），必须保持 hidden——whscan8 教训：
   此前 .nav-popup-side { display:flex !important } 把 hidden 的飞出面板也强制显示了 */
body.mf-whscan-live.nav-menu-open #nav-popup.nav-popup > .nav-popup-body {
  display: flex !important;
  flex-direction: row;
  align-items: stretch;
}
body.mf-whscan-live.nav-menu-open #nav-popup.nav-popup > .nav-popup-body > .nav-popup-side {
  display: none !important;
}
body.mf-whscan-live.nav-menu-open::after {
  content: "";
  position: fixed;
  inset: 0;
  background: rgba(15, 23, 42, 0.35);
  z-index: 94;
}

/* ═══ 物料编辑弹窗全部文字 14px（2026-10-05 plmfont1~3 用户：图片文字全部字号=14px）═══
   截图为「基本信息」资料卡表单（#view-plm-form）——标题/字段名/输入框/按钮/提示全部统一 14px。
   表单两种挂载形态：弹窗态 #app 直接子级 / 分屏态被 renderFormInSplit 搬进 #plm-split-right-body。
   plmfont3 教训：L17642 定版规则 `#view-plm-form #plm-form-material .field > span/input/...` 12px
   特异性 (2,1,2)，通配 `*` 不计特异性 → (2,1,0) 的通配规则被压，span/input 仍 12px。
   改为逐分支列举：:is 元素分支 (2,1,1) 压通用 12px 规则；.field>* 分支 (2,2,1)、
   .section-title 分支 (2,2,1)、.plm-material-wrap 深链分支 (2,4,3) 压 12px 定版规则；
   qb-label font-size:0 (3,3,3) 特异性更高不受影响（快速BOM 隐藏 label 技巧保留）。 */
:is(#app, #plm-split-right) #view-plm-form .modal-card,
:is(#app, #plm-split-right) #view-plm-form .modal-card :is(input, select, textarea, option, button, a, span, p, div, label, b, strong, em, i, small, code, th, td, li, h1, h2, h3, h4),
:is(#app, #plm-split-right) #view-plm-form .modal-card .field > span,
:is(#app, #plm-split-right) #view-plm-form .modal-card .field > input,
:is(#app, #plm-split-right) #view-plm-form .modal-card .field > select,
:is(#app, #plm-split-right) #view-plm-form .modal-card .field > textarea,
:is(#app, #plm-split-right) #view-plm-form .modal-card .section-title,
:is(#app, #plm-split-right) #view-plm-form .modal-card .section-title *,
:is(#app, #plm-split-right) #view-plm-form .modal-card .plm-material-wrap > .form-grid-2 > .field > span,
#plm-split-right-head #plm-form-actions-row button,
#plm-split-right-head #plm-form-actions-row a {
  font-size: 14px !important;
}

/* pcon13（2026-10-05 用户「不要图标」）：转采购合同弹窗回料日期框隐藏原生日历图标
   （opacity:0 而非 display:none —— 图标原位仍可点击弹日历，交互不丢） */
#mfpur-ct-date::-webkit-calendar-picker-indicator,
#mfpur-ct-date::-webkit-inner-spin-button {
  opacity: 0;
  -webkit-appearance: none;
}
#mfpur-ct-date::-moz-calendar-picker-indicator {
  opacity: 0;
}

/* ── pconprint73（2026-10-06 用户「操作列移除，改为按钮列显示」）──
   CRM 列表（跟进/商机/报价/合同，data-col-kind=crm_*）操作列改普通按钮列样式（去深青折叠块、
   去悬浮阴影）；opscol2 补贴右可见；nofreeze1（2026-10-06 用户「操作列不要冻结」）去贴右 sticky。
   nospec1（2026-10-06 用户「操作列不要特殊化列，改成与其他列一样」）：抵消全局 L7778 操作列
   全部特殊化（白底/max-width:none/overflow:visible/高 z-index/阴影）——td 与普通单元格完全一致
   （max-width:0 + ellipsis），th 与普通表头一致（贴顶 sticky、z-index 2）。
   宽度由 crm_contract.js nospec1 内容自适应（按按钮组估宽），框架 opsFloor 72 兜底仍在。
   配合 crm.js MfColResize opsPin:false（框架不重建 col-fill/has-ops-pin/折叠按钮）。 */
[data-col-kind="crm_activity"] th.col-ops,
[data-col-kind="crm_activity"] th[data-col="操作"],
[data-col-kind="crm_opportunity"] th.col-ops,
[data-col-kind="crm_opportunity"] th[data-col="操作"],
[data-col-kind="crm_quotation"] th.col-ops,
[data-col-kind="crm_quotation"] th[data-col="操作"],
[data-col-kind="crm_contract"] th.col-ops,
[data-col-kind="crm_contract"] th[data-col="操作"] {
  /* sticky 但必须显式 right:auto —— 抵消全局 L7780 th[data-col=操作] 的 right:0 !important，
     否则表头仍贴右冻结（表格超宽横滚时操作表头钉死右缘，2026-10-06 用户复验发现）；
   仅贴顶（同全局表头），不贴右、不冻结；层级同其他表头 */
  position: sticky !important;
  right: auto !important;
  left: auto !important;
  z-index: 2 !important;
  box-shadow: none !important;
  padding-left: 8px;
  padding-right: 8px;
}
[data-col-kind="crm_activity"] td.col-ops,
[data-col-kind="crm_activity"] td[data-col="操作"],
[data-col-kind="crm_opportunity"] td.col-ops,
[data-col-kind="crm_opportunity"] td[data-col="操作"],
[data-col-kind="crm_quotation"] td.col-ops,
[data-col-kind="crm_quotation"] td[data-col="操作"],
[data-col-kind="crm_contract"] td.col-ops,
[data-col-kind="crm_contract"] td[data-col="操作"] {
  position: static !important;
  box-shadow: none !important;
  background: transparent !important;   /* 全局操作列白底 → 同普通单元格（透出行选中/斑马背景） */
  max-width: 0 !important;              /* 全局 max-width:none → 同普通单元格（fixed 布局守列宽） */
  overflow: hidden;
  text-overflow: ellipsis;
  padding-left: 8px;
  padding-right: 8px;
}
/* 贴右时代的调宽手柄在左缘（L7803 按 data-col 命中），普通列恢复右缘手柄 */
[data-col-kind="crm_activity"] th[data-col="操作"] .col-resizer,
[data-col-kind="crm_opportunity"] th[data-col="操作"] .col-resizer,
[data-col-kind="crm_quotation"] th[data-col="操作"] .col-resizer,
[data-col-kind="crm_contract"] th[data-col="操作"] .col-resizer {
  left: auto;
  right: 0;
}

/* ===================== mes-pane 弹窗布局（ctmodal1 2026-10-07） ===================== */
/* 订单列表右键「标准工时」等 MES pane 弹窗（openMesPaneModal）——用户
   「弹窗最大化，表头需要固定；下方需要显示滚动条」：
   ① modal-body 改 flex 容器（padding 0、固定高 78vh），pane 占满弹窗；
      page-header / 类别 tab / page-footer 固定，不随内容滚动；
   ② 滚动统一收敛到内部 .list-body（与页面模式同构）——竖向/横向滚动条
      常驻 list-body 底部（footer 上方，弹窗可视区内可见）；
   ③ .table-wrap 不再截流（overflow visible），表格超宽由 list-body 横向滚动；
   ④ thead th sticky 钉在 list-body 顶部——竖向滚动表头不滚走；
      行号列 th（mf-sticky-left z4）同时钉 top，左上角双向固定（z5 压过冻结 td z3）。 */
#mes-pane-modal .modal-body {
  padding: 0;
  height: 78vh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
#mes-pane-modal .modal-body .list-pane {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
/* page-header/类别 tab/page-footer 为固定区，禁止被 list-body 的 flex 挤压成 0 高 */
#mes-pane-modal .modal-body .list-pane > .page-header,
#mes-pane-modal .modal-body .list-pane > .mes-subtabs,
#mes-pane-modal .modal-body .list-pane > .page-footer {
  flex: none;
}
#mes-pane-modal .modal-body .list-body {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
}
#mes-pane-modal .modal-body .table-wrap {
  overflow: visible;
}
#mes-pane-modal .modal-body thead th {
  position: sticky;
  top: 0;
  z-index: 5;
}

/* ── 产品明细：追加产品到现有报价单 模式条（cpadd1）────────────────── */
.cp-append-bar {
  display: flex;
  align-items: center;
  gap: 12px;
  flex: none;
  margin: 6px 0 10px;
  padding: 9px 14px;
  background: #fff7ed;
  border: 1px solid #f59e0b;
  border-left: 4px solid #ff5000;
  border-radius: 0;
  font-size: 13px;
  color: #92400e;
}
/* display:flex 会盖掉原生 [hidden]，必须显式压回 */
.cp-append-bar[hidden] { display: none !important; }
.cp-append-bar .cp-append-tip { flex: 1 1 auto; }
.cp-append-bar .cp-append-count { flex: none; font-weight: 600; color: #ff5000; }
.cp-append-bar .tb-btn { flex: none; }

/* ── 报价管理卡片视图（qcard1/qcard2：卡片格式对齐送检列表 iqc 卡）── */
.qcard-scroller { overflow: auto; }
.qcard-cards { display: flex; flex-direction: column; gap: 10px; padding: 2px 15px 8px; }
.qcard {
  background: #fff;
  border: 1px solid #e2e8f0;
  border-left: 3px solid var(--c, #94a3b8);
  border-radius: 10px;
  padding: 10px 12px;
  cursor: pointer;
  transition: transform .12s ease, box-shadow .12s ease, border-color .12s ease;
}
.qcard:hover { border-color: #5eead4; background: #f0fdfa; transform: translateY(-2px); box-shadow: 0 8px 20px rgba(15, 23, 42, .10); }
.qcard.selected { border-color: #0f766e; background: #f0fdfa; }
.qcard-head {
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  gap: 8px;
  padding-bottom: 8px;
  border-bottom: 1px dashed #e2e8f0;
}
.qcard-idx { color: #94a3b8; font-size: 12px; min-width: 18px; text-align: right; }
.qcard-no {
  font-weight: 700;
  font-size: 14px;
  color: #0f172a;
  font-family: ui-monospace, SFMono-Regular, 'SF Mono', Consolas, monospace;
  letter-spacing: .2px;
}
.qcard-badge { display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: 11.5px; font-weight: 600; }
/* ctquo1（2026-10-31 用户「需要显示报价编号，点击能方便查看报价单」）：
   合同卡头「📄 报价单号」可点标签（跟合同编号同排，点击直接打开来源报价单） */
.ct-quote-chip {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 1px 8px;
  border: 1px solid #bfdbfe;
  background: #eff6ff;
  color: #1d4ed8;
  border-radius: 999px;
  font-size: 11.5px;
  font-weight: 600;
  line-height: 1.6;
  cursor: pointer;
  font-family: inherit;
  white-space: nowrap;
}
.ct-quote-chip:hover { background: #dbeafe; border-color: #93c5fd; color: #1e40af; }
.ct-quote-chip:active { background: #bfdbfe; }
/* ctquo3（2026-10-31 用户「都需要」）：合同卡头计价口径小标记（含税/未税） */
.ct-tax-chip {
  display: inline-block;
  padding: 0 6px;
  border: 1px solid #e2e8f0;
  background: #f8fafc;
  color: #64748b;
  border-radius: 999px;
  font-size: 11px;
  line-height: 1.7;
  white-space: nowrap;
}
.qcard-acts { display: flex; align-items: center; gap: 6px; margin-left: auto; }
.qcard-grid { display: flex; flex-wrap: nowrap; gap: 4px 18px; padding-top: 8px; font-size: 12.5px; overflow: hidden; }
.qcard-grid > span { display: flex; align-items: baseline; min-width: 0; flex: 1 1 auto; }
/* ctgap1（2026-10-09 用户「红框内容字段按照显示内容宽度收缩间距」）：
   字段按内容收缩（删定宽），仅 末字段（备注）弹性吸收剩余宽并 ellipsis 截断 */
.qcard-grid.kv-hug > span { flex: 0 0 auto; width: auto; }
/* ctgap3（2026-10-09 用户「红框位置也需要修正=50px」）：首字段原先 flex:1 1 auto 会吸收剩余宽度，
   把「客户名称 → 客户代码」这段撑得远大于 50px。改为 flex:0 1 auto —— 按内容宽、不吸收剩余，
   仍保留收缩能力（内容过长时 ellipsis）；剩余宽全部交给末字段。 */
.qcard-grid.kv-hug > span:first-child { flex: 0 1 auto; min-width: 0; }
.qcard-grid.kv-hug > span:last-child { flex: 1 1 auto; min-width: 0; }
/* ctgap2（2026-10-09 用户「字段间距=50px」）：k/v 字段水平间距 18px → 50px
   （报价卡 / 合同卡共用 .qcard-grid.kv-hug，两页同步；字段仍按内容收缩，不改定宽） */
.qcard-grid.kv-hug { column-gap: 50px; }
.qcard-grid .k { color: #94a3b8; margin-right: 6px; flex: none; white-space: nowrap; }
.qcard-grid .v { color: #0f172a; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }

/* ── qcard6 卡片明细行区块（qcard11：由 flex 改 grid —— 型号列随内容自适应、各行列对齐）── */
.qcard-lines {
  border-top: 1px dashed #e2e8f0;
  margin-top: 8px;
  padding-top: 6px;
  display: grid;
  /* # | 产品型号(≥120px，随最长内容自适应，不封顶→名称列恒占余量) | 产品名称(占余量) | 数量 | 单价 | 总价 */
  grid-template-columns: 16px minmax(120px, auto) minmax(0, 1fr) 70px 80px 90px;
  column-gap: 10px;
  row-gap: 3px;
  align-items: center;
  font-size: 12px;
  line-height: 20px;
}
.qcard-line { display: contents; }
.qcard-line .ln-no {
  height: 16px;
  line-height: 16px;
  text-align: center;
  color: #94a3b8;
  background: #f1f5f9;
  border-radius: 999px;
  font-size: 11px;
}
.qcard-line .ln-model { min-width: 0; font-weight: 600; color: #0f172a; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.qcard-line .ln-name { min-width: 0; color: #334155; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.qcard-line .ln-qty { text-align: right; color: #334155; font-family: ui-monospace, SFMono-Regular, 'SF Mono', Consolas, monospace; }
.qcard-line .ln-price { text-align: right; color: #0f766e; font-family: ui-monospace, SFMono-Regular, 'SF Mono', Consolas, monospace; }
.qcard-line .ln-total { text-align: right; color: #0f172a; font-weight: 600; font-family: ui-monospace, SFMono-Regular, 'SF Mono', Consolas, monospace; }
.qcard-line-head { color: #94a3b8; }
.qcard-line-head .ln-model,
.qcard-line-head .ln-name,
.qcard-line-head .ln-qty,
.qcard-line-head .ln-price,
.qcard-line-head .ln-total { font-weight: 400; color: #94a3b8; }
/* 空明细行：单个 span 需横跨整行（display:contents 下否则会落进 16px 的 # 列） */
.qcard-line-empty .ln-name { grid-column: 1 / -1; color: #94a3b8; }

/* ── mgeo1（2026-10-08 用户「手机端的图片、定位需要在电脑端页面显示出来」）：
      CRM 跟进列表 图片缩略 / 定位链接（最新跟进页 + CRM Hub 跟进列表共用）── */
.crm-act-imgs { display: inline-flex; gap: 4px; align-items: center; }
.crm-act-imgs .crm-act-img {
  height: 32px; max-width: 60px; object-fit: cover; border-radius: 4px;
  border: 1px solid #e2e8f0; display: block; cursor: zoom-in;
}
.crm-act-imgs a { display: inline-flex; line-height: 0; }
a.crm-act-loc { color: #0d9488; text-decoration: none; }
a.crm-act-loc:hover { text-decoration: underline; }

/* ── hfpg2（2026-10-08 用户「下拉选项需要追加自定义」）：筛选下拉自定义项 ── */
.hf-addrow { padding: 6px 10px; border-top: 1px dashed #e2e8f0; }
.hf-addrow .hf-add-custom { width: 100%; text-align: center; }
.hf-custom-tag {
  font-style: normal; font-size: 10px; color: #0d9488; background: #ccfbf1;
  border-radius: 4px; padding: 0 4px; margin-left: 6px; flex: none;
}

/* ── qalign1（2026-10-31 用户「输入框 等想办法对齐，好看一点」）────────────────
   报价弹窗顶部字段区：同行控件统一 28px 高、同类字段统一宽度、标签与控件垂直居中、
   第二行「联系人 / 电话 / 备注」三等分等宽；「计价」块压成与输入框同高的一体块。 */
#view-hub-quo-form .pl-sys-row { row-gap: 6px; column-gap: 12px; }
#view-hub-quo-form .pl-sys-row > label { height: 28px; line-height: 28px; }
#view-hub-quo-form .pl-sys-row input,
#view-hub-quo-form .pl-sys-row select {
  height: 28px;
  box-sizing: border-box;
  vertical-align: middle;
}
#view-hub-quo-form .pl-sys-row input[type="radio"] { height: 13px; }
/* qalign4（2026-10-31）：字段宽度按右边缘对齐微调，第一行基本铺满整宽（原来右侧空 200+px） */
#view-hub-quo-form #hq-cust-wrap select { width: 260px; }
#view-hub-quo-form #hq-no { width: 176px; }
#view-hub-quo-form #hq-entity { width: 250px; }
#view-hub-quo-form #hq-status { width: 126px; }
#view-hub-quo-form #hq-valid { width: 126px; }
#view-hub-quo-form #hq-lang { width: 150px; }
#view-hub-quo-form #hq-tax-wrap {
  height: 28px;
  padding: 0 14px;
  display: inline-flex;
  align-items: center;
  gap: 12px;
}
/* qalign2：强制换行元素（flex 行内占满整行 0 高）——让 联系人/电话/备注 独占第二行 */
#view-hub-quo-form .pl-sys-break { flex: 0 0 100%; width: 100%; height: 0; margin: -4px 0; padding: 0; }
/* 第二行三格等宽（原来 flex-basis 180px 会让内容长的格子更宽） */
#view-hub-quo-form .pl-sys-grow { flex: 1 1 0; min-width: 0; }
#view-hub-quo-form .pl-sys-grow input { flex: 1 1 auto; width: 100%; min-width: 0; }
/* 标签等宽：联系人(3字) / 电话(2字) / 备注(2字) 的输入框左边缘对齐 */
#view-hub-quo-form .hq-lab-w { display: inline-block; min-width: 40px; text-align: left; }

/* qalign3（2026-10-31 收尾）：计价块边框与输入框同色、客户标签字重与其它标签一致 */
#view-hub-quo-form #hq-tax-wrap { border-color: #d6d3d1; }
#view-hub-quo-form #hq-cust-wrap { font-weight: 500; }

/* ── ctlock2（2026-10-31 用户「这里不能修改才对的；调整一下显示格式」）──────────
   合同弹窗「计价」改为只读展示：虚线浅底小标签，不换行、不挤压相邻字段。
   口径来源：转合同时继承报价；手工新建默认未含税。 */
#view-hub-ct-form .hc-tax-field { min-width: 132px; white-space: nowrap; }
#view-hub-ct-form .hc-tax-static {
  height: 28px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0 12px;
  border: 1px dashed #d6d3d1;
  background: #faf9f8;
  color: #44403c;
  font-size: 12px;
  line-height: 1;
  white-space: nowrap;
  min-width: 96px;
  box-sizing: border-box;
}
#view-hub-ct-form .hc-tax-static::before { content: "🔒"; font-size: 11px; opacity: .55; }
/* ctlock3（2026-10-31）：合同弹窗字段标签不再被省略号截断（「合同金额（含税）」完整显示） */
#view-hub-ct-form .field > span {
  white-space: nowrap;
  overflow: visible;
  text-overflow: clip;
  flex: 0 0 auto;
}

/* ── plmcode1（2026-10-31 虫哥截图「物料代码 显示不全」）──────────────
   物料/产品资料卡的「物料代码」行里并排了「派生」「创建 BOM」两个按钮，
   把只读输入框挤到只剩几十像素，代码 2.02.00095 显示成 2.02.00。
   该行改为通栏（plm-span-2），并保证输入框吃掉剩余宽度、按钮不压缩。 */
#view-plm-form .plm-material-wrap .form-grid-2 > .field.plm-span-2 > input#plm-m-code,
#view-plm-form .plm-material-wrap .form-grid-2 > .field.plm-span-2 > input#plm-p-code {
  flex: 1 1 auto;
  min-width: 0;
}
#view-plm-form .plm-material-wrap .form-grid-2 > .field.plm-span-2 > .tb-btn {
  flex: 0 0 auto;
  white-space: nowrap;
}

/* ── bomsearch1（2026-10-31 虫哥「下拉框需要有搜索框才行」）────────────
   物料代码联想面板改成「顶部固定搜索框 + 下方可滚动列表」，只重绘列表，
   在面板里输入不会因重建 DOM 丢焦点。 */
.bom-mat-combo-panel.is-searchable {
  display: flex;
  flex-direction: column;
  overflow: hidden;
  padding: 0;
}
.bom-mat-combo-panel .bom-mat-search-wrap {
  flex: 0 0 auto;
  padding: 6px;
  background: #f8fafc;
  border-bottom: 1px solid #e5e7eb;
}
.bom-mat-combo-panel .bom-mat-search {
  width: 100%;
  height: 26px;
  box-sizing: border-box;
  border: 1px solid #cbd5e1;
  border-radius: 0;
  padding: 0 8px;
  font-size: 12px;
  font-family: inherit;
  background: #fff;
  color: #374151;
}
.bom-mat-combo-panel .bom-mat-search:focus {
  outline: none;
  border-color: #0f766e;
}
.bom-mat-combo-panel .bom-mat-list {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
}

/* ── orstack1（2026-11-01 虫哥「订单评审现在是 3 列并列，改为水平上中下 3 个区域」）────
   分栏方向由「左右三栏」改为「上下三段」：
     上 = 评审列表（合同行）／ 中 = 合同预览／ 下 = 评审内容。
   分隔条随之变成水平条（cursor:row-resize），高度百分比由 JS 写入
   --or-top-h / --or-mid-h；每段内部各自滚动，互不影响。 */
#pane-order-review .or-split {
  flex-direction: column;
}
#pane-order-review .or-list-col {
  flex: 0 0 var(--or-top-h, 28%);
  width: auto;
  max-width: none;
  min-width: 0;
  min-height: 120px;
}
#pane-order-review .or-preview-col {
  flex: 0 0 var(--or-mid-h, 34%);
  width: auto;
  max-width: none;
  min-width: 0;
  min-height: 120px;
}
#pane-order-review .or-review-col {
  flex: 1 1 auto;
  width: auto;
  max-width: none;
  min-width: 0;
  min-height: 140px;
}
/* 水平分隔条：占满整宽、6px 高，上下拖拽 */
#pane-order-review .or-splitter {
  flex: 0 0 6px;
  width: 100%;
  height: 6px;
  cursor: row-resize;
  border-left: 0;
  border-right: 0;
  border-top: 1px solid #f5f5f4;
  border-bottom: 1px solid #f5f5f4;
}
/* 三段之间加一道细边，视觉上区隔（列表底 / 预览顶） */
#pane-order-review .or-list-col { border-bottom: 1px solid #e7e5e4; }
#pane-order-review .or-preview-col { border-top: 0; }

/* ── or5row（2026-11-01 虫哥「上区域固定 5 行内容高度即可」）─────────────────
   上段列表高度 = 表头 28px + 5 行 × 28px + 1px 边框 = 169px（由 JS 实测写入
   --or-top-h，随行高变化自适应）；第一个分隔条降级为 1px 分隔线，不再可拖。
   中/下之间（#or-splitter2）仍然可以拖，调整预览与评审的高度。 */
#pane-order-review .or-list-col {
  flex: 0 0 var(--or-top-h, 169px);
}
#pane-order-review #or-splitter {
  flex: 0 0 1px;
  height: 1px;
  cursor: default;
  background: #e7e5e4;
  border: 0;
}
#pane-order-review #or-splitter:hover { background: #e7e5e4; }

/* ── orcard1（2026-11-01 虫哥「下区域改为左右横向移动，按卡片视图显示各部门」）──
   评审矩阵的各部门卡片改为「一排卡片 + 横向滚动」：卡片定宽 420px、等高、
   横向滚动条细样式；标题栏右侧带 ‹ › 翻页按钮。 */
#pane-order-review .or-rv-sections-title {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}
#pane-order-review .or-rv-nav-wrap { display: inline-flex; gap: 4px; }
#pane-order-review .or-rv-nav {
  width: 24px;
  height: 22px;
  line-height: 1;
  padding: 0;
  border: 1px solid #d6d3d1;
  background: #fff;
  color: #44403c;
  font-size: 13px;
  cursor: pointer;
}
#pane-order-review .or-rv-nav:hover { background: #f0fdfa; border-color: #0d9488; color: #0f766e; }
#pane-order-review .or-rv-nav:active { background: #ccfbf1; }

#pane-order-review .or-rv-cards {
  display: flex;
  /* orcard2：align-items 由 stretch 改 flex-start —— 等高拉伸会让项目少的部门卡下面空一大片 */
  align-items: flex-start;
  gap: 12px;
  overflow-x: auto;
  overflow-y: hidden;
  padding-bottom: 8px;
  scroll-behavior: smooth;
  scrollbar-width: thin;
}
#pane-order-review .or-rv-cards::-webkit-scrollbar { height: 8px; }
#pane-order-review .or-rv-cards::-webkit-scrollbar-track { background: #f5f5f4; }
#pane-order-review .or-rv-cards::-webkit-scrollbar-thumb { background: #d6d3d1; }
#pane-order-review .or-rv-cards::-webkit-scrollbar-thumb:hover { background: #a8a29e; }

#pane-order-review .or-rv-cards > .or-rv-dept-card {
  flex: 0 0 420px;
  width: 420px;
  max-width: 420px;
  margin-bottom: 0;
  display: flex;
  flex-direction: column;
}
/* 卡片内表格撑满卡片、表头不随横向滚动错位 */
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table {
  width: 100%;
  table-layout: fixed;
}
/* orcol1（2026-11-01 虫哥「评审项目列宽那么宽」）：显式列宽 —— 项目名最长 6 字（约 84px），
   30% 足够；把腾出的 20% 全部让给「综合评审记录」（意见 textarea / 勾选 / 填空更需要横向空间） */
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table col.col-item { width: 30%; }
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table col.col-record { width: 70%; }
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table td.rv-record {
  width: auto;
  max-width: none;
}

/* ── orfit1（2026-11-01 虫哥「把多余空间给到中区域，下区域保留最适合高度」）──────
   中段（合同预览）改为弹性铺满，下段（评审内容）固定为「合适高度」像素
   （默认 280px，由 JS 写 --or-bot-h；分隔条上下拖可直接调下段高度）。 */
#pane-order-review .or-preview-col {
  flex: 1 1 auto;
  min-height: 200px;
}
#pane-order-review .or-review-col {
  flex: 0 0 var(--or-bot-h, 280px);
  min-height: 140px;
  max-height: calc(100% - 172px - 240px);
}

/* ══ orlayout1（2026-11-01 虫哥「打破固有思维，按内容设计版面」）══════════════
   版面重排（替换原来的上中下三段）：
     左窄栏 330px（可拖）= 待评审合同列表：选合同的入口，纵向排列；
     右侧主区 = 顶部合同摘要条（一行 chips，明细按需展开）+ 评审工作区吃满剩余高度。
   设计依据：列表只有 3 列窄字段 → 不该占整行宽；合同信息重复度高的 10 项压成 chips；
   真正要干活的评审矩阵拿到最大高度。 */
#pane-order-review .or-split {
  flex-direction: row;
  align-items: stretch;
}
#pane-order-review .or-list-col {
  flex: 0 0 var(--or-side-w, 330px);
  width: var(--or-side-w, 330px);
  max-width: var(--or-side-w, 330px);
  min-width: 0;
  min-height: 0;
  border-right: 1px solid #e7e5e4;
  border-bottom: 0;
  background: #fcfcfb;
}
#pane-order-review .or-side-head {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 7px 10px;
  border-bottom: 1px solid #e7e5e4;
  background: #f5f5f4;
  font-size: 12px;
  font-weight: 600;
  color: #57534e;
}
#pane-order-review .or-side-count {
  font-weight: 600;
  color: #0f766e;
  background: #ccfbf1;
  padding: 0 7px;
  line-height: 17px;
}
#pane-order-review #or-splitter {
  flex: 0 0 5px;
  width: 5px;
  height: auto;
  cursor: col-resize;
  background: #e7e5e4;
  border: 0;
  border-left: 1px solid #f5f5f4;
  border-right: 1px solid #f5f5f4;
}
#pane-order-review #or-splitter:hover,
#pane-order-review #or-splitter.dragging { background: #0d9488; }

#pane-order-review .or-main-col {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
  background: #fff;
}

/* 合同摘要条：常驻一行，不挤占评审区 */
#pane-order-review #or-preview {
  flex: 0 0 auto;
  overflow: visible;
  padding: 0;
  border-bottom: 1px solid #e7e5e4;
  background: #fafaf9;
}
#pane-order-review .or-pv-bar {
  display: flex;
  flex-direction: column;
  gap: 5px;
  padding: 8px 14px 7px;
}
#pane-order-review .or-pv-line {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}
#pane-order-review .or-pv-name { font-size: 14px; font-weight: 650; color: #1c1917; }
#pane-order-review .or-pv-code {
  font-size: 12px;
  color: #78716c;
  background: #f5f5f4;
  border: 1px solid #e7e5e4;
  padding: 1px 6px;
}
#pane-order-review .or-pv-state {
  font-size: 12px;
  color: #0f766e;
  background: #f0fdfa;
  border: 1px solid #99f6e4;
  padding: 1px 7px;
}
#pane-order-review .or-pv-amt {
  font-size: 14px;
  font-weight: 650;
  color: #b91c1c;
  margin-left: auto;
}
#pane-order-review .or-pv-toggle {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  border: 1px solid #d6d3d1;
  background: #fff;
  color: #44403c;
  font-size: 12px;
  padding: 2px 9px;
  cursor: pointer;
}
#pane-order-review .or-pv-toggle:hover { border-color: #0d9488; color: #0f766e; }
#pane-order-review .or-pv-kvs {
  display: flex;
  flex-wrap: wrap;
  gap: 3px 16px;
  font-size: 12px;
  color: #57534e;
}
#pane-order-review .or-pv-kv {
  display: inline-flex;
  align-items: baseline;
  gap: 4px;
  white-space: nowrap;
}
#pane-order-review .or-pv-kv i { font-style: normal; color: #a8a29e; }

/* 评审工作区：吃掉主区全部剩余高度 */
#pane-order-review .or-review-col {
  flex: 1 1 auto;
  min-height: 0;
  max-height: none;
  background: #fff;
}
#pane-order-review .or-review { padding: 10px 14px 20px; }

/* 评审表字段区：2 列网格 → 紧凑 chips 行（10 项从 160px 压到约 60px） */
#pane-order-review .or-rv-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 16px;
  padding: 7px 12px;
  margin-bottom: 8px;
}
#pane-order-review .or-rv-meta .rv-item { flex: 0 1 auto; min-width: 0; }
#pane-order-review .or-rv-meta .rv-val { flex: 0 1 auto; max-width: 220px; }
#pane-order-review .or-rv-meta input.rv-val { width: 120px; }

/* ══ orpro1（2026-11-01 虫哥「方向是对的，能更专业一点」）══════════════════════
   专业化打磨：左栏变成真正的「选择器」（客户名 + 阶段徽章 + 待审/完成计数），
   摘要条分出主次（名称/编号/状态/金额 + 一行 kv），评审区分区标题带统计，
   部门卡片用左侧色条表达「已填/未填」，数字统一等宽。 */

/* —— 左栏头部 —— */
#pane-order-review .or-side-head {
  height: 34px;
  padding: 0 10px;
  background: #f8fafc;
  border-bottom: 1px solid #e7e5e4;
  letter-spacing: .2px;
}
#pane-order-review .or-side-count {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  background: none;
  padding: 0;
  font-size: 11.5px;
  font-weight: 400;
  color: #78716c;
}
#pane-order-review .or-side-count b {
  color: #0f766e;
  font-weight: 650;
  font-variant-numeric: tabular-nums;
}
#pane-order-review .or-side-count i {
  font-style: normal;
  color: #d6d3d1;
  margin: 0 3px;
}

/* —— 左栏列表：表头弱化、行像选择器 —— */
#pane-order-review #order-review-table thead th {
  height: 26px;
  padding: 0 8px;
  font-size: 11px;
  font-weight: 600;
  color: #a8a29e;
  background: #fafaf9;
  border-bottom: 1px solid #e8efee; /* orgrid2：与行线统一 */
  letter-spacing: .3px;
}
#pane-order-review #order-review-table tbody td {
  height: 30px;
  padding: 0 8px;
  font-size: 12px;
  color: #44403c;
  /* orgrid2：行线原来是 #f5f5f4（几乎看不见），统一成与明细弹窗/评审卡片同一条细线 #e8efee */
  border-bottom: 1px solid #e8efee;
  vertical-align: middle;
}
#pane-order-review #order-review-table tbody td.col-idx {
  color: #c7c2bd;
  font-size: 11px;
  font-variant-numeric: tabular-nums;
  text-align: center;
  padding: 0 4px;
  width: 34px;
}
#pane-order-review #order-review-table tbody tr { cursor: pointer; }
#pane-order-review #order-review-table tbody tr:hover td { background: #f8fafc; }
#pane-order-review #order-review-table tbody tr.or-row.selected td {
  background: #f0fdfa;
  color: #134e4a;
}
#pane-order-review #order-review-table tbody tr.or-row.selected td:first-child {
  box-shadow: inset 3px 0 0 #0f766e;
  color: #0f766e;
  font-weight: 600;
}
#pane-order-review .or-cust {
  display: block;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* —— 阶段徽章 —— */
#pane-order-review .or-stage {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  height: 18px;
  padding: 0 6px;
  font-size: 11px;
  line-height: 1;
  border: 1px solid #e7e5e4;
  background: #fafaf9;
  color: #78716c;
  white-space: nowrap;
}
#pane-order-review .or-stage.is-done { color: #0f766e; background: #f0fdfa; border-color: #99f6e4; }
#pane-order-review .or-stage.is-mid { color: #b45309; background: #fffbeb; border-color: #fde68a; }
#pane-order-review .or-stage.is-idle { color: #78716c; background: #f5f5f4; border-color: #e7e5e4; }
#pane-order-review .or-stage i {
  font-style: normal;
  font-weight: 650;
  font-variant-numeric: tabular-nums;
  opacity: .85;
}

/* —— 合同摘要条：主次分明 —— */
#pane-order-review .or-pv-bar {
  gap: 6px;
  padding: 9px 14px 8px;
  background: #fff;
}
#pane-order-review .or-pv-name {
  font-size: 15px;
  font-weight: 650;
  color: #1c1917;
  letter-spacing: .2px;
}
#pane-order-review .or-pv-code {
  font-family: Consolas, "Courier New", monospace;
  font-size: 11.5px;
  color: #78716c;
  background: #f8fafc;
  border: 1px solid #e7e5e4;
  padding: 1px 6px;
  letter-spacing: .3px;
}
#pane-order-review .or-pv-state {
  font-size: 11.5px;
  color: #0f766e;
  background: #f0fdfa;
  border: 1px solid #99f6e4;
  padding: 1px 7px;
}
#pane-order-review .or-pv-amt {
  font-size: 15px;
  font-weight: 650;
  color: #b91c1c;
  font-variant-numeric: tabular-nums;
  letter-spacing: .3px;
}
#pane-order-review .or-pv-toggle {
  height: 24px;
  padding: 0 10px;
  font-size: 11.5px;
  color: #57534e;
  border: 1px solid #e7e5e4;
  background: #fff;
  transition: all .15s;
}
#pane-order-review .or-pv-toggle:hover {
  border-color: #0f766e;
  color: #0f766e;
  background: #f0fdfa;
}
#pane-order-review .or-pv-kvs {
  gap: 2px 14px;
  font-size: 11.5px;
  color: #57534e;
}
#pane-order-review .or-pv-kv i { color: #b8b2ac; margin-right: 1px; }
#pane-order-review .or-pv-kv { font-variant-numeric: tabular-nums; }

/* —— 评审区标题/分区标题 —— */
#pane-order-review .or-review-head { margin-bottom: 2px; }
#pane-order-review .or-review-title {
  font-size: 13.5px;
  font-weight: 650;
  color: #1c1917;
  letter-spacing: .2px;
}
#pane-order-review .or-review-sub {
  font-size: 11.5px;
  color: #a8a29e;
  margin-bottom: 10px;
}
#pane-order-review .or-rv-sections-title {
  height: 30px;
  margin: 6px 0 8px;
  padding-bottom: 6px;
  border-bottom: 1px solid #e7e5e4;
}
#pane-order-review .or-sec-title {
  font-size: 12.5px;
  font-weight: 650;
  color: #334155;
  border-left: 3px solid #0f766e;
  padding-left: 8px;
  line-height: 15px;
}
#pane-order-review .or-sec-meta {
  flex: 1 1 auto;
  font-size: 11.5px;
  color: #a8a29e;
  padding-left: 4px;
}
#pane-order-review .or-sec-meta b {
  color: #0f766e;
  font-variant-numeric: tabular-nums;
}
#pane-order-review .or-rv-nav {
  width: 24px;
  height: 22px;
  border: 1px solid #e7e5e4;
  background: #fff;
  color: #57534e;
  font-size: 13px;
  line-height: 1;
}
#pane-order-review .or-rv-nav:disabled {
  opacity: .35;
  cursor: default;
  background: #fafaf9;
}

/* —— 部门卡片：左侧色条表达已填/未填 —— */
#pane-order-review .or-rv-dept-card {
  border: 1px solid #e7e5e4;
  background: #fff;
  margin-bottom: 0;
}
#pane-order-review .or-rv-dept-card.is-filled { box-shadow: inset 3px 0 0 #0f766e; }
#pane-order-review .or-rv-dept-card.is-empty { box-shadow: inset 3px 0 0 #e7e5e4; }
#pane-order-review .or-rv-dept-head {
  padding: 7px 10px;
  background: #f8fafc;
  border-bottom: 1px solid #e7e5e4;
}
#pane-order-review .or-rv-dept-name {
  font-size: 12.5px;
  font-weight: 650;
  color: #0f766e;
  letter-spacing: .2px;
}
#pane-order-review .or-rv-dept-signs { font-size: 11.5px; color: #78716c; }
#pane-order-review .or-rv-dept-signs .rv-concl,
#pane-order-review .or-rv-dept-signs .rv-sign {
  height: 22px;
  font-size: 11.5px;
  border-color: #d6d3d1;
}
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table th {
  height: 26px;
  font-size: 11px;
  color: #78716c;
  background: #fafaf9;
  letter-spacing: .2px;
}
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table td {
  font-size: 12px;
  line-height: 1.55;
}
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table td.rv-item-name {
  color: #57534e;
  background: #fcfcfb;
}

/* —— 评审表字段区：紧凑 chips —— */
#pane-order-review .or-rv-meta {
  background: #fafaf9;
  border: 1px solid #f0efee;
  padding: 7px 10px;
  gap: 3px 18px;
}
#pane-order-review .or-rv-meta .rv-label {
  font-size: 11px;
  color: #a8a29e;
}
#pane-order-review .or-rv-meta .rv-val {
  font-size: 12px;
  font-weight: 500;
  color: #292524;
  font-variant-numeric: tabular-nums;
}
#pane-order-review .or-rv-meta input.rv-val {
  height: 22px;
  padding: 0 6px;
  font-size: 12px;
  border-color: #e7e5e4;
}

/* orpro2（2026-11-01）：左栏表格改固定列宽 —— 原来 table-layout:auto + width:max-content，
   客户名一长表就超宽，「评审中 2/10」徽章被裁在可视区外。 */
#pane-order-review #order-review-table {
  table-layout: fixed;
  width: 100%;
  min-width: 0;
}
#pane-order-review #order-review-table th.col-idx,
#pane-order-review #order-review-table td.col-idx { width: 34px; }
#pane-order-review #order-review-table th[data-col="审核阶段"],
#pane-order-review #order-review-table td[data-col="审核阶段"] { width: 88px; }
#pane-order-review #order-review-table td[data-col="客户名称"] { overflow: hidden; }
#pane-order-review .or-cust { max-width: 100%; }

/* kv 之间加淡分隔点，长串信息可扫读 */
#pane-order-review .or-pv-kv + .or-pv-kv::before {
  content: "·";
  color: #d6d3d1;
  margin-right: 8px;
}
/* 机型常有多个型号，给宽一点 */
#pane-order-review .or-rv-meta input[data-rv-field="订单机型"] { width: 190px; }

/* orpro3（2026-11-01）微调：分区标题与统计之间留白、计数分隔点松一点、字段输入略宽 */
#pane-order-review .or-sec-meta { padding-left: 12px; }
#pane-order-review .or-side-count { gap: 6px; }
#pane-order-review .or-side-count i { margin: 0 5px; }
#pane-order-review .or-rv-meta input.rv-val { width: 128px; }

/* orpro4（2026-11-01）：合同状态按语义着色（待签署=琥珀 / 已审核或已转单=青 / 作废=红）；
   已填部门卡片头淡青底，与灰色未填卡片一眼区分 */
#pane-order-review .or-pv-state.is-pending { color: #b45309; background: #fffbeb; border-color: #fde68a; }
#pane-order-review .or-pv-state.is-ok { color: #0f766e; background: #f0fdfa; border-color: #99f6e4; }
#pane-order-review .or-pv-state.is-void { color: #b91c1c; background: #fef2f2; border-color: #fecaca; }
#pane-order-review .or-rv-dept-card.is-filled > .or-rv-dept-head { background: #f0fdfa; }
#pane-order-review .or-rv-dept-card.is-empty > .or-rv-dept-name { color: #78716c; }

/* ── orpro5（2026-11-01 虫哥「全部继续优化」）────────────────────────────────
   ① 左栏搜索框；② 转销售订单按钮移到合同摘要条（跟着当前合同）；③ 评审完成度细进度条。 */

/* ① 左栏搜索 */
#pane-order-review .or-side-search {
  flex: 0 0 auto;
  padding: 6px 8px;
  background: #fff;
  border-bottom: 1px solid #f0efee;
}
#pane-order-review .or-side-search input {
  width: 100%;
  height: 26px;
  box-sizing: border-box;
  padding: 0 26px 0 8px;
  font-size: 12px;
  font-family: inherit;
  color: #292524;
  background: #fafaf9 url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='13' height='13' viewBox='0 0 24 24' fill='none' stroke='%23a8a29e' stroke-width='2.4' stroke-linecap='round'><circle cx='10.5' cy='10.5' r='6.5'/><path d='M15.5 15.5 21 21'/></svg>") no-repeat 8px center;
  border: 1px solid #e7e5e4;
  outline: none;
  transition: border-color .15s, background-color .15s;
}
#pane-order-review .or-side-search input::placeholder { color: #b8b2ac; }
#pane-order-review .or-side-search input:focus {
  border-color: #0f766e;
  background-color: #fff;
  box-shadow: 0 0 0 2px rgba(15, 118, 110, .08);
}

/* ② 摘要条主按钮（转销售订单） */
#pane-order-review .or-pv-primary {
  height: 24px;
  padding: 0 12px;
  margin-left: 8px;
  font-size: 11.5px;
  font-weight: 600;
  color: #fff;
  background: #0f766e;
  border: 1px solid #0f766e;
  cursor: pointer;
  letter-spacing: .2px;
  transition: background .15s, border-color .15s;
}
#pane-order-review .or-pv-primary:hover:not(:disabled) { background: #115e59; border-color: #115e59; }
#pane-order-review .or-pv-primary:disabled {
  background: #f5f5f4;
  border-color: #e7e5e4;
  color: #b8b2ac;
  cursor: not-allowed;
}
#pane-order-review .or-pv-primary[hidden] { display: none !important; }

/* ③ 评审完成度进度条 */
#pane-order-review .or-sec-prog {
  flex: 0 0 auto;
  width: 72px;
  height: 4px;
  background: #e7e5e4;
  margin-right: 4px;
  overflow: hidden;
}
#pane-order-review .or-sec-prog i {
  display: block;
  height: 100%;
  background: #0f766e;
  transition: width .25s;
}

/* orpro6：搜索框文字与左侧放大镜图标重叠 → 左内边距让开图标 */
#pane-order-review .or-side-search input { padding: 0 26px 0 25px; }

/* orpro7：左栏客户名称左对齐（原来是居中，作为列表读起来别扭） */
#pane-order-review #order-review-table th[data-col="客户名称"],
#pane-order-review #order-review-table td[data-col="客户名称"] { text-align: left; }
#pane-order-review #order-review-table th[data-col="审核阶段"],
#pane-order-review #order-review-table td[data-col="审核阶段"] { text-align: left; }

/* orconv1（2026-11-01 虫哥「需要更新到已转订单」）：合同已有销售订单号时，
   左栏阶段徽章显示「已转订单」（蓝），与「评审完成」（青）区分开。 */
#pane-order-review .or-stage.is-converted {
  color: #1d4ed8;
  background: #eff6ff;
  border-color: #bfdbfe;
}

/* ── ordetail1（2026-11-01 虫哥「评估一下是否需要双滚动条」）────────────────
   合同明细改独立弹窗：主页面只保留一层滚动；弹窗内由 .modal-body 单层滚动
   （宽表横向也走这一层，不再出现"表内滚动 + 面板滚动 + 页面滚动"三层嵌套）。 */
#or-detail-modal .or-detail-card {
  width: min(1440px, 96vw);
  max-height: 88vh;
}
#or-detail-modal .modal-body {
  padding: 0 14px 12px;
}
#or-detail-modal .or-ct-table-wrap {
  max-height: none;
  overflow: visible;
  border: 0;
}
#or-detail-modal .or-preview-total {
  position: sticky;
  bottom: 0;
  background: #fff;
  padding: 8px 10px 6px;
  border-top: 1px solid #e7e5e4;
}

/* ordetail2：弹窗内明细表列宽（table-layout:fixed 下按列指定宽度），表头不换行，
   避免「产品型/号」「包装图/片」被挤成竖排。总宽 ≈1378 < 弹窗内容宽，无横向滚动。 */
#or-detail-modal .or-ct-table { table-layout: fixed; width: 100%; }
#or-detail-modal .or-ct-table th { white-space: nowrap; text-align: center; }
#or-detail-modal .or-ct-table th:nth-child(1) { width: 46px; }
#or-detail-modal .or-ct-table th:nth-child(2) { width: 104px; }
#or-detail-modal .or-ct-table th:nth-child(3) { width: 104px; }
#or-detail-modal .or-ct-table th:nth-child(4) { width: 126px; }
#or-detail-modal .or-ct-table th:nth-child(5) { width: 126px; }
#or-detail-modal .or-ct-table th:nth-child(6) { width: 22%; }
#or-detail-modal .or-ct-table th:nth-child(7) { width: 22%; }
#or-detail-modal .or-ct-table th:nth-child(8) { width: 66px; }
#or-detail-modal .or-ct-table th:nth-child(9) { width: 86px; }
#or-detail-modal .or-ct-table th:nth-child(10) { width: 86px; }

/* ── oorv1（2026-11-01 虫哥「上下行应该冒号对齐吧」）────────────────────────
   评审表字段区原来是 flex 自动换行：每个字段「标签+输入框」各自按内容宽排，
   上下列的冒号位置各不相同。改成 CSS Grid：
     · 外层 grid 等宽列（auto-fill，每列 ≥210px），行列都对齐；
     · 每个字段内部再两列：固定 66px 标签列（右对齐）+ 弹性值列
       → 同一列的冒号上下严格对齐，输入框左边缘也齐平。 */
#pane-order-review .or-rv-meta {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
  gap: 5px 14px;
  align-items: center;
  padding: 8px 12px;
}
#pane-order-review .or-rv-meta .rv-item {
  display: grid;
  grid-template-columns: 66px minmax(0, 1fr);
  align-items: center;
  gap: 6px;
  min-width: 0;
}
#pane-order-review .or-rv-meta .rv-label {
  width: 66px;
  text-align: right;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: 11.5px;
  color: #8a837c;
}
#pane-order-review .or-rv-meta .rv-val {
  width: 100%;
  min-width: 0;
  max-width: none;
}
#pane-order-review .or-rv-meta input.rv-val {
  width: 100%;
  height: 24px;
  box-sizing: border-box;
}

/* oorv2：标签列 66 → 78px（5 字标签 + 冒号不再截断）；列宽门槛 210 → 200px，
   1600 宽下刚好排成 5 列 × 2 行。 */
#pane-order-review .or-rv-meta {
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
#pane-order-review .or-rv-meta .rv-item { grid-template-columns: 78px minmax(0, 1fr); }
#pane-order-review .or-rv-meta .rv-label { width: 78px; }

/* oorv3：标签列 78 → 72px（5 字 + 冒号正好放下），列间距 6 → 4px，
   把省下的 8px 给值列，客户名「中深进出口有限公司」不再被省略。 */
#pane-order-review .or-rv-meta .rv-item { grid-template-columns: 72px minmax(0, 1fr); gap: 4px; }
#pane-order-review .or-rv-meta .rv-label { width: 72px; }

/* ── orjump1（2026-11-01 虫哥「把红框的部门名新增为快捷按钮」）────────────────────
   卡片区横向滚动，1600 宽下 10 个部门只露出 3 个，靠底部滚动条找部门太慢。
   标题行里插一排部门快捷按钮：点击把卡片滚到该部门，滚动时反同步高亮。
   · 实心点=该部门已填内容，空心点=未填；青字=我有权编辑的部门。
   · 按钮条自身可横向滚动（部门多时），不占额外行高（保持在标题行内）。 */
#pane-order-review .or-rv-sections-title { gap: 8px; }
#pane-order-review .or-sec-title { flex: 0 0 auto; }
#pane-order-review .or-sec-meta {
  flex: 0 0 auto;
  padding-left: 0;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
#pane-order-review .or-rv-jump {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 4px;
  overflow-x: auto;
  overflow-y: hidden;
  padding: 1px 0;
  scrollbar-width: none;
}
#pane-order-review .or-rv-jump::-webkit-scrollbar { height: 0; }
#pane-order-review .or-rv-jump-btn {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  height: 22px;
  padding: 0 8px;
  border: 1px solid #e7e5e4;
  background: #fff;
  color: #57534e;
  font-size: 11.5px;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
}
/* orjump6（2026-11-01 虫哥「按钮有个小方块，有什么意义」）：去掉按钮上的 5px 状态方块 ——
   它本意是「实心=该部门已填 / 空心=未填」，但没有任何图例、10 个部门全填时更是长得一模一样，
   纯属噪音。部门填没填，卡片头和「已填 n/N」已经说得够清楚了，按钮只保留名字（悬停 tooltip 仍带状态）。 */
#pane-order-review .or-rv-jump-btn.is-edit { color: #0f766e; border-color: #99f6e4; }
#pane-order-review .or-rv-jump-btn:hover { background: #f0fdfa; border-color: #5eead4; color: #0f766e; }
#pane-order-review .or-rv-jump-btn.is-on { background: #0f766e; border-color: #0f766e; color: #fff; }

/* orjump1 补充：窄屏（≤1440）部门按钮条会溢出 —— 右边缘淡出提示「后面还有」，
   同时把完成度细条收起，把宽度让给按钮（1600 下按钮正好排满一行，保留细条）。 */
#pane-order-review .or-rv-jump.is-overflow {
  mask-image: linear-gradient(to right, #000 calc(100% - 22px), transparent 100%);
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 22px), transparent 100%);
}
@media (max-width: 1440px) {
  #pane-order-review .or-rv-sections-title .or-sec-prog { display: none; }
}

/* orjump1 补充：全部部门都可编辑（admin）时不做青色强调，避免 10 个按钮全被染青成了噪音；
   只有存在「我填不了」的部门时，青色才是有信息量的「轮到我填」。 */
#pane-order-review .or-rv-jump.all-edit .or-rv-jump-btn.is-edit { color: #57534e; border-color: #e7e5e4; }
#pane-order-review .or-rv-jump.all-edit .or-rv-jump-btn.is-edit:hover { color: #0f766e; border-color: #5eead4; }
#pane-order-review .or-rv-jump.all-edit .or-rv-jump-btn.is-edit.is-on { color: #fff; border-color: #0f766e; }
/* 翻页按钮与统计之间留口气，别贴着进度条 */
#pane-order-review .or-rv-nav-wrap { margin-left: 4px; }

/* ── orfilter1（2026-11-01 虫哥「点击箭头位置，分别显示对应记录」）─────────────────
   审核阶段徽章 + 头部计数（待审/完成/已转）都是快捷筛选按钮：
   点一下只看该状态，再点一下取消。徽章加 hover 提示（虚线底）表示可点。 */
#pane-order-review .or-stage.is-click { cursor: pointer; }
#pane-order-review .or-stage.is-click:hover { box-shadow: inset 0 0 0 1px currentColor; }
#pane-order-review .or-stage.is-active {
  box-shadow: inset 0 0 0 1px currentColor;
  font-weight: 700;
}
#pane-order-review .or-side-count .or-cnt {
  cursor: pointer;
  padding: 1px 5px;
  border: 1px solid transparent;
}
#pane-order-review .or-side-count .or-cnt:hover { color: #0f766e; background: #f0fdfa; border-color: #99f6e4; }
#pane-order-review .or-side-count .or-cnt.is-active { background: #0f766e; border-color: #0f766e; color: #fff; }
#pane-order-review .or-side-count .or-cnt.is-active b { color: #fff; }

/* ordef1：选中态计数段尾部的小 ✕ —— 表明这是「可清除的筛选」而不是标题 */
#pane-order-review .or-side-count .or-cnt-x {
  font-style: normal;
  margin-left: 3px;
  font-size: 10px;
  opacity: .9;
}

/* ── orconv2（2026-11-01 虫哥「已转订单，红框内容要更新」）────────────────────
   合同已转销售订单时：摘要条徽章「已审核」→「已转订单」（蓝，与左栏同色），
   右上角「📦 转销售订单」→「✅ 已转订单」并置灰（这一步已经做过了）。 */
#pane-order-review .or-pv-state.is-converted {
  color: #1d4ed8;
  background: #eff6ff;
  border-color: #bfdbfe;
}
#pane-order-review .or-pv-primary.is-done {
  background: #eff6ff;
  border-color: #bfdbfe;
  color: #1d4ed8;
  cursor: default;
}

/* ── orgrid2（2026-11-01 虫哥「网格线统一为细线」）──────────────────────────
   原来卡片表格的格子线是 1px #d6d3d1（比页面其它地方深一档），而且表格外圈
   又跟卡片自己的 1px #e7e5e4 边框贴在一起，看上去像 2px 粗边。
   统一成和「合同明细弹窗」同一条细线 #e8efee，外圈只留卡片那一道边框。 */
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table th,
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table td {
  border: 1px solid #e8efee;
  padding: 5px 8px;
}
/* 外圈去重：上/左/右/下都不再叠卡片边框 */
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table thead th { border-top: 0; }
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table th:first-child,
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table td:first-child { border-left: 0; }
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table th:last-child,
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table td:last-child { border-right: 0; }
#pane-order-review .or-rv-cards > .or-rv-dept-card > .or-rv-dept-table tbody tr:last-child td { border-bottom: 0; }

/* ── custkw1（2026-11-01）：我的客户右上角关键词搜索框 ───────────────────── */
#customers-toolbar .cust-search {
  height: 26px;
  width: 232px;
  padding: 0 8px;
  border: 1px solid #e7e5e4;
  border-radius: 0;
  background: #fff;
  color: #292524;
  font-family: inherit;
  font-size: 12px;
  line-height: 24px;
  outline: none;
}
#customers-toolbar .cust-search::placeholder { color: #c7c2bd; }
#customers-toolbar .cust-search:focus { border-color: #0f766e; background: #fff; }
#customers-toolbar .cust-search::-webkit-search-cancel-button { cursor: pointer; }

/* ── hflimit1（2026-11-01）：筛选浮层只渲染前 120 项，底部给「再显示」 ─────────── */
.hf-more {
  display: flex;
  align-items: center;
  gap: 8px;
  justify-content: space-between;
  padding: 6px 8px;
  border-top: 1px dashed #e7e5e4;
  color: #a8a29e;
  font-size: 11.5px;
}
.hf-more-btn {
  padding: 4px 10px;
  font-size: 11.5px;
  border: 1px solid #99f6e4;
  background: #f0fdfa;
  color: #0f766e;
  cursor: pointer;
}
.hf-more-btn:hover { background: #ccfbf1; }

/* ── cfbar1（2026-11-01 虫哥「需要」）：我的客户「已筛条件」条 ────────────────
   一次能筛多列，但浮层每次只改一列、也没有地方看全 —— 这里把生效条件全摊开：
   点 chip 改这一列、点 ✕ 删除、右侧「清空筛选」一键回全量。 */
#pane-customers .cust-filter-bar {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
  padding: 5px 10px;
  background: #f0fdfa;
  border-bottom: 1px solid #ccfbf1;
  font-size: 11.5px;
  color: #0f766e;
}
#pane-customers .cust-filter-bar[hidden] { display: none !important; }
#pane-customers .cf-lead { font-weight: 600; color: #0f766e; padding-right: 2px; }
#pane-customers .cf-chip {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  height: 20px;
  padding: 0 2px 0 6px;
  background: #fff;
  border: 1px solid #99f6e4;
  color: #57534e;
  white-space: nowrap;
  cursor: pointer;
}
#pane-customers .cf-chip b { font-weight: 600; color: #0f766e; margin-right: 3px; }
#pane-customers .cf-chip:hover { border-color: #5eead4; background: #fff; }
#pane-customers .cf-chip.is-kw { border-style: dashed; }
#pane-customers .cf-x {
  font-style: normal;
  padding: 0 4px;
  color: #0f766e;
  opacity: .65;
  cursor: pointer;
}
#pane-customers .cf-x:hover { opacity: 1; background: #ccfbf1; }
#pane-customers .cf-clear {
  margin-left: auto;
  height: 20px;
  padding: 0 8px;
  border: 1px solid #99f6e4;
  background: #fff;
  color: #0f766e;
  font-size: 11.5px;
  cursor: pointer;
}
#pane-customers .cf-clear:hover { background: #ccfbf1; }

/* ── purdept1（2026-11-01 虫哥「采购申请 拆分为：采购部 品质部」）────────────────
   页签按部门分组：部门小标签 + 两组之间一道竖线；品质部只显示自己那组。 */
.pr-view-tabs { align-items: center; flex-wrap: wrap; }
/* purdept7：页签拍平 —— 组只用于按角色隐藏，不再有部门小标签/竖线，间距与页签一致 */
.pr-view-group { display: inline-flex; align-items: center; gap: 8px; }
.pr-view-group[hidden] { display: none !important; }

/* ── whdept1 / whdept4（2026-11-01 虫哥「新增 仓储部 / 应该新建生产部 / 必须的」）──────
   「生产制造」子菜单里新增两个部门折叠组（生产部 / 仓储部）：
     · 组头 = 图标 + 部门名 + ▸，缩进与普通菜单项图标列对齐（36px），点击展开/收起（不跳页）；
     · 组内菜单再缩进一档（52px），层级一眼可读；
     · 组内一项都不可见（无权限）时整组连组头一起隐藏（applyNavVisibility 处理）。 */
#mod-nav .nav-sub-group[hidden] { display: none !important; }
#mod-nav .nav-sub-group-head {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 5px 10px 5px 36px;
  background: transparent;
  border: 0;
  color: #57534e;
  font-family: inherit;
  font-size: 12px;
  font-weight: 600;
  line-height: 1.5;
  text-align: left;
  cursor: pointer;
}
#mod-nav .nav-sub-group-head:hover { background: #f5f5f4; color: #0f766e; }
#mod-nav .nav-sub-group-head.has-active { color: #0f766e; }
#mod-nav .nav-sub-group-label { flex: 1 1 auto; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#mod-nav .nav-sub-group-chevron {
  flex: 0 0 auto;
  font-size: 9px;
  color: #b0aaa4;
  transition: transform .15s ease;
}
#mod-nav .nav-sub-group-head[aria-expanded="true"] .nav-sub-group-chevron { transform: rotate(90deg); }
#mod-nav .nav-sub-group-body[hidden] { display: none !important; }
#mod-nav .nav-sub-group-body { padding: 1px 0 3px; }
#mod-nav .nav-sub-group-body .nav-sub-item { padding-left: 52px; }

/* ── bomseg1（2026-11-01 虫哥「做一个快速筛选按钮 外观与图2一样」）───────────────
   PLM 左树上方的状态分段筛选：一颗胶囊、内部按段分隔，选中段深金底白字（对齐参考图）。
   物料列表：全部 / 发布 / 草稿 / 停用 / 无 BOM；BOM 列表：去掉「无 BOM」。 */
#pane-plm .plm-bom-seg-wrap {
  display: flex;
  align-items: center;
  gap: 6px;
  /* segui1（2026-11-01 虫哥「调整一下排版UI」）：上下各留 8px —— 原来搜索框与分段条贴死，
     现在与搜索框（margin 8px）间距一致，左栏顶部呼吸均匀 */
  padding: 8px 8px;
  width: 100%;
  box-sizing: border-box;
}
/* 项目铁律：树行是 display:flex，会盖掉 [hidden] —— 筛选靠 hidden 隐藏，必须补这一条 */
#pane-plm .plm-tree .pt-leaf[hidden],
#pane-plm .plm-tree .pt-node[hidden],
#pane-plm .plm-tree .pt-children[hidden] { display: none !important; }
/* treew1（2026-11-01 虫哥「就按照当前区域宽度固定不动」）：
   树行宽度锁死在容器里 —— 长物料名不再把行撑宽、不出现横向滚动；名称走省略号，
   行尾状态徽章固定在右端，不论名称多长都在同一列。 */
#pane-plm .plm-tree { overflow-x: hidden; }
#pane-plm .plm-tree .pt-leaf,
#pane-plm .plm-tree .pt-row {
  width: 100%;
  box-sizing: border-box;
}
#pane-plm .plm-tree .pt-node,
#pane-plm .plm-tree .pt-children { min-width: 0; }
#pane-plm .plm-bom-seg-lead {
  flex: 0 0 auto;
  font-size: 11.5px;
  color: #94a3b8;
}
/* bomseg4：状态表加载失败提示 / 筛选空态（2026-11-01） */
#pane-plm .plm-bom-seg-hint {
  flex: 0 0 auto;
  font-size: 11.5px;
  color: #b45309;
  white-space: nowrap;
}
#pane-plm .plm-tree .plm-bom-seg-empty {
  padding: 22px 8px;
  text-align: center;
  color: #94a3b8;
}
#pane-plm .plm-bom-seg {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: stretch;
  height: 34px;
  background: #fff;
  border: 1px solid #e2e8f0;
  border-radius: 0;
  overflow: hidden;
}
#pane-plm .plm-bom-seg button {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 6px;
  border: 0;
  background: transparent;
  color: #475569;
  font-family: inherit;
  font-size: 12px;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
}
#pane-plm .plm-bom-seg button + button { border-left: 1px solid #e2e8f0; }
#pane-plm .plm-bom-seg button:hover { background: #f8fafc; }
#pane-plm .plm-bom-seg button.is-on {
  background: #a1711a;
  color: #fff;
  font-weight: 600;
}
#pane-plm .plm-bom-seg button.is-on:hover { background: #8f6416; }

/* ═══ plmgap1（2026-11-01 虫哥「借找找鉴类似系统」→「全部都做」）═══
   物料资料卡顶部信息条：库存 / 被使用 / 供应商 / 变更记录 入口 */
#pane-plm .plm-mat-live {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px 14px;
  margin: 0 0 8px;
  padding: 6px 8px;
  border: 1px solid #e2e8f0;
  border-left: 3px solid #0f766e;
  background: #f8fafc;
  font-size: 12px;
  color: #334155;
}
#pane-plm .plm-mat-live[hidden] { display: none !important; }
#pane-plm .plm-mat-live .plm-live-k { color: #94a3b8; }
#pane-plm .plm-mat-live .plm-live-item b { color: #0f766e; font-weight: 600; }
#pane-plm .plm-mat-live .plm-live-btn {
  border: 0;
  background: none;
  padding: 2px 4px;
  font-size: 12px;
  color: #0f766e;
  font-family: inherit;
  cursor: pointer;
}
#pane-plm .plm-mat-live .plm-live-btn:hover { background: #e6f4f2; }
#pane-plm .plm-mat-live .plm-live-btn b { color: #0f766e; }

/* 信息弹窗（Where-Used / 变更记录 / 供应商清单）—— 按钮在头部右侧，全站去圆角 */
.plm-info-modal {
  position: fixed;
  inset: 0;
  z-index: 12000;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(15, 23, 42, 0.35);
}
.plm-info-modal[hidden] { display: none !important; }
.plm-info-card {
  display: flex;
  flex-direction: column;
  width: min(920px, 92vw);
  max-height: 82vh;
  background: #fff;
  border: 1px solid #e2e8f0;
  box-shadow: 0 12px 32px rgba(15, 23, 42, 0.18);
}
.plm-info-head {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 8px 12px;
  border-bottom: 1px solid #e5e7eb;
}
.plm-info-title {
  margin-right: auto;
  font-size: 13px;
  font-weight: 600;
  color: #0f172a;
}
.plm-info-body {
  padding: 10px 12px;
  overflow: auto;
  font-size: 12px;
}
.plm-info-scroll { overflow: auto; }
.plm-info-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
.plm-info-table th,
.plm-info-table td {
  border: 1px solid #e5e7eb;
  padding: 4px 8px;
  text-align: left;
  white-space: nowrap;
}
.plm-info-table thead th {
  background: #f1f5f9;
  color: #475569;
  font-weight: 600;
}
.plm-info-table .num { text-align: right; }
.plm-info-table .c { text-align: center; }
.plm-info-table input {
  width: 100%;
  box-sizing: border-box;
  border: 1px solid #e2e8f0;
  padding: 3px 6px;
  font-size: 12px;
  font-family: inherit;
}
.plm-info-empty {
  padding: 18px 8px;
  text-align: center;
  color: #94a3b8;
}
.plm-info-foot {
  display: flex;
  gap: 8px;
  margin-top: 8px;
}

/* plmgap1：物料卡「采购 / 生产属性」两列紧凑排列（该容器内 .field 原本是标签在上，
   这里改成标签右对齐横排 + 定宽，和上面「基本信息」的视觉一致） */
#view-plm-form .plm-material-wrap .plm-ext-grid {
  /* 资料卡内部有更具体的 grid/field 规则在抢，这里用 !important 锁死两列（作用域仅本区块） */
  display: grid !important;
  grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
  gap: 6px 16px !important;
}
#view-plm-form .plm-material-wrap .plm-ext-grid > .field {
  display: flex !important;
  align-items: center !important;
  gap: 8px !important;
  min-width: 0;
}
#view-plm-form .plm-material-wrap .plm-ext-grid > .field > span {
  flex: 0 0 82px;
  text-align: right;
  white-space: nowrap;
  font-size: 12px;
  color: #64748b;
}
#view-plm-form .plm-material-wrap .plm-ext-grid > .field > input,
#view-plm-form .plm-material-wrap .plm-ext-grid > .field > select {
  flex: 1 1 auto;
  min-width: 0;
}

/* plmgap1：BOM 版本对比弹窗 */
.plm-diff-head {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: 8px;
  font-size: 12px;
  color: #334155;
}
.plm-diff-badge {
  padding: 1px 8px;
  font-size: 11.5px;
  border: 1px solid transparent;
}
.plm-diff-badge.add { background: #ecfdf5; color: #059669; border-color: #a7f3d0; }
.plm-diff-badge.del { background: #fef2f2; color: #dc2626; border-color: #fecaca; }
.plm-diff-badge.chg { background: #fffbeb; color: #b45309; border-color: #fde68a; }
.plm-diff-pick {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
  font-size: 12px;
  color: #475569;
}
.plm-diff-pick select {
  border: 1px solid #e2e8f0;
  padding: 3px 6px;
  font-size: 12px;
  font-family: inherit;
}
.plm-info-table tr.plm-diff-add > td { background: #f6fdf9; }
.plm-info-table tr.plm-diff-add > td:first-child { color: #059669; }
.plm-info-table tr.plm-diff-del > td { background: #fff7f7; }
.plm-info-table tr.plm-diff-del > td:first-child { color: #dc2626; }
.plm-info-table tr.plm-diff-chg > td { background: #fffdf5; }
.plm-info-table tr.plm-diff-chg > td:first-child { color: #b45309; }

/* plmgap1：ECN / 批量弹窗表单布局 */
.plm-ecn-form {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.plm-ecn-form > .field {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 12px;
}
.plm-ecn-form > .field > span {
  flex: 0 0 72px;
  text-align: right;
  color: #64748b;
}
.plm-ecn-form > .field > input,
.plm-ecn-form > .field > select,
.plm-ecn-form > .field > textarea {
  flex: 1 1 auto;
  min-width: 0;
  border: 1px solid #e2e8f0;
  padding: 4px 7px;
  font-size: 12px;
  font-family: inherit;
}
.plm-ecn-form > .field.plm-ecn-wide {
  align-items: flex-start;
}

/* plmgap1：物料树行前缩略图（无图的留占位，保证代码列对齐） */
#pane-plm .plm-tree .pt-leaf .pt-thumb {
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  margin-right: 6px;
  object-fit: cover;
  border: 1px solid #e2e8f0;
  background: #f1f5f9;
}
#pane-plm .plm-tree .pt-leaf .pt-thumb.is-empty {
  border-color: transparent;
  background: transparent;
}

/* plmgap1：条码标签（弹窗内预览 + 打印窗口同一套尺寸） */
.plm-label {
  width: 340px;
  margin: 0 auto;
  padding: 10px 12px;
  border: 1px solid #cbd5e1;
  text-align: center;
  background: #fff;
}
.plm-label-name { font-size: 13px; font-weight: 600; color: #0f172a; margin-bottom: 6px; }
.plm-label-barcode svg { max-width: 100%; height: auto; }
.plm-label-code { font-family: Consolas, "Courier New", monospace; font-size: 14px; letter-spacing: 2px; margin-top: 4px; color: #0f172a; }
.plm-label-meta { font-size: 11px; color: #64748b; margin-top: 2px; }

/* plmgap1：ECN 执行结果逐条日志 */
.plm-ecn-logline {
  padding: 2px 0;
  font-size: 12px;
  color: #334155;
  border-bottom: 1px dashed #eef2f7;
}

/* custleft1（2026-11-01 虫哥「公海客户 列表的表头以及内容均靠左对齐」）：
   公海页整表左对齐；行号/勾选列保留居中（序号贴左不好看），表头同步左对齐 */
#customers-table.is-left th,
#customers-table.is-left td {
  text-align: left;
}
#customers-table.is-left th.col-idx,
#customers-table.is-left td.col-idx,
#customers-table.is-left th.col-sel,
#customers-table.is-left td.col-sel {
  text-align: center;
}

/* bomreq2（2026-11-01 虫哥「发布时，工序不能为空」）：发布校验不过时缺工序的明细行标红。
   坑：明细表 td 背景被 `:is(#plm-split-right #view-plm-form.plm-quick-bom, #view-quick-bom)
   #plm-bom-detail-table td{background:#fff!important}`（3id 级）压着，工序 select 的
   border-color 被同族 `td>select{border-color:currentColor!important}`（3id 级）压着 ——
   所以这里必须用同等或更高特异性的祖先前缀 + !important 才盖得住，普通写法实测无效。 */
#plm-bom-detail-table tbody tr.is-miss-proc > td {
  background: #fee2e2;
}
:is(#plm-split-right #view-plm-form.plm-quick-bom, #view-quick-bom) #plm-bom-detail-table tbody tr.is-miss-proc > td,
:is(#view-plm-form, #view-quick-bom) #plm-bom-detail-table tbody tr.is-miss-proc > td {
  background: #fee2e2 !important;
}
#plm-bom-detail-table tbody tr.is-miss-proc > td.col-idx {
  background: #fecaca;
  color: #b91c1c;
  font-weight: 700;
}
:is(#plm-split-right #view-plm-form.plm-quick-bom, #view-quick-bom) #plm-bom-detail-table tbody tr.is-miss-proc > td.col-idx,
:is(#view-plm-form, #view-quick-bom) #plm-bom-detail-table tbody tr.is-miss-proc > td.col-idx {
  background: #fecaca !important;
  color: #b91c1c !important;
  font-weight: 700;
}
#plm-bom-detail-table tbody tr.is-miss-proc [data-k="工序"] {
  border-color: #f87171 !important;
  box-shadow: 0 0 0 2px rgba(248, 113, 113, 0.22);
  background: #fff;
}
:is(#plm-split-right #view-plm-form.plm-quick-bom, #view-quick-bom) #plm-bom-detail-table tbody tr.is-miss-proc > td > select[data-k="工序"],
:is(#view-plm-form, #view-quick-bom) #plm-bom-detail-table tbody tr.is-miss-proc > td > select[data-k="工序"] {
  border-color: #f87171 !important;
  background: #fff5f5 !important;
  box-shadow: 0 0 0 2px rgba(248, 113, 113, 0.22);
}

/* bomhead1（2026-11-01 虫哥「BOM编号 显示位置不协调」）：
   物料代码字段一旦有「派生」按钮（:has 命中），就会走 17798 的 flex-wrap + align-items:flex-end。
   换行 flex 容器的 align-content 默认是 normal(=stretch)，于是每条 flex 行都被拉高、
   行内再底对齐 → 标签被压到第 1 行底部、值掉到第 2 行底部：
   实测 1600px 窗口下 物料代码 标签 y=140 / 输入 y=192，而其它字段统一是 y=111 / y=132，
   整块比邻居低 29~52px（窄栏更明显，就是虫哥截图里那个"往下掉一块"的 BOM编号）。
   改成顶部堆叠：标签与其它字段同线，值紧随其下，派生按钮再往下。 */
#plm-split-right #view-plm-form.plm-quick-bom #plm-form-bom > .form-grid-2 > .field:has(#btn-plm-derive-bom:not([hidden])) {
  align-content: flex-start !important;
  align-items: flex-start !important;
}

/* ═══════════════════════════════════════════════════════════════════════════
   nav201（2026-11-01 虫哥「调整一下左侧导航栏，感觉不够专业，找找类似系统最新的风格」）

   参照当前主流 B 端规范（Arco Design Menu / Ant Design 5 Navigation / 2026 sidebar UX 指南）：
     · 侧栏宽度 200/220/240/260（原来只有 140 → 中文标签被截成「生…」「订单列…」）
     · 菜单项高度 36~40，左右 padding 12，图标 16~20 与文字同列
     · 二级菜单做缩进（16~24）+ 字号略小，层级一眼可读
     · 分组标题是小号弱化标签，不是链接
     · 选中态 = 品牌色浅底 + 左侧 3px 强调条 + 加粗，悬浮态只做轻微灰底
     · 图标统一为同一套线性图标（1.7px 描边、16px），颜色比文字弱一档
   全站「去圆角」规则继续遵守：所有态都是直角，不加圆角。
   ═══════════════════════════════════════════════════════════════════════════ */
:root { --nav-w: 160px; } /* nav201f（虫哥「160px」）：180 → 160，shell-main 同步；三级缩进同步收到 42 腾字宽 */

/* ① 宽度：140 → 224（收起态仍 48，图标条不变） */
#view-shell:not([hidden]) .nav-popup:not(.collapsed),
.nav-popup.open,
.nav-popup.locked { width: var(--nav-w); }
#view-shell:not([hidden]) .shell-main { margin-left: var(--nav-w); }
.nav-popup { border-right: 1px solid #eef2f7; }

/* ② 滚动条：默认那条又粗又黑，换成细浅灰并禁掉横向滚动 */
.nav-popup-main,
.nav-popup-list {
  overflow-x: hidden;
  scrollbar-width: thin;
  scrollbar-color: #cbd5e1 transparent;
}
.nav-popup-main::-webkit-scrollbar,
.nav-popup-list::-webkit-scrollbar { width: 6px; height: 0; }
.nav-popup-main::-webkit-scrollbar-track,
.nav-popup-list::-webkit-scrollbar-track { background: transparent; }
.nav-popup-main::-webkit-scrollbar-thumb,
.nav-popup-list::-webkit-scrollbar-thumb { background: #cbd5e1; }

/* ③ 列表容器与一级菜单项 */
#mod-nav { padding: 6px 8px 12px; }
#mod-nav .nav-item,
#mod-nav .nav-group-toggle {
  gap: 10px;
  padding: 0 10px;
  min-height: 38px;
  font-size: 13px !important;
  color: #334155;
  line-height: 1.4;
}
#mod-nav .nav-item > span:not(.nav-ico):not(.nav-badge),
#mod-nav .nav-group-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }

/* ④ 图标：统一线性、16px、弱化色；选中/悬浮时跟随文字色 */
#mod-nav .nav-ico {
  width: 18px;
  height: 18px;
  color: #94a3b8;
  transition: color 0.15s ease;
}
#mod-nav .nav-ico svg { width: 16px; height: 16px; display: block; }
#mod-nav .nav-item:hover .nav-ico,
#mod-nav .nav-item.active .nav-ico,
#mod-nav .nav-group-toggle:hover .nav-ico,
#mod-nav .nav-group-toggle.is-open .nav-ico,
#mod-nav .nav-group-toggle.has-active .nav-ico,
#mod-nav .nav-sub-group-head:hover .nav-ico,
#mod-nav .nav-sub-group-head.has-active .nav-ico { color: inherit; }

/* ⑤ 悬浮 / 选中态（选中：浅底 + 左侧 3px 强调条 + 加粗） */
#mod-nav .nav-item:hover,
#mod-nav .nav-group-toggle:hover { background: #f1f5f9; color: #0f766e; }
#mod-nav .nav-item.active {
  background: #e6f4f2;
  color: #0f766e;
  font-weight: 600;
  box-shadow: inset 3px 0 0 #0f766e;
}
#mod-nav .nav-group-toggle.is-open,
#mod-nav .nav-group-toggle.has-active { color: #0f766e; font-weight: 600; }
#mod-nav .nav-group-chevron { font-size: 10px; color: #cbd5e1; }
#mod-nav .nav-group-toggle:hover .nav-group-chevron,
#mod-nav .nav-group-toggle.is-open .nav-group-chevron { color: #94a3b8; }

/* ⑥ 二级菜单：缩进 28px（一级文字列 38px 内退一档），图标再小一号 */
#mod-nav .nav-sub { padding: 2px 0 4px; }
#mod-nav .nav-sub-item { padding-left: 28px; }
#mod-nav .nav-sub-item .nav-ico { width: 16px; height: 16px; }
#mod-nav .nav-sub-item .nav-ico svg { width: 14px; height: 14px; }

/* ⑦ 部门折叠组（PMC / 生产部 / 仓储部）：弱化成小号分组标签，组内再缩进一档 */
#mod-nav .nav-sub-group-head {
  gap: 8px;
  padding: 0 10px 0 28px;
  min-height: 32px;
  font-size: 12px !important;
  font-weight: 500;
  color: #64748b;
}
#mod-nav .nav-sub-group-head .nav-ico { width: 16px; height: 16px; color: #a8a29e; }
#mod-nav .nav-sub-group-head .nav-ico svg { width: 14px; height: 14px; }
#mod-nav .nav-sub-group-head:hover { background: #f1f5f9; color: #0f766e; }
#mod-nav .nav-sub-group-body .nav-sub-item { padding-left: 48px; }

/* ⑧ 分组之间留白，菜单块与用户卡之间也留一口气 */
#mod-nav .nav-group + .nav-group,
#mod-nav .nav-item + .nav-group { margin-top: 2px; }
.nav-popup-user { padding: 10px 14px; }
.nav-popup-sep { background: #eef2f7; }

/* nav201b：细节收口 */
/* 分组折叠箭头太小像一粒灰，放大到 12px 并与部门组箭头同色 */
#mod-nav .nav-group-chevron { font-size: 12px; color: #b6c2cf; }
#mod-nav .nav-sub-group-chevron { font-size: 11px; }
/* 一级分组之间加一条极淡分隔线，块与块之间才有结构感（不是靠空白硬挤） */
#mod-nav .nav-group + .nav-item,
#mod-nav .nav-group + .nav-group,
#mod-nav .nav-item + .nav-group {
  border-top: 1px solid #f1f5f9;
  margin-top: 6px;
  padding-top: 6px;
}
/* 底部「退出登录」：独立成页脚动作区，不再贴着最后一个菜单项 */
.nav-popup-logout {
  border-top: 1px solid #eef2f7;
  padding: 11px 18px 12px;
  font-size: 12.5px;
  letter-spacing: 0.02em;
}
.nav-popup-logout:hover { background: #fef2f2; }

/* nav201f（2026-11-01 虫哥「160px」）：160 下三级菜单只剩 ~60px 文本宽，
   把二级/三级缩进各收 6px（28→24、48→42），把省下的宽度让给文字，避免「订单列表」贴边。 */
#mod-nav .nav-sub-item { padding-left: 24px; }
#mod-nav .nav-sub-group-head { padding-left: 24px; }
#mod-nav .nav-sub-group-body .nav-sub-item { padding-left: 42px; }
/* 用户卡在窄栏里也不能挤：名字/角色单行省略 */
.nav-popup-user-meta { min-width: 0; }
.nav-popup-name,
.nav-popup-role { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* nav201g：160px 下用户卡「角色: admin」被省略号吃掉 → 收紧内边距与间距把字宽让出来 */
.nav-popup-user { padding: 10px 10px; gap: 8px; }
.nav-popup-role { font-size: 11.5px; }

/* actleft1（2026-11-01 虫哥「列表内容/表头 均靠左对齐」——最新跟进）：
   全站 .data-table th/td 默认 text-align:center，跟进表内容又多又长（内容/备注/定位），
   居中读起来很散。这里整表左对齐，只保留行号列居中。 */
/* 实际渲染的表格 id 是 #crm-latest-table（kind=crm_activity），CRM 内嵌 hub 列表用的是 #hub-act-table，
   两个都覆盖；再加一条按 data-col-kind 兜底，避免以后再换 id 就失效。 */
#crm-latest-table th,
#crm-latest-table td,
#hub-act-table th,
#hub-act-table td,
table[data-col-kind="crm_activity"] th,
table[data-col-kind="crm_activity"] td { text-align: left; }
#crm-latest-table th.col-idx,
#crm-latest-table td.col-idx,
#hub-act-table th.col-idx,
#hub-act-table td.col-idx,
table[data-col-kind="crm_activity"] th.col-idx,
table[data-col-kind="crm_activity"] td.col-idx { text-align: center; }

/* actleft3（2026-11-01 虫哥确认「需要」）：CRM 同组件列表（样品管理 / 报价管理 / 合同管理 / 产品明细）
   与「最新跟进」统一左对齐。这些表都由同一个渲染器生成，统一带 .crm-hub-data-table 类，
   用类选择器一次覆盖，不逐个写 id（以后新增同类列表自动生效）。
   保留行号 col-idx 与操作列 col-ops 居中（序号/按钮贴左反而难看）。 */
.data-table.crm-hub-data-table th,
.data-table.crm-hub-data-table td,
.data-table[data-col-kind="sample_slip"] th,
.data-table[data-col-kind="sample_slip"] td { text-align: left; }
.data-table.crm-hub-data-table th.col-idx,
.data-table.crm-hub-data-table td.col-idx,
.data-table.crm-hub-data-table th.col-ops,
.data-table.crm-hub-data-table td.col-ops,
.data-table[data-col-kind="sample_slip"] th.col-idx,
.data-table[data-col-kind="sample_slip"] td.col-idx,
.data-table[data-col-kind="sample_slip"] th.col-ops,
.data-table[data-col-kind="sample_slip"] td.col-ops { text-align: center; }

/* bomio1（2026-11-03 虫哥「需要提供 BOM 表标准的导入导出接口，具体实现形式，可以是 xls、csv、接口等」）：
   BOM 页「⬆ 导入 / ⬇ 导出 / 📄 模板」的格式菜单 + 导入弹窗（DOM 由 plm_bom.js 懒建）。
   遵循全站去圆角 + 12px 字号；结果表用 sticky 表头，长清单滚动时列名不丢。 */
.bom-io-menu {
  position: fixed;
  z-index: 9999;
  width: 288px;
  background: #fff;
  border: 1px solid #d1d5db;
  box-shadow: 0 10px 30px rgba(15, 23, 42, .16);
  padding: 4px;
}
.bom-io-menu button {
  display: block;
  width: 100%;
  text-align: left;
  background: #fff;
  border: 0;
  padding: 8px 10px;
  cursor: pointer;
}
.bom-io-menu button + button { border-top: 1px solid #f1f5f9; }
.bom-io-menu button:hover { background: #f0fdfa; }
.bom-io-menu b { display: block; font-size: 12px; color: #1f2937; font-weight: 600; }
.bom-io-menu span { display: block; font-size: 11px; color: #6b7280; margin-top: 2px; }

/* BOM 明细弹窗自身 z-index:2600（#view-quick-bom），导入弹窗必须压它一层，
   否则从明细弹窗点「⬆ 导入」会开在底下看不见（2026-11-03 实测）。 */
#view-bom-io { z-index: 2700; }
#view-bom-io .bom-io-card {
  width: min(900px, 96vw);
  max-height: 88vh;
  display: flex;
  flex-direction: column;
}
#view-bom-io .modal-body { overflow: auto; }
#view-bom-io .bom-io-run {
  background: #0f766e;
  border: 1px solid #0f766e;
  color: #fff;
  font-weight: 600;
}
#view-bom-io .bom-io-run[disabled] { opacity: .6; cursor: default; }
/* 弹窗里的「⬇ 模板」是次级按钮：给个边框，别缩成一行标签（首屏实测像纯文字） */
#view-bom-io #btn-bom-io-tpl {
  flex: 0 0 auto;
  white-space: nowrap;
  border: 1px solid #d1d5db;
  background: #fff;
  color: #374151;
  padding: 6px 10px;
}
#view-bom-io #btn-bom-io-tpl:hover { background: #f3f4f6; border-color: #9ca3af; }

.bom-io-row { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 10px; }
.bom-io-label { width: 66px; flex: 0 0 66px; color: #374151; font-weight: 600; padding-top: 8px; }
.bom-io-drop {
  flex: 1;
  min-height: 46px;
  border: 1px dashed #94a3b8;
  background: #f8fafc;
  display: flex;
  align-items: center;
  padding: 0 12px;
  color: #64748b;
  cursor: pointer;
}
.bom-io-drop:hover, .bom-io-drop.drag { border-color: #0f766e; background: #f0fdfa; color: #0f766e; }
.bom-io-drop span.picked { color: #0f172a; font-weight: 600; }

.bom-io-modes { flex: 1; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
.bom-io-modes.is-two { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.bom-io-mode {
  display: flex;
  gap: 6px;
  align-items: flex-start;
  border: 1px solid #e5e7eb;
  padding: 7px 9px;
  cursor: pointer;
  background: #fff;
}
.bom-io-mode:has(input:checked) { border-color: #0f766e; background: #f0fdfa; }
.bom-io-mode input { margin: 3px 0 0; flex: 0 0 auto; }
/* 文字必须包一层再 flex:1 + min-width:0 —— 直接让 <b> 当 flex item 会按内容宽度收缩，
   「覆盖更新」被压成「覆盖/更新」两行（2026-11-03 首屏实测）。 */
.bom-io-mode-text { flex: 1 1 auto; min-width: 0; display: block; }
.bom-io-mode b { display: block; font-size: 12px; color: #1f2937; white-space: nowrap; }
.bom-io-mode i { display: block; font-style: normal; font-size: 11px; color: #6b7280; line-height: 1.45; margin-top: 2px; }

.bom-io-hint {
  margin: 2px 0 12px;
  font-size: 12px;
  color: #6b7280;
  line-height: 1.6;
  background: #f8fafc;
  border-left: 3px solid #99f6e4;
  padding: 8px 10px;
}
.bom-io-result { border-top: 1px solid #e5e7eb; padding-top: 10px; }
.bom-io-stats { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
.bom-io-stat { border: 1px solid #e5e7eb; background: #fff; padding: 4px 9px; color: #374151; }
.bom-io-stat b { color: #0f172a; }
.bom-io-stat.ok b { color: #15803d; }
.bom-io-stat.warn b { color: #b45309; }
.bom-io-stat.bad b { color: #b91c1c; }
.bom-io-dry { background: #fef3c7; color: #92400e; padding: 4px 9px; }

.bom-io-tablewrap { max-height: 300px; overflow: auto; border: 1px solid #e5e7eb; }
.bom-io-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.bom-io-table th {
  position: sticky;
  top: 0;
  background: #f1f5f9;
  text-align: left;
  padding: 6px 8px;
  border-bottom: 1px solid #e5e7eb;
  white-space: nowrap;
}
.bom-io-table td { padding: 5px 8px; border-bottom: 1px solid #f1f5f9; vertical-align: top; }
.bom-io-table td.num { text-align: right; }
.bom-io-table tr.is-failed td { background: #fef2f2; }
.bom-io-table tr.is-skipped td { background: #fffbeb; }

.bom-io-warnbox { margin-bottom: 8px; border: 1px solid #fde68a; background: #fffbeb; padding: 6px 9px; color: #92400e; }
.bom-io-warnbox.err { border-color: #fecaca; background: #fef2f2; color: #b91c1c; }
.bom-io-warnbox summary { cursor: pointer; font-weight: 600; }
.bom-io-warnbox ul { margin: 6px 0 0 16px; padding: 0; max-height: 160px; overflow: auto; }
.bom-io-warnbox li { line-height: 1.6; }
.bom-io-fatal { background: #fef2f2; color: #b91c1c; border: 1px solid #fecaca; padding: 10px; }

/* bomio4（2026-11-03 虫哥「导入呢」）：明细弹窗「⬆ 导入」的目标提示条 —— 明确这次导入写的是哪条 BOM。
   ⚠️ display:flex 会盖掉 [hidden]，必须补一条 [hidden]{display:none!important}（老坑）。 */
.bom-io-target {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  background: #f0fdfa;
  border-left: 3px solid #0f766e;
  padding: 7px 10px;
  margin-bottom: 10px;
  color: #0f766e;
}
.bom-io-target[hidden] { display: none !important; }
.bom-io-target b { color: #0f172a; }
.bom-io-target span { color: #475569; font-size: 11px; }

/* salesown1（2026-11-03 虫哥「销售员仅可以看见自己的订单评审」）：
   主管打开组员的评审单时是只读的，顶部给一条原因提示（浅黄，不抢眼但看得见）。 */
.or-ro-tip {
  margin: 0 0 8px;
  padding: 7px 10px;
  font-size: 12px;
  line-height: 1.5;
  color: #92400e;
  background: #fffbeb;
  border-left: 3px solid #d97706;
}

/* maildom1（2026-11-03 虫哥「业务在用 mfine.net，其他人在用 mfine.work」）：
   个人邮箱上方的「你该用哪个域」提示条 + 第二身份区块 + 系统设置里的分域台账。
   遵循全站：12px 字号、去圆角、细边框。 */
.mail-domain-tip {
  margin: 0 0 10px;
  padding: 7px 10px;
  font-size: 12px;
  line-height: 1.55;
  color: #0f766e;
  background: #f0fdfa;
  border-left: 3px solid #0f766e;
}
.mail-domain-tip.is-lock {
  color: #1e40af;
  background: #eff6ff;
  border-left-color: #1d4ed8;
}
.mail-domain-tip.is-warn {
  color: #92400e;
  background: #fffbeb;
  border-left-color: #d97706;
}
.mail-domain-tip.is-both {
  color: #5b21b6;
  background: #f5f3ff;
  border-left-color: #7c3aed;
}

.mail-alt-box {
  margin-top: 12px;
  padding: 10px 12px;
  border: 1px solid #e2e8f0;
  background: #fafafa;
}
.mail-alt-box[hidden] { display: none !important; }
.mail-alt-box.is-locked { opacity: .72; }
.mail-alt-head {
  display: flex;
  align-items: baseline;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 8px;
}
.mail-alt-head b { font-size: 12px; color: #1f2937; }
.mail-alt-actions {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 8px;
}
.mail-alt-actions .btn { white-space: nowrap; }

/* maildom1：系统设置「分域邮箱」统计条、部门映射、台账行（12px / 去圆角） */
.mail-domain-stat {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 12px;
  font-size: 12px;
  color: #374151;
}
.mail-dom-stat {
  border: 1px solid #e5e7eb;
  background: #fff;
  padding: 4px 9px;
}
.mail-dom-stat b { color: #0f172a; }
.mail-dom-stat.ok b { color: #15803d; }
.mail-dom-stat.warn b { color: #b45309; }
.mail-dom-stat.bad b { color: #b91c1c; }

.mail-domain-cfg {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 16px;
  border: 1px solid #e2e8f0;
  background: #fafafa;
  padding: 12px;
  margin-bottom: 12px;
}
@media (max-width: 1100px) {
  .mail-domain-cfg { grid-template-columns: minmax(0, 1fr); }
}
.mail-domain-cfg-title {
  font-size: 12px;
  font-weight: 600;
  color: #1f2937;
  margin-bottom: 6px;
}
.mail-domain-rules {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 6px 10px;
  max-height: 258px;
  overflow: auto;
}
.mail-dom-dept {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
}
.mail-dom-dept > span {
  flex: 0 0 68px;
  color: #4b5563;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.mail-dom-dept select {
  flex: 1 1 auto;
  min-width: 0;
  font-size: 12px;
  padding: 2px 4px;
  border: 1px solid #d1d5db;
  background: #fff;
}

.mail-dom-badge {
  font-size: 11px;
  padding: 1px 6px;
  border: 1px solid #e5e7eb;
  background: #fff;
  color: #374151;
  white-space: nowrap;
}
.mail-dom-badge.is-net { border-color: #bfdbfe; background: #eff6ff; color: #1d4ed8; }
.mail-dom-badge.is-work { border-color: #ddd6fe; background: #f5f3ff; color: #6d28d9; }
.user-mail-email.is-empty { color: #9ca3af; }
.user-mail-badge.is-lock { border-color: #bfdbfe; background: #eff6ff; color: #1d4ed8; }
.mail-dom-sel {
  flex: 0 0 auto;
  font-size: 11px;
  padding: 2px 4px;
  border: 1px solid #d1d5db;
  background: #fff;
  max-width: 210px;
}
.mail-identity-sel {
  max-width: 420px;
  font-size: 12px;
}
