

/* ── 用户菜单项 ── */
.user-menu-item {
  padding: 10px 14px;
  font-size:var(--fs-body-small);
  cursor: pointer;
  color: var(--text-secondary, #666);
  display: flex;
  align-items: center;
  gap: 8px;
  transition: background var(--duration-fast);
}
.user-menu-item svg { width: 15px; height: 15px; flex-shrink: 0; }
.user-menu-item:hover {
  background: var(--bg, #f5f5f5);
}

/* 退出登录特殊样式 */
.user-menu-item.logout {
  padding: 12px 16px;
  color: var(--danger-text); /* 批 D29：危险红统一深档（亮档白底 4.32:1 ⇒ 深档 6.31:1） */
}

/* ── 用户菜单分隔线 ── */
.user-menu-separator {
  height: 1px;
  background: var(--border, #e5e7eb);
  margin: 0 12px;
}

/* ── FAB 浮动导入按钮 ── */
#fabImport.fab-import {
  display: none;
  position: fixed;
  right: 20px;
  bottom: 24px;
  width: 50px;
  height: 50px;
  border-radius: 50%;
  background: var(--primary, #2563eb);
  border: none;
  box-shadow: 0 4px 16px rgba(249, 115, 22, 0.5);
  cursor: pointer;
  z-index: var(--z-affix);
  align-items: center;
  justify-content: center;
}
#fabImport.fab-import svg {
  width: 22px;
  height: 22px;
  fill: var(--text-on-primary); /* D-379 §3.1：规则区裸字面量色 → 语义令牌（与纯白同值） */
}

/* ── 管理员菜单容器（隐藏状态由 JS 控制 classList）── */
#userMenuAdmin { display: none; }
/* 同上（批 G-2）：类协议替代内联 display —— 隐藏态是这条 display:none，显示态是 .is-open。 */
#userMenuAdmin.is-open { display: block; }

/* ═══════════════════════════════════════════════════ */
/* 无障碍 (Accessibility) — WCAG 2.1 AA */
/* ═══════════════════════════════════════════════════ */

/* 跳到主内容链接 — 视觉隐藏，键盘聚焦时显示 */
.skip-link {
  position: absolute;
  top: -100px;
  left: 0;
  background: var(--primary, #2563eb);
  color: var(--text-on-primary); /* D-379 §3.1：同上 */
  padding: 10px 20px;
  border-radius: 0 0 6px 0;
  font-size: 14px;
  font-weight: var(--fw-medium);
  z-index: var(--z-toast); /* D-274：跳转链接属提示档（原写死 9999） */
  text-decoration: none;
  transition: top var(--duration-base);
}
.skip-link:focus {
  top: 0;
  outline: 3px solid var(--text-on-primary); /* D-379 §3.1：同上 */
  outline-offset: 2px;
}

/* 批 D10（2026-09-25）：本处原有**第二条全局焦点环规则** `*:focus-visible`（outline 3px + 圆角 3px）——
   它因加载顺序覆盖了 styles.css 的 A054（全站唯一真源），且那条 `border-radius:3px` 会**改掉元素自身圆角**
   （键盘聚焦圆形关闭钮时被压成方角，实测）。现删除，统一走 styles.css 的 `:focus-visible`（取值即这里的生效值）。 */

/* 鼠标点击时不显示焦点环 */
*:focus:not(:focus-visible) {
  outline: none;
}

/* 减少动画 — 尊重用户偏好 */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

/* 高对比度模式支持 */
@media (prefers-contrast: high) {
  * {
    border-color: currentColor !important;
  }
  /* 2026-10-09：`.modal-content` → `.modal-box`。
     病史：这里原写 `.modal-content`，而 **ERP 的弹窗容器从来叫 `.modal-box`**
     （`modules/core/modal.js`：`modal-overlay` > `modal-box` > header/body/footer）⇒
     该条在 ERP 上**从未生效**（等于高对比度模式下弹窗没有描边）。它之所以一直没被判成僵尸，
     是因为**另一个界面 h5app 的 DOM 里恰好有个同名 `.modal-content`**（h5app 有自己的 CSS、
     不加载本文件 ⇒ 那是"跨界面遮蔽"，不是真宿主）。h5app 于 2026-10-09 删除后，该僵尸才暴露。
     现指向真实类，**让高对比度模式下的弹窗真正获得描边**（a11y 意图落地）。 */
  .nav-item, .user-menu-item, .card, .modal-box {
    border: 1px solid currentColor;
  }
}

/* SVG 图标对屏幕阅读器隐藏 */
svg[aria-hidden="true"] {
  speak: none;
}

/* 表单标签关联 — 增强可读性 */
label {
  font-weight: var(--fw-medium);
  color: var(--text-primary, #333);
}

/* ============================================================
   1688 管理 · 线上订单明细 — 卡片化重构（作用域 .t1688-detail）
   设计语言：单色主强调 + CSS 变量 token + 状态 .tag-* + SVG 图标
   ============================================================ */
.t1688-detail {
  font-family: var(--font-sans);
  /* 09-05 B 组：撤销 08-29 A 组的限宽决策（max-width:1280px + margin:0 auto 已删除），
     统一为与待发货页一致的流式宽度（flex:1 撑满）。
     08-29 的理由（1920 下 8 语义列预算 1134px、拉宽后"中间空"）已被后续列布局优化覆盖，
     老板拍板以跨页一致性优先：同一页面群（线上订单 5 tab）宽度必须一致，明细页不再单独限宽。 */
}

/* 工具栏 */
/* D-XX (2026-09-09): .td-select 已并入公共 .form-select（styles.css 表单控件唯一源），定义删除 */
.td-toolbar-spacer { flex:1; }
/* P2-① V5 收口：.td-btn-* 已并入公共 .btn-*（styles.css），定义移除 */
/* 批 D7（2026-09-25）：私有 `.td-link`（带下划线的文字链）已收编 → 共享 `.btn .btn-link`
   （共享族既有形态：主色文字 + hover 浅底，比"临时下划线"更稳）。 */
/* 批 D13（2026-09-25）：`.td-filter-info` 已收编 → 共享状态标签 `.tag-warning`（老板裁决「统一」）。
   改前 6px 圆角 + 亮橙字（`--warning`）/ 改后 3px 圆角 + `--tag-warning-fg` 深橙字，底同为 `--warning-bg`。 */

/* KPI 统计：D-79（2026-09-09）删除 .td-kpis/.td-kpi* 9 条（含 2 条响应式）——
   订单明细 KPI 曾用待发货页 .p1688-ks 分数卡；D-313 起两者均已收编到共享 .kpi-card 族（styles.css） */

/* D-79（2026-09-09）删除 chip 系列 8 条 —— 明细页对齐待发货页后移除 chip 行，
   KPI 快捷筛选已收口到共享 .kpi-card 卡（点击筛选），不再需要独立 chip 行 */

/* 批量操作条：D-79（2026-09-09）删除 —— 明细页改顶级表后，批量入口并入工具栏按钮（禁用态 + 计数 span），
   不再有独立 .td-batch 浮层条 */

/* 卡片列表：D-79（2026-09-09）整段删除 —— 订单明细页按待发货页改造为「顶级 data-table 一单一行」，
   .td-list/.td-order/.td-order-head/.td-check/.td-spacer/.td-op-col 全部失去宿主。
   （D-76 的"头部左组 td-head-identity + 右组 td-op-col"即本次改造要移除的左右分组） */
/* 阶段1 核定（2026-09-09）：td-oid/td-shop 字重回 400（--fw-regular），字号已用 --fs-body；
   字号/字重统一收敛到 .data-table td 全局（原文引「V6 §8.1.3」，旧编号对照见
   docs/standards/PAGE-LAYOUT-SPEC.md §10），仅保留语义化特例（font-mono/药丸）。
   【2026-09-24】原注释的出处 V6-COMPONENT-UNIFICATION-PLAN 已删除 ⇒ 去掉指向不存在文档的引用。
   【2026-09-24 取值复议（老板截图反馈「店铺列的灰太深 / 订单号应该黑」）】两条均为**取值**变更，非结构变更：
   · .td-shop 底 `--bg`(#EEEEEE) → `--surface-2`(#F3F3F3)：药丸底降一档灰。同批把域内同元素
     `.p1688-shop-tag`（待发货/拣货页）一并改，避免同一种「店铺灰药丸」两页两色。
   【2026-09-25 批 D2e】两份实现已合并为**共享单类** `.shop-tag`（定义在 styles.css，字号取规范 §5.7 的 12px）
   ⇒ 本节以下关于 `.td-shop` 的取值记录**只作病史**，现行实现不在本文件。
     不取更浅的 `--gray-0`(#FAFAFA)：它与卡白底只差 5/255（药丸落在更浅的底上会只剩描边）。
     ⚠️ 2026-10-10 更正：原文理由写的是"那是斑马纹档（`--table-row-alt`）"—— 斑马纹整族已下线、
     该令牌也已退役 ⇒ 理由改为它**本身太浅**；`--gray-0` 现存唯一消费者是提现汇总展开行。
   · .td-oid 字色 `--primary`(#0052D9) → `--text-primary`(rgba(0,0,0,.9))：与**待发货页**单号单元格
     （`<td class="px-12 font-mono c-text">`，一直是黑）对齐 —— 明细页原来是全站唯一「单号是蓝字」的表。
     `:hover` 保留 `--primary`（本就存在，此前因底字同色成空规则），现在成为「可点复制」的唯一提示。 */
/* 批 D12（2026-09-25）：`td-*` 族第一批 —— **同值映射**到共享工具类：`.td-count`→`.fs-12 .c-secondary`（同值）·
   `.td-price`→`.fw-500`（同值）· `.td-no`/`.td-track`→`.font-mono .fs-14`（同值：族 + 14px 档）；
   另 `.td-toolbar` 与 `mm-cell`/`p1688-ta`/`p1688-thumb` 因**僵尸判据修「子串盲区」**（改按词边界匹配）现形而删除。
   ⚠️ **刻意保留两条**（不是漏）：本行的 `.td-oid`（"可点 mono 文本"需 hover 变主色，共享层无此形态，
   等第二个消费者再立）· `.td-toolbar-spacer`（共享层无 spacer 原语；`.fc-spacer` 只在筛选卡内）。
   （`.td-filter-info` 已于批 D13 按老板裁决「统一」收编到共享状态标签 `.tag-warning`。） */
/* 批 D21（2026-09-26）：10 个"自带底色的状态块"按 D20 判定表收编 ——
   标签 2 条：.td-remark-ic→.tag-warning · .sync-status→.tag-success；
   提示条 8 条：.t1688-warn-note/.t1688-op-note/.sd-norm-miss/.sd-impact→.banner--warning ·
   .t1688-op-info-card/.p1688-claim-banner→.banner--info · .t1688-pay-sum/.sd-norm-hit→.banner--success。
   逐条差异（字色/边浅一档/pad 8×10→12×16 等）见证据 §43。 */
.td-oid { font-size:var(--fs-body); font-weight:var(--fw-regular); font-family:var(--font-mono); color:var(--text-primary); cursor:pointer; }
.td-oid:hover { color:var(--primary); }

/* ⋯ 菜单（锚定操作列按钮下方） */
@keyframes tdFadeIn { from { opacity:0; transform:translateY(-4px); } to { opacity:1; transform:translateY(0); } }

/* 卡片明细：D-79（2026-09-09）删除 .td-order-body 相关 5 条 —— 明细不再嵌在卡片里，
   改为顶级表行下的 tr.td-expand 展开行（样式随 1688-online-detail.js 页内 <style> 自带） */

/* 卡片脚注：D-79（2026-09-09）删除 .td-order-foot/.td-receiver/.td-addr/.td-logistics —— 卡脚已无宿主，
   收件人/地址/物流并入顶级表「收货」列（.td-logistics-link 仍在用，保留） */

/* A7（2026-09-24）：「跨列空态格」的定义已收归 styles.css（`.data-table tbody tr > td.td-empty`）。
   本文件原有**两份** `.td-empty`（此处 padding:60px 与下方 Phase D 那份 flex + mask 图标）——
   同名两值、后者大面积覆盖前者，且两份的纵向内边距都被 styles.css 的行高 `!important` 清零
   ⇒ 从未真正生效。现删除本处两份，只保留 styles.css 一份；Phase D 的 inbox 装饰一并撤除（§5.4 零装饰）。 */

/* ═══════════════════════════════════════════════════════
   1688 管理 · API 同步页 — Phase B 重做（作用域 .t1688-sync）
   设计语言：单色主强调 + token + .tag-* 状态药丸 + 卡片化 + 同步进度
   ═════════════════════════════════════════════════════ */
.t1688-sync { font-family: var(--font-sans); }

.t1688-sync .sync-spin { width:14px; height:14px; border:2px solid var(--border); border-top-color:var(--primary); border-radius:50%; animation:tdSpin .7s linear infinite; }
@keyframes tdSpin { to { transform:rotate(360deg); } }
.t1688-sync .sync-log-row { display:flex; gap:10px; padding:6px 0; font-size:12px; border-bottom:1px dashed var(--border); }
.t1688-sync .sync-log-row:last-child { border-bottom:none; }

/* ═══════════════════════════════════════════════════════
   1688 管理 · Phase D 打磨（骨架屏 / 密度切换）
   ═════════════════════════════════════════════════════ */
/* 空态：已由 A7（2026-09-24）收归 styles.css 的 `.td-empty` 唯一实现（原此处为 flex + mask 图标） */

/* WMS 组装/拆解抽屉（ledger 页 · 2026-08-26 自内嵌 <style> 下沉）
   ⇒ **D3a（2026-09-25）已收编**：私有 `.wmsC-drawer` / `.wmsC-drawer-mask` / `.d-head|body|foot` 全族删除，
   与 SKU 编辑抽屉（`.skuM-*`，与本节曾**逐字孪生**）一起改走**共享 Drawer 组件**
   （外观真值 = styles.css §24.7 `.drawer`；宽度 = `--drawer-w-xl` 620px，与原值等值）。
   现行实现的落点：`modules/core/drawer.js`（组件）+ `modules/app-wms-ledger.js::wlcdOpenDrawer`。 */

/* ═══════════════════════════════════════════════════════════
   G18 批2（2026-08-26）：supply 打印模板 scoped 样式（原悬空类补齐）
   ═══════════════════════════════════════════════════════════ */
.supply-print { font-size:var(--fs-body-small); color: var(--text-primary); line-height: 1.6; }
.supply-print-title { font-size: 18px; font-weight: var(--fw-medium); text-align: center; margin-bottom: 16px; letter-spacing: 4px; }
.supply-print-section { margin-bottom: 12px; }
.supply-print-footer { display: flex; justify-content: space-between; margin-top: 32px; gap: 32px; }

.supply-report { padding: 16px 20px; }
.detail-actions { display: flex; gap: 10px; margin-top: 12px; }
.supply-autocomplete-dropdown { position: absolute; top: 100%; left: 0; right: 0; max-height: 200px; overflow-y: auto; background: var(--card-bg); border-radius: 6px; z-index: var(--z-dropdown); box-shadow: 0 4px 12px rgba(31, 35, 41, .12); }
/* G18 补全（2026-09-09）：supply 域 9 个真悬空类上收全局，消除页内缺失样式 */
.supply-action { border: none; padding: 5px 12px; border-radius: var(--radius-md); font-size: var(--fs-caption); cursor: pointer; }
.supply-prod-check { width: 15px; height: 15px; cursor: pointer; accent-color: var(--primary); vertical-align: middle; }
.supply-image-preview { display: inline-flex; align-items: center; gap: 4px; margin: 4px; }
.detail-remark { margin-top: 6px; padding: 8px 12px; background: var(--bg-tertiary); border-radius: var(--radius-md); color: var(--text-secondary); font-size: var(--fs-caption); line-height: 1.5; }
.supply-print-row { display: flex; gap: 4px; margin-bottom: 8px; }
.supply-print-label { min-width: 120px; color: var(--text-secondary); }

.supply-adjust-input { min-width: 52px; text-align: center; }

/* ═══════════════════════════════════════════════════════════
   G18 批3（2026-08-28）：1688 映射页按商品聚合视图 scoped 样式
   ═══════════════════════════════════════════════════════════ */
.m1688-offer-card { border-radius: var(--card-radius); }

/* D-79（2026-09-09）：删除 D-76 遗留的头部左右分组样式 —— .td-op-col（右组操作列）、
   .td-head-identity（左组身份+金额）、.td-amount-block/.td-amount/.td-freight/.td-head-div（左组金额区）。
   老板指令「移除列表中的左右组」：三按钮不再成组，改为顶级表行内「操作」列；
   金额回归「实付」列（.td-sub-amount + .td-freight-mini，见 1688-online-detail.js 页内样式）。 */

/* 表格列宽分配（D-68 重写 + D-69 utility 收敛 + D-70 字典迁 styles.css）：列宽一律改挂 `<th class="w-XXX">`
   ——对齐待发货页 app-supply-ship 同款范式；删除 8 条 .td-col-* width 规则。
   D-79 更新：顶级表 11 列 = cb w-40 / 订单号 w-160 / 店铺 w-104 / 买家 w-112 / 商品 w-grow /
   数量 w-56 / 实付 w-104 / 状态 w-88 / 收货 w-192 / 下单 w-96 / 操作 w-150；
   展开行（tr.td-expand）子表 8 列沿用原字典：goods=w-grow · spec=w-120 · sin=w-140 · bind=w-160 ·
   qty=w-56 · price=w-96 · sub=w-104 · op=w-48。滚动容器改 .t1688-card > .ox-auto（同待发货页）。
   no-spec 整列隐藏选择器随明细抽屉表格化废弃一并删除（D-91，2026-09-10）。
   同批：原 `.t1688-detail .td-goods/.td-spec/.td-sku-bind/.td-goods-img`（12 条）因 Drawer 挂载于
   document.body 而长期失效，已整体迁入 styles.css 的 D-91 段并改宿主为 `.t1688-dl-drawer`。 */

/* 物流直点（A6） */
.t1688-detail .td-logistics-link { display:inline-flex; align-items:center; gap:5px; cursor:pointer; color:var(--info); }
.t1688-detail .td-logistics-link:hover { color:var(--primary); text-decoration:underline; }

/* 单号缩略（B1） */
.t1688-detail .td-oid { max-width:110px; }

/* 摘要条：D-79（2026-09-09）删除 .td-summary* 全族 14 条 —— 摘要条与 .td-kpis 一起被
   KPI 分数条（共享 .kpi-card）取代；待办入口改为工具栏「待办视图」下拉，不再有 .td-todo-btn */

/* ═══ 1688 订单明细 · 独有类补充（v1 段精简时保留）═══ */
.t1688-detail .shop-tag.unknown { color: var(--text-muted); background: var(--surface-2); border-style: dashed; }
.t1688-detail .td-sub-amount { font-weight: var(--fw-medium); }

/* B1（08-28）表头去重规则：D-79（2026-09-09）删除 —— 该规则为"每单一卡各带一份 thead"服务，
   改顶级表后全页仅一个 thead，去重规则失去意义 */
/* B2（08-28）：高级筛选行（货号/时间/排序/列设置）—— D-79（2026-09-09）删除 .td-adv-slim 规则：
   明细页对齐待发货页后筛选控件平铺进主工具栏，不再有独立高级筛选行 */
tr.kb-row-active { background: var(--primary-subtle); outline: 1px solid var(--primary); outline-offset: -1px; }
tr.kb-row-active td { color: var(--text-primary); }

/* ════════════════════════════════════════════════════════════════════
   1688 域 V6 公共组件基类（2026-09-07 · inline style 清零组件化批）
   来源：_audit_reports/1688-v6-audit-report-20260907.html 修复分级 P1/P2
   使用约束：1688 域各页模板一律消费下列类，禁 style="..."；页面特有类
   放各模块头部 <style>（SKU 域 app-sku.js 同款先例，无 id 不触发 G14）
   ════════════════════════════════════════════════════════════════════ */

/* ── 布局 ── */
.t1688-row { display:flex; align-items:center; gap:12px; flex-wrap:wrap; }
.t1688-toolbar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; padding:10px 12px; background:var(--surface-2); border:1px solid var(--border); border-radius:var(--radius-md); margin-bottom:16px; }
.t1688-row-b { display:flex; justify-content:space-between; align-items:center; gap:12px; flex-wrap:wrap; }
.t1688-col { display:flex; flex-direction:column; gap:12px; }
.t1688-grow { flex:1; min-width:0; }
.t1688-grid2 { display:grid; grid-template-columns:1fr 1fr; gap:12px; }
.ml-auto { margin-left:auto; }
.ellipsis { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* ── 容器/面板 ── */
.t1688-box { border:1px solid var(--border); border-radius:var(--radius-md); background:var(--surface); }

/* D-427：.t1688-card 已收编为标准 .table-card（接受丢 1px 边框 —— 与单品SKU 对齐） */
/* 2026-09-27（订单分析页重构）：`.t1688-panel-h`（店铺汇总卡自建卡头）已随"三卡合一卡"下线 ——
   该卡头由数据卡的统一卡头（`.table-header`）承担，全仓零引用 ⇒ 按 dead-css 判据删除本条
   （留零引用类就是僵尸规则；判据：npm run verify:deploy 的 dead-css 段）。 */

/* ── KPI 卡组（对齐 SKU 页 skuM-kpi 形态）── */


/* ── 1688 待发货工作台 · 页面组件（上收自 1688-online-pending.js 页内 <style>；
   D-70 起列宽一律走 styles.css 列宽字典，本段不再定义任何 w-* 类；单页独有组件按 §4.5
   保留 p1688-* 域前缀但定义收进全局组件区，禁止页内 <style>）── */
.p1688-lbd { border-left:3px solid var(--danger); }
.p1688-lbw { border-left:3px solid var(--warning); }
.p1688-cell-flex { display:flex; align-items:center; gap:8px; }
.p1688-act-flex { display:flex; align-items:center; gap:2px; white-space:nowrap; }
.p1688-rmk-cnt { display:inline-block; min-width:16px; margin-left:4px; padding:0 4px; text-align:center; background:rgba(255,255,255,.25); border-radius:var(--radius-md); font-size:12px; }
.t1688-row-cb { cursor:pointer; }
.p1688-thumb-ph { display:inline-flex; align-items:center; justify-content:center; background:var(--bg); color:var(--text-muted); border-radius:var(--radius-md); border:1px solid var(--border); }
/* 【2026-09-24】底 `--bg`(#EEEEEE) → `--surface-2`(#F3F3F3)：与明细页 `.td-shop` 同取一档更浅的灰
   （老板截图反馈「店铺列的灰太深」）。两页同元素同色，取值依据见上方 .td-shop 同批注释。 */
.p1688-chk { display:inline-flex; align-items:center; gap:var(--space-2); }
.t1688-bs-row { display:flex; flex-direction:column; gap:8px; padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-md); }
.p1688-bs-line { display:flex; align-items:center; gap:8px; flex-wrap:wrap; min-width:0; }
.t1688-bs-status { font-size:12px; }
.p1688-bs-col { display:flex; flex-direction:column; gap:12px; }
.p1688-bs-progress { font-size:12px; font-weight:var(--fw-medium); color:var(--primary); }
.t1688-mypick-card { border:1px solid var(--border); border-radius:var(--card-radius); overflow:hidden; background:var(--surface); }
.p1688-mpc-head { display:flex; align-items:center; gap:var(--space-3); background:var(--surface-2); border-bottom:1px solid var(--border); flex-wrap:wrap; padding:var(--space-3) var(--space-4); }
.p1688-mpc-body { display:flex; flex-direction:column; gap:var(--space-3); padding:var(--space-3) var(--space-4); }
.p1688-pool-row { display:flex; align-items:center; gap:var(--space-3); padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-md); }
.p1688-pool-row.claimed { opacity:.55; background:var(--surface-2); }
.p1688-pool-end { margin-left:auto; display:flex; align-items:center; gap:8px; }
.p1688-grow-card { display:flex; gap:var(--space-3); align-items:center; padding:9px var(--space-3); border:1px solid var(--border); border-radius:var(--card-radius); }
.p1688-grow-t { flex:1; min-width:0; }
.p1688-grow-ti { font-weight:var(--fw-medium); color:var(--text-primary); font-size:14px; }
.p1688-grow-meta { font-size:12px; color:var(--text-secondary); margin-top:2px; }
.p1688-addr-lines { font-size:12px; color:var(--text-secondary); line-height:1.6; }
.p1688-rmk { padding:var(--space-3); font-size:12px; border-radius:var(--radius-md); }
.p1688-rmk .rmk-t { font-weight:var(--fw-medium); font-size:12px; margin-bottom:3px; display:flex; align-items:center; gap:var(--space-2); }
.p1688-rmk .rmk-b { white-space:pre-wrap; line-height:1.6; }
.p1688-rmk .rmk-b.muted { opacity:.6; }
.p1688-rmk.buyer { background:var(--warning-bg); border:1px solid var(--warning); }
/* 批 D28：软底（--warning-bg）上的文字 ⇒ 用体系里为软底调过的达标档（亮档 2.82:1 / --warning-text 4.09:1 / 本档 5.67:1） */
.p1688-rmk.buyer .rmk-t, .p1688-rmk.buyer .rmk-b { color:var(--tag-warning-fg); }
.p1688-rmk.seller { background:var(--info-bg); border:1px solid var(--border); }
.p1688-rmk.seller .rmk-t, .p1688-rmk.seller .rmk-b { color:var(--info); }
.p1688-frm { display:flex; flex-direction:column; gap:var(--space-4); padding:4px 0; }
.p1688-rows { display:flex; flex-direction:column; gap:8px; }
.p1688-drawer-body { display:flex; flex-direction:column; gap:12px; min-height:120px; }
.t1688-mr-auto { margin-right:auto; }
.p1688-th-stack { display:inline-flex; align-items:center; vertical-align:middle; }
.p1688-th28 { width:28px; height:28px; border-radius:var(--radius-md); object-fit:cover; border:2px solid var(--surface); background:var(--bg); flex-shrink:0; display:inline-flex; align-items:center; justify-content:center; font-size:12px; color:var(--text-muted); }
.p1688-th28 + .p1688-th28 { margin-left:-10px; }
.p1688-th52 { width:52px; height:52px; border-radius:var(--radius-md); object-fit:cover; border:1px solid var(--border); flex-shrink:0; }
.p1688-th52-ph { display:inline-flex; align-items:center; justify-content:center; background:var(--bg); color:var(--text-muted); }
/* ── 订单明细·主表商品列护栏（D-86 · 2026-09-09 · V6 §8.1.12 内部内容容器）──
   根因：主表商品列 th 挂 w-grow（table-cell 下 min/max-width 无效，D-70 实测修正），
   td 内 p1688-cell-flex 无 min-width:0，内容（缩略图+摘要+徽标）随筛选伸缩撑破 td
   → 相邻定宽列被挤 → 列宽漂移（待发货页同构但无徽标故无此症状）。
   修复：td 内加 .td-goods-main 承载容器，min-width:0（可收缩）+ max-width:560（上限护栏）
   + overflow:hidden（真截断）；内部摘要可收缩吸收剩余。不叠加 .w-grow（其 min-width:240
   加载序覆盖 min-width:0，且本列内容天然超 240 下限无意义）。 */
.t1688-detail .td-goods-main { display:flex; align-items:center; min-width:0; max-width:560px; overflow:hidden; }
.t1688-detail .td-goods-sum { flex:0 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; }
.p1688-ta-h { min-height:130px; }
.p1688-rmk-scroll { max-height:90px; overflow-y:auto; }

/* ── 输入/表单控件 ── */
/* D-XX (2026-09-09): .t1688-select 已并入公共 .form-select（styles.css 表单控件唯一源）——
   从本联名规则移除 .t1688-select 成员。D-427：.t1688-input 亦已收编为标准 .form-input（该注释描述已过时） */
/* D-427：.t1688-input 已彻底收编为标准 .form-input（老板指令「彻底收编」）。
   先例：.t1688-select 已于 2026-09-09 并入 .form-select（见本文件 423 行注释），本项是同路线最后一块。
   映射：`t1688-input w-full` → `form-input`（form-input 本身 width:100%）；其余组合类保留。
   观感变化（已确认接受）：底色 白→灰、padding 8→9px、聚焦变白底（form-input:focus 自带高亮）。 */
.t1688-ta { resize:vertical; }

/* D-70（2026-09-08）：列宽 utility 字典已整体迁入 styles.css（§Width/Height 区块唯一真源）——
   w-* / mw-* / w-grow 定义见 styles.css「表格列宽唯一字典」分区；本文件禁再定义任何 w-* / mw-* */


/* ── 语义文本深档（-text 值；tag 徽章已消费，正文强调文字用）── */



/* ── 筛选 chip / 隐藏态（1688 域 V6 补充）── */
.t1688-hide { display:none; }

.t1688-rel { position:relative; }

/* ── 表单字段标签（offline 表单 label 统一；display:block 支撑 grid 布局）── */
.t1688-field-label { display:block; font-size:12px; font-weight: var(--fw-medium); color:var(--text-secondary); margin-bottom:4px; }
.t1688-colspan2 { grid-column: span 2; }
.t1688-dash { grid-column:span 2; padding:14px; border:1px dashed var(--border); border-radius:var(--card-radius); background:var(--bg); }
.t1688-act-group { display:inline-flex; align-items:center; gap:6px; }
.t1688-thumb { width:48px; height:48px; object-fit:cover; border-radius:var(--radius-md); border:1px solid var(--border); }
.t1688-img-pv { width:120px; height:120px; border:1px solid var(--border); border-radius:var(--radius-md); background:var(--surface); display:flex; align-items:center; justify-content:center; overflow:hidden; }

/* ── 行内彩色描边小按钮（状态/收款/跟进；替代手写 border+color inline）── */






/* ── 客户搜索下拉（替代手写绝对定位 inline）── */
.t1688-dd { position:absolute; top:100%; left:0; right:0; max-height:200px; overflow-y:auto; background:var(--surface); border:1px solid var(--border); border-radius:var(--radius-md); box-shadow:var(--shadow-md); z-index:var(--z-dropdown); }

/* ════════════════════════════════════════════════════════════════════
   JS 受控显隐容器初始态（2026-09-07 · inline 清零组件化批）
   这些容器打开/关闭全由 JS style.display 驱动（modal-overlay/td-* 基类
   默认 display:flex 会泄漏），HTML 不再写 inline display:none，由本组
   id 规则保证首帧隐藏（id 特异性 > 基类 class，与加载顺序无关）
   ════════════════════════════════════════════════════════════════════ */
/* offline 壳录入/对账单/预览三弹窗 */
#trade1688-offline-modal,
#trade1688-statement-modal,
#trade1688-statement-preview-modal { display:none; }
/* detail 页高级筛选行（A1 2026-09-09：去折叠改常显平铺，故 #td-adv-row 不再 display:none）
   / 批量条 */
#td-batch-bar { display:none; }
.t1688-mt3 { margin-top:12px; }

/* ── 表格单元格截断护栏（2026-09-11：修「操作列被挤出可视区」）────────────────────
   成因：`.ellipsis`（上方 350 行）含 white-space:nowrap，其 min-content = 整串文本宽度，
   在 table-layout:auto 下**压过 th 的 w-* 列宽声明**把整列撑爆 —— 1688「收货」列被长地址
   撑到 972px（表格 2332px，容器仅 1290px）→ 最右「操作」列被推出可视区。
   用法：给单元格挂字典类 `mw-192`（复用列宽字典上限档），由本规则强制截断。
   ⚠️ max-width 与 overflow:hidden 必须同时给：实测「只给 max-width / 只给 overflow:hidden /
      只给 width」三种写法**均无效**，列宽仍为 972px。 */
.data-table td.mw-192 { max-width:192px; overflow:hidden; }

/* D-298 C2 批28（2026-09-14）：自注入 CSS 下沉第 1 处 —— 1688 库存看板滚动容器（原 modules/app-op-1688inventory.js
   运行时 createElement("style") 注入）。下沉理由：运行时注入既不过构建、也不被视觉门禁覆盖。 */
/* D-298 C2 批29（2026-09-14）：下沉自 modules/core/loading.js（原运行时注入）
   2026-10-08 视觉一致性批 1：删除 @keyframes pulse —— 它与 styles.css 的 @keyframes skeleton-pulse
   定义逐字相同（opacity .5→1），是同一事实的两处定义。骨架占位条已统一到 .sk-bar（消费 skeleton-pulse），
   pulse 全仓零消费 ⇒ 删（保留 spin，rLoading 仍在消费）。 */
@keyframes spin{to{transform:rotate(360deg)}}

/* D-298 C2（2026-09-15）：下沉自 modules/core/calendar.js（yy-* 日历组件样式，原运行时注入） */

.yy-date{position:relative;display:inline-flex;align-items:center;user-select:none}
.yy-date .yy-display{display:flex;align-items:center;gap:6px;padding:6px 12px;min-width:140px;height:36px;border:1px solid var(--border);border-radius: var(--radius-default);background:var(--bg);cursor:pointer;transition:border-color var(--duration-fast),box-shadow var(--duration-fast);font-size:14px;color:var(--text-primary)}
.yy-date .yy-display:hover{border-color:var(--primary)}
.yy-date .yy-display:focus,.yy-date .yy-display.yy-active{border-color:var(--primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--primary) 15%,transparent);outline:none}
.yy-date .yy-display .yy-val{flex:1;font-weight: var(--fw-medium);font-family:'Courier New',monospace;letter-spacing:.5px}
.yy-date .yy-display .yy-val.yy-placeholder{color:var(--text-muted);font-weight:400;font-family:inherit;letter-spacing:0}
.yy-date .yy-display .yy-icon{color:var(--text-muted);font-size:12px;flex-shrink:0;transition:transform var(--duration-base)}
.yy-date .yy-display.yy-active .yy-icon{transform:rotate(180deg);color:var(--primary)}
.yy-date .yy-hint{font-size:var(--fs-body-small);color:var(--text-muted);margin-top:3px;min-height:15px;transition:color var(--duration-fast)}
.yy-date .yy-hint.err{color:var(--danger-text)} /* D29：11px 小字，亮档 4.32:1 不达标 */
/* 批 D28：11px 小字，亮档 3.16:1 不达标 ⇒ 深档（2026-10-08 批 1 后又加深：#008858→#00784D = 5.54:1） */
.yy-date .yy-hint.ok{color:var(--success-text)}
.yy-calendar{position:fixed;z-index:calc(var(--z-modal) + 10);background:var(--card-bg);border:1px solid var(--border);border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.15);padding:12px;width:280px;animation:yyCalIn .12s ease}
@keyframes yyCalIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}
.yy-cal-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.yy-cal-header .yy-cal-title-select{display:flex;gap:4px;align-items:center}
.yy-cal-header .yy-cal-year-select,.yy-cal-header .yy-cal-month-select{padding:4px 8px;border:1px solid var(--border);border-radius:6px;background:var(--bg);font-size:var(--fs-body-small);font-weight:var(--fw-medium);color:var(--text-primary);cursor:pointer;outline:none;transition:all var(--duration-fast)}
.yy-cal-header .yy-cal-year-select:hover,.yy-cal-header .yy-cal-month-select:hover{border-color:var(--primary)}
.yy-cal-header .yy-cal-year-select:focus,.yy-cal-header .yy-cal-month-select:focus{border-color:var(--primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--primary) 10%,transparent)}
.yy-cal-header .yy-cal-year-select option,.yy-cal-header .yy-cal-month-select option{font-weight:var(--fw-medium)}
.yy-cal-header button{width:28px;height:28px;border:1px solid var(--border);border-radius:6px;background:var(--bg);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--text-secondary);transition:all var(--duration-fast)}
.yy-cal-header button:hover{background:var(--primary);color:var(--text-on-primary);border-color:var(--primary)}
.yy-cal-weekdays{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;margin-bottom:4px}
.yy-cal-weekdays span{font-size:var(--fs-body-small);font-weight:var(--fw-medium);color:var(--text-muted);padding:4px 0}
/* 批 D28：11px 编号，亮档 3.12:1 不达标 ⇒ 深档（2026-10-08 批 1 后又加深：#BE5A00→#B05200 = 5.18:1） */
.yy-cal-weekdays span:first-child,.yy-cal-weekdays span:last-child{color:var(--warning-text)}
.yy-cal-days{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;gap:2px}
.yy-cal-days .yy-day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius: var(--radius-default);font-size:var(--fs-body-small);cursor:pointer;transition:all var(--duration-fast);color:var(--text-primary);margin:0 auto}
.yy-cal-days .yy-day-cell:hover{background:color-mix(in srgb,var(--primary) 10%,transparent);color:var(--primary)}
.yy-cal-days .yy-day-cell.yy-other{color:var(--text-muted);cursor:default}
.yy-cal-days .yy-day-cell.yy-other:hover{background:transparent;color:var(--text-muted)}
.yy-cal-days .yy-day-cell.yy-today{font-weight:var(--fw-medium);border:2px solid var(--primary);color:var(--primary)}
.yy-cal-days .yy-day-cell.yy-selected{background:var(--primary);color:var(--text-on-primary);font-weight:var(--fw-medium)}
.yy-cal-days .yy-day-cell.yy-selected.yy-today{border-color:var(--primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--primary) 30%,transparent)}
.yy-cal-footer{display:flex;justify-content:space-between;margin-top:8px;padding-top:8px;border-top:1px solid var(--border)}
.yy-cal-footer button{padding:4px 12px;border:1px solid var(--border);border-radius:6px;font-size:12px;cursor:pointer;background:var(--bg);color:var(--text-secondary);transition:all var(--duration-fast)}
.yy-cal-footer button:hover{border-color:var(--primary);color:var(--primary)}
.yy-cal-footer button.yy-btn-clear:hover{border-color:var(--danger);color:var(--danger-text)} /* D29：描边保留亮档，文字下移深档 */
    

/* D-298 C2（2026-09-15）：下沉自 modules/app-payslip.js（工资条月份列表） */

      .slip-month-item{display:flex;align-items:center;gap:8px;padding:11px 14px;cursor:pointer;border-left:3px solid transparent;font-size:var(--fs-body-small)}
      .slip-month-item:hover{background:var(--bg-tertiary)}
      .slip-month-item.active{border-left-color:var(--primary);background:var(--primary)0f;font-weight:var(--fw-medium)}
      .slip-head{display:flex;justify-content:space-between;align-items:flex-start;padding:16px 18px;border-bottom:1px solid var(--border)}
      .slip-meta{display:grid;grid-template-columns:repeat(2,1fr);gap:6px 18px;padding:12px 18px;font-size:var(--fs-body-small);color:var(--text-secondary)}
      .slip-meta b{color:var(--text-primary);font-weight:var(--fw-medium)}
      .slip-total{display:flex;justify-content:space-between;align-items:center;padding:14px 18px;background:var(--bg-tertiary);font-weight:var(--fw-medium)}
      .slip-total .net{font-size:20px;color:var(--primary)}
.slip-watermark{text-align:center;color:var(--text-muted);font-size:var(--fs-body-small);padding:12px 0 16px}
    

/* D-298 C2（2026-09-15）下沉自 modules/app-usermgr.js 的用户管理下拉菜单（.um-more-dropdown /
   .um-drop-menu / .um-drop-item / .um-drop-divider / .um-drop-danger）已于 2026-09-26
   随老板裁决「删除旧版」整组删除：唯一消费者是旧页的账号表格 renderUserTable（已随页删除），
   删除后全仓 markup 实测 0 处引用。 */
    /* 2026-10-08（权限重构 v4 · P6-c）：`.um-form-label` 已删 —— 唯一消费者是旧权限页的
       账号 / 权限组弹窗（perm-user-modals.js · perm-role-editor.js），那批文件已随整页替换退役。
       判据：node scripts/dead-css-audit.mjs --check 从此不再报它。 */
  

/* D-298 C2（2026-09-15）：下沉自 modules/app-op-1688shop.js */

    

/* D-298 C2（2026-09-15）：下沉自 modules/app-1688-mapping.js */

      /* 通用 .mm-* 弹窗组件类已上收全局 styles.css「MM 组件库」段（2026-09-09；该段即唯一源，
         原文引用的 V6-COMPONENT-UNIFICATION-PLAN 已删除）。
         本页仅保留：单边类（全局未定义）+ 页面作用域规则（.m1688-page / 嵌套子表豁免）。 */
      .mm-th-sub { display:block; font-size:12px; color:var(--text-muted); font-weight:400; }
      .mm-box-h.sub { display:flex; align-items:center; gap:8px; }
      .mm-cell-sub { display:block; }

      /* 批 F（2026-09-25）：分段控件整体恒 32px（筛选行控件档），此前 32px 按钮 + 1px 上下边框 = 34px
         ⇒ 货号映射的筛选卡 34px、卡头 59px（契约 57px）。改为 border-box 定高 + 内部按钮吃满。 */
      .mm-seg { display:inline-flex; align-items:stretch; height:32px; border:1px solid var(--border); border-radius:var(--radius-md); overflow:hidden; }
      .mm-seg .btn { border:none; border-radius:0; height:100%; }

      .mm-searchbox { flex:1; min-width:220px; }
      .mm-card-bd { border-top:1px solid var(--border); }
      .mm-card-bd[hidden] { display:none; }
      .mm-sku-foot { display:flex; align-items:center; gap:var(--space-3); padding:var(--space-3) var(--space-4); border-top:1px solid var(--border); background:var(--bg-tertiary); flex-wrap:wrap; }
      .mm-ellip260 { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:260px; }
      .mm-flex1 { flex:1; }
      .mm-td-word { word-break:break-all; }
      .mm-skuitem span, .mm-skuitem b { font-family:inherit; }
      .mm-card-bd .data-table th { position: static; box-shadow: none; } /* 嵌套子表豁免：mm-tbl 已迁 data-table 但仍嵌外层 data-table td 内，sticky 吸顶错乱（V6 §8.1.2 嵌套特例） */
      .mm-valign-top { vertical-align:top; }

    

/* D-298 C2（2026-09-15）：下沉自 modules/app-op-1688offline.js */

      .t1688-off-modal-box { width:700px; max-width:95%; max-height:90vh; overflow-y:auto; }
      .t1688-off-modal-box-lg { width:820px; max-width:95%; max-height:90vh; overflow-y:auto; }
      .t1688-off-modal-box-xl { width:900px; max-width:96%; max-height:92vh; display:flex; flex-direction:column; }
      .t1688-off-preview-body { line-height:1.7; }
      .t1688-off-alert-scroll { max-height:400px; overflow-y:auto; }
      .t1688-off-alert-row { border-bottom:1px dashed var(--border); }
      .t1688-off-form-grid { display:grid; grid-template-columns:1fr 1fr; gap:16px; }
      .t1688-off-stmt-list { border:1px solid var(--border); border-radius:var(--card-radius); max-height:360px; overflow-y:auto; }
      .t1688-off-stmt-actions { padding-top:20px; }
    

/* D-298 C2（2026-09-15）：下沉自 modules/app-sku.js */

      /* ── 编辑抽屉 Tab（复用公共 .fr-utab 下划线类）── */
      .skuMasterEditTabBody{padding:4px 0}
      /* ── 页头 KPI 卡（原型 .kpi）── */
      /* ── seg 双视图（原型 .seg）── */
      .skuM-seg{display:inline-flex;background:var(--bg-tertiary)}
      /* ── 右侧抽屉（原型 .skp-drawer）──
         ⇒ **D3a（2026-09-25）已收编**：私有 `.skuM-drawer(-mask)` + `.d-head|body|foot` 全族删除，
         改走共享 Drawer 组件（宽度 `--drawer-w-xl` = 620px，与原值等值；页签走 `.drawer__tabs` 槽位、
         副标题走 `.drawer__sub`）。现行实现：`modules/core/drawer.js` + `modules/sku/sku-master-edit.js`。 */
      /* ── 新建向导 step-dots（原型 .step-dots）── */
      /* ── 颜色图列表（原型 spec 行）── */
      .skuM-colorimg-row{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--border);border-radius:var(--card-radius);background:var(--bg)}
      .skuM-colorimg-row.empty{border:1px dashed var(--border);background:transparent}
      .skuM-colorimg-row img{width:44px;height:44px;border-radius:var(--radius-medium);object-fit:cover;cursor:zoom-in;border:1px solid var(--border)}
.skuM-colorimg-row .noimg{width:44px;height:44px;border-radius:var(--radius-medium);background:var(--bg-tertiary);border:1px dashed var(--border);display:flex;align-items:center;justify-content:center;color:var(--text-secondary);font-size:var(--fs-body-small)}
      /* ── 成本历史时间线（原型 .tl-*）── */
      /* ── 批量条（原型 .skp-bulkbar）── */
      .skuM-bulkbar{position:fixed;left:50%;transform:translateX(-50%);bottom:24px;background:var(--text-primary);color:var(--text-on-primary);border-radius:12px;padding:10px 16px;display:none;align-items:center;gap:14px;box-shadow:0 12px 32px rgba(31,35,41,.25);z-index:var(--z-sticky);font-size:var(--fs-caption)}
      .skuM-bulkbar.show{display:flex}
      .skuM-bulkbar .count{font-size:var(--fs-caption)}
      .skuM-bulkbar .count b{color:var(--text-on-primary)}
      .skuM-bulkbar .sep{width:1px;height:20px;background:rgba(255,255,255,.25)}
      .skuM-bulkbar .act{display:inline-flex;align-items:center;gap:4px;height:28px;padding:0 12px;border-radius:6px;font-size:var(--fs-micro);background:rgba(255,255,255,.14);color:var(--text-on-primary);border:none;cursor:pointer}
      .skuM-bulkbar .act:hover{background:rgba(255,255,255,.24)}
      .skuM-bulkbar .cancel{color:rgba(255,255,255,.7);font-size:var(--fs-micro);background:none;border:none;cursor:pointer}
    

/* D-298 C2（2026-09-15）：下沉自 modules/app-spec-dict.js */

/* 2026-10-10 收编：`.sd-page` 原为页面私有壳（flex:1 + column + gap:18px），违反 PAGE-LAYOUT §1
   「禁止页面私有壳」⇒ 调用点（modules/app-spec-dict.js）已改用契约壳 `.page-layout`，本规则删除。
   间距随之 18 → 16（老板已确认）。判据：scripts/private-impl-audit.mjs（SHELL_REGISTRY 已移除本条）。 */
/* D-427：.sd-card 已收编为标准 .table-card（接受丢边框/阴影 —— 与单品SKU 对齐） */
.sd-badge-new{display:inline-flex;align-items:center;height:16px;padding:0 6px;border-radius: var(--radius-round);background:var(--primary);color:var(--text-on-primary);font-size:var(--fs-body-small);font-weight: var(--fw-medium);line-height:1}
.sd-domain-tip{font-size:12px;color:var(--text-secondary);background:var(--primary-subtle);border:1px solid var(--border);border-radius: var(--radius-medium);padding:10px 14px;display:flex;align-items:center;gap:8px;line-height:1.6}
.sd-domain-tip svg{width:14px;height:14px;color:var(--primary);flex-shrink:0}
.sd-cats{display:flex;gap:4px;flex-wrap:wrap}
.sd-spacer{flex:1}
.sd-batchbar{display:none;align-items:center;gap:12px;background:var(--primary-subtle);border:1px solid var(--border);border-radius:var(--card-radius);padding:8px 14px;font-size:12px;color:var(--text-secondary)}
.sd-batchbar.show{display:flex}
.sd-batchbar b{color:var(--text-primary)}
.sd-norm{display:none;flex-direction:column;gap:10px;padding:16px}
.sd-norm.show{display:flex}
.sd-norm-head{display:flex;align-items:center;gap:8px;font-size:14px;font-weight: var(--fw-semibold)}
.sd-norm-head svg{width:16px;height:16px;color:var(--primary)}
.sd-norm-desc{font-size:12px;color:var(--text-muted)}
.sd-norm-swatch{width:20px;height:20px;border-radius:6px;border:1px solid rgba(0,0,0,.12);flex-shrink:0}
/* D-427：.sd-table-card 已收编（其 overflow:hidden 是 .table-card 的既有属性） */
.sd-table-wrap{overflow-x:auto}
.sd-checkbox{width:15px;height:15px;accent-color:var(--primary);cursor:pointer}
.sd-mono{font-family:var(--font-mono);font-size:12px}
.sd-chip{display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 8px;border-radius:6px;background:var(--bg-tertiary);font-size:12px;color:var(--text-secondary)}
.sd-chip .sd-dot{width:8px;height:8px;border-radius:50%;border:1px solid rgba(0,0,0,.15);flex-shrink:0}
.sd-swatch-row{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-mono);font-size:12px;color:var(--text-muted)}
.sd-swatch{width:18px;height:18px;border-radius:var(--radius-medium);border:1px solid rgba(0,0,0,.14);flex-shrink:0;box-shadow:inset 0 0 0 1px rgba(255,255,255,.5)}
.sd-ref{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--text-secondary);background:var(--bg);border:1px solid var(--border);border-radius:6px;padding:1px 7px;height:22px;cursor:pointer}
.sd-ref:hover{color:var(--primary);border-color:var(--primary)}
.sd-ref b{font-variant-numeric:tabular-nums}
/* 分页条统一走 window.Pager（D-295，2026-09-14）——本节原 .page-btn 私有/全局类随收口删除 */
.sd-row-ops{display:flex;align-items:center;gap:6px;white-space:nowrap}
.sd-field{margin-bottom:14px}
.sd-field label{display:block;font-size:12px;color:var(--text-secondary);margin-bottom:6px}
.sd-field label .req{color:var(--danger-text);margin-left:2px} /* D29 */
/* 批 D4c（2026-09-25）：私有 `.sd-input` 族已收编 —— 规格字典的输入/文本域改走共享 `.form-input` /
   `.form-textarea`（唯一实现 = styles.css 表单族；错误态 `.is-invalid`、禁用态 `:disabled` 同源）。
   下面两条是**宿主编译期适配**（窄位 104×32 / 表内 112×28），只压缩尺寸、不再复制外观。 */
.sd-grid2{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}
.sd-palette{display:grid;grid-template-columns:repeat(12,1fr);gap:6px;margin-top:4px}
.sd-pal-item{aspect-ratio:1;border-radius:6px;border:2px solid transparent;cursor:pointer;transition:border-color var(--duration-fast)}
.sd-pal-item:hover{border-color:var(--border-strong)}
.sd-pal-item.on{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary)}
.sd-hex-row{display:flex;gap:8px;align-items:center;margin-top:10px}
.sd-hex-preview{width:32px;height:32px;border-radius: var(--radius-medium);border:1px solid rgba(0,0,0,.14);flex-shrink:0}
.sd-hex-input{flex:1;font-family:var(--font-mono);font-size:var(--fs-body-small)}
.sd-tags{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:36px;padding:5px 8px;border:1px solid var(--border-strong);border-radius: var(--radius-medium);cursor:text}
.sd-tags:focus-within{border-color:var(--primary);outline:2px solid var(--primary);outline-offset:1px}
.sd-tags input{flex:1;min-width:90px;border:none;outline:none;height:24px;font-size:var(--fs-body-small);background:none}
.sd-switch{position:relative;width:38px;height:22px;border-radius: var(--radius-round);background:var(--border-strong);transition:background var(--duration-fast);display:inline-block;cursor:pointer}
.sd-switch::after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:var(--card-bg);transition:transform var(--duration-fast);box-shadow:0 1px 2px rgba(0,0,0,.2)}
.sd-switch.on{background:var(--success)}
.sd-switch.on::after{transform:translateX(16px)}
/* 规格字典「引用该字典值的 SKU」抽屉（420px · 自绘 head/body/foot · 无遮罩）
   ⇒ **D3b（2026-09-25）已收编**：私有 `.sd-drawer*` 与自绘关闭钮 `.sd-modal-x*` 全族删除，
   改走共享抽屉形态（`.drawer-backdrop` + `.drawer`，经 `Drawer.open/close`）。
   宽度 420 → 规范档 `--drawer-w-md`(424)；**新增遮罩 + Esc 关闭**（§7 抽屉契约要求，原实现两者都没有）。
   现行实现：`modules/app-spec-dict.js`（模板 + openRefs）+ `modules/core/drawer.js`。 */
.sd-ref-sku{display:flex;align-items:center;justify-content:space-between;padding:9px 10px;border-radius: var(--radius-medium);border:1px solid var(--border);margin-bottom:8px;font-size:var(--fs-body-small)}
.sd-ref-sku:hover{border-color:var(--primary)}
.sd-batch-text{width:100%;min-height:88px;font-family:var(--font-mono);font-size:var(--fs-body-small);line-height:1.6;resize:vertical}
.sd-range{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:12px 0 0}
.sd-range label{font-size:12px;color:var(--text-secondary)}
.sd-range .form-input{width:104px;height:32px;font-size:12px}
.sd-batch-actions{display:flex;align-items:center;gap:10px;margin-top:12px}
.sd-batch-table{width:100%;margin-top:10px;border-collapse:collapse;font-size:12px}
.sd-batch-table th{text-align:left;font-weight: var(--fw-medium);color:var(--text-muted);padding:6px 8px;border-bottom:1px solid var(--border)}
.sd-batch-table td{padding:4px 8px;border-bottom:1px solid var(--border)}
.sd-batch-table .form-input{width:112px;height:28px;font-size:12px}
.sd-batch-table .sd-batch-msg{color:var(--text-muted)}

/* D-298 C2（2026-09-15）：下沉自 modules/app-supply-produce.js */
/* ── D-379 整形：本段原为单行 2174 字符（无法安全维护），拆行并清违规形态 ──
   修：① 四档 11 号字 → 字号下限令牌（§4.1 正文最低 12px）
       ② 规格表表头去全大写 + 字距（§8.1.2 V5 观感出局）
       ③ 建议浮层写死层级 → 层级令牌（§6.3 禁写死）
       ④ 硬编码投影 → 投影令牌；500 字重 → 半粗令牌（§5.4 / §4.2）
   未动：布局、配色、内外边距（保持等价）。 */
.sku-card{border:1px solid var(--border);border-radius:var(--radius-medium);margin-bottom:8px;background:var(--card-bg)}
.sku-card-header{padding:8px 12px;background:var(--bg);border-bottom:1px solid var(--border);display:flex;gap:10px;align-items:center}
.sku-card-body{padding:8px 12px;max-height:200px;overflow-y:auto}
.sku-card-subtotal{padding:4px 0;font-size:12px;font-weight:var(--fw-semibold);color:var(--primary);text-align:right;border-top:1px solid var(--border)}
.sku-card-title{font-weight:var(--fw-semibold);color:var(--text-primary);font-size:var(--fs-body-small)}
.sku-card-info{font-size:var(--fs-body-small);color:var(--text-muted)}
.sku-suggestions{position:absolute;background:var(--card-bg);border:1px solid var(--border);border-radius:var(--radius-medium);max-height:180px;overflow-y:auto;z-index:var(--z-dropdown);min-width:200px;box-shadow:var(--shadow-2)}
.sku-suggestion-item{padding:6px 10px;cursor:pointer;border-bottom:1px solid var(--bg-tertiary);font-size:var(--fs-body-small)}
.sku-suggestion-item:hover{background:var(--bg)}
.sku-suggestion-sku{font-weight:var(--fw-semibold);color:var(--primary)}
.spec-table{width:100%;border-collapse:collapse}
.spec-table th,.spec-table td{padding:4px 6px;text-align:left;border-bottom:1px solid var(--bg-tertiary)}
.spec-table th{font-weight:var(--fw-semibold);font-size:var(--fs-body-small);color:var(--text-muted)}
.spec-row input{width:100%;padding:4px 6px;border:1px solid var(--border);border-radius:var(--radius-medium);font-size:var(--fs-body-small)}
.spec-subtotal{font-size:var(--fs-body-small);color:var(--text-primary);font-weight:var(--fw-semibold);white-space:nowrap}



/* D-298 C2（2026-09-15）：下沉自 modules/finance.js */
/* 批 D4b/D4c（2026-09-25）：财务域的 `.fsal-inp`（输入，39 处）与 `.fsal-lbl`（标签，58 处）**均已收编** ——
   输入 → 共享 `.form-input` / `.form-textarea`；标签 → 共享 `.form-label`（老板 2026-09-25 裁决：
   「保持统一」，接受标签由「500 字重 + 深色」变为共享档的「400 字重 + 灰」）。唯一实现 = styles.css 表单族。 */
/* 批 D5（2026-09-25）：同名 `.btn-danger` 第二定义已删（生效值已并回 styles.css 唯一一份）。 */[id^="fr-income-modal"],[id^="fr-offline-modal"]{display:none}

/* D-298 C2（2026-09-15）：下沉自 modules/app-pay-config.js */
.pc-inp{width:100%;height:34px;padding:0 10px;border:1px solid var(--border);border-radius:var(--input-radius);font-size:var(--fs-body-small);background:var(--bg);color:var(--text-primary);outline:none;box-sizing:border-box}.pc-inp:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary)22}

/* D-298 C2（2026-09-15）：下沉自 modules/app-wms-location.js */
.wl2w-sec{border:1px solid var(--border);border-radius:var(--card-radius);padding:10px 12px;margin-top:10px;background:var(--card-bg)}.wl2w-sec-title{display:flex;align-items:center;gap:6px;font-size:var(--fs-micro);font-weight:var(--fw-medium);margin-bottom:8px}.wl2w-rule{display:flex;gap:6px;align-items:center;border:1px solid var(--border);border-radius:var(--radius-md);padding:6px 8px;margin-top:6px;background:var(--bg)}.wl2w-rule .seg-lv{width:78px;flex:none;font-size:var(--fs-micro);font-weight:var(--fw-medium);display:inline-flex;align-items:center;gap:4px}.wl2w-pvbar{display:flex;gap:8px;flex-wrap:wrap;align-items:stretch;margin-top:2px}.wl2w-stat{flex:1;min-width:130px;border:1px solid var(--border);border-radius:var(--radius-md);padding:6px 10px;background:var(--bg)}.wl2w-stat .lbl{font-size:var(--fs-micro);color:var(--text-secondary)}.wl2w-stat .val{font-size:var(--fs-body-lg);font-weight:var(--fw-medium);line-height:1.4}.wl2w-samples{margin-top:8px;line-height:2}.wl2w-samples .chip{display:inline-block;padding:1px 6px;margin:1px 3px 0 0;border-radius:var(--radius-md);border:1px solid var(--border);font-family:var(--font-mono);font-size:var(--fs-micro)}

/* D-298 C2（2026-09-15）：下沉自 modules/core/searchselect.js */
/* D-299 批85（2026-09-15）：FilterBar 勾选型筛选位唯一形态（label 内含 checkbox，与搜索/选择位同一行基线） */
.fc-check{display:inline-flex;align-items:center;gap:var(--space-2);font-size:var(--fs-caption);color:var(--text-primary);cursor:pointer;white-space:nowrap}
.fc-check input[type="checkbox"]{cursor:pointer}

.ss-item{cursor:pointer;border-bottom:1px solid var(--border,rgba(0,0,0,.06))}.ss-item:hover,.ss-item.ss-active{background:var(--bg-tertiary,rgba(0,0,0,.05))}.ss-dd{position:absolute;z-index:calc(var(--z-modal) + 10);background:var(--card-bg,#fff);border:1px solid var(--border);border-radius: var(--radius-medium);box-shadow:0 6px 20px rgba(0,0,0,.12);max-height:220px;overflow-y:auto}

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/1688-bind-sku.js */

        .bs-hide { display:none !important; }
      

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/offline/offline-customer-detail.js */

      .t1688-cd-col { display:grid; gap:16px; }
      .t1688-cd-head { display:flex; gap:12px; align-items:center; flex-wrap:wrap; }
      .t1688-cd-meta { display:flex; gap:16px; flex-wrap:wrap; font-size:12px; color:var(--text-secondary); }
      /* D-314（2026-09-15）删除本层 V5 KPI 定义（原 5 行）：`.kpi-grid`(4 列/间距 8) 与 `.kpi-card`
   (1px 边框 / radius-md 3px / padding 12) 与 styles.css 的 V6 定义**双源冲突**；因本文件加载在后，
   实际生效的是 V5 那份 ⇒ 连带压掉了 styles.css 的响应式阶梯（≤1024 三列 / ≤768 两列）与 V6 卡片观感
   （无边框 + --card-radius 6px）。唯一源现为 styles.css；`.k-label/.k-value/.k-sub` 三个 V5 名全仓已无引用。 */
      .t1688-cd-row { display:flex; gap:8px; align-items:center; flex-wrap:wrap; padding:var(--space-2); font-size:12px; border-bottom:1px dashed var(--border); }
      .t1688-cd-row > .ml-auto { margin-left:auto; }
      .t1688-cd-row.t1688-cd-tight { padding:4px 0; }
      .t1688-cd-scroll { max-height:240px; overflow-y:auto; border:1px solid var(--border); border-radius:var(--radius-md); }
      .t1688-cd-scroll-sm { max-height:220px; overflow-y:auto; border:1px solid var(--border); border-radius:var(--radius-md); }
      .t1688-cd-scroll-lg { max-height:360px; overflow-y:auto; border:1px solid var(--border); border-radius:var(--radius-md); }
      .t1688-cd-sec-h { display:flex; justify-content:space-between; align-items:center; margin-bottom:6px; }
      .t1688-cd-foot { border-top:1px solid var(--border); padding-top:10px; display:flex; gap:8px; flex-wrap:wrap; }
      .t1688-cd-actions { margin-left:auto; display:inline-flex; gap:8px; align-items:center; flex-wrap:wrap; }
        
      .t1688-cd-dup-box { border:1px solid var(--border); border-radius:var(--radius-md); padding:12px; }
      .t1688-cd-dup-groups { display:grid; gap:8px; max-height:380px; overflow-y:auto; }
    

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/offline/offline-customer.js */

  

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/offline/offline-followup.js */

      .t1688-fu-row { display:flex; gap:8px; align-items:flex-start; padding:var(--space-2) 0; border-bottom:1px solid var(--border); }
      .t1688-fu-scroll { max-height:320px; overflow-y:auto; }
      .t1688-fu-ta { resize:vertical; }
      .t1688-fu-form { border-top:1px solid var(--border); padding-top:12px; }
    

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/offline/offline-order-ops.js */

      .t1688-op-info-box { background:var(--bg-tertiary); border-radius:var(--radius-md); padding:var(--space-3); }
      .t1688-op-img { width:100%; height:100%; object-fit:contain; }
      .t1688-op-img-view { max-width:100%; max-height:70vh; border-radius:var(--radius-md); }
      .t1688-op-log-scroll { max-height:320px; overflow-y:auto; }
      
    

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/offline/offline-orders.js */

      .t1688-o-extra { display:grid; grid-template-columns:1fr 80px 90px 36px; gap:8px; align-items:center; padding:var(--space-3); border:1px dashed var(--border); border-radius:var(--radius-md); background:var(--surface); }
      .t1688-o-items { display:grid; gap:8px; }
      .t1688-o-side { display:flex; flex-direction:column; gap:8px; }
      .t1688-img-pv img { width:100%; height:100%; object-fit:contain; }
      .t1688-pay-row { border-bottom:1px solid var(--border); }
      .t1688-pay-form { border-top:1px solid var(--border); padding-top:12px; }
    

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/offline/offline-statement.js */

    @media print {
      body * { visibility: hidden !important; }
      #stmt-print-area, #stmt-print-area * { visibility: visible !important; }
      #stmt-print-area { position: absolute !important; left: 0; top: 0; width: 100%; margin: 0; padding: 0; box-shadow: none !important; }
      #stmt-print-area .stmt-row { page-break-inside: avoid; }
    }
  

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/online/1688-online-apicsync.js */

      .t1688-sync .kpi-card { flex:1; min-width:200px; }
      .t1688-sync .kpi-value.sync-time { font-size:20px; }
      .t1688-sync .sync-table-wrap { border:none; border-radius:0; background:transparent; }
      .t1688-sync .sync-log-area { padding:12px 24px 16px; }
      .t1688-sync .sync-log-cnt { margin-left:auto; }
      .t1688-sync-inline-actions { display:inline-flex; gap:2px; align-items:center; }
      .t1688-sync-stack { display:flex; flex-direction:column; gap:2px; }
    

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/online/1688-online-bills.js */

      .t1688-bill-tbl { table-layout:fixed; min-width:1000px; }
    

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/online/1688-online-detail.js */

      /* .t1688-dl-grid / -row / -k / -note 已上收 styles.css（D-91，2026-09-10）——
         该类族被 1688-bind-sku.js 抽屉、1688-ui-kit.js、本页三处跨模块共享，
         定义寄生在页面注入块属样式漂移，现归并至 styles.css 统一维护。 */
      /* v3：KPI 分数条容器（卡体复用共享 .kpi-card 族） */
      .t1688-detail #td-kpi-bar { margin-bottom:12px; }
      /* v3：静态 KPI 卡（订单/净实付）去手型 */
            /* v3：行选择复选框 */
      .t1688-detail .td-row-cb { cursor:pointer; accent-color:var(--primary); margin:0; }
      /* v3：缺单品货号行左侧警示色条（对齐待发货页超时/紧急色条范式） */
      .t1688-detail tr.td-row-warn td:first-child { box-shadow: inset 3px 0 0 var(--warning); }
      /* v3：实付列运费小字 */
.t1688-detail .td-freight-mini { font-size:var(--fs-body-small); color:var(--text-secondary); font-variant-numeric:tabular-nums; }
    

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/online/1688-online-profit.js */

      /* D-79 对齐 detail 页范式：待补成本改用左警示条（warning），不用整行浅红危险色 */
      .p1688-urow td:first-child { box-shadow: inset 3px 0 0 var(--warning); }
      .p1688-info-box { background:var(--surface-2); border-radius:var(--radius-md); padding:var(--space-3); margin-bottom:12px; }
      .p1688-suggest { max-height:240px; overflow-y:auto; }
      .p1688-sugg-item { display:flex; justify-content:space-between; align-items:center; gap:8px; padding:var(--space-2) var(--space-3); margin-bottom:4px; border:1px solid var(--border); border-radius:var(--radius-md); background:var(--surface); cursor:pointer; }
      .p1688-ship-col { display:flex; flex-direction:column; gap:var(--space-4); }
      .p1688-tr-head { display:flex; gap:12px; align-items:center; padding:var(--space-3) var(--space-4); background:var(--surface-2); border-radius:var(--radius-md); margin-bottom:14px; }
      .p1688-tr-item { display:flex; gap:var(--space-3); position:relative; padding-bottom:16px; }
      .p1688-tr-rail { width:10px; flex-shrink:0; display:flex; flex-direction:column; align-items:center; }
      .p1688-tr-dot { margin-top:4px; width:10px; height:10px; border-radius:50%; background:var(--bg); flex-shrink:0; }
      .p1688-tr-dot.on { background:var(--primary); }
      .p1688-tr-line { flex:1; width:2px; background:var(--border); margin-top:2px; }
      /* .t1688-dl-row / -k / -note 已上收 styles.css（D-91，2026-09-10）——
         该类族被 1688-bind-sku.js 抽屉、1688-ui-kit.js、本页三处跨模块共享，
         定义寄生在页面注入块属样式漂移，现归并至 styles.css 统一维护。 */
      /* 利润页 KPI 卡语义色（作用域限定，替代旧 t1688-kpi.primary/info）：总收入=primary，成本/毛利率=info，利润=JS 动态上色 */
/* B6/C2（2026-09-24 布局审计）：本页（1688 订单分析）KPI 数值的配色 —— 按**位置**上色。
   ⚠️ 这是一条**页内覆盖组件内部**的规则，登记为显式例外，理由：
     ① 选择器收窄到页唯一容器 `.p1688-kpis`（不越界、不误伤别页）；
     ② `kpiCard(label, value, change, color, icon)` 的 `color` 参数当前**是死的**——
        `KPI_COLOR_MAP` 在 modules/app-core.js 里声明为 `{}` 且全仓无任何赋值处
        ⇒ 全站 13+ 个调用点传的 color 都不生效，配色实际来自 icon 的 fill。
        故本页只能靠 CSS 上色；待 `color` 参数恢复语义后，这三条应删掉、改由组件参数承担。 */
.p1688-kpis .kpi-card:nth-child(1) .kpi-value { color:var(--primary); }
.p1688-kpis .kpi-card:nth-child(2) .kpi-value { color:var(--info); }
.p1688-kpis .kpi-card:nth-child(4) .kpi-value { color:var(--info); }
    

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/offline/offline-customer.js */


      .t1688-cust-op { display:flex; gap:2px; align-items:center; flex-wrap:nowrap; min-width:230px; }
    

/* D-298 C2（2026-09-15）：下沉自 modules/domains/1688/offline/offline-statement.js */

      .t1688-stmt-img { width:40px; height:40px; object-fit:cover; border-radius:var(--radius-md); border:1px solid var(--border); vertical-align:middle; cursor:pointer; }
      /* 对账单打印文档（#stmt-print-area）：宋体纸张排版，非页面 UI。
         单据文档（t1688-doc/db/db-md）整格描边，**声明 doc-table 族属即豁免** .data-table 迁移。
         真源：docs/standards/PAGE-LAYOUT-SPEC.md §5.1「表格族属声明」
         （原注释引用的 DECISIONS.md:747/756 与 V6-COMPONENT-UNIFICATION-PLAN 均已于 2026-09-23 前删除，
          该裁决改由上述入库规范承接 —— 避免"豁免的出处是一份不存在的文档"。） */
      .t1688-doc { max-width:800px; margin:0 auto; font-family:'SimSun','宋体',serif; }
      .t1688-doc-title { font-size:24px; letter-spacing:4px; font-weight:var(--fw-medium); }
      .t1688-doc-table { width:100%; border-collapse:collapse; font-size:var(--fs-body-small); }
      .t1688-doc-table td, .t1688-doc-table th { border:1px solid var(--border); }
      .t1688-doc-table-md { width:100%; border-collapse:collapse; font-size:12px; }
      .t1688-doc-table-md td, .t1688-doc-table-md th { border:1px solid var(--border); }
      .t1688-stmt-row { border-bottom:1px solid var(--border); }
      .stmt-w70 { width:70%; } /* 文档域私有宽度（改名自 w-70：避免与全局列宽字典 w-70=70px 撞名，D-70） */
      .t1688-doc-th-row { background:var(--bg-tertiary); border-bottom:2px solid var(--text-primary); }
    

/* D-298 C2（2026-09-15）：下沉自 modules/shared-styles.js（dt-、pd-、supply- 平行 CSS 族，原由页面运行时注入；本文件对应调用点同批摘除）
   ⚠️ 批 D4a（2026-09-25）：上句里的 **dt-form-input/dt-form-textarea、pd-form-input/pd-form-textarea、
   pd-invalid 五种输入件已收编**（改走共享 `.form-input` / `.form-textarea` / `.form-input.is-invalid`，
   唯一实现在 styles.css 表单族）；同行的 `.dt-form-group/-label/-row`、`.pd-form-group/-label/-row` 等
   布局件**仍在用**，保留就地。 */
.dt-badge{padding:2px 8px;border-radius:12px;font-size:var(--fs-body-small);font-weight: var(--fw-medium)}.dt-form-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.pd-actions{display:flex;gap:6px}.pd-form-group{margin-bottom:14px}.pd-form-row-4{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.pd-image-preview{display:inline-block;position:relative;margin:4px}.pd-image-preview img{width:80px;height:80px;object-fit:cover;border-radius: var(--radius-medium);border:1px solid var(--border)}.pd-image-preview span{position:absolute;top:-6px;right:-6px;cursor:pointer;color:var(--danger-text);font-size:16px;font-weight:var(--fw-medium);background:var(--card-bg);border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;box-shadow:0 1px 4px rgba(0,0,0,.15)}.pd-customer-dropdown .pd-dropdown-item:hover{background:var(--bg)}

/* 批 D7b（2026-09-25）：私有 `.t1688-link-btn`（语义描边小按钮，1688 线下订单 3 处）已收编 →
   共享 `.btn .btn-sm` + 新增 `.btn-{primary,success,warning}-outline`（只补有消费者的三档）。
   原私有的 `.danger` 档**零消费**，随本批一并删除（需要时再立）。 */
/* 批 D7（2026-09-25）：私有"低强调危险按钮"三条已收编 → 共享 `.btn .btn-sm .btn-danger-ghost`
   （共享族对危险动作的既有声明：**红字 + hover 浅红底**）——`.sku-remove-btn`（卡片脚「删除」）、
   `.spec-remove-btn`（表内 × ）、`.stmt-img-clear-btn`（抽屉「清除图片」）。 */
/* 批 D14（2026-09-25）：四个「同值别名」私有类收编（声明集与共享类完全相同 ⇒ 零观感）：
   `.c-danger-text`→共享 `.c-danger`（同一条 `color: var(--danger-text)`）· `.c-warning-text`→`.c-warning` ·
   `.supply-print-sign`→`.flex-1` · `.supply-diff-cell` 的 `white-space:nowrap`→`.nowrap`
   ⚠️ `.supply-diff-cell` 类名**保留在 markup 里**，但它是 **JS 钩子**（app-supply-ship.js 用它 `closest()` 定位可编辑格），
   不是样式类 —— 样式已交给 `.nowrap`。 */
.supply-actions{display:flex;gap:6px;flex-wrap:wrap}
/* 2026-09-24（布局判据 ⑦ 同类收口）：WMS 预警页（modules/app-wms-alert.js）的数据卡里有一层
   「多页签共用渲染体」#wa-body（三个页签都往里写：预警 / 补货建议 / 日结对账）。
   它若是**块级**，内部的 `.table-scroll` 就失去 flex 上下文 ⇒ 余高没人吃，
   **空白落在分页条下方**（实测 455px，肉眼即「分页条不贴卡底」）。
   收窄到本页唯一 id：允许"透明包裹"，但必须是「吃满余高的 flex 列」。
   口径见 docs/FLOW.md §5.1「数据卡直接子级只许三类」。 */
#wa-body { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
