/* ============================================================
   生鲜禽类加工库存系统 — 全局 UI 一致性基线
   作用：
     1. 声明设计令牌（颜色 / 字体 / 圆角 / 间距 / 边框）
     2. 归一化所有原生表单控件（不需要改模板即可生效）
     3. 提供语义化工具类（.card / .btn / .table-std 等）
     4. 旧的页内 inline style 因特异性更高会继续覆盖——迁移工作留给后续增量做。
   约束：
     - 只加不删，不破坏已有布局
     - 避免全局 !important
     - IE11+ 兼容
   ============================================================ */

/* ============================================================
   【后续页面开发样式约定】（Batch 1~9 UI 重构收口后确立，2026-04）
   Batch 1~9 已迁移 50+ 页面 / ~1064 处 inline style，本项目已形成
   稳定的三层类体系。新页面 / 新单据 / 新报表必须遵守以下约定：

   ── 基本原则 ─────────────────────────────────
   1.  新页面 extends `base_app.html`（扫码页用 `scanner/base_scanner.html`；
       终端页用 `terminal/base_terminal.html`，其样式自成体系，不纳入本文件）。
   2.  优先复用领域类：`.fin-*`（财务）/ `.doc-*`（单据）/ `.rpt-*`（报表）/
       `.imp-*`（导入）/ `.diff-*`（版本对比）/ `.stc-/.stl-/.str-*`（盘点）
       / `.scan-*`（扫码）/ `.dash-*`（首页）；不为同类需求另起前缀。
   3.  按钮统一用 `.btn / .btn-primary / .btn-ghost / .btn-danger / .btn-sm`，
       禁止再写彩色按钮 inline。
   4.  状态徽章统一用 `.ui-badge / .ui-badge-success/-warn/-danger/-info/-neutral`。
   5.  表格用 `.goods-table` 或 `.table-std`；合计行用 `.rpt-total-row`。

   ── 禁止的 inline style ─────────────────────
   6.  禁止 `style="color:#xxx"` → 改用 `.u-pos / .u-neg / .u-credit /
       .u-fg-warn / .u-fg-info / .u-fg-dim / .u-muted`。
   7.  禁止 `style="font-weight:600/700"` → 改用 `.u-bold / .u-bold-600 /
       .u-bold-700`。
   8.  禁止 `style="text-align:right"` → 改用 `.u-right` 或 th 右对齐 `.th-right`。
   9.  禁止 `style="margin-top/bottom:X"` → 改用 `.u-mt-2/3/4` 或 `.u-mb-2/3/4`。
   10. 禁止 `style="width:NNpx"` 于表单行内输入 → 改用 `.in-w-60 / -100 /
       -120 / -140 / -200`。
   11. 禁止 `style="font-size:13px"` → 改用 `.u-hint` 或令牌 `--fs-xs/sm/md/base/lg/xl`。
   12. 禁止新增任意十六进制颜色常量 → 必须映射到 `--color-*` 令牌。
   13. 圆角必须用 `--radius-sm/md/lg`；间距必须用 `--space-1..6`。

   ── 允许保留的 inline style ─────────────────
   14. Django `{% widthratio %}` 渲染的动态百分比 `style="width:NN%"`。
   15. SVG `stroke-dashoffset` / `transform` 等动态几何属性。
   16. JS 动态插入的 `style="width:${pct}%"` 等运行时计算值。

   ── 新增类的规则 ───────────────────────────
   17. 确需新增领域类时：用 3~4 字母模块前缀（如 `.pur-* / .ret-*`），
       附到本文件末尾对应 Batch 分区或新开 `Batch N:` 注释段。
   18. 每个新类写一行用途注释；不要堆砌同类变体（如 10 个 margin 值）。
   19. 如发现已有类名冲突，优先重命名新类，不改旧类（避免回归）。

   ── 机会式迁移 ─────────────────────────────
   20. 修改现有页面时，顺手把遇到的 inline style 迁到类体系；
       不单独立项做"批量清洗"。
   21. Code review 时应拦截违反约定的新增 inline style。

   ── 保持暂缓的页面 ─────────────────────────
   22. `templates/labels/*`、`templates/inbound/print_label*.html` 打印类页面
       保持独立样式，不纳入本体系（@page 规则互扰）。
   23. `terminal/terminal_dashboard.html`、`inbound/stocktake_session_run.html`
       的原生 `<style>` 块属于"操作关键 UI"，除非业务明确要求，不动。
   ============================================================ */

:root {
  /* —— 主色（2026 视觉翻新：清新叶绿） —— */
  --color-primary-900: #1b6e34;
  --color-primary-700: #2e9e4f;
  --color-primary-500: #43b163;
  --color-primary-300: #a8d8b6;
  --color-primary-100: #e9f5ec;
  --color-primary-50:  #f0f7f1;

  /* —— 中性 —— */
  --color-text:        #1f2a24;
  --color-text-muted:  #6d756f;
  --color-text-weak:   #9aa39c;
  --color-bg:          #eef3ef;
  --color-bg-card:     #ffffff;
  --color-border:      #dce3dd;
  --color-border-soft: #e9efe9;

  /* —— 状态色 —— */
  --color-danger:      #c62828;
  --color-danger-bg:   #ffebee;
  --color-danger-bd:   #ef9a9a;
  --color-warn:        #e65100;
  --color-warn-bg:     #fff8e1;
  --color-warn-bd:     #ffe082;
  --color-info:        #1565c0;
  --color-info-bg:     #e3f2fd;
  --color-info-bd:     #90caf9;

  /* —— 字体 —— */
  --font-base: "Microsoft YaHei", "微软雅黑", "PingFang SC", "Helvetica Neue", Arial, sans-serif;
  --font-mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;

  /* —— 尺寸 —— */
  --radius-sm: 6px;
  --radius-md: 10px;
  --radius-lg: 14px;

  /* —— 阴影（视觉翻新新增：柔和卡片投影） —— */
  --shadow-card:       0 1px 3px rgba(20,45,28,0.06), 0 1px 2px rgba(20,45,28,0.05);
  --shadow-card-hover: 0 6px 18px rgba(20,45,28,0.10);

  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;

  --fs-xs: 11px;
  --fs-sm: 12px;
  --fs-md: 13px;
  --fs-base: 14px;
  --fs-lg: 16px;
  --fs-xl: 18px;
}

/* ────────────────────────────────────────────
   全局表单控件归一化（element 选择器，低特异性）
   ──────────────────────────────────────────── */
body,
button,
input,
select,
textarea {
  font-family: var(--font-base);
}

input[type="text"],
input[type="password"],
input[type="number"],
input[type="email"],
input[type="tel"],
input[type="date"],
input[type="datetime-local"],
input[type="time"],
input[type="search"],
input[type="url"],
select,
textarea {
  font-family: var(--font-base);
  font-size: var(--fs-md);
  color: var(--color-text);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  padding: 6px 8px;
  background: var(--color-bg-card);
  outline: none;
  transition: border-color 0.15s ease;
}

input[type="text"]:focus,
input[type="password"]:focus,
input[type="number"]:focus,
input[type="email"]:focus,
input[type="tel"]:focus,
input[type="date"]:focus,
input[type="datetime-local"]:focus,
input[type="time"]:focus,
input[type="search"]:focus,
input[type="url"]:focus,
select:focus,
textarea:focus {
  border-color: var(--color-primary-500);
}

input[disabled],
select[disabled],
textarea[disabled] {
  background: #f5f5f5;
  color: var(--color-text-weak);
  cursor: not-allowed;
}

button {
  font-family: var(--font-base);
  font-size: var(--fs-md);
}

/* ────────────────────────────────────────────
   表格归一化（只作用于无自定义类的原生 table）
   ──────────────────────────────────────────── */
table.table-std {
  border-collapse: collapse;
  width: 100%;
  background: var(--color-bg-card);
  font-size: var(--fs-md);
}
table.table-std th,
table.table-std td {
  border: 1px solid var(--color-border);
  padding: 6px 10px;
  text-align: left;
  vertical-align: middle;
}
table.table-std thead th {
  background: var(--color-primary-50);
  color: var(--color-primary-900);
  font-weight: 600;
  border-color: var(--color-border-soft);
}
table.table-std tbody tr:hover {
  background: var(--color-primary-50);
}

/* ────────────────────────────────────────────
   卡片 / 面板
   ──────────────────────────────────────────── */
.ui-card {
  background: var(--color-bg-card);
  border: 1px solid var(--color-border-soft);
  border-radius: var(--radius-md);
  padding: var(--space-5);
  box-shadow: var(--shadow-card);
}
.ui-card + .ui-card { margin-top: var(--space-4); }

.ui-card-title {
  font-size: var(--fs-lg);
  font-weight: 700;
  color: var(--color-primary-900);
  margin-bottom: var(--space-3);
  padding-bottom: var(--space-2);
  border-bottom: 1px solid var(--color-border-soft);
}

/* ────────────────────────────────────────────
   按钮工具类
   ──────────────────────────────────────────── */
.btn {
  display: inline-block;
  padding: 7px 16px;
  border-radius: var(--radius-sm);
  border: 1px solid transparent;
  font-size: var(--fs-md);
  font-family: var(--font-base);
  font-weight: 600;
  cursor: pointer;
  text-decoration: none;
  line-height: 1.5;
  transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
}
.btn-primary {
  background: var(--color-primary-700);
  color: #fff;
  border-color: var(--color-primary-700);
  box-shadow: 0 1px 2px rgba(20,45,28,0.12);
}
.btn-primary:hover { background: var(--color-primary-900); border-color: var(--color-primary-900); }

.btn-ghost {
  background: #fff;
  color: var(--color-primary-900);
  border-color: var(--color-primary-300);
}
.btn-ghost:hover { background: var(--color-primary-100); }

.btn-danger {
  background: var(--color-danger);
  color: #fff;
  border-color: var(--color-danger);
}
.btn-danger:hover { background: #a71f1f; }

.btn-sm { padding: 3px 10px; font-size: var(--fs-sm); }

/* ────────────────────────────────────────────
   徽章（状态标记）
   ──────────────────────────────────────────── */
.ui-badge {
  display: inline-block;
  padding: 1px 8px;
  border-radius: 10px;
  font-size: var(--fs-xs);
  line-height: 1.6;
  font-weight: 600;
  border: 1px solid transparent;
}
.ui-badge-success { background: var(--color-primary-100); color: var(--color-primary-900); border-color: var(--color-primary-300); }
.ui-badge-warn    { background: var(--color-warn-bg);     color: var(--color-warn);         border-color: var(--color-warn-bd); }
.ui-badge-danger  { background: var(--color-danger-bg);   color: var(--color-danger);       border-color: var(--color-danger-bd); }
.ui-badge-info    { background: var(--color-info-bg);     color: var(--color-info);         border-color: var(--color-info-bd); }
.ui-badge-neutral { background: #f5f5f5;                  color: var(--color-text-muted);   border-color: var(--color-border); }

/* ────────────────────────────────────────────
   链接（保持绿色主题一致）
   ──────────────────────────────────────────── */
a { color: var(--color-primary-700); }
a:hover { color: var(--color-primary-900); }

/* ────────────────────────────────────────────
   通用工具
   ──────────────────────────────────────────── */
.u-muted { color: var(--color-text-muted); }
.u-mono  { font-family: var(--font-mono); }
.u-right { text-align: right; }
.u-center { text-align: center; }
.u-mt-2 { margin-top: var(--space-2); }
.u-mt-3 { margin-top: var(--space-3); }
.u-mt-4 { margin-top: var(--space-4); }
.u-mb-2 { margin-bottom: var(--space-2); }
.u-mb-3 { margin-bottom: var(--space-3); }
.u-mb-4 { margin-bottom: var(--space-4); }

/* 正负金额颜色语义（报表/财务汇总通用） */
.u-pos      { color: var(--color-primary-700); }   /* 正向/加项（绿） */
.u-neg      { color: var(--color-danger); }        /* 负向/减项/欠款（红） */
.u-credit   { color: var(--color-info); }          /* 预收/预付（蓝） */
.u-hint     { color: var(--color-text-weak); font-size: var(--fs-sm); }
.u-bold     { font-weight: 600; }
.u-bold-strong { font-weight: 700; }
.u-label-sm { font-size: 12px; color: var(--color-text-muted); display: block; }

/* 报表通用：月份导航 + 表格合计行 + 空态
   .rpt-filter 本身的布局/控件统一规格见 base_app.html 的 .list-filter 家族
   规则，这里不再重复。 */
.rpt-year-input { width: 80px; }
.rpt-nav   { margin-bottom: 1rem; }
.rpt-empty { color: var(--color-text-weak); }
.rpt-note  { font-size: 12px; color: var(--color-text-weak); margin-top: 1rem; }
.rpt-total-row { font-weight: 700; background: #f5f5f5; }
.rpt-total-row.is-highlight { background: var(--color-primary-100); }
.rpt-subtotal-row { background: #f8f8f8; }

/* ────────────────────────────────────────────
   通用原子（跨模块复用）
   ──────────────────────────────────────────── */
.u-inline-form { display: inline; }
.u-row-voided  { opacity: 0.5; }
.u-required    { color: var(--color-danger); }
.u-mono-sm     { font-family: var(--font-mono); font-size: 12px; }
.fin-doc-action-form {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  flex-wrap: wrap;
}
.fin-doc-action-form input[type="text"] {
  width: 11rem;
  min-height: 2rem;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  padding: 0.25rem 0.45rem;
  font: inherit;
}

/* 文本按钮（红色危险动作） */
.btn-link-danger {
  color: var(--color-danger);
  background: transparent;
  border: 1px solid transparent;
  padding: 0.35rem 0.7rem;
  cursor: pointer;
  font-size: var(--fs-sm);
}
.btn-link-danger:hover { background: var(--color-danger-bg); }

/* 财务单据通用（收款/付款/资金账户） */
.fin-form         { max-width: 45rem; }
.fin-form-sm      { max-width: 40rem; }
.fin-form input[type="text"],
.fin-form input[type="date"],
.fin-form input[type="number"],
.fin-form select  { padding: 5px; }
.fin-form .full   { width: 100%; }
.fin-form .w-150  { width: 150px; }
.fin-form-actions { margin-top: 16px; }

.fin-detail-table { max-width: 45rem; }
.fin-list-table   { max-width: 80rem; }
.fin-accounts-table { max-width: 70rem; }
.fin-flow-table   { max-width: 75rem; }

.fin-status-draft     { color: var(--color-warn); }
.fin-status-confirmed { color: var(--color-primary-700); }
.fin-status-voided    { color: var(--color-text-weak); }
.fin-status-strong    { font-weight: 700; }

.fin-big-amt          { font-weight: 700; font-size: 1.1rem; }
.fin-section-title    { font-size: 1.05rem; margin-top: 1.25rem; }

.fin-list-warn {
  color: var(--color-danger);
  margin-top: 1rem;
}

/* 单据表单字段行：多字段横排（新建入库/出库/退货等） */
.doc-field-row { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 1rem; }
.doc-field-row label,
.doc-field-col label { font-size: 12px; color: var(--color-text-muted); display: block; }
.doc-field-col { display: inline-block; }
.doc-remark-input { width: 100%; max-width: 40rem; }
.doc-reason-input { width: 100%; max-width: 30rem; }

/* 仓库前置选择条（其他出库先选仓库） */
.doc-prefilter-bar {
  margin-bottom: 1rem; padding: 12px;
  background: #fafff5;
  border: 1px solid var(--color-primary-300);
  border-radius: var(--radius-md);
}

/* 单据明细行内输入宽度 */
.in-w-60  { width: 60px; }
.in-w-100 { width: 100px; }
.in-w-120 { width: 120px; }
.in-w-140 { width: 140px; }
.in-w-200 { width: 200px; }

/* 动态行（入库明细增加行） */
.oi-line { display: flex; gap: 8px; margin-bottom: 10px; align-items: flex-end; flex-wrap: wrap; }

/* ============== Batch 6: Scanner + Dashboard ============== */

/* 扫码页面共享布局（粘性头+反馈+操作行） */
.scan-h1            { font-size: 1.25rem; margin: 0 0 0.35rem; }
.scan-panel         { border: 1px solid var(--color-border); border-radius: 8px; padding: 0.55rem 0.65rem; margin: 0; }
.scan-panel-lg      { border: 1px solid var(--color-border); border-radius: 8px; padding: 0.6rem; }
.scan-panel-mb      { margin-bottom: 0.55rem; }
.scan-panel-mb-lg   { margin-bottom: 0.7rem; }
.scan-panel-mb-xl   { margin-bottom: 1rem; }

.scan-info-line     { margin: 0 0 0.2rem; font-size: 0.92rem; }
.scan-info-line-last{ margin: 0; font-size: 0.92rem; }

.scan-layout-fixed-top { position: sticky; top: 0; z-index: 21; background: #fff; padding-bottom: 0.3rem; border-bottom: 1px solid #e5e5e5; margin-bottom: 0.35rem; }
.scan-layout-fixed-mid { position: sticky; top: 5.35rem; z-index: 20; background: #fff; padding-bottom: 0.35rem; border-bottom: 1px solid #e5e5e5; margin-bottom: 0.5rem; }
.scan-layout-scroll    { max-height: calc(100vh - 16rem); overflow: auto; padding-right: 0.1rem; }

.scan-section-title { font-size: 1rem; margin: 0 0 0.4rem; }
.scan-section-title-mt { font-size: 1rem; margin: 0 0 0.45rem; }
.scan-config-title  { font-size: 1.2rem; margin: 0 0 0.65rem; }

/* 扫码反馈卡 */
.scan-feedback { margin: 0 0 0.45rem; padding: 0.62rem; border-radius: 8px; text-align: center; border: 2px solid transparent; }
.scan-feedback-valid  { background: #e9f8ef; border-color: #88d3a6; color: #1f6f3a; }
.scan-feedback-repeat { background: #fff8e6; border-color: #f2bf66; color: #7a5a13; }
.scan-feedback-error  { background: #fdecec; border-color: #ef9a9a; color: #8e2f2f; }
.scan-feedback-title  { font-size: 1.3rem; font-weight: 800; line-height: 1.1; }
.scan-feedback-goods  { margin-top: 0.25rem; font-size: 1.55rem; font-weight: 900; line-height: 1.16; color: #0f3d1d; word-break: break-word; }
.scan-feedback-metrics { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.42rem; margin: 0.48rem 0 0; }
.scan-feedback-metric { padding: 0.38rem 0.3rem; border-radius: 7px; background: rgba(255,255,255,0.72); border: 1px solid rgba(31,111,58,0.16); }
.scan-feedback-metric span { display: block; font-size: 0.78rem; font-weight: 700; color: #4f6f5b; line-height: 1.1; }
.scan-feedback-metric strong { display: block; margin-top: 0.08rem; font-size: 1.18rem; line-height: 1.18; color: #111827; word-break: break-word; }
.scan-feedback-meta { margin-top: 0.42rem; padding-top: 0.38rem; border-top: 1px solid rgba(31,111,58,0.16); color: #405146; font-size: 0.82rem; line-height: 1.35; text-align: left; word-break: break-all; }
.scan-feedback-msg    { font-size: 0.9rem; margin-top: 0.38rem; font-weight: 700; }

/* 页面级 flash 提示（扫码转仓页顶部） */
.scan-flash { margin: 0 0 0.75rem; padding: 0.65rem; border-radius: 6px; border: 1px solid transparent; }
.scan-flash-ok    { background: #e9f8ef; border-color: #b3e5c7; color: #1f6f3a; }
.scan-flash-warn  { background: #fff8e6; border-color: #f2d188; color: #7a5a13; }
.scan-flash-error { background: #fdecec; border-color: #f2b3b3; color: #8e2f2f; }

/* 扫码输入框和主按钮 */
.scan-input        { width: 100%; padding: 0.56rem; font-size: 1.05rem; box-sizing: border-box; margin: 0 0 0.45rem; }
.scan-form         { margin: 0 0 0.45rem; }
.scan-btn-submit   { width: 100%; font-size: 1rem; padding: 0.52rem 0.6rem; }

/* 操作按钮行（清空/确认/返回 横向 flex） */
.scan-action-row   { display: flex; gap: 0.45rem; flex-wrap: wrap; }
.scan-action-col-a { flex: 1 1 9rem; }
.scan-action-col-b { flex: 2 1 13rem; }
.scan-btn-row-sm   { width: 100%; font-size: 0.96rem; padding: 0.5rem 0.55rem; }
.scan-btn-row-strong { width: 100%; font-size: 0.96rem; font-weight: 700; border-width: 2px; padding: 0.5rem 0.55rem; }
.scan-btn-link-ctr { text-align: center; font-size: 0.96rem; padding: 0.5rem 0.55rem; }

/* 作业配置区（开始扫码前的选仓表单） */
.scan-config-label { display: block; margin-bottom: 0.25rem; }
.scan-config-select{ width: 100%; padding: 0.6rem; font-size: 1.05rem; margin: 0 0 0.65rem; }
.scan-config-select-last { width: 100%; padding: 0.6rem; font-size: 1.05rem; margin: 0 0 0.8rem; }
.scan-config-start { width: 100%; font-size: 1.15rem; }
.scan-config-back  { margin-top: 0.75rem; text-align: center; }
.scan-config-back-link { font-size: 0.96rem; }

.scan-session-strip { display: grid; grid-template-columns: 0.8fr 1.7fr 0.8fr; gap: 0.45rem; align-items: center; }
.scan-session-strip > div { min-width: 0; }
.scan-session-label { display: block; color: var(--color-text-muted); font-size: 0.72rem; line-height: 1.15; }
.scan-session-strip strong { display: block; font-size: 0.92rem; line-height: 1.22; word-break: break-word; }

/* 扫码批次销售扣减确认 */
.batch-consume-panel { margin: 0.55rem 0; padding: 0.6rem; border: 2px solid #2e7d32; border-radius: 8px; background: #f7fff7; }
.batch-consume-title { font-size: 1.08rem; font-weight: 800; color: #1b5e20; margin-bottom: 0.35rem; }
.batch-consume-row   { font-size: 0.94rem; margin: 0 0 0.22rem; }
.batch-consume-label { display: block; font-size: 0.92rem; font-weight: 700; margin: 0.45rem 0 0.2rem; }

/* 统计芯片（有效/异常/重复） */
.scan-stats-row { display: flex; gap: 0.45rem; flex-wrap: wrap; margin: 0 0 0.55rem; }
.scan-stat-chip { padding: 0.42rem; border: 1px solid var(--color-border); border-radius: 6px; min-width: 7.2rem; font-size: 0.92rem; }

.scan-empty-p   { margin: 0 0 0.75rem; }
.scan-empty-p-0 { margin: 0; }
.scan-table-tight { margin: 0 0 0.7rem; }
.scan-table-m0    { margin: 0; }

.scan-recent-list { display: grid; gap: 0.42rem; margin-bottom: 0.7rem; }
.scan-recent-item { border: 1px solid var(--color-border); border-left: 4px solid var(--color-primary-700); border-radius: 8px; background: #fff; padding: 0.48rem 0.55rem; }
.scan-recent-main { font-size: 1.04rem; font-weight: 800; line-height: 1.22; color: #1f2937; word-break: break-word; }
.scan-recent-sub { margin-top: 0.12rem; color: var(--color-text-muted); font-size: 0.78rem; line-height: 1.2; word-break: break-all; }
.scan-recent-meta { display: flex; flex-wrap: wrap; gap: 0.3rem 0.55rem; margin-top: 0.24rem; font-size: 0.82rem; color: #374151; }

/* ============== 首页仪表盘 ============== */

.dash-workday-banner {
  padding: 10px 14px;
  background: #f1f8e9;
  border-left: 4px solid var(--color-primary-700);
  border-radius: 4px;
  margin: 12px 0;
}
.dash-workday-title { font-size: 1.05rem; }
.dash-workday-meta  { color: var(--color-text-muted); margin-left: 8px; font-size: 0.9em; }
.dash-snap-link     { font-size: 12px; color: var(--color-text-muted); margin-top: -4px; }

/* stat-value 尺寸与颜色变体 */
.dash-val           { font-size: 1.4rem; }
.dash-val-lg        { font-size: 1.5rem; }
.dash-val-pos       { color: var(--color-primary-700); }
.dash-val-neg       { color: var(--color-danger); }
.dash-val-warn      { color: #e65100; }
.dash-val-info      { color: #1565c0; }
.dash-unit          { font-size: 0.7rem; color: var(--color-text-weak); }
.dash-unit-lg       { font-size: 0.8rem; color: var(--color-text-weak); }
.dash-user-line     { margin-top: 20px; }

/* ============== Batch 7: Excel 导入预览共享类 ============== */

/* Django messages flash */
.imp-flash-list  { margin-bottom: 1rem; }
.imp-flash-item  { padding: 8px 12px; border-radius: 4px; margin-bottom: 6px; }
.imp-flash-error   { background: #fce4ec; }
.imp-flash-success { background: #e8f5e9; }
.imp-flash-info    { background: #fff3e0; }

/* 预选客户提示横幅 */
.imp-customer-banner {
  background: #e3f2fd; border: 1px solid #90caf9;
  padding: 10px 16px; border-radius: 4px;
  margin-bottom: 1rem; font-size: 13px;
}
.imp-customer-banner-hint { color: #888; margin-left: 8px; }
.imp-customer-banner-back { margin-left: 12px; color: #1565c0; }

/* 上传区（两步：下载模板 / 上传文件） */
.imp-upload-box    { max-width: 100%; background: #f5f5f5; }
.imp-step-title    { margin: 0 0 10px; font-weight: 600; }
.imp-step-title-mt { margin: 16px 0 10px; font-weight: 600; }
.imp-hint-muted    { color: var(--color-text-weak); font-size: 12px; margin-left: 10px; }
.imp-file-input {
  margin-right: 10px;
  font-size: 14px;
  color: #1f2937;
  padding: 0 8px 0 0;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  background: #fff;
  cursor: pointer;
  vertical-align: middle;
  height: 36px;
  line-height: 36px;  /* 让"未选择文件"等文字纵向居中 */
}
/* 浏览器原生"选择文件"伪按钮：和下载模板/上传按钮同尺寸 + 居中 */
.imp-file-input::-webkit-file-upload-button,
.imp-file-input::file-selector-button {
  font-size: 14px;
  font-weight: 600;
  padding: 0 16px;
  margin-right: 10px;
  background: #2e7d32;
  color: #fff;
  border: 0;
  border-radius: 4px 0 0 4px;
  cursor: pointer;
  transition: background 0.15s;
  height: 36px;
  line-height: 36px;  /* 文字纵向居中 */
  text-align: center;
}
.imp-file-input::-webkit-file-upload-button:hover,
.imp-file-input::file-selector-button:hover { background: #1a4a2d; }

/* 上传步骤里三颗按钮统一尺寸：下载模板 / 上传并解析 / 选取文件伪按钮 */
.imp-upload-box .btn-primary,
.imp-upload-box .btn-secondary,
.imp-upload-box button[type="submit"] {
  font-size: 14px;
  font-weight: 600;
  padding: 0 16px;
  height: 36px;
  line-height: 1;
  border-radius: 4px;
  vertical-align: middle;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}

/* 预览容器 */
.imp-preview-box   { max-width: 100%; background: #fff; border: 1px solid var(--color-border); }
.imp-preview-title { margin: 0 0 12px; font-size: 16px; }
.imp-summary-table { margin-bottom: 12px; }
.imp-warning-count { color: #b26a00; }

/* 通告条（版本更新 / 校验错误 / 版本阻止） */
.imp-notice        { border-radius: 4px; padding: 10px 14px; margin-bottom: 14px; }
.imp-notice-version{ background: #fff8e1; border: 1px solid #ffe082; }
.imp-notice-blocked{ background: #fce4ec; border: 1px solid #ef9a9a; }
.imp-notice-errors { background: #fce4ec; border: 1px solid #ef9a9a; }
.imp-notice-title        { margin: 0; font-weight: 600; }
.imp-notice-title-version{ color: #e65100; }
.imp-notice-title-blocked{ color: var(--color-danger); }
.imp-notice-title-errors { margin: 0 0 6px; font-weight: 600; color: var(--color-danger); }
.imp-error-list    { margin: 0; padding-left: 20px; color: #b71c1c; font-size: 13px; }

/* 预览表格 */
.imp-scroll-x      { max-width: 100%; overflow-x: auto; }
.imp-data-table    { font-size: 13px; }
.imp-row-error     { background: #fce4ec; }
.imp-row-warn      { background: #fff8e1; }

/* 行内状态单元格 */
.imp-cell-ok       { color: var(--color-primary-700); }
.imp-cell-warn     { color: #b26a00; font-weight: 600; }
.imp-cell-error    { color: var(--color-danger); font-weight: 600; }
.imp-cell-spec     { font-size: 12px; color: #555; }
.imp-cell-match-ok { color: var(--color-primary-700); font-weight: 600; }
.imp-cell-match-warn { color: #b26a00; font-weight: 600; }
.imp-cell-sub      { font-size: 11px; color: var(--color-text-muted); }
.imp-cell-sub-info { font-size: 11px; color: #1565c0; }
.imp-cell-sub-dim  { font-size: 11px; color: var(--color-text-weak); }
.imp-cell-hint-info{ font-size: 10px; color: #1565c0; }
.imp-cell-hint-warn{ font-size: 10px; color: #e65100; }
.imp-cell-autogen  { font-size: 11px; margin-left: 6px; }
.imp-sub-errlist   { margin: 2px 0 0; padding-left: 16px; font-size: 11px; color: #b71c1c; }
.imp-sub-warnlist  { margin: 2px 0 0; padding-left: 16px; font-size: 11px; color: #8a5a00; }

/* 底部操作行 */
.imp-actions       { margin-top: 16px; }
.imp-btn-disabled  { background: #bdbdbd; cursor: not-allowed; }
.imp-actions-hint  { color: var(--color-danger); font-size: 13px; }
.imp-inline-form   { display: inline; }

/* ============== Batch 8: Version Diff + Stocktake + Customer Dashboard ============== */

/* 通用语义色 utilities（可跨页面） */
.u-fg-warn { color: #e65100; }
.u-fg-info { color: #1565c0; }
.u-fg-dim  { color: #bbb; }
.u-bold-600 { font-weight: 600; }
.u-bold-700 { font-weight: 700; }
.u-strike  { text-decoration: line-through; }

/* ---------- 版本对比 diff ---------- */
.diff-summary-box {
  max-width: 100%;
  background: #e3f2fd;
  border: 1px solid #90caf9;
}
.diff-summary-title { margin: 0 0 10px; font-size: 15px; }
.diff-header-table  { max-width: 42rem; margin-bottom: 1.5rem; }

.diff-section-h3    { font-size: 14px; margin-bottom: 6px; }
.diff-section-added     { color: var(--color-primary-700); }
.diff-section-removed   { color: var(--color-danger); }
.diff-section-changed   { color: #e65100; }
.diff-section-unchanged { color: var(--color-text-muted); }

.diff-scroll-wrap { max-width: 80rem; overflow-x: auto; margin-bottom: 1.2rem; }
.diff-table       { font-size: 13px; }
.diff-row-added   { background: #e8f5e9; }
.diff-row-removed { background: #fce4ec; }
.diff-row-changed { background: #fff3e0; }

.diff-spec        { font-size: 12px; color: #555; }
.diff-spec-strike { font-size: 12px; color: #999; text-decoration: line-through; }
.diff-delta       { margin-left: 6px; font-weight: 600; }
.diff-delta-neg   { color: var(--color-danger); }
.diff-delta-pos   { color: var(--color-primary-700); }
.diff-delta-total { margin-left: 8px; font-weight: 600; }
.diff-change-cell { font-size: 12px; }

.diff-actions-mt  { margin-top: 1.5rem; }

/* ---------- 盘点（stocktake） ---------- */

/* 盘点结果页 meta 顶部行 */
.stc-meta-bar { margin-bottom: 12px; font-size: 13px; color: #555; }
.stc-meta-back { margin-left: 16px; }

/* stat-card 背景/边框/数值颜色变体 */
.stc-stat-ok      { background: #e8f5e9; border-color: #81c784; }
.stc-stat-warn    { background: #fff8e1; border-color: #f9a825; }
.stc-stat-err     { background: #ffebee; border-color: #ef9a9a; }
.stc-stat-neutral { background: #f5f5f5; border-color: #ddd; }

.stc-stat-val        { font-size: 24px; font-weight: 700; color: #333; }
.stc-stat-val-ok     { font-size: 24px; font-weight: 700; color: var(--color-primary-700); }
.stc-stat-val-warn   { font-size: 24px; font-weight: 700; color: #e65100; }
.stc-stat-val-err    { font-size: 24px; font-weight: 700; color: var(--color-danger); }
.stc-stat-val-muted  { font-size: 24px; font-weight: 700; color: var(--color-text-muted); }
.stc-stat-label      { font-size: 12px; color: #555; }

/* 差异吻合提示 */
.stc-match-banner {
  background: #e8f5e9;
  border-color: #81c784;
  color: #1b5e20;
  font-weight: 600;
}

/* 分区标题色 */
.stc-sec-err   { color: var(--color-danger); }
.stc-sec-ok    { color: var(--color-primary-700); }
.stc-sec-muted { color: var(--color-text-muted); }

/* 表格/行背景 */
.stc-table        { margin-bottom: 16px; font-size: 13px; }
.stc-table-sm     { margin-bottom: 16px; font-size: 12px; }
.stc-table-sm-last{ font-size: 12px; }
.stc-row-missing  { background: #fff8e1; }
.stc-row-exception{ background: #ffebee; }
.stc-row-duplicate{ background: #fff8e1; }
.stc-txt-err-bold { color: var(--color-danger); font-weight: 600; }
.stc-txt-warn-bold{ color: #e65100; font-weight: 600; }
.stc-txt-err      { color: var(--color-danger); }
.stc-txt-ok       { color: var(--color-primary-700); }
.stc-empty        { margin: 0 0 16px; color: var(--color-text-weak); }
.stc-empty-ok     { color: var(--color-primary-700); margin: 0 0 16px; }

/* 盘点仓库列表页 */
.stl-page-title   { margin: 0; flex: 1; }
.stl-summary-box  { display: flex; align-items: center; flex-wrap: wrap; gap: 16px; }
.stl-stock-count  { color: #1b5e20; font-size: 16px; }
.stl-new-wrap     { margin-left: auto; }
.stl-batch        { font-weight: 600; }
.stl-empty-dash   { color: var(--color-text-weak); }
.stl-pct-meta     { font-size: 12px; color: #555; margin-left: 4px; }
.stl-nowrap       { white-space: nowrap; }
.stl-continue-link{ color: #e65100; font-weight: 600; }
.stl-empty-row    { padding: 32px; text-align: center; }

/* 盘点运行页 — session_run 在原 <style> 中已大量自定义，保留页面块 */
.str-subhead      { font-size: 11px; color: var(--color-text-weak); margin-left: 10px; }
.str-fb-code      { font-size: 11px; font-weight: 400; color: var(--color-text-muted); }
.str-scan-cnt-dup { color: #e65100; font-weight: 600; }
.str-empty-sm     { color: var(--color-text-weak); font-size: 13px; margin: 0 0 10px; }
.str-section-sm   { font-size: 13px; margin: 0 0 5px; }
.str-section-ok   { font-size: 13px; margin: 0 0 5px; color: var(--color-primary-700); }
.str-section-err  { font-size: 13px; margin: 0 0 5px; color: var(--color-danger); }
.str-exc-cell     { color: var(--color-danger); }

/* ---------- 客户订单仪表盘（已弃用页） ---------- */
.cod-deprecated-box {
  background: #e3f2fd;
  border: 1px solid #90caf9;
  border-radius: 4px;
  padding: 12px 16px;
  margin-bottom: 1rem;
  max-width: 64rem;
}
.cod-dep-title { margin: 0 0 8px; font-weight: 600; color: #0d47a1; }
.cod-dep-hint  { margin: 0 0 10px; color: #333; font-size: 0.9rem; }
.cod-actions-sm{ font-size: 13px; }
.cod-actions-muted { color: var(--color-text-muted); }
.cod-table     { max-width: 64rem; }
.cod-cell-name { font-weight: 600; }
.cod-link-gap  { margin-right: 12px; }
.cod-only-link { color: var(--color-text-weak); font-size: 12px; }
.cod-col-num { width: 6%; }
.cod-col-customer { width: 16%; }
.cod-col-today-total { width: 12%; }
.cod-col-today-rec { width: 12%; }
.cod-col-today-done { width: 12%; }
.cod-col-all-rec { width: 14%; }
.cod-col-ops { width: 28%; }

/* ============== Batch 9: Scanner results + list pages + map edit ============== */

/* 扫码结果页共享（transfer_result / sales_result / today_jobs） */
.scan-result-h1       { font-size: 1.75rem; margin: 0 0 0.8rem; }
.scan-result-h1-sm    { font-size: 1.55rem; margin: 0 0 0.55rem; }
.scan-result-subtitle { font-size: 0.96rem; color: var(--color-text-muted); margin: 0 0 0.95rem; }
.scan-result-panel    { border: 1px solid var(--color-border); border-radius: 8px; padding: 0.9rem; margin: 0 0 1rem; }
.scan-result-panel-sm { border: 1px solid var(--color-border); border-radius: 8px; padding: 0.7rem; margin: 0 0 0.85rem; }
.scan-result-panel-sm-last { border: 1px solid var(--color-border); border-radius: 8px; padding: 0.7rem; margin: 0 0 0.95rem; }
.scan-result-info      { margin: 0 0 0.35rem; }
.scan-result-info-last { margin: 0; }
.scan-result-h2        { font-size: 1.2rem; margin: 0 0 0.65rem; }
.scan-result-h2-sm     { font-size: 1.18rem; margin: 0 0 0.6rem; }
.scan-grid-mb          { margin: 0 0 1rem; }
.scan-result-hint      { margin: 0; color: var(--color-text-muted); font-size: 0.92rem; }
.scan-empty-muted      { margin: 0; color: var(--color-text-muted); }

/* 业务类型颜色（其他入库/出库单列表） */
.biz-waste    { color: var(--color-danger); }
.biz-loss     { color: #e65100; }
.biz-damage   { color: var(--color-danger); }
.biz-leftover { color: #e65100; }
.biz-gain     { color: var(--color-primary-700); }
.biz-rework   { color: #1565c0; }

/* 列表页共享 */
.list-count-line { color: var(--color-text-muted); margin: 0 0 0.5rem; font-size: 0.9em; }
.list-filter-mb  { margin-bottom: 1rem; }
.list-empty      { color: var(--color-text-weak); }

/* 库存查询页 */
.stk-intro-link { margin-bottom: 1rem; }
.stk-intro-hint { margin: -0.5rem 0 1rem; }
.stk-count-line { color: var(--color-text-muted); font-size: 0.85rem; margin-bottom: 8px; }
.stk-col-dim    { color: var(--color-text-weak); }
.stk-advanced   { display: none; flex-wrap: wrap; gap: 10px 16px; margin-top: 10px; padding: 8px 10px; background: #fafafa; border: 1px dashed #ccc; border-radius: var(--radius-md); }
.stk-advanced.is-open { display: flex; }
.stk-label-sep  { margin: 0 0.35rem; }
.stk-empty      { color: var(--color-text-weak); margin-top: 20px; }

/* 销售退货创建 */
.sr-main-tbl   { max-width: 45rem; margin-bottom: 1rem; }
.sr-items-tbl  { max-width: 75rem; }
.sr-h2         { font-size: 1.05rem; }
.sr-input-date { padding: 5px 8px; }
.sr-submit-row { margin-top: 16px; }

/* 特殊映射编辑 */
.csm-info-box  { max-width: 44rem; font-size: 0.95rem; }
.csm-info-sub  { margin-top: 0.3rem; }
.csm-help      { max-width: 44rem; color: #555; font-size: 0.92rem; }
.csm-errorlist { max-width: 40rem; }
.csm-col-goods { width: 75%; }
.csm-col-ops   { width: 25%; }
.csm-select    { width: 100%; max-width: 22rem; }
.csm-add-row-wrap { margin-top: 0.65rem; }
.csm-add-btn      { padding: 0.35rem 0.75rem; }
.csm-actions      { margin-top: 1rem; }
.csm-cancel-link  { margin-left: 0.75rem; }
.csm-hidden-tbl   { display: none; }

/* th 右对齐（金额列） */
.th-right { text-align: right; }
