/* ============================================================================
   purchase-mobile.css —— 采购管理（移动端形态）
   取值来自一段线上 App 采购页的 29 秒录屏（576×1280，逐帧核对）：
     · 顶部分段器「采购 / 库存/寄售」：选中项为通栏蓝底白字，高 64rpx
     · 搜索栏：圆角胶囊 + 放大镜 + 右侧「搜索」蓝字 + 圆形清除按钮
     · 两行筛选 chip：选中项为蓝字蓝描边，未选中灰字灰描边
     · 三个下拉筛选：采购来源 / 订单维度 / 更多筛选（带下拉箭头）
     · 卡片：图片 + 店铺/物流/货号/规格 + 赔付行 + 底部时间与金额 + 操作链接
     · 卡片内容区带一层极浅蓝底（截图里可见的浅蓝块）
     · 右下角蓝色圆形悬浮「+」；底部固定四项 tab（首页/采购/统计/我的）
   桌面端不硬套手机版式：容器限制在 520px 内居中呈现，保持可读性。
   ========================================================================= */

/* ⚠ 版本标记（不是装饰，是排查工具）。
   真机上踩过：服务端 CSS 早就改好了，但用户的 Android WebView 一直用
   缓存的旧文件（连 Cache-Control: no-cache 都不理），我改了三轮，
   他看到的一直是同一版。当时无法从外部确认"浏览器到底加载了哪一版"，
   白折腾了好几轮。

   有了这个标记，真机探针可以直接读
       getComputedStyle(document.documentElement).getPropertyValue('--css-build')
   一眼看出加载的是哪一版。**改了下面任何规则都请把这个数字 +1。** */
:root { --css-build: '38'; }

/* ---------- 主题变量（定义在 :root，不是 .pm） ----------
   ⚠ 必须在 :root 上。采购/库存出售的**弹层是 appendChild(document.body)** 上去的
   （规格弹层 .pm-sheet、选择器、来源选择…），它们**不在 .pm 容器里**。
   变量只定义在 .pm 上的话，弹层取不到 → background: var(--pm-surface) 解析失败
   → 底色退化成透明 → 深色主题下弹层里只看得见一层白（实测就是这个现象）。
   放在 :root 上，页面内与挂在 body 上的浮层用的是同一份值。 */
:root {
  --pm-primary: #1677ff;          /* 录屏里的主蓝（按钮/选中态/金额） */
  --pm-primary-deep: #0b5fd0;
  /* 卡片 / 弹层 / 工具条的**表面色**。单独抽一个变量是因为它必须跟随主题：
     原来这里 47 处全写死 #fff，深色主题下整个采购模块还是白的。
     ⚠ 注意区分 surface 与「主色按钮上的白字」——
     后者是前景色，深色下照样该是白的，绝不能被一起换掉。 */
  --pm-surface: #fff;
  --pm-tint: #f2f7ff;             /* 卡片内容区的极浅蓝底 */
  --pm-line: #eef0f4;
  --pm-text: #1f2329;
  --pm-text-2: #646a73;
  --pm-text-3: #8f959e;
  --pm-bg: #f5f6f8;               /* 页面浅灰底 */
  /* 输入类控件的内凹底（搜索框、规格块…）。比 surface 略深一档 */
  --pm-fill: #f5f6f8;
  --pm-fill-2: #f7f8fa;
  --pm-fill-3: #f2f3f5;
  --pm-border-input: #dee0e3;
  --pm-warn-bg: #fff8e6;          /* 黄色提示横幅 */
  --pm-warn-bd: #ffe1a8;
  --pm-warn-fg: #b7791f;
  --pm-danger-bd: #f5c2c4;
  --pm-danger-bg: #fff8f8;
  /* 状态徽标底色（浅色底 + 同色字） */
  --pm-badge-gray: #f2f3f5;
  --pm-badge-green: #e8f5e9;
  --pm-badge-amber: #fff4e5;
  --pm-badge-blue: #e8f1ff;
  --pm-badge-red: #fdecec;
  /* 步骤条未到达的圆点 / 次要按钮底 */
  --pm-step-idle: #e5e6eb;
}

/* ---------- 深色主题 ----------
   取值与 layout.css 里 --jxc-bg / --jxc-surface 的 dark 覆盖保持一致，
   两个模块在深色下才是同一个观感。
   直接覆盖 :root 上的变量 —— 这样挂在 body 上的弹层也一起跟着翻。 */
:root[data-theme='dark'] {
  --pm-surface: #1a1f2e;
  --pm-bg: #141824;
  --pm-tint: #18212b;
  --pm-line: #2a3140;
  --pm-text: #e8eaed;
  --pm-text-2: #a3a6ad;
  --pm-text-3: #7d828c;
  --pm-fill: #232a3a;
  --pm-fill-2: #1f2634;
  --pm-fill-3: #232a3a;
  --pm-border-input: #3a4356;
  --pm-warn-bg: #2b2416;
  --pm-warn-bd: #4a3c1f;
  --pm-warn-fg: #e0b055;
  --pm-danger-bd: #5c2b2e;
  --pm-danger-bg: #2a1a1c;
  --pm-badge-gray: #232a3a;
  --pm-badge-green: #16301f;
  --pm-badge-amber: #33270f;
  --pm-badge-blue: #16233d;
  --pm-badge-red: #3a1d20;
  --pm-step-idle: #3a4356;
}

.pm {
  background: var(--pm-bg);
  min-height: 100%;
  padding-bottom: 74px;           /* 给底部 tab 让位 */
}

/* 桌面端把手机版式居中限宽，避免卡片被拉得很难看 */
@media (min-width: 769px) {
  .pm { max-width: 520px; margin: 0 auto; box-shadow: 0 0 0 1px var(--pm-line); }
}

/* ---------- 顶部分段器 ---------- */
.pm-seg { display: flex; background: var(--pm-surface); padding: 8px 12px; gap: 0; }
.pm-seg__btn {
  flex: 1 1 0;
  height: 40px;
  font-size: 15px;
  font-weight: 500;
  color: var(--pm-text-2);
  background: transparent;
  border: 0;
  border-radius: 8px;
  cursor: pointer;
}
.pm-seg__btn.is-active { background: var(--pm-primary); color: #fff; font-weight: 600; }

/* ---------- 库存/寄售页签 ----------
   二级分段器比一级分段器轻：一级是「采购 / 库存寄售」这种大模块切换，
   二级只是在一个模块里分两张表，用同一种实心块会看不出层级。
   所以二级用下划线式（文字 + 计数，选中加下划线）。 */
.pm-subseg {
  display: flex; align-items: center; gap: 4px;
  background: var(--pm-surface);
  padding: 8px 12px 0;
  border-bottom: 1px solid var(--pm-line);
}
.pm-subseg__btn {
  position: relative;
  display: inline-flex; align-items: center; gap: 5px;
  padding: 8px 12px 10px;
  border: 0; background: transparent;
  font-size: 14px; color: var(--pm-text-2);
  cursor: pointer;
}
.pm-subseg__btn.is-active { color: var(--pm-primary); font-weight: 600; }
/* 选中下划线：用伪元素而不是 border-bottom —— 后者会把按钮撑高 2px，
   两个按钮的基线就对不齐了 */
.pm-subseg__btn.is-active::after {
  content: ''; position: absolute; left: 12px; right: 12px; bottom: 0;
  height: 2px; border-radius: 2px; background: var(--pm-primary);
}
.pm-subseg__n {
  min-width: 18px; padding: 0 4px;
  font-size: 11px; line-height: 16px; text-align: center;
  border-radius: 9px;
  background: var(--pm-fill);
  color: var(--pm-text-2);
}
.pm-subseg__btn.is-active .pm-subseg__n { background: var(--pm-primary); color: #fff; }

/* 搜索 + 状态 chip + 筛选按钮的一条 */
.pm-stockbar {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 10px 12px;
  background: var(--pm-surface);
}
.pm-stockbar .pm-search__box { flex: 1 1 160px; }
.pm-stockbar__chips { display: flex; gap: 6px; flex-wrap: wrap; }
.pm-stockbar__go { flex: 0 0 auto; }

/* 合计条：件数 / 货值，一眼看到盘子多大 */
.pm-sumbar {
  display: flex; align-items: center; gap: 18px; flex-wrap: wrap;
  padding: 10px 14px;
  background: var(--pm-surface);
  border-bottom: 1px solid var(--pm-line);
}
.pm-sumbar__item { display: flex; align-items: baseline; gap: 6px; }
.pm-sumbar__item span { font-size: 12px; color: var(--pm-text-3); }
.pm-sumbar__item strong { font-size: 15px; color: var(--pm-text); }

/* 页签内的简易翻页 */
.pm-pager {
  display: flex; align-items: center; justify-content: center; gap: 12px;
  padding: 14px 12px 20px;
}
.pm-pager__info { font-size: 13px; color: var(--pm-text-3); }

/* 库存卡 / 寄售卡：与采购卡片同一套骨架，只把「件数」放到底栏左侧 */
.pm-card--stock .pm-card__foot,
.pm-card--consign .pm-card__foot { align-items: baseline; }
.pm-card--stock .pm-card__time,
.pm-card--consign .pm-card__time { font-size: 13px; color: var(--pm-text-2); }

/* ---------- 搜索栏 ---------- */
.pm-search { display: flex; align-items: center; gap: 10px; background: var(--pm-surface); padding: 10px 12px 6px; }
.pm-search__box {
  flex: 1 1 auto;
  display: flex; align-items: center; gap: 8px;
  height: 38px;
  padding: 0 12px;
  background: var(--pm-fill);
  border-radius: 19px;
  min-width: 0;
}
.pm-search__box svg { flex: 0 0 auto; color: var(--pm-text-3); }
.pm-search__input {
  flex: 1 1 auto; min-width: 0;
  border: 0; background: transparent; outline: none;
  font-size: 15px; color: var(--pm-text);
}
.pm-search__input::placeholder { color: var(--pm-text-3); }
.pm-search__clear {
  flex: 0 0 auto; width: 20px; height: 20px;
  border: 0; border-radius: 50%; padding: 0;
  background: var(--pm-step-idle); color: #fff;
  display: grid; place-items: center; cursor: pointer;
}
.pm-search__go { flex: 0 0 auto; border: 0; background: transparent; color: var(--pm-primary); font-size: 15px; font-weight: 500; cursor: pointer; }

/* ---------- 两行筛选 chip ---------- */
.pm-chips { background: var(--pm-surface); padding: 4px 12px 2px; }
.pm-chips__row { display: flex; gap: 8px; overflow-x: auto; padding: 5px 0; scrollbar-width: none; }
.pm-chips__row::-webkit-scrollbar { display: none; }
.pm-chip {
  flex: 0 0 auto;
  height: 30px; padding: 0 14px;
  font-size: 13px;
  border-radius: 15px;
  border: 1px solid var(--pm-border-input);
  background: var(--pm-surface);
  color: var(--pm-text-2);
  cursor: pointer;
  white-space: nowrap;
}
.pm-chip.is-active { border-color: var(--pm-primary); color: var(--pm-primary); font-weight: 500; background: var(--pm-surface); }

/* ---------- 三个下拉筛选 ---------- */
.pm-filters { display: flex; background: var(--pm-surface); border-top: 1px solid var(--pm-line); }
.pm-filters__item {
  flex: 1 1 0;
  height: 44px;
  display: flex; align-items: center; justify-content: center; gap: 4px;
  border: 0; background: transparent;
  font-size: 14px; color: var(--pm-text-2);
  cursor: pointer;
}
.pm-filters__item.is-active { color: var(--pm-primary); font-weight: 500; }
.pm-filters__item svg { transition: transform .2s; }
.pm-filters__item.is-open svg { transform: rotate(180deg); }

/* 下拉面板：从筛选条下方展开 */
.pm-drop { background: var(--pm-surface); border-top: 1px solid var(--pm-line); padding: 10px 12px 14px; }
.pm-drop__grid { display: flex; flex-wrap: wrap; gap: 8px; }
.pm-drop__opt {
  height: 32px; padding: 0 14px; font-size: 13px;
  border: 1px solid var(--pm-border-input); border-radius: 16px; background: var(--pm-surface);
  color: var(--pm-text-2); cursor: pointer;
}
.pm-drop__opt.is-active { border-color: var(--pm-primary); color: var(--pm-primary); background: var(--pm-tint); }

/* ---------- 订单卡片 ---------- */
.pm-list { padding: 8px 12px 4px; display: flex; flex-direction: column; gap: 10px; }
.pm-card {
  background: var(--pm-surface);
  border-radius: 10px;
  overflow: hidden;
  box-shadow: 0 1px 3px rgba(0, 0, 0, .05);
}
/* 订单号行：左侧「平台订单号」小标签 + 号码 + 复制；右侧状态徽标 */
.pm-card__head { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; padding: 10px 12px 4px; }
.pm-card__ordlabel { font-size: 11px; color: var(--pm-text-3); line-height: 1.2; }
.pm-card__ordno { display: flex; align-items: center; gap: 6px; font-size: 15px; font-weight: 600; color: var(--pm-text); word-break: break-all; }
.pm-card__badges { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; flex: 0 0 auto; }

/* 状态徽标：实心淡底 + 同色文字（录屏：已验货=绿、已结算=绿、待收货=橙） */
.pm-status {
  display: inline-flex; align-items: center;
  height: 24px; padding: 0 8px;
  border-radius: 6px;
  font-size: 12px; font-weight: 500;
  white-space: nowrap;
}
.pm-status--green { background: var(--pm-badge-green); color: #2e9e44; }
.pm-status--amber { background: var(--pm-badge-amber); color: #e08b1a; }
/* 说明：--blue / --red 两个修饰类没人用（JS 只发 --green / --amber / --gray），
   已删除。要加新配色时**先确认 JS 里真会发这个类名**再加规则 ——
   写了没人发的类不会报错，只会永远不生效，最难查。 */
.pm-status--gray { background: var(--pm-fill-3); color: var(--pm-text-2); }
.pm-status__row { display: flex; gap: 4px; }

/* 内容块：极浅蓝底，含图片与商品信息。

   ⚠⚠⚠ 这里用 **CSS Grid**，不是 flex —— 这是一次漫长排查的最终结论，
   请不要再"顺手改回 flex"。完整记录如下。

   【现象】手机上采购卡片的文字被压成一个字一行竖排，卡片像散架。
   桌面端同样。真机探针量到：`.pm-card__info` 宽度恒为 0。

   【排查过程】用真实浏览器（CDP）逐条注入候选 CSS 实测，结果：
       基线                           info 0px
       flex: 1 1 auto                 0px
       flex: 1 1 0                    0px
       flex-basis: 60% / 100%         0px
       width: 100% / auto             0px
       min-width: 0（子元素也加了）      0px
       overflow: hidden               0px
       min-width: 200px               200px  ← 只有写死像素下限才有效
       body: flex-wrap: wrap          238px  ← 换行后有效
       body: display: grid            238px  ← 有效
   **flex 侧的一切写法都拿不到剩余空间**（父容器 332px、缩略图 64px，
   明明有 258px 空闲），而 grid 一次就对。

   【为什么 flex 不行】没定位到浏览器的具体算法分支（试了十来种组合都无效）。
   但可以确定：这个 flex 行里 `.pm-card__info` 的**基础尺寸被算成 0**，
   且 flex-grow 的剩余空间分配没有生效 —— 换 wrap、给像素下限都能"绕过"，
   说明问题出在**单行 flex 的尺寸求解**上。
   Grid 没有这个环节：列宽由 `grid-template-columns` 直接确定。

   【走错的路，务必不要重犯】
     ① 以为"宽度不够"→ 加宽卡片（宽度本来就够：352px 放得下 18 个汉字）
     ② 写 `width: 0` 想"把 flex-basis 归零"→ **元素真的变成 0 宽，
        把轻微问题改成了彻底崩坏**
     ③ 改成 `flex: 1 1 0` → 仍然是 0px
   真正的教训：**排版问题不能靠读代码推理，必须用真实浏览器量。**
   本文件里所有"实测"结论都来自 tools/cdp-try.mjs 的输出。

   列定义说明：`64px` 是缩略图（固定），`minmax(0, 1fr)` 是信息列 ——
   用 minmax(0,...) 而不是裸 1fr，是让信息列可以收缩到内容以下
   （否则长货号会把列撑破，与 flex 的 min-width:0 同一个道理）。 */
.pm-card__body {
  display: grid;
  grid-template-columns: 64px minmax(0, 1fr);
  align-items: start;
  gap: 10px;
  margin: 6px 10px 0;
  padding: 10px;
  background: var(--pm-tint);
  border-radius: 8px;
}
.pm-card__thumb {
  position: relative;
  flex: 0 0 64px; width: 64px; height: 64px;
  border-radius: 6px; overflow: hidden; background: var(--pm-surface);
  display: grid; place-items: center;
}
.pm-card__thumb img, .pm-card__thumb svg { width: 100%; height: 100%; object-fit: cover; }
/* 有上传图时是 <img class="pimg">，无图时是 <span class="pimg pimg--ph"> 包着占位插画，
   两种都要在缩略图容器里铺满且不留圆角（圆角由容器裁） */
.pm-card__thumb .pimg,
.pm-good__thumb .pimg,
.pm-specform__thumb .pimg { width: 100%; height: 100%; border-radius: 0; }
.pm-card__thumb .pimg--ph > svg,
.pm-good__thumb .pimg--ph > svg,
.pm-specform__thumb .pimg--ph > svg { width: 100%; height: 100%; border-radius: 0; }
.pm-card__dot {
  position: absolute; left: -4px; top: 26px;
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--pm-primary);
}
/* ⚠⚠ 这里**绝对不能写 width: 0**！真机实测踩过这个坑：
   我一度写成 `flex: 1 1 auto; width: 0; min-width: 0`，理由是
   "把 flex-basis 从 auto 归零，避免基准宽度参与加权收缩"。
   推理听起来对，但实测结果是：

       信息列  0×379px   flex=1 1 auto   basis=auto   min-w=0px
                ↑ 宽度直接变成 0

   即 `basis` 依旧是 `auto`，而 `width: 0` 生效了 —— 元素彻底没有宽度，
   中文于是**一个字一行**竖排下来，整张卡片像散架了一样。
   用户报的"手机上文字一字一行"就是这个原因，而且是我自己引入的。

   正确做法有**两条**，缺一不可（真机实测确认过）：

   ① `flex: 1 1 0` —— 基准必须是**确定值 0**，不能是 `auto`。
      `flex: 1 1 auto` 会让浏览器去算"内容宽度"当基准，而这个计算
      依赖子元素的 min-content；子元素（信息行 / 货号行）默认
      `min-width: auto`，在用户的 Android WebView 上这个链条会塌成 0：
          信息列  w=0  basis=auto  minW=0px    flex=1 1 auto
          货号行  w=0  basis=auto  minW=auto   ← 子元素没归零
      结果是这一列彻底没有宽度、中文逐字换行。
      写成 `flex: 1 1 0` 之后基准是 0，元素直接拿到全部剩余空间，
      不再依赖那套内容宽度计算。

   ② `min-width: 0` —— flex 项默认 `min-width: auto`（= min-content），
      不归零就不肯收缩，长文字会顶出容器。

   ⚠ 顺带记一笔我走过的弯路：中间我试过 `width: 0`，那是**错的** ——
   它让元素真的变成 0 宽（`basis` 仍是 auto，width 直接生效），
   把轻微问题改成了彻底崩坏。要动的是 `flex` 的基准，不是 `width`。 */
/* 文字列。在 grid 里列宽已由 `grid-template-columns` 确定，
   这里不再需要 flex —— 但 `min-width: 0` 要留着：
   grid 项的默认 min-width 同样是 auto，长货号会把列撑破。
   （`.pm-card__info` 同理：它现在也活在 grid 行里。） */
.pm-card__info { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
/* ★★ 这一单买了哪些东西：全部商品的缩略图排一行（多货号的单才出）。
   --------------------------------------------------------------------------
   原来卡片只显示**第一个**商品的图，一张 3 货号的单看上去和单货号的单一样 ——
   不点进详情不知道买了几样。图片条一眼看出"这单是 3 样货"。

   ⚠⚠ 这里踩过两次坑，写清楚免得改回去：
   ① 最初图片条排在 64px 主图**右边** → 第一个商品的图在卡上出现两次
      （左边主图一次 + 图片条第一张一次）。用户反馈「重复了一件商品图片」。
   ② 改成给图片条加 `grid-column: 1 / -1` 想跨整行 —— **没生效**：
      `.pm-card__info` 自己就是 grid 里的一个格子，图片条在它里面时
      跨的是 info 内部那一列；结果图条被挤进 48px 那一列竖排成一串，
      整张卡被撑到 822px（截图里就是三张图竖着堆）。
   → 所以图片条现在是 `.pm-card__body` 的**直接子节点**，用**显式网格定位**：
        单货号：主图 (1,1) ／ 文字 (1,2)          ← 原版式不变
        多货号：图条 (1, 1/-1) ／ 文字 (2, 1/-1) ／ 主图藏掉
     ⚠ 显式定位必须写全：只写一半的话 auto-placement 会去填 (1,1)，
     把主图挤到第 2 行、版式错位。
   ⚠ flex-wrap 必须开：6 张图 + 间距在 320px 窄屏上放不下，
   不开换行会把卡片顶宽、出现横向滚动（项目里踩过同类）。
   ⚠ 每张图 flex: 0 0 auto：不然会被压扁变形（图片不能等比拉伸）。 */
.pm-card__thumbs {
  grid-column: 1 / -1; grid-row: 1;
  display: flex; align-items: center; gap: 6px;
  flex-wrap: wrap; margin-bottom: 2px;
}
/* 多货号：文字挪到第 2 行整宽；主图藏掉（它的内容已经在图条第一张里了） */
.pm-card.is-multi .pm-card__info { grid-column: 1 / -1; grid-row: 2; }
.pm-card.is-multi .pm-card__thumb { display: none; }
/* 单货号：保持原版式 —— 主图第 1 行第 1 列，文字第 1 行第 2 列 */
.pm-card:not(.is-multi) .pm-card__thumb { grid-column: 1; grid-row: 1; }
.pm-card:not(.is-multi) .pm-card__info { grid-column: 2; grid-row: 1; }
.pm-card__thumbmini {
  flex: 0 0 auto; width: 40px; height: 40px;
  border-radius: 6px; overflow: hidden;
  background: var(--pm-tint);
  display: grid; place-items: center;
}
.pm-card__thumbmini img,
.pm-card__thumbmini svg { width: 100%; height: 100%; object-fit: cover; }
/* 占位图在这个尺寸下要压掉内边距，否则图标会比框还大 */
.pm-card__thumbmini .pimg,
.pm-card__thumbmini .pimg--ph > svg { width: 100%; height: 100%; border-radius: 0; }
/* 超过 6 个货号时收口，不把卡片撑长。
   ⚠ 文案用「等 N 个货号」而不是「+N」：卡片下面本来就有一行
   「等 N 个货号」，两处口径一致，用户不用猜 "+3" 是什么意思。 */
.pm-card__thumbmore {
  flex: 0 0 auto; height: 40px; padding: 0 9px;
  display: inline-flex; align-items: center;
  border-radius: 6px; background: var(--pm-fill-3);
  font-size: 12px; color: var(--pm-text-3); white-space: nowrap;
}
.pm-card__row { display: flex; align-items: center; gap: 5px; font-size: 13px; color: var(--pm-text); }
.pm-card__row svg { flex: 0 0 auto; color: var(--pm-text-3); }
.pm-card__row--muted { font-size: 12px; color: var(--pm-text-3); justify-content: flex-end; }
/* 行级小按钮（复制 / 瑕疵）：「复制」两个字，窄屏下同样可能被压成一字一行，
   所以和 .pm-card__op 一样锁住换行、不参与收缩。 */
.pm-card__copy {
  border: 0; background: transparent; color: var(--pm-primary);
  font-size: 12px; padding: 0 2px; cursor: pointer;
  white-space: nowrap;
  flex: 0 0 auto;
}
/* 商品行上的「瑕疵」标记按钮。
   和「复制」同为行级小按钮，但要有区分度：
     · 未标记 = 描边弱色，不抢眼（多数商品没有瑕疵）
     · 已标记 = 实心红底，扫一眼就知道哪件标过了
   不做成纯文字：它紧挨着「复制」，两个都是蓝字会分不清哪个是哪个。
   变量只用项目里真实存在的：边框用 --pm-line，危险色用 --jxc-color-danger。 */
.pm-card__defect {
  border: 1px solid var(--pm-line);
  background: transparent;
  color: var(--pm-text-3);
  font-size: 12px;
  line-height: 1.5;
  padding: 0 6px;
  border-radius: 9px;
  cursor: pointer;
  margin-left: 2px;
  /* 同 .pm-card__op：中文逐字换行会让按钮变成竖着的一列，
     看起来像布局崩了。窄屏上宁可整行换下去。 */
  white-space: nowrap;
  flex: 0 0 auto;
  /* 「瑕疵 📷」比「瑕疵」宽，不锁轴宽的话同行两个按钮会不等宽、看着不齐 */
  text-align: center;
}
.pm-card__defect:hover {
  border-color: var(--jxc-color-danger);
  color: var(--jxc-color-danger);
}
/* 已标记：实心红。深色主题下 --pm-* 会在 :root[data-theme='dark'] 里整体覆盖，
   但 --jxc-color-danger 只有浅色一个值，所以这里显式给深色压暗一档 ——
   否则亮红底 + 白字在深色界面里会发飘。 */
.pm-card__defect.is-marked {
  border-color: transparent;
  background: var(--jxc-color-danger);
  color: #fff;
  font-weight: 500;
}
:root[data-theme='dark'] .pm-card__defect.is-marked { background: #c45656; }

/* 已处理：**不是待办了**，所以不能再是实心红 —— 一屏全是红按钮会看不出
   哪些还需要动手。改成低饱和的绿色描边：能看出"这件有瑕疵"，但不抢视线。
   ⚠ 必须排在 .is-marked 之后：两个类同时存在（已标记 + 已处理），
   靠后出现者胜。（同一份文件里的顺序就是优先级，别调换。） */
.pm-card__defect.is-done {
  border-color: #8ecfa8;
  background: var(--pm-badge-green);
  color: #2f7d4f;
  font-weight: 400;
}
:root[data-theme='dark'] .pm-card__defect.is-done {
  border-color: #2f6b48;
  background: var(--pm-badge-green);
  color: #7fd3a0;
}
.pm-card__defect.is-done:hover { border-color: #2f7d4f; color: #2f7d4f; }
.pm-card__code { display: flex; align-items: center; gap: 4px; font-size: 13px; color: var(--pm-text); flex-wrap: wrap; }
.pm-card__code b { font-weight: 400; color: var(--pm-text-3); }
/* 备注行：与「物流单号」那种系统元信息区分开 —— 备注是用户自己写的、
   需要一眼看到，所以给一条浅色底纹。长备注最多两行，超出省略
   （不能让它把卡片撑爆）。 */
.pm-card__remark {
  align-items: flex-start;
  /* 不写死浅色兜底：--pm-fill 定义在 :root，深色主题有覆盖。
     写成 var(--pm-fill, <浅灰>) 会让深色下露出浅底（smoke-dark 会拦下）。 */
  background: var(--pm-fill);
  border-radius: 6px;
  padding: 5px 8px;
  margin: 2px 0;
}
.pm-card__remark-text {
  min-width: 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  overflow-wrap: anywhere;
  font-size: 12px;
  color: var(--pm-text-2, var(--pm-text));
}

/* 底部：时间 + 金额。

   ⚠⚠ 这两个元素（本行 + 下面的操作行）**是 `.pm-card__body` 的子元素**，
   不是卡片的直接子元素。`.pm-card__body` 改成 grid 之后，它们就成了
   grid 项 —— 于是被塞进第一列（64px 的缩略图列）里，
   实测宽度只有 64px，时间与金额都溢出到卡片外、和别的元素重叠。
   **这是把 body 改成 grid 时引入的新问题。**

   修法：让它们横跨全部列 —— `grid-column: 1 / -1`。

   ⚠ 尺寸账（400px 视口）：卡片 352、foot padding 24 → 可用 328px；
     时间「采购时间：2026-10-05 12:13」约 166px、"¥7,862.00" 约 91px，
     合计 267px，放得下。如果以后文案再变长导致换行，用
     `.pm-card__time{min-width:0;overflow:hidden;text-overflow:ellipsis}`
     截断（但别去掉 nowrap —— 中文不锁就会逐字换行，那是更糟的表现）。 */
.pm-card__foot {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 9px 4px 6px;
}
.pm-card__time {
  font-size: 13px;
  color: var(--pm-text-3);
  white-space: nowrap;      /* 中文没有词边界，不锁住就会逐字换行 */
}
.pm-card__amount {
  font-size: 19px; font-weight: 700; color: var(--pm-primary);
  font-variant-numeric: tabular-nums;
  flex: 0 0 auto;
  white-space: nowrap;
}

/* 卡片操作链接行（去开票 / 登记出售 / 标记入仓 / 登记瑕疵 / 编辑 / 详情）。
   ⚠ 同 .pm-card__foot：它也在 `.pm-card__body` 里，而 body 是 grid，
   所以必须 `grid-column: 1 / -1` 横跨整行 —— 否则会被塞进
   第一列（64px 的缩略图列），实测宽度只有 64px 且与别处重叠。

   ⚠ 宽度账（跨满后 312px，padding 4+4 → 可用 304）：
       去开票 42 + 登记出售 56 + 登记瑕疵 56 + 撤销入仓 56
       + 编辑 54（带边框）+ 详情 28 = 292；gap 16×5 = 80 → 合计 372。
     **超了 68px**，原来的表现是把「详情」推出卡片外（实测溢出）。
     修法：gap 收到 10、字号收到 13px、按钮允许收缩（`flex: 0 1 auto`），
     真放不下时按 flex-wrap 整体换行到第二行，而不是横向溢出。

   ⚠ `white-space: nowrap` 是必需的：中文没有单词边界，
   一旦某个按钮被压到比两个字还窄，浏览器会**逐字换行** ——
   用户看到的就是一列竖着的「去开票」「标记入仓」，像散架了一样。
   nowrap 之后按钮宁可撑开或整体换行到下一行，也不会竖排。 */
.pm-card__ops {
  grid-column: 1 / -1;
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  padding: 0 4px 10px;
  flex-wrap: wrap;
}
.pm-card__op {
  border: 0; background: transparent; color: var(--pm-primary);
  font-size: 13px; cursor: pointer; padding: 2px 0;
  white-space: nowrap;
  /* 允许收缩（不是 0 0 auto）：按钮之间能压一点，
     真放不下时按 flex-wrap 整体换行，而不是把最后一个顶出卡片 */
  flex: 0 1 auto;
  min-width: 0;
}
/* 「编辑」是每条订单最常用的操作，用描边弱化成一个可点的按钮，和纯文字的
   其它操作区分开，一眼能找到（线上卡片也是把编辑放在显眼位置）。 */
.pm-card__op--edit {
  border: 1px solid var(--pm-primary);
  border-radius: 4px;
  padding: 1px 8px;
  font-weight: 500;
}
/* 「领红包」是一次性的待办（领完按钮就消失），要能一眼看见 ——
   用**实心橙**而不是描边：它和「编辑」那种常规操作不是一类东西。
   橙色不是随便挑的：红色已经是「登记瑕疵 / 撤销」那类危险与异常的语义，
   橙色在这套配色里没被占用，又与金额相关（返现的暖色调）。
   ⚠ 深色主题下要压暗一档，否则亮橙底 + 白字在深色界面里发飘
   （与 .pm-card__defect.is-marked 同一个处理）。 */
.pm-card__op--redpacket {
  background: #e8833a;
  border: 1px solid transparent;
  border-radius: 4px;
  padding: 1px 8px;
  color: #fff;
  font-weight: 500;
}
.pm-card__op--redpacket:hover { filter: brightness(1.06); }
:root[data-theme='dark'] .pm-card__op--redpacket { background: #b96a2c; }

/* 编辑态头部：标题 + 系统单号，照着线上「编辑订单」页 */
.pm-edithead { padding: 14px 16px 2px; }
.pm-edithead__title { font-size: 19px; font-weight: 600; color: var(--pm-text); }
.pm-edithead__no {
  display: flex; align-items: center; gap: 6px;
  margin-top: 4px; font-size: 13px; color: var(--pm-text-3);
  font-family: var(--pm-mono, ui-monospace, monospace);
}

/* 危险操作区（删除订单）：放在内容末尾，红字弱化，降低误触概率 */
.pm-danger {
  margin: 18px 16px 8px;
  padding: 14px;
  border: 1px solid var(--pm-danger-bd);
  border-radius: 10px;
  background: var(--pm-danger-bg);
}
.pm-danger__title { font-size: 14px; font-weight: 600; color: #c0393d; }
.pm-danger__hint { margin: 6px 0 12px; font-size: 12.5px; line-height: 1.7; color: #96696b; }
.pm-danger .pm-btn { width: 100%; height: 42px; font-size: 15px; border-color: #f0a9ac; background: var(--pm-surface); }
.pm-danger .pm-btn.is-disabled,
.pm-danger .pm-btn:disabled {
  opacity: .5; cursor: not-allowed;
  background: var(--pm-fill-3); border-color: var(--pm-line); color: var(--pm-text-3);
}

/* ---------- 空态 ---------- */
.pm-empty { padding: 48px 16px; text-align: center; color: var(--pm-text-3); }
.pm-empty__title { font-size: 15px; color: var(--pm-text-2); margin: 12px 0 6px; }
.pm-empty__sub { font-size: 13px; }
/* 空态里的行动入口（「新增商品 · 从商品档案挑选」）。
   做成蓝色小字而不是按钮：它是补一条出路，不该和主操作抢注意力。
   两个入口排一行、用间隔点分开；窄屏放不下时自动换行。 */
.pm-empty__links {
  display: flex; align-items: center; justify-content: center;
  gap: 4px; flex-wrap: wrap; margin-top: 10px;
}
.pm-empty__link {
  border: 0; background: transparent; padding: 4px 2px;
  color: var(--pm-primary); font-size: 13px; cursor: pointer;
  text-decoration: underline; text-underline-offset: 3px;
}
.pm-empty__link:active { opacity: .7; }

/* ---------- 悬浮按钮 ---------- */
.pm-fab {
  position: fixed;
  right: 18px;
  bottom: 84px;
  width: 52px; height: 52px;
  border: 0; border-radius: 50%;
  background: var(--pm-primary);
  color: #fff;
  display: grid; place-items: center;
  box-shadow: 0 4px 14px rgba(22, 119, 255, .4);
  cursor: pointer;
  z-index: 40;
}
@media (min-width: 769px) {
  /* 限宽布局下，把 FAB 贴到限宽容器的右下而不是视口右下 */
  .pm-fab { left: calc(50% + 520px / 2 - 70px); right: auto; bottom: 96px; }
}

/* ---------- 底部 tab ---------- */
.pm-tabbar {
  position: fixed; left: 0; right: 0; bottom: 0;
  height: 58px;
  display: flex;
  background: var(--pm-surface);
  border-top: 1px solid var(--pm-line);
  z-index: 45;
  padding-bottom: env(safe-area-inset-bottom);
}
@media (min-width: 769px) {
  .pm-tabbar { left: 50%; transform: translateX(-50%); width: 520px; }
}
.pm-tabbar__item {
  flex: 1 1 0;
  border: 0; background: transparent;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
  color: var(--pm-text-3); font-size: 11px; cursor: pointer;
}
.pm-tabbar__item.is-active { color: var(--pm-primary); }

/* ---------- 新增采购：步骤条 ---------- */
.pm-steps { display: flex; align-items: center; justify-content: center; gap: 0; padding: 14px 12px 10px; background: var(--pm-surface); }
.pm-step { display: flex; align-items: center; gap: 6px; padding: 0 10px; }
.pm-step__num {
  width: 20px; height: 20px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: 12px; font-weight: 600;
  background: var(--pm-step-idle); color: #fff;
}
.pm-step__text { font-size: 14px; color: var(--pm-text-3); }
.pm-step.is-active .pm-step__num { background: var(--pm-primary); }
.pm-step.is-active .pm-step__text { color: var(--pm-primary); font-weight: 600; }
.pm-step.is-done .pm-step__num { background: var(--pm-primary); }
.pm-step__line { flex: 1 1 auto; height: 1px; background: var(--pm-step-idle); min-width: 24px; }

/* 表单卡片 */
.pm-form { background: var(--pm-surface); margin: 10px 12px; border-radius: 10px; padding: 4px 14px; }
.pm-form__title { font-size: 16px; font-weight: 600; padding: 12px 0 4px; color: var(--pm-text); }
.pm-field {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  min-height: 50px;
  border-bottom: 1px solid var(--pm-line);
}
.pm-field:last-child { border-bottom: 0; }
.pm-field__label { display: flex; align-items: center; gap: 4px; font-size: 15px; color: var(--pm-text-2); flex: 0 0 auto; }
.pm-field__label i {
  width: 15px; height: 15px; border-radius: 50%;
  border: 1px solid var(--pm-step-idle); color: var(--pm-step-idle);
  font-size: 11px; font-style: normal;
  display: grid; place-items: center;
}
.pm-field__ctrl { flex: 1 1 auto; display: flex; align-items: center; justify-content: flex-end; gap: 6px; min-width: 0; }
.pm-field__ctrl input {
  flex: 0 1 auto; min-width: 0; width: 100%;
  border: 0; outline: none; background: transparent;
  font-size: 15px; color: var(--pm-text); text-align: right;
}
.pm-field__ctrl input::placeholder { color: var(--pm-text-3); }
/* 说明：这里原来有 .pm-field__arrow（可点字段右侧的小箭头）。
   现在「采购来源 / 采购店铺」右侧那个箭头是直接 icon('arrow') 出的，
   没有这层 span，规则没人用，删掉（check-css-selectors 会报孤儿）。 */
.pm-field__value { font-size: 15px; color: var(--pm-text); }
.pm-field__value.is-ph { color: var(--pm-text-3); }

/* 底部固定主按钮 */
.pm-footbar {
  position: fixed; left: 0; right: 0; bottom: 0;
  display: flex; gap: 10px;
  padding: 10px 12px calc(10px + env(safe-area-inset-bottom));
  background: var(--pm-surface);
  border-top: 1px solid var(--pm-line);
  z-index: 45;
}
@media (min-width: 769px) { .pm-footbar { left: 50%; transform: translateX(-50%); width: 520px; } }
.pm-btn {
  flex: 1 1 0;
  height: 44px;
  border-radius: 22px;
  border: 1px solid var(--pm-border-input);
  background: var(--pm-surface);
  font-size: 16px; font-weight: 500;
  color: var(--pm-text);
  cursor: pointer;
}
.pm-btn--primary { background: var(--pm-primary); border-color: var(--pm-primary); color: #fff; }
.pm-btn--danger { color: #e5484d; }
.pm-btn--sm { height: 36px; font-size: 14px; border-radius: 18px; flex: 0 0 auto; padding: 0 16px; }

/* ---------- 步骤二：商品搜索与选中 ---------- */
.pm-summary {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 10px 14px; background: var(--pm-surface);
  font-size: 13px; color: var(--pm-text-2);
  border-bottom: 1px solid var(--pm-line);
}
.pm-summary__edit { border: 0; background: transparent; color: var(--pm-primary); font-size: 14px; cursor: pointer; flex: 0 0 auto; }
.pm-goods-search { padding: 12px; background: var(--pm-surface); }
.pm-goods-search__box {
  display: flex; align-items: center; gap: 8px;
  height: 42px; padding: 0 6px 0 12px;
  border: 1px solid var(--pm-primary);
  border-radius: 8px;
  background: var(--pm-surface);
}
.pm-goods-search__box input { flex: 1 1 auto; min-width: 0; border: 0; outline: none; font-size: 15px; }
.pm-goods-search__btn { border: 0; background: transparent; color: var(--pm-primary); font-size: 15px; font-weight: 500; cursor: pointer; padding: 0 6px; }
.pm-goods-count { padding: 4px 14px 8px; font-size: 13px; color: var(--pm-text-2); background: var(--pm-surface); }

/* ============================================================================
   ★★ 采购清单（步骤二，照录屏重做）
   ----------------------------------------------------------------------------
   逐商品一张卡：
     编码 + 删除 │ 商品名 · 规格×数量 │ 商品小计
     │ 规格明细（规格/数量、单价、小计）
     [+ 添加规格]        [修改] [删除]
   价格长在这里 —— 这是真正录了价的地方。
   ========================================================================= */
/* 清单头部：「采购清单」+ 商品小计 + 收起/展开 */
.pm-carthead {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 10px 14px 4px;
}
.pm-carthead__title { font-size: 14px; font-weight: 600; color: var(--pm-text); }
.pm-carthead__right { display: flex; align-items: center; gap: 12px; }
.pm-carthead__total { display: flex; align-items: baseline; gap: 4px; font-size: 12px; color: var(--pm-text-3); }
/* ⚠ nowrap 不能省：金额（最长 ¥12,345.00）被压窄会换行，
   把清单头部撑成两行 —— 头部一挤，下面的卡跟着往下跑。 */
.pm-carthead__total-v {
  font-size: 15px; color: var(--pm-primary);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.pm-carthead__toggle {
  border: 0; background: transparent; padding: 2px 0;
  color: var(--pm-text-3); font-size: 12px; cursor: pointer;
  white-space: nowrap; flex: 0 0 auto;
}
.pm-cartlist { display: flex; flex-direction: column; gap: 8px; padding: 0 12px 8px; }

.pm-cartcard {
  background: var(--pm-surface); border-radius: 10px;
  box-shadow: 0 0 0 1px var(--pm-line);
  overflow: hidden;
}
.pm-cartcard__head {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 9px 12px 0;
}
/* 编码可能很长（912631801SF-3），要能收缩 + 省略，不能把「删除」挤走 */
.pm-cartcard__code {
  font-size: 13px; color: var(--pm-text-2); min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pm-cartcard__del {
  border: 0; background: transparent; padding: 2px 0;
  color: #e5484d; font-size: 13px; cursor: pointer;
  white-space: nowrap; flex: 0 0 auto;
}
/* ★★ 清单卡的标题行：左「图 + 名称」，右「商品小计」。
   --------------------------------------------------------------------------
   为什么要有图：这张卡是"这单买了什么"的最终确认界面。
   光看货号（CO3515-708）认不出是哪件货，名称也是纯文本 ——
   加错货号时一眼看不出来；有图就能立刻发现"这不是我要的那双鞋"。
   ⚠ 图片必须 flex: 0 0 auto：不锁的话右侧长名称会把它挤扁
   （中文没有词边界，图片被压会变形）。
   ⚠ 名称那一列要 min-width: 0，否则长名称会把整行撑出容器、出现横向滚动
   （flex 子项默认 min-width:auto，不会自己收缩）。 */
.pm-cartcard__title {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 12px 0;
}
.pm-cartcard__thumb {
  flex: 0 0 48px; width: 48px; height: 48px;
  border-radius: 6px; overflow: hidden;
  background: var(--pm-tint); display: grid; place-items: center;
}
.pm-cartcard__thumb svg { width: 100%; height: 100%; }
.pm-cartcard__main { flex: 1 1 auto; min-width: 0; }
.pm-cartcard__name { font-size: 15px; font-weight: 500; color: var(--pm-text); }
.pm-cartcard__meta { font-size: 12px; color: var(--pm-text-3); margin-top: 2px; }
/* 商品小计：标题行右侧，主色加粗 —— 录屏里就是这个位置。
   ⚠ 独占一行（标题行只放图 + 名称），金额锁 nowrap 不参与收缩。 */
.pm-cartcard__subtotal {
  display: flex; align-items: baseline; justify-content: flex-end; gap: 6px;
  padding: 4px 12px 0;
}
.pm-cartcard__subtotal-k { font-size: 12px; color: var(--pm-text-3); }
.pm-cartcard__subtotal-v {
  font-size: 15px; color: var(--pm-primary);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}

/* 规格明细表。
   ⚠ 不能用 <table>：窄屏上中文字被压窄会逐字竖排（项目里踩过）。
   用 grid，三列 —— 规格列 minmax(0,1fr) 自己收缩，价格两列固定不缩。 */
.pm-cartcard__body { margin: 8px 12px 0; }
.pm-cartcard__detailtitle {
  font-size: 12px; font-weight: 600; color: var(--pm-primary);
  padding-bottom: 6px;
}
.pm-cartline {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 72px 78px;
  align-items: center; gap: 4px;
  padding: 7px 8px; border-radius: 6px;
  background: var(--pm-tint);
  font-size: 13px; color: var(--pm-text);
}
.pm-cartline + .pm-cartline { margin-top: 4px; }
/* 表头行：不吃背景，只当列名 */
.pm-cartline--head {
  background: transparent; padding: 2px 8px 4px;
  font-size: 12px; color: var(--pm-text-3);
}
.pm-cartline--head + .pm-cartline { margin-top: 0; }
.pm-cartline__spec { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }
.pm-cartline__unit { text-align: right; white-space: nowrap; color: var(--pm-text-2); font-variant-numeric: tabular-nums; }
.pm-cartline__sub { text-align: right; white-space: nowrap; color: var(--pm-primary); font-variant-numeric: tabular-nums; font-weight: 500; }
.pm-cartline--head .pm-cartline__unit,
.pm-cartline--head .pm-cartline__sub { color: var(--pm-text-3); font-weight: 400; }

.pm-cartcard__ops {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 9px 0 11px;
}
.pm-cartcard__ops-right { display: flex; align-items: center; gap: 8px; }
/* ⚠ 每个按钮都锁 nowrap 且不参与收缩：中文没有词边界，
   被压窄了会"一个字一行"竖起来（这个坑在卡片操作行上踩过）。 */
.pm-cartcard__op {
  border: 1px solid var(--pm-border-input); background: var(--pm-surface);
  border-radius: 15px; height: 30px; padding: 0 12px;
  font-size: 13px; color: var(--pm-text); cursor: pointer;
  white-space: nowrap; flex: 0 0 auto;
}
.pm-cartcard__op--edit { color: var(--pm-primary); border-color: var(--pm-primary); }
.pm-cartcard__op--del { color: #e5484d; border-color: #e5484d; }

/* 内联编辑器：在清单下面就地展开（不是弹窗） */
.pm-inlineeditor:empty { display: none; }

/* 搜索区：独占整宽。 */
.pm-pick { display: flex; flex-direction: column; }

/* 订单概要卡只在桌面上出现（规则见文件末尾的桌面形态）。
   基础样式里先藏掉：手机上第 1 步字段本来就少，再加一张概要卡纯属占地方。 */
.pm-ordsum { display: none; }

.pm-goods { display: flex; flex-direction: column; gap: 8px; padding: 8px 12px; }
.pm-good {
  display: flex; align-items: center; gap: 10px;
  background: var(--pm-surface); border-radius: 10px; padding: 10px;
  cursor: pointer; text-align: left; border: 0; width: 100%;
}
.pm-good__thumb { flex: 0 0 56px; width: 56px; height: 56px; border-radius: 6px; overflow: hidden; background: var(--pm-tint); display: grid; place-items: center; }
.pm-good__thumb svg { width: 100%; height: 100%; }
.pm-good__main { flex: 1 1 auto; min-width: 0; }
.pm-good__name { font-size: 15px; font-weight: 500; color: var(--pm-text); margin-bottom: 2px; }
.pm-good__code { font-size: 13px; color: var(--pm-text-3); margin-bottom: 6px; }
.pm-good__specs { display: flex; gap: 6px; flex-wrap: wrap; }
/* 清单每行的「删除」按钮样式随采购清单一起删掉了（那一块整个不要了）——
   留着孤立选择器会被 check-css-selectors 拦下。 */
.pm-spec {
  min-width: 34px; height: 26px; padding: 0 8px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--pm-tint); color: var(--pm-text-2);
  font-size: 13px; border-radius: 4px;
}
.pm-spec--more { background: transparent; color: var(--pm-text-3); padding: 0 2px; }
/* 说明：这里原来有商品卡上的价格样式（.pm-good__price 等三个类）。
   照录屏重做后价格回到**采购清单卡**上（.pm-cartcard__subtotal 那一套），
   搜索结果不再显示价格，那几个类没有宿主了已一并删除。 */
.pm-good__arrow { color: var(--pm-step-idle); flex: 0 0 auto; }

/* ---------- 填写采购规格 ---------- */
.pm-specform { background: var(--pm-surface); margin: 10px 12px; border-radius: 10px; padding: 12px 14px; }
/* ★★ 内联形态（照录屏）：在清单下面就地展开，不盖浮层。
   加一圈描边把它和上下的清单卡 / 搜索区分开 ——
   不加的话它就是一张白卡，用户看不出"表单弹出来了"。 */
.pm-specform--inline {
  margin: 0 12px 10px;
  box-shadow: 0 0 0 1px var(--pm-primary);
}
.pm-specform__head { display: flex; align-items: center; justify-content: space-between; }
.pm-specform__title { font-size: 16px; font-weight: 600; }
.pm-specform__cancel { border: 0; background: transparent; color: var(--pm-primary); font-size: 14px; cursor: pointer; }
.pm-specform__goods { display: flex; align-items: center; gap: 10px; padding: 12px 0; }
.pm-specform__thumb { flex: 0 0 52px; width: 52px; height: 52px; border-radius: 6px; overflow: hidden; background: var(--pm-tint); display: grid; place-items: center; }
.pm-specform__thumb svg { width: 100%; height: 100%; }
/* 表单底部的合计行（「合计 ¥xxx」） */
.pm-specform__sumrow {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  border-top: 1px solid var(--pm-line); margin-top: 10px; padding-top: 10px;
  font-size: 13px; color: var(--pm-text-3);
}
.pm-specform__total { font-size: 17px; color: var(--pm-primary); font-variant-numeric: tabular-nums; white-space: nowrap; }
/* 内联表单底部按键行（取消 / 确认添加）。
   ⚠ .pm-btn 基础规则是 flex:1 1 0，两个按钮会平分整宽 ——
   在表单里这样太宽，收成右侧两个常规按钮。 */
.pm-specform__foot { display: flex; justify-content: flex-end; gap: 10px; margin-top: 10px; }
.pm-specform__foot .pm-btn { flex: 0 0 auto; height: 38px; padding: 0 18px; font-size: 14px; }
.pm-specblock { border-top: 1px solid var(--pm-line); padding-top: 10px; margin-top: 6px; }
.pm-specblock__head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.pm-specblock__label { font-size: 14px; color: var(--pm-text-2); }
.pm-specblock__hint { font-size: 12px; color: var(--pm-text-3); margin-top: 2px; }
.pm-specbox { margin-top: 10px; background: var(--pm-fill-2); border-radius: 8px; padding: 10px 12px; }
.pm-specbox__title { font-size: 14px; color: var(--pm-text-2); margin-bottom: 8px; }
/* 「库中已有规格（点击选用）」这行提示 —— 录屏里 chip 上方就有一句 */
.pm-specbox__hint { font-size: 12px; color: var(--pm-text-3); margin-bottom: 6px; }
.pm-specbox__chips { margin-bottom: 4px; }
/* ⚠ .pm-spec（规格 chip）在搜索结果卡里是 inline-flex 加 min-width，
   这里借用同一套外观，所以不重定义 —— 只保证容器允许换行。 */
.pm-specbox__row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 0; }
.pm-specbox__row label { font-size: 15px; color: var(--pm-text-2); flex: 0 0 auto; }
.pm-specbox__row input {
  flex: 0 1 130px; text-align: right;
  border: 0; outline: none; background: transparent;
  font-size: 15px; color: var(--pm-text);
}
.pm-specbox__row.is-total { border-top: 1px solid var(--pm-step-idle); margin-top: 4px; padding-top: 10px; }
.pm-specbox__row.is-total b { font-size: 16px; color: var(--pm-text); }
.pm-addspec {
  width: 100%; margin-top: 10px; height: 42px;
  border: 1px dashed var(--pm-primary);
  border-radius: 8px;
  background: var(--pm-badge-blue); color: var(--pm-primary);
  font-size: 15px; cursor: pointer;
}
/* 页脚主操作里的件数：跟在「确认并完成」后面，字号小一档不抢标题 */
.pm-footbar__count { font-size: 13px; color: var(--pm-text-3); white-space: nowrap; flex: 0 0 auto; }

/* ---------- 订单详情 ---------- */
.pm-detail { padding-bottom: 74px; }
.pm-detail__head { background: var(--pm-surface); padding: 12px 14px; }
.pm-detail__ordrow { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.pm-detail__ordlabel { font-size: 12px; color: var(--pm-text-3); }
.pm-detail__ordno { font-size: 15px; font-weight: 600; display: flex; align-items: center; gap: 6px; word-break: break-all; }
.pm-detail__tabs { display: flex; gap: 8px; padding: 0 14px 12px; background: var(--pm-surface); }
.pm-detail__tab {
  flex: 1 1 0; height: 40px; border: 0; border-radius: 6px;
  background: transparent; color: var(--pm-text-2); font-size: 15px; cursor: pointer;
}
.pm-detail__tab.is-active { background: var(--pm-primary); color: #fff; font-weight: 600; }

.pm-banner {
  display: flex; align-items: center; gap: 8px;
  margin: 10px 12px;
  padding: 12px 14px;
  background: var(--pm-warn-bg);
  border: 1px solid var(--pm-warn-bd);
  border-radius: 8px;
  color: var(--pm-warn-fg);
  font-size: 14px;
}
.pm-banner svg { flex: 0 0 auto; color: #faad14; }

.pm-section { background: var(--pm-surface); margin: 10px 12px; border-radius: 10px; padding: 12px 14px; }
.pm-section__head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.pm-section__title { font-size: 16px; font-weight: 600; color: var(--pm-text); }
.pm-section__title span { font-size: 13px; font-weight: 400; color: var(--pm-text-3); margin-left: 4px; }
/* 说明：这里原来有 .pm-section__toggle（折叠开关）。
   第 2 步的折叠开关现在是 .pm-carthead__toggle，这个没人用了，删掉。 */
.pm-section__link { border: 0; background: transparent; color: var(--pm-primary); font-size: 14px; cursor: pointer; }

/* ⚠ 同 .pm-card__body：用 **grid 而不是 flex** —— 理由见那里的完整实测记录
   （那个 flex 行里信息列的基础尺寸被算成 0，flex 侧一切写法都拿不到剩余空间）。
   这里同样是「固定宽的缩略图 + 可伸缩的文字列」结构，所以一并改掉。

   第一列用 `auto` 而不是 `64px`：这一行有两种形态 ——
   瑕疵记录带一张 64px 的照片，普通商品行没有图。auto 会跟着内容走
   （没图时自然收成 0），不用为两种形态写两套规则。
   注：缩略图自己还有 `flex: 0 0 auto`，在 grid 里不生效，留着无害。 */
.pm-detail__good {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 10px;
  margin-top: 10px;
  padding: 10px;
  background: var(--pm-tint);
  border-radius: 8px;
}
/* 瑕疵记录里的那一条：多一张缩略图，所以顶部对齐而不是垂直居中 ——
   居中会让文字相对图片浮在中间，读起来是歪的。 */
.pm-detail__good--defect { align-items: flex-start; }

/* 瑕疵照片缩略图。64px 见方：够认出是哪只鞋的哪个部位，
   又不至于把一条记录撑得很高（一单可能有好几条瑕疵）。 */
.pm-defect__photo {
  flex: 0 0 auto;
  width: 64px;
  height: 64px;
  object-fit: cover;
  border-radius: 6px;
  border: 1px solid var(--pm-line);
  cursor: zoom-in;
  background: var(--pm-fill-2);
}
.pm-defect__nophoto { font-size: 12px; color: var(--pm-warn-fg); }
/* 点开看大图：图本身可能只有 256px（上传时压过），所以不要拉满宽，
   否则会糊成一片。max-width 兜住大屏。 */
.pm-defect__viewer { display: flex; justify-content: center; }
.pm-defect__viewer img {
  max-width: 100%;
  max-height: 60vh;
  border-radius: 8px;
  border: 1px solid var(--pm-line);
}
/* 文字列。在 grid 里列宽已经确定，这里不再需要 flex ——
   但 `min-width: 0` 要留着（grid 项的默认 min-width 也是 auto，
   长货号会把列撑破）。 */
.pm-detail__goodinfo { min-width: 0; font-size: 13px; color: var(--pm-text-2); display: flex; flex-direction: column; gap: 3px; }
.pm-detail__goodname { font-size: 15px; font-weight: 500; color: var(--pm-text); }
.pm-detail__goodsub { display: flex; align-items: center; gap: 14px; margin-top: 2px; }
.pm-detail__goodsub b { color: var(--pm-primary); font-weight: 600; }

/* 三列信息栅格 */
.pm-grid3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 10px; }
.pm-grid3__label { font-size: 12px; color: var(--pm-text-3); }
.pm-grid3__value { font-size: 14px; color: var(--pm-text); margin-top: 2px; word-break: break-all; }
.pm-kv { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 0; border-top: 1px solid var(--pm-line); margin-top: 10px; }
.pm-kv__label { font-size: 13px; color: var(--pm-text-3); }
.pm-kv__value { font-size: 14px; color: var(--pm-text); }
.pm-kv__value--total { font-size: 17px; font-weight: 700; color: var(--pm-primary); }
/* 详情页的备注：.pm-kv 默认是「标签左、值右」的居中一行，
   长备注会被挤成一条。备注改成上下列、左对齐、可换行。 */
.pm-kv--remark { flex-direction: column; align-items: stretch; gap: 4px; }
.pm-remark {
  padding: 8px 10px;
  background: var(--pm-fill);
  border-radius: 6px;
  font-size: 13px;
  line-height: 1.5;
  overflow-wrap: anywhere;
  white-space: pre-wrap;
}

/* ---------- 入仓时选的收货仓 ----------
   卡片上只挂一个小标签（不是主要信息），详情页才铺开地址卡。
   用主色文字把它和「物流单号」那种系统元信息区分开：
   这是用户自己做的决定，扫列表时值得一眼看到。 */
.pm-card__wh { align-items: center; }
.pm-card__wh-name {
  padding: 1px 7px;
  font-size: 12px;
  border-radius: 4px;
  background: var(--pm-fill);
  color: var(--pm-primary);
  font-weight: 500;
}

/* 入仓弹窗：这批货的摘要 + 仓选择器 */
.stock-sum {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 12px;
  border-radius: var(--jxc-radius-sm, 6px);
  background: var(--jxc-fill-light);
  font-size: 13px;
  color: var(--jxc-text-regular);
}
.stock-sum svg { flex: 0 0 auto; color: var(--jxc-text-placeholder); }
.wh-picker { display: flex; flex-direction: column; gap: 10px; align-items: stretch; }
.wh-picker > .input { width: 100%; }

/* 订单节点 */
.pm-node { display: flex; gap: 10px; margin-top: 10px; }
.pm-node__dot { flex: 0 0 8px; width: 8px; height: 8px; border-radius: 50%; background: var(--pm-primary); margin-top: 6px; }
.pm-node__body { font-size: 14px; color: var(--pm-text); }
.pm-node__time { font-size: 12px; color: var(--pm-text-3); margin-top: 2px; }

/* 详情底部操作栏（更多 / 上报取件码 / 拒收 / 签收） */
.pm-actionbar {
  position: fixed; left: 0; right: 0; bottom: 0;
  display: flex; gap: 8px;
  padding: 10px 12px calc(10px + env(safe-area-inset-bottom));
  background: var(--pm-surface); border-top: 1px solid var(--pm-line);
  z-index: 45;
}
@media (min-width: 769px) { .pm-actionbar { left: 50%; transform: translateX(-50%); width: 520px; } }
.pm-actionbar .pm-btn { height: 42px; font-size: 15px; }

/* ---------- 底部来源选择面板（半屏） ---------- */
.pm-sheet-mask { position: fixed; inset: 0; background: rgba(0, 0, 0, .45); z-index: 2200; display: flex; align-items: flex-end; }
@media (min-width: 769px) { .pm-sheet-mask { align-items: center; justify-content: center; } }
.pm-sheet {
  width: 100%; max-height: 78vh;
  /* dvh：移动端浏览器地址栏收放时 vh 不跟着变，会导致底栏被地址栏遮住 */
  max-height: 78dvh;
  background: var(--pm-surface);
  border-radius: 14px 14px 0 0;
  display: flex; flex-direction: column;
  /* 整个弹层内不允许出现第二层滚动，滚动只发生在 .pm-sheet__body */
  overflow: hidden;
  animation: pm-sheet-in .22s var(--jxc-ease);
}
@media (min-width: 769px) { .pm-sheet { width: 520px; border-radius: 14px; max-height: 80vh; max-height: 80dvh; } }
@keyframes pm-sheet-in { from { transform: translateY(24px); opacity: .6; } to { transform: none; opacity: 1; } }
.pm-sheet__head { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px 10px; }
.pm-sheet__title { font-size: 17px; font-weight: 600; }
.pm-sheet__cancel { border: 0; background: transparent; color: var(--pm-text-2); font-size: 15px; cursor: pointer; }
.pm-sheet__search { padding: 0 16px 10px; }
.pm-sheet__search input {
  width: 100%; height: 38px; padding: 0 12px;
  border: 0; border-radius: 19px; background: var(--pm-fill);
  font-size: 15px; outline: none;
}
/* 滚动区：min-height:0 是必须的。
   flex 纵向容器的子项默认 min-height:auto，不会收缩到内容高度以下，
   于是内容一高就把兄弟节点（固定底栏）顶出可视区，而且自己不出现滚动条 ——
   表现为「加了规格却滑不到、看不到」。设为 0 才允许它收缩并内部滚动。 */
.pm-sheet__body { flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 0 16px 12px; }
.pm-sheet__group { display: flex; align-items: center; justify-content: space-between; padding: 10px 0 6px; }
.pm-sheet__groupname { font-size: 15px; font-weight: 600; }
.pm-sheet__groupcount { font-size: 13px; color: var(--pm-text-3); }
.pm-sheet__grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.pm-sheet__opt {
  height: 40px; border: 1px solid var(--pm-step-idle); border-radius: 6px;
  background: var(--pm-fill-2); color: var(--pm-text); font-size: 15px; cursor: pointer;
}
.pm-sheet__opt.is-active { border-color: var(--pm-primary); color: var(--pm-primary); background: var(--pm-tint); font-weight: 500; }
/* 底栏固定在弹层下沿：flex:0 0 auto 必须显式写。
   漏了它，内容变高时底栏会被压缩甚至挤出可视区（与滚动区同一类 flex 陷阱）。 */
.pm-sheet__foot {
  flex: 0 0 auto;
  display: flex; gap: 10px;
  border-top: 1px solid var(--pm-line);
  background: var(--pm-surface);
  padding: 12px 16px calc(12px + env(safe-area-inset-bottom));
}

/* 弹层底部固定操作栏：合计 + 按钮组始终可见，不必滚动表单去找确认按钮。
   （之前确认按钮跟在表单末尾，手机屏上它落在屏幕外，够不着） */
.pm-sheet__footbar {
  flex: 0 0 auto;
  border-top: 1px solid var(--pm-line);
  background: var(--pm-surface);
  padding: 10px 14px calc(10px + env(safe-area-inset-bottom));
  display: flex;
  flex-direction: column;
  gap: 8px;
}
/* 说明：这里原来有 .pm-sheet__sumrow（弹窗底栏的「合计 ¥xxx」一行）。
   照录屏把规格表单改成内联之后，合计挪进了表单内部
   （.pm-specform__sumrow），这个没人用了，删掉。 */
.pm-sheet__footbtns { display: flex; gap: 8px; }
.pm-sheet__footbtns .pm-btn { flex: 1 1 0; height: 42px; font-size: 15px; }
/* 三个按钮时主按钮给多一点宽度，避免中文文案被挤断行 */
.pm-sheet__footbtns .pm-btn--primary { flex: 1.3 1 0; }

/* ============================================================================
   采购账号管理（/app/purchase/accounts）
   手机形态照着线上 App：顶部「筛选平台」一行 + 通栏「新增账号」+ 账号卡片
   （标题=账号名 / 副标题=平台 / 一行三个按钮：设为默认 · 编辑 · 删除）。
   桌面端不硬套这个版式：容器限宽居中、卡片排成两列，见文件末尾的媒体查询。
   ========================================================================= */
.pm-accpage { padding-bottom: 24px; }

/* 顶部筛选 + 新增：整块是白卡片，与下方账号卡片拉开层次 */
.pm-accfilter {
  background: var(--pm-surface);
  border-radius: 12px;
  padding: 4px 0 14px;
  margin-bottom: 12px;
}
.pm-accfilter__btn {
  display: flex; align-items: center; gap: 8px;
  width: 100%; border: 0; background: transparent;
  padding: 14px 16px; cursor: pointer;
  border-bottom: 1px solid var(--pm-line);
  font-size: 15px; color: var(--pm-text);
}
.pm-accfilter__label { flex: 0 0 auto; }
.pm-accfilter__value { flex: 1 1 auto; text-align: right; color: var(--pm-text-2); font-size: 14px; }
.pm-accfilter__add { display: block; width: calc(100% - 32px); margin: 14px 16px 0; height: 46px; font-size: 16px; }

/* 账号卡片 */
.pm-acclist { display: flex; flex-direction: column; gap: 12px; }
.pm-acc {
  background: var(--pm-surface);
  border-radius: 12px;
  padding: 16px;
  border: 1px solid transparent;
}
/* 默认账号给一条主色左边框 + 淡底，扫一眼就知道这平台默认走哪个号 */
.pm-acc.is-default { border-color: var(--pm-primary); box-shadow: 0 0 0 1px var(--pm-primary) inset; }
.pm-acc.is-off { opacity: .62; }
.pm-acc__head { display: flex; flex-direction: column; gap: 6px; }
.pm-acc__name {
  display: flex; align-items: center; gap: 8px;
  font-size: 18px; font-weight: 600; color: var(--pm-text);
}
.pm-acc__flag {
  font-size: 11px; font-weight: 500; line-height: 1;
  padding: 4px 7px; border-radius: 4px;
  background: var(--pm-primary); color: #fff;
}
.pm-acc__flag--off { background: var(--pm-step-idle); }
.pm-acc__platform { font-size: 14px; color: var(--pm-text-3); }
.pm-acc__meta { margin-top: 4px; font-size: 13px; color: var(--pm-text-3); }
.pm-acc__ops { display: flex; gap: 10px; margin-top: 14px; }
.pm-acc__ops .pm-btn { flex: 1 1 0; height: 44px; font-size: 15px; border-radius: 22px; }
.pm-acc__ops .pm-btn--danger { color: #e5484d; border-color: #f0a9ac; }
.pm-acc__ops .pm-btn.is-disabled,
.pm-acc__ops .pm-btn:disabled {
  opacity: .55; cursor: not-allowed;
  background: var(--pm-fill-3); border-color: var(--pm-line); color: var(--pm-text-3);
}

.pm-btn--sm { height: 36px; padding: 0 14px; font-size: 14px; }

/* ---------- 采购管理列表：桌面形态 ----------
   手机版式是「520px 单列 + 底部 tab + 悬浮按钮」。桌面上照搬会很浪费：
   一屏只看得到两三张卡，而且底部 tab 与左侧导航重复。
   桌面改成：容器放宽到 1200px、筛选区合成一条工具条、订单卡片排成网格、
   底部 tab 收成一条窄条（保留「当前在业务台」的语义，不占大块版面）。 */
@media (min-width: 769px) {
  .pm.pm-listpage {
    max-width: 1200px;
    box-shadow: none;
    background: transparent;
    padding-bottom: 96px;          /* 给底部 tab 让位 */
  }

  /* 筛选工具条：搜索 / 两行 chip / 三个下拉 归到一张圆角卡里，
     内部去掉各自的整块白底，避免「卡里套卡」的割裂感 */
  .pm-listpage .pm-toolbar {
    display: flex; flex-direction: column;
    background: var(--pm-surface); border-radius: 10px; padding: 4px 0 0;
  }
  .pm-listpage .pm-search { padding: 12px 16px 8px; }
  .pm-listpage .pm-search__box { flex: 0 1 460px; height: 40px; }
  .pm-listpage .pm-search__go { margin-left: 4px; }
  .pm-listpage .pm-chips { background: transparent; padding: 2px 16px 6px; }
  .pm-listpage .pm-chips__row { overflow: visible; }
  .pm-listpage .pm-filters { border-top: 1px solid var(--pm-line); }
  .pm-listpage .pm-drop { border-radius: 0 0 10px 10px; }

  /* 订单卡片：网格排布。minmax(0,1fr) 防止内容把列撑破。 */
  .pm-listpage .pm-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; padding: 14px 0 0; }
  /* 卡片内部留白略放大，桌面鼠标点击目标更舒服 */
  .pm-listpage .pm-card { border: 1px solid var(--pm-line); box-shadow: none; }
  .pm-listpage .pm-list .pm-empty { grid-column: 1 / -1; }

  /* 底部 tab：桌面上只当「面包屑」用，收成贴底的一条窄条 */
  .pm-listpage .pm-tabbar {
    left: 0; right: 0; transform: none; width: auto;
    height: 44px;
    justify-content: center;
    gap: 8px;
  }
  .pm-listpage .pm-tabbar__item { flex: 0 0 auto; flex-direction: row; gap: 6px; padding: 0 16px; font-size: 13px; }
  .pm-listpage .pm-tabbar__item svg { width: 16px; height: 16px; }

  /* 悬浮新增按钮贴到放宽后的容器右下角 */
  .pm-listpage .pm-fab { left: auto; right: 24px; bottom: 68px; }
}
@media (min-width: 1400px) {
  .pm-listpage .pm-list { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}


/* ---------- 采购账号管理：桌面形态
   不把手机版式硬拉宽（520px 的竖排卡片在桌面上很浪费），改成：
   容器放宽、筛选做成一条工具条（按钮靠右）、卡片两列网格。
   .pm 的基础规则把它限宽在 520px，这里必须显式覆盖。 */
@media (min-width: 769px) {
  .pm.pm-accpage { max-width: 1080px; box-shadow: none; padding-bottom: 8px; background: transparent; }
  .pm-accpage .pm-accfilter {
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px; padding: 12px 16px; margin-bottom: 16px;
  }
  .pm-accfilter__btn { width: auto; min-width: 320px; border-bottom: 0; padding: 6px 0; }
  .pm-accfilter__value { text-align: left; }
  .pm-accfilter__add { width: auto; margin: 0; min-width: 132px; height: 40px; font-size: 15px; }

  .pm-acclist { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
  .pm-acc { padding: 18px 20px; }
  .pm-acc__name { font-size: 17px; }
  /* 桌面上按钮不需要撑满，右对齐更像操作栏 */
  .pm-acc__ops { justify-content: flex-end; }
  .pm-acc__ops .pm-btn { flex: 0 0 auto; min-width: 96px; height: 36px; border-radius: 6px; font-size: 14px; }
}
@media (min-width: 1280px) {
  .pm-acclist { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* ============================================================================
   批量管理（勾选订单 → 删除 / 保留）
   入口是筛选条最右的「管理」开关。勾选态下：
     · 卡片左侧出现勾选框，点卡片本身也是切换勾选（不进详情）
     · 卡片上的单条操作行整行隐藏（批量时点错「签收 / 退货」代价太大）
     · 底部浮出批量操作栏，悬浮新增按钮隐藏
   ========================================================================= */
.pm-filters__item--manage { flex: 0 0 auto; padding: 0 16px; font-weight: 500; }
.pm-filters__item--manage.is-active { color: var(--pm-primary); }

.pm-card.is-managing { position: relative; padding-left: 34px; }
.pm-card.is-checked { border: 1px solid var(--pm-primary); box-shadow: 0 0 0 1px var(--pm-primary) inset; }
/* is-locked = 一个批量动作都用不了；is-nodelete = 不能删但仍可拒收/撤销入仓。
   后者不该变灰 —— 它照样能勾选、能处理，只是删除这一项不适用。 */
.pm-card.is-locked { opacity: .62; }
.pm-card.is-nodelete .pm-card__lockhint { border-color: var(--pm-warn-bd); }
.pm-card__check {
  position: absolute; left: 10px; top: 50%;
  transform: translateY(-50%);
  z-index: 2;
}
.pm-checkbox {
  display: grid; place-items: center;
  width: 22px; height: 22px;
  border: 1.5px solid var(--pm-step-idle); border-radius: 50%;
  background: var(--pm-surface); color: var(--pm-surface);
  cursor: pointer;
}
.pm-checkbox.is-on { background: var(--pm-primary); border-color: var(--pm-primary); }
.pm-checkbox.is-locked { border-color: var(--pm-border-input); background: var(--pm-fill-3); cursor: not-allowed; }

.pm-card__lockhint {
  margin: 6px 12px 0; padding: 5px 8px;
  font-size: 12px; color: var(--pm-warn-fg);
  background: var(--pm-warn-bg); border: 1px solid var(--pm-warn-bd); border-radius: 6px;
}

/* 底部批量操作栏：压在 tab 栏之上；手机上按钮换行，桌面上收成一条 */
.pm-selbar {
  position: fixed; left: 0; right: 0; bottom: 58px;
  z-index: 60;
  background: var(--pm-surface);
  border-top: 1px solid var(--pm-line);
  box-shadow: 0 -2px 12px rgba(0, 0, 0, .06);
  padding: 10px 12px calc(10px + env(safe-area-inset-bottom));
  display: flex; flex-direction: column; gap: 10px;
}
.pm-selbar__info { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.pm-selbar__count { font-size: 15px; font-weight: 600; color: var(--pm-text); }
.pm-selbar__hint { font-size: 13px; color: var(--pm-text-3); }
.pm-selbar__warn { font-size: 13px; color: var(--pm-warn-fg); }
.pm-selbar__ops { display: flex; gap: 8px; flex-wrap: wrap; }
.pm-selbar__ops .pm-btn { flex: 1 1 auto; min-width: 88px; height: 40px; font-size: 14px; }
.pm-selbar__ops .pm-btn--danger { color: #fff; background: #e5484d; border-color: #e5484d; }
.pm-selbar__ops .pm-btn:disabled { opacity: .5; cursor: not-allowed; }
/* 业务动作（拒收 / 撤销入仓 / 删除选中）比选择动作重，给更大的点击面积 */
.pm-selbar__ops--primary .pm-btn { height: 44px; font-size: 15px; }
/* 选择动作（全选 / 保留 / 退出管理）弱化成描边，不与业务动作抢注意力 */
.pm-selbar__ops--select .pm-btn {
  height: 34px; font-size: 13px;
  background: transparent; color: var(--pm-text-2); border-color: var(--pm-line);
}
/* 勾选态下藏掉悬浮新增按钮，免得与操作栏叠在一起 */
.pm-listpage.is-managing .pm-fab { display: none; }
/* 给底部操作栏留出空间（现在两行动作 + 一行信息），否则最后一张卡片会被挡住 */
.pm-listpage.is-managing { padding-bottom: 232px; }

@media (min-width: 769px) {
  /* 桌面：操作栏跟着放宽后的容器居中，横排一行 */
  .pm-selbar {
    left: 50%; transform: translateX(-50%);
    width: min(1200px, calc(100% - 32px));
    bottom: 56px;
    border: 1px solid var(--pm-line);
    border-radius: 10px;
    flex-direction: row; align-items: center; justify-content: space-between;
    padding: 12px 16px;
  }
  .pm-selbar__ops { flex-wrap: nowrap; }
  .pm-selbar__ops .pm-btn { flex: 0 0 auto; min-width: 104px; }
}

/* ---------- 新增 / 编辑采购（向导）：桌面形态 ----------
   手机版是「520px 单列竖排」，桌面上照搬的问题：
     · 第 1 步八个字段一条竖下来，屏幕右边空一大片，还得来回滚
     · 第 2 步「已选清单」压在搜索框上面 —— 刚进来时清单是空的，等于先给一块空版面
   桌面改成：
     · 第 1 步：表单两列网格；右侧固定一栏「订单概要」随填随更新
     · 第 2 步：左「搜索 + 结果」、右「采购清单 + 合计」，右栏吸顶
   用 order 让「清单」在手机上仍在搜索框上方（保持原版式），桌面才挪到右栏。 */
@media (min-width: 769px) {
  .pm.pm-wizard {
    max-width: 1080px;
    box-shadow: none;
    background: transparent;
    padding-bottom: 88px;          /* 给固定底栏让位 */
  }
  .pm-wizard .pm-steps {
    border-radius: 10px 10px 0 0;
    padding: 18px 24px 14px;
    justify-content: flex-start;
  }
  .pm-wizard .pm-step__line { flex: 0 0 120px; }

  /* 底部操作栏：桌面上贴容器底、右侧对齐按钮，不再居中成一条手机样式 */
  .pm-wizard .pm-footbar {
    left: 0; right: 0; transform: none; width: auto;
    max-width: 1080px; margin: 0 auto;
    height: 60px; padding: 0 20px;
    border-radius: 10px 10px 0 0;
    box-shadow: 0 -2px 12px rgba(0, 0, 0, .06);
  }
  .pm-wizard .pm-footbar .pm-btn { min-width: 116px; height: 38px; }

  /* ===== 第 1 步：表单两列 + 右侧概要 ===== */
  .pm-wizard.is-step1 .pm-form {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0 28px;
    padding: 20px 24px 24px;
    border-radius: 0 0 10px 10px;
  }
  .pm-wizard.is-step1 .pm-form__title { grid-column: 1 / -1; margin-bottom: 4px; }
  /* 备注独占一行：它是自由文本，挤在右列会很窄 */
  .pm-wizard.is-step1 .pm-field:last-child { grid-column: 1 / -1; }
  .pm-wizard.is-step1 .pm-field { padding: 10px 0; }
  .pm-wizard.is-step1 .pm-field__ctrl input { height: 38px; }

  /* 概要卡：手机上由基础规则 display:none 藏掉，桌面这里才显示 */
  .pm-wizard.is-step1 .pm-stepbody {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 320px;
    gap: 16px;
    align-items: start;
  }
  .pm-wizard.is-step1 .pm-ordsum {
    display: block;
    position: sticky; top: 16px;
    background: var(--pm-surface); border-radius: 10px; padding: 16px 18px;
  }
  .pm-ordsum__title { font-size: 14px; font-weight: 600; margin-bottom: 12px; }
  .pm-ordsum__row {
    display: flex; align-items: baseline; justify-content: space-between;
    gap: 12px; padding: 7px 0; font-size: 13px;
    border-bottom: 1px dashed var(--pm-line);
  }
  .pm-ordsum__row:last-child { border-bottom: none; }
  .pm-ordsum__k { color: var(--pm-text-3); flex: 0 0 auto; }
  .pm-ordsum__v { text-align: right; word-break: break-all; }
  .pm-ordsum__v.is-empty { color: var(--pm-text-3); }

  /* ===== 第 2 步：搜索（整宽）=====
     原来是「左搜索 / 右清单」两栏；清单整块去掉后不再分栏，
     搜索结果直接吃满宽度 —— 一行能多放不少货号。 */
  .pm-wizard.is-step2 .pm-stepbody { display: flex; flex-direction: column; }
  .pm-wizard.is-step2 .pm-summary { border-radius: 10px 10px 0 0; }
  /* 清单卡在桌面上宽一些更好读，但不要铺满 1080 —— 一行放不下反而难扫 */
  .pm-wizard.is-step2 .pm-cartlist { max-width: 720px; }
  .pm-wizard.is-step2 .pm-inlineeditor .pm-specform--inline { max-width: 720px; }

  .pm-wizard.is-step2 .pm-pick { padding: 16px 0 0; }
  .pm-wizard.is-step2 .pm-pick__search {
    background: var(--pm-surface); border-radius: 10px; padding-bottom: 12px;
  }
  /* 搜索结果桌面排**三**列：没有右栏之后宽度翻倍，两列会显得很空 */
  .pm-wizard.is-step2 .pm-results .pm-goods {
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 10px; padding: 10px 12px 0;
  }
  .pm-wizard.is-step2 .pm-good__arrow { display: none; }   /* 鼠标场景不需要箭头提示 */
}

/* ---------- 移动端微调 ----------
   手机上多了一条**全局常驻底栏**（shell 的 .dock，58px），业务台自己的吸底元素
   都要抬到它上面，否则会被压在底栏下面点不到。
   ⚠ 这些覆盖都放在这个模块自己的样式表里，不写进 layout.css ——
   全局壳不该知道采购模块的元素叫什么名字。 */
@media (max-width: 768px) {
  /* 列表末尾留出「底栏 + 悬浮按钮」的高度，否则最后一张卡片被盖住 */
  .pm { padding-bottom: 132px; }
  .pm-fab { bottom: 134px; }        /* 76 + 58 */

  /* 采购列表自带的四项 tab 与全局底栏是同一批入口，手机上隐藏它，
     避免两条底栏叠在一起。桌面上它保留（收成一条窄条当面包屑用）。 */
  .pm-tabbar { display: none; }

  .pm-footbar, .pm-actionbar { bottom: 58px; }   /* 压在底栏之上 */
  .pm-selbar { bottom: 116px; }                  /* 批量操作栏本来就在 footbar 之上 */

  /* ★★ 底栏被收起时（新建/编辑采购单这类自带固定页脚的表单页，
     见 shell/app.js 的 route.meta.hideDock），这些偏移要**一起收回 0**。
     不收的话底栏没了、页脚还悬在 58px 高处，下面露出一条空白 ——
     比原来两条横条摞着更难看。
     ⚠ 选择器带 .app-container 前缀：is-dock-hidden 挂在容器上。 */
  .app-wrapper.is-dock-hidden .pm-footbar,
  .app-wrapper.is-dock-hidden .pm-actionbar { bottom: 0; }
  /* ★★ 表单页内容区要留出「固定页脚 + 全局底栏」两份高度。
     ----------------------------------------------------------------------
     实测事故：内联规格表单的「确认添加」被排在 y=813，而底栏从 y=789 起 ——
     按钮**压在底栏下面**。因为整页内容不够长，滚动到底也推不上来，
     手指点下去实际点到的是底栏的「出售记录」，直接跳走了。
     根因是这里只留了 96px，而固定页脚(64) + 底栏(58) + 安全区 ≈ 130px。
     现在按 152px 留（两份高度 + 一点余量），保证最后一个可点元素也能滚上来。 */
  .app-wrapper.is-dock-hidden .pm { padding-bottom: 152px; }
  .app-wrapper.is-dock-hidden .pm-fab { bottom: 92px; }
}

/* ============================================================================
   瑕疵管理页（views/defect.js）
   与采购页共用 --pm-* 变量，观感保持一致。
   ========================================================================= */

/* 照片列。表格行高由最高的单元格决定，所以缩略图不能太大 ——
   48px 够认出是哪只鞋的哪个部位，又不会把行撑得很高（一页 10 行）。 */
.defect-photo__thumb {
  display: block;
  width: 48px;
  height: 48px;
  object-fit: cover;
  border-radius: 6px;
  border: 1px solid var(--pm-line);
  cursor: zoom-in;
  background: var(--pm-fill-2);
}
.defect-photo__thumb:hover { border-color: var(--pm-primary); }
/* 没拍照：给一个明确的占位，而不是留空白。
   空白会让人以为是图片加载失败，占位能说明"这件确实没拍"。 */
.defect-photo__none {
  display: inline-block;
  font-size: 11px;
  color: var(--pm-text-3);
  border: 1px dashed var(--pm-line);
  border-radius: 6px;
  padding: 1px 5px;
  white-space: nowrap;
}

/* 点开看大图。上传时已压到最长边 256px，所以不要拉满宽 —— 会糊。 */
.defect-photo__viewer { display: flex; flex-direction: column; align-items: center; gap: 10px; }
.defect-photo__viewer img {
  max-width: 100%;
  max-height: 60vh;
  border-radius: 8px;
  border: 1px solid var(--pm-line);
}
.defect-photo__viewer .defect-photo__meta {
  font-size: 12px;
  color: var(--pm-text-3);
  text-align: center;
}

/* 编辑弹窗顶部那行「货号 规格 · 名称」：给个底色，
   和下面的输入区分开，一眼知道在改哪一件。 */
.defect-edit__head {
  padding: 8px 10px;
  background: var(--pm-tint);
  border-radius: 6px;
  font-size: 13px;
  color: var(--pm-text-2);
}

/* 一条记录都没有时的引导。emptyState 本身已经有了，这里只是加点上边距，
   别紧贴着表格卡片。 */
.defect-empty-hint { margin-top: 14px; }

@media (max-width: 768px) {
/* ============================================================================
   ★★ 手机端整体收紧一档（密度）
   ----------------------------------------------------------------------------
   用户反馈「手机端整体过大」并非错觉，实测（390×844）：
     首屏固定区（分段器+搜索+两行 chip+筛选条）241px，占 844 的 29%
     单张卡片 427px → 一屏只看得到 1.4 张，列表完全没法"扫"
   根因是字号/内边距是照**桌面**定的（15/19px、10~14px 内边距），
   在 390px 宽的手机上就显得又大又占地方。

   ★ 为什么整块放在文件末尾、并包在 @media (max-width:768px) 里：
   前面那些规则不少是反复实测调出来的（尤其 grid 与 nowrap 那几条），
   就地改容易碰坏它们。放在末尾 + 断点限定，作用范围明确、随时可整块撤掉。

   ⚠ **断点是必须的，不能只靠类名前缀**：我一开始写的是 `.app-container ...`，
   以为那是"手机专用"，实测发现**桌面 1440px 也用同一套卡片**（.pm-card 在
   两种屏幕上都在渲染，桌面并没有换成表格），于是桌面被一起改小了。
   断点用 768px 与本文件既有的 `min-width: 769px` 分支互补，边界不重叠。
   ⚠ 不要再减字号到 12px 以下：Chrome 有最小字号限制，11px 已经压不动；
   而且手机上本来就要眯眼看，再小是退步不是优化。
   ========================================================================= */

/* ---------- 首屏固定区：241px → 约 190px ---------- */
.pm-seg { padding: 6px 10px; }
.pm-seg__btn { height: 34px; font-size: 14px; }

.pm-search { padding: 8px 10px 4px; gap: 8px; }
.pm-search__box { height: 34px; padding: 0 10px; border-radius: 17px; }
.pm-search__input { font-size: 14px; }
.pm-search__go { font-size: 14px; }

.pm-chips { padding: 2px 10px 0; }
.pm-chips__row { gap: 5px; padding: 3px 0; }
.pm-chip { height: 25px; padding: 0 10px; font-size: 12px; border-radius: 13px; }

.pm-filters__item { height: 38px; font-size: 13px; }

/* ---------- 卡片：427px → 约 300px ---------- */
.pm-list { padding: 6px 10px 4px; gap: 8px; }

.pm-card__head { padding: 8px 10px 2px; }
/* 「平台订单号」这五个字是标签（号码在下面一行），收到 11px。
   ⚠ 不再往下压到 10px：Chrome 有最小字号限制，压了也不生效；
   而且下面那条断言（"手机端不把字号压到 11px 以下"）就是拦住这种
   "为了塞下更多而看不清"的退步 —— 别为了几像素去破它。 */
.pm-card__ordlabel { font-size: 11px; }
.pm-card__ordno { font-size: 14px; gap: 5px; }
.pm-status { height: 21px; padding: 0 6px; font-size: 11px; border-radius: 5px; }

/* body 的两列：缩略图收窄一档（64 → 48），信息列拿到更多宽度。
   ★ 这里量的账（实测）：货号行要放下 货号+规格+「复制」+「瑕疵」共 263px，
   而 52px 缩略图时可用只有 254px —— **差 9px**，「瑕疵」就被挤到第二行，
   每行从 20px 变成 36px，三个货号白多占 48px。
   缩略图再收 4px + 外边距收 4px + gap 收 1px = 9px，刚好把这一行收回来。
   （不靠继续缩字号：Chrome 有最小字号限制，11px 已经压不动了；
   而且 10px 的中文在手机上本来就该看不清了。）
   ⚠ grid-template-columns 是**两列都要写**的：只改第一个值会把
   第二列（minmax(0,1fr)）弄丢，信息列立刻塌成 0 —— 那就是
   "中文逐字换行"那个老坑的入口。改这里必须两列一起写。 */
.pm-card__body {
  grid-template-columns: 48px minmax(0, 1fr);
  gap: 7px;
  margin: 4px 6px 0;
  padding: 8px;
}
.pm-card__thumb { flex-basis: 48px; width: 48px; height: 48px; }
/* 蓝点跟着缩略图一起挪（它原来按 64px 的图定在 top:26px） */
.pm-card__dot { top: 20px; }

.pm-card__info { gap: 2px; }
.pm-card__row { font-size: 12px; gap: 4px; }
.pm-card__row--muted { font-size: 11px; }
/* 货号行：这一行是卡片里最大的一块（实测 3 个货号 × 40px = 120px / 340px）。
   40px 的原因是「复制」+「瑕疵」两个按钮被挤到第二行。
   把这一行的字号、间距、按钮内边距各收一档，让它们尽量回到同一行 ——
   实测能压到 20px 一行，三个货号就省下约 60px（卡片 340 → 280）。
   ⚠ 三个按钮都是 `white-space: nowrap`（见上面 .pm-card__defect 的注释），
   所以压不下时它们会**整行换下去**，不会退化成"一个字一行"的竖排。 */
.pm-card__code { font-size: 12px; gap: 2px; row-gap: 1px; }
/* ★ 手机上把「货号：」「规格：」的**全角冒号**藏掉，标签之间靠间距分隔。
   实测每个「：」约 12px、两组合计约 24px —— 省下来正好让最长的那个
   货号行（NI5354-989 · 41/5.0×1 + 「复制」+「瑕疵」）也回到一行，
   三行 18+18+36 变成 18×3，卡片再省 18px。
   ⚠ 冒号在 markup 里是独立的 .pm-code__sep，所以这里藏得掉；
   如果它并进 <b> 里，就只能连标签一起去掉 —— 那是真丢信息，别那么干。
   ⚠ 冒号没了以后「货号AD4057-658」会连成一片，所以标签要**降一档色**
   才看得出哪两个汉字是标签、后面是值（原来靠冒号分隔，现在靠颜色）。 */
.pm-code__sep { display: none; }
.pm-card__code b { color: var(--pm-text-3); }
/* ★★ 商品图片条在手机上再压一档。
   第 2 步那轮把卡片从 427px 收到 273px，这一条是**新增**的高度 ——
   40px 图 + 间距约 46px，是这次改动的主要代价，所以在手机上收到 32px
   （含间距约 38px），一屏仍然放得下两张多的卡。
   ⚠ 别再往下压到 24px 以下：占位图是个图形图标，小于 24px 就只剩一团色块，
   认不出是什么，加了等于没加。 */
.pm-card__thumbs { gap: 5px; }
.pm-card__thumbmini { width: 32px; height: 32px; }
.pm-card__thumbmore { height: 32px; padding: 0 7px; font-size: 11px; }
.pm-card__copy { font-size: 11px; padding: 0 1px; }
.pm-card__defect {
  font-size: 11px; line-height: 1.35;
  padding: 0 4px; border-radius: 7px; margin-left: 1px;
}

.pm-card__foot { padding: 7px 3px 4px; gap: 8px; }
.pm-card__time { font-size: 12px; }
.pm-card__amount { font-size: 16px; }

/* 操作行：字号与间距都收一档，让按钮尽量待在一行里
   （换行会让每张卡多出 24px，一屏就少半张卡） */
.pm-card__ops { gap: 8px; padding: 0 3px 8px; }
.pm-card__op { font-size: 12px; }
.pm-card__op--edit { padding: 1px 6px; }
.pm-card__op--redpacket { padding: 1px 6px; }

/* ---------- 分页 / 空态也跟着收 ---------- */
.pm-pager { padding: 10px 10px 16px; gap: 10px; }
.pm-empty__title { font-size: 14px; margin: 10px 0 5px; }
}
