/* CROSSLINK WMS · iOS Web App 样式
 * 设计基线：符合 iOS 人机界面指南（HIG）的仓库作业界面。
 * 关键约定：
 *   - 所有点击目标 >= 44px（HIG 最小值，戴手套也要点得到）
 *   - 输入框 font-size >= 16px（iOS Safari 小于 16px 会自动放大页面）
 *   - 使用 env(safe-area-inset-*) 处理刘海/底部横条
 *   - -webkit-tap-highlight-color: transparent 去掉点击灰块
 */
/* Roboto（latin 子集，可变字重 100~900，36KB）= 安卓 Latin 的系统字。
 * 为什么单独带一份（2026-11-08，P13）：安卓的 Latin 走 Roboto，中文走 Noto Sans CJK；
 * 判定机（Windows Chrome）上没有 Roboto，Latin 会退到 Noto Sans（**比 Roboto 宽约 7%**）——
 * 登录页 23sp 的「CROSSLINK WMS」实测安卓墨迹 180.8dp / 网页 193.4dp，整条标题错位，
 * 把 dp111-148 那条横带顶到 4.29%。带上 latin 子集后两端同一套字（中文继续走 Noto Sans SC，
 * 与安卓同族）。真机（iOS）上 -apple-system 命中在前，观感不受影响。
 * unicode-range 只声明 latin，CJK 自动落到后面的 Noto Sans SC。 */
@font-face {
  font-family: 'Roboto WMS';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('./fonts/roboto-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212,
    U+2215, U+FEFF, U+FFFD;
}

:root {
  /* 主色一律取安卓的 colors.xml（wms_primary / wms_primary_d）：
     两端的导航栏、按钮、选中态必须是同一个蓝，否则并排一看就是两套 App。 */
  --blue: #1F6FEB;
  --blue-dark: #1552B8;
  --green: #1a9c53;
  --orange: #d97706;
  --red: #d92d20;
  --gray-1: #f2f4f7;   /* = 安卓 colors.xml wms_bg；原来是 #f2f3f5（差 3，逐像素不过阈值但会把灰簇中心带偏） */
  --gray-2: #EAECF0;   /* = 安卓 wms_line（原来是 #e5e6eb，差 16） */
  --gray-3: #D0D5DD;   /* = 安卓 wms_line_2（原来是 #c9cdd4，差 18） */
  --text: #1D2939;     /* = 安卓 wms_text（原来是 #1d2129，差 24） */
  --text-2: #475467;   /* = 安卓 wms_text_2（原来是 #4e5969，差 14） */
  --text-3: #98A2B3;   /* = 安卓 wms_sub（原来是 #86909c，差 59 —— 副行/占位文字整片偏深） */
  --radius: 12px;
  --tabbar-h: 60px;
  --navbar-h: 52px;

  /* 安卓侧板值（与 android/.../values/colors.xml 逐条对应），首页与通用组件用这套 */
  --wms-primary: #1F6FEB;
  --wms-primary-d: #1552B8;
  --wms-accent: #FF8A00;
  --wms-success: #12B76A;
  --wms-danger: #F04438;
  --wms-bg: #F2F4F7;
  --wms-surface: #FFFFFF;
  --wms-text: #1D2939;
  --wms-text-2: #475467;
  --wms-sub: #98A2B3;
  --wms-line: #EAECF0;
  --wms-line-2: #D0D5DD;
  --wms-hero-text-dim: rgba(255, 255, 255, .82);   /* #D1FFFFFF */
  --wms-hero-line: rgba(255, 255, 255, .35);       /* #59FFFFFF */
  --wms-hero-search: rgba(255, 255, 255, .16);     /* #29FFFFFF */
  --wms-hero-glass: rgba(255, 255, 255, .22);      /* #38FFFFFF */
}

* {
  box-sizing: border-box;
  -webkit-tap-highlight-color: transparent;
}

html, body {
  margin: 0;
  padding: 0;
  height: 100%;
  overscroll-behavior: none;
}

body {
  /* 字体：iOS 用 PingFang（真机观感不动），但像素判定是在 Windows Chrome 上拍的，
     那里 PingFang 不存在 → 会退到微软雅黑，笔画粗细和安卓的 Noto Sans CJK 差得远
     （一整行 12sp 文字就足够把横带顶到 2.3%）。安卓系统中文＝Noto Sans CJK SC，
     Windows 上装的是同族 Noto Sans SC，所以把它排在 sans-serif 之前：
     真机（iOS）依旧命中 PingFang，判定机上命中 Noto Sans SC，字形与安卓同源。
     另外补了 'Roboto WMS'（latin 子集，见文件开头 @font-face）：安卓的 Latin 是 Roboto，
     判定机上没有 Roboto 会退到 Noto Sans，Latin 宽出约 7%（登录页标题实测 180.8 → 193.4dp）。 */
  font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Roboto WMS", "Noto Sans SC", "Noto Sans CJK SC", "Helvetica Neue", sans-serif;
  font-size: 15px;
  color: var(--text);
  background: var(--gray-1);
  /* 禁掉长按选中（仓库作业时误触），输入框单独放开 */
  -webkit-user-select: none;
  user-select: none;
  -webkit-text-size-adjust: 100%;
}

input, textarea, select {
  -webkit-user-select: text;
  user-select: text;
  font-size: 16px;            /* 防 iOS 自动缩放，勿改小 */
  font-family: inherit;
  color: var(--text);
}

button {
  font-family: inherit;
  font-size: 15px;
  border: none;
  background: none;
  cursor: pointer;
  touch-action: manipulation;
}

/* ---------- 页面骨架 ---------- */
.screen {
  display: flex;
  flex-direction: column;
  min-height: 100dvh;          /* dvh 处理 iOS 地址栏伸缩 */
  background: var(--gray-1);
}

.navbar {
  position: sticky;
  top: 0;
  z-index: 20;
  display: flex;
  align-items: center;
  gap: 8px;
  height: calc(var(--navbar-h) + env(safe-area-inset-top));
  padding: env(safe-area-inset-top) 12px 0;
  background: var(--blue);
  color: #fff;
  font-size: 17px;
  font-weight: 600;
  flex-shrink: 0;
}

.navbar .nav-back {
  display: flex;
  align-items: center;
  min-width: 44px;
  min-height: 44px;
  color: #fff;
  font-size: 22px;
  font-weight: 400;
  margin-left: -10px;
}

/* 带文字的返回键（安卓 activity_mine.xml / activity_settings.xml 的「‹ 返回」，15sp 白） */
.navbar .nav-back-txt {
  min-width: 0;
  font-size: 15px;
  font-weight: 400;
  margin-left: -6px;
  padding: 0 4px;
}

.navbar .nav-title {
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.navbar .nav-right {
  display: flex;
  align-items: center;
  gap: 4px;
  min-width: 44px;
  min-height: 44px;
  justify-content: flex-end;
  font-size: 14px;
  font-weight: 400;
}

.body {
  flex: 1;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  padding: 12px;
  padding-bottom: calc(12px + env(safe-area-inset-bottom));
}

.body.flush { padding: 0; }

/* ---------- 数字条（单据列表顶部：一张白卡 4 格，数字彩色） ---------- */
.stat4 {
  display: flex;
  margin-bottom: 10px;
  background: var(--wms-surface);
  border-radius: var(--radius);
  overflow: hidden;
}

.stat4-c {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  padding: 9px 4px;
  font-size: 11px;
  color: var(--wms-sub);
}

.stat4-c + .stat4-c { border-left: 1px solid var(--wms-line); }
.stat4-c b { font-size: 17px; font-weight: 700; line-height: 1.15; font-variant-numeric: tabular-nums; }

/* 分组/列表小标题（左标题 右说明，与首页 .hm-gtitle 同一套口径）。
   docs_list 实测（dump.xml page 240.4~274.5，tvTitle 248.4~268.7）：块高 34.1、文字距块顶 8dp；
   report 实测（132~162.5，可选报表 138.2~158.5）：块高 30.5、文字距块顶 6.2dp。
   原来 padding-top 只有 2dp，文字比安卓高 4dp（report 第 3 条带 1.714%）。
   取 6/4：report 的行位置不动（总高仍 10+21），docs 的文字落到 222.4（安卓 224.4）。 */
.gtitle {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 6px 4px 4px;
}

.gtitle b { font-size: 15px; font-weight: 700; color: var(--wms-text); }
.gtitle span { font-size: 13px; color: var(--wms-sub); }

/* ---------- 单据列表行（一行一张卡片，照安卓 BizListActivity）
   几何按 item_biz_row.xml + docs_list.dump.xml 实测（画布坐标 = 绝对 dp − 24）：
     卡片 250.5..381.8（高 131.3，行距 139.3 = 131.3 + marginBottom 8），内边距 12/14；
     单号 262.5..284.0（16sp / 21.5 行高）；三行 kv 289.1 / 308.0 / 327.6（行距 18.9~19.6，
     每行高 16.7，marginTop 5 / 3 / 3）；「数量」行 351.3..369.8（paddingTop ≈ 6.9、无分隔线）。
   原来 padding 10/12/8、行高 21.25、卡内 kv 无间距、数量行上方还有一条虚线 —— 一行下来比安卓高 6.2dp，
   15 帧滚动累积后两边抓到的行集就不一样了（P13 用 L1 的行集差反推出来的）。 ---------- */
.doc-card {
  margin-bottom: 8px;
  padding: 12px 14px;
  background: #fff;
  border-radius: 10px;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .05);
}

.doc-card:active { background: #F9FAFB; }

.doc-top {
  display: flex;
  align-items: center;
  gap: 6px;
}

.doc-num {
  font-size: 16px;
  line-height: 21.5px;
  font-weight: 700;
  color: var(--wms-text);
  letter-spacing: .2px;
}

.doc-kv {
  display: flex;
  gap: 6px;
  font-size: 12.5px;
  line-height: 16.7px;
  margin-top: 3px;
  min-width: 0;
}

/* 第一行 kv 与单号之间是 5dp（安卓 layout_marginTop=5dp），其余 3dp */
.doc-top + .doc-kv { margin-top: 5px; }

.doc-k { flex: 0 0 58px; color: var(--wms-text-2); }
.doc-v { flex: 1; min-width: 0; color: var(--wms-text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.doc-bot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding-top: 6.9px;
}

/* 库存结果行（安卓 item_stock_row）：图 42dp + 三段文字 + 右侧大号在手数 + 单位。
   行高由内容撑开（图上 42dp，三行文字总高约 56dp），与安卓一致。 */
.stock-row { align-items: flex-start; gap: 10px; }
.stock-row .row-main { min-width: 0; }
.stock-meta { display: flex; gap: 8px; flex-wrap: wrap; font-size: 11.5px; line-height: 16px; }
.stock-qty-line { display: flex; gap: 8px; flex-wrap: wrap; font-size: 11px; line-height: 15px; margin-top: 2px; }
.stock-oh { flex: 0 0 auto; display: flex; flex-direction: column; align-items: flex-end; }
.stock-oh-n { font-size: 19px; font-weight: 700; line-height: 24px; color: var(--wms-primary); }
.stock-oh-u { font-size: 10.5px; line-height: 14px; color: var(--wms-sub); }
/* 单据详情竖排明细行：左侧 40dp 缩略图 + 右侧三行（安卓 item_doc_line 的 ivLinePict 在左） */
.doc-line-row { gap: 10px; }
/* 竖排明细行的左滑外壳：动作条绝对定位在右侧、内容层盖在上面（与作业屏 .lr-row.swipeable 同一套，
   这里只补「卡片行」自己的外框：别让相邻行露出半个按钮）。
   注意 `.lr-row` 的 7px/14px 内边距是 styles-home.css:519 给的，会盖掉这里的 padding:0，
   所以选择器要写成两个类（0,2,0）才压得住 —— 否则动作条从右侧 14px 的缝里露一条色块。 */
.lr-row.doc-line-wrap { position: relative; overflow: hidden; padding: 0; }
.doc-line-wrap .lr-actions { position: absolute; top: 0; right: 0; bottom: 0; z-index: 0; display: flex; }
/* 内容层必须**盖满整行**：原来 .row 的 10px/14px 内边距搬到内容层，文字位置不变（左 28 = 14 原外框 + 14 内边距）。 */
.doc-line-wrap .lr-content { position: relative; z-index: 1; width: 100%; margin: 0; padding: 10px 28px; background: #fff; transition: transform .15s ease; }

/* 「其它」页签的是/否开关（安卓 BizDetailActivity.switchChip：开=主色底白字、关=浅灰底描边灰字） */
.ctl-chip {
  min-width: 54px; height: 26px; padding: 0 14px;
  border: 1px solid #D0D5DD; border-radius: 13px; background: #F2F4F7;
  color: #475467; font-size: 12px; font-weight: 700; letter-spacing: .5px; cursor: pointer;
}
.ctl-chip.on { border-color: var(--wms-primary); background: var(--wms-primary); color: #fff; }
.ctl-chip[disabled] { opacity: .6; }

/* 横排里「数量」格可改（安卓 editCellQty）：点一下弹「修改明细」 */
table.mx td.mx-qty-edit { cursor: pointer; color: var(--wms-primary); }

/* 商品缩略图（安卓 ImageLoader.thumb 的对应件，组件在 app/prodpic.js）
   固定尺寸的外框：没图时也是这块浅灰方块（行高不跳），图按 centerCrop 填满。
   安卓 item_doc_line 40dp / item_stock_row 42dp，圆角 4dp。 */
.prod-pic {
  display: inline-block; flex: 0 0 auto; overflow: hidden;
  border-radius: 4px; background: var(--gray-1);
  vertical-align: middle;
}
.prod-pic img { display: block; width: 100%; height: 100%; object-fit: cover; }

.doc-tags { display: flex; gap: 4px; flex-wrap: wrap; }
/* 左下那一列：到货进度（灰 11.5sp）+ 撤销/挂起（红粗 11.5sp）—— 安卓 item_biz_row 的
   tvBizProgress / tvBizMarks 是同一个竖直 LinearLayout 里的两行，右边才是 tvBizVal。 */
.doc-side { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.doc-progress { font-size: 11.5px; line-height: 15.5px; color: var(--wms-text-2); }
.doc-marks { font-size: 11.5px; line-height: 15.5px; font-weight: 700; color: var(--wms-danger); margin-top: 2px; }
/* 状态角标：安卓 tvBizStatus = 11sp 粗体 + paddingH 8 / paddingV 2 + 圆角 4dp（wms_tag_accent 只给形状，
   底色由 Ui.statusTag 的 tint 覆盖成「12% 同色」）。.tag 的通用值（11.5px/500/7px/5dp）只差一点，
   但差值落在角标这一小块上就是整颗颜色的边，所以按实测单独列。 */
.doc-tag { padding: 2px 8px; border-radius: 4px; font-size: 11px; font-weight: 700; }
/* 右下的数量/金额：安卓 tvBizVal = 13.5sp 粗体、整行 wms_primary（不是只给数字上色） */
.doc-qty { font-size: 13.5px; line-height: 18.5px; font-weight: 700; color: var(--wms-primary); white-space: nowrap; }
.doc-qty b { color: var(--wms-primary); font-weight: 700; }
.doc-qty em { color: #B42318; font-style: normal; }

/* 状态筛选 chip：做成可点的胶囊（安卓同款），不是纯文字。
   安卓 scrollChips 实测（docs_list.dump.xml）：整块 36dp 高，胶囊 29.9dp 高且**贴底**
   （page 210.5~240.4，块 204.4~240.4）→ 网页原来 34dp 胶囊 + 10dp 下内边距把下一块整体推下 8dp。 */
.chips { display: flex; gap: 8px; overflow-x: auto; padding: 6px 0 0; -webkit-overflow-scrolling: touch; }
.chip {
  flex: 0 0 auto;
  min-height: 30px;
  padding: 0 14px;
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--wms-line-2);
  border-radius: 15px;
  background: #fff;
  color: var(--wms-text-2);
  font-size: 13px;
  white-space: nowrap;
}
.chip.on { border-color: var(--wms-primary); color: var(--wms-primary); background: #EAF2FE; font-weight: 600; }

/* ---------- 卡片 / 列表 ---------- */
.card {
  background: #fff;
  border-radius: var(--radius);
  margin-bottom: 10px;
  overflow: hidden;
}

.card-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 12px 14px;
  border-bottom: 1px solid var(--gray-1);
  font-weight: 600;
  font-size: 15px;
}

.row {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 52px;
  padding: 10px 14px;
  border-bottom: 1px solid var(--gray-1);
  background: #fff;
}

.row:last-child { border-bottom: none; }
.row:active { background: var(--gray-1); }

/* 报表清单每一行 = 安卓 item_report_row 的**独立白卡**：radius 12、行间距 6.1dp、
   内边距 11/14.2、卡高 58.9（dump 实测 12~380.7 × 162.5~221.5，下一张从 227.6 开始）。
   原来做成「一张大卡 + 1px 分隔线」，整屏灰/白面积差 9 个百分点，主色簇被带偏
   （report 实测 主色错配 2 处 + 横带 2.15%）。名称 14sp / 副行 11sp 也按 dump 的对齐。 */
.card[data-rpt-list] { background: transparent; border-radius: 0; overflow: visible; margin: 0; }
.card[data-rpt-list] .row {
  background: #fff;
  border-radius: 12px;
  margin-bottom: 6.1px;
  padding: 11px 14.2px;
  min-height: 58.9px;
  border-bottom: 0;
  /* 角标跟**名称那一行**对齐：安卓 tvRepName 173.5~192.7、tvRepType 175.3~192.7（同一行、差 1.8dp）。
     原来 .row 是 align-items:center，角标被垂直居中到「名称+副行」整块 → 实测落到 y160（安卓 151.3）。 */
  align-items: flex-start;
}
.card[data-rpt-list] .row:last-child { margin-bottom: 0; }
.card[data-rpt-list] .row-title { font-size: 14px; line-height: 19.3px; }
.card[data-rpt-list] .row-sub { margin-top: 2.9px; font-size: 11px; line-height: 14.9px; color: var(--wms-sub); }
/* 角标 = 安卓 tvRepType：10.5sp、56×17.5、radius 4、底 #E8F1FF / 字 #1D64D8（分析模型 #FFF1E2 / #C25B00） */
.card[data-rpt-list] .tag {
  padding: 0 6px;
  border-radius: 4px;
  font-size: 10.5px;
  line-height: 17.5px;
  font-weight: 400;
  margin-top: 1.8px;
  background: #E8F1FF;
  color: #1D64D8;
}
.card[data-rpt-list] .tag.orange { background: #FFF1E2; color: #C25B00; }

.row-main { flex: 1; min-width: 0; }

.row-title {
  font-size: 15px;
  font-weight: 500;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.row-sub {
  margin-top: 3px;
  font-size: 12.5px;
  color: var(--text-3);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.row-chevron { color: var(--gray-3); font-size: 16px; }

/* ---------- 统计卡 ---------- */
.stat-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 10px;
  margin-bottom: 12px;
}

.stat {
  background: #fff;
  border-radius: var(--radius);
  /* 安卓作业屏三格是 64dp 高（boxSum 196.7~260.7）、内边距 10dp；14dp 内边距 + 34dp 标签
     会把整行顶到 78dp，下面所有块跟着下移 14dp（2026-11-07 实测 move_work/stt_work band 42%） */
  padding: 10px 14px;
  min-height: 64px;
}

.stat-label {
  font-size: 12.5px;
  color: var(--text-3);
  line-height: 1.35;
  min-height: 34px;
}

.stat-num {
  margin-top: 6px;
  font-size: 26px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}

.stat-num.zero { color: var(--gray-3); }

/* ---------- 宫格 ---------- */
.grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 4px 0;
  background: #fff;
  border-radius: var(--radius);
  padding: 8px 0;
}

.grid-item {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  min-height: 74px;
  padding: 10px 4px;
  font-size: 12px;
  color: var(--text-2);
}

.grid-item:active { background: var(--gray-1); }

.grid-icon {
  width: 34px;
  height: 34px;
  border-radius: 9px;
  display: grid;
  place-items: center;
  color: #fff;
  font-size: 16px;
  font-weight: 600;
}

/* ---------- 表单 ---------- */
.field {
  margin-bottom: 14px;
}

.field-label {
  display: block;
  margin-bottom: 6px;
  font-size: 13px;
  color: var(--text-2);
}

.input {
  width: 100%;
  height: 48px;
  padding: 0 12px;
  background: #fff;
  border: 1px solid var(--gray-2);
  border-radius: 10px;
  outline: none;
}

.input:focus { border-color: var(--blue); }

.btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 48px;
  border-radius: 10px;
  background: var(--blue);
  color: #fff;
  font-size: 16px;
  font-weight: 600;
}

.btn:active { background: var(--blue-dark); }
.btn[disabled] { background: var(--gray-3); }
.btn-ghost { background: #fff; color: var(--blue); border: 1px solid var(--blue); }

/* ---------- 杂项 ---------- */
.tag {
  display: inline-block;
  padding: 2px 7px;
  border-radius: 5px;
  font-size: 11.5px;
  font-weight: 500;
  background: var(--gray-1);
  color: var(--text-2);
}

.tag.blue { background: #e8f1fd; color: var(--blue); }
.tag.green { background: #e6f6ee; color: var(--green); }
.tag.orange { background: #fdf1e3; color: var(--orange); }
.tag.red { background: #fdeceb; color: var(--red); }

.loading, .empty {
  padding: 40px 16px;
  text-align: center;
  color: var(--text-3);
  font-size: 14px;
}

.toast {
  position: fixed;
  left: 50%;
  bottom: calc(80px + env(safe-area-inset-bottom));
  transform: translateX(-50%);
  z-index: 100;
  max-width: 80vw;
  padding: 11px 18px;
  border-radius: 10px;
  background: rgba(0, 0, 0, .82);
  color: #fff;
  font-size: 14px;
  line-height: 1.4;
  text-align: center;
  /* 轻提示是纯展示：绝不能吃掉点击（它会浮在明细行上，现场点行改数量时被它挡住过） */
  pointer-events: none;
}

.err-text {
  padding: 10px 12px;
  border-radius: 8px;
  background: #fdeceb;
  color: var(--red);
  font-size: 13.5px;
  line-height: 1.5;
  word-break: break-all;
}

/* ---------- 明细键值 ---------- */
.kv {
  display: flex;
  gap: 10px;
  padding: 9px 14px;
  border-bottom: 1px solid var(--gray-1);
  font-size: 14px;
}

.kv:last-child { border-bottom: none; }

/* 作业屏抬头（搬移/盘点）：安卓 boxHead 是「单号行 28dp + 3 行 16dp 小字」的紧凑卡（共 108dp），
   照详情页那套 .kv（每行 40dp）会长到 166dp，下面三格/页签/明细整体下移 57dp —— band 35%。 */
.kv-compact { padding: 2px 14px 8px; }
.kv-compact .kv-line {
  height: 16px;
  line-height: 16px;
  font-size: 12.5px;
  color: var(--text-2);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* 状态说明那句会折行（安卓 tvHint 30.2dp = 两行 15dp）*/
.kv-compact .kv-line-wrap {
  height: auto;
  max-height: 30px;
  line-height: 15px;
  white-space: normal;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

.kv-k {
  width: 96px;
  flex-shrink: 0;
  color: var(--text-3);
  font-size: 13px;
  line-height: 1.5;
}

.kv-v {
  flex: 1;
  min-width: 0;
  word-break: break-all;
  line-height: 1.5;
}

/* ---------- 底部 tab ----------
   取值照安卓 activity_home.xml 的 tabbar：高 60、白底 + elevation 8、
   图标 22、文字 10.5sp（选中 wms_primary / 未选中 wms_sub）、下方留 4dp。
   图标是 SVG（由 icons.js 提供），不是字符 —— 字符图标和安卓端一眼就能看出差别。 */
.tabbar {
  position: sticky;
  bottom: 0;
  z-index: 20;
  display: flex;
  height: calc(var(--tabbar-h) + env(safe-area-inset-bottom));
  padding-bottom: calc(4px + env(safe-area-inset-bottom));
  background: var(--wms-surface);
  border-top: 1px solid var(--wms-line);
  box-shadow: 0 -2px 10px rgba(16, 24, 40, .06);
  flex-shrink: 0;
}

.tab {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 2px;
  min-height: 44px;              /* 戴手套也点得到 */
  font-size: 10.5px;
  color: var(--wms-sub);
}

.tab.active { color: var(--wms-primary); }

.tab-icon-wrap { position: relative; width: 22px; height: 22px; display: block; }

.tab-icon {
  display: block;
  width: 22px;
  height: 22px;
}

.tab-icon svg,
.tab-icon-wrap svg { width: 22px; height: 22px; display: block; }

/* 「任务」角标：红色圆点 + 数字（0 不显示、>99 显示 99+） */
.tab-badge {
  position: absolute;
  top: -7px;
  right: -2px;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: 8px;
  background: var(--wms-danger);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  font-style: normal;
  line-height: 16px;
  text-align: center;
  box-sizing: border-box;
}

.tab-label { line-height: 1.2; }

/* ---------- 扫码输入（扫码枪/键盘） ---------- */
/* 顶部搜索行 = 安卓 @style/WmsSearchBox（activity_biz_list / doc_list / report_center /
   scan / stock_query 共用一份）：
     高 44dp、白底、1dp #EAECF0 描边、12dp 圆角、左右内边距 12、外边距 12（上 12），
     里面 EditText 走 android:background="@null"（没有自己的边框），按钮 36dp 高 / 最小 72dp 宽。
   原来这里是「整条白底 + 底边线 + 输入框自带描边」，跟安卓差了两处的边框和圆角
   （report 实测 74~111dp 横带 2.15%、stock 对不上整块搜索区）。 */
.scanbar {
  display: flex;
  align-items: center;
  gap: 8px;
  height: 44px;
  margin: 0;
  padding: 0 12px;
  background: #fff;
  border: 1px solid var(--wms-line, #EAECF0);
  border-radius: 12px;
}

.scanbar .input {
  flex: 1;
  height: 100%;
  border: 0;
  background: transparent;
  padding: 0;
}

/* 左右/上下的 12dp 由 .body 的内边距给：安卓 boxSearch 是 margin 12 + 页宽内缩 12，
   网页 .body 本身就有 12 内边距，再叠一层 margin 会变成 24（report 实测搜索框上下各窄 12dp）。 */

.scanbar .btn {
  width: auto;
  min-width: 72px;
  height: 36px;
  flex: 0 0 auto;
  font-size: 13px;
  border-radius: 12px;
  /* 安卓 WmsBtn 是 MaterialButton：36dp 的按钮可见蓝块只有 28dp（上下各内缩 ~4dp）。
     网页直接填满 36dp，按钮上下两条 4dp 就整片算成差异（report 实测 69~70 / 101~102dp
     两行各 58 像素 —— 正好是蓝块的上下沿）。同 .doc-foot-fn 的处理。 */
  background-clip: content-box;
  padding-top: 4px;
  padding-bottom: 4px;
}

/* ---------- 单据动作条 · 二次确认 · 结果提示（阶段A）
   所有取值照抄 android/app/src/main/res/values，不要自己调：
     chip 底色 wms_chip #EEF2F7、chip 文字 #1B1F24（DocActions.kt 里 setTextColor 的原值）
     危险 wms_danger #F04438 / wms_danger_l #FEECEB
     成功 wms_success #12B76A / wms_success_l #E7F8F0
     提醒 wms_warn  #F79009 / wms_warn_l   #FEF4E6
     文字 wms_text #1D2939 / wms_text_2 #475467 / wms_sub #98A2B3 / 分隔线 wms_line #EAECF0
     按钮高 wms_btn_h 46dp；字号 wms_fs_small 13sp / wms_fs_tiny 12sp / wms_fs_micro 11sp
   chip 文字 12.5sp 来自 DocActions.kt 的 textSize = 12.5f
---------- */
.actbar {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 10px;
  padding: 12px;
}

.act-btn {
  min-height: 46px;                 /* wms_btn_h */
  padding: 6px 8px;
  border: 1px solid #EAECF0;        /* wms_line */
  border-radius: 8px;
  background: #EEF2F7;              /* wms_chip */
  color: #1B1F24;
  font-size: 12.5px;                /* DocActions.kt chip textSize */
  line-height: 1.2;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 2px;
  text-align: center;
}

.act-btn:active { background: #E3E9F2; }

/* 高风险动作先让对方看见「这不是随手一点」 */
.act-btn.risky {
  border-color: #F04438;
  background: #FEECEB;              /* wms_danger_l */
  color: #F04438;                   /* wms_danger */
}

/* 不可用要「看得出来不可用」：安卓端踩过的坑是 isEnabled=false 颜色不变，现场以为按钮坏了 */
.act-btn.off,
.act-btn[disabled] { opacity: .45; }

.act-online { font-size: 11px; color: #F79009; }   /* wms_fs_micro / wms_warn */
.act-btn.off .act-online { color: inherit; }
.act-busy { font-size: 12px; }

.err-box {
  padding: 10px 12px;
  border-radius: 8px;
  background: #FEECEB;              /* wms_danger_l */
  color: #F04438;                   /* wms_danger */
  font-size: 13px;                  /* wms_fs_small */
  line-height: 1.5;
  word-break: break-all;
}

.err-title { font-weight: 600; margin-bottom: 4px; }
.err-msg { word-break: break-all; }

.ok-note {
  margin: 10px 12px 0;
  padding: 10px 12px;
  border-radius: 8px;
  background: #E7F8F0;              /* wms_success_l */
  color: #12B76A;                   /* wms_success */
  font-size: 13px;
  line-height: 1.5;
}

.net-note {
  margin: 10px 12px 0;
  padding: 8px 10px;
  border-radius: 8px;
  background: #FEF4E6;              /* wms_warn_l */
  color: #F79009;                   /* wms_warn */
  font-size: 12px;                  /* wms_fs_tiny */
  line-height: 1.5;
}

/* 失败/告警口径的提示条（如「有 2 条被钉住」） */
.net-note.bad {
  background: #FEECEB;              /* wms_danger_l */
  color: #F04438;                   /* wms_danger */
}

/* 多行说明文字（打印状态、中转机信息这类要整句看完的内容；
   .row-sub 是单行打省略号的，长原因会被截掉一半，等于没说） */
.wrap-note {
  padding: 0 14px 8px;
  font-size: 12.5px;
  color: var(--text-3);
  line-height: 1.5;
  white-space: normal;
  word-break: break-word;
}

/* ---------- 离线条（顶部常驻） ----------
   放在 navbar 与 body 之间，不固定定位：固定会盖住 sticky 的导航栏，
   也躲不开刘海安全区（iOS 上会被状态栏切掉一半）。 */
.net-strip {
  flex-shrink: 0;
  padding: 6px 12px;
  background: #FEF4E6;
  color: #B54708;
  font-size: 12px;
  line-height: 1.5;
  border-bottom: 1px solid #FDE3C0;
}

.net-strip.off {
  background: #FEECEB;
  color: #B42318;
  border-bottom-color: #FBD5D2;
}

/* 待上传屏的状态字与错误行 */
.oq-ok { color: var(--green); }
.oq-bad { color: var(--red); }
.oq-err { color: var(--red); word-break: break-all; }

.link-btn {
  padding: 4px 0;
  border: none;
  background: none;
  color: var(--blue);
  font-size: 12px;
  text-align: left;
}

.hidden-row {
  display: flex;
  gap: 8px;
  padding: 6px 0;
  border-top: 1px solid #EAECF0;    /* wms_line */
  font-size: 12px;
}

.hidden-name { width: 88px; flex-shrink: 0; color: #1D2939; }
.hidden-why { flex: 1; color: #98A2B3; }   /* wms_sub */

/* 二次确认（risky 动作）：盖满屏、点遮罩即取消 */
.modal {
  position: fixed;
  inset: 0;
  z-index: 200;
  padding: 24px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(16, 24, 40, .45);  /* wms_dark 半透明 */
}

.modal-card {
  width: 100%;
  max-width: 320px;
  padding: 18px 16px 14px;
  border-radius: 12px;
  background: #fff;
}

.modal-title {
  margin-bottom: 10px;
  font-size: 15px;                    /* wms_fs_title */
  font-weight: 600;
  color: #1D2939;                     /* wms_text */
}

.modal-body {
  font-size: 13px;                    /* wms_fs_small */
  line-height: 1.6;
  color: #475467;                     /* wms_text_2 */
}

.modal-actions { display: flex; gap: 10px; margin-top: 16px; }
.modal-actions .btn { flex: 1; }

/* ---------------------------------------------------------------- 中文日历
 * 安卓 ReportCenterActivity.pickDate 的自绘日历（A10 #54）：
 *   月份条「‹ 2026年10月 ›」+ 周标题从周一起 7 列 + 6 行日期格 + 取消/今天/确定。
 * 尺寸取安卓那棵视图树：月标题 15sp 粗、周标题 11sp 灰、日期 14sp、格行高 36dp。
 * 弹窗比通用 modal-card 宽（7 列要放得下 390px 屏：7×40 + 边距 = 316）。
 */
.cal-card { max-width: 336px; padding: 16px 12px 12px; }
.cal-bar { display: flex; align-items: center; gap: 2px; padding: 2px 0 6px; }
.cal-nav {
  width: 40px; height: 34px; border: 0; background: transparent;
  font-size: 20px; line-height: 1; color: var(--blue); cursor: pointer;
}
.cal-month { flex: 1; text-align: center; font-size: 15px; font-weight: 700; color: #22303F; }
.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); }
.cal-w { text-align: center; font-size: 11px; color: #98A2B3; padding: 4px 0; }
.cal-cell {
  height: 36px; display: flex; align-items: center; justify-content: center;
  font-size: 14px; color: #22303F; border-radius: 18px; cursor: pointer;
}
.cal-cell.blank { cursor: default; }
.cal-cell.today { color: var(--blue); font-weight: 700; }
.cal-cell.picked { color: #fff; background: var(--blue); }
/* 按钮条照安卓 AlertDialog 的**文字按钮**：今天靠左，取消/确定靠右；无边框无底色，
   否则弹窗底部一排胶囊按钮，与安卓那张（dlg-report-calendar-a.png）不是同一个东西。 */
.cal-actions {
  display: flex; align-items: center; gap: 4px;
  padding: 6px 2px 0; margin-top: 4px;
}
.cal-actions .cal-btn { flex: none; }
.cal-gap { flex: 1; }
.cal-btn {
  border: 0; background: transparent; color: var(--blue);
  font-size: 15px; font-weight: 700; padding: 8px 12px; border-radius: 6px; cursor: pointer;
}
.cal-btn.ok { font-weight: 700; }


/* ============================================================================
 * 作业屏（docact）—— 与安卓 DocActActivity 各子类同布局：
 * 扫码框 → 单据头 → 三个数字 → 页签 → 明细行（右端本次数量）→ 汇总/提交
 * 取值照抄 android/app/src/main/res/values（wms_chip #EEF2F7 / wms_danger #F04438）。
 * ========================================================================== */

/* 作业屏的输入条已改回**底部固定**（与安卓 activity_work_doc.xml 一致），
   样式复用 .doc-foot / .doc-foot-bar / .doc-foot-input（见下方「底部固定条」一节），
   这里不再单独给顶部吸顶写一套 —— 两套并存必然会走样。 */

.wl-tools { display: flex; gap: 8px; margin: 0 0 10px; }
.wl-tool {
  flex: 1;
  min-height: 44px;
  font-size: 14px;
  border-radius: var(--radius);
}

/* 单据头里的一行草稿提示 */
.wl-draft {
  padding: 8px 12px;
  font-size: 12.5px;
  color: var(--orange);
  background: #FFF8EC;
  border-top: 1px solid var(--gray-2);
}

/* 页签：未扫入 / 已扫入（数字是件数，不是行数） */
.wl-tabs { display: flex; gap: 8px; margin: 0 0 10px; }
.wl-tab {
  flex: 1;
  min-height: 44px;
  border-radius: var(--radius);
  background: #fff;
  color: var(--text-2);
  font-size: 14px;
  border: 1px solid var(--gray-2);
}
.wl-tab.on {
  background: var(--blue);
  border-color: var(--blue);
  color: #fff;
  font-weight: 600;
}

/* 图标页签（库存查询）：安卓这一屏是纯图标页签、不带文字，
   所以按钮里只有 svg —— 高度与文字页签一致，居中显示。 */
.stock-tab-ico { display: flex; align-items: center; justify-content: center; padding: 0; }
.stock-tab-ico .stock-tab-ic { display: block; width: 20px; height: 20px; }
.stock-tab-ico .stock-tab-ic svg { width: 20px; height: 20px; display: block; }

/* 明细行：右端是本次数量，出错行整条标红 */
.wl-line { align-items: center; }
.wl-line .row-main { min-height: 56px; display: flex; flex-direction: column; justify-content: center; }
.wl-line .wl-code { font-weight: 600; letter-spacing: .2px; }
.wl-line .wl-tag {
  margin-left: 6px;
  font-size: 11px;
  padding: 1px 6px;
  background: #EEF2F7;
  color: #475467;
}
.wl-line.done { background: #EFEFEF; }   /* 安卓 WorkLineAdapter：finished 行 = #EFEFEF，不是浅绿 */
.wl-line.hit { background: #EAF2FE; }              /* wms_primary_l */
.wl-line.err { background: #FDECEB; }              /* wms_danger 浅底 */
.wl-line.err .wl-code { color: var(--red); }
.wl-err { color: var(--red); }

.wl-qty {
  min-width: 64px;
  min-height: 44px;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  padding-right: 4px;
  font-size: 18px;
  font-weight: 600;
  color: var(--blue);
}

/* 明细行右侧数量色 = 安卓 WorkLineAdapter.tvQty 的三态（2026-11-08 实测）：
     命中行 → wms_primary；已完成 → #8A8A8A；其余 → wms_text（#1D2939）。
   网页原来一律主色蓝：verify_box 的「应装 3」（未扫、未完成）在安卓是深灰字，
   网页是一整块蓝字 —— 实测列表区凭空多出 268 个蓝像素，把蓝簇中心往亮处拉了 48，
   判成「主色错配」。 */
.wl-line .lr-qty { color: var(--wms-text); }
.wl-line.hit .lr-qty { color: var(--wms-primary); }
.wl-line.done .lr-qty { color: #8A8A8A; }

/* 左滑动作条（安卓 core/RowSwipe + item_accept_line 的 btnEditQty / btnDelLine）：
   动作条绝对定位在行右侧（160px = 两个 80px 按钮），内容层 .lr-content 盖在上面；
   左滑时内容层 translateX(-160px) 把动作条露出来。只有打开了 swipe 的屏（拣货）走这套。
   已知遗留（A7 已修）：行内边距原来留在行盒上（.lr-row 的 7px/14px），内容层只盖到内边距里面，
   动作条会从右侧约 14px 的缝里露一条色块（pick_work parity 曾判 4.376% / band 19.34%）。
   现在把内边距搬到 .lr-content，外壳 padding:0 —— 文字位置不变、色块不再露出。 */
.lr-row.swipeable { position: relative; overflow: hidden; padding: 0; }
/* 行内边距搬到内容层：.lr-row 原来是 7px 14px（styles-home.css:519），而动作条贴行盒右缘，
   于是每行右缘露出 14px 的蓝/红条（pick_work parity band 19.34% 的真因，A6 记账、A7 修）。
   文字位置不变（内容层补同样的 7px 14px），点按区域也没变。 */
.lr-row.swipeable .lr-content { padding: 7px 14px; }
.lr-row.swipeable .lr-actions {
  position: absolute; top: 0; right: 0; bottom: 0; z-index: 0;
  display: flex; width: 160px;
}
.lr-action {
  flex: 1; min-width: 0; border: 0; padding: 0; cursor: pointer;
  font-size: 13px; font-weight: 600; color: #fff; letter-spacing: .5px;
}
.lr-action.is-edit { background: var(--wms-primary); }
.lr-action.is-del { background: var(--wms-danger); }
.lr-row.swipeable .lr-content {
  position: relative; z-index: 1; width: 100%; background: #fff;
  transition: transform .15s ease;
}
.lr-row.swipeable.done .lr-content { background: #EFEFEF; }
.lr-row.swipeable.hit .lr-content { background: #EAF2FE; }
.lr-row.swipeable.err .lr-content { background: #FDECEB; }
.lr-row.swipeable .lr-content.revealed { transform: translateX(-160px); }

.wl-sum { font-weight: 400; font-size: 12px; color: var(--text-3); }
/* 顾客自提行的末行（安卓 item_pickup 的 tvShop + btnPick）：门店占满左、提货按钮右
   （Material3 Button，minWidth 88dp；不可提货时 alpha 0.45）。 */
.wl-shop { display: flex; align-items: center; gap: 10px; margin-top: 6px; }
.wl-shop-text { flex: 1; min-width: 0; }
.wl-pick-btn {
  flex: 0 0 auto; width: auto; min-width: 88px; height: 36px;
  padding: 0 16px; font-size: 14px; border-radius: 18px;
}
.wl-pick-btn.off { opacity: .45; }

.wl-submit-line {
  padding: 8px 12px 10px;
  font-size: 13px;
  color: var(--text-2);
  border-bottom: 1px solid var(--gray-2);
}

.wl-sub-title {
  font-size: 12px;
  color: var(--text-3);
  padding: 6px 0 2px;
}

/* ============================================================================
 * 录入屏（docentry）—— 与安卓 DocEntryActivity 各子类同布局：
 * 单据头 → 单据信息（字段集来自配置）→ 控制项 → 扫码加明细 → 已录明细 → 保存
 * 输入框字号一律 ≥16px（iOS Safari 聚焦不放大），高度 ≥44px（戴手套也点得到）。
 * ========================================================================== */

.pick {
  width: 100%;
  min-height: 48px;
  padding: 0 12px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  text-align: left;
  font-size: 16px;
  color: #1B1F24;
  background: #fff;
  border: 1px solid var(--gray-2);
  border-radius: 10px;
}
.pick:active { background: var(--gray-1); }
.pick[disabled] { color: var(--text-3); background: var(--gray-1); }

/* 放在列表行右侧时不能撑满整行（否则会盖住左边的名称） */
.row .pick { width: auto; flex: 0 0 auto; min-width: 74px; padding: 0 10px; }

/* 出错字段：整块描红 + 下方那行 ERP 原文 */
.field-bad .input,
.field-bad .pick { border-color: var(--red); background: #FFF6F5; }
.field-bad .field-label { color: var(--red); }

.req { color: var(--red); margin-left: 2px; }
.field-code { margin-left: 6px; font-size: 11px; color: var(--text-3); }

/* 文字输入框：16px 是硬要求（小一号 iOS 就会放大整页） */
.field .input,
.field .input[type="date"] { font-size: 16px; }

/* 录入屏的单据信息：**左标签 / 右控件**一行一条（安卓 DocEntry 的版式）。
   为什么单独一个 .field-inline 而不是改 .field：登录页是「标签在上、输入在下」的竖版，
   两边共用一个类会互相带偏。明细里的说明/报错要整行铺开，所以只把
   input / pick / scanbar 放到第二列，其余子元素跨两列。 */
.field-inline {
  display: grid;
  grid-template-columns: 84px minmax(0, 1fr);
  align-items: center;
  gap: 6px 10px;
  padding: 6px 14px;
  margin-bottom: 0;
  border-bottom: 1px solid var(--gray-1);
}

.field-inline:last-child { border-bottom: none; }

.field-inline > .field-label {
  grid-column: 1;
  margin-bottom: 0;
  font-size: 14px;
  color: var(--text-2);
}

/* 默认整行（说明文字、ERP 报错原文），下面三类才是右侧控件 */
.field-inline > * { grid-column: 1 / -1; }
.field-inline > .input,
.field-inline > .pick,
.field-inline > .scanbar { grid-column: 2; }

.field-inline > .scanbar {
  margin: 0;
  padding: 0;
  background: none;
  border: none;
}

.field-inline .input,
.field-inline .pick { min-height: 44px; height: 44px; }

/* ============================================================================
 * 阶段F：库存矩阵 / 报表结果 / 图片查看 / 设置 / 安装引导 / 更新提示条
 * 矩阵版式对照 android/shots/10-matrix.png：首列是颜色（sticky），列头是尺码，
 * 数字用等宽数字字体，0 显示成浅灰（和安卓 stock_matrix 的灰字同口径）。
 * ========================================================================== */

.mtx {
  width: 100%;
  border-collapse: collapse;
  background: #fff;
  font-size: 13px;
  font-variant-numeric: tabular-nums;
}

.mtx th,
.mtx td {
  padding: 9px 8px;
  text-align: center;
  border-bottom: 1px solid var(--gray-1);
  white-space: nowrap;
}

.mtx thead th {
  position: sticky;
  top: 0;
  z-index: 2;
  background: #EEF2F7;
  color: #475467;
  font-weight: 600;
  font-size: 12px;
}

/* 首列颜色固定在左边：横向滚尺码时还知道自己在看哪一行 */
.mtx tbody td.mtx-c,
.mtx thead th:first-child {
  position: sticky;
  left: 0;
  z-index: 1;
  background: #fff;
  text-align: left;
  font-weight: 600;
  border-right: 1px solid var(--gray-2);
}
.mtx thead th:first-child { z-index: 3; background: #EEF2F7; }

.mtx td.zero { color: var(--gray-3); }
.mtx td.mtx-t { font-weight: 600; background: #F7F9FC; }
.mtx tr.mtx-sum td { background: #F7F9FC; font-weight: 600; }

/* 报表结果：列很多，横向滚动；表头吸顶；第一列吸左 */
.rpt-wrap { overflow: auto; -webkit-overflow-scrolling: touch; background: #fff; border-radius: var(--radius); }
.rpt { border-collapse: collapse; font-size: 12.5px; font-variant-numeric: tabular-nums; }
.rpt th, .rpt td { padding: 8px 10px; border-bottom: 1px solid var(--gray-1); white-space: nowrap; text-align: left; }
.rpt thead th { position: sticky; top: 0; z-index: 2; background: #EEF2F7; color: #475467; font-weight: 600; }
.rpt tbody td:first-child, .rpt thead th:first-child {
  position: sticky; left: 0; z-index: 1; background: #fff; border-right: 1px solid var(--gray-2);
}
.rpt thead th:first-child { z-index: 3; background: #EEF2F7; }
.rpt tbody tr:active td { background: var(--gray-1); }

/* 报表参数行 */
.pfield { display: flex; gap: 8px; align-items: center; padding: 10px 14px; border-bottom: 1px solid var(--gray-1); }
.pfield-k { width: 88px; flex-shrink: 0; font-size: 13px; color: var(--text-2); }
.pfield-v { flex: 1; min-width: 0; }
.pfield .input { height: 42px; }

/* 图片查看：全屏黑底、双指/双击缩放、单击退出 */
.imgview {
  position: fixed;
  inset: 0;
  z-index: 300;
  background: rgba(0, 0, 0, .94);
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  touch-action: none;
}
.imgview img {
  max-width: 100%;
  max-height: 100%;
  transform-origin: center center;
  transition: transform .12s ease-out;
  will-change: transform;
}
.imgview-close {
  position: absolute;
  top: calc(10px + env(safe-area-inset-top));
  right: 12px;
  width: 44px;
  height: 44px;
  border-radius: 22px;
  background: rgba(255, 255, 255, .16);
  color: #fff;
  font-size: 20px;
}
.imgview-note {
  position: absolute;
  left: 12px;
  right: 12px;
  bottom: calc(16px + env(safe-area-inset-bottom));
  color: rgba(255, 255, 255, .72);
  font-size: 12px;
  text-align: center;
}


/* 安装引导（iOS 没有 beforeinstallprompt，只能给图示步骤） */
.install-tip {
  position: fixed;
  left: 0; right: 0;
  /* 浮在底部 tab 之上，不盖住 tab 栏；只在工作台弹（作业屏/录入屏底部是主按钮，绝不能被它压住） */
  bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom));
  z-index: 260;
  padding: 16px 16px calc(16px + env(safe-area-inset-bottom));
  background: #fff;
  border-top-left-radius: 16px;
  border-top-right-radius: 16px;
  box-shadow: 0 -6px 24px rgba(16, 24, 40, .16);
  /* 它是「提示」不是「弹窗」：整块不拦点击，只有按钮可点。
     否则贴底的这十几行会把列表最下面的几行盖住，现场点行改数量会点不动（踩过）。 */
  pointer-events: none;
}
.install-tip button,
.install-tip a { pointer-events: auto; }
.install-row { display: flex; gap: 10px; align-items: flex-start; margin: 10px 0; font-size: 13.5px; color: var(--text-2); line-height: 1.5; }
.install-n {
  flex-shrink: 0; width: 22px; height: 22px; border-radius: 11px;
  background: var(--blue); color: #fff; font-size: 12px;
  display: grid; place-items: center;
}
.install-share { font-size: 18px; }

/* 新版本提示条：压在导航栏下面，不挡任何按钮 */
.update-bar {
  position: fixed;
  left: 8px; right: 8px;
  top: calc(6px + env(safe-area-inset-top));
  z-index: 270;
  display: flex; gap: 8px; align-items: center;
  padding: 10px 12px;
  border-radius: 10px;
  background: #1D2939;
  color: #fff;
  font-size: 13px;
  box-shadow: 0 6px 18px rgba(16, 24, 40, .28);
}
.update-bar .btn { width: auto; height: 34px; padding: 0 14px; font-size: 13px; border-radius: 8px; }
.update-bar .link-btn { color: #D0D5DD; }

/* 网关整体不可达时的兜底页（保证不白屏） */
.boot-fail {
  min-height: 100dvh;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 14px; padding: 24px calc(24px + env(safe-area-inset-left)) calc(24px + env(safe-area-inset-bottom));
  text-align: center; background: var(--gray-1); color: var(--text);
}
.boot-fail h1 { margin: 0; font-size: 17px; }
.boot-fail p { margin: 0; font-size: 13.5px; color: var(--text-2); line-height: 1.6; word-break: break-all; }
.boot-fail .btn { width: 100%; max-width: 260px; }

/* ---------------- 单据详情页签（对应安卓 activity_biz_detail.xml 的 boxTabs）
 * 34 高、圆角浅底分段；选中项白底 + 主色加粗（安卓 selectTab 就是这个观感）。
 * 没数据的页签置灰（.off）：安卓 bindTab 把 alpha 打到 0.38 且点不动。 */
.dtabs {
  display: flex; gap: 2px; margin: 0 0 10px;
  padding: 3px; height: 34px;
  background: var(--gray-2, #EEF1F5);
  border-radius: 10px;
}
.dtab {
  flex: 1; min-width: 0; border: 0; background: transparent;
  font-size: 13px; color: var(--text-2); border-radius: 8px;
  font-family: inherit; cursor: pointer;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.dtab.on {
  background: #fff; color: var(--wms-primary, #1F6FEB); font-weight: 700;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .12);
}
.dtab.off { opacity: .38; }

/* 功能面板里不可点的条目：置灰但仍显示原因（安卓 FunctionSheet 同一行为） */
.sheet-list .row.off { opacity: .45; }
.sheet-list .row.off .row-title { font-weight: 600; }

/* ====================================================================
   单据详情（阶段F 收尾）：汇总一行三列 / 明细横排 / 底部商品代码条
   数值与版式照安卓 activity_biz_detail.xml：
     汇总 = 「汇总」小标题 + 一行三格（数值在上 20sp、标签在下 12sp）
     明细头右侧 = 「N 行」+ 「横排」勾选（cbMatrix）
     底部 = [商品代码输入框] + [功能]（etcode + btnFunc，固定贴底）
   ==================================================================== */
.sec-title {
  margin: 2px 2px 8px;
  font-size: 15px;
  font-weight: 600;
  color: var(--wms-text, #1D2939);
}

.sum-row {
  display: grid;
  gap: 6px;
  margin-bottom: 12px;
  padding: 14px 8px 12px;
  background: #fff;
  border-radius: var(--radius);
}

.sum-c { text-align: center; min-width: 0; }

.sum-n {
  font-size: 20px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  line-height: 1.2;
}

.sum-l {
  margin-top: 4px;
  font-size: 12.5px;
  color: var(--text-3);
}

/* 明细头右侧：行数 + 横排勾选 */
.line-head-right {
  display: flex;
  align-items: center;
  gap: 10px;
}

.mx-toggle {
  display: flex;
  align-items: center;
  gap: 4px;
  min-height: 44px;              /* 戴手套也点得到 */
  font-size: 12.5px;
  color: var(--text-2);
}

.mx-toggle input {
  width: 18px;
  height: 18px;
  margin: 0;
}

/* 横排：横向表格（列多，允许横向滚动；表头吸顶） */
.mx-wrap {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}

/* 横排明细的图片列（安卓表格第 2 列：34dp 缩略图，列宽 38——# 列 20 + 图片列 38 + 条码列 97）。
   单元格上下不留 9dp 内边距：行高由 34dp 的图决定（安卓实测行 pitch 36.9dp）。 */
.mx-pic { width: 38px; }
table.mx td.mx-pic { padding-top: 0; padding-bottom: 0; }
.mx-pic img { display: block; width: 34px; height: 34px; border-radius: 2px; object-fit: cover; }

table.mx {
  width: 100%;
  border-collapse: collapse;
  font-size: 12.5px;
  white-space: nowrap;
}

table.mx th,
table.mx td {
  /* 左内边距 3dp（安卓 renderHeaderRow / 数据行同一口径 setPadding(dp(3),0,0,0)）：
     表头与数据行对齐，且「数量」这种右对齐表头不会贴住右边那列标题。 */
  padding: 9px 10px 9px 3px;
  border-bottom: 1px solid var(--wms-line, #EAECF0);
  text-align: left;
}

table.mx th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: #F8FAFC;
  color: var(--text-3);
  font-weight: 500;
}

table.mx td.n,
table.mx th.n {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

/* 底部固定条：[商品代码] + [功能] */
.doc-foot {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 30;
  background: #fff;
  border-top: 1px solid var(--gray-2);
  /* 底栏总高必须 = 58.6dp（安卓 activity_work_doc 的 etScan 46.2 + 上下 6 + 1px 上边线），
     否则整条底栏在像素判定里横带差 30%+（2026-11-07 实测：8px 内边距时高 65dp）。 */
  padding: 6px 12px calc(6px + env(safe-area-inset-bottom));
}

.doc-foot-bar {
  display: flex;
  align-items: center;
  gap: 8px;
}

.doc-foot-bar .input { flex: 1; min-width: 0; height: 46px; }

.doc-foot-fn {
  width: 104px;
  flex: 0 0 auto;
  height: 46px;
  /* 安卓的 MaterialButton 默认把形状内缩（insetTop/Bottom），46dp 的按钮可见蓝块只有 ~40dp，
     上下各留 ~3dp 白。网页直接填满 46dp，输入条那一带就多出两条 3dp 的蓝 → 横带 2.3%。
     用 background-clip: content-box + 上下 padding 等价还原，文字仍然居中。 */
  background-clip: content-box;
  padding-top: 3px;
  padding-bottom: 3px;
}

.doc-foot .ok-note,
.doc-foot .err-box { margin: 0 0 8px; }

/* 底栏上方那两行提示（tvMsg / tvScanHint）：安卓各 16dp 高，一行紧贴一行。
   用 row-sub 默认行高（19dp）会让输入条往下压 6dp，底部横带差到 2.3%（2026-11-07 实测）。 */
.doc-foot-line {
  height: 16px;
  line-height: 16px;
  margin: 0;
  font-size: 12px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  color: var(--wms-sub);
}

/* 12sp 在安卓是 17dp 行距（字体自带行距），网页固定 16px 会把两行整体压低 10dp，
   底部横带（dp 669~677）因此差 2.3%。这里按安卓量出来的值给：行距 17、块底离输入条 12。
   第一行是 tvMsg（BoxOpActivity 设 wms_text_2，报错才转红），第二行才是 wms_sub。 */
.doc-foot-lines { padding-bottom: 9px; }

.doc-foot-line {
  height: 17px;
  line-height: 17px;
}

.doc-foot-line.msg { color: var(--wms-text-2); }

/* 给固定条让位：最后一张卡不能被压住 */
.doc-foot-space { height: 84px; }

/* 列表屏底部固定提示行（安卓 activity_biz_list.xml 的 tvMsg）：
   12sp / 颜色 #1B1F24（Ui.setStatus 非错误态）/ 内边距 4×14 / 页面灰底，
   整行 24dp（dump 实测 page 2082~2148px = 757.1~781.1dp）。
   安卓是 LinearLayout 的最后一项（RecyclerView weight=1 让位），网页用 fixed + 等高空占位还原。 */
.list-msg {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 25;
  padding: 4px 14px calc(4px + env(safe-area-inset-bottom));
  font-size: 12px;
  line-height: 16px;
  color: #1B1F24;
  background: var(--gray-1);
}
.list-msg-space { height: 24px; }

/* 单据列表：安卓 activity_biz_list.xml 里 RecyclerView 是 weight=1 的独立滚动区（dump 实测 dp250.5~730.9），
   上面的搜索框 / 数字条 / 状态 chip / 分组标题**不跟着滚**。网页原来整页一起滚：
   滚起来表头会跑掉（用户要翻回顶上才能改筛选），而且逐帧取证一帧能看见 5~6 行、安卓只有 3~4 行，
   每行都重复的短文案「单帧最大次数」两端就永远不等（L1 判假差异，2026-11-08 P13）。
   .body 变 flex 列、只有 .doc-list 自己滚。 */
.body.docs-fill { display: flex; flex-direction: column; overflow: hidden; }
/* .screen 必须自己定高（min-height:100dvh 是给整页滚的屏用的），否则 .body 的 flex:1 撑到内容高度、
   列表区不会出现滚动条 —— 与 pick-fill 同一套写法（见 .screen:has(> .body.pick-fill)）。 */
.screen:has(> .body.docs-fill) { height: 100dvh; min-height: 0; overflow: hidden; }
.body.docs-fill > *:not(.doc-list) { flex: 0 0 auto; }
/* 列表底边对到安卓 RecyclerView 的 730.9dp：底栏 message 是 24dp 固定条，.body 本身不再留 padding-bottom
   （否则 12+24=36 两层一起算，列表区少 10dp）。 */
.body.docs-fill { padding-bottom: 0; }
.body.docs-fill .list-msg-space { height: 26px; }
.doc-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; }

/* 安卓 activity_work_doc 的底栏是**两段**：tvMsg + tvScanHint 两个 16dp 文字节点在页面灰底上，
   下面才是 58.5dp 的白底输入条（dump 实测：tvMsg 664~680、tvScanHint 680~696、白条 698.5~757）。
   网页底栏整块白 → 提示行那 35dp 白了一片（verify_box 实测 2.1% 面积，把浅灰主色簇的
   nearest_delta 拉到 46 判「主色错配」）。这里底栏底色改页面灰、白底只留给输入条一行，
   总高不变（6 + 提示行 + 58），底部横带不会位移。 */
.doc-foot.foot-split { background: var(--gray-1); border-top: 0; padding-bottom: 0; }
/* 灰底区两行提示（安卓 tvMsg + tvScanHint，各 12sp / 行高 16dp、行间没有 margin：
   dump 实测 tvMsg 664.4~680.4、tvScanHint 680.4~696.4、白条 698.5 起）。
   网页原来两行都走 .row-sub 的 12.5px + normal 行高 = 19px 高、还带 3px margin-top，
   第一行因此比安卓高 6.4dp（verify_box 底部第 20 条带 1.44% 里一半来自这条）。 */
.doc-foot.foot-split > .row-sub {
  /* 左右 12dp 由 .doc-foot 的 padding 给（安卓 tvMsg/tvScanHint 的 marginStart/End 12）——
     这里再加 margin 会变成 24（实测 x=24，安卓 x=12）。 */
  margin: 0;
  font-size: 12px;
  line-height: 16px;
}
/* 白条前的那一行（tvScanHint）在安卓有 marginBottom 2dp：白条 698.5、提示行结束 696.4 */
.doc-foot.foot-split > .row-sub:nth-last-child(2) { margin-bottom: 2px; }
.doc-foot.foot-split .doc-foot-bar {
  background: #fff;
  margin: 0 -12px;
  padding: 6px 12px calc(6px + env(safe-area-inset-bottom));
}

.sheet-note {
  padding: 0 14px 8px;
  font-size: 12px;
  color: var(--text-3);
}

/* 底部输入框左侧的扫码图标（安卓 etCode 左侧那个条码框） */
.doc-foot-input {
  position: relative;
  flex: 1;
  min-width: 0;
  display: flex;
}

/* 底栏扫码输入框 = 安卓 drawable/wms_scan_field_bg：白底 + **1.5dp 主色实边** + 10dp 圆角。
   不是表单里的浅边小输入框（那条注释是安卓源码原文：浅边放在底栏上「太丑、不明显」）。
   少了这 1.5dp 蓝边，输入条上下各 3dp 的横带就差 2.3%（2026-11-07 量出来的就是它）。 */
.doc-foot-input .input {
  border: 1.5px solid var(--wms-primary);
  border-radius: 10px;
}

.doc-foot-input .input { padding-left: 12px; }

/* 网页原来在输入框左侧画了一个 20dp 的扫描图标（.doc-foot-ic）+ 40px 左内边距。
   安卓那边的 etScan 是 x12 起、**没有图标**（verify_box / receive / pick 三屏 dump 实测），
   图标还把占位文字挤断了（verify_box 只显示到「只认本箱明」）。按安卓去掉。
   例外：单据详情（docdetail）那一屏安卓**有**图标，见下面的 .doc-foot.docdetail。 */
.doc-foot-ic {
  position: absolute;
  left: 12px;
  top: 50%;
  width: 20px;
  height: 20px;
  margin-top: -10px;
  color: var(--text-3);
  pointer-events: none;
}

.doc-foot-ic svg { width: 20px; height: 20px; display: block; }

/* 单据详情底栏 = 安卓 activity_biz_detail.xml：
     dump 实测：底栏 722.9~781.1（58.2dp，**没有上内边距**）、etCode 12~286.5（274.5 宽、46.2 高）、
     扫码图标 22.2~44.4、文字从 52.4 起、功能按钮 292.7~380.7（**88 宽**）。
   网页原来套的是作业屏那套（上内边距 6 + 按钮 104 宽）→ 输入条比安卓低 6dp，
   第 19 条带整条差 8.39%（2026-11-08 实测）。 */
.doc-foot.docdetail { padding-top: 0; padding-bottom: calc(12px + env(safe-area-inset-bottom)); }
.doc-foot.docdetail .doc-foot-bar { gap: 6px; }
.doc-foot.docdetail .doc-foot-input .input { padding-left: 40px; }
.doc-foot.docdetail .doc-foot-fn { width: 88px; }

/* ====================================================================
   登录页（lg-*）
   版式基准：android/app/src/main/res/layout/activity_login.xml
     · 头部 300dp 渐变（dimens wms_login_hero_h）+ 34dp 顶内边距（hero_pad_top）
     · logo 块 58dp / 圆角 17dp / 白 18%（drawable wms_logo_tile）
     · 白色上浮面板：圆角 22dp、压 -22dp（wms_sheet_top）、内边距 24/20
     · 行式表单：行高 50dp、标签列 84dp、右对齐输入、行间 1px 分隔（styles WmsForm*）
     · 按钮 46dp（dimens wms_btn_h）、圆角 12dp；版本号 12sp 居中
   取值一律照抄安卓 token，改这里之前先改 android 那边的 dimen/color。
   输入框 16px 是例外：安卓用 14sp，但 iOS Safari 对 <16px 的输入框会自动放大整页，
   登录时页面一跳，现场会以为「点歪了」。
   ==================================================================== */
.lg-screen {
  display: flex;
  flex-direction: column;
  min-height: 100dvh;
  background: var(--wms-bg);
}

.lg-hero {
  flex: 0 0 auto;
  height: calc(300px + env(safe-area-inset-top));
  padding: calc(34px + env(safe-area-inset-top)) 28px 0;
  /* 渐变 = 安卓 drawable/hero_gradient：angle=270（竖向）、三段 stop 0/50/100
     #1F6FEB → #1552B8 → #103F8E，**横向均匀**。
     网页原来是 165deg（斜 15°）+ 48% 中点 → 右侧比左侧暗一档，
     实测 y10 行两端差 #1f6de8 ↔ #195ecd，第 4 条带整条 4.18%。 */
  background: linear-gradient(180deg, #1F6FEB 0%, #1552B8 50%, #103F8E 100%);
  color: #fff;
}

.lg-logo {
  width: 58px;
  height: 58px;
  border-radius: 17px;
  background: rgba(255, 255, 255, .18);
  display: flex;
  align-items: center;
  justify-content: center;
}

.lg-title {
  line-height: 30.9px;
  margin-top: 14px;
  font-size: 23px;
  font-weight: 700;
  letter-spacing: .02em;
}

.lg-sub {
  margin-top: 6px;
  font-size: 12.5px;
  line-height: 20px;
  color: rgba(255, 255, 255, .78);
}

.lg-chips {
  display: flex;
  gap: 4px;
  margin-top: 10px;
}

.lg-chip {
  padding: 3px 10px;
  border-radius: 8px;
  background: rgba(255, 255, 255, .2);
  font-size: 11px;
  line-height: 15px;
}

.lg-sheet {
  flex: 1;
  position: relative;
  z-index: 2;
  margin-top: -22px;
  padding: 24px 20px calc(16px + env(safe-area-inset-bottom));
  background: var(--wms-surface);
  border-radius: 22px 22px 0 0;
  display: flex;
  flex-direction: column;
}

/* ---------- 行式表单 ---------- */
.lg-form {
  background: var(--wms-surface);
  border: 1px solid var(--wms-line);
  border-radius: 12px;
}

.lg-fr {
  display: flex;
  align-items: center;
  gap: 6px;
  min-height: 50px;
  padding: 8px 14px;
}

.lg-fr-tap { cursor: pointer; }
.lg-fr-tap:active { background: #F9FAFB; }

.lg-k {
  flex: 0 0 84px;
  font-size: 13.5px;
  color: var(--wms-text-2);
}

.lg-in {
  flex: 1 1 auto;
  min-width: 0;
  height: 34px;
  padding: 0;
  border: 0;
  outline: 0;
  background: transparent;
  text-align: right;
  font-family: inherit;
  font-size: 16px;
  color: var(--wms-text);
}

.lg-in::placeholder { color: var(--wms-sub); }

.lg-val {
  flex: 1 1 auto;
  min-width: 0;
  text-align: right;
  font-size: 16px;
  color: var(--wms-text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.lg-pick {
  flex: 0 0 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 0;
  background: none;
  color: #667085;
}

.lg-div { height: 1px; background: var(--wms-line); }

.lg-remember {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 6px;
  /* 48dp 是安卓 CheckBox 的触摸高度（WmsForm* 行同高），不是纯字高：
     少了这一段，表单框会比安卓矮 20dp，登录按钮整块跟着上移。 */
  min-height: 48px;
  margin: 8px 10px 0 0;
  font-size: 13px;
  color: var(--wms-text);
}

.lg-remember input {
  width: 18px;
  height: 18px;
  margin: 0;
  accent-color: var(--wms-primary);
}

/* ---------- 报错 / 按钮 / 版本 ---------- */
.lg-status {
  margin-top: 12px;
  padding: 14px;
  border: 1px solid var(--wms-line);
  border-radius: 12px;
  font-size: 12px;
  line-height: 1.5;
  color: var(--wms-text);
  word-break: break-word;
}

.lg-btn {
  margin-top: 19.2px;
  height: 46.2px;
  /* 安卓 Material3 按钮的填充只占布局框的中间约 40dp（实测蓝区 586..623，框 582.2..628.4），
     上下各 3dp 是透明边。这里用透明边框 + background-clip 还原，点击区仍是 46dp。 */
  border: 0;
  border-top: 3px solid transparent;
  border-bottom: 3px solid transparent;
  border-radius: 12px;
  background: var(--wms-primary);
  /* background 简写会把 background-clip 重置成 border-box，所以这一行必须放在 background 之后 */
  background-clip: padding-box;
  color: #fff;
  font-family: inherit;
  font-size: 15px;
  font-weight: 700;
}

.lg-btn:active { background: var(--wms-primary-d); }
.lg-btn[disabled] { opacity: .6; }

.lg-ver {
  margin-top: 12px;
  text-align: center;
  font-size: 12px;
  color: var(--wms-text-2);
}

/* ---------- 服务器 / 领域弹层里的行 ---------- */
.lg-tap {
  flex: 1;
  min-width: 0;
  display: block;
  padding: 0;
  border: 0;
  background: none;
  text-align: left;
  font: inherit;
  color: inherit;
}

.lg-edit { padding: 12px 14px 0; }

.lg-edit-row {
  display: flex;
  gap: 8px;
  margin-top: 4px;
}

.lg-edit-row .btn { flex: 1; min-width: 0; }

.lg-danger { color: var(--wms-danger); border-color: var(--wms-danger); }

/* ============================================================================
 * 富行选择弹层 + 全屏加载遮罩（app/ui.js 的 WPickSheet / WBusy，唯一实现）
 *   主行编号加粗放大（安卓 Pickers.Rich 用 RelativeSizeSpan 1.15~1.25），状态词按状态上色。
 * ========================================================================== */
.pick-row {
  width: 100%;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 0;
  border: 0;
  border-top: 1px solid #EAECF0;
  background: none;
  text-align: left;
  font: inherit;
  color: inherit;
}
.pick-row:first-child { border-top: 0; }
.pick-main { font-size: 15.6px; font-weight: 700; color: #1D2939; letter-spacing: .2px; }
.pick-tag { margin-left: 8px; font-size: 12.5px; font-weight: 700; }
.pick-extra { margin-left: 8px; font-size: 12.5px; color: #475467; }
/* 固定候选单选弹窗（安卓 setSingleChoiceItems / setItems）：
 *   候选文字要**整句看得见** —— 通用 .row-title 是 nowrap+省略号，「自动（库里图片 → 商品链接的
 *   图片URL）（AUTO）」会被截成「…（AUTO 看不见）」，等于没给用户选项名（A10 实测）。
 *   安卓那两个弹窗里文字是折行的，所以这里只对 searchable=false 放开折行。 */
.modal[data-pick-fixed] .row-title { white-space: normal; overflow: visible; text-overflow: clip; }
.pick-radio {
  flex: none; width: 18px; height: 18px; border-radius: 50%;
  border: 2px solid #98A2B3; position: relative;
}
.pick-radio.on { border-color: var(--blue); }
.pick-radio.on::after {
  content: ''; position: absolute; left: 3px; top: 3px; width: 8px; height: 8px;
  border-radius: 50%; background: var(--blue);
}

.busy-mask {
  position: fixed;
  inset: 0;
  z-index: 400;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(16, 24, 40, .45);
}
.busy-card {
  min-width: 210px;
  padding: 22px 20px 16px;
  border-radius: 12px;
  background: #fff;
  text-align: center;
}
.busy-spin {
  width: 26px;
  height: 26px;
  margin: 0 auto 10px;
  border: 3px solid #D0D5DD;
  border-top-color: var(--wms-primary);
  border-radius: 50%;
  animation: busy-rotate .9s linear infinite;
}
@keyframes busy-rotate { to { transform: rotate(360deg); } }
.busy-text { font-size: 13px; color: #475467; }


/* ============================================================================
 * 标签打印（P5）—— 与安卓 activity_label.xml 一一对应
 *   类型胶囊（Chip：32dp 高 / 16dp 圆角 / 13sp）→ 码 + 取数 → 预览卡 → 内容开关 → 份数 → 底栏两键
 * 取值照抄 android/.../values（wms_chip #EEF2F7 / wms_primary #1F6FEB / wms_pad 14 / wms_pad_s 12）
 * ========================================================================== */
/* 横向只补 2px：`.body` 已经给了 12px（合计 14 = 安卓 wms_pad）；
   纵向补 11px（12+11 = 23dp，安卓标签页 ScrollView 的 padding 14 + 卡片间距差出来的实测值）。 */
.lb-wrap { padding: 11px 2px 96px; }
.lb-kinds { display: flex; gap: 8px; overflow: hidden; }
.lb-chip {
  height: 30px; padding: 0 13px; border: 0; border-radius: 15px;
  background: #EEF2F7; color: var(--wms-text); font-size: 13px; white-space: nowrap;
  font-family: inherit;
}
.lb-chip.on { background: var(--wms-primary); color: #fff; }
.lb-code { display: flex; gap: 12px; margin-top: 21px; }
.lb-code .input {
  flex: 1; min-width: 0; height: 44px; padding: 0 12px; font-size: 16px;
  /* 安卓 WmsInput 的底是 wms_input_bg：白底 + 1dp #EAECF0（几乎看不见），不是 .input 默认的
     #D0D5DD 深边。深边会让这一条带差 16%（2026-11-07 实测）。 */
  border: 1px solid var(--wms-line); border-radius: 10px; background: #fff;
}
.lb-load {
  width: auto; min-width: 88px; flex: 0 0 auto;
  /* 安卓 btnLoad 是 Material3 按钮：布局框 126.9..170.2，但蓝只画在中间 36dp（实测 131..166）。
     上下各 4.2dp 用透明边还原，点击区仍是 44dp。 */
  height: 44px; padding: 0 18px; border-radius: 10px; font-size: 15px;
  border-top: 4.2px solid transparent;
  border-bottom: 4.2px solid transparent;
  background-clip: padding-box;
}
/* 安卓 activity_label.xml 的卡片是 WmsCard：**卡片本身没有内边距**，标题（WmsCard.Title）
   贴着卡片左边线，预览块 / 勾选行 / 份数行各自由内边距决定缩进。
   给卡片统一 12px 内边距会让标题右移 12dp、整卡下移 16dp（实测 band 7% 就是它）。 */
.lb-card { margin-top: 14px; padding: 2px 0 12px; }
.lb-card-title { font-size: 15px; font-weight: 700; color: var(--wms-text); }
.lb-preview {
  margin: 12px 0 0; padding: 8px; min-height: 34px;
  background: var(--wms-bg); color: var(--wms-text);
  font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 13px; line-height: 1.45;
  white-space: pre-wrap; word-break: break-all;
}
.lb-hint { margin-top: 8px; padding: 0 12px; font-size: 12px; line-height: 17px; color: var(--wms-sub); white-space: pre-line; }
.lb-opt { display: flex; align-items: center; gap: 10px; height: 48px; padding: 0 12px; cursor: pointer; }
.lb-cb {
  position: relative; width: 18px; height: 18px; flex: 0 0 auto;
  border: 1.5px solid var(--wms-line-2); border-radius: 3px; background: #fff;
}
.lb-cb.on { background: var(--wms-primary); border-color: var(--wms-primary); }
.lb-cb.on::after {
  content: ''; position: absolute; left: 4.5px; top: 1px; width: 5px; height: 9px;
  border: 2px solid #fff; border-top: 0; border-left: 0; transform: rotate(45deg);
}
.lb-opt-label { font-size: 14px; color: var(--wms-text); }
.lb-opt.off .lb-cb { border-color: #D0D5DD; background: #F2F4F7; }
.lb-opt.off .lb-opt-label { color: var(--wms-sub); }
.lb-copies { display: flex; align-items: center; gap: 0; padding-left: 12px; padding-right: 12px; }
.lb-copies-title { flex: 1; }
.lb-step {
  width: 48px; height: 48px; border: 0; border-radius: 10px; padding: 0;
  background: #E5E7EB; color: var(--wms-text-2); font-size: 22px; line-height: 1; font-family: inherit;
}
.lb-copies-num { width: 64px; text-align: center; font-size: 18px; font-weight: 700; color: var(--wms-text); }
.lb-foot {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 30;
  display: flex; gap: 12px; align-items: center;
  background: var(--wms-foot, #FCFCFD); border-top: 1px solid var(--wms-line);
  /* 安卓 activity_label.xml 的底栏是 WmsCard.Foot：上内边距 9dp、下 9dp + 系统导航条。
     实测基线：底栏上边线在 dp 695.6，按钮可见蓝块 695.6→733.5（38dp），下面留 23dp 空白。 */
  padding: 0 14px calc(23px + env(safe-area-inset-bottom));
}
.lb-print { flex: 1; height: 38px; font-size: 15px; }
/* 安卓这颗「打印」在没有取到数时 isEnabled=false，但 MaterialButton 的 backgroundTint 是纯色，
   禁用态**看起来仍然是蓝色**（基线图像素实测 #1f6feb）。所以这里不能加蒙层，
   否则底部那一整块和安卓差 34%（2026-11-07 实测）。点不点得动由 disabled 负责，视觉不动。 */
.lb-print:disabled { opacity: 1; background: var(--wms-primary); color: #fff; }
.lb-printer { width: 93px; flex: 0 0 auto; height: 38px; font-size: 15px; }

/* 顶栏「扫码」动作（安卓 wmsNav(action=...) 的 navAct）：右上角白字，
   点开全屏取景遮罩（openCameraSheet 动态建，五屏共用一份）。*/
.nav-act { color: #fff; font-size: 14px; background: none; border: 0; padding: 0 2px; font-family: inherit; }
.cam-sheet {
  position: fixed; inset: 0; z-index: 400; background: rgba(16, 24, 40, .92);
  display: flex; align-items: center; justify-content: center;
}
.cam-box { position: relative; width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px; }
.cam-box.cam-err { background: #101828; }
.cam-video { width: 88vw; max-height: 60vh; background: #000; border-radius: 12px; }
.cam-hint { color: #fff; font-size: 13px; padding: 0 24px; text-align: center; line-height: 20px; }
.cam-close { height: 40px; padding: 0 20px; border-radius: 10px; border: 1px solid #fff; background: transparent; color: #fff; font-size: 14px; font-family: inherit; }

/* 作业屏「还没开单」的引导语（安卓 tvHint 的口径：12sp 副色，左边距 12dp） */
.act-empty-hint { padding: 10px 12px 0; font-size: 12px; color: var(--wms-sub); }

/* ============ 单据查询 · 类型清单（对应安卓 activity_biz_types.xml / BizTypesActivity） ============
   安卓：导航栏下一行灰提示（14dp 内边距 / 6dp 上 / 4dp 下 / 12sp #98A2B3），
   列表 padding 0 12dp 14dp，一行一张白卡（simple_list_item_2 + wms_card_bg）：
   卡片内边距 32px28px@440dpi = 11.6dp/10.2dp，卡间 16px = 5.8dp；
   第一行「标题（代码）」15sp #1D2939，第二行「系统里有 N 张」12sp 绿 #0E9F6E（0 张改灰写「还没有单据」）。 */
.bt-tip { padding: 6px 14px 4px; font-size: 12px; color: #98A2B3; }
.bt-list { padding: 0 12px 14px; }
.bt-item { background: #fff; border-radius: 12px; padding: 10.2px 11.6px; margin-bottom: 5.8px; }
.bt-item:active { background: #f9fafb; }
.bt-t1 { font-size: 15px; line-height: 20px; color: #1d2939; }
.bt-t2 { margin-top: 2px; font-size: 12px; line-height: 16px; color: #0e9f6e; }
.bt-t2.empty { color: #98a2b3; }

/* ============ 我的（对应安卓 activity_mine.xml / MineActivity.render） ============
   用户卡：白卡内边距 16dp；头像 52dp 圆角块（wms_logo_tile）20sp 白粗；
   姓名 16sp 粗 + 「单位（代码）」12sp 副色（间距 3dp）。
   明细行：卡片内边距 4dp 纵向 / 16dp 横向，行内 13dp（设置 13dp），1dp 分隔线。
   版本：居中 11.5sp 灰，上间距 18dp。 */
.me-user { display: flex; align-items: center; padding: 16px; margin-bottom: 10px; }
.me-av {
  /* 安卓 tvMineAvatar 的底是 drawable/wms_logo_tile：18% 白 + 17dp 圆角 + 白字，
     这块 tile 本为蓝色 hero 头做的，复用到白卡上 → 安卓上实际看不见。
     基准是安卓，这里照做（元素没删、「杨」还在 DOM 里，和安卓一样看不见）。
     原来画成蓝色渐变方块 → mine 屏头像区差 15.8%（2026-11-08 量到）。 */
  width: 52px; height: 52px; border-radius: 17px; flex: none;
  background: rgba(255, 255, 255, .18);
  color: #fff; font-size: 20px; font-weight: 700;
  display: flex; align-items: center; justify-content: center;
}
.me-main { margin-left: 14px; min-width: 0; }
.me-name { font-size: 16px; font-weight: 700; color: var(--wms-text); }
.me-owner { margin-top: 3px; font-size: 12px; color: var(--wms-sub); }
.me-rows { padding: 4px 16px; margin-bottom: 10px; }
.me-row {
  padding: 13px 0; font-size: 13.5px; color: var(--wms-primary);
  border-bottom: 1px solid var(--wms-line); cursor: pointer;
}
.me-rows .me-row:last-child { border-bottom: none; }
.me-row-danger { color: var(--wms-danger); font-size: 14px; }
.me-ver { margin-top: 18px; text-align: center; font-size: 11.5px; color: var(--wms-text-2); }
.me-status { margin-top: 10px; padding: 0 4px; font-size: 12px; color: var(--wms-sub); }

/* 导航栏里的纯图标按钮（「我的 › 高级」入口这类安卓没有的按钮，只给图标不给文字） */
.navbar .nav-ico {
  display: flex; align-items: center; justify-content: center;
  width: 40px; height: 40px; color: #fff;
}
.navbar .nav-ico svg { width: 22px; height: 22px; }
/* hero 头部里的图标按钮要跟「‹ 返回」同高（33dp）—— 40px 会把 hero 顶栏从 61dp 撑到 68dp，
   整屏往下错 7dp（2026-11-08 量到 mine band 34.7%）。安卓这屏没有这个齿轮，尺寸只需不顶高。 */
.navbar.hero .nav-ico { width: 33px; height: 33px; }

/* ============ 扫码识别（对应安卓 activity_scan.xml，2026-11-08 整屏重排） ============
   ① 取景区 250dp 深底 wms_dark(#101828)；取景框 220×150、2dp #FF8A00 实边 12dp 圆角；
      激光线 208×2 #FF8A00 居中；状态角标左上（12/8 边距、#66000000、白 12sp）；
      底部提示条（左右 12dp、下 14dp、#66000000、居中、8/4 内边距、12.5sp 白）。
   ② 搜索框 style/WmsSearchBox：44dp 高、白底、1dp wms_line、圆角 wms_r、左右 12dp 内边距。
   ③ 按钮行：ghost 按钮 40dp 高（开相机 minWidth 88、模糊查找占满剩余）；复选「只看有货」12sp。
   ④ 结果框 tvResult：白底 1dp 边框、10dp 内边距、13sp、可选中文字。
   ⚠ 文字一个字都不要多：L1 判据是「文案多重集完全一致」，这里多一句「查询」就判 FAIL。 */
.sc-box {
  /* 安卓 pvCamera 是**通栏纯黑** FrameLayout（52..302.2）：左右不留 gutter，色值 #000000。
     .body 已经有 12px 内边距，所以这里用负外边距顶出去；底色原来是 #101828（深蓝，差 40%）。 */
  position: relative; height: 250.2px; background: #000; overflow: hidden;
  margin: -12px -12px 0;
}
.sc-video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.sc-frame {
  position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: 220px; height: 150px; border: 2px solid #FF8A00; border-radius: 12px;
  display: flex; align-items: center; justify-content: center;
}
.sc-laser { display: block; width: 208px; height: 2px; background: #FF8A00; }
.sc-state {
  position: absolute; left: 12px; top: 12px; padding: 3px 8px;
  background: rgba(0, 0, 0, .4); color: #fff; font-size: 12px; border-radius: 4px;
}
.sc-state.bad { color: #FFD0D0; }
.sc-tip {
  position: absolute; left: 12px; right: 12px; bottom: 14px; padding: 4px 8px;
  background: rgba(0, 0, 0, .4); color: #fff; font-size: 12.5px; text-align: center; border-radius: 4px;
}
.sc-search {
  display: flex; align-items: center; gap: 6px; height: 44px; margin: 12px 0 0;
  background: var(--wms-surface); border: 1px solid var(--wms-line);
  border-radius: var(--radius); padding: 0 12px;
}
.sc-input {
  flex: 1; min-width: 0; border: none; outline: none; background: transparent;
  font-size: 16px; color: var(--wms-text); height: 100%;
}
.sc-input::placeholder { color: var(--wms-sub); }
.sc-btn {
  /* 安卓 btnLocate 是 Material3 按钮：布局框 318.2..354.2（36dp），蓝只画中间 31dp
     （实测蓝区 320.7..351.7）→ 上下 2.5dp 透明边，点击区仍是 36dp。 */
  flex: none; min-width: 72px; height: 36px; border: none; border-radius: 8px;
  border-top: 2.5px solid transparent; border-bottom: 2.5px solid transparent;
  background: var(--wms-primary); background-clip: padding-box;
  color: #fff; font-size: 13px;
}
.sc-btn:disabled { opacity: .6; }
.sc-row { display: flex; align-items: center; gap: 6px; padding: 12px 0 4px; }
.sc-ghost {
  height: 40px; min-width: 88px; padding: 0 10px; border-radius: 8px;
  border: 1px solid var(--wms-line-2); background: #fff; color: var(--wms-primary); font-size: 13px;
}
.sc-ghost.grow { flex: 1; min-width: 0; }
.sc-ghost:disabled { opacity: .6; }
.sc-chk { margin-left: 10px; display: flex; align-items: center; gap: 4px; font-size: 12px; color: var(--wms-text-2); }
.sc-result {
  margin: 6px 0 0; padding: 10px; background: var(--wms-surface);
  border: 1px solid var(--wms-line); border-radius: var(--radius);
  font-size: 13px; color: var(--wms-text-2); white-space: pre-line; word-break: break-all;
  user-select: text; -webkit-user-select: text;
}
.sc-hits { margin: 6px 0 14px; }
.sc-hit { background: #fff; border-radius: 12px; padding: 10px 12px; margin-bottom: 6px; }
.sc-hit:active { background: #f9fafb; }
.sc-hit-t1 { font-size: 15px; line-height: 20px; color: var(--wms-text); font-weight: 700; }
/* 三码两行（安卓 tvCodes 12sp 灰、行内换行） */
.sc-hit-codes { margin-top: 4px; font-size: 12px; line-height: 16px; color: var(--wms-sub); white-space: pre-line; }
/* 命中说明（左，11sp 灰）+ 库存数（右，15sp 粗主色）—— 安卓那行是横向 LinearLayout */
.sc-hit-foot { margin-top: 6px; display: flex; align-items: center; gap: 8px; }
.sc-hit-match { flex: 1; min-width: 0; font-size: 11px; color: var(--wms-sub); }
.sc-hit-stock { font-size: 15px; font-weight: 700; color: var(--wms-primary); }

/* ============ 设置（对应安卓 activity_settings.xml + SettingsActivity.render，2026-11-08 整屏重排） ============
   分组标题：12sp 灰（wms_text_dim），内边距 4/14/4/6（安卓 groupTitle）；
   卡片：白底 + 4dp 纵向内边距，行 11dp 上下、左右 14dp，行间 1dp wms_line 分隔；
   左栏名称 14sp 主色 + 说明 11sp 灰；右栏值 13.5sp 粗（继承来的值用灰）、
   来源角标 10.5sp 灰；开关是「开启 / 关闭」实心胶囊（安卓 SwitchCompat 的 textOn/textOff 是看得见的字）。 */
.set-refresh { color: #fff; font-size: 14px; padding: 6px 10px; background: transparent; border: none; }
.set-refresh:disabled { opacity: .6; }
/* 行高一律按安卓 dump 量出来的值给（ContentView 的 TextView 行高 = sp×1.267，Chrome 的
   normal 行高对同一 CJK 字体是 ×1.48，不写死每行会多 2~3dp；一条设置行的左右两栏是
   垂直居中，行高差一半就整体错位 —— settings 实测右栏值文本低了 6dp，横带 2.11%。 */
.set-status { margin: -12px -12px 12px; padding: 8px 16px; font-size: 12px; line-height: 16px; color: var(--wms-sub); }
.set-group { padding: 14px 4px 6px; font-size: 12px; line-height: 16px; color: var(--wms-text-3, #667085); }
.set-card { background: #fff; border-radius: 12px; padding: 4px 14px; margin: 0 0 2px; }
.set-row {
  display: flex; align-items: center; gap: 0;
  padding: 11px 0; border-bottom: 1px solid var(--wms-line);
}
.set-card .set-row:last-child { border-bottom: none; }
.set-l { flex: 1 1 0; min-width: 0; }
.set-name { font-size: 14px; line-height: 18.9px; color: var(--wms-primary); }
.set-desc { padding: 2px 6px 0 0; margin: 0; font-size: 11px; line-height: 13.4px; color: var(--wms-text-2); overflow-wrap: anywhere; }
.set-r { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: flex-end; gap: 1px; }
.set-val { font-size: 13.5px; line-height: 17.1px; font-weight: 600; color: var(--wms-sub); text-align: right; overflow-wrap: anywhere; }
/* 安卓：isInherited → wms_text_dim（= wms_text_2 #475467），否则 wms_sub #98A2B3。
   这里原来把 dim 写成 #667085（另一个灰），继承值就比安卓深一档。 */
.set-val.dim { color: var(--wms-text-2); }
.set-src { font-size: 10.5px; line-height: 13.3px; color: var(--wms-text-2); }
/* 布尔项 = 安卓框架 Switch（settings.dump.xml: android.widget.Switch，节点 540..1009 × 1919..2051）。
   绘制区实测 31×19dp：淡紫轨道 #eaddff + 蓝钮 #1e6de6 压在右侧、带 1dp 投影；轨道上**不画字**
   （8 倍放大图确认，只有一片纯紫 + 一个纯蓝圆钮）。网页原来是一枚绿色胶囊按钮、白字「开启」，
   色相（绿 vs 紫/蓝）和形状（58×30 vs 31×19）都不是安卓的 —— P13 按实测改回开关。
   文案「开启/关闭」保留在 DOM 里（安卓 dump 里这个字也是 Switch 节点的 text、同样不绘制），
   视觉上 clip 掉（.set-switch-t），不删文案，L1 照比。 */
.set-switch {
  position: relative; width: 31px; height: 19px; padding: 0; border: none;
  border-radius: 9.5px; background: #e0e0e0;
}
.set-switch.on { background: #eaddff; }
.set-switch::after {
  content: ''; position: absolute; top: 0; left: 0; width: 19px; height: 19px;
  border-radius: 50%; background: #fafafa; box-shadow: 0 1px 2px rgba(0, 0, 0, .30);
}
.set-switch.on::after { left: 12px; background: #1e6de6; }
.set-switch-t {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap;
}
.set-chip {
  margin-top: 2px; height: 30px; padding: 0 12px; border-radius: 8px;
  border: 1px solid var(--wms-primary); background: #fff; color: var(--wms-primary); font-size: 12px;
}

/* 作业任务「生成单据」确认框里的两个开关行（安卓 AlertDialog 的自定义 view） */
.gen-chk { display: flex; align-items: center; gap: 6px; padding: 6px 0; font-size: 13px; color: var(--wms-text-2); }

/* ============ 作业屏抬头统一口径（搬移 / 盘点 / 验箱 / 拣货 四屏共用） ============
   几何全部按 activity_work_doc.xml 的实测 dump（move_work.dump.xml，画布 = 绝对 dp − 24）：
     顶栏 52 → 抬头卡 58.2（间距 6.2）→ 抬头行 28（文字 22.9 居中）→ 明细 3 行（各 16、行距 18.2、
     首行再缩 4）→ 卡底 166.5（下内边距 12）→ 间距 6.2 → 汇总卡 64（三格各 122.9、无 gap）→
     间距 6.2 → 页签 38.2（两块之间 2.2、方角、选中纯蓝 #1f6feb）→ 2.2 → 明细列表（通栏白）。
   页面底色用 wms_bg 灰：安卓卡片左右的 gutter 就是灰的，只有明细列表是通栏白。
   原来这四屏各写各的内联 margin、页签用 44dp 圆角胶囊、列表缩进 12dp、整页白底 ——
   band 222-296 因此差 5~16%（2026-11-08 量到）。 */
.whead { margin-top: -5.8px; padding-bottom: 12px; margin-bottom: 6.2px; }
.whead .card-head { padding: 12px 12px 0; line-height: 28px; border-bottom: 0; }
.whead .whead-detail { padding-top: 4px; }
.whead .row-sub { margin: 0 0 2.1px; padding: 0.9px 12px; font-size: 12px; line-height: 14.2px;
  /* 安卓 tvDocInfo/tvRcrLine/tvHint 是**会换行**的（盘点那屏两条长文案各占 2 行，
     boxHeadDetail 84.7dp）；.row-sub 默认 nowrap+省略号 → 整块矮 28dp，下面全部上移 */
  white-space: normal; overflow: visible; text-overflow: clip; overflow-wrap: anywhere; }
.whead .row-sub:last-child { margin-bottom: 0; }

/* 汇总三格：安卓是一张通栏白卡（12..380.7）里排三个 122.9 的格子，没有间隙。
   网页原来是三张独立小卡 + 10px 间隙 → 间隙处露底色，band 185-260 差 5%+。 */
.wsum {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 0;
  margin: 0 0 6.2px; background: #fff; border-radius: 0; overflow: hidden;
}
.wsum .stat { background: transparent; border-radius: 0; min-height: 64px; padding: 10px 0; }
.wsum .stat-num { margin-top: 0; }
.wsum .stat-label { min-height: 0; }

/* 明细列表：安卓 RecyclerView 是通栏白（0..392.7），没有卡片圆角和外边距 */
.wlist { margin: 0 -12px; border-radius: 0; background: #fff; }

/* 作业屏（docact 的 menu_source：搬移/盘点）：安卓 rvLines 是 layout_height=0dp + weight=1 +
   wms_surface 白底 → 明细区**一直白到底栏**，行少时也是一大片白。
   网页原来只有列表卡自身的高度，行少时下面露页面灰底（实测 stt_work dp400~660 白 ↔ #f2f3f5，
   26 万像素级别的白/灰差把绿、蓝两个主色簇拉偏成 79/141 的「主色错配」）。
   做法：内容区改纵向 flex，明细卡吃满剩余高度（内容更长时仍按内容高、照旧滚动）。
   verify_box 用的是同一份 activity_work_doc.xml，所以共用这个 class。 */
.body.work-fill { display: flex; flex-direction: column; }
.body.work-fill > .card.wlist { flex: 1 0 auto; }

/* 作业屏的卡片是安卓的纯色底（@color/wms_surface），没有圆角 drawable → 角上不能有白三角 */
.whead, .wsum, .wlist { border-radius: 0; }
/* 抬头行的状态字在安卓是无底纯文字（tvDocStatus 36x16）；网页的胶囊会多出一块 49x32 的浅色底 */
.whead .card-head .tag {
  background: none; padding: 0; border-radius: 0;
  font-size: 11.5px; line-height: 16px; font-weight: 500;
}

/* 页签：38dp 高、方角、选中纯蓝加粗、两块之间 2dp —— 安卓 tabTodo/tabDone 是
   两个 setBackgroundColor 的 TextView，根本没有圆角和描边 */
.wl-tabs { gap: 2.2px; margin: 0 0 2.2px; }
.wl-tab {
  min-height: 38.2px; border-radius: 0; border: 0;
  background: #fff; color: var(--wms-text-2); font-size: 14px;
}
.wl-tab.on { background: var(--wms-primary); border-color: var(--wms-primary); color: #fff; font-weight: 700; }

/* 自绘 hero 头部（安卓 drawable/hero_gradient：270° #1F6FEB → #1552B8 → #103F8E）
   用在「我的」「设置」这两屏 —— 它们不是 view_nav，头部比通用 52dp 顶栏高（内边距 16/14）。

   高度必须落在 **61dp**（activity_mine.xml：paddingVertical 14 + 内容 33.1 + 14 = 61.1，
   实测 dump：LinearLayout (0,24)-(392.7,85.1)）。原来 .nav-right 的 min-height:44px
   （通用顶栏为了点得到）把内容撑到 44 → 头部 72dp，整屏往下多 11dp：
   我的/设置两屏 band 37-74 因此差 35%（2026-11-08 量到）。所以 hero 里把 min-height 归零，
   渐变也按 android:angle=270 的三段停点（0/50/100）走，不是 55%。 */
.navbar.hero {
  height: auto;
  /* 安卓 activity_mine/settings 的 hero 是 61dp（paddingVertical 14 + 内容 33.1 + 14）。
     不锁最小高度时高度跟着右侧按钮走：设置页的「刷新」是 32dp → 头部 59dp，整屏跟着上移 2dp
     （我的那屏右侧是 33dp 图标，所以正好 61 —— 两屏同一份 hero，高度不能靠巧合）。 */
  min-height: 61px;
  padding: 14px 16px;
  background: linear-gradient(180deg, #1F6FEB 0%, #1552B8 50%, #103F8E 100%);
}
.navbar.hero .nav-back { min-height: 0; padding: 6px 8px; font-size: 15px; margin-left: 0; }
.navbar.hero .nav-title { font-size: 17px; margin-left: 8px; }
.navbar.hero .nav-right { margin-left: auto; min-height: 0; }

/* 拣货明细行（安卓 item_sow_line，**只有两行**）：
     行内边距 上下 9dp / 左右 12dp，行高 9+21+3+18+9 = 60dp（实测 dump：每行 pitch 59.2dp）。
   共用件 .lr-row 的 7/14 + .row-main min-height 56 是按 item_accept_line（三行）定的，
   直接套在这屏会让每行高 71dp（一屏少两行，横带 2% 上下徘徊）。只在这屏覆盖。 */
/* 左滑行：外壳不留内边距（动作条贴行盒右缘，留缝就露色块），内边距搬到内容层
   （与 .lr-row.swipeable 同一条口径；这里选择器更具体，必须一起改）。 */
.pick-lines .lr-row { padding: 9px 12px; }
.pick-lines .lr-row.swipeable { padding: 0; }
.pick-lines .lr-row.swipeable .lr-content { padding: 9px 12px; }
.pick-lines .wl-line .row-main { min-height: 0; }
.pick-lines .lr-top { height: 21px; line-height: 21px; }
.pick-lines .lr-code, .pick-lines .lr-qty { font-size: 15px; line-height: 21px; }
.pick-lines .lr-code { font-weight: 700; }
.pick-lines .lr-qty { font-weight: 700; min-height: 0; }
.pick-lines .lr-mid { margin-top: 3px; height: 18px; min-height: 18px; flex-wrap: nowrap; }
.pick-lines .lr-chip { margin-left: 4px; }
.pick-lines .lr-chip:first-child { margin-left: 0; }

/* 单据详情（量的是 activity_biz_detail.xml + baseline dump）：
   「标签 / 值」一行 pitch **34.9dp**（文本 17.1 + 上下各 8.9，含 1px 分隔线）；
   网页 .kv 是 14px/21 行高 + 9px 上下 + 1px 线 = 40dp，7 行就差 36dp ——
   明细表头被推到底栏下面，band 666~703 差 8.49%（2026-11-08 P12 量到）。
   抬头那张卡安卓 53dp 高（单号 17sp 粗体 25.4 + 上下 14），网页只有 41 —— 拨页签也跟着上移。 */
.body.bizdetail .kv { padding: 8.5px 14px; font-size: 14px; line-height: 17px; }
.body.bizdetail .kv-k, .body.bizdetail .kv-v { line-height: 17px; }
.body.bizdetail [data-doc-num-row] { padding: 14px; }
.body.bizdetail [data-doc-num-row] .kv-v { font-size: 17px; font-weight: 700; line-height: 25px; }
.body.bizdetail .dtabs { margin-top: 8px; }
/* 汇总三格与「单据明细」卡头的行高照安卓量：数值 20.3dp、标签 15dp（网页是 24/19，多出 8dp）；
   卡头下沿到表格 17.8dp（网页 24）。这几处叠起来正好把明细表推低 18dp —— band 666~703 就是它。 */
.body.bizdetail .sum-n { line-height: 20px; }
.body.bizdetail .sum-l { line-height: 15px; }
.body.bizdetail .sec-title { margin: 0 2px 6px; }
.body.bizdetail .card-head { padding-bottom: 6px; }

/* 拣货作业的版面 = 安卓 activity_work_doc：抬头卡 / 三格 / 页签**固定**，只有明细区（rvLines）
   自己滚，底栏之上还压着 tvMsg + tvScanHint。网页原来是整页滚（抬头会滚走、行会滚到底栏下面），
   所以「一帧能看见 13 行」而安卓只有 7 行，L1 的「单帧最大次数」永远比安卓多。
   这里把明细卡改成独立滚动区，抬头与页签不再跟着滚 —— 视觉静止帧与安卓一致。
   .screen 必须锁 100dvh + hidden，否则明细卡内容会把整页撑高（实测 .screen 涨到 1620dp，window 在滚）。 */
.screen:has(> .body.pick-fill) { height: 100dvh; min-height: 0; overflow: hidden; }
.body.pick-fill { display: flex; flex-direction: column; overflow: hidden; padding-bottom: 95px; }
.body.pick-fill > .card.wlist { flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; }
/* 抬头卡 / 三格 / 页签 / 底部提示条不许被 flex 压缩（不写这条，抬头会被挤扁：实测整块从 283dp 涨/缩到 185） */
.body.pick-fill > *:not(.card.wlist) { flex: 0 0 auto; }
/* 旧的「底栏等高占位」在这屏不要：底栏与提示条的高度已经算进 .body 的 padding-bottom（95dp），
   再留一条 84dp 占位会让明细区少 84dp（实测卡在 578dp 结束、下面空一条）。 */
.body.pick-fill > .doc-foot-space { display: none; }

/* 作业屏底栏上方那两条（安卓 activity_work_doc 的 tvMsg + tvScanHint，各 16dp、12sp、#98A2B3）：
   **压在页面灰底 (#F2F4F7) 上**，不是白底 —— 安卓 rvLines 到 686dp 就结束，686~722 是 wms_bg。
   少了这条灰带，top-8 主色里安卓那块 #f2f4f7 就找不到对应（判主色错配）。
   用 fixed 贴在底栏上沿：列表内容再长也不会把这两行挤走（安卓是 weight=1 让位）。 */
.doc-hintbar {
  position: fixed;
  left: 0;
  right: 0;
  bottom: calc(58.6px + env(safe-area-inset-bottom));
  z-index: 29;
  background: #F2F4F7;
  padding: 0 12px;
}
.doc-hintbar .row-sub {
  margin: 0; padding: 0; min-height: 16px; line-height: 16px;
  font-size: 12px; color: #98A2B3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* 单据列表「滚到底自动取下一页」的哨兵：不占高度、不画东西（安卓这一屏没有这个元素，
   多一行会有文案/几何差），只给 docs.js 的滚动监听一个可以落地的块。 */
.auto-more { height: 0; margin: 0; padding: 0; overflow: hidden; }

/* 作业行：代码 + 数量同一行（安卓 workRows 的节点顺序），数量靠右但仍是这一行的第二个节点 */
.lr-top { display: flex; align-items: center; gap: 8px; }
.lr-top .wl-qty { margin-left: auto; min-height: 0; }

/* 作业任务计数行：安卓是「共 N 条待处理」左 + 蓝色胶囊「刷新」右，同一行（activity_work_task.xml）。
   网页原来渲染成整行大按钮，导致 worktask 那条 37px 横带差 73%。
   实测（worktask.dump.xml）：整行 (0,76)-(392.7,140) = **52~116dp、贴导航栏下沿**、
   左右不留内边距（tvCount x12、btnRefresh x292.7~380.7）、胶囊 88×40 居中 → 上下各 12。
   所以这一行不能沿用 .wl-submit-line 的 8/12/10 内边距（会多出 8dp 上边距 + 12dp 左缩进）。 */
.wl-count-row.wl-submit-line { padding: 0 0 12px; border-bottom: 0; }
.wl-count-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
/* 「刷新」蓝色胶囊：安卓 btnRefresh 实测 (292.7,88)-(380.7,128) = **88×40**、圆角 20，
   整行 64dp 高（(0,76)-(392.7,140)）。网页原来 80×25 → 这一行矮 8dp，
   下面的搜索行、任务列表整体上移 8dp（band 5/6 各差 2.5%/1.65%）。 */
.wl-count-refresh {
  flex: 0 0 auto; width: 88px; min-width: 88px; min-height: 0;
  height: 40px; line-height: 34px; padding: 3px 0; border-radius: 12px; font-size: 13px;
  /* MaterialButton（style WmsBtn，cornerRadius 12）默认把形状上下各内缩 3dp：
     40dp 的按钮里**可见蓝块只有 34dp**（实测测差在 y65~67 / y101~103 两条 3dp 边）。
     与 .doc-foot-fn 同一套处理。 */
  background-clip: content-box;
}

/* ---------------------------------------------------------------- 新建盘点表（STT）
   安卓 SttNewActivity：抬头 28dp 单号 + 状态，页签用 act-btn 平铺（活动页签主色），
   范围行 = 「▸ 名称 + 删除」，下级是缩进灰字。 */
.stt-head { padding: 12px 14px 6px; background: #fff; border-bottom: 1px solid var(--gray-1); }
.stt-num { font-size: 12.5px; color: var(--text-2); }
.stt-num-v { font-size: 20px; font-weight: 700; margin-top: 2px; color: var(--text); }
.stt-status { font-size: 12.5px; color: #12B76A; margin-top: 2px; }
.stt-tabs { padding: 8px 12px; gap: 8px; overflow-x: auto; }
.stt-tabs .act-btn { min-width: 84px; }
.stt-tabs .act-btn.on { background: #12B76A; color: #fff; border-color: #12B76A; }
.stt-date { max-width: 160px; height: 34px; }
.kv-go { margin-left: auto; color: var(--blue); font-size: 13px; }
.stt-tap { cursor: pointer; }
.stt-gh { display: flex; align-items: center; gap: 8px; padding: 10px 14px 6px; font-size: 13.5px; color: var(--text-2); }
.stt-gn { font-size: 12.5px; color: var(--text-3); }
.stt-gh .link-btn { margin-left: auto; }
.stt-ir { display: flex; align-items: center; gap: 8px; padding: 6px 14px; border-top: 1px solid var(--gray-1); }
.stt-ir-l { flex: 1; text-align: left; font-size: 13px; color: var(--text); background: none; border: 0; padding: 0; }
.stt-del { color: #F04438; }
.stt-kid { padding: 4px 14px 4px 36px; font-size: 12.5px; color: var(--text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.stt-msg { padding: 8px 14px; font-size: 13px; color: var(--text-2); }
.stt-msg.err { color: #F04438; }
