/* ============================================================
   v3.39 · V3.51 样式补丁层（最后加载，压制 v315~v338 全部旧层）
   ------------------------------------------------------------
   A. 弹窗文字亚像素模糊回归修复（v3.33.1 方案移植，V3.50 丢失）
   B. 可达性与触控：键盘焦点环 + hover:none 触控目标 44px
      + zones 页操作钮 4px 问题修复
   C. 对比度微调：深色 btn-primary 渐变 / text-2 / 头像占位；
      浅色状态标签文字 / 头像提示文字
   D. 移动端触控细化（375px 公告小按钮，并入 B 的 hover:none 策略）
   约束：只覆盖不重写旧层；注释均为单层块注释，不嵌套
   ============================================================ */

/* ============================================================
   一、A · 弹窗文字亚像素模糊根治（自旧树 v332.css L237-262 移植）
   ------------------------------------------------------------
   病因（浏览器实测结论，v3.33.1 已验证）：v318 的
   will-change:transform 让弹窗常驻 GPU 合成层，文字由合成器
   光栅化；入场动画为缩放过冲型（style.css 的 pop / modalPop、
   v318 的 v318Pop 双叠加），丢帧或冻结时停在非单位 scale，
   文字按错误刻度光栅化发虚；JS 注入的小数 transform-origin
   又加剧亚像素偏移。v334 只保留了 will-change:auto 一条，
   transform-origin 锚定与纯位移入场动画在 V3.50 基线丢失。
   对策：will-change 归 auto、transform-origin 锚定中心（压过
   JS 内联小数坐标）、静态 transform 归零；入场动画替换为纯
   位移版 v339Pop，fill-mode:none，结束后无任何 transform 残留。
   ============================================================ */
.modal{
  will-change:auto !important;
  transform-origin:50% 50% !important;
  transform:none !important;
}
.pop-sheet{
  will-change:auto !important;
  transform-origin:50% 50% !important;
  transform:none !important;
}
/* 纯位移入场关键帧：translateY(14px) 到 0，全程无缩放成分 */
@keyframes v339Pop{
  from{ opacity:0; transform:translateY(14px); }
  to{ opacity:1; transform:translateY(0); }
}
/* 覆盖弹入动画：压制 style.css 的 pop 与 modalPop、v318 的
   v318Pop、v323 移动端的 modalSlideUp、v315 给 .pop-sheet 的
   modalPop。用长写法分属性，避免简写里 none 被解析为
   animation-name 的歧义（v332 同款教训）。 */
.modal-mask.show .modal,
.modal-mask.show .modal.pop-in,
.pop-mask.show .pop-sheet{
  animation-name:v339Pop !important;
  animation-duration:.28s !important;
  animation-timing-function:cubic-bezier(.2,.7,.3,1) !important;
  animation-fill-mode:none !important;
}
/* 普通流畅模式（perf=1）：保持 v338 的瞬时动画策略（全部动画
   .001s），避免上面高特异性规则把性能模式的弹窗动画拉长 */
body[data-perf="1"] .modal-mask.show .modal,
body[data-perf="1"] .modal-mask.show .modal.pop-in,
body[data-perf="1"] .pop-mask.show .pop-sheet{
  animation-duration:.001s !important;
}
/* 减少动态偏好：弹窗入场动画整体关闭。选择器带 body[data-perf]
   前缀抬高特异性，确保在普通流畅（perf=1）与液态玻璃（perf=0）
   两种模式下都压过前面的动画覆盖规则 */
@media (prefers-reduced-motion:reduce){
  body[data-perf] .modal-mask.show .modal,
  body[data-perf] .modal-mask.show .modal.pop-in,
  body[data-perf] .pop-mask.show .pop-sheet{
    animation:none !important;
  }
}

/* ============================================================
   二、B1 · 全局键盘焦点环（可达性，配合 JS 侧键盘导航）
   ------------------------------------------------------------
   旧层（style.css / v338 等）对 :focus 设了 outline:none，鼠标
   聚焦时靠 box-shadow 光环兜底，但按钮/链接/复选框等纯键盘
   聚焦场景无任何视觉指示。此处 !important 保证压过旧层。
   ============================================================ */
:focus-visible{
  outline:2px solid var(--blue,#3b82f6) !important;
  outline-offset:2px !important;
}
/* 输入类控件豁免：v338 已为其提供品牌色边框 + 3px 柔光环焦点
   样式，再叠 outline 会双份焦点指示，视觉冗余 */
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[contenteditable="true"]:focus-visible{
  outline:none !important;
}

/* ============================================================
   三、B2 / D1 · 触控目标 44px（hover:none 设备，含 375px 手机）
   ------------------------------------------------------------
   v330 旧触控层基线为 36px；本层在 hover:none 下再提一档到
   44px。覆盖：icon-btn / 弹窗关闭钮 / 到货展开箭头 / zones
   操作钮 / 公告小按钮 / 行内复选框与单选。
   ============================================================ */
@media (hover:none){
  /* 图标按钮、弹窗关闭钮、展开箭头、zones 操作钮：最小 44 平方 */
  .icon-btn,
  .modal-x,
  .pop-x,
  .arr-expand-btn,
  .zb-act,
  .zb-del{
    min-width:44px;
    min-height:44px;
  }
  /* 公告 ✎ 与 🗑 小按钮：28px 提到 44px；按钮为绝对定位不占
     布局流，同步加宽公告条右侧留白防止遮住文字 */
  .ann-ops button{
    width:44px;
    height:44px;
    font-size:16px;
  }
  .ann-bar{
    padding-right:104px;
  }
  /* 行内复选框 / 单选：44px 命中盒 + 10px 内边距 = 24px 视觉框。
     Chrome / Firefox / Safari 均按 padding 内缩渲染 checkbox，
     命中区（含 padding）即为 44px；个别旧内核忽略 padding 时
     退化为 44px 大复选框，仍可正常触控，不破坏可用性 */
  input[type=checkbox],
  input[type=radio],
  thead input[type=checkbox],
  tbody input[type=checkbox],
  #tblView input[type=checkbox]{
    width:44px;
    height:44px;
    padding:10px;
  }
  /* 盘点页 .ck-arrow 仅为行展开指示器（整行 tr 已有点击委托），
     不作独立触控目标，无需放大 */
}

/* ============================================================
   四、B3 · zones 页操作钮尺寸修复（Tina 实测缩放后仅 4px）
   ------------------------------------------------------------
   v338 的 zone-box 用容器查询单位 cqw 定尺寸：小卡片上
   5.6cqw 约 7px，再被 zone-world 整体 transform:scale 同比
   缩小（缩放范围 0.1~2.4），缩到 0.1~0.2 时按钮视觉仅 4px。
   app.js（applyView）已把缩放值同步写入 #zoneWorld 的
   --zw-scale CSS 变量（滚轮/按钮/复位/平移/初始全路径，
   未设置回退 1），按钮为其后代按 DOM 继承取值，据此补偿：
   · 尺寸公式 min(44px/s, max(28px/s, cqw基准))：世界坐标
     尺寸夹在 28px/s 至 44px/s 之间，经 scale 还原后视觉尺寸
     恒等于 clamp(cqw基准×s, 28px, 44px)——缩小时补到最小
     28px 视觉（防过小），放大时封顶 44px 视觉（防膨胀）；
   · 字号同构，视觉区间 13~16px；
   · calc 内 28px / var(--zw-scale,1) 为长度除以无单位数字，
     合法；scale 被 JS 鈐制在 0.1~2.4，无除零风险；
   · 3D 模式下 zone-world 带透视投影，补偿为近似值，可接受。
   触控设备（hover:none）下上一节的 min-width/min-height:
   44px 仍生效：放大视图时补偿尺寸小于 44px 会被顶回 44px
   世界坐标（视觉 44×s 偏大但保证可点，属有意取舍）。
   ============================================================ */
.zb-act{
  width:min(calc(44px / var(--zw-scale,1)), max(calc(28px / var(--zw-scale,1)), 5.6cqw));
  height:min(calc(44px / var(--zw-scale,1)), max(calc(28px / var(--zw-scale,1)), 5.6cqw));
  font-size:min(calc(16px / var(--zw-scale,1)), max(calc(13px / var(--zw-scale,1)), 3.4cqw));
}
.zb-del{
  width:min(calc(44px / var(--zw-scale,1)), max(calc(28px / var(--zw-scale,1)), 5.6cqw));
  height:min(calc(44px / var(--zw-scale,1)), max(calc(28px / var(--zw-scale,1)), 5.6cqw));
  font-size:min(calc(16px / var(--zw-scale,1)), max(calc(13px / var(--zw-scale,1)), 3.3cqw));
}
.zone-resize{
  width:min(calc(44px / var(--zw-scale,1)), max(calc(28px / var(--zw-scale,1)), 5cqw));
  height:min(calc(44px / var(--zw-scale,1)), max(calc(28px / var(--zw-scale,1)), 5cqw));
}
.zone-resize::after{
  font-size:min(calc(16px / var(--zw-scale,1)), max(calc(13px / var(--zw-scale,1)), 3.4cqw));
}

/* ============================================================
   五、C1 · 深色主题对比度微调（逐项）
   ============================================================ */
/* 1) btn-primary 渐变加深 8%：夜间品牌色偏亮（如 aurora 的
   #60a5fa），白字对比不足；混入 8% 黑后全主题达标，
   并补一层轻投影让白字更实（无害提亮观感） */
body[data-theme="dark"] .btn-primary{
  background:linear-gradient(135deg,
    color-mix(in srgb,var(--brand,#0A84FF) 92%,#000),
    color-mix(in srgb,var(--brand-2,#5E5CE6) 92%,#000)) !important;
  text-shadow:0 1px 1px rgba(0,0,0,.22);
}
/* 2) text-2 提亮一档：style.css 夜间 #98989f 提到 #a9b0bc，
   对 v338 深色表面 #16181d 对比约 7:1（≥3:1 达标），
   与 --text / --text-3 的层级关系保持不变；
   液态玻璃模式（perf=0）沿用 v338 更亮的 #cfd7e4 不受影响 */
body[data-theme="dark"]{
  --text-2:#a9b0bc;
}
/* 3) 头像占位（av-ph）夜间整体加深两档：原亮度 56% 的绿色系
   hue 上白字对比仅约 2.4:1；加深后全色相白字对比达标，
   绿色系即呈现为深绿底白字 */
body[data-theme="dark"] .avatar.av-ph,
body[data-theme="dark"] .av-ph,
body[data-theme="dark"] .av-chip{
  background:linear-gradient(135deg,
    hsl(var(--avh,210) 62% 36%),
    hsl(var(--avh,210) 60% 22%)) !important;
  color:#fff !important;
}

/* ============================================================
   六、C2 · 浅色主题对比度微调（逐项）
   ============================================================ */
/* 1) 状态标签文字加深：原语义色 12px 小字在软底上对比不足
   （如 warning #d97706 约 3.3:1），换用同族 -700 深色阶 */
body[data-theme="light"] .tag-pending,
body[data-theme="light"] .tags.tag-pending,
body[data-theme="light"] .tag-med{
  color:#b45309 !important;
}
body[data-theme="light"] .tag-confirmed{
  color:#15803d !important;
}
body[data-theme="light"] .tag-cancelled,
body[data-theme="light"] .tag-high{
  color:#b91c1c !important;
}
body[data-theme="light"] .tag-info,
body[data-theme="light"] .tag-admin,
body[data-theme="light"] .tag-low{
  color:#1d4ed8 !important;
}
/* 公告小标签（11px）与上同语义，顺带加深 */
body[data-theme="light"] .ann-tag{
  color:#1d4ed8 !important;
}
body[data-theme="light"] .ann-bar.is-important .ann-tag{
  color:#b91c1c !important;
}
body[data-theme="light"] .ann-bar.is-warning .ann-tag{
  color:#b45309 !important;
}
/* 2) 头像提示文字加深：v333 用 --text-3（浅色 #aeaeb2 对白底
   仅约 2.1:1），改用 --text-2（浅色 #6b6b70 约 4.9:1）；
   夜间 --text-3 同样不足，一并提亮 */
body[data-theme="light"] .prof-avatar-tip{
  color:var(--text-2,#6b6b70) !important;
}
body[data-theme="dark"] .prof-avatar-tip{
  color:var(--text-2,#a9b0bc) !important;
}

/* ============================================================
   七、区域商品 到货日期（到货单创建日）/ 到货数量（v3.69 新增）
   ------------------------------------------------------------
   区域块卡片 .zb-sub 内追加 .zb-arr（最近到货+累计件数），
   区域商品弹窗表格新增两列 .zp-arr / .zp-qty；允许卡片副标题
   折成两行以完整展示，不改动区域网格与既有布局。
   ============================================================ */
.ta-r{ text-align:right !important; }
.mut{ color:var(--text-3,#8e8e93); font-weight:400; font-size:.9em; }
.zb-sub{ white-space:normal !important; line-height:1.4; }
.zb-arr{ color:var(--success,#16a34a); font-weight:700; white-space:nowrap; }
body[data-theme="dark"] .zb-arr{ color:#34d399; }
.zp-arr{ color:var(--text-2,#6b6b70); white-space:nowrap; font-variant-numeric:tabular-nums; }
.zp-qty{ white-space:nowrap; }
.zp-qty b{ color:var(--text,#111); font-variant-numeric:tabular-nums; }
#zpList td.zp-arr,
#zpList td.zp-qty{ font-size:13px; }
@media(max-width:640px){
  #zpList td.zp-arr,
  #zpList td.zp-qty{ font-size:12px; }
  .zb-sub{ line-height:1.3; }
}

/* 区域商品弹窗：新增到货日期/数量两列紧凑列宽，避免加列后横向滚动 */
#zpList table{ font-variant-numeric:tabular-nums; }
#zpList th:nth-child(5),
#zpList td.zp-arr{ white-space:nowrap; padding-left:8px; padding-right:8px; }
#zpList th:nth-child(6),
#zpList td.zp-qty{ white-space:nowrap; width:86px; padding-left:8px; padding-right:12px; } /* zp-colw */

/* zp-padfix：区域商品弹窗统一收紧单元格内边距，加两列后不出现横向滚动 */
#zpList .table-wrap th,
#zpList .table-wrap td{ padding-left:10px; padding-right:10px; }
#zpList th:nth-child(5),
#zpList td.zp-arr{ padding-left:6px; padding-right:6px; }
#zpList th:nth-child(6),
#zpList td.zp-qty{ padding-left:6px; padding-right:10px; }

/* ===== v3.70 区域商品：数量/件数分列 + 多次到货点击展开明细 ===== */
#zpList table th:nth-child(6),#zpList td.zp-spec,
#zpList table th:nth-child(7),#zpList td.zp-qty{ white-space:nowrap; text-align:right; }
#zpList td.zp-spec b,#zpList td.zp-qty b{ font-variant-numeric:tabular-nums; }
#zpList td.zp-name{ max-width:150px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
#zpList td.zp-cspec{ max-width:96px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--text-3,#8a8a8e); }
#zpList td.zp-arr{ white-space:nowrap; }
#zpList .zp-cnt{ font-size:11px; color:var(--brand,#0A84FF); margin-right:4px; font-weight:700; }
#zpList .zp-toggle{ display:inline-flex; align-items:center; justify-content:center; width:15px; height:15px; margin-right:5px; border-radius:4px; background:var(--brand-soft,rgba(10,132,255,.14)); color:var(--brand,#0A84FF); font-style:normal; font-size:10px; line-height:1; cursor:pointer; vertical-align:middle; user-select:none; }
#zpList tr.zp-open > td{ background:var(--surface-2,rgba(10,132,255,.05)); }
#zpList tr.zp-detail > td{ padding:0 !important; background:var(--surface-2,rgba(0,0,0,.03)); }
.zp-detail-in{ margin:4px 8px 10px 40px; border:1px solid var(--line,rgba(0,0,0,.10)); border-radius:10px; overflow:auto; }
.zp-detail-in table{ width:100%; border-collapse:collapse; }
.zp-detail-in th{ text-align:left; font-size:11px; color:var(--text-3,#999); font-weight:600; background:var(--surface-3,rgba(0,0,0,.03)); }
.zp-detail-in th,.zp-detail-in td{ padding:6px 10px; font-size:12px; white-space:nowrap; border-bottom:1px solid var(--line,rgba(0,0,0,.06)); }
.zp-detail-in tbody tr:last-child td{ border-bottom:none; }
.zp-detail-in td b{ font-variant-numeric:tabular-nums; }
body[data-theme="dark"] #zpList tr.zp-detail > td{ background:rgba(255,255,255,.03); }
body[data-theme="dark"] .zp-detail-in th{ background:rgba(255,255,255,.05); }

/* ===== v3.71 多次到货明细·合计行 ===== */
.zp-detail-in table tfoot td{background:var(--surface-2,#f3f5f8);border-top:2px solid var(--line,#e3e6eb);font-size:12px;padding:7px 8px;color:var(--text-2,#333);white-space:nowrap;}
.zp-detail-in table tfoot b{color:var(--blue,#0A84FF);font-variant-numeric:tabular-nums;}
[data-theme="dark"] .zp-detail-in table tfoot td,html.dark .zp-detail-in table tfoot td{background:#202632;color:#e8ecf2;border-top-color:#3a4250;}

/* ===== v3.72 区域商品明细：单号点击跳转到货管理 + 到货行定位高亮 ===== */
#zpList a.zp-jump{ color:var(--brand,#0A84FF); font-weight:600; cursor:pointer; text-decoration:none; white-space:nowrap; border-bottom:1px dashed color-mix(in srgb,var(--brand,#0A84FF) 45%,transparent); }
#zpList a.zp-jump:hover{ color:color-mix(in srgb,var(--brand,#0A84FF) 72%,#000); border-bottom-style:solid; }

/* ===== v3.73 数量/件规/件数 去重与强调（件数 = 数量 × 件规） ===== */
/* 主表：件规全为 1 时件数=数量，不再重复显示同值，改用「单件」弱标签 */
#zpList .zp-single{ display:inline-block; font-size:11px; font-weight:600; line-height:1.5; color:var(--text-3,#9aa0aa); background:var(--surface-3,rgba(0,0,0,.05)); border-radius:6px; padding:1px 7px; white-space:nowrap; }
/* 明细表：件规列弱化；件规=1 的件数(=数量)灰显，多件规换算出的件数用品牌色加粗 */
.zp-detail-in td.zp-pc,.zp-detail-in tfoot td.zp-pc{ color:var(--text-3,#9aa0aa); font-variant-numeric:tabular-nums; }
.zp-detail-in td.zp-eq{ color:var(--text-3,#9aa0aa); font-variant-numeric:tabular-nums; }
.zp-detail-in td.zp-eq b{ color:var(--text-3,#9aa0aa); font-weight:600; }
.zp-detail-in td.zp-mul{ color:var(--brand,#0A84FF); font-weight:700; font-variant-numeric:tabular-nums; }
.zp-detail-in td.zp-mul b{ color:var(--brand,#0A84FF); }
.zp-detail-in tfoot .zp-formula{ font-size:10.5px; color:var(--text-3,#aab0ba); white-space:nowrap; }
[data-theme="dark"] #zpList .zp-single,html.dark #zpList .zp-single{ background:rgba(255,255,255,.08); color:#9aa3b2; }
@media(max-width:560px){
  #zpList .zp-single{ font-size:10.5px; padding:1px 5px; }
  .zp-detail-in tfoot .zp-formula{ display:none; }
}
.arr-main-row.arr-jump-hi > td{ animation:arrJumpHi 2.4s ease 1; }
.arr-main-row.arr-jump-hi td:first-child{ box-shadow:inset 3px 0 0 var(--brand,#0A84FF); }
@keyframes arrJumpHi{
  0%{ background:color-mix(in srgb,var(--brand,#0A84FF) 30%,transparent); }
  18%{ background:color-mix(in srgb,var(--brand,#0A84FF) 22%,transparent); }
  100%{ background:transparent; }
}
[data-theme="dark"] .arr-main-row.arr-jump-hi > td{ animation:arrJumpHiDark 2.4s ease 1; }
@keyframes arrJumpHiDark{
  0%{ background:rgba(10,132,255,.40); }
  18%{ background:rgba(10,132,255,.30); }
  100%{ background:transparent; }
}
@media (prefers-reduced-motion: reduce){
  .arr-main-row.arr-jump-hi > td,[data-theme="dark"] .arr-main-row.arr-jump-hi > td{ animation:none; background:color-mix(in srgb,var(--brand,#0A84FF) 16%,transparent); }
}
