/* ===================================================================
   发货核对台账 · 设计系统 v2
   v192 配色 方案A「云端蓝」（对标腾讯云）
   主色 var(--brand) · 悬停 var(--brand-d) · 浅 var(--brand-soft) · 侧栏 var(--sidebar)
   背景 #F5F7FA · 卡片 #FFF · 线 #E3E8EF · 正文 #1A2233 · 次要 #637086
   语义 成功 #00A870 / 警告 #F59E0B / 危险 #E34D59 · 差异行 var(--diff-bg) + var(--diff-text)
   侧栏宽 196px · 间距 8px 栅格 · v195 全站直角 · 桌面侧栏 / 移动底部导航
   换色铁律：新增颜色一律走变量；写死色必须与本节保持同一色系，改色时同步 grep。
   =================================================================== */
:root{
  --primary:var(--brand); --primary-d:var(--brand-d); --primary-soft:var(--brand-soft);
  --sidebar:#FFFFFF; --sidebar-line:#E3E8EF;
  --sidebar-w:196px;                       /* v167：侧栏收窄，更紧凑；收起态仍由 .sidebar.collapsed 覆盖为 64px */
  --bg:#F5F7FA; --card:#ffffff; --line:#E3E8EF;
  --text:#1A2233; --muted:#637086;
  --ok:#00A870; --ok-bg:#E6F9F2;
  --warn:#F59E0B; --warn-bg:#FEF3E2;
  --danger:#E34D59; --danger-bg:#FDECEE;
  --diff-bg:#FCF0F4; --diff-line:#F3C6C6; --warn-strip-bg:#FFF9F2;
  --brand:#0052D9; --brand-d:#0043B0; --brand-soft:#E8F0FE; --brand-soft2:#EAF1FB;
  --brand-hover:#C7D8F5; --brand-line:#BFD3F5; --brand-tint:#F5F8FD; --grid:#CFDBEC;
  --car-text:#0B2F6B; --grade:#003C9E; --lv2-text:#4A5A70;
  --sidebar-text:#1A2233; --sidebar-muted:#637086;
  --zero-text:#8894A6;             /* 差异为 0 的弱化灰；独立语义色，不跟侧栏走 */
  --diff-text:#B03A00; --diff-bg-hover:#F9E2EC; --diff-line2:#EFC9DA;
  --brand-ring:rgba(0,82,217,.13);
  --r-sm:0px; --r-md:0px; --r-lg:0px;      /* v195：全站直角 */
  --foot-h:42px;                          /* v195：底部白条与侧栏收起条等高，左右横线对齐 */
  --shadow:0 1px 3px rgba(11,26,51,.06),0 1px 2px rgba(11,26,51,.04);
  --topbar-h:56px; --bottomnav-h:58px;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  background:var(--bg);color:var(--text);font-size:15px;line-height:1.55;
  -webkit-tap-highlight-color:transparent}
.hidden{display:none !important}
.muted{color:var(--muted)}
.sm-text{font-size:12.5px}
.req,.req-star{color:var(--danger);font-style:normal;margin-left:2px}

/* ---------- 按钮 ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  height:40px;padding:0 16px;border-radius:var(--r-sm);border:1px solid transparent;
  font-size:14.5px;font-weight:600;cursor:pointer;transition:.15s;user-select:none;font-family:inherit}
.btn:active{transform:scale(.98)}
.btn.primary{background:var(--primary);color:#fff}
.btn.primary:hover{background:var(--primary-d)}
.btn.ghost{background:#fff;color:var(--text);border-color:var(--line)}
.btn.ghost:hover{border-color:var(--primary);color:var(--primary)}
.btn.danger{background:#fff;color:var(--danger);border-color:#f3b6b6}
.btn.danger:hover{background:var(--danger-bg)}
.btn.success{background:var(--ok);color:#fff}
.btn.success:hover{background:#008A5C}
.btn.warn{background:#fff;color:var(--warn);border-color:#f3d9a8}
.btn.warn:hover{background:var(--warn-bg)}

/* ---------- 仓库审批人配置 ---------- */
.wa-card{border:1px solid var(--line);border-radius:var(--r-md);padding:12px 14px;margin-bottom:12px;background:var(--card)}
.wa-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.wa-head b{font-size:15px}
.wa-del{border:none;background:transparent;color:var(--muted);font-size:20px;line-height:1;cursor:pointer;padding:0 4px}
.wa-del:hover{color:var(--danger)}
.wa-users{display:flex;flex-wrap:wrap;gap:8px}
.wa-users .chip span{height:34px;padding:0 14px}
.wa-name{margin-bottom:8px;max-width:240px}
.btn.sm{height:34px;padding:0 12px;font-size:13px}
.btn.lg{height:46px;font-size:16px;border-radius:var(--r-md)}
.btn.block{display:flex;width:100%;margin-top:12px}
.btn[disabled]{opacity:.55;pointer-events:none}
.save-hint{font-size:12px;color:var(--muted);line-height:1.5;margin-top:10px;padding:0 4px}

/* ---------- 表单控件 ---------- */
.inp{width:100%;height:36px;padding:0 10px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:#fff;font-size:15px;color:var(--text);outline:none;transition:.15s;font-family:inherit}
textarea.inp{height:auto;min-height:76px;padding:10px 12px;resize:vertical}
.inp:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--brand-ring)}
.inp.invalid{border-color:var(--danger);box-shadow:0 0 0 3px rgba(227,77,89,.10)}
/* 日期字段统一左对齐（移动端 WebKit 默认居中，需显式覆盖） */
input[type="date"]{text-align:left;direction:ltr}
select.inp{appearance:none;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23637086' stroke-width='2' fill='none'/%3E%3C/svg%3E") no-repeat right 12px center}
.f-label{display:block;font-size:13px;color:var(--muted);margin:14px 0 6px}

/* ---------- 登录 ---------- */
/* v194：登录页渐变独立于侧栏（侧栏已改纯白，不能再拿它当渐变的深色起点） */
.login-bg{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:16px;
  background:linear-gradient(160deg,#1A2233 0%,var(--brand-d) 60%,var(--brand) 100%)}
.login-card{width:100%;max-width:380px;background:var(--card);border-radius:0;padding:34px 28px;
  box-shadow:0 20px 50px rgba(0,0,0,.35);text-align:center}
/* v169：登录图标换成盛虹 logo（透明底 PNG），容器留 10px 内边距、图片等比 contain */
.login-logo{width:64px;height:64px;border-radius:0;background:var(--primary-soft);
  display:flex;align-items:center;justify-content:center;margin:0 auto 12px;padding:10px}
.login-logo img{width:100%;height:100%;object-fit:contain;display:block}
.login-card h1{font-size:21px;margin-bottom:2px}
.login-card .sub{color:var(--muted);font-size:13px;margin-bottom:8px}
.login-card #loginForm{margin-top:14px}
.login-card .field-row{text-align:left;margin-bottom:14px}
.login-card .f-label{margin:0 0 6px}
.login-card .inp{height:48px;font-size:16px;text-align:left}
.login-card .btn{margin-top:6px;height:48px;font-size:16px}
.login-card .hint{color:var(--muted);font-size:12px;margin-top:16px;line-height:1.7}
/* 密码框右侧显隐按钮 */
.pwd-wrap{position:relative}
.pwd-wrap .inp{padding-right:46px}
.pwd-toggle{position:absolute;right:6px;top:50%;transform:translateY(-50%);
  width:36px;height:36px;border:none;background:transparent;font-size:18px;cursor:pointer;
  display:flex;align-items:center;justify-content:center;border-radius:0}
.pwd-toggle:active{background:var(--primary-soft)}
/* 记住账号 */
.login-card .remember{display:flex;align-items:center;gap:6px;justify-content:flex-start;
  font-size:13.5px;color:var(--muted);margin:2px 0 4px;cursor:pointer;user-select:none}
.login-card .remember input{width:16px;height:16px;accent-color:var(--primary)}

/* ---------- 外壳布局 ---------- */
.shell{display:flex;min-height:100vh}
.sidebar{
  width:var(--sidebar-w,228px);flex-shrink:0;background:var(--sidebar);color:var(--sidebar-text);
  display:flex;flex-direction:column;position:sticky;top:0;height:100vh;
  transition:width .25s ease;overflow:hidden}
.sidebar.collapsed{--sidebar-w:64px}
.sidebar.collapsed .brand{justify-content:center;padding-left:0;padding-right:0}
.sidebar.collapsed .brand-txt{display:none}
.sidebar.collapsed .nav-item{justify-content:center;padding-left:0;padding-right:0}
.sidebar.collapsed .nav-item .txt{display:none}
.sidebar.collapsed .sidebar-toggle .toggle-txt{display:none}
.sidebar.collapsed .toggle-ico{transform:rotate(180deg)}
.sidebar.collapsed #verTag{display:none}
/* v195：品牌卡片与右侧顶栏等高（--topbar-h），两条 border-bottom 连成一条贯穿线 */
.brand{display:flex;gap:10px;align-items:center;height:var(--topbar-h);flex-shrink:0;
  padding:0 16px;border-bottom:1px solid var(--sidebar-line);transition:.25s}
/* v170：品牌图标换盛虹 logo（深色侧栏上红色标志清晰）；收起态由 .sidebar.collapsed 居中规则接管 */
.brand-logo{font-size:24px;display:flex;align-items:center}
.brand-logo img{width:26px;height:26px;object-fit:contain;display:block}
.brand-txt b{display:block;color:var(--text);font-size:14.5px;line-height:1.3}
.brand-txt small{font-size:11.5px;color:var(--sidebar-muted)}
.nav{padding:12px 10px;display:flex;flex-direction:column;gap:4px;flex:1}
.nav-item{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:var(--r-sm);
  background:none;color:var(--sidebar-text);font-size:14.5px;cursor:pointer;text-align:left;transition:.15s;font-family:inherit}
.nav-item:hover{background:var(--sidebar-line);color:var(--text)}
.nav-item.active{background:var(--brand-soft);color:var(--brand);font-weight:600}
.nav-item .ico{font-size:17px;width:22px;text-align:center;flex-shrink:0}
.sidebar-toggle{display:flex;align-items:center;justify-content:center;gap:6px;height:var(--foot-h);border:none;background:transparent;color:var(--sidebar-muted);font-size:13px;cursor:pointer;border-top:1px solid var(--sidebar-line);transition:.2s;font-family:inherit;margin-top:auto}
.sidebar-toggle:hover{color:var(--text);background:var(--sidebar-line)}
/* v195：版本号绝对定位到收起条右侧、不再单独占一行高度；
   收起条与右侧底部白条等高 => 两条顶部横线落在同一水平线 */
#verTag{position:absolute;right:12px;bottom:12px;padding:0 !important;pointer-events:none}
.toggle-ico{display:inline-block;transition:transform .25s ease}

/* v174：侧栏可展开分组（历史数据/当日数据 → 合并页/明细页），样式对齐参考系统：
   父项带右箭头，展开旋转；子项缩进、窄字；溢出省略；收起态整体隐藏 */
/* v220（黄哥）：10px 的 ▾ 小到看不见，放大一号到 12px（与 .adv-caret/.dd-caret 同档） */
.nav-caret{margin-left:auto;font-size:12px;line-height:1;color:var(--sidebar-muted);transition:transform .2s ease}
.nav-item.expanded .nav-caret{transform:rotate(180deg)}
.nav-item.expanded{background:var(--sidebar-line);color:var(--text)}
.nav-sub{display:flex;flex-direction:column;gap:2px;padding:2px 10px 6px 22px}
.nav-sub.hidden{display:none}
.nav-child{padding:8px 10px;font-size:13px;color:var(--sidebar-muted)}
.nav-child:hover{background:var(--sidebar-line);color:var(--text)}
.nav-child.active{background:var(--brand-soft);color:var(--brand);font-weight:600}
.nav-child .txt,.nav-parent .txt{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sidebar.collapsed .nav-sub,#app.sidebar-collapsed .nav-sub{display:none}
.sidebar.collapsed .nav-caret,#app.sidebar-collapsed .nav-caret{display:none}

.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{height:var(--topbar-h);background:var(--card);border-bottom:1px solid var(--line);
  display:flex;align-items:center;justify-content:space-between;padding:0 20px;position:sticky;top:0;z-index:10}
.topbar h1{font-size:17px;font-weight:700;letter-spacing:.3px}
.topbar.date-open{z-index:70}
.topbar:has(.theme-menu:not(.hidden)){z-index:70}
.topbar.menu-open{z-index:70}   /* v209：不支持 :has() 的老浏览器兜底 */
.top-right{display:flex;align-items:center;gap:8px}
.top-right #appUser{white-space:nowrap}
/* v209：查找项整合为「高级查找」——默认只留搜索 + 高级查找 + 仓库授权 */
.filter-primary{display:flex;align-items:center;gap:8px;margin-left:auto}
/* v227：折叠层取消，四个条件常显在第二行（仓库 → 日期 → 差异 → 重置）。
   桌面端随筛选卡挤进顶栏同一行；手机端由下方断点改成独占整行、紧凑排布。 */
.filter-row2{display:flex;align-items:center;gap:14px;flex:0 1 auto;min-width:0}
.filter-row2 #fWarehouse{min-width:96px;max-width:150px;flex:0 1 auto}
.filter-row2 .date-range{width:auto;flex:none}
.filter-row2 .switch-line{flex:none}
.filter-primary:empty{display:none}
/* v209：手机顶栏「⋯」菜单（桌面端隐藏，容器由 JS 切换） */
.top-more{position:relative;display:flex;align-items:center;flex:none}
#btnTopMore{font-size:18px;line-height:1;padding:0 10px}
.more-menu{position:absolute;right:0;top:calc(100% + 6px);z-index:80;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r-md);box-shadow:0 12px 30px rgba(11,26,51,.18);
  padding:8px;min-width:140px;display:flex;flex-direction:column;gap:6px}
.more-menu .btn{width:100%;justify-content:flex-start}
/* v143（黄哥 2026-11-02，只改网页版）：桌面端台账页把「发货台账」标题行与搜索筛选行合成一整行。
   筛选卡由 JS 搬进顶栏并加 .in-topbar，这里把它褪成无边框透明，整体压缩到一条线；
   手机端（<900）JS 不搬、这些规则不生效，维持原来的标题 + 筛选卡两行。 */
@media (min-width:900px){
  .topbar.has-filters{height:auto;min-height:var(--topbar-h);padding:7px 18px;gap:14px}
  .topbar.has-filters h1{flex:0 0 auto;font-size:16px;white-space:nowrap}
  #listFilterCard.in-topbar{flex:1 1 auto;min-width:0;margin:0;padding:0;
    border:0;background:transparent;box-shadow:none;border-radius:0}
  #listFilterCard.in-topbar .filters{gap:8px}
  #listFilterCard.in-topbar .search-wrap{flex:1 1 150px;min-width:110px}
  #listFilterCard.in-topbar .search-inp{height:34px}
  /* 搜索框吃掉剩余宽度，右边控件紧凑连排（不再用 margin-left:auto 把按钮组推远） */
  #listFilterCard.in-topbar .ledger-tabs{padding:3px;margin:0}
  #listFilterCard.in-topbar .ltab{padding:4px 11px;font-size:12.5px}
  #listFilterCard.in-topbar .switch-text{font-size:12.5px;white-space:nowrap}
  #listFilterCard.in-topbar .btn.sm{padding:4px 9px}
  /* v151：顶栏里的日期区间框收窄，别把单行撑爆 */
  #listFilterCard.in-topbar .date-range .inp{width:112px;height:34px;padding:0 6px}
  #listFilterCard.in-topbar .date-sep{color:var(--muted);font-size:12px}
  /* v199：顶栏里再给仓库下拉压一压，别把单行撑爆 */
  #listFilterCard.in-topbar #fWarehouse{min-width:100px;max-width:130px;flex:0 1 120px;height:34px}
}
.content{flex:1;padding:20px 22px 28px;max-width:1440px;width:100%;margin:0 auto;transition:max-width .25s ease}

/* ---------- 移动端底部导航 ---------- */
.bottomnav{display:none;position:fixed;left:0;right:0;bottom:0;height:calc(var(--bottomnav-h) + env(safe-area-inset-bottom));
  padding-bottom:env(safe-area-inset-bottom);background:var(--card);border-top:1px solid var(--line);z-index:30}
.bn-item{flex:1;border:none;background:none;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:2px;color:var(--muted);font-size:11px;cursor:pointer;font-family:inherit;white-space:nowrap}
.bn-item .ico{font-size:20px;line-height:1;position:relative}
.bn-item.active{color:var(--primary);font-weight:600}
/* v210：底部导航加到 7 项，320px 窄屏（iPhone SE）字号与图标再收一档，避免文字被裁 */
@media(max-width:359px){.bn-item{font-size:10px}.bn-item .ico .lico{width:17px;height:17px}}
.ver-mobile{display:none}

/* ---------- 卡片 ---------- */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:var(--shadow);margin-bottom:16px}
.card.pad{padding:16px}
.card-title{font-size:14.5px;margin-bottom:12px;color:var(--text)}
.toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}

/* ---------- 表单 ---------- */
.field{position:relative;margin-bottom:10px}
.field label{display:flex;align-items:center;font-size:13px;color:var(--muted);margin-bottom:4px}
.grp-tag{font-size:11px;color:var(--primary);background:var(--primary-soft);border-radius:0;
  padding:1px 6px;margin-left:8px;font-weight:600}
.field-hint{font-size:12px;color:var(--muted);margin-top:5px}
.field .other-inp{margin-top:8px}
/* 自定义下拉（替代原生 select，避免移动端气泡遮挡/串字段） */
.dd{position:relative;width:100%}
/* 原生 select 仅作值容器，必须彻底隐藏；display:none 加 !important 防止被 select.inp 等覆盖 */
.dd-native{display:none !important;position:absolute;opacity:0;width:0;height:0;pointer-events:none;border:0;padding:0}
.dd-trigger{display:flex;align-items:center;justify-content:space-between;width:100%;height:36px;padding:0 10px;border:1px solid var(--line);border-radius:var(--r-sm);background:#fff;font-size:14.5px;color:var(--text);cursor:pointer;text-align:left;font-family:inherit;-webkit-tap-highlight-color:transparent}
.dd-trigger.open{border-color:var(--primary);box-shadow:0 0 0 3px var(--brand-ring)}
.dd-trigger .dd-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dd-caret{color:var(--muted);font-size:12px;margin-left:8px;flex:none}
.dd-pop{position:absolute;z-index:100;left:0;right:0;top:calc(100% + 4px);background:#fff;border:1px solid var(--line);border-radius:var(--r-sm);box-shadow:0 12px 30px rgba(11,26,51,.18);max-height:240px;overflow:auto;padding:4px}
.dd-pop.hidden{display:none}
.dd-item{padding:10px 10px;border-radius:0;font-size:14px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-tap-highlight-color:transparent}
.dd-item:hover,.dd-item:active{background:#F0F3F7}
.dd-item.sel{background:var(--brand-soft);color:var(--primary);font-weight:600}
.form-card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:var(--shadow);padding:16px;margin-bottom:16px}
.form-grid{display:grid;grid-template-columns:1fr;gap:0 16px}
.group-head{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.group-head .bar{width:4px;height:16px;border-radius:0;background:var(--primary)}
.group-head b{font-size:14.5px}
.group-head small{color:var(--muted);font-size:12px}
.scanfill{display:flex;gap:8px}
.scanfill .inp{flex:1}
.scanfill .btn{flex-shrink:0}
.multi{display:flex;flex-wrap:wrap;gap:8px}
.chip{position:relative}
.chip input{position:absolute;opacity:0;pointer-events:none}
.chip span{display:inline-flex;align-items:center;height:38px;padding:0 18px;border-radius:0;
  border:1px solid var(--line);background:#fff;font-size:14px;cursor:pointer;transition:.15s;user-select:none}
.chip input:checked + span{background:var(--primary-soft);border-color:var(--primary);color:var(--primary);font-weight:600}
.chip input:checked + span::before{content:"✓";display:inline-flex;align-items:center;justify-content:center;
  width:16px;height:16px;border-radius:50%;background:var(--primary);color:#fff;font-size:10px;margin-right:6px;flex:none}
.chip input:not(:checked) + span::before{content:"＋";display:inline-flex;align-items:center;justify-content:center;
  width:16px;height:16px;border-radius:50%;background:#E3E8EF;color:#6B7A90;font-size:12px;margin-right:6px;flex:none}
.auto-note{background:var(--primary-soft);border:1px dashed var(--brand-line);border-radius:var(--r-sm);
  padding:10px 12px;font-size:13px;color:var(--primary-d);margin-bottom:14px}
.auto-preview{background:#F5F7FA;border:1px solid var(--line);border-radius:var(--r-sm);
  padding:10px 12px;font-size:13.5px;color:var(--text);margin-bottom:16px}
/* 一车多单（v62）：本车录制中横条 + 共性锁定灰显 */
.trip-banner{display:flex;align-items:center;justify-content:space-between;gap:10px;
  background:var(--brand-soft);border:1px solid var(--brand-line);border-radius:0;padding:11px 14px;margin-bottom:12px;
  font-size:13.5px;color:var(--brand-d);font-weight:600}
.trip-banner.hidden{display:none}
.trip-locked{background:#F0F3F7 !important;color:#6B7A90 !important;cursor:not-allowed;pointer-events:none}
.trip-head-row td{background:var(--brand-soft);color:var(--brand-d);font-weight:600;font-size:13px;
  padding:9px 12px;border-bottom:1px solid var(--brand-line)}
.rec.trip-head{background:var(--brand-soft);border-color:var(--brand-line);color:var(--brand-d);font-weight:600;
  font-size:13.5px;cursor:default;box-shadow:none}
/* v64 同车合并：折叠合并行 + 子单 */
.trip-summary{cursor:pointer;user-select:none}
.trip-summary-cell{background:var(--brand-soft);color:var(--brand-d);font-weight:600;font-size:13px;
  padding:10px 12px;border-bottom:1px solid var(--brand-line)}
.rec.trip-summary{background:var(--brand-soft);border-color:var(--brand-line);color:var(--brand-d);font-weight:600;
  font-size:13.5px;cursor:pointer;padding:11px 14px;margin-bottom:0}
/* 缺关键字段提示（订单号/件数/重量任一缺失） */
tr.miss{background:#fff7ed}
tr.miss:hover{background:#ffedd5}
.rec.miss{background:#fff7ed;border-color:#fed7aa}
.miss-tag{display:inline-block;background:#f97316;color:#fff;font-size:11px;
  font-weight:600;padding:1px 7px;border-radius:0;margin-left:6px}
.preview-diff-count{display:inline-block;background:#fde68a;color:#92400e;padding:1px 8px;border-radius:0;margin:0 2px}
.preview-diff-weight{display:inline-block;background:var(--brand-soft2);color:var(--grade);padding:1px 8px;border-radius:0;margin:0 2px}

/* ---------- 筛选 ---------- */
/* v95：筛选区布局优化——条件与操作按钮分成两组，操作组靠右，不再挤成孤零零一行 */
.filters{display:flex;flex-wrap:wrap;gap:10px 12px;align-items:center}
.filters .inp{width:auto;min-width:150px;flex:1;height:34px}
.filters select.inp{min-width:130px;flex:0 1 auto}
#fWarehouse{min-width:120px;max-width:170px}
#whBox table.tbl{min-width:0}   /* v199：弹层里表格别被 min-width:900px 撑爆 */
#whValidUntil{width:auto;flex:0 1 180px;min-width:150px}
#fReset{margin-left:auto}
.date-range{position:relative;display:flex;align-items:center;gap:6px}
.date-range .inp{width:140px;flex:none}
/* v196：起止两个日期框收进一个入口按钮，弹层里仍是原来两个 date 输入，筛选逻辑不变 */
.date-btn{height:34px;padding:0 10px;white-space:nowrap;gap:6px}
.date-btn .date-ico{width:15px;height:15px;flex:none}
.date-btn.on{background:var(--brand-soft);color:var(--brand);border-color:var(--brand-line)}
.date-pop{position:absolute;top:calc(100% + 6px);left:0;z-index:60;min-width:272px;
  background:#fff;border:1px solid var(--line);box-shadow:0 8px 24px rgba(11,26,51,.14);padding:12px}
.date-pop-hd{font-size:12px;color:var(--muted);margin-bottom:8px}
.date-pop-row{display:flex;align-items:center;gap:6px;margin-bottom:10px}
.date-pop-row label{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);white-space:nowrap}
.date-pop .btn{width:100%;height:30px;font-size:12px}
/* 顶栏搬入态：压过 .in-topbar .date-range .inp 的窄宽度，否则弹层里日期显示不全 */
#listFilterCard.in-topbar .date-pop .inp{width:132px;height:32px;padding:0 6px;font-size:12px}
.chk{display:flex;align-items:center;gap:5px;font-size:13.5px;color:var(--muted);white-space:nowrap;cursor:pointer}
.chk input{width:16px;height:16px;accent-color:var(--primary)}
.chk-grid{display:flex;flex-wrap:wrap;gap:8px 14px;margin-top:4px;max-height:168px;overflow:auto;padding:8px;border:1px solid var(--border);border-radius:6px}
.wh-tags{display:flex;flex-wrap:wrap;gap:4px;max-width:230px}

/* v128：筛选卡优化 —— 搜索框占满一行+内置放大镜，仅看差异做成开关 */
.filters{gap:12px}
.search-wrap{position:relative;flex:1 1 220px;min-width:0;display:flex;align-items:center}
.search-wrap .search-ico{position:absolute;left:12px;width:16px;height:16px;color:var(--muted);pointer-events:none}
.search-wrap .search-inp{width:100%;height:38px;padding-left:36px}
/* v136：已取消 filter-row2 包裹，搜索框/仅看差异开关/重置·设置 三个元素直接平铺进 .filters 同一行 */
.filter-actions{display:flex;align-items:center;gap:8px;margin-left:auto}
.filter-actions #fReset{margin-left:0}
.switch-line{display:flex;align-items:center;gap:8px;cursor:pointer;user-select:none}
.switch-text{font-size:13.5px;color:var(--muted)}
.switch{position:relative;display:inline-block;width:42px;height:24px;flex:none}
.switch input{position:absolute;inset:0;margin:0;opacity:0;width:100%;height:100%;cursor:pointer}
/* v194：开关轨道不能再借 --sidebar-text（侧栏改纯白后它变深色，轨道会变黑） */
.switch .track{position:absolute;inset:0;background:#D5DCE6;border-radius:0;transition:background .2s}
.switch .track::before{content:"";position:absolute;left:2px;top:2px;width:20px;height:20px;background:#fff;border-radius:50%;box-shadow:0 1px 2px rgba(11,26,51,.25);transition:transform .2s}
.switch input:checked + .track{background:var(--primary)}
.switch input:checked + .track::before{transform:translateX(18px)}
/* v137：台账子标签（合并页 / 明细页）—— 仅桌面端显示，手机端由下方媒体查询隐藏，维持原混合视图 */
.ledger-tabs{display:flex;gap:0;margin:0 0 12px;background:#F0F3F7;border-radius:var(--r-md);padding:4px;width:fit-content}
.ledger-tabs .ltab{padding:8px 22px;font-size:14px;font-weight:600;color:var(--muted);cursor:pointer;border-radius:0;user-select:none;transition:.15s}
.ledger-tabs .ltab:hover{color:var(--primary)}
.ledger-tabs .ltab.active{background:#fff;color:var(--primary);box-shadow:0 1px 3px rgba(11,26,51,.12)}
/* v144：子标签移到筛选行最左边（顺序：合并/明细 → 搜索 → 仅看差异 → 重置 → 设置），间隔交给 flex gap */
.filters .ledger-tabs{margin:0;flex:0 0 auto}
/* v138：手机端筛选栏恢复"上一版"两行布局 —— 搜索框独占一行(满宽)，仅看差异+重置·设置在第二行；
   撤销 v136 的 flex-wrap:nowrap 单行硬塞（那版把搜索框压窄、仅看差异文字竖排、设置图标压字）。
   桌面端(>=900)仍保持 v136 的单行。同时保留 v137：手机端隐藏台账子标签栏。 */
@media (max-width:899px){
  .filters{flex-wrap:wrap}
  .search-wrap{flex:1 1 100%}
  #ledgerTabs{display:none}
  /* v196：手机端保留「日期」入口按钮（弹层内仍是起止两个日期框）；窄屏让弹层横向铺满 */
  #fDateRange{display:flex}
  .date-pop{left:0;right:0;min-width:0}
  #fDatePop .inp{width:auto;flex:1 1 0;min-width:0}
  #fDatePop .date-pop-row{flex-wrap:wrap}
  #fDatePop .date-pop-row label{flex:1 1 100%}
  #fDatePop .date-pop-row .date-sep{display:none}   /* v209：日期改单列两行，窄屏不再顶宽溢出 */
  /* v199：新增下拉同样给 42px 触摸目标 + 16px 字号（防 iOS 聚焦缩放），不能用容器 display:none 藏 */
  #fWarehouse{flex:0 1 150px;height:42px;font-size:16px}
  /* v199：审核有效期日期框同样占满一行，触摸友好 */
  #whValidUntil{flex:1 1 100%;height:42px;font-size:16px}
}

/* ---------- 台账列表 ---------- */
/* v102：整行共用一张浅底卡片 —— 卡片范围从「工具条自己」扩大到「整行」，
   工具条退成透明；条数在卡片内部靠右，视觉上就是一整行，不再像左右两列 */
.list-head{display:flex;align-items:center;gap:12px;margin:0 0 10px;
  padding:9px 12px;background:var(--card);border:1px solid var(--line);border-radius:var(--r-md)}
/* v141：批量条已挪出 list-head 改为底部浮动条，原内嵌样式规则删除 */
/* v142（黄哥 2026-11-02）：条数行（一键展开 + 共X条）固定在页面最底部，
   列表怎么滚它都钉在底边一直可见；桌面端生效，手机端维持原位随页滚。
   固定后脱离文档流，view-list 加底部内边距防止最后一行被它盖住；
   批量浮动条相应上移（bottom:58px）浮在它上方，两者不打架。 */
@media (min-width:900px){
  /* v146（黄哥 2026-11-02）：白条左边界从导航栏右沿开始（left 跟随 --sidebar-w），
     不再横跨整屏盖住导航栏；导航收起时由下方 #app.sidebar-collapsed 把变量换成 64px 自动跟随。
     right:0 + 无 max-width：白条铺满导航右侧区域，与上方表格区域左右完全对齐 */
  .list-head{position:fixed;left:var(--sidebar-w,228px);right:0;bottom:0;z-index:40;margin:0;
    border-radius:0;border-left:none;border-right:none;border-bottom:none;
    height:var(--foot-h);padding:0 22px;box-shadow:0 -2px 8px rgba(11,26,51,.06)}
  /* v145：表格容器高度由 JS 精确压到本条之上，页面不再溢出，无需再留底部内边距 */
}
/* v148（黄哥 2026-11-02）：台账页表格底层容器四向零间距贴合——
   上贴顶栏、下贴底部白条、左贴导航栏、右贴窗口边；单元格内容显示方式不变（仍按 v147 百分比列宽）。
   仅桌面端台账页生效（JS 给 .content 加 .list-flush），其他页面/手机端维持原内边距。 */
@media (min-width:900px){
  .content.list-flush{padding:0;max-width:none}
  .content.list-flush .tbl-wrap:has(.ledger-tbl){border-radius:0}
  .content.list-flush .tbl-wrap:has(.ledger-tbl) .state{border-radius:0}
  /* v166：合并页车表容器(.car-tbl-wrap)同样四边直角 + 去底部 margin，否则圆角+14px 间隙导致不贴合 */
  .content.list-flush .car-tbl-wrap{border-radius:0;margin:0;margin-bottom:0}
}
/* v146：导航收起（64px）时白条左边界跟着左移 */
#app.sidebar-collapsed .list-head{--sidebar-w:64px}
.list-meta{font-size:12.5px;color:var(--muted);margin:0;letter-spacing:.2px;
  flex:0 0 auto;margin-left:auto;text-align:right;white-space:nowrap}
.rec{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);
  padding:13px 15px;margin-bottom:10px;cursor:pointer;transition:.15s;box-shadow:var(--shadow)}
.rec:hover{border-color:var(--brand-line)}
.rec.diff{background:var(--diff-bg);border-color:var(--diff-line)}
.rec .r1{display:flex;justify-content:space-between;align-items:center;gap:8px}
.rec .order{font-weight:700;font-size:15.5px}
.rec .r2{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:13px;color:var(--muted);margin-top:5px}
/* v112：手机明细卡自然流式——不用固定列宽，每字段 标签+值 从左排、统一间距、自动换行 */
.rec .r2.flow{margin-top:6px}
.rec .r2.flow > span{display:inline-flex;align-items:baseline;gap:5px;min-width:0}
.rec .r2.flow > span.wide{flex:1 0 100%}
.rec .r2.flow .k{color:#6B7A90;font-style:normal;flex:none}
.rec .r2.flow .v{color:#1A2233;font-weight:400;font-style:normal}
/* v114：明细卡字体统一——标签与值同字重，只靠颜色区分（标签灰、值深）；数量四件不再单独加粗/深蓝 */
.rec .r2.flow .v.num{color:#1A2233;font-weight:400}
.rec .r2.rows{display:block;margin-top:6px}
.rec .r2.rows .r2-row{display:flex;flex-wrap:wrap;gap:4px 10px;margin-bottom:5px}
.rec .r2.rows .cell{display:inline-flex;align-items:baseline;gap:5px;min-width:0}
.rec .r2.rows .cell .k{color:#6B7A90;font-style:normal;flex:none}
.rec .r2.rows .cell .v{color:#1A2233;font-weight:400;font-style:normal}
.rec .r2.rows .cell .v.num{color:#1A2233;font-weight:400}
/* v115：明细卡 A组/B组 填写按钮行 + 分组填写页 */
/* v129：明细卡底部按钮行——与上方录入行拉开间距并加分隔线；按钮不折行 */
.rec .r4.fillrow{display:flex;gap:8px;margin-top:12px;padding-top:10px;border-top:1px solid var(--line)}
.rec .r4.fillrow .btn{flex:1;margin:0;min-width:0;white-space:nowrap}
.fill-tip{margin:8px 0 6px;padding:8px 10px;border-radius:0;font-size:12.5px;line-height:1.5}
.fill-tip.miss{background:#fff5eb;color:#b45309;border:1px solid #fdba74}
.fill-tip.ok{background:#f0fdf4;color:#008A5C;border:1px solid #86efac}
/* v120：未填字段改淡绿底色（黄哥：红色不好看）——淡绿底+浅绿框，标签同改绿 */
.field.fill-miss > label{color:#008A5C}
.field.fill-miss .inp,.field.fill-miss .dd-trigger{background:#f0fdf4;border-color:#86efac !important;box-shadow:none}
.fill-grid .grp-tag{display:none}
/* v116：填写页网格——一行两列；.full 独占整行（多选/多行文本） */
.fill-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px 14px}
.fill-grid .field{margin-bottom:0;min-width:0}
.fill-grid .field.full{grid-column:1 / -1}
/* v120：日期文字靠左（iOS 默认居中）+ 控件收在列宽内防边框出界 */
#fillBody input[type="date"]{text-align:left;-webkit-appearance:none;appearance:none;min-width:0;width:100%}
#fillBody .inp,#fillBody select,#fillBody .dd-trigger{max-width:100%;min-width:0}
.rec .r3{display:flex;justify-content:space-between;align-items:center;margin-top:7px;font-size:12.5px;color:var(--muted)}
.rec .diffline{color:var(--danger);font-weight:600;font-size:13px;margin-top:6px}
.badge{font-size:12px;padding:2.5px 9px;border-radius:0;background:var(--bg);color:var(--muted);white-space:nowrap}
.badge.b-ok{background:var(--ok-bg);color:var(--ok)}
.badge.b-diff{background:var(--danger-bg);color:var(--danger)}
.badge.b-pending{background:var(--warn-bg);color:#b45309}
.badge.b-temp{background:#fff7e6;color:#d48806;border:1px solid #ffd591}
.badge.b-ontime{background:var(--primary-soft);color:var(--primary)}
.badge.b-pass{background:var(--ok-bg);color:var(--ok)}
.badge.b-reject{background:var(--danger-bg);color:var(--danger)}
/* 审批工作台：待审批 / 已处理 切换 */
.tabs{display:flex;gap:8px;margin:2px 0 12px}
.tab{border:1px solid var(--line);background:var(--bg);padding:7px 18px;font-size:14px;color:var(--muted);cursor:pointer;border-radius:var(--r-md);transition:.15s}
.tab:hover{color:var(--text);border-color:var(--brand-line)}
.tab.active{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}

/* 桌面表格 */
.tbl-wrap{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);
  box-shadow:var(--shadow);overflow:auto}
table.tbl{width:100%;border-collapse:collapse;font-size:13.5px;min-width:900px}
.tbl th{background:#F5F7FA;color:var(--muted);font-weight:600;text-align:left;
  padding:11px 12px;border-bottom:1px solid var(--line);white-space:nowrap;position:sticky;top:0}
.tbl td{padding:11px 12px;border-bottom:1px solid #F0F3F7;white-space:nowrap}
.tbl tr:last-child td{border-bottom:none}
.tbl tbody tr{cursor:pointer;transition:.1s}
.tbl tbody tr:hover{background:var(--brand-tint)}
.tbl tr.diff{background:var(--diff-bg)}
.tbl tr.diff:hover{background:var(--diff-bg-hover)}   /* v220：差异行 hover 不再跳成浅蓝 */
.tbl tr.diff td:first-child{box-shadow:inset 3px 0 0 var(--danger)}

/* ---------- 批量删除工具栏 ---------- */
/* v150（黄哥 2026-11-02）：批量条从屏幕底部挪到顶栏下方靠上悬浮——
   不再盖住最底下的数据行；白底圆角浮卡居中，勾选了行才浮出 */
.batch-bar{position:fixed;left:50%;top:calc(var(--topbar-h) + 12px);bottom:auto;transform:translateX(-50%);z-index:60;
  display:flex;align-items:center;gap:12px;flex-wrap:nowrap;margin:0;padding:10px 16px;
  background:#fff;border:1px solid var(--line);border-radius:0;
  box-shadow:0 10px 32px rgba(11,26,51,.24)}
.batch-bar .btn.danger{border-color:#f3b6b6;background:#fff}
.batch-bar .btn.danger:not([disabled]):hover{background:var(--danger-bg)}
.th-cb,.td-cb{width:38px;min-width:38px;text-align:center;padding-left:12px !important;padding-right:4px !important}
.th-cb input,.td-cb input{width:16px;height:16px;accent-color:var(--primary);cursor:pointer}
.tbl tbody tr td.td-cb{vertical-align:middle}
.cb-wrap{display:flex;align-items:center;gap:6px;margin-right:4px;cursor:pointer}
.cb-wrap input{width:18px;height:18px;accent-color:var(--primary);flex-shrink:0}

/* ---------- 列表状态 ---------- */
.state{padding:44px 16px;text-align:center;color:var(--muted)}
.state .big{font-size:40px;margin-bottom:10px}
.state .btn{margin-top:14px}
.state.error{color:var(--danger)}
.spinner{display:inline-block;width:22px;height:22px;border:3px solid var(--line);
  border-top-color:var(--primary);border-radius:50%;animation:spin .8s linear infinite;margin-bottom:10px}
@keyframes spin{to{transform:rotate(360deg)}}

/* ---------- KPI ---------- */
.kpi-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-bottom:16px}
.kpi{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:16px;text-align:center;box-shadow:var(--shadow)}
.kpi .num{font-size:26px;font-weight:800;line-height:1.2}
.kpi .lbl{font-size:12px;color:var(--muted);margin-top:3px}
.kpi.ok .num{color:var(--ok)} .kpi.warn .num{color:#b45309} .kpi.danger .num{color:var(--danger)}
.bar-row{display:flex;align-items:center;gap:10px;margin-bottom:9px;font-size:13px}
.bar-row .name{width:96px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}
.bar-row .track{flex:1;background:var(--bg);height:14px;border-radius:0;overflow:hidden}
.bar-row .fill{height:100%;background:var(--primary);border-radius:0;transition:width .4s}
.bar-row .val{width:52px;text-align:right;font-weight:600}

/* ---------- 扫码 ---------- */
.reader{margin:12px 0;min-height:60px}
.reader video{border-radius:var(--r-md);width:100% !important}
.scan-actions{display:flex;gap:10px;margin:10px 0}
.scan-result{margin-top:8px;font-size:14px;color:var(--ok);font-weight:600}

/* ---------- 弹层 ---------- */
.modal{position:fixed;inset:0;background:rgba(11,26,51,.5);display:flex;align-items:center;
  justify-content:center;z-index:40;padding:16px;backdrop-filter:blur(2px)}
.modal-card{background:#fff;border-radius:var(--r-lg);padding:20px;width:100%;max-width:420px;
  max-height:86vh;overflow:auto;box-shadow:0 20px 60px rgba(0,0,0,.3)}
.modal-card.wide{max-width:720px}
/* 手机端底部抽屉：核对确认弹层在 <900px 时从底部滑出，不遮挡列表，操作顺手 */
@media (max-width:899px){
  .modal{align-items:flex-end;background:rgba(11,26,51,.45)}
  .modal-card.sheet{max-width:none;width:100%;margin:0;border-radius:0;
    padding:18px 16px calc(18px + env(safe-area-inset-bottom));animation:sheetUp .22s ease}
  .modal-card.sheet h3{font-size:17px;margin-bottom:10px}
  /* 拍照识别弹层在手机上靠上对齐（v76）：底部抽屉式太靠下、拍照按钮够不着
     v103：左右留白 16→10px，把宽度让给字段输入框 */
  #ocrMultiModal.modal{align-items:flex-start;padding:calc(8vh + env(safe-area-inset-top)) 10px 10px;overflow-y:auto}
  #ocrMultiModal .modal-card.wide{max-width:none;width:100%;margin:0;border-radius:0;
    padding:16px 12px calc(16px + env(safe-area-inset-bottom));max-height:none;animation:sheetDown .22s ease}
  #ocrMultiModal .modal-card.wide h3{font-size:17px;margin-bottom:8px}
  /* v103：手机端识别卡内边距收一收，双列输入框更宽
     v104：手机上固定双列（每格独占半行，避免被 flex 挤成三列）
     v105：左列加宽、右列收窄 —— 左列放的是车牌号/客户名称/承运商这些长内容，
           右列是等级/计划重量/发货仓库这些短内容，58% : 42% 才不浪费宽度 */
  #ocrMultiModal .om-card{padding:10px}
  #ocrMultiModal .om-f{min-width:0;flex:0 0 calc(50% - 4px)}
  #ocrMultiModal .om-f:nth-child(odd){flex:0 0 calc(58% - 4px)}
  #ocrMultiModal .om-f:nth-child(even){flex:0 0 calc(42% - 4px)}
  /* v105：iOS 的日期框默认自带内边距 + 居中文字，跟其它输入框对不齐 → 统一高度、文字左对齐 */
  #ocrMultiModal .om-f input{height:30px;box-sizing:border-box}
  #ocrMultiModal .om-f input[type="date"]{
    -webkit-appearance:none;appearance:none;width:100%;padding:0 8px;
    text-align:left;background:#fff;color:inherit;font-family:inherit;font-size:13px}
  #ocrMultiModal .om-f input[type="date"]::-webkit-date-and-time-value{text-align:left;margin:0}
  #ocrMultiModal .om-f input[type="date"]::-webkit-datetime-edit{text-align:left;padding:0}
  #ocrMultiModal .om-f input[type="date"]::-webkit-calendar-picker-indicator{margin:0 0 0 auto;opacity:.55}
  .check-body .kv{display:flex;justify-content:space-between;padding:9px 2px;border-bottom:1px solid var(--line);font-size:14.5px}
  .check-body .kv .k{color:var(--muted)}
  .check-body .kv.auto .v{color:#b45309;font-weight:600}
  .check-body .meta-box{margin-top:12px;font-size:13px;color:var(--muted);background:#F5F7FA;border-radius:0;padding:10px 12px;line-height:1.5}
  .modal-card.sheet .modal-actions .btn.lg{height:50px;font-size:16px}
}
@keyframes sheetUp{from{transform:translateY(100%)}to{transform:translateY(0)}}
@keyframes sheetDown{from{transform:translateY(-20%);opacity:0}to{transform:translateY(0);opacity:1}}
.cfg-card{max-width:800px;padding:24px}
.modal-card h3{margin-bottom:12px;font-size:16.5px}
.check-body .kv{display:flex;justify-content:space-between;gap:12px;padding:8px 2px;border-bottom:1px solid var(--line);font-size:14px}
.check-body .kv .k{color:var(--muted);flex:none}
.check-body .kv .v{font-weight:600;text-align:right}
.check-body .kv.auto .v{color:#b45309}
.check-body .meta-box{margin-top:12px;font-size:13px;color:var(--muted);background:#F5F7FA;border-radius:0;padding:10px 12px;line-height:1.5}
.modal-actions{display:flex;gap:10px;margin-top:16px;flex-wrap:wrap}

/* 操作记录（v59）：修改历史时间线 */
.audit-list{display:flex;flex-direction:column;gap:0;max-height:60vh;overflow:auto}
.audit-item{padding:10px 4px 10px 0;border-bottom:1px solid var(--line)}
.audit-item:last-child{border-bottom:none}
.audit-top{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--muted)}
.audit-dot{width:9px;height:9px;border-radius:50%;flex:none;background:var(--muted)}
.audit-dot.add{background:#00A870}
.audit-dot.edit{background:var(--brand)}
.audit-dot.del{background:#dc2626}
.audit-time{font-variant-numeric:tabular-nums}
.audit-act{font-weight:600;padding:1px 8px;border-radius:0;font-size:12px}
.audit-act.add{background:#dcfce7;color:#166534}
.audit-act.edit{background:var(--brand-soft2);color:var(--brand-d)}
.audit-act.del{background:#fee2e2;color:#b91c1c}
.audit-detail{margin-top:5px;font-size:13.5px;line-height:1.6;padding-left:17px}
.audit-detail .old{color:#b91c1c;text-decoration:line-through;margin:0 2px}
.audit-detail .new{color:#008A5C;font-weight:600;margin:0 2px}
.modal-actions .btn{flex:1}

/* v107：详情弹层操作栏上移到标题下方并吸顶，内容再长按钮也始终在视野里
   .modal-card 自带 overflow:auto + 20px 内边距：
   · 负水平边距让操作栏通栏贴到卡片左右边缘
   · top:-20px 让吸顶时正好盖住顶部那块内边距，不露出下面滚过去的文字 */
#detailModal .detail-actions{position:sticky;top:-20px;z-index:3;
  margin:0 -20px 14px;padding:12px 20px;background:#fff;
  border-bottom:1px solid var(--line);
  box-shadow:0 6px 12px -10px rgba(11,26,51,.3)}
#detailModal .modal-card h3{margin-bottom:10px}
/* 手机端：按钮改为「单行 + 横向滑动」，不换行。
   原因：320~390px 宽度下 4~6 个中文按钮必然折成 2~3 行，吸顶后常驻占掉
   86vh 的 22%~32%，把可见内容挤掉一大块。锁成单行后高度恒定约 58px（约 12%）。
   flex:1 0 auto = 有空间就均分撑满、没空间不压缩，放不下时可横向滑出。 */
@media (max-width:899px){
  #detailModal .detail-actions{gap:6px;padding:10px 20px;
    flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
  #detailModal .detail-actions::-webkit-scrollbar{display:none}
  #detailModal .detail-actions .btn{flex:1 0 auto;padding:0 10px}
}

/* ---------- OCR 识别结果区（批量拍照识别弹层复用） ---------- */
.ocr-result{margin-top:12px;font-size:13px;max-height:240px;overflow:auto;
  background:var(--bg);border-radius:var(--r-sm);padding:10px}
.ocr-result .ln{padding:7px 9px;border-bottom:1px solid var(--line);cursor:pointer;border-radius:0}
.ocr-result .ln:hover{background:var(--primary-soft)}
.kv{display:flex;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid #F0F3F7;font-size:14px}
.kv .k{color:var(--muted);flex-shrink:0}
.kv .v{font-weight:600;text-align:right;word-break:break-all}
.kv.auto{background:var(--brand-tint);margin:0 -8px;padding:8px;border-radius:0;border-bottom:none}
.kv.head{font-weight:700;color:var(--text);border-bottom:2px solid var(--line);margin-top:8px}
.meta-box{background:var(--bg);border-radius:var(--r-sm);padding:10px 12px;margin-top:12px;font-size:12.5px;color:var(--muted);line-height:1.9}

/* ---------- toast ---------- */
.toast{position:fixed;left:50%;bottom:calc(var(--bottomnav-h) + 24px);transform:translateX(-50%);
  background:rgba(11,26,51,.94);color:#fff;padding:12px 20px;border-radius:var(--r-md);
  font-size:14px;z-index:60;max-width:86%;box-shadow:0 8px 24px rgba(0,0,0,.25);line-height:1.5}
.toast.error{background:rgba(200,45,55,.97);font-weight:600}

/* ===================================================================
   响应式：<900px 收起侧栏，启用底部导航；≥900px 表单两列、KPI 五列
   =================================================================== */
/* v219：⋯ 下拉面板遮罩，只在手机端由上面的媒体查询打开；桌面端一律不显示 */
.topmore-mask{display:none}

@media (max-width:899px){
  .sidebar{display:none}
  .bottomnav{display:flex}
  .content{padding:14px 14px calc(var(--bottomnav-h) + env(safe-area-inset-bottom) + 24px)}
  /* 顶部标题栏让出 iPhone 状态栏（时钟/电量）位置：添加到主屏幕全屏模式下，
     系统状态栏透明压在页面上，不给 safe-area 顶距整条标题栏会被压在时钟下面看不见 */
  .topbar{height:calc(var(--topbar-h) + env(safe-area-inset-top));
    padding:0 14px;padding-top:env(safe-area-inset-top)}
  /* v209：手机端显示登录姓名（桌面端本来就有）；改密码/退出由 JS 收进「⋯」 */
  .top-right #appUser{display:inline-block;max-width:76px;overflow:hidden;text-overflow:ellipsis;
    white-space:nowrap;font-size:12.5px;color:var(--brand);font-weight:600}
  /* v209：主题/更多菜单改为底部抽屉，不再从顶栏向下浮出盖住 66.7% 等指标卡 */
  .topbar:has(.theme-menu:not(.hidden)),.topbar:has(.more-menu:not(.hidden)){z-index:95}
  .topbar.menu-open{z-index:95}   /* v209：老浏览器兜底 */
  .theme-menu,.more-menu{position:fixed;left:12px;right:12px;top:auto;
    bottom:calc(var(--bottomnav-h) + env(safe-area-inset-bottom) + 12px);
    min-width:0;width:auto;z-index:80;box-shadow:0 -6px 24px rgba(11,26,51,.18)}
  .more-menu .btn{width:100%;justify-content:flex-start}
  .toast{bottom:calc(var(--bottomnav-h) + env(safe-area-inset-bottom) + 18px)}
  .fg-list{grid-template-columns:1fr 1fr}
  /* 版本号浮标：保持右下角显示（v129：偏移从 6px 提到 20px，明确悬在导航上方、不再压住最右导航按钮） */
  .ver-mobile{display:block;position:fixed;right:8px;bottom:calc(var(--bottomnav-h) + env(safe-area-inset-bottom) + 20px);
    font-size:10px;color:var(--sidebar-muted);background:rgba(255,255,255,.82);padding:1px 6px;border-radius:0;
    z-index:35;pointer-events:none}
  /* ---------- v60 手机适配修复 ---------- */
  /* 兜底：任何意外超宽元素不再把整页撑出横向滚动 */
  body{overflow-x:hidden}
  /* 日期范围：两个日期框各占一半、不再固定 140px 顶到屏幕右缘 */
  .date-range{width:100%}
  .date-range .inp{width:auto;flex:1;min-width:0}
  /* 组标题过长时换行，不再截断 */
  .group-head{flex-wrap:wrap}
  /* 台账卡片：标题长时徽章整体换到第二行，不挤压车牌号 */
  .rec .r1{flex-wrap:wrap;row-gap:6px}
  /* 字号微调提升可读性 */
  .rec .r2{font-size:13.5px}
  .rec .r3{font-size:13px}
  /* 触摸目标 ≥40px：小按钮/输入框/下拉/复选框全面加大 */
  .btn.sm{height:40px;padding:0 14px;font-size:14px}
  /* v129：明细卡底部 4 按钮——窄屏四等分不折行，缩字号/内边距保证单行 */
  .rec .r4.fillrow .btn.sm{font-size:12.5px;padding:0 5px;height:38px}
  /* 16px 可避免 iOS Safari 聚焦输入框时整页自动放大 */
  .inp{height:42px;font-size:16px}
  .dd-trigger{height:42px;font-size:15px}
  .chk{font-size:14px}
  .chk input{width:20px;height:20px}
  .tab{padding:9px 18px}
  .wa-users .chip span{height:40px}
  /* 顶部栏按钮统一加大触摸面积 */
  .top-right .btn{height:40px}
  .top-right #btnTheme .btn-label,.top-right #btnRefresh .btn-label{display:none}
  .topbar h1{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .filter-primary{margin-left:0}   /* v227：搬走后由 JS 加 .hidden 收起；不用 CSS 硬隐藏，脚本没跑时按钮仍可用 */
  /* v227：第二行四个条件常显且必须挤进一行。⚠ 原 .date-range{width:100%} 会让日期独占整行，
     这里用 .filter-row2 前缀提高特异性压过去；其余控件用 ID 选择器压过手机端 .btn.sm/.inp 大尺寸。 */
  .filter-row2{flex:0 0 100%;width:100%;gap:14px;flex-wrap:nowrap;position:relative}
  .filter-row2 #fWarehouse{flex:1 1 0;min-width:0;max-width:none;height:40px;font-size:13px;padding:0 6px}
  /* ⚠ 弹层 .date-pop 是 left:0;right:0 的绝对定位。原来它贴着占满整行的 .date-range，
     现在日期格被压窄，必须把定位基准上移到整行：.date-range 改 static、.filter-row2 改 relative，
     否则弹层只有日期按钮那么宽，起止日期框会挤成一团。 */
  .filter-row2 .date-range{position:static;width:auto;flex:none}
  .filter-row2 #fDateBtn{height:40px;padding:0 10px;font-size:13px}
  .filter-row2 .switch-line{gap:5px;flex:none}
  .filter-row2 .switch-text{font-size:13px}
  .filter-row2 .switch{width:30px;height:20px}
  .filter-row2 .switch .track::before{width:16px;height:16px}
  .filter-row2 .switch input:checked + .track::before{transform:translateX(10px)}
  .filter-row2 #fReset{height:40px;padding:0 12px;min-width:64px;font-size:13px;flex:none;margin-left:0}
  /* 手机端不显示批量删除相关控件 */
  .batch-bar,#btnToggleAllCars{display:none !important}
  /* v102：手机上工具条隐藏后，别剩下一块空卡片，只留条数靠右 */
  .list-head{padding:0;background:transparent;border:0;border-radius:0;margin:0 0 8px}
  .th-cb,.td-cb{display:none !important}
  .rec .cb-wrap{display:none !important}
  /* 手机端登录卡片全屏化：去白底卡片，直接铺满，适配刘海屏安全区 */
  .login-bg{padding:0}
  .login-card{max-width:none;width:100%;height:100%;min-height:100vh;border-radius:0;
    box-shadow:none;background:transparent;display:flex;flex-direction:column;justify-content:center;
    padding:24px 22px;padding-top:calc(24px + env(safe-area-inset-top));
    padding-bottom:calc(24px + env(safe-area-inset-bottom))}
  .login-card h1{font-size:24px;color:#fff}
  .login-card .sub{font-size:14px;margin-bottom:18px;color:rgba(255,255,255,.75)}
  .login-card .hint{margin-top:22px;color:rgba(255,255,255,.65)}
  .login-card .f-label{color:rgba(255,255,255,.85)}
  .login-card .remember{color:rgba(255,255,255,.85)}
}
#app.sidebar-collapsed .content{max-width:100%}
@media (min-width:900px){
  .content{max-width:1280px;padding:20px 28px}
  .form-grid{grid-template-columns:repeat(3,1fr)}
  .field{position:relative;margin-bottom:10px}
  .field.wide{grid-column:1 / -1}
  .field.two-col{grid-column:span 2}
  .content{padding:14px 12px 22px}
  #fReset{margin-left:0}
  .card.pad{padding:14px}
  .group-head{margin-bottom:10px}
  #entryForm{display:flex;flex-direction:column;gap:16px}
  #entryForm .card.pad{margin-bottom:0}
  .kpi-grid{grid-template-columns:repeat(5,1fr)}
  .filters .inp{max-width:220px}
}

/* ---------- 系统管理 ---------- */
.admin-table{margin-top:12px;overflow-x:auto}
.tbl{width:100%;border-collapse:collapse;font-size:13.5px}
.tbl th,.tbl td{padding:9px 10px;text-align:left;border-bottom:1px solid var(--line);white-space:nowrap}
.tbl th{color:var(--muted);font-weight:600;background:var(--bg)}
.tbl td.ops{display:flex;gap:6px;align-items:center;white-space:nowrap}
.tbl select.sm{height:30px;padding:0 6px}
/* 功能权限配置表：功能名 + 三列角色勾选，紧凑居中 */
.perm-table{margin-top:8px;overflow-x:auto}
.perm-grip{width:100%;border-collapse:collapse;font-size:14px;min-width:360px}
.perm-grip th,.perm-grip td{padding:10px 12px;text-align:center;border-bottom:1px solid var(--line)}
.perm-grip th{color:var(--muted);font-weight:600;background:var(--bg)}
.perm-grip td.pl{text-align:left;white-space:nowrap;color:var(--text);font-weight:500}
.perm-grip td.pc{width:84px}
.perm-grip tbody tr:hover{background:var(--brand-tint)}
.perm-grip input[type=checkbox]{width:18px;height:18px;cursor:pointer}
.opt-group{margin-top:14px;padding-top:12px;border-top:1px dashed var(--line)}
.opt-group:first-child{border-top:none;margin-top:8px}
.opt-head{font-weight:600;margin-bottom:8px}
.opt-list{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}
.opt-chip{display:inline-flex;align-items:center;gap:6px;background:var(--brand-soft);color:var(--grade);
  border:1px solid var(--brand-line);border-radius:0;padding:4px 6px 4px 12px;font-size:13px}
.opt-x{border:none;background:var(--brand-line);color:var(--grade);width:18px;height:18px;border-radius:50%;
  cursor:pointer;font-size:13px;line-height:1;display:flex;align-items:center;justify-content:center}
.opt-x:hover{background:var(--brand-line)}
.opt-add{display:flex;gap:8px;margin-top:6px}
.opt-add .inp{flex:1;max-width:240px}

/* ---------- v185 客户名称保密 ---------- */
.cp-sec{margin-top:14px;padding-top:12px;border-top:1px dashed var(--line)}
.cp-sec:first-child{border-top:none;padding-top:0;margin-top:8px}
.cp-h{font-weight:600;margin-bottom:8px;font-size:13px}
.cp-roles,.cp-users{display:flex;flex-wrap:wrap;gap:8px 18px}
/* v219：候选客户从 flex-wrap 改固定列网格。
   原来「谁名字长谁占宽」，一长就把后面的挤到下一行，看着像错位；改 minmax(0,1fr) 让每列等宽、可收缩。 */
.cp-custs{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px 16px;max-height:260px;overflow:auto;
  border:1px solid var(--line);border-radius:0;padding:10px;background:#FFFFFF}
/* 名字过长用省略号收尾（完整名称挂在 title 上）；block 才能让 text-overflow 生效，flex 容器的裸文本节点不行 */
.cp-custs .cp-cust{display:block;font-size:12.5px;line-height:22px;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp-custs .cp-cust input[type=checkbox]{width:16px;height:16px;margin:0 6px 0 0;vertical-align:-3px;cursor:pointer}
.cp-cust.hidden{display:none}
/* 批量勾选按钮条（全选 / 反选 / 清空） */
.cp-bulk{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}
@media (max-width:1199px){.cp-custs{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:899px){.cp-custs{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:599px){.cp-custs{grid-template-columns:minmax(0,1fr)}}

/* ---------- 字段分组配置 ---------- */
.fg-list{display:grid;grid-template-columns:repeat(2,1fr);gap:12px 20px;margin-top:10px}
.fg-row{display:flex;flex-direction:column;align-items:stretch;gap:5px}
.fg-name{font-size:13px;color:var(--text);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fg-row select{width:100%;min-width:auto}

/* ---------- 字段管理（增删 / 分组 / 台账显隐） ---------- */
/* v118：一行放下一个字段 —— 分组下拉限宽不换行（原 width:100% 占满整行，把其它控件挤到下面变成 3 行） */
.fm-list{margin-top:10px;display:grid;grid-template-columns:repeat(2,1fr);gap:8px 12px}
.fm-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:#F5F7FA;border:1px solid var(--line);
  border-radius:var(--r-sm);padding:6px 10px}
.fm-name{font-size:13.5px;font-weight:600;flex:1;min-width:84px;display:flex;align-items:center;gap:6px}
.fm-type{font-size:11px;color:var(--muted);background:var(--brand-soft);border-radius:0;padding:1px 5px;font-weight:500}
.fm-row select.inp{width:110px;flex:none;min-width:110px}
.fm-row .chk{font-size:12.5px;white-space:nowrap}
.fm-row .btn.danger{margin-left:auto}
.fm-row .btn.fm-move{width:32px;padding:0;color:var(--muted);border-color:var(--line)}
.fm-row .btn.fm-move:not([disabled]):hover{border-color:var(--primary);color:var(--primary)}
.fm-row .btn.fm-move[disabled]{opacity:.35;cursor:not-allowed}
.add-field{margin-top:14px;padding-top:12px;border-top:1px dashed var(--line)}
.af-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;align-items:center}
.af-grid .inp{width:100%}
@media (max-width:899px){
  .fm-list{grid-template-columns:1fr}
  .af-grid{grid-template-columns:1fr}
}

/* ---------- 台账显示设置（列配置 / 页面配置） ---------- */
.cfg-tabs{display:flex;gap:8px;margin-bottom:18px;border-bottom:1px solid var(--line)}
.cfg-tab{border:none;background:none;padding:10px 16px;font-size:14px;color:var(--muted);cursor:pointer;
  font-family:inherit;font-weight:600;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s ease}
.cfg-tab:hover{color:var(--text)}
.cfg-tab.active{color:var(--primary);border-bottom-color:var(--primary)}
.cfg-panel.hidden{display:none}
.cfg-tip{font-size:13px;color:var(--muted);margin-bottom:16px;line-height:1.65;background:#F5F7FA;
  border-radius:var(--r-sm);padding:10px 12px}
.dual{display:flex;gap:16px;align-items:stretch;min-height:260px}
.dual-col{flex:1;min-width:0;display:flex;flex-direction:column}
.dual-col h4{font-size:13.5px;color:var(--text);margin-bottom:10px;font-weight:700;
  display:flex;align-items:center;gap:6px}
.dual-col h4::after{content:"";flex:1;height:1px;background:var(--line)}
.dual-box{flex:1;border:1px solid var(--line);border-radius:var(--r-sm);background:#fff;
  max-height:360px;min-height:220px;overflow:auto;padding:8px}
.col-item{display:flex;align-items:center;gap:10px;padding:11px 12px;border-radius:0;border:1px solid transparent;
  cursor:pointer;font-size:14px;margin-bottom:6px;background:#F5F7FA;min-height:44px}
.col-item:hover{background:#F0F3F7}
.col-item.sel{border-color:var(--primary);background:var(--primary-soft)}
.col-item .ci-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}
.col-item .ci-type{font-size:11px;color:var(--muted);background:var(--brand-soft);border-radius:0;padding:3px 8px;flex:none;min-width:38px;text-align:center}
.col-item .ci-move{border:none;background:#fff;color:var(--muted);font-size:15px;cursor:pointer;
  padding:4px 7px;border-radius:0;flex:none;font-family:inherit;line-height:1;box-shadow:0 1px 2px rgba(0,0,0,.05)}
.col-item .ci-move:hover{color:var(--primary);background:#fff;border-color:var(--primary)}
.col-item .ci-move[disabled]{opacity:.3;cursor:not-allowed;background:#F0F3F7}
.dual-mid{display:flex;flex-direction:column;justify-content:center;gap:12px;flex:none;padding:0 4px}
.dual-mid .btn{width:44px;height:42px;padding:0;font-size:18px;display:flex;align-items:center;justify-content:center}
.ps-row{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px}
.ps-btn{height:42px;min-width:76px;padding:0 18px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:#fff;font-size:14px;cursor:pointer;font-family:inherit;color:var(--text);font-weight:500}
.ps-btn:hover:not(.sel){border-color:var(--primary);color:var(--primary)}
.ps-btn.sel{background:var(--primary);color:#fff;border-color:var(--primary);font-weight:600}

/* ============ v67：车带 / 合并行 / 整组实发 ============ */
.truck-band{}
.truck-band-cell{background:var(--brand-soft2);color:var(--brand-d);font-weight:700;font-size:13.5px;
  padding:9px 14px;text-align:left;letter-spacing:.2px}
.truck-band{background:var(--brand-soft2);color:var(--brand-d);font-weight:700;font-size:13.5px;
  padding:10px 14px;margin:10px 0 2px;border-radius:0;border:1px solid var(--brand-line)}
.merge-summary{cursor:pointer;user-select:none}
.merge-summary .ms-cell{background:#ffffff;padding:10px 14px;border-bottom:1px solid var(--line)}
.merge-summary .ms-inner{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;flex:1;min-width:0}
/* v75：摘要行整体 flex 化——文字左自动换行、按钮右对齐同一行（原按钮掉到第二行左下角） */
.merge-summary .ms-flex{display:flex;align-items:center;gap:12px;flex:1;min-width:0}
.merge-summary .ms-keys{font-weight:600;color:var(--brand-d);font-size:13.5px}
.merge-summary .ms-sub{color:#55637A;font-size:12.5px}
/* v110b：差异非 0 时摘要里的「差异 X/Y」标红加粗 —— 颜色与台账明细的差异数值（var(--diff-text)）保持同一口径 */
.merge-summary .ms-diff{color:var(--diff-text);font-weight:700}
.merge-summary .ms-actual{margin-left:auto;flex:none}
.rec.merge-summary{display:flex;align-items:center;gap:10px;
  color:var(--text);font-weight:400;padding:10px 12px}
.rec.merge-summary .ms-inner{flex-direction:column;align-items:flex-start;gap:3px}
.rec.merge-summary.open{border-bottom-left-radius:0;border-bottom-right-radius:0}
.merge-summary.open .ms-cell{border-bottom:2px solid var(--primary)}
/* v122b：一级车卡 —— 车头不换行一行；单内 批号/等级/计划/扫描/差异 合并一行；底色按状态区分。
   字体统一 12px，颜色区分层级：灰=次要 深=主要 红=差异 蓝=单数。
   .ms2 不自带边框（容器由 .rec.merge-summary(手机卡) 或 td.ms-cell(桌面) 提供边框）。 */
.ms2{font-size:14px}
/* 底色上移到卡片容器：已核对=白卡，未核对/未填完=浅粉卡 #FCF0F0（参照参考页配色）；
   ms2 自身透明，不重复上色（容器由 .rec.merge-summary(手机卡) 或 td.ms-cell(桌面) 提供底色与边框） */
.ms2-done{background:transparent}
.ms2-pending{background:transparent}
.rec.merge-summary:has(.ms2-done){background:#ffffff}
.rec.merge-summary:has(.ms2-pending){background:#FCF0F0}
.merge-summary .ms-cell:has(.ms2-pending){background:#FCF0F0}
.ms2-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;font-size:14px;line-height:1.5}
.ms2-plate{color:var(--car-text);font-weight:700;font-size:16px;flex:none;min-width:0;overflow-wrap:anywhere}
.ms2-meta{color:#6B7A90;white-space:nowrap}
.ms2-cnt{color:var(--brand);font-size:14px;flex:none;white-space:nowrap}
.ms2-done-badge{margin-left:auto;flex:none}
.ms2-rows{margin-top:6px;padding-top:0}
/* 单内：批号/等级 与 计划/扫描/差异 同一行；放不下自动换行（wrap），绝不截断 */
.ms2-order{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;margin-bottom:8px}
.ms2-order:last-child{margin-bottom:0}
.ms2-batch{color:#1A2233;flex:none;min-width:0;overflow-wrap:anywhere}
.ms2-grade{color:#6B7A90;flex:none;white-space:nowrap}
.ms2-m{color:#6B7A90;flex:none;white-space:nowrap}
.ms2-m b{color:#1A2233;font-weight:400}
.ms2-diff b{color:#E53935}
.ms2-foot{color:#6B7A90;font-size:13px;margin-top:6px}

/* ============ v110：手机端台账精简（900px 车行汇总表在手机上已去掉，信息全部由车卡承担） ============
   注意这里必须写成独立媒体块、且放在 .rec.merge-summary 基础规则（上一段）之后：
   两者特异性相同（0,2,0），写在前面会被基础规则反向覆盖。 */
@media (max-width:899px){
  /* 车卡：可点卡片，触摸目标 ≥64px；左上是"车牌/批号/等级/客户"，左下是摘要，右侧「填实发」 */
  .rec.merge-summary{flex-direction:column;align-items:stretch;gap:8px;padding:12px 14px;min-height:64px}
  .rec.merge-summary .ms-flex{width:100%}
  .rec.merge-summary .ms-actual{margin-left:auto}
  /* 展开态：上沿保留圆角、下沿拉平，和下面的明细连成一块 */
  .rec.merge-summary.open{border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-color:transparent}
  /* 车卡可点：车牌前给一个展开指示，展开后换成向下箭头（无车牌散单同一 class，也正好是可点的） */
  .rec.merge-summary .ms-keys::before{content:"▸ ";color:var(--brand-d)}
  .rec.merge-summary.open .ms-keys::before{content:"▾ "}
  /* 「全部展开」：桌面端由 inline style 隐藏，手机上放出来 */
  #btnMobileExpand{display:inline-flex !important;height:34px;padding:0 12px;font-size:13px}
  /* 坑：.hidden 是 display:none!important，上面那条带 id 的 !important 会把它压掉 ——
     必须再用 id+class 的更高特异性压回来，否则没有车组时按钮也会一直显示 */
  #btnMobileExpand.hidden{display:none !important}
  /* v130：合并车卡车头 / 单内 自适应一行不折行 —— 车牌过长省略号(完整车牌长按可看)，单内数字行不换行 */
  .ms2-head{flex-wrap:nowrap}
  .ms2-plate{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .ms2-order{flex-wrap:nowrap;font-size:12px;gap:6px 8px}
}

/* v111：录入人/录入时间再弱化一档，让视线落在上面的分组字段上。
   必须写在这里——手机媒体块里有一条 .rec .r3{font-size:13px}，同特异性下写在它前面会被盖掉。 */
.rec .r3{font-size:12px;color:#BFC8D6}

/* ============ v81：车级一级汇总表（与导出 Excel 同版式，四层商务蓝） ============ */
.car-tbl-wrap{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:var(--shadow);overflow:auto;margin-bottom:14px;max-height:62vh}
table.car-tbl{width:100%;border-collapse:collapse;font-size:13.5px;min-width:0}
/* 第一层：深蓝一级标题栏（白字粗） */
.car-tbl thead th{background:var(--brand);color:#fff;font-weight:700;text-align:center;
  padding:11px 12px;border-bottom:2px solid var(--brand);white-space:nowrap;position:sticky;top:0;
  font-size:13px;letter-spacing:.3px}
/* 第二层：浅蓝一级汇总行（深蓝粗字，数值按列对齐居中） */
tr.car-row{cursor:pointer;user-select:none}
.car-tbl tr.car-row td{color:var(--text);font-weight:700;font-size:13.5px;
  padding:10px 12px;border-bottom:1px solid var(--grid);white-space:nowrap;text-align:center}
.car-tbl tr.car-row.open td{border-bottom:2px solid var(--primary)}
/* v198：合并页去底色后，差异两列沿用明细页同款文字色 */
.car-tbl tr.car-row td.diff-hit{color:var(--diff-text);font-weight:800}
.car-tbl tr.car-row td.diff-zero{color:var(--zero-text)}
.car-tbl tr.car-row .car-arrow{font-size:10px;color:var(--brand-d);display:inline-block;margin-right:5px}

/* ============ v82/v84/v85：定稿两级台账（单张表，通栏铺色 + 四档边框） ============ */
/* v85：固定表格布局，列宽严格按 colgroup；配合省略号，长客户名不再把整列撑宽
   注意必须写 table.ledger-tbl——`table.tbl{font-size:13.5px;min-width:900px}` 是元素+类选择器，
   优先级高于单个 .ledger-tbl，否则字号/最小宽会被它盖掉（v86 踩过：实测单元格一直是 13.5px） */
table.ledger-tbl{width:100%;min-width:0;font-size:12.5px;table-layout:fixed}
.ledger-tbl th,.ledger-tbl td{overflow:hidden;text-overflow:ellipsis}
/* 外层卡片边框加深，让表格"有边" */
/* v94：表头纵向吸顶 + 横向滚动条固定在表格可视区底部
   v141（黄哥 2026-11-02 定）：右侧出现两条竖向滚动条（整页一条 + 表格内部一条）看着乱，
   改为只有一个竖向滚动条 —— 表格不再限高内滚，跟着整页一起滚（页面级唯一竖滚）。
   v145（黄哥 2026-11-02 追加）：滚动时深蓝表头要钉在顶部不动 → 表格容器恢复自己竖向滚动
   （表头 sticky 只有容器滚动才生效），同时 JS 把容器高度精确压到「顶栏之下、底部固定条之上」，
   页面本身不再溢出 → 全页仍然只有表格容器这一条竖向滚动条，两条变一条的目标不回退；
   横向滚动条贴在容器底边、正好落在底部固定条上方，不再被盖。手机端（<900）维持页面级滚动。 */
@media (min-width:900px){
  .tbl-wrap:has(.ledger-tbl){border-color:var(--grid);overflow:auto;overscroll-behavior:contain}
  /* v163b：桌面端合并页车表高度交给 JS 精确限位（顶栏下→白条上），去掉 62vh 死限，避免框外留白 */
  .car-tbl-wrap{max-height:none}
}
@media (max-width:899px){
  .tbl-wrap:has(.ledger-tbl){border-color:var(--grid);overflow-x:auto}
}
/* 第一层：深蓝一级标题栏（仅一次，铺满整行；下沿 2px 深蓝）
   v147：列宽改百分比后窄屏会压缩，表头允许换行（"计划重量"变两行），不再被省略号截成"计划…" */
.ledger-tbl thead th{background:var(--brand);color:#fff;font-weight:700;text-align:center;
  font-size:12px;letter-spacing:.2px;white-space:normal;line-height:1.25;padding:7px 4px;
  position:sticky;top:0;z-index:3;border-right:1px solid rgba(255,255,255,.3);
  border-bottom:none;box-shadow:inset 0 -2px 0 var(--brand-d)}
.ledger-tbl thead th:last-child{border-right:none}
/* 通栏铺色：标题栏右侧留白段不再刷白，与表头同色 */
.ledger-tbl thead th.h1blank{background:var(--brand);border-bottom:none;box-shadow:inset 0 -2px 0 var(--brand-d)}
/* 第二层：浅蓝一级汇总行（深蓝粗字居中，整行铺到右端） */
.ledger-tbl tr.car-row td{background:var(--brand-soft);color:var(--car-text);font-weight:700;font-size:12.5px;
  padding:9px 6px;text-align:center;white-space:nowrap;cursor:pointer;user-select:none;
  border-right:1px solid var(--grid);border-bottom:1px solid var(--grid)}
.ledger-tbl tr.car-row td:last-child{border-right:none}
.ledger-tbl tr.car-row:hover td{background:var(--brand-hover)}
/* 车行右侧留白段不额外设底色，直接吃 tr.car-row td 的浅蓝（避免右边露出白底） */
.ledger-tbl tr.car-row td.row-blank{cursor:default}
/* v84：车行右端空白段放"展开 N 单明细"提示，废白变可用 */
.ledger-tbl tr.car-row td.row-tip{font-weight:500;font-size:11px;color:rgba(11,47,107,.55);color:color-mix(in srgb, var(--car-text) 55%, transparent)}
.ledger-tbl tr.car-row .car-arrow{font-size:8px;color:var(--brand-d);display:inline-block;margin-right:4px;
  transition:transform .18s}
.ledger-tbl tr.car-row.open .car-arrow{transform:rotate(90deg)}
/* v84：车行有差异 → 底色不变，只把差异数值加深加粗 */
.ledger-tbl tr.car-row td.num-diff{color:var(--diff-text);font-weight:800}
/* 第三层：灰蓝二级标题栏（比车行浅、比明细正文深） */
.ledger-tbl tr.lv2-head td{background:#fff;color:var(--lv2-text);font-weight:500;font-size:11px;
  padding:6px 6px;text-align:center;white-space:nowrap;border-right:1px solid var(--grid);
  border-bottom:1px solid var(--grid)}
.ledger-tbl tr.lv2-head td:last-child{border-right:none}
/* 第四层：白底隔行明细 */
.ledger-tbl tr.det td{background:#fff;color:#1A2233;padding:8px 6px;text-align:center;
  white-space:nowrap;border-right:1px solid var(--grid);border-top:1px solid var(--grid)}
.ledger-tbl tr.det td:last-child{border-right:none}
.ledger-tbl tr.det.alt td{background:#fff}
.ledger-tbl tr.det:hover td{background:var(--brand-tint)}
/* v84：该车最后一条明细行底部封一条 2px 主色蓝线（折叠时整组隐藏，看不到） */
.ledger-tbl tr.det.det-last td{border-bottom:1px solid var(--grid)}
/* v84：明细行有差异 → 整行极浅橙底 + 差异数值深橙加粗 */
.ledger-tbl tr.det.has-diff td{background:var(--diff-bg);border-top-color:var(--diff-line2)}
.ledger-tbl tr.det.has-diff:hover td{background:var(--diff-bg-hover)}
/* 二级标题栏紧接首条明细，中间画两条线会显重，去掉上面那条 */
.ledger-tbl tr.lv2-head + tr.det td{border-top:none}
.ledger-tbl tr.det td.diff-hit{color:var(--diff-text);font-weight:800}
.ledger-tbl tr.det td.diff-zero{color:var(--zero-text)}
.ledger-tbl tr.det td.grade{color:var(--brand-d);font-weight:700}
/* v178：刚保存成功的记录——黄底高亮一下，方便确认"这条确实存进去了"（手机卡 / 桌面明细行通用） */
.ledger-tbl tr.det.just-saved td{background:#FFF3C4 !important}
.rec.just-saved{background:#FFF3C4 !important;border-color:#F4C430 !important}
/* v181：看车/扫描填写弹层顶部的"这是修改不是新增"横幅 */
.fill-edit-banner{background:#FFF7E6;border:1px solid #F2C879;border-left:4px solid #E8930C;
  color:#8A5300;border-radius:0;padding:8px 10px;font-size:12.5px;line-height:1.6;margin-bottom:10px;text-align:left}
.fill-edit-banner b{color:var(--diff-text)}
/* ===== v85：操作列改纯文字链接（贴合定稿图，省横向空间；点击逻辑不变仍走 data-* 属性） ===== */
.ledger-tbl td.ops{display:table-cell;white-space:nowrap;text-align:center;padding:6px 2px}
.ledger-tbl td.ops .btn{display:inline-block;background:transparent;border:none;box-shadow:none;
  padding:0 4px;height:auto;line-height:1.7;font-size:11px;font-weight:600;color:var(--brand)}
.ledger-tbl td.ops .btn:hover{background:transparent;color:var(--brand-d);text-decoration:underline}
.ledger-tbl td.ops .btn.ops-mut{color:#7A879B;font-weight:500}
.ledger-tbl td.ops .btn.ops-mut:hover{color:#55637A}
.ledger-tbl td.ops .miss-tag{margin-right:2px}
/* ===== v88：操作列冻结在右侧——横向拖动时「填实发/核对」始终可见可点 =====
   表头最后格、车行的「展开 N 单明细」、二级表头末格、明细操作列一起冻结，保证上下对齐。
   用 box-shadow 画左侧分隔线（border-collapse 下 sticky 单元格的 border 会错位）。 */
.ledger-tbl thead th:last-child{position:sticky;right:0;z-index:5;
  box-shadow:inset 0 -2px 0 var(--brand-d),-6px 0 8px -6px rgba(11,26,51,.22)}
.ledger-tbl tr.car-row td.row-tip{position:sticky;right:0;z-index:2;background:var(--brand-soft);
  box-shadow:-6px 0 8px -6px rgba(11,26,51,.14)}
.ledger-tbl tr.car-row:hover td.row-tip{background:var(--brand-hover)}
.ledger-tbl tr.lv2-head td:last-child{position:sticky;right:0;z-index:2;background:#fff;
  box-shadow:-6px 0 8px -6px rgba(11,26,51,.14)}
.ledger-tbl tr.det td.ops{position:sticky;right:0;z-index:2;background:#fff;
  box-shadow:-6px 0 8px -6px rgba(11,26,51,.14)}
.ledger-tbl tr.det.alt td.ops{background:#fff}
.ledger-tbl tr.det.has-diff td.ops{background:var(--diff-bg)}
.ledger-tbl tr.det:hover td.ops{background:var(--brand-tint)}
.ledger-tbl tr.det.has-diff:hover td.ops{background:var(--diff-bg-hover)}
/* 批量拍照识别弹层 */
.ocr-multi-list{display:flex;flex-direction:column;gap:6px;margin:12px 0 4px;max-height:180px;overflow:auto}
.om-item{display:flex;align-items:center;gap:8px;background:#F5F7FA;border:1px solid var(--line);
  border-radius:0;padding:7px 10px;font-size:13px}
.om-idx{width:22px;height:22px;border-radius:50%;background:var(--primary);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:12px;flex:none}
.om-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.om-del{border:none;background:#fee2e2;color:#dc2626;width:24px;height:24px;border-radius:0;
  cursor:pointer;font-size:13px;flex:none;line-height:1}
.ocr-multi-counter{font-size:13px;color:var(--muted);font-weight:600;margin-bottom:8px}
/* 拍照 / 相册 双入口并排，各占一半：primary 拍照 + ghost 相册选多张 */
.om-pick-row{display:flex;gap:10px;margin-top:12px}
.om-pick-row .btn{flex:1;margin-top:0}
.om-review{display:flex;flex-direction:column;gap:10px;margin-top:10px}
.om-card{display:grid;grid-template-columns:auto 1fr;gap:6px 10px;background:#fff;border:1px solid var(--line);
  border-radius:0;padding:10px 12px}
.om-card.om-fail{border-color:#fca5a5;background:#fff5f5}
/* 拍摄要求提示条（amber 底色小字） */
.om-tip{display:flex;gap:6px;align-items:flex-start;background:var(--warn-bg);border:1px solid #fde0b0;
  color:#92400e;font-size:12.5px;line-height:1.65;border-radius:var(--r-sm);padding:9px 11px;margin:10px 0 4px}
.om-tip b{font-weight:700;flex:none}
/* 未识别卡片：边框变灰虚线 + 字段整体变淡，复选框已 disabled 不可勾选 */
.om-card.om-blocked{border-color:var(--line);border-style:dashed;background:#F5F7FA}
.om-card.om-blocked .om-fields{opacity:.5}
.om-card.om-blocked .om-sel{pointer-events:none}
.om-src{color:var(--muted);font-size:11.5px;font-weight:500;margin-right:6px}
.om-sel{grid-row:1;align-self:center}
.om-card .om-msg{grid-column:2;font-size:12px;color:#b45309}
/* v103：字段区跨整行 —— 复选框只占第一行左上角一格，不再独占一整条竖列，
   手机上每列输入框因此多出约 30px，客户名不再被截断 */
.om-fields{display:flex;flex-wrap:wrap;gap:8px;grid-column:1 / -1}
.om-f{display:flex;flex-direction:column;gap:2px;font-size:11px;color:var(--muted);min-width:96px;flex:1}
.om-f input{font-size:13px;padding:6px 8px}
@media (max-width:899px){
  .modal-card.wide{max-width:none;margin:0 12px}
  .cfg-card{padding:18px}
  .dual{flex-direction:column;gap:14px;min-height:auto}
  .dual-mid{flex-direction:row;justify-content:center;order:1;padding:0}
  .dual-col{order:2}
  .dual-box{max-height:260px;min-height:120px}
}

/* ============ v153 发货提醒 ============ */
/* 录入页提醒条（贴在车次横条下面） */
.remind-strip{margin:0 0 10px;border-radius:var(--r-md);overflow:hidden}
.remind-strip.hidden{display:none}
.remind-line{padding:8px 12px;font-size:13px;line-height:1.5}
.remind-line.warn{background:#FAEEDA;color:#633806;border-bottom:1px solid #EF9F27}
.remind-line.block{background:#FCEBEB;color:#A32D2D;border-bottom:1px solid #F09595}
.remind-line.info{background:var(--brand-soft2);color:var(--grade)}
.remind-line.ok{background:#EAF3DE;color:#3B6D11}
.remind-line:last-child{border-bottom:none}
.remind-line .reg-row{display:inline-flex;align-items:center;gap:6px;margin-left:8px;flex-wrap:wrap}
.remind-line .reg-row input,.remind-line .reg-row select{height:28px;font-size:12.5px;padding:0 6px}
/* 核对弹窗内提醒块 */
.remind-box{margin-bottom:10px;border:1px solid #F09595;border-radius:0;overflow:hidden}
.remind-box .remind-line{border-bottom:1px solid rgba(0,0,0,.06)}
/* 当日台账行内角标 */
.remind-badge{display:inline-block;background:#FAEEDA;color:#854F0B;border:1px solid #EF9F27;
  border-radius:0;font-size:10px;line-height:1;padding:2px 4px;margin-right:4px;cursor:help}
/* 当日台账顶部汇总条 */
.today-remind{margin:0 0 10px;background:#FAEEDA;border:1px solid #EF9F27;color:#633806;
  border-radius:var(--r-md);padding:8px 12px;font-size:13px}
.today-remind.hidden{display:none}
/* 发货提醒管理页 */
/* v172：＋按钮组从最右挪到标题右边靠左（黄哥要求"规则向左调整"） */
.remind-toolbar{display:flex;justify-content:flex-start;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:12px}
.remind-addbtns{display:flex;gap:8px;flex-wrap:wrap}
.remind-addbtns .btn.active{border-color:var(--primary);color:var(--primary);background:var(--brand-soft);font-weight:600}
/* v155：表单区加浅底色面板，字段等宽排布；备注独占一行收尾 */
/* v208：面板外框与网格拆开；所有字段共用固定两列，列宽天然一致 */
.remind-form-panel{margin:0 0 12px;background:#F5F7FA;border:1px solid var(--line);padding:12px 14px}
.remind-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 14px;align-items:end}
.remind-form-grid datalist{display:none}
.remind-form-grid label{font-size:12px;color:var(--muted);display:flex;flex-direction:column;gap:5px;min-width:0;line-height:1.4}
.remind-form-grid label.wide{grid-column:1/-1}
/* v230（黄哥 2026-11-11）：类型⑥「新客户发货」表单——仓库排第一（视觉顺序），其余沿用默认两列网格 */
.remind-form-grid[data-rt="6"] .rf-wh{order:-1}
/* v231（黄哥 2026-11-12）：类型⑥桌面端布局——第一行 仓库·批号；第二行 等级·未提货天数·有效期；第三行 备注。
   手机端维持单列不变（见下方 @media(max-width:599px)）。仍只用 order/span 做视觉重排，DOM 与取值逻辑不动。 */
@media (min-width:600px){
  .remind-form-grid[data-rt="6"]{grid-template-columns:repeat(3,minmax(0,1fr))}
  .remind-form-grid[data-rt="6"] .rf-wh{order:-1;grid-column:span 1}
  .remind-form-grid[data-rt="6"] .rf-batch{grid-column:span 2}
  .remind-form-grid[data-rt="6"] .rf-grade,
  .remind-form-grid[data-rt="6"] .rf-windays,
  .remind-form-grid[data-rt="6"] .rf-valid{grid-column:span 1}
}
/* v210（黄哥 2026-11-08）：批号与发货仓库同排、三个日期同排、备注独占一行。
   DOM 顺序与取值逻辑一行不动，只用 order 做视觉重排，避免影响提交与回填。 */
/* v221（黄哥 2026-11-10）：字段增列后按类型重排列数。
   ① 批号＋仓库 / 指定客户＋有效期 两列；② 保持默认两列；
   ③ 第一行 发货仓库＋批号＋有效期 三列，第二行 客户＋到场人员 两列；
   ④ 第一行 批号＋产品名称＋等级＋仓库 四列，第二行 起＋止＋有效期 三列；
   ⑤ 第一行 产品名称＋批号＋仓库 三列，第二行 起＋止＋有效期 三列，客户与备注整行。
   6 列能表达 2/3/6 列；④ 要 4 列，故单独用 12 列。DOM 顺序与取值逻辑不动，仍只用 order 做视觉重排。 */
.remind-form-grid[data-rt="1"],
.remind-form-grid[data-rt="3"],
.remind-form-grid[data-rt="5"]{grid-template-columns:repeat(6,minmax(0,1fr))}
.remind-form-grid[data-rt="4"]{grid-template-columns:repeat(12,minmax(0,1fr))}
/* ① 两列 */
.remind-form-grid[data-rt="1"] .rf-batch,
.remind-form-grid[data-rt="1"] .rf-wh,
.remind-form-grid[data-rt="1"] .rf-cust,
.remind-form-grid[data-rt="1"] .rf-valid{grid-column:span 3}
/* ③ 两列 + 三列 */
.remind-form-grid[data-rt="3"] .rf-cust,
.remind-form-grid[data-rt="3"] .rf-person{grid-column:span 3}
.remind-form-grid[data-rt="3"] .rf-wh,
.remind-form-grid[data-rt="3"] .rf-batch,
.remind-form-grid[data-rt="3"] .rf-valid{grid-column:span 2}
/* ④ 四列 + 三列 */
.remind-form-grid[data-rt="4"] .rf-batch,
.remind-form-grid[data-rt="4"] .rf-product,
.remind-form-grid[data-rt="4"] .rf-grade,
.remind-form-grid[data-rt="4"] .rf-wh{grid-column:span 3}
.remind-form-grid[data-rt="4"] .rf-dfrom,
.remind-form-grid[data-rt="4"] .rf-dto,
.remind-form-grid[data-rt="4"] .rf-valid{grid-column:span 3}
/* ⑤ 三列 + 三列 */
.remind-form-grid[data-rt="5"] .rf-product,
.remind-form-grid[data-rt="5"] .rf-batch,
.remind-form-grid[data-rt="5"] .rf-wh,
.remind-form-grid[data-rt="5"] .rf-dfrom,
.remind-form-grid[data-rt="5"] .rf-dto,
.remind-form-grid[data-rt="5"] .rf-valid{grid-column:span 2}
.remind-form-grid[data-rt="5"] .rf-cust{grid-column:1/-1}
/* 视觉顺序 —— 六类规则统一「发货仓库」置顶第一位（order:-1 比所有字段都小）；其余字段相对顺序不变 */
.remind-form-grid[data-rt="2"] .rf-wh{order:-1}
.remind-form-grid[data-rt="1"] .rf-batch{order:1}
.remind-form-grid[data-rt="1"] .rf-wh{order:-1}
.remind-form-grid[data-rt="1"] .rf-cust{order:3}
.remind-form-grid[data-rt="1"] .rf-valid{order:4}
.remind-form-grid[data-rt="1"] .rf-note{order:5}
.remind-form-grid[data-rt="3"] .rf-wh{order:-1}
.remind-form-grid[data-rt="3"] .rf-batch{order:1}
.remind-form-grid[data-rt="3"] .rf-valid{order:2}
.remind-form-grid[data-rt="3"] .rf-cust{order:3}
.remind-form-grid[data-rt="3"] .rf-person{order:4}
.remind-form-grid[data-rt="3"] .rf-note{order:6}
.remind-form-grid[data-rt="4"] .rf-batch{order:1}
.remind-form-grid[data-rt="4"] .rf-product{order:2}
.remind-form-grid[data-rt="4"] .rf-grade{order:3}
.remind-form-grid[data-rt="4"] .rf-wh{order:-1}
.remind-form-grid[data-rt="4"] .rf-dfrom{order:5}
.remind-form-grid[data-rt="4"] .rf-dto{order:6}
.remind-form-grid[data-rt="4"] .rf-valid{order:7}
.remind-form-grid[data-rt="4"] .rf-note{order:8}
.remind-form-grid[data-rt="5"] .rf-product{order:1}
.remind-form-grid[data-rt="5"] .rf-batch{order:2}
.remind-form-grid[data-rt="5"] .rf-wh{order:-1}
.remind-form-grid[data-rt="5"] .rf-dfrom{order:4}
.remind-form-grid[data-rt="5"] .rf-dto{order:5}
.remind-form-grid[data-rt="5"] .rf-valid{order:6}
.remind-form-grid[data-rt="5"] .rf-cust{order:7}
.remind-form-grid[data-rt="5"] .rf-note{order:8}
/* 类型④「业务员」与生产日期·起/止、有效期并排同一行：四格各占 3/12，合计 12 铺满；备注仍独占末行。
   不给 order 会默认 0 跳到最前，不给 grid-column 只占 1 列，都会挤乱 12 列网格。 */
.remind-form-grid[data-rt="4"] .rf-salesperson{order:8;grid-column:span 3}
/* v221：单列下所有字段压成整行——span 与 1fr 混用会造出隐式列，导致输入框半宽 */
@media(max-width:599px){.remind-form-grid > label{grid-column:1/-1 !important}}
.remind-form-grid input,.remind-form-grid select{height:34px;padding:0 10px;border:1px solid var(--line);
  border-radius:0;background:#fff;font-size:13px;color:var(--text);width:100%;box-sizing:border-box}
.remind-form-grid input:focus,.remind-form-grid select:focus{outline:none;border-color:var(--primary);
  box-shadow:0 0 0 3px var(--brand-ring)}
.remind-form-actions{display:flex;gap:8px;margin-bottom:12px}
/* v157：客户多选面板（点开勾选，多个自动顿号拼接） */
.msel{position:relative}
.msel > input[name]{cursor:pointer}
.msel > input[name]:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--brand-ring)}
.msel .msel-panel{position:absolute;z-index:50;top:calc(100% + 6px);left:0;right:0;background:#fff;
  border:1px solid var(--line);border-radius:0;box-shadow:0 12px 32px rgba(11,26,51,.16);
  max-height:240px;overflow:auto;padding:6px}
.msel .msel-item{display:flex;flex-direction:row;align-items:center;gap:9px;padding:8px 10px;
  font-size:13px;color:var(--text);cursor:pointer;border-radius:0;transition:background .12s ease}
.msel .msel-item:hover{background:#F0F3F7}
.msel .msel-item.checked{background:var(--brand-soft2);color:var(--brand-d);font-weight:600}
.msel .msel-item.disabled{opacity:.45;cursor:not-allowed}
/* v184：模糊过滤时被筛掉的候选（.hidden 权重过低，压不过 .msel .msel-item 的 display:flex，必须显式覆盖） */
.msel .msel-item.hidden{display:none}
.msel .msel-item input{width:16px;height:16px;accent-color:var(--primary);cursor:pointer;flex:none;margin:0}
.msel .msel-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.msel .msel-empty{padding:12px;font-size:12.5px;color:var(--muted);text-align:center}
.msel .msel-panel::-webkit-scrollbar{width:8px}
.msel .msel-panel::-webkit-scrollbar-thumb{background:var(--sidebar-text);border-radius:0}
.remind-pending .pend-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:8px 0;border-bottom:1px solid var(--line);font-size:13px}
.remind-pending .pend-row:last-child{border-bottom:none}
.remind-pending .pend-btns{margin-left:auto;display:flex;gap:6px}
.remind-tbl td.obj{white-space:normal}
/* 规则卡片上的「录入人 · 日期」小字：标题下方再占一行、字号小一号、灰色；放不下时允许折行 */
.remind-meta{display:block;margin-top:3px;font-size:12px;line-height:1.4;color:var(--muted);white-space:normal}
.rpill{display:inline-block;border-radius:0;padding:2px 8px;font-size:11px;white-space:nowrap}
.rpill.ok{background:#EAF3DE;color:#3B6D11}
.rpill.mut{background:var(--line);color:var(--muted)}
/* v219：规则多了「待审核 / 已驳回」两种状态，原来没有对应样式会退化成灰底，看不清轻重 */
.rpill.warn{background:#FFF4E0;color:#8A5A00}
.rpill.bad{background:#FDE7E7;color:#A32B2B}
/* v171：规则关闭操作展开成整行（colspan=5），不再挤在窄操作列里溢出表格外 */
.close-ui{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.close-ui .inp{width:auto;min-width:220px;max-width:320px;height:32px}
.remind-tbl .close-row>td{background:#F5F7FA}
/* v211（黄哥 2026-11-08）：规则列表在手机上由「五列表格」改成卡片流。
   原来四列固定宽 120+90+110+210=530px，加上「要求」列必定超过手机宽度，
   结果是要求文字顶出卡片被裁、效期/状态/操作三列被整个挤出屏幕（操作按钮点不到）。
   桌面端表格原样保留，只在 ≤899px（与全站手机断点同口径）切成卡片。 */
@media(max-width:899px){
  .remind-tbl{display:block;width:100%;font-size:13px;border-collapse:separate}
  .remind-tbl thead{display:none}
  .remind-tbl tbody{display:block}
  .remind-tbl tr{display:grid;grid-template-columns:minmax(0,1fr) auto;
    grid-template-areas:"type status" "obj obj" "valid valid" "ops ops";
    gap:6px 10px;padding:12px;margin-bottom:10px;border:1px solid var(--line);
    border-radius:var(--r-md);background:var(--card);cursor:default}
  .remind-tbl tr:last-child{margin-bottom:0}
  .remind-tbl td{display:block;padding:0;border:none;white-space:normal;overflow-wrap:anywhere}
  .remind-tbl td:nth-child(1){grid-area:type;align-self:center;font-weight:600;color:var(--text)}
  .remind-tbl td:nth-child(2){grid-area:obj;line-height:1.55;color:var(--text)}
  .remind-tbl td:nth-child(3){grid-area:valid;font-size:12px;color:var(--muted)}
  .remind-tbl td:nth-child(3)::before{content:"效期："}
  .remind-tbl td:nth-child(4){grid-area:status;justify-self:end;align-self:center}
  .remind-tbl td:nth-child(5){grid-area:ops;display:flex;flex-wrap:wrap;gap:8px;padding-top:2px}
  /* 关闭原因展开行：整块铺满，不再被 grid 挤成两格 */
  .remind-tbl tr.close-row{display:block;padding:12px;background:#F5F7FA}
  .remind-tbl tr.close-row>td{grid-column:1/-1;background:transparent}
  .close-ui .inp{min-width:0;flex:1 1 130px;max-width:none}
}

/* v212（黄哥 2026-11-08）
   ① 真凶：table.tbl{min-width:900px} 是「元素+类」选择器，优先级压过只写 .remind-tbl 的规则，
      卡片虽然改成了块，表格本身仍按 900px 排版 → 文字在 900px 处换行、被屏幕右缘切掉。
      必须写 table.remind-tbl 才压得住（同 table.ledger-tbl / #whBox table.tbl 的做法）。
   ② 主题收进「⋯」抽屉后改成横向卡片条：每屏最多 5 个，多的左右滑动。
   ③ 抽屉整体上移，不再贴着底部导航。
   ④ 规则卡片间距 / 对齐 / 触控目标微调。 */
@media(max-width:899px){
  /* ① 拆掉 900px 最小宽度，卡片才真正按屏幕宽度排版 */
  table.remind-tbl{min-width:0}
  /* ④ 卡片留白与行距：类型与要求之间拉开一档，卡片之间 12px */
  .remind-tbl tr{padding:14px;gap:9px 10px;margin-bottom:12px}
  .remind-tbl td:nth-child(1){font-size:14px;line-height:1.3}
  .remind-tbl td:nth-child(2){font-size:13px;line-height:1.65}
  .remind-tbl td:nth-child(3){font-size:12.5px}
  /* 操作区加一条浅分隔线，和上面内容分开，三个按钮间距 10px（比 8px 更好点） */
  .remind-tbl td:nth-child(5){gap:10px;margin-top:2px;padding-top:10px;border-top:1px solid #F0F3F7}
  /* v219：⋯ 菜单从「底部抽屉」改成「紧贴 ⋯ 按钮下方的下拉面板 + 遮罩」。
     原来贴底导航上方 34px，黄哥反映离手指远、还压住底栏；改下拉后拇指一伸就到。
     用 ID 选择器压过上面 .theme-menu,.more-menu 的 left/right/top/bottom。 */
  #topMoreMenu{position:fixed;left:auto;right:12px;
    top:calc(var(--topbar-h) + env(safe-area-inset-top) + 8px);bottom:auto;
    width:min(260px,calc(100vw - 24px));min-width:0;
    max-height:calc(100vh - var(--topbar-h) - env(safe-area-inset-top) - var(--bottomnav-h) - env(safe-area-inset-bottom) - 28px);
    overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;
    box-shadow:0 8px 24px rgba(11,26,51,.18)}
  /* 遮罩铺满全屏、压在面板下面（79 < 面板 80），点一下由 JS 收起菜单 */
  .topmore-mask{display:block;position:fixed;top:0;right:0;bottom:0;left:0;
    background:rgba(11,26,51,.28);z-index:79;-webkit-tap-highlight-color:transparent}
  /* ② 抽屉内的主题：横向一排，每屏 5 个，多的左右滑 */
  #topMoreMenu #themeMenu{position:static;left:auto;right:auto;top:auto;bottom:auto;
    display:flex;flex-wrap:nowrap;gap:8px;overflow-x:auto;overflow-y:hidden;
    -webkit-overflow-scrolling:touch;scroll-snap-type:x mandatory;
    width:auto;min-width:0;margin:0 0 4px;padding:2px 0 10px;
    background:none;border:none;border-bottom:1px solid var(--line);box-shadow:none}
  #topMoreMenu #themeMenu .theme-item{flex:0 0 calc((100% - 32px)/5);min-width:0;
    flex-direction:column;justify-content:center;gap:4px;padding:8px 2px;
    font-size:11px;text-align:center;scroll-snap-align:start}
  #topMoreMenu #themeMenu .theme-sw{width:18px;height:18px}
  #topMoreMenu #themeMenu .theme-item .theme-tick{display:none}   /* 太窄放不下，靠 active 边框识别 */
}

/* v213（黄哥 2026-11-08）
   ① 底部导航 7 个入口改成「每屏 5 个、多的左右滑」，不再挤成一排小字；
      切页时 JS 会把当前入口滚到中间（switchView 里）。
   ② 仓库审批人改成「已选才显示 + ＋ 添加人员下拉（可搜索）」，人再多也不会铺满一屏。 */
@media(max-width:899px){
  .bottomnav{display:flex;overflow-x:auto;overflow-y:hidden;
    scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch}
  .bottomnav::-webkit-scrollbar{display:none;width:0;height:0}
  .bn-item{flex:0 0 20%}
}
/* ② 与屏幕宽度无关：电脑、手机同一套 */
.wa-picked{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-height:34px;margin-bottom:4px}
.wa-empty{font-size:12.5px;color:var(--muted)}
.wa-chip{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 4px 0 12px;
  border:1px solid var(--primary);background:var(--primary-soft);color:var(--primary);
  font-size:13.5px;font-weight:600;white-space:nowrap}
.wa-chip-x{border:none;background:transparent;color:var(--primary);font-size:16px;line-height:1;
  cursor:pointer;padding:0 6px;opacity:.75;font-family:inherit}
.wa-chip-x:hover{opacity:1}
.wa-add{position:relative;margin-top:8px}
.wa-pop{position:absolute;z-index:60;left:0;top:calc(100% + 6px);width:260px;max-width:92vw;
  background:var(--card);border:1px solid var(--line);box-shadow:0 12px 30px rgba(11,26,51,.18);padding:8px}
.wa-pop .wa-search{width:100%;margin-bottom:6px}
.wa-cand{max-height:240px;overflow:auto}
.wa-cand-item{display:flex;width:100%;align-items:center;height:34px;padding:0 10px;border:none;
  background:transparent;font-size:13.5px;color:var(--text);cursor:pointer;font-family:inherit;text-align:left}
.wa-cand-item:hover{background:var(--bg)}




/* ================= v186 客户名称库 ================= */
.cl-badge{display:inline-block;background:var(--brand);color:#fff;font-size:10px;font-weight:600;padding:2px 8px;border-radius:0;vertical-align:2px;margin-left:6px}
.cl-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.cl-dupstrip{background:var(--warn-strip-bg);border:1px solid #F0C98A;border-radius:0;padding:8px 12px;margin-bottom:10px}
.cl-dup-h{font-size:12px;font-weight:700;color:#92600E;margin-bottom:4px}
.cl-dup-row{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:3px 0}
.cl-dup-names{font-size:12.5px;color:#7A4A00}
.cl-dup-acts{display:flex;gap:6px}
.cl-tbl{width:100%;border-collapse:collapse;font-size:13px}
.cl-tbl th,.cl-tbl td{border-bottom:1px solid var(--line,#E3E8EF);padding:8px 10px;text-align:left;vertical-align:middle}
.cl-tbl thead th{color:var(--lv2-text);font-weight:500;font-size:11.5px;background:#F5F7FA;white-space:nowrap}
.cl-tbl tbody tr:hover{background:var(--brand-tint)}
.cl-cb{width:36px;text-align:center}
.cl-dup-tag{display:inline-block;background:#FDF0D5;color:#92600E;font-size:10.5px;padding:1px 7px;border-radius:0;margin-left:6px}
.cl-keep-tag{display:inline-block;background:#E8F1E8;color:#256B2F;font-size:10.5px;padding:1px 7px;border-radius:0;margin-left:6px}
.cl-rule-ref{color:var(--brand);cursor:pointer;text-decoration:underline dotted}
.cl-ops{white-space:nowrap}
.cl-ops .btn{margin-right:6px}
.cl-danger{color:#c0392b}
.cl-foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px}
.cl-pager{display:flex;gap:6px}
.cl-mergepanel{border:1px solid var(--brand-line);background:var(--brand-tint);border-radius:0;padding:10px 14px;margin-top:10px}

/* ================= v188 系统管理子菜单：日志管理 / 系统设置 ================= */
.log-filters{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:10px 0 12px}
/* v190：.inp 默认 width:100% 会把筛选控件各占一行 —— 这里改成行内自适应，一行排开 */
.log-filters .inp{width:auto;height:32px;flex:1 1 130px;min-width:110px;max-width:230px}
.log-filters #logQ{flex:2 1 240px;max-width:340px}
.log-filters .btn{flex:0 0 auto;height:32px}
.log-filters .muted{flex:0 0 auto}
.log-filters .inp{height:32px}
.log-tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.log-tbl th,.log-tbl td{border-bottom:1px solid var(--line,#E3E8EF);padding:7px 9px;text-align:left;vertical-align:top}
.log-tbl thead th{background:#F5F7FA;color:var(--lv2-text);font-weight:500;font-size:11.5px;white-space:nowrap}
.log-tbl tbody tr:hover{background:var(--brand-tint)}
.log-tbl .lg-old{color:var(--sidebar-muted);max-width:220px;word-break:break-all}
.log-tbl .lg-new{color:var(--car-text);max-width:220px;word-break:break-all}
.lg-tag{display:inline-block;padding:1px 8px;border-radius:0;font-size:11px;background:#F0F3F7;color:#55637A;white-space:nowrap}
.lg-tag.lg-add{background:#E8F1E8;color:#256B2F}
.lg-tag.lg-edit{background:var(--brand-soft2);color:var(--brand-d)}
.lg-tag.lg-del{background:#FDECEC;color:#B42318}
.log-foot{display:flex;align-items:center;gap:10px;margin-top:10px}
.ver-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px 18px;margin-top:8px}
.ver-grid>div{display:flex;justify-content:space-between;gap:10px;border-bottom:1px dashed var(--line,#E3E8EF);padding:6px 0;font-size:13px}
.ver-grid b{font-weight:500;color:var(--lv2-text)}
.ver-grid span{color:var(--car-text);font-weight:600}
.ver-grid span.ver-bad{color:#B42318}
.ver-warn{margin-top:10px;background:var(--warn-strip-bg);border:1px solid #F0C98A;color:#92600E;border-radius:0;padding:8px 12px;font-size:12.5px}
.purge-sum{margin-top:10px;font-size:13px;color:#1A2233}
.purge-h{margin:12px 0 6px;font-size:13px;color:#92600E}
.purge-tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.purge-tbl th,.purge-tbl td{border-bottom:1px solid var(--line,#E3E8EF);padding:6px 9px;text-align:left}
.purge-tbl thead th{background:#F5F7FA;color:var(--lv2-text);font-weight:500;font-size:11.5px}

/* ============ v193 多主题（参照 WorkBuddy 主题选择器） ============
   v194：侧栏统一纯白（黄哥拍板），不随主题变 —— 主题块里一律不要写 --sidebar*。
   换主题 = 只覆盖下面这组品牌变量；新增主题时照抄一个块、换 15 个值即可。
   注意：白字压表头的对比度全部 ≥4.6（活力橙特意用 #C64310 而不是 #FF6A00，
   后者白字对比度只有 2.9，表头会看不清）。 */
body[data-theme="violet"]{
  --brand:#5B4CF5; --brand-d:#4A3CDB; --brand-soft:#EEECFE; --brand-soft2:#E6E3FC;
  --brand-hover:#D7D3F8; --brand-line:#C7C2F3; --brand-tint:#F6F5FE; --grid:#DBD8F0;
  --car-text:#2A2270; --grade:#4A3CDB; --lv2-text:#55507A;
  --brand-ring:rgba(91,76,245,.13);
}
body[data-theme="green"]{
  --brand:#0C6B5E; --brand-d:#085247; --brand-soft:#E3F4F0; --brand-soft2:#D5EEEA;
  --brand-hover:#B9E3DC; --brand-line:#A3D8CF; --brand-tint:#F2F9F7; --grid:#CBE3DE;
  --car-text:#0A4A40; --grade:#085247; --lv2-text:#43605A;
  --brand-ring:rgba(12,107,94,.13);
}
body[data-theme="orange"]{
  --brand:#C64310; --brand-d:#A33609; --brand-soft:#FFF0E6; --brand-soft2:#FFE4D3;
  --brand-hover:#FBD0B8; --brand-line:#F5BC9C; --brand-tint:#FFF7F1; --grid:#EDD5C6;
  --car-text:#7A3208; --grade:#A33609; --lv2-text:#6B5142;
  /* 橙色主色会稀释差异橙 → 差异色改洋红，保住"哪里是异常"的辨识度 */
  --diff-text:#C2185B; --diff-bg:#FCF0F4; --diff-bg-hover:#F9E2EC; --diff-line2:#EFC9DA;
  --brand-ring:rgba(198,67,16,.13);
}
body[data-theme="rose"]{
  --brand:#D6336C; --brand-d:#B02457; --brand-soft:#FDECF2; --brand-soft2:#FADFE9;
  --brand-hover:#F5C6D8; --brand-line:#F0B4CB; --brand-tint:#FEF5F8; --grid:#EBD2DC;
  --car-text:#7A1E44; --grade:#B02457; --lv2-text:#6B4A5C;
  --brand-ring:rgba(214,51,108,.13);
}

/* v194 灰白色（侧栏随全局统一纯白，差异橙/成功绿保留做提醒色） */
body[data-theme="gray"]{
  --brand:#55637A; --brand-d:#384456; --brand-soft:#F1F3F7; --brand-soft2:#E9EDF3;
  --brand-hover:#DEE3EC; --brand-line:#CFD6E2; --brand-tint:#F5F7FA; --grid:#DDE2EA;
  --car-text:#2B3442; --grade:#384456; --lv2-text:#55607A;
  --brand-ring:rgba(71,85,105,.13);
}

/* ---------- 主题选择器（台账底部白条左侧） ---------- */
.theme-pick{position:relative;display:flex;align-items:center;flex:none}
.theme-menu{position:absolute;right:0;top:calc(100% + 6px);z-index:80;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r-md);box-shadow:0 12px 30px rgba(11,26,51,.18);
  padding:10px;display:grid;grid-template-columns:1fr 1fr;gap:6px;min-width:250px}
.theme-item{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:0;cursor:pointer;
  border:1px solid transparent;background:#fff;font-size:13.5px;color:var(--text);text-align:left;
  font-family:inherit;transition:.15s}
.theme-item:hover{background:var(--bg)}
.theme-item.active{border-color:var(--brand);color:var(--brand);font-weight:500}
.theme-sw{width:15px;height:15px;border-radius:0;flex:none;border:1px solid rgba(0,0,0,.08)}
.theme-item .theme-tick{margin-left:auto;font-size:12px;color:var(--brand)}

/* ---------- v201 默认仓库权限配置（复用 .tbl/.inp/.switch/.toolbar，仅补布局） ---------- */
#whPolicyBox table.tbl{min-width:0}   /* 列少，别被 table.tbl 的 min-width:900px 撑出横向滚动 */
.whp-form{margin-top:14px;padding-top:12px;border-top:1px dashed var(--line)}
.whp-grid{display:grid;grid-template-columns:110px 1fr;gap:8px 12px;align-items:center;max-width:560px}
.whp-grid .f-label{margin:0}
.whp-grid .inp{width:100%}
@media(max-width:599px){.whp-grid{grid-template-columns:1fr}}
#whApproveBox table.tbl{min-width:0}   /* v205：审批页仓库授权卡片，别被 table.tbl 的 min-width:900px 撑出横向滚动 */

/* v206：红框内标题与「＋」按钮字号/行高/基线统一，文字在同一水平线上 */
.remind-toolbar .card-title{margin:0;font-size:13px;line-height:34px;font-weight:600;white-space:nowrap;flex-shrink:0}
.remind-toolbar .remind-addbtns{align-items:center}
.remind-toolbar .btn.sm{height:34px;line-height:1;font-size:13px;padding:0 10px;display:inline-flex;align-items:center;justify-content:center}
/* v206：老规则补填提示（v208 起红星并入系统 .req 口径、标签不再另设深色加粗） */
.remind-wh-tip{margin:0 0 10px;padding:8px 10px;background:#FCEBEB;border:1px solid #F09595;color:#A32D2D;font-size:12.5px}
.remind-edit-title{font-size:13px;margin:0 0 10px;color:var(--text)}

/* v208：发货仓库字段与原有字段同结构、同字色、同基线 */
.remind-form-grid .lbl-txt{display:inline-flex;align-items:center;gap:2px}
.remind-form-grid .lbl-txt .req-star{margin-left:0}
@media(max-width:599px){.remind-form-panel{padding:10px 12px}.remind-form-grid{grid-template-columns:1fr}}
/* v210：手机上三日期并排会每个不到 100px 放不下日期，仍收单列 */
@media(max-width:599px){.remind-form-grid[data-rt="1"],.remind-form-grid[data-rt="3"],.remind-form-grid[data-rt="4"],.remind-form-grid[data-rt="5"]{grid-template-columns:1fr}}

/* v206：统一线性图标（网页版与手机端共用一套，线条粗细/尺寸/颜色统一） */
.lico-sprite{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none}
.lico{width:1.15em;height:1.15em;vertical-align:-0.18em;display:inline-block;flex-shrink:0;
  fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.nav-item .ico .lico{width:18px;height:18px;vertical-align:middle}
.bn-item .ico .lico{width:19px;height:19px;vertical-align:middle}
.state .big .lico{width:1.5em;height:1.5em;vertical-align:middle}

/* ==================================================================
   v214（黄哥 2026-11-08）：手机端「用户管理」「仓库授权申请」两张表改卡片流
   —— 红框里表格右侧被切、底下冒横向滚动条，根子和 v211 一模一样：
      table.tbl{min-width:900px} 是「元素+类」选择器（0,1,1），
      只写类名的 .user-tbl / .wa-tbl 压不住它 → 必须写 table.user-tbl / table.wa-tbl。
   断点 899 与全站手机断点同口径；电脑端一分一毫不动（全在 @media 里）。
   ================================================================== */
table.user-tbl{min-width:0}
table.wa-tbl{min-width:0}

@media(max-width:899px){
  /* ---------------- ① 用户管理（账号/姓名/角色/历史范围/长期仓库/操作） ---------------- */
  .user-tbl{display:block;width:100%;font-size:13.5px;border-collapse:separate}
  .user-tbl thead{display:none}
  .user-tbl tbody{display:block}
  .user-tbl tr{display:grid;gap:7px 10px;padding:13px 14px 11px;margin-bottom:10px;
    border:1px solid var(--line);border-radius:var(--r-md);background:var(--card);
    grid-template-columns:minmax(0,1fr) auto;
    grid-template-areas:"nm role" "acc role" "hist hist" "ltw ltw" "ops ops"}
  .user-tbl tr:last-child{margin-bottom:0}
  .user-tbl tbody tr:hover{background:var(--card)}
  table.user-tbl td{display:block;padding:0;border:none;white-space:normal;
    overflow-wrap:anywhere;min-width:0;font-size:13.5px;line-height:1.45}
  table.user-tbl td:nth-child(1){grid-area:acc;font-size:12px;color:var(--muted);line-height:1.2}
  table.user-tbl td:nth-child(1)::before{content:"账号 "}
  table.user-tbl td:nth-child(2){grid-area:nm;font-size:15px;font-weight:600;line-height:1.3}
  table.user-tbl td:nth-child(3){grid-area:role;align-self:center}
  table.user-tbl td:nth-child(3) .inp{width:auto;min-width:92px;height:32px;font-size:13.5px;padding:0 28px 0 8px}
  /* 历史数据范围：左边固定小标签、右边下拉自适应宽度，长档位名（跟随角色（最近180天））也压得进去 */
  table.user-tbl td:nth-child(4){grid-area:hist;display:grid;
    grid-template-columns:auto minmax(0,1fr);gap:8px;align-items:center}
  table.user-tbl td:nth-child(4)::before{content:"历史数据范围";font-size:12.5px;color:var(--muted);white-space:nowrap}
  table.user-tbl td:nth-child(4) .inp{width:100%;min-width:0;height:32px;font-size:13.5px;padding:0 28px 0 8px}
  table.user-tbl td:nth-child(5){grid-area:ltw;display:grid;
    grid-template-columns:auto minmax(0,1fr);gap:8px;align-items:center}
  table.user-tbl td:nth-child(5)::before{content:"长期开通仓库";font-size:12.5px;color:var(--muted);white-space:nowrap}
  table.user-tbl td:nth-child(5) .wh-tags{max-width:none}
  table.user-tbl td.ops{grid-area:ops;display:flex;flex-wrap:wrap;gap:8px;align-items:center;
    margin-top:3px;padding-top:10px;border-top:1px solid #F0F3F7}
  table.user-tbl td.ops .btn{flex:1 1 0}
  table.user-tbl td.ops .sm-text{flex:1 1 0;text-align:center}

  /* ---------------- ② 仓库授权申请（申请人/发货仓库/状态/申请时间/备注/操作） ---------------- */
  .wa-tbl{display:block;width:100%;font-size:13.5px;border-collapse:separate}
  .wa-tbl thead{display:none}
  .wa-tbl tbody{display:block}
  .wa-tbl tr{display:grid;gap:6px 10px;padding:13px 14px 11px;margin-bottom:10px;
    border:1px solid var(--line);border-radius:var(--r-md);background:var(--card);
    grid-template-columns:minmax(0,1fr) auto;
    grid-template-areas:"who status" "wh wh" "time time" "note note" "ops ops"}
  .wa-tbl tr:last-child{margin-bottom:0}
  .wa-tbl tbody tr:hover{background:var(--card)}
  table.wa-tbl td{display:block;padding:0;border:none;white-space:normal;
    overflow-wrap:anywhere;min-width:0;font-size:13.5px;line-height:1.45}
  table.wa-tbl td:nth-child(1){grid-area:who;font-size:15px;font-weight:600;line-height:1.3}
  table.wa-tbl td:nth-child(2){grid-area:wh}
  table.wa-tbl td:nth-child(3){grid-area:status;align-self:start;text-align:right;white-space:nowrap}
  table.wa-tbl td:nth-child(3) .badge{margin-left:4px}
  table.wa-tbl td:nth-child(4){grid-area:time;font-size:12.5px;color:var(--muted)}
  table.wa-tbl td:nth-child(5){grid-area:note;font-size:12.5px;color:var(--muted)}
  table.wa-tbl td:nth-child(2)::before{content:"仓库 "}
  table.wa-tbl td:nth-child(4)::before{content:"时间 "}
  table.wa-tbl td:nth-child(5)::before{content:"备注 "}
  table.wa-tbl td:nth-child(2)::before,
  table.wa-tbl td:nth-child(4)::before,
  table.wa-tbl td:nth-child(5)::before{color:var(--muted);font-size:12.5px}
  /* 操作：待审行是两个按钮各占一半；已处理行是「已通过/已拒绝」字样，靠右，不再单占一行横线 */
  table.wa-tbl td.ops{grid-area:ops;display:flex;flex-wrap:wrap;gap:8px;align-items:center;
    margin-top:2px;justify-content:flex-end}
  table.wa-tbl td.ops .btn{flex:1 1 0}
  /* 空态那一行（colspan=6）整行居中，不按卡片网格摆 */
  .wa-tbl tr:has(td[colspan]){display:block}
  table.wa-tbl td[colspan]{grid-column:1/-1;grid-row:1;text-align:center;padding:12px 0;color:var(--muted)}
  /* 手机端「仓库授权」弹层：我的仓库权限改卡片流，长原因完整换行，四列不再挤出屏幕 */
  #whBox table.tbl{display:block;width:100%;min-width:0;border-collapse:separate}
  #whBox table.tbl thead{display:none}
  #whBox table.tbl tbody{display:block}
  #whBox table.tbl tr{display:block;padding:12px 14px;margin-bottom:10px;
    background:var(--card);box-shadow:inset 0 0 0 1px var(--line);border-radius:var(--r-md)}
  #whBox table.tbl tr:last-child{margin-bottom:0}
  #whBox table.tbl td{display:block;padding:0;border:0;white-space:normal;
    overflow-wrap:anywhere;min-width:0;line-height:1.5}
  #whBox table.tbl td:nth-child(1){font-size:15px;font-weight:600;margin-bottom:6px}
  #whBox table.tbl td:nth-child(3)::before{content:"有效期 "}
  #whBox table.tbl td:nth-child(4){margin-top:8px}
  #whBox table.tbl .sm-text{white-space:normal}
}

/* ==================================================================
   v215（黄哥 2026-11-09）：台账表头统一（历史数据 / 当日数据 共用）
   原来的三个毛病：
     ① 表头全部居中，但长文本会被省略号从右边切掉 → 同一个「客户名称」列里，
        短值居中、长值看着像左对齐，一眼看过去整列是歪的；
     ② 表头 12px / 700 粗 + 左右内边距只有 4px，白字发胀、还贴边；
     ③ 表头行比数据行矮一截，压在深蓝块里显得扁。
   现在：表头定高 36px 单行、12.5px / 600、左右各 8px；
        按「文本左 / 数值右 / 日期·等级·操作居中」分列对齐，表头与数据同一基线。
   注意：这里的 :is(...) 里带了 tr.det / tr.car-row / tr.lv2-head，四层一起对齐，
        否则表头右对齐、明细还居中，等于白改。
   v220（黄哥 2026-11-09）：对齐口径改为全表居中；表头高度/字号/渐变底等其余 v215 成果保留。
   ================================================================== */
.ledger-tbl thead th{background:linear-gradient(180deg,var(--brand) 0%,var(--brand-d) 100%);color:#fff;
  font-weight:600;font-size:12.5px;letter-spacing:.4px;
  text-align:center;white-space:nowrap;
  height:36px;line-height:36px;padding:0 8px;
  position:sticky;top:0;z-index:3;
  border-right:1px solid rgba(255,255,255,.18);
  border-bottom:none;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.16),inset 0 -2px 0 rgba(0,0,0,.22)}
/* 明细单元格左右内边距与表头对齐（原来 6px，比表头缩 2px，看着不齐）；
   排除操作列 —— 那格是 4 个文字按钮，多加 4px 就挤出去了 */
.ledger-tbl tr.det td:not(.ops){padding:8px 8px}
/* 文本列（车牌号 / 客户名称 / 批号）：v220 起按黄哥要求统一居中（与全表口径一致） */
.ledger-tbl :is(thead th,tr.det td,tr.car-row td,tr.lv2-head td):nth-child(3),
.ledger-tbl :is(thead th,tr.det td,tr.car-row td,tr.lv2-head td):nth-child(4),
.ledger-tbl :is(thead th,tr.det td,tr.car-row td,tr.lv2-head td):nth-child(5){text-align:center}
/* 数值列（计划/扫描/差异 的件数与重量，第 6~11 列）：v220 起按黄哥要求统一居中，内边距复位到 8px */
.ledger-tbl :is(thead th,tr.det td,tr.car-row td,tr.lv2-head td):nth-child(n+6):nth-child(-n+11){text-align:center}
.ledger-tbl :is(thead th,tr.det td,tr.car-row td,tr.lv2-head td):nth-child(n+6):nth-child(-n+11){padding-right:8px}
/* 尾部可配置列（发货仓库、承运商、备注…）：v220 起按黄哥要求统一居中 */
.ledger-tbl :is(thead th,tr.det td,tr.car-row td,tr.lv2-head td):nth-child(n+13){text-align:center}
/* 操作列（含表头）始终居中：sticky 冻结列，左边有阴影，居中才不偏 */
.ledger-tbl :is(thead th,tr.det td,tr.car-row td,tr.lv2-head td):last-child{text-align:center}
/* 末列与右侧留白格单独补回：渐变底 + 顶部高光（这两格各有自己的 background/box-shadow，会盖掉上面那条） */
.ledger-tbl thead th:last-child{background:linear-gradient(180deg,var(--brand) 0%,var(--brand-d) 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.16),inset 0 -2px 0 rgba(0,0,0,.22),
  -6px 0 8px -6px rgba(11,26,51,.22)}
.ledger-tbl thead th.h1blank{background:linear-gradient(180deg,var(--brand) 0%,var(--brand-d) 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.16),inset 0 -2px 0 rgba(0,0,0,.22)}

/* ============ v217：待批页「已由他人处理」公示行 ============ */
/* 只读知会：浅色底 + 左侧竖线，一眼和「等我处理」的行区分开；
   配色全用主题变量，6 套主题下都不会顶一块蓝 */
.tbl tbody tr.appr-pub{background:var(--brand-tint)}
.tbl tbody tr.appr-pub td{color:var(--muted)}
.tbl tbody tr.appr-pub td.ops{color:var(--text)}
.appr-pub .rec-public-note{color:var(--muted);font-size:12.5px}
/* 用 inset 阴影代替 border-left：.rec 本身有 1px 边框，改成 3px 会把正文挤右 2px，
   同页卡片就错位了（和 sticky 边框丢失是同一类问题）。同时保留卡片原有的阴影。 */
.rec.appr-pub{background:var(--brand-tint);box-shadow:inset 3px 0 0 var(--brand-line),var(--shadow)}

/* ================= v216：手机底栏「待批」任务提醒角标 ================= */
/* 绝对定位挂在 19px 图标右上角，不占格子宽度 —— 底栏每格只有 20%（390px 屏 = 78px），
   如果让角标参与排版，会把「待批」两个字挤成省略号。
   位置算式：按钮高 58px，图标 19px + gap 2px + 文字约 17px 居中 → 图标上沿约在 10px 处，
   top:-7px 之后角标上沿落在按钮内 3px，因此不会被 .bottomnav 的 overflow-y:hidden 裁掉。 */
.bn-badge{position:absolute;top:-7px;left:50%;margin-left:2px;
  height:17px;min-width:17px;padding:0 5px;border-radius:9px;
  background:var(--danger);color:#fff;
  font-size:11px;line-height:17px;font-weight:600;letter-spacing:0;
  text-align:center;white-space:nowrap;
  box-shadow:0 0 0 2px var(--card);          /* 白色描边把角标和图标分开，底栏底色就是 --card */
  pointer-events:none;                        /* 点角标等于点按钮，不吞点击 */
  z-index:2}
.bn-badge.hidden{display:none}
/* 320px 窄屏（iPhone SE）：格子只有 64px，「99+」得再收一档，否则会顶到格子边缘 */
@media(max-width:359px){
  .bn-badge{top:-6px;margin-left:1px;font-size:10px;height:16px;line-height:16px;
    min-width:16px;padding:0 4px;border-radius:8px}
}

/* ================= v218：手机端顶栏图标去框 + 图标/文字/间距比例统一 ================= */
/* 只作用于手机断点（max-width:899px），电脑端一分一毫不动。
   ① 右上「刷新 / ⋯」原本是 .btn.ghost 的白底 + 细边框小方块，现褪成透明纯图标；
      用 .top-right #id 的 ID 选择器压过 .btn.ghost / .btn.ghost:hover，主题变量不写死 hex。
   ② 图标适度放大，与姓名文字、按钮间距保持同一比例；触摸目标仍保持 40x40。
   ③ 底栏图标/文字/间距同步放大一档；320px 窄屏单独再收一档，避免文字被裁。
   ④ 底栏两对入口的位置互换在 index.html 的 DOM 顺序里做，这里不写 order，避免横滑滚动错位。 */
@media(max-width:899px){
  .top-right #btnRefresh,.top-right #btnTopMore{
    background:transparent;border-color:transparent;box-shadow:none;
    padding:0;width:40px;min-width:40px
  }
  .top-right #btnRefresh:hover,.top-right #btnTopMore:hover{
    background:transparent;border-color:transparent;color:var(--primary)
  }
  /* v220：黄哥觉得 22px 偏大，小一号到 20px；去框规则与 40x40 触摸目标保持不变 */
  .top-right #btnRefresh .lico{width:20px;height:20px}
  .top-right #btnTopMore{font-size:20px;line-height:1}
  .top-right{gap:6px}
  .bn-item{font-size:11.5px;gap:3px}
  .bn-item .ico{font-size:22px}
  .bn-item .ico .lico{width:21px;height:21px}
}
@media(max-width:359px){
  .bn-item{font-size:10.5px;gap:2px}
  .bn-item .ico{font-size:20px}
  .bn-item .ico .lico{width:19px;height:19px}
}


/* ---------- v228（黄哥 2026-11-11）：间距放宽 / 当日数据隐藏日期 / 姓名收纳 ---------- */
/* 当日数据页：日期按钮整块不显示；仓库下拉靠 flex 自动变宽，其余间距不变。 */
.date-hidden{display:none !important}

/* 网页版：点姓名弹出的常用设置（手机端由下方断点整体隐藏） */
.top-right #appUser.user-trigger{cursor:pointer;padding:4px 6px;border-radius:var(--r-md);outline:none;transition:background .15s}
.top-right #appUser.user-trigger:hover,.top-right #appUser.user-trigger:focus-visible{background:var(--bg)}
.top-right #appUser.user-trigger::after{content:"\25BE";margin-left:4px;font-size:11px;color:var(--muted)}
.user-menu{position:absolute;right:0;top:calc(100% + 6px);z-index:80;min-width:172px;
  background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);
  box-shadow:0 12px 30px rgba(11,26,51,.18);padding:8px;display:flex;flex-direction:column;gap:4px}
.user-menu-hd{font-size:12px;color:var(--muted);padding:4px 8px 8px;border-bottom:1px solid var(--line);
  margin-bottom:2px;white-space:nowrap}
.user-menu-item{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 10px;
  border:0;background:transparent;border-radius:0;font-size:13.5px;color:var(--text);font-family:inherit;
  cursor:pointer;text-align:left;white-space:nowrap}
.user-menu-item:hover{background:var(--bg)}
.um-caret{font-size:11px;color:var(--muted)}
.user-menu-theme{display:grid;grid-template-columns:1fr 1fr;gap:5px;padding:4px 0 6px}
.um-theme-item{display:flex;align-items:center;gap:6px;padding:6px 8px;border:1px solid transparent;
  background:#fff;border-radius:0;font-size:12px;color:var(--text);cursor:pointer;font-family:inherit;
  text-align:left;white-space:nowrap}
.um-theme-item.active{border-color:var(--brand);color:var(--brand)}
.um-theme-item .theme-sw{width:12px;height:12px}
.um-theme-item .theme-tick{margin-left:auto;font-size:11px;color:var(--brand)}
.topbar:has(.user-menu:not(.hidden)){z-index:70}
.topbar.user-menu-open{z-index:70}

@media (min-width:900px){
  /* 三个次要按钮收进姓名浮层，顶栏原位隐掉（DOM、ID、事件绑定全部保留） */
  .top-right .theme-pick,.top-right > #btnPwd,.filter-primary #btnListSettings{display:none}
  .top-right{position:relative;gap:10px;flex-wrap:wrap;justify-content:flex-end}
  /* 所有按钮给足宽度：文字不换行、不竖排、不截断、不溢出 */
  .top-right .btn.sm,#listFilterCard.in-topbar .btn.sm{white-space:nowrap;flex:none}
  #listFilterCard.in-topbar .btn.sm{padding:4px 11px}
  #fReset{white-space:nowrap}
  /* 间距：筛选控件 14px、组间 16px、组内 8px */
  .topbar.has-filters{gap:16px;flex-wrap:wrap}
  #listFilterCard.in-topbar .filters{gap:14px;flex-wrap:wrap}
  .filter-row2{gap:14px}
  .filter-primary{gap:8px}
  /* 桌面侧栏内容超高时可纵向滚动：只让菜单区滚，收起条与版本角标固定在底部 */
  .nav{min-height:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;
       scrollbar-width:thin;-webkit-overflow-scrolling:touch}
  .nav::-webkit-scrollbar{width:6px}
  .nav::-webkit-scrollbar-thumb{background:var(--sidebar-line);border-radius:0}
}
@media (max-width:899px){
  /* 手机端 ⋯ 收纳箱保持原样：姓名不弹新浮层，也不显示可点提示 */
  .user-menu{display:none !important}
  .top-right #appUser.user-trigger{cursor:default;padding:0}
  .top-right #appUser.user-trigger:hover,.top-right #appUser.user-trigger:focus-visible{background:transparent}
  .top-right #appUser.user-trigger::after{display:none}
}
