:root{
  --bg:#f7f5f0;
  --surface:#ffffff;
  --surface-soft:#f1eee7;
  --ink:#242320;
  --muted:#817b70;
  --line:#e8e3da;
  --line-strong:#d9d1c4;
  --accent:#a57a3f;
  --accent-dark:#805b2d;
  --accent-soft:#eee3d2;
  --danger:#b6453d;
  --success:#526e52;
  --warning:#9b712d;
  --white:#fff;
  --shadow:0 8px 24px rgba(42,37,30,.06);
  --radius:16px;
  --radius-sm:11px;
  --tab-h:64px;
  /* 安全区：index.html 用了 viewport-fit=cover（iPhone 刘海屏 / 微信内置浏览器会铺到状态栏下），
     顶部必须自己让出 safe-area-inset-top，否则页头与页面标题会被顶部导航栏压住（只露出下半截）。
     用自定义属性包一层，便于真机/测试注入同一个变量做实测。 */
  --safe-top:env(safe-area-inset-top,0px);
  --safe-bottom:env(safe-area-inset-bottom,0px);
  /* 【顶部导航 · 跟手】导航当前位移（负值 = 已上移收起）。滚动时由 mobile.js 逐帧**只写这一个变量**：
     导航 transform 与下方吸顶栏 top 都读它；NAV_FOLLOW_ENABLED=false 时恒为 0px（＝原「钉死顶部」行为）。 */
  --m-nav-y:0px;
  --page-max:640px;
  /* 缩略图统一比例；源图（含照片外围黑边与标尺刻度）**整张等比缩进框内、不裁切**，
     框内四周用品牌浅色占位。旧口径的 --thumb-zoom 放大裁切已废弃。 */
  --thumb-ratio:16 / 10;
  /* 平铺网格最小列宽：随视口收缩（320 也不挤），到大屏封顶 200px 保持石材纹理面积 */
  --tile-min:clamp(128px,44vw,200px);
  --tile-gap:clamp(8px,2.4vw,10px);
  /* 来源导入三块的主色 / 淡底 / 描边（与已确认效果图 srcimport-mock/mock.html 一致） */
  --c-local:#2f6fb0;  --c-local-bg:#eef4fb;  --c-local-line:#c9dbf0;
  --c-chain:#b08334;  --c-chain-bg:#fbf5e9;  --c-chain-line:#ecd9b0;
  --c-hua:#1c7a52;    --c-hua-bg:#eaf6f0;   --c-hua-line:#c4e2d4;
  /* 来源导入 6 格各一色调类（blk-t1…blk-t6）：金 / 橙 / 紫 / 绿 / 蓝 / 青，一格一色便于一眼分辨 */
  --c-t1:#b08334;  --c-t1-bg:#fbf5e9;  --c-t1-line:#ecd9b0;   /* 1 链石云仓 · 金 */
  --c-t2:#c26a1e;  --c-t2-bg:#fdf2e7;  --c-t2-line:#f0d2b2;   /* 2 石材云仓 · 橙 */
  --c-t3:#7a4fb5;  --c-t3-bg:#f4effc;  --c-t3-line:#ddd0f3;   /* 3 啄木鸟·石材码单 · 紫 */
  --c-t4:#1c7a52;  --c-t4-bg:#eaf6f0;  --c-t4-line:#c4e2d4;   /* 4 华研软件 · 绿 */
  --c-t5:#2f6fb0;  --c-t5-bg:#eef4fb;  --c-t5-line:#c9dbf0;   /* 5 搜石网 · 蓝 */
  --c-t6:#127c85;  --c-t6-bg:#e9f6f7;  --c-t6-line:#c2e3e6;   /* 6 其他网站 · 青 */
}
*{box-sizing:border-box}
/* 操作条上的动作按钮用 hidden 属性控制出现/消失（选中 0 片时不显示） */
[hidden]{display:none!important}
html,body{margin:0;padding:0;background:var(--bg);color:var(--ink);font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Helvetica Neue",Arial,sans-serif;-webkit-font-smoothing:antialiased}
/* 手机端锁死缩放：根元素只保留平移（横/纵滚动），浏览器据此关掉捏合缩放与双击缩放。
   注意：不是 touch-action:none —— 滚动 / 点击 / 长按 / 勾选全部保留。 */
html,body{touch-action:pan-x pan-y}
/* min-height 用 dvh（动态视口）：键盘弹起 / 地址栏收起时它能跟着变；
   不支持 dvh 的浏览器读不到第二条声明，仍按前一条 100vh 计算（回退不变）。 */
body{min-height:100vh;min-height:100dvh;overflow-x:hidden}
button,input,select,textarea{font:inherit}
button{cursor:pointer}
img{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
#m-app{width:100%;max-width:var(--page-max);margin:0 auto;min-height:100vh;min-height:100dvh;background:var(--bg)}
.m-page{min-height:100vh;min-height:100dvh;padding-bottom:calc(var(--tab-h) + var(--safe-bottom) + 24px)}
.m-page.has-actionbar{padding-bottom:calc(var(--tab-h) + var(--safe-bottom) + 104px)}
.m-header{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:10px;min-height:58px;padding:calc(8px + var(--safe-top)) 14px 8px;background:rgba(247,245,240,.95);backdrop-filter:blur(14px);border-bottom:1px solid rgba(232,227,218,.8)}
/* 【菜单栏冻结 · 2026-09-28】后台页把 .m-header + .m-admin-topnav 一起包进 .m-topbar，
   整块 position:sticky;top:0：标题栏与「菜单 ▾」导航栏（含展开后的各行）滚动时始终贴在
   顶端、互不重叠、不跳动；**2026-10-03 起**再叠加「跟手滑动」（下滑逐渐收起 / 上滑逐渐露出，
   见下方 NAV_FOLLOW 段；NAV_FOLLOW_ENABLED=false 即回到本段原「钉死」行为）。
   ① 不用魔数：整块自己吸顶，菜单栏天然紧贴标题栏下沿（安全区/标题长短/展开与否都不影响）；
   ② z-index:30（沿用原 .m-header 层级）→ 在内容之上、低于固定底栏 .m-bottom-tabs（60）；
   ③ flex:0 0 auto：客户追踪页 .m-tracker-page 是 flex 列，避免本块被压缩改变高度；
   ④ .m-page 的 padding-bottom（tab-h + 安全区 + 24px）原样保留，内容不会被固定底栏遮住。 */
.m-topbar{position:sticky;top:0;z-index:30;flex:0 0 auto;background:var(--bg)}
/* 包进 .m-topbar 后标题栏不再单独吸顶（避免 sticky 套 sticky 的定位歧义），位置由整块决定。 */
.m-topbar>.m-header{position:relative;top:auto;z-index:1}
/* 【顶部导航 · 跟手滑动 · 2026-10-03】滚动时整块导航跟着手指位移（算法见 mobile.js · NAV_FOLLOW_*）。
   ① 只有真正发生位移时才挂 html.m-nav-shifted 走 transform:translateY(var(--m-nav-y)) → 纯 GPU 合成属性；
      静止（全显）状态不加 transform，页头毛玻璃 backdrop-filter、z-index 层级（< 底栏 60）完全不受影响；
   ② 滚动中由 JS 逐帧写 --m-nav-y，**不加 transition**（1:1 跟手）；松手后加 html.m-nav-settling
      做 150ms ease-out 收尾；html.m-nav-live 只在手势 / 收尾期间挂 will-change:transform，结束即摘；
   ③ 无 .m-topbar 的页面（产品展示 / 登录等）由 .m-page>.m-header 自身跟手，口径一致。 */
html.m-nav-shifted .m-topbar,
html.m-nav-shifted .m-page>.m-header{transform:translateY(var(--m-nav-y,0px))}
html.m-nav-live .m-topbar,
html.m-nav-live .m-page>.m-header{will-change:transform}
html.m-nav-settling .m-topbar,
html.m-nav-settling .m-page>.m-header{transition:transform 150ms ease-out}
html.m-nav-settling .m-inv-batch-shell,
html.m-nav-settling .m-src-search-shell{transition:top 150ms ease-out}
.m-header-title{flex:1;min-width:0;text-align:center;font-weight:700;font-size:clamp(16px,4.9vw,19px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.m-header-side{width:44px;display:flex;align-items:center}
.m-header-side.right{justify-content:flex-end;width:auto;min-width:44px}
.m-header-link{font-size:12px;font-weight:700;color:var(--accent);white-space:nowrap;padding:6px 2px}
.m-icon-btn{border:0;background:transparent;min-width:44px;min-height:44px;border-radius:12px;color:var(--ink);font-size:22px;display:grid;place-items:center}
.m-content{padding:14px}
.m-section{margin:0 0 18px}
.m-section-title{font-size:clamp(13px,3.8vw,15px);font-weight:700;margin:0 0 10px;color:var(--ink)}
.m-subtle{font-size:12px;color:var(--muted)}
.m-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}
/* 平铺容器统一走 auto-fill：320 / 360 / 390 / 更宽的屏都自动排布，不写死列数 */
.m-grid-2{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--tile-min)),1fr));gap:var(--tile-gap)}
.m-product-card{overflow:hidden;background:var(--surface);border:1px solid var(--line);border-radius:14px}
.m-product-card:active{transform:scale(.995)}
.m-thumb{position:relative;width:100%;aspect-ratio:var(--thumb-ratio);overflow:hidden;background:var(--surface-soft);border-radius:14px 14px 0 0}
.m-thumb>img{display:block;width:100%;height:100%;object-fit:contain;background:var(--surface-soft)}
.m-thumb>img.is-broken{display:none}
/* 单片被订单占用（PENDING）或已售（APPROVED/SOLD）：图片左上角红色斜切三角角标「已订」。
   文字中心先平移到三角形内部再旋转 -45°，保证旋转后四角都满足 x+y ≤ 边长（不再被斜边裁掉）。 */
.slab-ordered-tag{position:absolute;top:0;left:0;z-index:3;width:min(58px,62%);aspect-ratio:1/1;height:auto;container-type:inline-size;background:#e60012;clip-path:polygon(0 0,100% 0,0 100%);display:flex;align-items:center;justify-content:center;pointer-events:none}
.slab-ordered-tag>span{color:#fff;font-size:12px;font-weight:700;letter-spacing:1px;line-height:1;white-space:nowrap;transform:translate(-10px,-10px) rotate(-45deg);font-size:22cqw;transform:translate(-20cqw,-20cqw) rotate(-45deg)}
/* 最小缩略图（手机端定单明细/草稿 74px 宽）：34px 上限，字随角标缩放 */
.slab-ordered-tag.xs{width:min(34px,62%)}
.slab-ordered-tag.xs>span{font-size:9px;font-size:22cqw;letter-spacing:0;transform:translate(-7px,-7px) rotate(-45deg);transform:translate(-20cqw,-20cqw) rotate(-45deg)}
.m-thumb.xs{width:100%;height:auto;aspect-ratio:74 / 58;border-radius:8px}
/* 卡片图：宽度跟随卡片，比例自适应；加载失败隐藏破图，露出品牌浅色底 */
.m-product-img{display:block;width:100%;height:auto;aspect-ratio:4 / 3;object-fit:contain;object-position:50% 50%;background:var(--surface-soft)}
.m-product-img.is-broken{display:none}
img.m-image-unavailable{object-fit:contain!important;transform:none!important;opacity:1!important;cursor:pointer}
.m-product-body{padding:10px 10px 11px}
.m-product-name{font-size:clamp(13px,3.9vw,16px);font-weight:700;overflow-wrap:anywhere}
.m-product-meta{font-size:clamp(11px,3.2vw,13px);color:var(--muted);margin-top:5px;line-height:1.45;overflow-wrap:anywhere}
.m-empty{padding:42px 20px;text-align:center;color:var(--muted)}
.m-empty strong{display:block;color:var(--ink);font-size:17px;margin-bottom:7px}
.m-btn{border:1px solid transparent;min-height:44px;padding:10px 16px;border-radius:12px;font-weight:650;background:var(--surface-soft);color:var(--ink)}
.m-btn.primary{background:var(--accent);color:#fff}
.m-btn.primary:active{background:var(--accent-dark)}
.m-btn.outline{background:var(--surface);border-color:var(--line-strong)}
.m-btn.danger{background:#fff1ef;color:var(--danger);border-color:#efd1cd}
.m-btn.ghost{background:transparent}
.m-btn:disabled{opacity:.45;cursor:not-allowed}
.m-btn.full{width:100%}
.m-btn-row{display:flex;gap:9px;flex-wrap:wrap}
.m-btn-row>.m-btn{flex:1}
.m-bottom-tabs{position:fixed;left:50%;bottom:0;transform:translateX(-50%);z-index:60;width:100%;max-width:var(--page-max);height:calc(var(--tab-h) + var(--safe-bottom));padding:6px 26px var(--safe-bottom);background:rgba(255,255,255,.96);backdrop-filter:blur(16px);border-top:1px solid var(--line);display:grid;grid-template-columns:1fr 1fr}
.m-tab{position:relative;border:0;background:transparent;min-height:52px;color:var(--muted);display:flex;flex-direction:column;justify-content:center;align-items:center;gap:3px;font-size:12px;font-weight:500;border-radius:12px;transition:color .18s,background .18s,transform .12s;-webkit-tap-highlight-color:transparent}
.m-tab-icon{font-size:20px;line-height:1;transition:transform .18s}
.m-tab.active{color:var(--accent);font-weight:700}
.m-tab.active .m-tab-icon{color:var(--accent);transform:translateY(-1px)}
.m-tab.active::before{content:"";position:absolute;left:50%;top:-6px;transform:translateX(-50%);width:28px;height:2px;border-radius:0 0 2px 2px;background:var(--accent)}
.m-tab:active{background:var(--accent-soft);transform:scale(.96)}
.m-hero{padding:14px 14px 0}
/* z-index:2：DOM 里 .m-thumb 在收藏按钮之后且自身定位，不加层级会把 ♡ 盖住（看不见也点不到） */
.m-fav-btn{position:absolute;z-index:2;right:8px;top:8px;width:38px;height:38px;border-radius:999px;border:0;background:rgba(255,255,255,.9);box-shadow:0 4px 14px rgba(0,0,0,.09);font-size:20px;color:var(--ink)}
.m-fav-btn.on{color:#a74c45}
.m-slab-card{position:relative}
.m-login-wrap{padding:28px 18px}
.m-login-card{background:#fff;border:1px solid var(--line);border-radius:20px;padding:20px;box-shadow:var(--shadow)}
.m-login-card h1{font-size:24px;margin:0 0 7px}
.m-login-card p{font-size:13px;color:var(--muted);margin:0 0 22px}
.m-field{margin-bottom:14px}
.m-label{display:block;font-size:12px;font-weight:650;margin-bottom:6px;color:var(--muted)}
.m-input,.m-select,.m-textarea{width:100%;min-height:46px;border:1px solid var(--line-strong);border-radius:12px;background:#fff;padding:10px 12px;color:var(--ink);outline:none}
/* 【键盘弹出 · 输入框不贴键盘】iOS / 安卓 / 微信内置浏览器在键盘弹起时会自动把聚焦的输入框
   滚进可视区，默认把它贴在最下面（键盘上沿）。scroll-margin-* 只影响「滚动对齐」，
   不占布局、不改任何既有尺寸：系统按它留出上下余量，框会停在偏上、离键盘更远的位置。
   选择器同时覆盖原生 input/textarea/select 与项目既有的 .m-input/.m-select/.m-textarea，
   覆盖面更广；旧浏览器不认识该属性时只是回到原来的贴键盘行为。 */
input,textarea,select,.m-input,.m-select,.m-textarea{
  scroll-margin-top:clamp(72px,22vh,160px);
  scroll-margin-bottom:clamp(72px,22vh,160px);
}
.m-input:focus,.m-select:focus,.m-textarea:focus{border-color:var(--accent)}
.m-captcha{display:grid;grid-template-columns:1fr auto;gap:8px}
.m-captcha-q{min-height:46px;display:flex;align-items:center;padding:0 13px;background:var(--surface-soft);border-radius:12px;font-weight:700}
.m-me-head{padding:18px 14px 8px}
.m-profile{background:#fff;border:1px solid var(--line);border-radius:18px;padding:16px;display:flex;align-items:center;gap:13px}
.m-avatar{width:48px;height:48px;border-radius:50%;background:var(--accent-soft);display:grid;place-items:center;font-weight:800;color:var(--accent-dark)}
.m-profile-name{font-size:17px;font-weight:750}
.m-profile-role{font-size:12px;color:var(--muted);margin-top:3px}
.m-menu{background:#fff;border:1px solid var(--line);border-radius:16px;overflow:hidden}
.m-menu-item{min-height:54px;padding:0 14px;border:0;border-bottom:1px solid var(--line);background:#fff;width:100%;display:flex;align-items:center;gap:11px;text-align:left;color:var(--ink)}
.m-menu-item:last-child{border-bottom:0}
.m-menu-icon{width:30px;height:30px;border-radius:9px;background:var(--surface-soft);display:grid;place-items:center}
.m-menu-label{flex:1;font-weight:620}
.m-menu-meta{font-size:12px;color:var(--muted)}
.m-chevron{color:#aaa49a}
/* 后台一级导航固定 3 行：每行一个 .m-admin-nav-row（data-nav-row 标注行号），
   每行内部还能自动换行，320 宽也不横向溢出。 */
.m-admin-topnav{display:flex;flex-direction:column;align-items:stretch;gap:clamp(5px,1.5vw,7px);padding:9px 14px;background:var(--bg);border-bottom:1px solid var(--line)}
.m-admin-nav-row{display:flex;flex-wrap:wrap;align-items:center;gap:clamp(6px,1.9vw,8px);min-width:0}
.m-nav-chip{flex:0 1 auto;min-width:0;max-width:100%;border:1px solid var(--line-strong);background:#fff;border-radius:999px;min-height:clamp(30px,8.4vw,36px);padding:5px clamp(9px,2.8vw,12px);color:var(--muted);font-size:clamp(12px,3.4vw,14px);font-weight:650;line-height:1.3;text-align:center;white-space:normal;overflow-wrap:anywhere}
.m-nav-chip.active{background:var(--ink);border-color:var(--ink);color:#fff}
.m-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
.m-stat{padding:13px;background:#fff;border:1px solid var(--line);border-radius:14px}
.m-stat-value{font-size:clamp(16px,5vw,20px);font-weight:800;overflow-wrap:anywhere}
.m-stat-label{font-size:clamp(10px,3.1vw,12px);color:var(--muted);margin-top:5px;overflow-wrap:anywhere}
.m-stat-sub{font-size:clamp(9px,2.9vw,11px);color:var(--muted);margin-top:4px;line-height:1.55;overflow-wrap:anywhere}
.m-stat-sub{display:block;margin-top:2px;font-style:normal;font-weight:400;opacity:.75}
/* 【经营数据 · 分仓说明】两行两列：标签列左对齐、数值列左对齐且共用同一列边界；
   grid 保证两行严格竖直对齐，避免长句在窄卡里乱折行。字体/颜色沿用 .m-stat-sub。 */
.m-stat-sub.m-stat-sub-rows{display:grid;grid-template-columns:max-content minmax(0,1fr);column-gap:3px;row-gap:1px;align-items:baseline;line-height:1.5;margin-top:5px}
.m-stat-sub-rows .m-stat-sub-k{white-space:nowrap}
.m-stat-sub-rows .m-stat-sub-v{text-align:left;min-width:0;overflow-wrap:anywhere}
/* 320px 级窄屏：去掉列间距并轻微收字距，保证「5195片·25967.932㎡」不折行。 */
@media(max-width:340px){
  .m-stat-sub.m-stat-sub-rows{column-gap:0;letter-spacing:-.02em}
}
.m-toolbar{padding:10px 14px;background:var(--bg);display:grid;gap:9px}
/* 【继续加货】大板销售管理进入「往某张定单追加片」态时的横幅：整行、可换行、320px 不溢出。 */
.m-append-banner{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:var(--accent-soft);border:1px solid var(--line-strong);border-radius:13px;padding:10px 12px;min-width:0}
.m-append-text{flex:1 1 160px;min-width:0;font-size:clamp(12px,3.6vw,14px);font-weight:650;color:var(--ink);overflow-wrap:anywhere;line-height:1.45}
.m-append-sub{margin-top:3px;font-size:clamp(11px,3.2vw,12px);font-weight:400;color:var(--muted);overflow-wrap:anywhere}
.m-append-banner .m-btn{flex:0 0 auto;min-height:38px;padding:7px 13px;font-size:clamp(12px,3.4vw,14px)}
/* 订单详情「退回修改」态：继续加货独占一行，与下方「重新提交 / 废单」保持 9px 间距。 */
.m-order-addmore{margin-bottom:9px}
.m-segment{display:flex;background:#ece8e0;padding:2px;border-radius:10px}
.m-segment button{flex:1;min-width:0;border:0;background:transparent;min-height:30px;border-radius:8px;color:var(--muted);font-weight:650;font-size:clamp(12.5px,3.4vw,13.5px)}
.m-segment button.active{background:#fff;color:var(--ink);box-shadow:0 2px 9px rgba(0,0,0,.06)}
.m-chips{display:flex;flex-wrap:wrap;align-items:center;gap:clamp(6px,1.9vw,8px);max-width:100%;overflow-x:auto;padding-bottom:2px;scrollbar-width:none}
.m-chips::-webkit-scrollbar{display:none}
.m-chip{flex:0 1 auto;min-width:0;max-width:100%;border:1px solid var(--line-strong);background:#fff;border-radius:999px;min-height:30px;padding:4px clamp(9px,2.9vw,13px);color:var(--muted);font-size:clamp(12px,3.3vw,14px);line-height:1.3;text-align:center;white-space:normal;overflow-wrap:anywhere}
.m-chip.active{background:var(--ink);border-color:var(--ink);color:#fff}
/* 【批13】多图/多标签容器统一兜底：允许换行 + 可收缩（排不下换行，绝不越过卡片右边界）。 */
.m-inv-card{display:flex;align-items:center;flex-wrap:wrap;gap:12px;min-width:0;max-width:100%;background:#fff;border:1px solid var(--line);border-radius:15px;padding:11px 13px;margin-bottom:10px}
.m-inv-thumb{position:relative;flex:0 0 auto;width:clamp(46px,15vw,58px);aspect-ratio:1 / 1;height:auto;border-radius:12px;overflow:hidden;background:var(--accent-soft)}
.m-inv-thumb>img{display:block;width:100%;height:100%;object-fit:contain;background:var(--accent-soft)}
.m-inv-thumb>img.is-broken{display:none}
/* 【封面可预览提示】右下角小放大镜角标：绝对定位浮在缩略图上，不占位、不改卡片尺寸；
   pointer-events:none —— 点它等同于点缩略图（由 .m-inv-thumb 自己的 onclick 处理）。 */
.m-inv-zoom{position:absolute;right:3px;bottom:3px;z-index:2;display:grid;place-items:center;width:15px;height:15px;border-radius:5px;background:rgba(20,18,16,.55);color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25);pointer-events:none}
.m-inv-zoom>svg{display:block}
.m-inv-top{display:flex;flex:1;min-width:0;justify-content:space-between;align-items:center;gap:10px}
.m-inv-body{min-width:0;flex:1}
.m-inv-title{font-weight:750;font-size:clamp(13.5px,4vw,16px);word-break:break-word;overflow-wrap:anywhere}
/* 【点品种名=整组选中】可点视觉提示（原来与普通文字无异，看不出来能点）。 */
.m-inv-species{cursor:pointer;color:var(--accent-dark);background:var(--accent-soft);border-radius:7px;padding:1px 7px;margin-left:-3px}
.m-inv-species:active{background:#e3d3ba}
.m-inv-meta{font-size:clamp(11px,3.2vw,13px);color:var(--muted);margin-top:5px;line-height:1.55;overflow-wrap:anywhere}
.m-badge{display:inline-flex;align-items:center;min-height:24px;padding:3px 8px;border-radius:999px;background:var(--surface-soft);font-size:clamp(10px,3vw,12px);color:var(--muted);max-width:100%}
.m-badge.stock{background:#eef4ec;color:#4c6849}
.m-badge.pending{background:#fff5dd;color:#906c27}
.m-badge.sold{background:#f0eeeb;color:#69645c}
.m-slab-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--tile-min)),1fr));gap:var(--tile-gap)}
.m-inv-slab{position:relative;background:#fff;border:1px solid var(--line);border-radius:13px;overflow:hidden}
.m-inv-slab.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
/* 禁用/已售调淡只作用于图片与文字，不用容器 opacity，否则「已订」角标被一起调淡成粉色 */
.m-inv-slab.disabled .m-thumb>img,.m-inv-slab.disabled .m-inv-slab-body{opacity:.62}
.slab-ordered-tag{opacity:1}
.m-inv-slab-body{padding:9px;min-width:0}
/* 草稿占用（draftLocked）：卡片上写出原因 + 就地「释放」按钮（不再只有禁用态）。 */
.m-inv-draft-hint{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 9px 9px;padding:7px 9px;background:#f4f1ec;border:1px solid var(--line);border-radius:10px}
.m-inv-draft-hint .m-inv-draft-reason{flex:1 1 100%;font-size:clamp(10px,3.1vw,12px);color:var(--muted);overflow-wrap:anywhere}
.m-inv-draft-hint .m-inv-draft-release{flex:0 0 auto;white-space:nowrap}
/* 订单管理「定单草稿」卡片：片号 / 整料编号列表可能很长 → 任意位置换行，手机端不横向溢出。 */
.m-draft-card .m-subtle{overflow-wrap:anywhere}
.m-inv-code{font-size:clamp(12px,3.7vw,14px);font-weight:750;overflow-wrap:anywhere}
.m-inv-small{font-size:clamp(10px,3.1vw,12px);color:var(--muted);margin-top:4px;overflow-wrap:anywhere}
.m-check{position:absolute;left:8px;top:8px;width:31px;height:31px;border-radius:50%;border:2px solid rgba(255,255,255,.94);background:rgba(255,255,255,.92);display:grid;place-items:center;z-index:3;color:transparent;box-shadow:0 2px 8px rgba(0,0,0,.13)}
.m-check.on{background:var(--accent);color:#fff;border-color:#fff}
/* 【本次修复 · 订单进行中】被定单草稿占用的片（data-draft-locked="1"）：卡片边框 + 勾选框变红，
   标注「订单进行中」；点勾选框给提示（透明热点 .m-check-hit 盖住禁用按钮，接住点击）。 */
.m-inv-slab[data-draft-locked="1"]{border-color:#e60012}
.m-inv-slab[data-draft-locked="1"] .m-check{border-color:#e60012;background:#fdecec;box-shadow:0 0 0 2px rgba(230,0,18,.2)}
.m-check-hit{position:absolute;left:8px;top:8px;width:31px;height:31px;border-radius:50%;z-index:4;cursor:not-allowed}
.m-badge.order-active{background:#fdecec;color:#c4000f;border:1px solid #e60012;margin-left:6px}
.m-actionbar{position:fixed;left:50%;bottom:calc(var(--tab-h) + var(--safe-bottom));transform:translateX(-50%);z-index:55;width:100%;max-width:var(--page-max);min-height:72px;background:rgba(255,255,255,.97);backdrop-filter:blur(15px);border-top:1px solid var(--line);padding:9px 14px;display:flex;flex-wrap:wrap;align-items:center;gap:12px}
.m-action-info{flex:1;min-width:0}
.m-action-main{font-size:clamp(13px,3.8vw,15px);font-weight:750;overflow-wrap:anywhere}
.m-action-sub{font-size:clamp(11px,3.2vw,13px);color:var(--muted);margin-top:3px;overflow-wrap:anywhere}
.m-actionbar .m-btn{min-width:clamp(104px,32vw,140px);flex:0 0 auto}

/* 【键盘弹出 · 底部两条固定栏让位】手机端任意页面只要有 input/textarea/select 获得焦点
   （≈系统键盘弹起），就把固定的操作条与底部导航一起 display:none，让出它们原本压在
   输入框下方的那段高度（72px 操作条 + tab-h + safe-bottom），输入框不再被夹在栏与键盘之间。
   状态类由 mobile.js 的 document 级 focusin/focusout 委托打在 <html> 上（不逐个输入框绑），
   失焦即摘掉，栏恢复显示。这里用 display:none 而非上移/visibility:hidden：微信内置
   WebView(iOS) 对 fixed 元素最稳，且不残留任何布局空档。
   用 JS 状态类而非 CSS :has()：:has() 在部分微信 WebView 内核不生效（不生效时整条规则失效、
   栏还压着输入框），JS 委托在所有机型都生效，还能显式做失焦兜底。
   !important 用来压过 .m-bottom-tabs.m-tabs-collapsible.open{display:block}（3 个类的特异性更高），
   否则折叠态的底部导航在聚焦时藏不住。 */
html.m-kb-hide .m-actionbar,
html.m-kb-hide .m-bottom-tabs{display:none!important}
.m-draft-group{background:#fff;border:1px solid var(--line);border-radius:16px;margin-bottom:11px;overflow:hidden}
.m-draft-head{padding:12px 13px;background:#faf8f4;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;gap:10px}
.m-draft-item{display:grid;grid-template-columns:clamp(56px,18vw,74px) minmax(0,1fr);gap:10px;padding:10px 12px;border-bottom:1px solid var(--line)}
.m-draft-item:last-child{border-bottom:0}
.m-draft-code{font-size:clamp(12px,3.6vw,14px);font-weight:700;overflow-wrap:anywhere}
.m-draft-meta{font-size:clamp(10px,3.1vw,12px);color:var(--muted);margin-top:4px;overflow-wrap:anywhere}
.m-draft-head>*{min-width:0;overflow-wrap:anywhere}
/* 订单草稿可编辑结构：逐片「平方(㎡)」可手改。订单＝谁要哪些货，与价格彻底解耦，
   本区块不含任何价格字段；390-320 窄屏不横向溢出。 */
.m-de-group{background:#fff;border:1px solid var(--line);border-radius:16px;margin-bottom:11px;overflow:hidden}
.m-de-head{padding:12px 13px;background:#faf8f4;border-bottom:1px solid var(--line);display:flex;align-items:flex-start;justify-content:space-between;gap:9px}
.m-de-head-main{flex:1;min-width:0}
.m-de-title{font-weight:750;font-size:clamp(13px,3.8vw,15px);overflow-wrap:anywhere}
.m-de-remove{flex:0 0 auto;min-height:34px;padding:6px 10px;font-size:12px}
.m-de-sub{display:flex;flex-wrap:wrap;align-items:center;gap:6px 13px;padding:8px 13px;border-bottom:1px solid var(--line);background:#fffdf9;font-size:clamp(10.5px,3.1vw,12px);color:var(--muted)}
.m-de-item{padding:11px 12px;border-bottom:1px solid var(--line)}
.m-de-item:last-child{border-bottom:0}
.m-de-item-head{display:grid;grid-template-columns:56px minmax(0,1fr) auto;gap:9px;align-items:center}
.m-de-thumb{width:56px;flex:0 0 auto;border-radius:8px}
.m-de-id{min-width:0}
.m-de-code{font-size:clamp(12.5px,3.7vw,14px);font-weight:750;overflow-wrap:anywhere}
.m-de-meta{font-size:clamp(10px,3vw,12px);color:var(--muted);margin-top:4px;overflow-wrap:anywhere}
.m-de-fields{display:grid;grid-template-columns:minmax(0,1fr);gap:9px;margin-top:10px}
.m-de-field{min-width:0;background:#fbfaf7;border:1px solid var(--line);border-radius:10px;padding:7px 8px}
.m-de-field>span{display:block;font-size:10.5px;color:var(--muted);margin-bottom:5px;overflow-wrap:anywhere}
.m-de-input{width:100%;min-height:34px;padding:6px 8px;border:1px solid var(--line-strong);border-radius:9px;background:#fff;font-size:14px;text-align:right;color:var(--ink);outline:none}
.m-de-input:focus{border-color:var(--accent)}
.m-de-input.is-invalid{border-color:var(--danger);background:#fff7f6}
.m-total-card{background:#fff;border:1px solid var(--line);border-radius:16px;padding:14px}
.m-total-line{display:flex;justify-content:space-between;gap:10px;padding:5px 0;font-size:clamp(12px,3.5vw,14px);min-width:0}
.m-total-line>span,.m-total-line>strong{min-width:0;overflow-wrap:anywhere}
.m-total-line.big{font-size:17px;font-weight:800;border-top:1px solid var(--line);margin-top:6px;padding-top:12px}
.m-order-card{background:#fff;border:1px solid var(--line);border-radius:15px;padding:13px;margin-bottom:9px}
.m-order-top{display:flex;justify-content:space-between;gap:10px;min-width:0}
.m-order-tags{display:inline-flex;align-items:center;gap:6px;flex:0 1 auto;min-width:0;max-width:100%;flex-wrap:wrap;justify-content:flex-end}
.m-order-no{font-weight:780;font-size:clamp(13px,3.8vw,15px);min-width:0;overflow-wrap:anywhere}
.m-order-customer{font-size:clamp(12px,3.5vw,14px);margin-top:8px;overflow-wrap:anywhere}
.m-order-meta{font-size:clamp(10px,3.1vw,12px);color:var(--muted);margin-top:5px;line-height:1.5;overflow-wrap:anywhere}
/* 订单卡片「品种 · 平方数」行：字号/颜色与 .m-order-meta 同一档次；
   品种名可省略号截断、面积始终完整显示，320px 窄屏也不折行错位。 */
.m-order-spec{display:flex;align-items:baseline;gap:6px;min-width:0;font-size:clamp(10px,3.1vw,12px);color:var(--muted);margin-top:5px;line-height:1.5}
.m-order-spec-names{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.m-order-spec-sep{flex:0 0 auto}
.m-order-spec-area{flex:0 0 auto;white-space:nowrap}
.m-customer-card{background:#fff;border:1px solid var(--line);border-radius:14px;padding:13px;margin-bottom:9px}
.m-customer-name{font-size:clamp(13.5px,4vw,16px);font-weight:750;overflow-wrap:anywhere}
.m-customer-meta{font-size:clamp(11px,3.2vw,13px);color:var(--muted);margin-top:5px;line-height:1.55;overflow-wrap:anywhere}
.m-search{position:relative}
.m-search input{padding-left:38px}
.m-search::before{content:"⌕";position:absolute;left:13px;top:10px;font-size:20px;color:var(--muted);z-index:2}
.m-toast{position:fixed;z-index:200;left:50%;bottom:calc(92px + var(--safe-bottom));transform:translate(-50%,14px);max-width:min(88vw,480px);padding:10px 14px;background:rgba(30,29,27,.94);color:#fff;border-radius:10px;font-size:13px;opacity:0;pointer-events:none;transition:.2s}
.m-toast.show{opacity:1;transform:translate(-50%,0)}
.m-modal-backdrop{position:fixed;inset:0;z-index:120;background:rgba(23,22,20,.5);display:flex;align-items:flex-end;justify-content:center}
/* max-height 用 dvh 兜底：与 body / #m-app / .m-page 同一口径（不支持 dvh 的浏览器读不到第二条，仍按 88vh）。
   【滑动修复 · 2026-10-01】原来这里是 overscroll-behavior:contain —— 弹层滚到底后**不把滚动传给底层页面**。
   于是「弹层本身几乎没有可滚内容」时（短表单 / 只有几行选项 / 键盘弹起后可视区变矮），
   手指落在弹层里（选框 / 输入框 / 选择器 / 空白）上下滑 → 弹层自己不滚、底层也不滚，**整屏不动**。
   现在改回 CSS 初始值 auto（等价于删掉那一条 contain）：面板有自己的可滚内容 → 面板内滚（行为不变）；
   滚到底 / 本来就没有内容 → 由浏览器按原生滚动链继续传给底层页面。
   需要独占手势的地方不受影响：灯箱是 touch-action:none、拖拽排序是 body.cover-dragging、
   面板下拉关闭 / 长按拖拽只在各自那一段 preventDefault。
   键盘弹起时 vh/dvh 都不跟着缩（iOS 的 dvh 也不含键盘），由 mobile.js 的 visualViewport 兜底再收紧（见 syncSheetViewportHeight）。 */
.m-sheet{width:100%;max-width:var(--page-max);max-height:88vh;max-height:min(88vh,88dvh);overflow:auto;overscroll-behavior:auto;background:#fff;border-radius:22px 22px 0 0;padding:18px 16px calc(18px + var(--safe-bottom))}
/* 【吸底操作行】弹层收尾的「取消 / 保存」行统一包进 .m-sheet-actions（由 mobile.js enhanceSheetActions 生成）：
   贴在滚动区底部，内容再长、键盘再弹，按钮始终可见可点。含安全区 padding，避让 iPhone 底部横条。 */
.m-sheet-actions{position:sticky;bottom:0;z-index:2;background:#fff;padding-top:10px;padding-bottom:calc(2px + var(--safe-bottom))}
.m-sheet-actions>.m-btn-row{margin-top:0}
.m-sheet-handle{width:42px;height:4px;border-radius:4px;background:#d8d3cc;margin:-8px auto 14px}
.m-sheet-title{font-size:18px;font-weight:800;margin:0 0 15px}
/* 【自定义确认 / 提示层】独立顶层覆盖层：z-index:1000 高于页面内一切覆盖层
   （.m-toast:200 / .m-lightbox:180 / .m-modal-backdrop:120），必须盖住触发它的宿主层。
   .m-confirm-msg 用 pre-wrap 保留 \n\n 空行，overflow-wrap:anywhere 防窄屏横向溢出。 */
.m-confirm-backdrop{z-index:1000}
.m-confirm-sheet{padding-bottom:calc(18px + var(--safe-bottom))}
.m-confirm-msg{font-size:15px;line-height:1.6;color:var(--ink);margin:2px 0 16px;overflow-wrap:anywhere;white-space:pre-wrap}
/* mPrompt 的文本输入框（禁止原生 prompt）：宽度自适应、可换行，320 宽不溢出。 */
.m-confirm-input{width:100%;min-width:0;min-height:88px;margin:0 0 16px;padding:10px 11px;font-size:15px;line-height:1.5;text-align:left;resize:vertical;overflow-wrap:anywhere}
.m-lightbox{position:fixed;inset:0;z-index:180;background:#111;display:flex;flex-direction:column;color:#fff}
.m-lightbox-top{height:58px;display:flex;align-items:center;gap:9px;padding:7px 10px}
.m-lightbox-title{flex:1;min-width:0;text-align:center;font-size:13px;overflow-wrap:anywhere}
.m-lightbox-imgwrap{flex:1;min-height:0;display:grid;place-items:center;overflow:hidden}
.m-lightbox-imgwrap img{width:100%;height:100%;object-fit:contain}
/* 图片预览内允许双指缩放/单指拖动：touch-action:none 只作用于 lightbox 容器本身，
   页面根元素 html,body 仍是 pan-x pan-y —— 整页缩放依旧锁死，关闭预览无残留。 */
.m-lightbox{touch-action:none}
/* 【滑动修复 · 2026-10-01】复用同一外壳、但**不是图片预览**的弹层，必须把滚动还给它们：
   · .m-lightbox.m-vt-modal（访客列表 / KPI 明细 / 关联现有客户 / 创建新客户 / 询价 / 分享链接）
   · .m-lightbox.m-pur-longimg-modal（整单长图，靠 .m-pur-longimg-wrap 上下看完整张）
   这两类外壳内部各有一个 overflow:auto 的滚动区（.m-vt-modal-body / .m-pur-longimg-wrap），
   而祖先上的 touch-action:none 会把整段 touch 手势吃掉 ⇒ **列表 / 长图根本滑不动**。
   这里只把这两类外壳恢复成与 html,body 同口径的滚动（pan-x pan-y：可上下左右滚，
   捏合缩放 / 双击放大仍锁死）；真正的图片预览（.m-lightbox 且不带这两个类名）一行未动，
   仍旧 touch-action:none，由 lightbox 自己的双指缩放 / 单指拖动独占。 */
.m-lightbox.m-vt-modal,.m-lightbox.m-pur-longimg-modal{touch-action:pan-x pan-y}
.m-lightbox-imgwrap img{transform-origin:50% 50%;will-change:transform}
/* 仅「1x 横滑松手动画」期间才挂 .lb-anim：此时才带 transition（拖动跟手时绝不带，否则会延迟）；
   动画结束（transitionend 或定时兜底）由脚本一定摘掉，绝不残留。 */
.m-lightbox-imgwrap img.lb-anim{transition:transform .2s ease-out}
.m-lightbox-bottom{min-height:68px;padding:9px 13px calc(9px + var(--safe-bottom));display:flex;align-items:center;justify-content:space-between;gap:10px}
.m-lightbox button{min-width:44px;min-height:44px;border-radius:12px;border:1px solid #3a3a3a;background:#222;color:#fff}
.m-loading-screen{min-height:100vh;display:grid;place-items:center;align-content:center;gap:13px;color:var(--muted)}
.m-spinner{width:28px;height:28px;border-radius:50%;border:3px solid #ddd7ce;border-top-color:var(--accent);animation:mspin .8s linear infinite}
@keyframes mspin{to{transform:rotate(360deg)}}
.m-inline-loading{padding:24px;text-align:center;color:var(--muted)}
.m-divider{height:1px;background:var(--line);margin:14px 0}
.m-visit{background:#fff;border:1px solid var(--line);border-radius:13px;padding:12px;margin-bottom:8px}
.m-visit-top{font-size:clamp(12px,3.6vw,14px);font-weight:700;overflow-wrap:anywhere}
.m-visit-meta{font-size:clamp(10px,3.1vw,12px);color:var(--muted);margin-top:5px;overflow-wrap:anywhere}
@media(max-width:390px){
  .m-content{padding-left:11px;padding-right:11px}
  .m-inv-card{gap:10px;padding:10px 11px}
  .m-inv-thumb{border-radius:11px}
  .m-toolbar{padding-left:11px;padding-right:11px}
  .m-actionbar{padding-left:11px;padding-right:11px}
  /* 「全选 + 已选N片 + 加入订单(N)」在 320 宽也要放得下 */
  .m-actionbar{gap:6px}
  .m-actionbar .m-btn{min-width:0;padding:8px 8px;font-size:12.5px}
  .m-actionbar .m-inv-check-all{padding:6px 6px}
}
/* 320 宽（iPhone SE）：操作条允许换行，「已选 N 片 / 面积」保持可读（不挤成省略号）。 */
@media(max-width:340px){
  .m-actionbar{flex-wrap:wrap;row-gap:2px}
}

/* === 保存可见反馈层（老板 2026-10-14：「不要停在那里」）===
   进度行是 .m-actionbar 的第一个子节点，绝对定位贴在按钮**正上方**：
   操作条本身 position:fixed + z-index:55，所以这一行永远可见，且不改变按钮布局（零位移、零抖动）。 */
.m-pur-progress{position:absolute;left:0;right:0;bottom:100%;display:flex;align-items:center;gap:8px;
  padding:8px 14px;background:rgba(255,255,255,.98);border-top:1px solid var(--line);
  box-shadow:0 -3px 10px rgba(0,0,0,.05);font-size:clamp(12px,3.5vw,14px);font-weight:650;color:var(--ink);
  pointer-events:none}
/* 必须显式写：作者样式的 display:flex 会压过 [hidden] 的 UA display:none。 */
.m-pur-progress[hidden]{display:none}
.m-pur-progress.is-done{color:var(--accent-dark)}
.m-pur-progress.is-done .m-spinner{display:none}
.m-pur-progress-text{min-width:0;overflow-wrap:anywhere}
/* 按钮内嵌小转圈：复用 .m-spinner 的形状与动画，只缩尺寸（不新增 keyframes）。 */
.m-spinner.m-spinner-inline{width:15px;height:15px;border-width:2px;flex:0 0 auto}
.m-btn .m-spinner.m-spinner-inline{margin-right:6px}
.m-btn.primary .m-spinner.m-spinner-inline{border-color:rgba(255,255,255,.45);border-top-color:#fff}
/* 「保存中…」按钮里的转圈 + 文字居中（不使用 :has()，直接给按钮加 .is-loading）。 */
.m-btn.is-loading{display:inline-flex;align-items:center;justify-content:center}

/* === FLAT SPECIES SLAB VIEW === */

/*
手机产品展示采用：

品种
  ↓
该品种全部整料 + 全部单片
  ↓
单片详情

整料不再成为独立页面，
而是在同一个品种页面中作为分组标题。
*/

.m-species-flat-page{
  padding-top:10px;
}

.m-species-overview{
  margin-bottom:18px;
  padding:0 2px 4px;
}

.m-species-overview-main{
  font-size:clamp(12.5px,3.7vw,14px);
  line-height:1.5;
  color:var(--muted);
  overflow-wrap:anywhere;
}

.m-species-overview-note{
  margin-top:4px;
  font-size:clamp(10px,3.1vw,12px);
  color:#a59d90;
  overflow-wrap:anywhere;
}

.m-species-block-group{
  margin-bottom:26px;
}

.m-species-block-group:last-child{
  margin-bottom:8px;
}

.m-species-block-head{
  display:flex;
  align-items:flex-end;
  justify-content:space-between;
  gap:12px;
  margin-bottom:10px;
  padding:0 2px;
  min-width:0;
}

.m-species-block-code{
  font-size:clamp(15px,4.6vw,18px);
  line-height:1.25;
  font-weight:800;
  color:var(--ink);
  letter-spacing:-.01em;
  overflow-wrap:anywhere;
}

.m-species-block-summary{
  margin-top:4px;
  font-size:clamp(10px,3.1vw,12px);
  line-height:1.4;
  color:var(--muted);
  overflow-wrap:anywhere;
}

.m-species-slab-grid{
  align-items:start;
  grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--tile-min)),1fr));
  gap:var(--tile-gap);
}

.m-species-slab-card{
  min-width:0;
}

.m-species-slab-card .m-product-img{
  /*
  4:3 固定框 + contain：整张缩进去，不裁切、不丢内容，四周留品牌浅色。
  */
  aspect-ratio:4 / 3;
  object-fit:contain;
  object-position:50% 50%;
}

.m-species-slab-image-wrap{
  position:relative;
  cursor:pointer;
  width:100%;
  /* 4:3 固定框：破图隐藏后这里仍撑出品牌浅色留白带 */
  aspect-ratio:4 / 3;
  overflow:hidden;
  background:var(--surface-soft);
}

.m-species-slab-card .m-product-body{
  cursor:pointer;
}

.m-species-slab-card .m-product-name{
  font-size:clamp(12.5px,3.7vw,15px);
  line-height:1.25;
}

.m-species-slab-card .m-product-meta{
  font-size:clamp(10px,3.1vw,12px);
  line-height:1.55;
}

.m-species-block-empty{
  padding:18px 12px;
  border:1px dashed var(--line-strong);
  border-radius:12px;
  color:var(--muted);
  font-size:12px;
  text-align:center;
}

.m-species-block-error{
  padding:14px;
  border:1px solid #ead9d3;
  border-radius:12px;
  background:#fff8f6;
  color:var(--danger);
  font-size:12px;
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:10px;
}

/*
平铺网格列数交给 auto-fill（--tile-min）自适应：
320 / 360 / 390 / 430 都不会横向溢出，也不写死列数。
石材扫描图需要足够面积，因此 --tile-min 封顶 200px，
窄屏自动变窄、宽屏也不会挤成很小的一张。
*/
@media(max-width:430px){
  .m-species-slab-card .m-product-body{
    padding:9px;
  }

  .m-species-block-group{
    margin-bottom:23px;
  }
}

/* === END FLAT SPECIES SLAB VIEW === */

/* === MOBILE HOME BLOCK CARDS V2 === */

/*
产品展示首页：
每一颗 StoneBlock 都是一张独立卡片。

同品种多颗料不会合并。

例如：
大花白 · ZCD-63
大花白 · ZCD-83

分别显示。
*/

.m-home-block-grid{
  /* 【卡片等高】同一行整料卡拉齐（卡片自身再撑满整行） */
  align-items:stretch;
  grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--tile-min)),1fr));
  gap:var(--tile-gap);
}

.m-home-block-card{
  min-width:0;
  overflow:hidden;
  /* 【卡片等高】竖向 flex 容器 + 撑满网格行：名字 1 行 / 2 行的卡片一样高 */
  display:flex;
  flex-direction:column;
  height:100%;
}

.m-home-block-card:active{
  transform:scale(.995);
}

.m-home-block-img-wrap{
  width:100%;
  /* 【图片框固定 4:3】不因文字行数变化而改变大小 */
  flex:0 0 auto;
  /* 同上：破图隐藏后仍保留品牌浅色占位带，不塌陷 */
  aspect-ratio:4 / 3;
  overflow:hidden;
  background:var(--surface-soft);
  border-radius:14px 14px 0 0;
  /* 渐进加载：缩略图铺在容器背景上做占位（高清层淡入前用户已经看到图，不闪不跳）；
     底图与 <img> 同为 contain → 淡入替换时不会出现「先裁后缩」的跳版 */
  background-position:50% 50%;
  background-size:contain;
  background-repeat:no-repeat;
}

/* 整料封面渐进加载（2026-09-24）：缩略图先到 → 高清预加载完成 → 淡入替换。
   两版宽高比一致（后端只等比缩放、不裁切），所以替换时不会跳版；
   object-fit:cover 保证不裁切（存储）也不变形、不撑破布局（显示）。
   `html.prog-ready` 由 mobile.js 打上：脚本没跑起来时图片直接可见（回落缩略图），不会空白。 */
html.prog-ready .prog-img{
  opacity:1;
  transition:opacity .4s ease;
}
html.prog-ready .prog-img.is-hd-ready,
html.prog-ready .prog-img.is-thumb-only{
  opacity:1;
}

/* 二级页（整料详情大图 / 单片灯箱 / 单片详情）渐进加载（2026-10-01）：小图先顶场 → 高清淡入。
   只对 `.prog-detail-img` 生效，首页卡片一行未改；
   `html.prog-ready` 由 mobile.js 打上：脚本没跑起来时这些图直接可见（回落小图），不会空白。
   时长：320ms 淡入（整体 ≤400ms，拖长了会显得卡）。 */
html.prog-ready .prog-detail-img{
  opacity:0;
  transition:opacity .32s ease;
}
html.prog-ready .prog-detail-img.is-hd-ready,
html.prog-ready .prog-detail-img.is-thumb-only{
  opacity:1;
}
/* 【兜底 · 硬性】`PROG_DETAIL_THUMB_MS` 内小图没上屏（404 / 超时 / 比目标图慢）→ 直接把它放出来：
   不淡入（transition:none，瞬时显示，比改造前更快）、不模糊（JS 同时摘掉 `.prog-focus` 糊层），
   目标图回来照样换上同样的最终画面 ⇒ 绝不比改造前更差。 */
html.prog-ready .prog-detail-img.is-fallback{
  opacity:1;
  transition:none;
}

/* ==== 【占位防白 · 2026-10-01，2026-10-02 取消对焦模糊】初始 320 小图直接平铺（无 blur / 无 scale）→ 高清 load 后淡入，====
   ==== 同时由 JS 撤掉占位层 ⇒ 观感是「占位小图直接换高清」。                                            ====
   · 糊**只**加在小图这一层：容器伪元素（`background-image:var(--prog-thumb)`，就是原来铺在容器底图上的
     那张 320 小图，同一个 URL ⇒ 浏览器只下一次请求）。
   · 高清 <img> 一律不加 filter ⇒ 高清不参与模糊合成、不掉帧。
   · `transform:scale(1.02)`：糊了以后边缘不会露白（1% 外扩，容器自带 overflow:hidden 裁掉）。
   · 静态模糊：只画一次、不随帧变化（不做 filter 动画），不引入额外重排 / 重绘。
   · `.prog-focus` 由 mobile.js 只给这三处容器打上（`.m-cover-slide` / `.m-lightbox-imgwrap` /
     `.m-slab-detail-media`，且**必须先有小图**）⇒ 首页卡片 / 首页横幅轮播一行未改；
     高清淡入结束后 JS 把 `.prog-focus` 与 `--prog-thumb` 一起摘掉 ⇒ 最终画面只剩高清这一张，
     与改造前逐像素一致。
   · `z-index:-1` 压在小图 / 高清 <img> 之下（不碰 <img> 自身样式）；`.prog-focus` 用 isolation:isolate
     自成一个层叠上下文，保证这层既盖得住容器底色、又绝不盖住 <img> 与缩放角标。 */
.prog-focus{position:relative;isolation:isolate}
html.prog-ready .prog-focus::before{
  content:"";
  position:absolute;
  top:0;
  right:0;
  bottom:0;
  left:0;
  z-index:-1;
  pointer-events:none;
  background-image:var(--prog-thumb,none);
  background-position:50% 50%;
  background-repeat:no-repeat;
  background-size:cover;                 /* 封面轮播：与 .m-cover-slide img 的 object-fit:cover 同口径 */
}
html.prog-ready .m-lightbox-imgwrap.prog-focus::before,
html.prog-ready .m-slab-detail-media.prog-focus::before{
  background-size:contain;               /* 灯箱 / 单片详情：与对应 <img> 的 object-fit:contain 同口径 */
}
/* 容器底图口径（与 <img> 的 cover / contain 一一对应）—— 2026-10-01 起小图改由上面的 `.prog-focus::before`
   渲染（`--prog-thumb`），这两行保留只为「万一还有遗留的内联 background-image 写进来」时口径不跑偏。 */
.m-cover-slide{background-size:cover;background-position:50% 50%;background-repeat:no-repeat}
.m-lightbox-imgwrap{background-size:contain;background-position:50% 50%;background-repeat:no-repeat}

/* 【低端 / 省电降级 · 硬性】命中 `prefers-reduced-motion:reduce` → 不加糊、不做动画：
   初始就是清晰的小图，高清到位即换（瞬时），中间不插任何过渡 ⇒ 与改造前逐帧一致。 */
@media (prefers-reduced-motion:reduce){
  html.prog-ready .prog-focus::before{filter:none;transform:none}
  html.prog-ready .prog-detail-img{transition:none}
}

/* 单片详情（#/slabs/:id）行内大图的媒体容器（2026-10-01）：把原来那张裸 <img> 套进一层容器，
   复用上面同一套 `prog-img` / `prog-detail-img` 机制（320 小图铺底 → 高清淡入 → 收尾摘底图）。
   `width:100% / max-height:62vh / object-fit:contain / background:#111` 与改造前逐字相同
   （object-fit 对非替换盒子是空操作，保留只为口径逐字对齐）；320 小图与最终高清同比例
   ⇒ 底图与高清都按 contain 落进同一个盒，淡入时逐像素对齐、不跳版。
   「套容器 = 零位移」的依据：全站有 `img{display:block;max-width:100%}`，那张大图本来
   就是块级、不参与行盒基线（原 .m-card 高度 == 图片盒高度）。所以容器同样用块级、
   且容器只包这一个块级 <img> ⇒ 容器盒 == 图片盒（底图 background box 与高清逐像素重合），
   .m-card 高度 / 图片位置 / 下方内容偏移量都与改造前一致，既不会多出行盒基线间隙、也无新增留白。 */
.m-slab-detail-media{
  display:block;
  width:100%;
  max-height:62vh;
  object-fit:contain;
  background-color:#111;
  background-size:contain;
  background-position:50% 50%;
  background-repeat:no-repeat;
}
.m-slab-detail-media>img{display:block}

.m-home-block-img{
  /*
  4:3 固定框 + contain：整张缩进去，不裁切、不丢内容，四周留品牌浅色。
  */
  width:100%;
  aspect-ratio:4 / 3;
  object-fit:contain;
  object-position:50% 50%;
}

.m-home-block-title{
  font-size:clamp(13px,3.9vw,16px);
  line-height:1.35;
  /* 【名字固定 2 行】最多 2 行、超出省略号；只有 1 行也占满 2 行高度 → 卡片等高 */
  display:-webkit-box;
  -webkit-line-clamp:2;
  -webkit-box-orient:vertical;
  white-space:normal;
  overflow:hidden;
  text-overflow:ellipsis;
  min-height:2.7em;
  word-break:break-word;
  overflow-wrap:anywhere;
}

/* 【卡片等高】文字区撑满卡片剩余高度，每张卡片的名字 / 信息行位置一致 */
.m-home-block-card .m-product-body{
  display:flex;
  flex-direction:column;
  flex:1 1 auto;
}

.m-home-block-meta{
  margin-top:6px;
  font-size:clamp(10.5px,3.2vw,13px);
  line-height:1.45;
  overflow-wrap:anywhere;
}

@media(max-width:430px){
  .m-home-block-card .m-product-body{
    padding:10px;
  }

}

/* === END MOBILE HOME BLOCK CARDS V2 === */

/* === MOBILE BLOCK SHELF FILTER (#/blocks/:id) === */
/* 整料页顶部架号 chip 条：换行/收缩由全局 .m-chips/.m-chip 统一处理，这里只保留窄屏特殊尺寸 */
#m-block-shelf-chips{
  column-gap:clamp(5px,1.6vw,7px);
  row-gap:8px;
  margin:0 0 12px;
}

#m-block-shelf-chips .m-chip{
  min-height:30px;
  padding:4px clamp(8px,2.6vw,13px);
  font-size:clamp(12px,3.3vw,13px);
  line-height:1.25;
  text-align:center;
}

/* 单片卡上的架号：小字弱化，放在 meta 行开头 */
.m-slab-shelf{
  display:inline-block;
  font-size:11px;
  font-weight:700;
  line-height:1.35;
  color:var(--muted);
  background:var(--surface-soft);
  border-radius:6px;
  padding:1px 6px;
  letter-spacing:.02em;
}
/* === END MOBILE BLOCK SHELF FILTER === */

/* === MOBILE PARITY BATCH 2B === */

/* 客户列表：列字段与 PC 对齐（性别/电话/公司/地区/备注/四项口径/归属） */
.m-customer-top{
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:10px;
  min-width:0;
}
.m-customer-top .m-customer-name{
  flex:1;
  min-width:0;
}
.m-customer-notes{
  margin-top:7px;
  padding:7px 9px;
  border-radius:9px;
  background:var(--surface-soft);
  font-size:clamp(11px,3.2vw,13px);
  color:var(--muted);
  line-height:1.5;
  overflow-wrap:anywhere;
}
.m-customer-counts{
  display:flex;
  flex-wrap:wrap;
  gap:6px 12px;
  margin-top:9px;
  color:var(--muted);
  font-size:clamp(10px,3.1vw,12px);
}
.m-customer-counts span{
  min-width:0;
}
.m-customer-counts strong{
  color:var(--ink);
  font-weight:750;
  margin-right:3px;
}

/* 客户详情：资料行 + 选购单分组 + 访问轨迹 */
.m-profile-lines{
  margin-top:12px;
}

/* 客户访问与全局访问记录：字段标签网格，窄屏自动换行不横向溢出 */
.m-visit-grid{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,108px),1fr));
  gap:8px 10px;
  margin-top:9px;
  border-top:1px dashed var(--line);
  padding-top:9px;
}
.m-visit-grid span{
  min-width:0;
  font-size:clamp(11px,3.2vw,13px);
  overflow-wrap:anywhere;
}
.m-visit-grid label{
  display:block;
  font-size:10px;
  color:var(--muted);
  margin-bottom:2px;
}

/* === END MOBILE PARITY BATCH 2B === */

/* === MOBILE PARITY BATCH 3 === */
.m-inv-batchbar,
.m-cust-batchbar{
  margin-top:10px;
  display:flex;
  align-items:center;
  gap:8px;
  background:var(--surface);
  border:1px solid var(--line);
  border-radius:12px;
  padding:8px 10px;
  font-size:12px;
  color:var(--muted);
}
.m-inv-batchbar>span,
.m-cust-batchbar>span{
  flex:1;
  min-width:0;
}
.m-inv-batchbar .m-btn,
.m-cust-batchbar .m-btn{
  min-height:38px;
  padding:6px 12px;
  flex:0 0 auto;
}
/* 【排序栏吸顶】「大板库存管理」的排序操作栏（全选 / 已选 N 颗料 / ↑ 上移 / ↓ 下移 / 删除选中）
   固定在页头正下方：下方整料卡片列表上下滚动时该行不跟着滚，随时可点。
   ① 吸顶位置 = 整块「标题栏 + 菜单栏」（.m-topbar）高度：2026-09-28 起 .m-topbar 整块
      position:sticky（高度由标题行高 + 菜单栏决定，不等于 min-height:58px），所以 top 用
      JS 量出来的 --m-inv-sticky-top（量不到时回落到 58px + --safe-top）。
      top:0 会让排序栏被页头/菜单栏整块盖住，因此必须让出这一段；
   ② 生效范围 = 父容器（.m-page，它包住整张列表）→ 滚到列表末尾前一直吸着；
   ③ 不透明底 + 细阴影：卡片从操作栏底下滚过时不能透出来；
   ④ z-index:20 —— 低于页头（30）、低于弹层；高于卡片。 */
/* 【大板库存 · 搜索 + 仓筛选吸顶】搜索框与「全部仓 / 本地仓」同一个吸顶壳（#m-inv-search-shell）：
   往上滚动时一起钉在页头下沿；sticky 口径与下方 .m-inv-batch-shell 完全一致——
   top = JS 量出的整块页头真实高度 + 导航当前位移 --m-nav-y（两者同步跟手，不会各走各的）。
   不透明底：下方状态段 / 卡片从它底下滚过时不能透出来。 */
.m-inv-toolbar-head{padding-bottom:0}
.m-inv-search-shell{
  position:sticky;
  top:calc(var(--m-inv-sticky-top,calc(58px + var(--safe-top))) + var(--m-nav-y,0px));
  z-index:21;
  padding:10px 14px 9px;
  background:var(--bg);
}
/* 【仓标签=状态段同款】老板要求「点哪个标签，白色滑块就在哪个上面」：
   外壳与 .m-segment 逐字同口径（灰底 + 2px 内衬 + 10px 圆角），按钮占满一半。
   【作用域】只作用于 .m-inv-wh-tabs 内的 .m-wh-tab；首页共用同名类 .m-wh-tab（CSS 1759）不受影响。
   【状态段隔离】不修改 .m-segment 任何一行。 */
.m-inv-wh-tabs{display:flex;background:#ece8e0;padding:2px;border-radius:10px;margin-top:8px}
.m-inv-wh-tabs .m-wh-tab{flex:1;min-width:0;height:auto;border:0;background:transparent;min-height:30px;border-radius:8px;color:var(--muted);font-weight:650;font-size:clamp(12.5px,3.4vw,13.5px);line-height:normal}
.m-inv-wh-tabs .m-wh-tab.on{background:#fff;color:var(--ink);font-weight:650;box-shadow:0 2px 9px rgba(0,0,0,.06)}
.m-inv-toolbar-tail{padding-top:0}
.m-inv-batch-shell{
  position:sticky;
  /* 【跟手兼容】top = 量出的整块页头高度 + 导航当前位移 --m-nav-y（负值 = 导航上移时本行跟着上移），
     保证排序栏恒贴在导航下沿；--m-nav-y 缺省 0px 时与改造前逐字节等价。
     【搜索吸顶】排序栏还要让出上方「搜索框 + 仓标签」吸顶壳的真实高度（--m-inv-search-h）。 */
  top:calc(var(--m-inv-sticky-top,calc(58px + var(--safe-top))) + var(--m-inv-search-h,0px) + var(--m-nav-y,0px));
  z-index:20;
  padding:0 14px;
  background:var(--bg);
}
/* 销售页（大板销售管理）/ 无权限时 JS 整体不渲染这个壳 → 不占位、不做吸顶留白。 */
.m-inv-batch-shell .m-inv-batchbar{
  margin-top:0;
  box-shadow:0 6px 16px rgba(42,37,30,.08);
}
.m-inv-check-all{
  border:0;
  background:var(--surface-soft);
  min-height:34px;
  padding:6px 10px;
  border-radius:9px;
  color:var(--ink);
  font-weight:650;
  flex:0 0 auto;
  white-space:nowrap;
}
.m-inv-check-all.on{
  background:var(--accent);
  color:#fff;
}
.m-inv-check-all.part{
  background:var(--accent-soft);
  color:var(--accent-dark);
  box-shadow:inset 0 0 0 1px var(--accent);
}
.m-inv-card{
  position:relative;
}
.m-inv-card.selected{
  border-color:var(--accent);
  box-shadow:0 0 0 1px var(--accent);
}
.m-inv-pick,
.m-cust-pick{
  position:absolute;
  left:8px;
  top:8px;
  z-index:3;
  width:30px;
  height:30px;
  border-radius:50%;
  border:2px solid rgba(255,255,255,.94);
  background:rgba(255,255,255,.92);
  display:grid;
  place-items:center;
  color:transparent;
  box-shadow:0 2px 8px rgba(0,0,0,.13);
}
.m-inv-pick.on,
.m-cust-pick.on{
  background:var(--accent);
  color:#fff;
  border-color:#fff;
}
.m-inv-card:has(.m-inv-pick) .m-inv-thumb{
  margin-left:26px;
}
.m-fail-list{
  display:grid;
  gap:8px;
  margin-bottom:12px;
}
.m-fail-list>div{
  background:#fff8f6;
  border:1px solid #f0d4cf;
  border-radius:10px;
  padding:9px 10px;
  color:var(--danger);
  line-height:1.45;
  overflow-wrap:anywhere;
}
.m-error{
  background:#fff8f6;
  border:1px solid #f0d4cf;
  border-radius:10px;
  padding:9px 10px;
  color:var(--danger);
  font-size:12px;
  line-height:1.45;
  margin-bottom:12px;
  overflow-wrap:anywhere;
}
.m-customer-card{
  position:relative;
}
.m-customer-card.selected{
  border-color:var(--accent);
  box-shadow:0 0 0 1px var(--accent);
}
.m-customer-card:has(.m-cust-pick){
  padding-left:44px;
}
.m-customer-actions{
  display:flex;
  align-items:center;
  gap:7px;
  flex:0 0 auto;
}
.m-cust-edit{
  min-height:34px;
  padding:5px 10px;
  font-size:12px;
}
.m-customer-load-more{
  margin-top:4px;
  text-align:center;
}
.m-dup-group{
  background:var(--surface);
  border:1px solid var(--line);
  border-radius:12px;
  padding:11px;
  margin-bottom:10px;
}
.m-dup-group-head{
  font-size:13px;
  margin-bottom:8px;
}
.m-dup-choice{
  display:flex;
  align-items:center;
  gap:8px;
  min-height:38px;
  padding:6px 8px;
  border-radius:9px;
  background:var(--surface-soft);
  margin-top:6px;
  font-size:13px;
  overflow-wrap:anywhere;
}
.m-dup-choice input{
  width:18px;
  height:18px;
  flex:0 0 auto;
}
.m-order-selection{
  display:flex;
  align-items:center;
  gap:9px;
  background:var(--surface);
  border:1px solid var(--line);
  border-radius:12px;
  padding:9px 10px;
  margin-bottom:11px;
  font-size:12px;
  color:var(--muted);
}
.m-order-selection span{
  flex:1;
  min-width:0;
}
.m-order-selection .m-btn{
  min-height:36px;
  padding:6px 11px;
  flex:0 0 auto;
}
.m-order-item{
  position:relative;
  display:flex;
  gap:11px;
  background:var(--surface);
  border:1px solid var(--line);
  border-radius:13px;
  padding:11px;
  margin-bottom:9px;
}
.m-order-item.selected{
  border-color:var(--accent);
  box-shadow:0 0 0 1px var(--accent);
}
.m-order-item .m-thumb.xs{
  width:74px;
  flex:0 0 74px;
  margin-top:8px;
}
.m-order-item-body{
  flex:1;
  min-width:0;
}
.m-order-item-head{
  display:flex;
  align-items:flex-start;
  gap:8px;
}
.m-order-item-head .m-draft-code{
  flex:1;
  min-width:0;
}
.m-order-swap{
  min-height:32px;
  padding:4px 9px;
  font-size:12px;
  flex:0 0 auto;
}
.m-replace-modal{
  min-width:0;
}
.m-replace-count{
  margin-top:8px;
  font-size:12px;
  color:var(--muted);
}
.m-replace-grid{
  display:grid;
  grid-template-columns:repeat(auto-fill,minmax(min(100%,112px),1fr));
  gap:8px;
  margin-top:8px;
}
.m-replace-card{
  min-width:0;
  border:1px solid var(--line-strong);
  border-radius:11px;
  background:var(--surface);
  overflow:hidden;
  padding:0;
  display:flex;
  flex-direction:column;
  text-align:left;
}
.m-replace-card.picked{
  border-color:var(--accent);
  box-shadow:0 0 0 1px var(--accent);
}
.m-replace-thumb{
  position:relative;
  width:100%;
  aspect-ratio:16 / 10;
  background:var(--surface-soft);
  overflow:hidden;
}
.m-replace-thumb img{
  width:100%;
  height:100%;
  object-fit:contain;
}
.m-replace-thumb img.m-replace-img-fail{
  display:none;
}
.m-replace-tick{
  position:absolute;
  right:6px;
  top:6px;
  width:22px;
  height:22px;
  border-radius:50%;
  display:none;
  place-items:center;
  background:var(--accent);
  color:#fff;
}
.m-replace-card.picked .m-replace-tick{
  display:grid;
}
.m-replace-body{
  padding:7px 8px 8px;
  min-width:0;
}
.m-replace-code{
  display:block;
  font-size:12px;
  font-weight:750;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}
.m-replace-area{
  display:block;
  font-size:11px;
  color:var(--accent-dark);
  margin-top:3px;
}
.m-replace-dims{
  display:block;
  font-size:10px;
  color:var(--muted);
  margin-top:3px;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}
.m-replace-summary{
  margin-top:10px;
  background:var(--accent-soft);
  border-radius:10px;
  padding:9px 10px;
  font-size:13px;
  overflow-wrap:anywhere;
}

/* 整料页顶部封面轮播：原生横向 scroll-snap，不引入新依赖 */
.m-cover-carousel{
  position:relative;
  margin:0 0 10px;
  border-radius:14px;
  overflow:hidden;
  background:var(--accent-soft);
}
.m-cover-track{
  display:flex;
  overflow-x:auto;
  overflow-y:hidden;
  scroll-snap-type:x mandatory;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
  max-width:100%;
  /* 加载前的默认框比例；首图 onload 后按真实比例覆盖（M.coverAspect），横竖构图共用一套框 */
  aspect-ratio:4 / 3;
}
.m-cover-track::-webkit-scrollbar{display:none}
.m-cover-slide{
  flex:0 0 100%;
  height:100%;
  scroll-snap-align:center;
  min-width:0;
}
.m-cover-slide img{
  display:block;
  width:100%;
  height:100%;
  /* 封面自 2026-09-24 起不再裁切（原比例落盘），轨道按首图真实比例定框；
     两版比例相同 → cover 与 contain 等效：既不裁切、也不变形、不撑破布局 */
  object-fit:cover;
  object-position:50% 50%;
  background:linear-gradient(180deg,var(--accent-soft),rgb(0 0 0 / .04));
}
.m-cover-slide img.is-broken{display:none}
/* 封面轮播拖拽交互：鼠标按住可拖；图片不参与原生拖拽/选中，避免打断 pointermove */
.m-cover-track{cursor:grab}
.m-cover-track.is-dragging{cursor:grabbing;scroll-snap-type:none}
.m-cover-slide img{-webkit-user-drag:none;user-select:none}
/* 整料页封面「可点开大图」的角标：右下角小放大镜。纯绝对定位，不进版式、不占宽高，
   也不会改变轮播/圆点的任何尺寸；pointer-events:none 保证它不抢走 track 的点击。
   首页横幅轮播（.m-banner-carousel）不渲染这个角标，这里也只对非横幅轮播生效。 */
.m-cover-carousel:not(.m-banner-carousel) .m-cover-slide{position:relative}
.m-cover-carousel:not(.m-banner-carousel) .m-cover-zoom{
  position:absolute;
  right:8px;
  bottom:8px;
  z-index:2;
  display:grid;
  place-items:center;
  width:20px;
  height:20px;
  border-radius:6px;
  background:rgba(20,18,16,.55);
  color:#fff;
  box-shadow:0 1px 3px rgba(0,0,0,.25);
  pointer-events:none;
}
.m-cover-carousel:not(.m-banner-carousel) .m-cover-zoom>svg{display:block}
.m-cover-dots{
  position:absolute;
  left:0;
  right:0;
  bottom:8px;
  display:flex;
  justify-content:center;
  gap:6px;
  pointer-events:none;
}
.m-cover-dot{
  pointer-events:auto;
  width:7px;
  height:7px;
  padding:0;
  border:0;
  border-radius:50%;
  background:rgb(255 255 255 / .55);
  box-shadow:0 0 0 1px rgb(0 0 0 / .12);
  cursor:pointer;
  transition:transform .15s ease,background .15s ease;
}
.m-cover-dot.active{
  background:#fff;
  transform:scale(1.25);
}
.m-block-intro{
  margin:0 0 6px;
  padding:10px 12px;
  border-radius:12px;
  background:var(--accent-soft);
  color:var(--ink);
  font-size:13px;
  line-height:1.55;
  white-space:pre-wrap;
  overflow-wrap:anywhere;
  word-break:break-word;
}
.m-block-intro:empty{display:none}

/* 手机端首页横幅轮播：复用 .m-cover-* 结构，只在 .m-banner-carousel 作用域内覆盖。
   横幅图固定 2016×780，用固定比例定框（不走 M.coverAspect 的动态比例）；
   容器 100% 宽 + overflow:hidden，320/360/390 三档都不会产生横向溢出。 */
.m-banner-carousel{margin:0;border-radius:14px}
.m-banner-carousel .m-cover-track{aspect-ratio:2016 / 780;background:var(--surface-soft)}
.m-banner-carousel .m-cover-slide img{display:block;width:100%;height:100%;object-fit:cover;object-position:50% 50%;background:var(--surface-soft)}

/* 管理版整料页：轮播/介绍放进 .m-toolbar 栅格，纵向间距交给容器 gap，避免双重留白 */
.m-toolbar .m-cover-carousel,
.m-toolbar .m-block-intro{margin-bottom:0}

/* 用户管理（owner）：生成一次性授权码 / 查看设备 / 踢出设备 */
.m-user-actions{margin-top:11px}
.m-user-actions>.m-btn{min-height:40px}
.m-dev-list{margin-top:10px;display:grid;gap:8px}
.m-dev-list:empty{margin-top:0}
.m-dev-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 11px;border:1px solid var(--line);border-radius:12px;background:var(--surface-soft)}
.m-dev-main{min-width:0}
.m-dev-id{font-weight:700;letter-spacing:.04em;display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.m-dev-state{font-size:11px;padding:1px 7px;border-radius:999px;font-weight:600}
.m-dev-state.on{color:#1f7a3f;background:rgba(31,122,63,.12)}
.m-dev-state.off{color:var(--danger);background:rgba(170,51,51,.12)}
.m-dev-row>.m-btn{min-height:36px;padding:6px 12px;flex:0 0 auto}
/* 用户管理（owner）：角色 / 启停徽标、上传链接权限开关、客户转移勾选列表。
   全部 flex-wrap + min-width:0，320 / 360 / 390 三档都不横向溢出。 */
.m-user-badges{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:8px}
.m-user-role,.m-user-status{font-size:11px;padding:1px 8px;border-radius:999px;font-weight:650}
.m-user-role.owner{color:#8a5a00;background:rgba(165,122,63,.18)}
.m-user-role.sales{color:#1f5a7a;background:rgba(31,90,122,.12)}
.m-user-status.on{color:#1f7a3f;background:rgba(31,122,63,.12)}
.m-user-status.off{color:var(--danger);background:rgba(170,51,51,.12)}
.m-user-perm{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px;padding:9px 11px;border:1px solid var(--line);border-radius:12px;background:var(--surface-soft)}
.m-user-perm-copy{min-width:0}
.m-user-perm-copy>strong{display:block;font-size:13px}
.m-user-perm-copy>.m-subtle{margin-top:2px;overflow-wrap:anywhere}
/* 【权限说明「?」】开关标题右侧的小圆点：视觉 22px（不抢开关的重量），
   命中区用 ::after 外扩到 32px（指尖够点）；点开走 showSheet 四段式范围说明。 */
.m-perm-title{display:flex;align-items:center;gap:6px;min-width:0}
.m-perm-title>strong{display:block;font-size:13px;overflow-wrap:anywhere}
.m-perm-help{position:relative;flex:0 0 auto;width:22px;height:22px;padding:0;border:1px solid var(--line-strong);border-radius:50%;background:#fff;color:var(--muted);font-size:12px;font-weight:700;line-height:1;display:inline-flex;align-items:center;justify-content:center;-webkit-tap-highlight-color:transparent}
.m-perm-help::after{content:"";position:absolute;top:-5px;right:-5px;bottom:-5px;left:-5px}
.m-perm-help:active{background:var(--surface-soft)}
/* 说明弹层：四段（能做什么 / 不能做什么 / 与其它权限或开关的关系 / 不勾选时的表现）。 */
.m-perm-sec{margin-top:13px}
.m-perm-sec:first-child{margin-top:0}
.m-perm-sec-t{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:700;color:var(--ink)}
.m-perm-sec-t::before{content:"";width:3px;height:13px;border-radius:2px;background:var(--accent)}
.m-perm-list{margin:6px 0 0;padding-left:19px;font-size:13px;line-height:1.6;color:var(--ink);overflow-wrap:anywhere}
.m-perm-list li{margin-top:3px}
.m-perm-list li:first-child{margin-top:0}
.m-switch{position:relative;display:inline-flex;align-items:center;flex:0 0 auto}
.m-switch .m-switch-input{position:absolute;inset:0;z-index:1;width:100%;height:100%;margin:0;opacity:0;cursor:pointer}
.m-switch-track{display:block;position:relative;width:46px;height:27px;border-radius:999px;background:#d8d3cc;transition:background .18s}
.m-switch-track::after{content:"";position:absolute;top:3px;left:3px;width:21px;height:21px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.22);transition:transform .18s}
.m-switch .m-switch-input:checked+.m-switch-track{background:var(--accent)}
.m-switch .m-switch-input:checked+.m-switch-track::after{transform:translateX(19px)}
.m-switch .m-switch-input:disabled{cursor:not-allowed}
.m-switch .m-switch-input:disabled+.m-switch-track{opacity:.45}
/* 【大板库存管理权限】开关（与 .m-switch-input 同一外观，独立类名避免歧义）。 */
.m-switch .m-switch-box{position:absolute;inset:0;z-index:1;width:100%;height:100%;margin:0;opacity:0;cursor:pointer}
.m-switch .m-switch-box:checked+.m-switch-track{background:var(--accent)}
.m-switch .m-switch-box:checked+.m-switch-track::after{transform:translateX(19px)}
.m-switch .m-switch-box:disabled{cursor:not-allowed}
.m-switch .m-switch-box:disabled+.m-switch-track{opacity:.45}
.m-form-err{margin-top:10px;padding:9px 11px;border-radius:12px;background:#fff1ef;color:var(--danger);font-size:13px;overflow-wrap:anywhere}
.m-xfer-head{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:8px}
.m-xfer-all{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:650}
.m-xfer-allbtn{min-height:34px;padding:5px 11px;font-size:12.5px;flex:0 0 auto;border-color:var(--line-strong)}
.m-xfer-list{display:grid;gap:7px;max-height:38vh;overflow:auto}
.m-xfer-row{display:flex;align-items:center;gap:9px;padding:8px 10px;border:1px solid var(--line);border-radius:12px;background:var(--surface-soft)}
.m-xfer-row input{width:18px;height:18px;flex:0 0 auto;accent-color:var(--accent)}
.m-xfer-name{font-weight:650;min-width:0;overflow-wrap:anywhere}
.m-xfer-meta{color:var(--muted);font-size:12px;font-style:normal;margin-left:auto;flex:0 0 auto}
.m-code-box{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:12px 0;padding:12px 14px;border:1px dashed var(--accent);border-radius:14px;background:var(--surface-soft)}
.m-code-value{font-size:clamp(20px,7vw,26px);font-weight:800;letter-spacing:.28em}

/* 来源导入（手机端，对齐 PC 来源后台）：
   320 / 360 / 390 三档都不横向溢出：文本一律 overflow-wrap:anywhere，
   缩略图固定 clamp() 宽 + aspect-ratio，操作按钮 flex-wrap 折行。 */
.m-src-import{padding:13px;display:grid;gap:10px}
.m-src-hint{line-height:1.5}
.m-src-textarea{min-height:104px;resize:vertical;font-size:13px;line-height:1.5;font-family:inherit}
.m-src-results{display:grid;gap:6px;font-size:12px;line-height:1.5;overflow-wrap:anywhere}
.m-src-ok{color:var(--success)}
.m-src-fail{color:var(--danger)}
.m-src-progress{font-size:12px;color:var(--muted)}
/* 预览 / 提取的结果块含长 URL：.m-src-import 是 grid，网格项默认 min-width:auto 会被内容顶宽；
   这里统一放开收缩（预览没有 .m-src-results 包裹，需同时对 #m-src-result / #m-lsyc-result 生效）。 */
.m-src-import>*{min-width:0}
#m-src-result,#m-lsyc-result{overflow-wrap:anywhere;word-break:break-word;min-width:0;max-width:100%}
.m-src-ok,.m-src-fail,.m-src-progress{overflow-wrap:anywhere;word-break:break-word;min-width:0;max-width:100%}
.m-src-row{position:relative;display:flex;align-items:flex-start;flex-wrap:wrap;gap:10px;min-width:0;max-width:100%;background:#fff;border:1px solid var(--line);border-radius:15px;padding:11px 12px;margin-bottom:10px;cursor:pointer}
.m-src-row.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.m-src-thumb{flex:0 0 auto;width:clamp(56px,18vw,74px);aspect-ratio:4 / 3;height:auto;border-radius:11px;overflow:hidden;background:var(--accent-soft)}
.m-src-thumb>img{display:block;width:100%;height:100%;object-fit:contain;background:var(--accent-soft)}
.m-src-thumb>img.is-broken{display:none}
.m-src-main{flex:1;min-width:0}
.m-src-title{font-weight:700;font-size:clamp(13px,3.9vw,15px);line-height:1.35;overflow-wrap:anywhere}
.m-src-meta{font-size:12px;color:var(--muted);margin-top:4px;line-height:1.45;overflow-wrap:anywhere}
.m-src-intro{margin-top:7px;font-size:12px;line-height:1.5;color:var(--ink);background:var(--accent-soft);border-radius:10px;padding:7px 9px;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word}
.m-src-intro .m-subtle{color:var(--muted)}
.m-src-actions{display:flex;flex-wrap:wrap;align-items:center;gap:7px;margin-top:9px}
/* 【仓归属】来源导入：编辑封面 / 编辑介绍 / 仓下拉 三块等宽 */
.m-src-actions>.m-src-btn{flex:1 1 0;min-width:0;text-align:center;justify-content:center}
.m-src-wh{appearance:none;-webkit-appearance:none;padding-right:18px;background-repeat:no-repeat;
  background-position:calc(100% - 10px) 50%,calc(100% - 6px) 50%;background-size:5px 5px,5px 5px;
  background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%)}
.m-src-wh.on{border-color:var(--accent);background-color:var(--accent-soft,#fbf3e4);color:var(--accent);font-weight:800}
.m-src-title .m-src-covercount{float:right;margin-left:6px;font-weight:600}
.m-src-btn{border:1px solid var(--line-strong);background:var(--surface);color:var(--ink);border-radius:10px;min-height:36px;padding:6px 11px;font-size:12px;font-weight:650;line-height:1.2}
.m-src-btn:disabled{opacity:.5;cursor:not-allowed}
.m-src-covercount{font-size:12px;color:var(--muted);background:var(--surface-soft);border-radius:999px;padding:5px 10px;white-space:nowrap}
.m-src-pick{flex:0 0 auto;align-self:center;width:28px;height:28px;padding:0;border-radius:50%;border:1px solid var(--line-strong);background:var(--surface-soft);color:transparent;display:grid;place-items:center;font-size:14px;line-height:1}
.m-src-pick.on{background:var(--accent);border-color:var(--accent);color:#fff}
/* 【来源搜索吸顶】「来源导入」页搜索框（输入框 + 搜索 / 清空）位于「已接入来源 · N 条」这一行
   **上方**，滚动下方来源列表时该行不跟着滚，随时可改关键词再搜。
   ① 与「大板库存管理」排序操作栏（.m-inv-batch-shell）同一套吸顶做法：sticky + z-index:20，
      top 用 JS 量出来的 --m-src-sticky-top（整块 .m-topbar 真实高度，量不到时回落
      58px + --safe-top）；
   ② 生效范围 = 父容器 .m-section（它包住整张来源列表）→ 滚到列表末尾前一直吸着；
   ③ 不透明底 var(--bg)：来源卡片从搜索框底下滚过时不能透出来。 */
.m-src-search-shell{
  position:sticky;
  /* 【跟手兼容】同上：与导航共用一个 --m-nav-y 变量，导航位移时本行 top 同步跟随。 */
  top:calc(var(--m-src-sticky-top,calc(58px + var(--safe-top))) + var(--m-nav-y,0px));
  z-index:20;
  background:var(--bg);
  padding:2px 0 10px;
}
.m-src-searchbar{display:flex;align-items:center;gap:8px}
.m-src-searchbar>.m-search{flex:1;min-width:0}
.m-src-search-btn{flex:0 0 auto;min-height:46px;padding:10px 13px}
.m-src-search-hint{font-size:12px;color:var(--muted);margin-top:6px;line-height:1.45;overflow-wrap:anywhere}
.m-src-search-hint:empty{display:none}
/* 【来源导入 · 仓筛选】搜索行下方的「仓」下拉（全部仓 / 本地仓）：只筛下方来源列表。
   与搜索行同宽对齐，控件紧凑（32px / 13px）；与卡片上的「仓归属」下拉（.m-src-wh）互不影响。 */
.m-src-whfilter{display:flex;align-items:center;gap:8px;width:100%;margin-top:8px;min-width:0}
.m-src-whlabel{flex:0 0 auto;font-size:13px;line-height:1.2;color:var(--muted)}
.m-src-whselect{
  flex:1 1 auto;min-width:0;height:32px;padding:0 28px 0 10px;
  font-size:13px;line-height:30px;color:var(--ink);
  border:1px solid var(--line-strong);border-radius:10px;background-color:var(--surface);
  appearance:none;-webkit-appearance:none;
  background-repeat:no-repeat;background-position:calc(100% - 12px) 50%,calc(100% - 8px) 50%;
  background-size:5px 5px,5px 5px;
  background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);
}
.m-src-whselect:focus{outline:none;border-color:var(--accent)}

/* ===== 来源导入：手机端首页横幅管理面板（对齐 PC .banner-panel）=====
   网格列宽用 clamp() + min(…,100%) 兜底，320 也不横向溢出；卡片图片 aspect-ratio，
   徽章 / 上限提示 / 删除确认一律 flex-wrap，文字 overflow-wrap:anywhere 不截断。 */
.m-banner-panel{padding:13px;display:grid;gap:10px;min-width:0}
.m-banner-panel-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.m-banner-panel-title{margin:0;font-size:clamp(13px,3.8vw,15px);font-weight:700;color:var(--ink)}
.m-banner-panel-count{color:var(--muted);font-size:12px;font-variant-numeric:tabular-nums;white-space:nowrap}
.m-banner-panel-count strong{color:var(--ink)}
.m-banner-hint{margin:0;color:var(--muted);font-size:12px;line-height:1.5;overflow-wrap:anywhere}
.m-banner-hint strong{color:var(--ink)}
.m-banner-empty{margin:0;padding:18px 6px;text-align:center;color:var(--muted);font-size:13px;line-height:1.5}
.m-banner-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(clamp(120px,40vw,200px),100%),1fr));gap:10px;min-width:0}
.m-banner-card{margin:0;display:flex;flex-direction:column;gap:8px;padding:8px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-soft);min-width:0}
.m-banner-media{position:relative;min-width:0;border-radius:var(--radius-sm);overflow:hidden;background:var(--accent-soft)}
.m-banner-media>img{display:block;width:100%;height:auto;aspect-ratio:3 / 2;object-fit:cover;object-position:50% 50%;background:var(--accent-soft)}
.m-banner-media>img.is-broken{display:none}
.m-banner-no{position:absolute;top:6px;left:6px;min-width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:rgba(36,35,32,.62);color:#fff;font-size:11px;font-weight:650;line-height:1}
.m-banner-del{position:absolute;right:6px;bottom:6px;min-height:26px;padding:0 8px;border:1px solid rgba(182,69,61,.5);border-radius:var(--radius-sm);background:rgba(255,255,255,.92);color:var(--danger);font-size:11px;font-weight:650;line-height:1}
.m-banner-tags{display:flex;flex-wrap:wrap;gap:6px}
.m-banner-badge{display:inline-flex;align-items:center;max-width:100%;padding:4px 8px;border-radius:999px;background:var(--accent);color:#fff;font-size:11px;line-height:1.25;overflow-wrap:anywhere}
.m-banner-card-move{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto}
.m-banner-move-btn{flex:1 1 0;min-width:0;min-height:32px;padding:4px 6px;font-size:11px;white-space:normal}
.m-banner-confirm{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:8px;border:1px solid var(--danger);border-left-width:4px;border-radius:var(--radius-sm);background:#f7eceb;color:var(--danger);font-size:11px;line-height:1.4;overflow-wrap:anywhere}
.m-banner-confirm .m-btn{flex:0 0 auto;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.2}
.m-banner-foot{display:flex;align-items:center;flex-wrap:wrap;gap:8px}
.m-banner-add{flex:0 0 auto}
.m-banner-limit{color:var(--danger);font-size:12px;line-height:1.5;overflow-wrap:anywhere}
/* 【来源封面管理】手机端「编辑封面」弹层：复用横幅同一套卡片 / 网格 / 二次确认样式，
   只补层内栅格间距与更窄的封面列宽（4:3 缩略图在手机上一屏能看全两张）。 */
.m-src-cover-manager{display:grid;gap:10px;min-width:0}
.m-src-cover-manager .m-banner-grid{grid-template-columns:repeat(auto-fill,minmax(min(clamp(104px,34vw,180px),100%),1fr))}
.m-src-cover-manager .m-banner-media>img{aspect-ratio:4 / 3}

/* 库存单片页操作条（与 PC 一致）：一套勾选 + 「加入订单(N)」「删除(N)」两个动作按钮。
   窄屏（390/360/320）压缩按钮与间距，保证零横向溢出。
   仅手机端：操作条里的「删除(N)」宽度收窄到「加入订单(N)」的一半左右
   （宽度随内容自适应 = 文字宽 + 2×1px 内边距 + 2px 边框，11.5px 字号下约 44.4px ≈ 订单按钮 86.7px 的一半），
   文字完整可见、不换行、不溢出；高度沿用 .m-btn 的 min-height:44px，与订单按钮像素级齐平。
   该选择器只命中手机端操作条的删除按钮，其他端不受影响。 */
.m-actionbar .m-btn.danger{background:#fff1ef;color:var(--danger);border-color:#efd1cd;flex:0 0 auto;min-width:0;padding:0 1px;font-size:11.5px;white-space:nowrap}

/* === 库存管理：批量软删除 + 回收站（与旧站手机端 / PC 完全一致；只新增规则块）=== */
.m-inv-delbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px;background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:8px 10px;font-size:12px;color:var(--muted)}
.m-inv-delbar>span{flex:1;min-width:0}
.m-inv-delbar label{display:flex;align-items:center;gap:6px;color:var(--ink);font-weight:650;white-space:nowrap}
.m-inv-delbar .m-del-all{width:18px;height:18px;accent-color:var(--accent)}
.m-inv-delbar .m-btn{min-height:38px;padding:6px 12px;flex:0 0 auto}
.m-recycle-card{position:relative;display:grid;grid-template-columns:clamp(58px,20vw,80px) minmax(0,1fr);gap:10px;background:#fff;border:1px solid var(--line);border-radius:13px;padding:10px;margin-bottom:10px}
.m-recycle-card.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.m-recycle-thumb{position:relative;width:100%;aspect-ratio:1/1;border-radius:10px;overflow:hidden;background:var(--surface-soft)}
.m-recycle-thumb img{width:100%;height:100%;object-fit:contain}
.m-recycle-thumb img.is-broken{display:none}
.m-recycle-body{min-width:0}
.m-recycle-actions{grid-column:2;display:flex;gap:8px;flex-wrap:wrap}
.m-recycle-actions .m-btn{min-height:38px;padding:6px 12px;flex:1}

/* === 大板库存 · 一键下架（只新增规则块，不改既有选择器）===
   · 「在架 ｜ 已下架 (N)」切换沿用 .m-segment 形态；
   · 「一键下架(N)」为琥珀警示色（与「删除(N)」红色区分）；操作条空间紧张时两端
     已有 390/340 宽的既有压缩 / 换行规则兜底，这里再补一条与 .danger 同口径的紧凑样式。 */
.m-actionbar .m-btn.amber{background:#fdf3e0;color:var(--warning);border-color:#ead4ac;flex:0 0 auto;min-width:0;padding:0 6px;font-size:11.5px;white-space:nowrap}
/* 「转为本地(N)」= 中性描边（沿用 .m-btn.outline 既有配色，不新增颜色），与下架的琥珀色、
   删除的红色区分；紧凑口径与 .amber 一致，保证「删除 + 一键下架 + 转为本地」三个按钮在
   390 / 340 宽下仍放得下（既有 390 压缩、340 换行规则继续兜底）。 */
.m-actionbar .m-btn.outline{background:var(--surface);border-color:var(--line-strong);flex:0 0 auto;min-width:0;padding:0 6px;font-size:11.5px;white-space:nowrap}
.m-off-shelf-slab{border-color:#ead4ac}
.m-off-shelf-slab.selected{border-color:var(--warning);box-shadow:0 0 0 1px var(--warning)}
.m-off-shelf-head{display:flex;justify-content:flex-end;padding:7px 9px 0}
.m-off-shelf-tag{display:inline-flex;align-items:center;min-height:22px;padding:3px 8px;border-radius:999px;background:#fdf3e0;color:var(--warning);font-size:clamp(10px,3vw,12px);font-weight:650}
.m-off-shelf-restore{min-height:36px;margin-top:8px}

/* ===== 手机端产品定价 / 销售定价（扎级定价）=====
   层级与 PC 完全一致：整料选择区（无价格）→ 当前整料信息栏 → 扎级定价（一扎一卡）。
   只新增选择器；图片固定 4:3，三价输入等宽一行，320 宽也不横向溢出。 */
.m-pricing-filter-row{display:grid;grid-template-columns:minmax(0,1fr);gap:9px}
.m-pricing-filter-row>.m-select{min-height:44px;width:100%;min-width:0}

/* ===== 通用列表页页头（订单草稿 S5.2 等二级页复用）：小字眉标 + 大标题 + 说明 + 计数 =====
   全部自适应宽度，长说明自动换行（不截断、不出现横向滚动）。 */
.m-list-head{margin:0 0 14px}
.m-list-eyebrow{font-size:11px;letter-spacing:.22em;color:var(--accent);font-weight:700;overflow-wrap:anywhere}
.m-list-title{margin:6px 0 4px;font-size:clamp(20px,6vw,24px);font-weight:800;color:var(--ink);overflow-wrap:anywhere}
.m-list-sub{margin:0;color:var(--muted);font-size:12px;line-height:1.6;overflow-wrap:anywhere}
.m-list-count{color:var(--muted);font-size:12px;margin-bottom:9px}
/* 行内文字按钮（如客户明细里的单号）：点击进单据，仍走 M.go 路由。 */
.m-link-btn{border:0;background:transparent;color:var(--accent-dark);font-weight:650;font-size:12.5px;min-height:34px;padding:6px 4px;overflow-wrap:anywhere;text-align:left}
/* 「订单草稿」列表页类型标签（大板）：两类草稿混排时一眼区分。 */
.m-draft-kind-tag{display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:999px;
  font-size:11px;letter-spacing:.02em;border:1px solid transparent;white-space:nowrap;font-weight:700}
.m-draft-kind-tag[data-m-draft-kind-tag="大板"]{background:#e2ecf6;color:#2f5a76;border-color:#c4d7e4}
.m-draft-row-actions{display:flex;flex-wrap:wrap;gap:8px;min-width:0}
.m-pricing-hint{margin:0 0 10px}
.m-pricing-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,150px),1fr));gap:11px;margin-bottom:16px}
.m-pricing-block{overflow:hidden;background:#fff;border:1px solid var(--line);border-radius:15px;box-shadow:var(--shadow);cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease}
.m-pricing-block.selected{border-color:var(--accent);box-shadow:0 0 0 2px rgba(165,122,63,.22),var(--shadow)}
.m-pricing-block-media{position:relative;width:100%;aspect-ratio:4 / 3;overflow:hidden;background:var(--accent-soft)}
.m-pricing-block-media>img{display:block;width:100%;height:100%;object-fit:contain}
.m-pricing-block-media>img.is-broken{display:none}
.m-pricing-block-pill{position:absolute;right:7px;bottom:7px;padding:2px 8px;border-radius:999px;background:rgba(20,18,15,.62);color:#fff;font-size:11px}
.m-pricing-block-body{padding:9px 10px 11px}
.m-pricing-block-species{color:var(--muted);font-size:12px;overflow-wrap:anywhere}
.m-pricing-block-code{font-weight:700;font-size:clamp(13px,3.6vw,15px);overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
.m-pricing-block-spec{color:var(--muted);font-size:12px;margin-top:2px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.m-pricing-block-meta{color:var(--ink);font-size:12px;margin-top:5px}
.m-pricing-block-meta strong{font-variant-numeric:tabular-nums}
.m-pricing-current{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:11px 13px;margin-bottom:11px;border-left:3px solid var(--accent);background:rgba(165,122,63,.08);border-radius:0 12px 12px 0}
.m-pricing-current-main{display:flex;align-items:baseline;gap:9px;min-width:0;flex-wrap:wrap}
.m-pricing-current-code{font-weight:700;font-size:clamp(14px,4vw,16px);overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
.m-pricing-current-species{color:var(--muted);font-size:13px;overflow-wrap:anywhere}
.m-pricing-current-count{color:var(--muted);font-size:12px;font-variant-numeric:tabular-nums}
.m-pricing-shelves{margin-bottom:18px}
.m-pricing-shelves-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:7px}
.m-pricing-shelves-head>span{font-weight:700;font-size:clamp(13px,3.8vw,15px)}
.m-pricing-collapse{min-height:38px;padding:0 13px;border:1px solid var(--line-strong);border-radius:11px;background:#fff;color:var(--ink);font-size:13px;font-weight:650}
.m-pricing-shelves.is-collapsed .m-pricing-hint,.m-pricing-shelves.is-collapsed .m-pricing-list{display:none}
.m-pricing-row{padding:12px 13px;margin-bottom:11px;background:#fff;border:1px solid var(--line);border-radius:15px;box-shadow:var(--shadow)}
.m-pricing-row-top{display:flex;align-items:center;justify-content:space-between;gap:11px;margin-bottom:11px}
.m-pricing-row-head{display:flex;flex-direction:column;gap:3px;min-width:0}
.m-pricing-shelf-no{font-weight:700;font-size:clamp(16px,4.6vw,18px);font-variant-numeric:tabular-nums}
.m-pricing-row-spec{color:var(--ink);font-size:13px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.m-pricing-row-sub{color:var(--muted);font-size:12px}
.m-pricing-row-thumb{flex:0 0 auto;width:clamp(84px,26vw,104px);aspect-ratio:4 / 3;overflow:hidden;background:var(--accent-soft);border:1px solid var(--line);border-radius:11px}
.m-pricing-row-thumb>img{display:block;width:100%;height:100%;object-fit:contain}
.m-pricing-row-thumb>img.is-broken{display:none}
/* 【产品定价 · 底部抽屉】点整料卡 → 从底部上滑的抽屉弹框（约 70vh，内部列表独立滚动）。
   以前扎级定价区块内联渲染在网格最下方，整料扎多时要一路滚到底；现在固定在底部弹层里：
   高度 70vh，头部（标题 + 明确的「关闭」按钮）固定，只有 .m-pricing-drawer-body 滚动。 */
.m-pricing-drawer{height:70vh;height:min(70vh,70dvh);max-height:70vh;max-height:min(70vh,70dvh);display:flex;flex-direction:column;overflow:hidden;padding:14px 16px 0;animation:mPricingDrawerUp .22s ease-out}
.m-pricing-drawer .m-sheet-handle{margin:0 auto 12px}
.m-pricing-drawer-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 10px}
.m-pricing-drawer-title{font-size:clamp(15px,4.4vw,18px);font-weight:800;min-width:0;overflow-wrap:anywhere}
.m-pricing-drawer-close{flex:0 0 auto;min-height:38px;padding:0 15px;border:1px solid var(--line-strong);border-radius:999px;background:#fff;color:var(--ink);font-size:14px;font-weight:650}
.m-pricing-drawer-body{flex:1 1 auto;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;padding-bottom:calc(16px + var(--safe-bottom))}
@keyframes mPricingDrawerUp{from{transform:translateY(100%)}to{transform:translateY(0)}}
@media (prefers-reduced-motion:reduce){.m-pricing-drawer{animation:none}}
/* 输入态 4 个价格（报价 / 整件底价 / 拆片底价 / 成本）→ 2×2；只读态 3 个价格（sales 看不到成本）→ 3 列。 */
.m-pricing-price-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
.m-pricing-price-grid.is-readonly{grid-template-columns:repeat(3,minmax(0,1fr))}
/* 【7号仓 · 四价】报价 / 整件底价 / 拆片底价 / 成本 固定两列两行，避免 3+1 错行。 */
.m-pricing-price-grid.wh7-four{grid-template-columns:repeat(2,minmax(0,1fr))}
.m-pricing-price{display:grid;gap:5px;min-width:0}
.m-pricing-price>span{color:var(--muted);font-size:12px}
.m-pricing-price>.m-input{min-height:44px;min-width:0;padding:8px 9px;text-align:right;font-variant-numeric:tabular-nums}
.m-pricing-price>strong{display:flex;align-items:center;justify-content:flex-end;min-height:44px;padding:8px 9px;border:1px dashed var(--line);border-radius:11px;font-size:13px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.m-pricing-save{margin-top:11px}
.m-pricing-edit{margin-top:9px}
/* 【旧站价】owner 专属的一段只读价（旧站/总站同步来的）：4 个价（报价 / 整件底价 / 拆片底价 / 成本）
   → 2×2，与本站价的只读态同一套格子；整料在旧站没有价时这一整段**不渲染**（不是显示「—」）。 */
.m-pricing-oldprice{margin-bottom:11px;padding:9px 10px;background:var(--accent-soft);border:1px dashed var(--line);border-radius:12px}
.m-pricing-oldprice-head{margin-bottom:8px;color:var(--muted);font-size:12px}
.m-pricing-oldprice .m-pricing-price-grid.is-readonly{grid-template-columns:repeat(2,minmax(0,1fr))}
.m-pricing-oldprice .m-pricing-price>strong{background:#fff}
@media(max-width:340px){
  .m-pricing-grid{grid-template-columns:1fr}
  .m-pricing-price-grid{gap:6px}
  .m-pricing-price>.m-input{padding:8px 6px;font-size:13px}
  .m-pricing-price>strong{padding:8px 6px;font-size:12px}
}

/* ============================================================================
   第八轮修订 · 移动端体验（手机端为主，各端同步同一控件 / 同一口径）
   ① 顶部安全区留白
   ③ 吨位数字格式统一 ④ 底部面板下拉关闭 ⑤ 260–320px 窄屏不溢出 ⑥ 右滑回退一级
   ============================================================================ */

/* ---- ⑤ 底部面板：拖动条（视觉提示 + 更大触摸命中区）+ 拖动中禁用过渡 ---- */
.m-sheet-handle{position:relative;touch-action:none;cursor:grab}
.m-sheet-handle::after{content:"";position:absolute;left:-46px;right:-46px;top:-16px;bottom:-16px}
.m-sheet[data-sheet-dragging]{will-change:transform;user-select:none}
.m-sheet[data-sheet-dragging] *{pointer-events:none}

/* ---- ⑥ 窄屏（微信分屏 / 浮窗 ≈ 260–320px）：统计卡换行缩小、筛选收进面板、文字不裁切 ---- */
@media(max-width:380px){
  .m-content{padding:11px}
}
@media(max-width:300px){
  .m-content{padding:9px}
  .m-nav-chip{font-size:12px;padding:5px 8px}
}

/* ============================================================================
   访问记录 /【全球访客行为与客户意向系统】· 手机端
   手机端重新排版：KPI 横向滑动、地图可折叠、趋势全宽、访客列表卡片化、
   访客详情时间轴纵向、底部操作固定。任何宽度（≥280px）下都不横向滚动。
   ========================================================================== */
.m-vt{display:flex;flex-direction:column;gap:12px;padding:0 0 16px;min-width:0}
.m-vt *{min-width:0}
.m-vt-range{display:flex;gap:6px;overflow-x:auto;-webkit-overflow-scrolling:touch;padding:2px 0 4px}
.m-vt-range .m-chip{flex:0 0 auto}
.m-vt-kpis{display:flex;gap:8px;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:4px;scroll-snap-type:x proximity}
.m-vt-kpi{flex:0 0 auto;min-width:104px;display:flex;flex-direction:column;gap:2px;padding:10px 12px;border:1px solid var(--m-line,#e6e0d3);border-radius:12px;background:#fffdf9;scroll-snap-align:start}
.m-vt-kpi span{font-size:.72rem;color:#8b8375}
.m-vt-kpi strong{font-size:1.35rem;line-height:1.1;color:#171713}
/* KPI 可点击下钻：重置按钮默认样式，保留原有卡片观感；is-active 表示该筛选已生效。 */
button.m-vt-kpi{font:inherit;text-align:left;color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}
.m-vt-kpi:active{background:#f6f1e6}
.m-vt-kpi.is-active{border-color:#b8860b;box-shadow:0 0 0 1px rgba(184,134,11,.35) inset}
.m-vt-kpi-note{font-size:.72rem;color:#8b8375;line-height:1.45}
.m-vt-kpi-sum{font-size:.74rem;color:#6b6257}
.m-vt-kpi-list{display:flex;flex-direction:column;gap:8px}
.m-vt-kpi-row{padding:10px 12px;border:1px solid var(--m-line,#e6e0d3);border-radius:10px;background:#fffdf9}
.m-vt-kpi-row-top{display:flex;align-items:baseline;justify-content:space-between;gap:8px}
.m-vt-kpi-row-top strong{font-size:.85rem;font-weight:600;color:#171713}
.m-vt-kpi-row-line{margin-top:3px;font-size:.75rem;color:#8b8375;line-height:1.45;word-break:break-all}
.m-vt-kpi-url{color:#a49b8c;font-size:.7rem}
.m-vt-kpi-tag{flex:0 0 auto;font-size:.72rem;color:#8b8375}
.m-vt-kpis.is-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(88px,1fr));overflow:visible}
.m-vt-kpis.is-grid .m-vt-kpi{min-width:0}
.m-vt-section{display:flex;flex-direction:column;gap:8px;padding:12px;border:1px solid var(--m-line,#e6e0d3);border-radius:14px;background:#fffdf9}
.m-vt-section-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px}
.m-vt-section-head h2{margin:0;font-size:1rem;color:#171713}
.m-vt-section-head span{font-size:.72rem;color:#8b8375}
.m-vt-empty{color:#8b8375;font-size:.82rem;padding:8px 0}
.m-vt-map-toggle{width:100%;padding:10px;border:1px dashed #d9c6a6;border-radius:12px;background:#faf8f2;color:#5c5346;font-size:.85rem}
.m-vt-map-wrap{display:flex;flex-direction:column;gap:8px}
.m-vt-map-wrap .vt-map{width:100%;height:auto;border-radius:12px;background:#faf8f2}
.m-vt-map-legend{display:flex;gap:6px;overflow-x:auto;padding-bottom:2px}
.m-vt-map-legend .m-chip{flex:0 0 auto}
.m-vt-trend{width:100%;height:110px;display:block}
.m-vt-trend-foot{display:flex;gap:10px;justify-content:space-between;font-size:.72rem;color:#8b8375;flex-wrap:wrap}
.m-vt-trend-foot strong{color:#171713}
.m-vt-source{display:flex;gap:6px;overflow-x:auto;padding-bottom:2px}
.m-vt-source .m-chip{flex:0 0 auto}
.m-vt-hot{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px}
/* 每一项两段式：左侧大按钮 = 打开石材详情；右侧小按钮 = 查看关注该石材的访客（触屏可直接点）。 */
.m-vt-hot-item{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px;padding:8px 10px;border:1px solid var(--m-line,#e6e0d3);border-radius:10px;background:transparent;font-size:.82rem;color:#35342d}
.m-vt-hot-open{display:flex;flex-direction:column;gap:2px;border:0;background:transparent;padding:2px;font:inherit;text-align:left;color:inherit;min-width:0}
.m-vt-hot-open span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.m-vt-hot-open em{font-style:normal;color:#8b8375;font-size:.72rem}
.m-vt-hot-visitors{flex:0 0 auto;border:1px solid var(--m-line,#e6e0d3);border-radius:999px;padding:6px 10px;background:transparent;font:inherit;font-size:.74rem;color:#6b6257}
.m-vt-pager{display:flex;align-items:center;justify-content:center;gap:10px;font-size:.78rem;color:#8b8375;padding-top:4px}
.m-vt-pager .m-btn{flex:0 0 auto}
.m-vt-filters{display:flex;gap:6px;overflow-x:auto;padding-bottom:2px}
.m-vt-filters .m-chip{flex:0 0 auto}
.m-vt-card{display:flex;flex-direction:column;gap:4px;padding:12px;border:1px solid var(--m-line,#e6e0d3);border-radius:12px;background:#fffdf9;text-align:left;width:100%}
.m-vt-card-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.m-vt-code{font-family:var(--m-mono,Menlo,monospace);font-size:.9rem;color:#171713}
.m-vt-card-line{font-size:.78rem;color:#6b6257}
.m-vt-card-foot{font-size:.72rem;color:#8b8375}
.m-vt-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.m-vt-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px}
.m-vt-facts span{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border:1px solid var(--m-line,#e6e0d3);border-radius:10px;background:#fffdf9;font-size:.78rem;color:#35342d}
.m-vt-facts label{font-size:.68rem;color:#8b8375}
.m-vt-modal .m-vt-modal-body{max-height:70vh;overflow:auto;padding:12px;display:flex;flex-direction:column;gap:12px}
.m-vt-tl{grid-template-columns:76px 44px minmax(0,1fr)}
.m-vt-cust{display:flex;flex-direction:column;gap:8px;padding:12px}
.m-vt-actionbar{display:flex;gap:8px;align-items:center}
.m-vt-actionbar .m-vt-status{flex:1 1 auto;min-width:0}
.m-vt-page{padding-bottom:70px}
@media(max-width:320px){
  .m-vt-kpi{min-width:92px;padding:8px 10px}
  .m-vt-tl{grid-template-columns:64px 0 minmax(0,1fr)}
  .m-vt-tl .vt-tl-thumb{display:none}
}

/* 手机端复用访问记录的通用小组件（与 PC 同一套视觉语言） */
.vt-chip{padding:2px 8px;border-radius:999px;font-size:.68rem;border:1px solid #e6e0d3;color:#6b6257}
.vt-st-contact{border-color:#4f6f52;color:#4f6f52}
.vt-st-invalid{border-color:#e6e0d3;color:#8b8375}
.vt-score{display:inline-block;min-width:26px;text-align:center;padding:1px 6px;border-radius:8px;font-size:.72rem;border:1px solid #e6e0d3}
.vt-score.is-hot{border-color:#9e423d;color:#9e423d}
.vt-score.is-warm{border-color:#7f5f35;color:#7f5f35}
.vt-score.is-cool{color:#8b8375}
.vt-dist-row{display:grid;grid-template-columns:minmax(0,96px) minmax(0,1fr) 44px;gap:8px;align-items:center;margin-bottom:6px;font-size:.76rem}
.vt-dist-name{color:#6b6257;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.vt-dist-bar{display:block;height:7px;border-radius:999px;background:rgba(23,23,19,.08);overflow:hidden}
.vt-dist-bar i{display:block;height:100%;background:#7f5f35}
.vt-dist-row strong{font-size:.74rem;color:#171713}
.vt-reasons{margin:0;padding-left:1.1em;color:#35342d;font-size:.78rem;line-height:1.85}
.vt-timeline{list-style:none;margin:0;padding:0}
.vt-tl-item{display:grid;grid-template-columns:76px 44px minmax(0,1fr);gap:8px;align-items:center;padding:8px 0;border-bottom:1px solid #efeade}
.vt-tl-time{color:#8b8375;font-size:.7rem}
.vt-tl-thumb{display:block;width:44px;height:34px;border-radius:6px;overflow:hidden;background:rgba(23,23,19,.06)}
.vt-tl-thumb img{width:100%;height:100%;object-fit:contain;display:block}
.vt-tl-body{color:#35342d;font-size:.78rem;overflow-wrap:anywhere}
.vt-tl-link{color:#7f5f35;text-decoration:none;font-size:.72rem}
.vt-map-bg{fill:transparent}
.vt-dot circle{fill:rgba(161,123,69,.3);stroke:#7f5f35;stroke-width:1.2}
.vt-dot.is-active circle{fill:rgba(23,23,19,.5);stroke:#171713}
.vt-dot text{fill:#35342d;font-size:11px;text-anchor:middle}
.vt-trend-area{fill:rgba(161,123,69,.14)}
.vt-trend-line{fill:none;stroke:#7f5f35;stroke-width:2}

/* ===== 【产品展示 · 搜索框（本轮新增）】首页横幅轮播正下方 =====
   只新增选择器，不改动任何既有规则；复用既有 .m-search（左侧 ⌕ 图标 + 内边距）。 */
.m-home-search{display:flex;align-items:center;gap:8px;padding:12px 14px 0}
.m-home-search .m-home-search-field{flex:1;min-width:0}
.m-home-search .m-home-search-field input{background:var(--surface)}
.m-home-search-clear{border:1px solid var(--line);background:var(--surface);color:var(--muted);
  font-size:20px;line-height:1;min-width:46px;min-height:46px;border-radius:12px;box-shadow:var(--shadow)}
.m-home-count{padding:8px 16px 0;font-size:12px;color:var(--muted)}
/* 【仓筛选】搜索栏下面两个标签：往上滑动时固定在顶部 */
.m-home-sticky{position:sticky;top:0;z-index:40;background:var(--bg);border-bottom:1px solid var(--line)}
.m-home-wh-tabs{display:flex;gap:8px;padding:6px 14px 6px}
.m-wh-tab{flex:1 1 0;min-height:22px;height:22px;border-radius:8px;border:1px solid var(--line-strong);background:var(--surface);
  color:var(--muted);font-size:12px;font-weight:650;line-height:20px}
.m-wh-tab.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:800}
/* 【产品展示顺序】大板库存管理批量条上的 ↑ / ↓（勾选 1 颗料后可用）。 */
.m-inv-batchbar .m-inv-order{flex:0 0 auto;display:flex;gap:6px}
.m-inv-batchbar .m-inv-order .m-btn{min-width:42px;padding:6px 10px;font-size:15px}

/* ===== 大图预览里的「多图图集」指示（本轮新增：序号 / 圆点）
   只在 .m-lightbox 底栏内生效，不改动任何既有选择器；
   底栏沿用 .m-lightbox-bottom 的 flex 布局：‹ [圆点|序号] ›。 */
.m-lb-dots{flex:1;min-width:0;display:flex;align-items:center;justify-content:center;gap:6px;padding:0 4px;flex-wrap:wrap}
.m-lb-dot{width:7px;height:7px;border-radius:50%;background:#5f5f5f;flex:0 0 auto}
.m-lb-dot.active{background:#fff;transform:scale(1.25)}
.m-lb-counter{flex:1;min-width:0;text-align:center;font-size:13px;color:#bbb}

/* 【来源封面管理】手机端「编辑封面」调序（本轮新增）：拖动入口 + 拖动中的三种视觉态。
   只新增选择器，不改既有 .m-banner-* 规则；「删除」按钮位置与行为完全不变。
   touch-action:none 让长按拖动不被页面滚动抢走；handle 放在图片左下角（远离右上角删除）。 */
.m-src-cover-manager .m-banner-drag{
  position:absolute;left:6px;bottom:6px;
  min-height:26px;display:inline-flex;align-items:center;padding:0 8px;
  border:1px dashed rgba(255,255,255,.7);border-radius:var(--radius-sm);
  background:rgba(36,35,32,.62);color:#fff;font-size:11px;font-weight:650;line-height:1;
  touch-action:none;-webkit-user-select:none;user-select:none;
}
.m-src-cover-manager .m-banner-card.is-drag-source{opacity:.6;border-style:dashed;border-color:var(--accent)}
.m-src-cover-manager .m-banner-card.is-drop-target{border-color:var(--accent);box-shadow:0 0 0 2px rgba(165,122,63,.35)}
body.cover-dragging{touch-action:none}

/* ===== 【采购管理 · 批1】手机端采购单：列表 / 表单 / 明细 / 汇总（仅 owner 可见）
   只**新增**选择器，不改动任何既有规则；金额与平方全部按两位小数定点字符串展示，
   316 宽也不横向溢出（面积 / 单价两列等宽，长文本自动换行）。 */
.m-pur-filter{display:flex;gap:8px;flex-wrap:wrap}
.m-pur-chip{border:1px solid var(--line-strong);background:#fff;color:var(--muted);border-radius:999px;min-height:30px;padding:4px 14px;font-size:13px;font-weight:650}
.m-pur-chip.active{background:var(--ink);border-color:var(--ink);color:#fff}
.m-pur-search{display:flex;gap:8px;align-items:stretch;min-width:0}
.m-pur-search .m-input{flex:1;min-width:0}
.m-pur-search .m-btn{flex:0 0 auto;min-width:88px}
/* 【采购搜索 · ✕ 清除】形态照首页搜索的清除按钮；不属于 .m-btn，避免吃到上面 88px 的规则。 */
.m-pur-clear{border:1px solid var(--line);background:var(--surface);color:var(--muted);
  font-size:20px;line-height:1;min-width:46px;min-height:46px;border-radius:12px;box-shadow:var(--shadow);flex:0 0 auto}
/* 【搜索命中明细】卡片**上方**：每行 =「缩略图 + 两行文字」（材质/规格 · 片数/面积/单价/金额）。
   采购管理 / 采购清单两个列表页复用**同一套 class**；正文一律 flex-wrap 整体折行，
   不用任何固定 N 列网格：窄屏（≥320px）不会逐字竖排、不会把金额挤出容器、不需要横向滚动。
   缩略图固定 62×44 且 flex 不可压缩；右下角角标显示该明细图片张数（如「2 图」，超出再补「 +N」）。 */
.m-pur-hits{background:#fff;border:1px solid var(--line);border-left:3px solid var(--accent);
  border-radius:12px;padding:9px 10px;margin:0 0 8px;box-shadow:var(--shadow)}
.m-pur-hits-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-bottom:5px}
.m-pur-hits-title{font-size:12.5px;font-weight:750;color:var(--ink);overflow-wrap:anywhere;min-width:0}
.m-pur-hits-count{font-size:11.5px;font-weight:700;color:var(--muted);white-space:nowrap}
.m-pur-hit{display:flex;align-items:flex-start;gap:9px;flex-wrap:wrap;min-width:0;padding:7px 0;border-top:1px dashed var(--line)}
.m-pur-hits-head+.m-pur-hit{border-top:0}
.m-pur-hit-media{position:relative;flex:0 0 auto;max-width:100%;min-width:0}
.m-pur-hit-thumbs{display:flex;flex-wrap:wrap;gap:5px;min-width:0}
.m-pur-hit-thumb{width:62px;height:44px;flex:0 0 auto;object-fit:cover;display:block;
  border:1px solid var(--line);border-radius:8px;background:#efece5}
.m-pur-hit-thumb.is-broken{opacity:.35}
.m-pur-hit-none{display:inline-flex;align-items:center;justify-content:center;width:62px;height:44px;
  flex:0 0 auto;border:1px dashed var(--line-strong);border-radius:8px;background:#efece5;
  color:var(--muted);font-size:10.5px}
.m-pur-hit-badge{position:absolute;right:5px;bottom:4px;background:rgba(0,0,0,.62);color:#fff;
  font-size:10px;font-weight:700;line-height:1.45;padding:0 5px;border-radius:999px;
  pointer-events:none;white-space:nowrap}
.m-pur-hit-text{flex:1 1 148px;min-width:0;display:flex;flex-direction:column;gap:3px}
.m-pur-hit-line{display:flex;align-items:baseline;gap:6px;flex-wrap:wrap;min-width:0;overflow-wrap:anywhere}
.m-pur-hit-line1{font-size:13px}
.m-pur-hit-name{font-weight:800;color:var(--ink);overflow-wrap:anywhere}
.m-pur-hit-spec{font-size:11.5px;font-weight:400;color:var(--muted);overflow-wrap:anywhere}
.m-pur-hit-line2{font-size:12px;color:var(--muted)}
.m-pur-hit-dot{color:var(--line-strong);font-weight:700}
.m-pur-hit-amount{font-weight:800;color:var(--ink)}
.m-pur-hit-rest{margin-top:5px;font-size:11.5px;font-weight:650;color:var(--muted)}
.m-pur-card{background:#fff;border:1px solid var(--line);border-radius:13px;padding:11px;margin-bottom:10px;box-shadow:var(--shadow)}
.m-pur-card-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.m-pur-code{font-weight:800;font-size:clamp(13px,3.9vw,15px);letter-spacing:.4px;overflow-wrap:anywhere}
.m-pur-badge{margin-left:auto;border-radius:999px;padding:2px 10px;font-size:11px;font-weight:700;white-space:nowrap}
.m-pur-badge.draft{background:#fdf3e3;color:#9a6a17;border:1px solid #f0dcb8}
.m-pur-badge.official{background:#eaf6ec;color:#2c7a3f;border:1px solid #c9e6d0}
.m-pur-small{margin-top:4px;font-size:12px;color:var(--muted);overflow-wrap:anywhere}
.m-pur-cells{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px;margin-top:9px}
.m-pur-cell{background:var(--surface-soft);border:1px solid var(--line);border-radius:11px;padding:7px 8px;font-size:10.5px;color:var(--muted);text-align:center;overflow-wrap:anywhere}
.m-pur-cell strong{display:block;font-size:clamp(13px,4vw,15px);color:var(--ink);margin-bottom:2px;overflow-wrap:anywhere}
.m-pur-card-actions{display:flex;gap:8px;margin-top:10px}
.m-pur-card-actions .m-btn{flex:1;min-height:40px;padding:6px 10px;font-size:13px}
/* 【采购单页 · 键盘】上一轮为「给系统滚动留余量」加的 .m-pur-page:focus-within 大留白
   （clamp(220px,42vh,420px)）已移除：它补偿的是底部两条固定栏占位 + 输入框被夹住的问题，
   现在聚焦时两条栏直接 display:none（见上方 html.m-kb-hide），底部已让出 72px+safe 的空间，
   再堆 42vh 只会在键盘/失焦切换时露出大片空白。
   真正决定「聚焦框停在哪」的 scroll-margin-*（已按用户要求保留）不受影响；
   页面本身 .m-page 仍保留 padding-bottom:calc(tab-h+safe+24px) 提供底部可滚动余量。 */
.m-pur-page .m-content{padding-bottom:8px}
.m-pur-block{padding:12px;margin-bottom:12px}
.m-pur-label{display:block;font-size:12.5px;font-weight:650;color:var(--muted);margin-bottom:5px}
.m-pur-hint{display:block;margin-top:5px;font-size:11px;color:var(--muted)}
/* 【片数】非法输入时的内联可读提示（纯新增样式，不改任何既有选择器）。 */
.m-pur-hint.is-err{color:#c0392b;font-weight:650}
.m-pur-sub{font-weight:400;font-size:11.5px;color:var(--muted)}
.m-pur-empty{padding:22px 12px}
.m-pur-item{border:1px solid var(--line);border-radius:12px;padding:10px;margin-bottom:10px;background:var(--surface-soft)}
.m-pur-item-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.m-pur-item-no{font-weight:700;font-size:12.5px}
.m-pur-bound{font-size:10.5px;font-weight:700;color:#2c7a3f;background:#eaf6ec;border:1px solid #c9e6d0;border-radius:999px;padding:1px 8px}
.m-pur-unbound{font-size:10.5px;font-weight:700;color:#9a6a17;background:#fdf3e3;border:1px solid #f0dcb8;border-radius:999px;padding:1px 8px}
/* 【明细 · 选择品种】品种徽标变成可点入口（编辑页 + 采购清单详情页同一套样式）。 */
button.m-pur-bound,button.m-pur-unbound{font-family:inherit;cursor:pointer;line-height:1.5}
.m-purspec-hint{margin:2px 0 10px;font-size:11.5px;color:#7b8794;line-height:1.6}
.m-purspec-unbind{margin:0 0 10px;width:100%;text-align:center;background:#fff1ef;color:var(--danger);border:1px solid #efd1cd;border-radius:9px;padding:9px 10px;font-size:13px;font-family:inherit;cursor:pointer}
.m-purspec-list{max-height:52vh;overflow-y:auto;-webkit-overflow-scrolling:touch;border:1px solid #eef0f3;border-radius:10px;padding:4px}
.m-purspec-item{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:#fff;border:0;border-bottom:1px solid #f3f5f7;padding:11px 10px;font-size:14px;font-family:inherit;color:#1f2933;cursor:pointer}
.m-purspec-item:last-child{border-bottom:0}
.m-purspec-item.is-current{background:#eaf6ec}
.m-purspec-code{font-size:10.5px;color:#8a94a0;background:#f4f6f8;border-radius:4px;padding:1px 6px}
.m-purspec-cur{margin-left:auto;font-size:10.5px;font-weight:700;color:#2c7a3f}
.m-purspec-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px}
.m-pur-del{margin-left:auto;border:1px solid #efd1cd;background:#fff1ef;color:var(--danger);border-radius:999px;min-width:30px;min-height:30px;font-size:13px;line-height:1}
.m-pur-item .m-field:last-child{margin-bottom:0}
.m-pur-suggest{display:block;margin-top:6px}
.m-pur-suggest:empty{display:none}
.m-pur-suggest-item{display:flex;align-items:center;gap:8px;width:100%;text-align:left;border:1px solid var(--line);background:#fff;border-radius:10px;min-height:40px;padding:7px 11px;margin-bottom:6px;font-size:13.5px;font-weight:600;color:var(--ink)}
.m-pur-suggest-item:active{border-color:var(--accent)}
.m-pur-suggest-code{margin-left:auto;font-size:11px;font-weight:500;color:var(--muted)}
.m-pur-suggest-empty{border:1px dashed var(--line-strong);background:#fff;border-radius:10px;padding:8px 11px;font-size:12px;color:var(--muted)}
.m-pur-stats{margin-bottom:0}
.m-pur-actionbar{flex-wrap:wrap;row-gap:6px}
.m-pur-actionbar .m-btn{flex:1 1 0;min-width:0;padding:8px 8px;font-size:13px}
@media (max-width:340px){
  .m-pur-cells{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* ===== 【采购清单 · 批2】采购清单页 / 详情 / 股东分享（链接 + 长图，仅 owner 可见）
   只**新增**选择器，不改动任何既有规则（批1 的 .m-pur-* 全部原样复用）。
   窄屏（316 宽）不横向溢出：缩略图固定尺寸、键值行允许换行、长链接 break-all。 */
.m-pur-covers{display:flex;align-items:center;gap:7px;flex-wrap:wrap;min-width:0;max-width:100%;margin:9px 0 2px}
.m-pur-cover{width:62px;height:62px;border-radius:10px;object-fit:contain;background:#efece5;border:1px solid var(--line);display:block}
.m-pur-cover-none{display:inline-flex;align-items:center;justify-content:center;min-width:62px;height:62px;padding:0 10px;border:1px dashed var(--line-strong);border-radius:10px;color:var(--muted);font-size:11.5px;background:#fff}
/* 【批11】材质图那一格改成「材质图 + 单据图」同一排里的**第一个 flex 子项**（材质图在最左）：
   不再自带上下外边距（排内间距统一由 .m-pur-docs 的 gap:7px 提供）。
   【修·批12】老板真机反馈：6 张材质图时素材撑出卡片右边界、被裁掉（第 6 张只露一半），单据被挤到下一行。
   原因：本格 flex:0 0 auto 按 max-content 定宽且不可收缩 ⇒ 内部 .m-pur-covers 的 flex-wrap:wrap 拿不到可换行宽度。
   处置：改为可收缩（flex:0 1 auto）并允许窄于内容（min-width:0 / max-width:100%），
        排不下时由 .m-pur-covers 内部自动换行，全部内容留在卡片内（不溢出 / 不裁切 / 不横向滚动）。
        本类只出现在采购清单详情的 .m-pur-docs-detail 一排里（全仓仅此一处），
        列表页 / 分享页 / 明细编辑页的 .m-pur-covers 排布不受影响。 */
.m-pur-covers-inline{flex:0 1 auto;min-width:0;max-width:100%;margin:0}
.m-pur-covers-inline .m-pur-covers{margin:0;min-width:0}
.m-pur-kv{display:flex;align-items:baseline;gap:10px;padding:5px 0;font-size:13px;border-bottom:1px dashed var(--line)}
.m-pur-kv:last-child{border-bottom:0}
.m-pur-kv span{flex:0 0 66px;color:var(--muted);font-size:12px}
.m-pur-kv strong{flex:1;min-width:0;overflow-wrap:anywhere;font-weight:650}
.m-pur-item-nums{margin-top:2px}
.m-pur-share-note{font-size:12px;color:var(--muted);background:var(--surface-soft);border:1px solid var(--line);border-radius:10px;padding:8px 10px;margin:8px 0 10px;overflow-wrap:anywhere}
.m-pur-share-list-title{margin-top:16px}
.m-pur-share-row{border:1px solid var(--line);border-radius:12px;padding:10px;margin-bottom:9px;background:#fff}
.m-pur-share-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:7px}
.m-pur-share-badge{border-radius:999px;padding:2px 10px;font-size:11px;font-weight:700;white-space:nowrap}
.m-pur-share-badge.active{background:#eaf6ec;color:#2c7a3f;border:1px solid #c9e6d0}
.m-pur-share-badge.revoked{background:#fdeceb;color:#a3342b;border:1px solid #f2cfcb}
.m-pur-share-badge.expired{background:#fdf3e3;color:#9a6a17;border:1px solid #f0dcb8}
.m-pur-share-badge.invalid{background:#f2f0ec;color:var(--muted);border:1px solid var(--line)}
.m-pur-share-url{font-size:12px;word-break:break-all}
.m-pur-share-actions{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}
.m-pur-share-actions .m-btn{flex:1 1 0;min-width:0;min-height:38px;padding:6px 8px;font-size:12.5px}
.m-pur-longimg{margin-top:12px}
.m-pur-warn{background:#fff4e5;border:1px solid #f0c68a;color:#8a5300;border-radius:11px;padding:9px 11px;font-size:12.5px;line-height:1.55;margin-bottom:9px;overflow-wrap:anywhere}
.m-pur-warn-foot{margin:8px 0 6px;text-align:center}
.m-pur-longimg-modal .m-pur-longimg-wrap{overflow:auto;-webkit-overflow-scrolling:touch;align-items:flex-start;padding:8px}
.m-pur-longimg-modal .m-pur-longimg-wrap img{width:100%;height:auto;max-height:none;object-fit:contain;border-radius:10px;background:#fff}
.m-pur-longimg-foot{padding:10px 14px calc(14px + env(safe-area-inset-bottom));background:#1c1a17;color:#f3f0ea}
.m-pur-longimg-foot .m-pur-small{color:#c9c2b6}
.m-pur-longimg-save{color:#ffd9a0;font-weight:700;text-decoration:underline}
/* ===== 【股东分享 · 间距】老板 2026-09-24 真机反馈（只调间距，零逻辑/文案/颜色改动）=====
   现象：采购清单详情 → 股东分享区，「长期有效 / 7 天 / 30 天」那一行与下方
        「生成分享链接」按钮**贴在一起**（该行自带 margin-bottom:0，按钮 margin:0 ⇒ 实际间距 0px）。
   处置：① 有效期行下方补 14px 垂直间距（建议区间 12~16px 的中位，明显可辨）；
        ② 「生成长图（发微信）」按钮与其上方 ⚠️ 静态快照提示之间同步调到 14px，
            两个按钮上方间距**完全一致**，整块节奏统一、不忽大忽小。
   作用域：仅 #m-pur-share（股东分享卡片）内部 —— 采购列表页筛选行的 .m-pur-filter、
        长图弹窗里的 .m-pur-warn.m-pur-warn-foot 均**不受影响**；
        纯新增选择器，不改动任何既有规则，靠 ID 特异性胜出，不依赖书写顺序。 */
#m-pur-share .m-pur-filter{margin-bottom:14px}
#m-pur-share .m-pur-warn{margin-bottom:14px}
/* ===== 【石材图片库 · 批3】纯新增样式（不动任何既有选择器）===== */
.m-gal-page .m-toolbar{gap:9px}
.m-gal-search{display:flex;gap:8px;align-items:center}
.m-gal-search .m-input{flex:1 1 auto;min-width:0}
.m-gal-search .m-btn{flex:0 0 auto}
.m-gal-filters{display:flex;flex-wrap:wrap;gap:7px;margin-top:9px}
/* 【批9】两个分类维度并存：每行 chips 前的小标题（按品种 / 按采购单名称）。 */
.m-gal-filter-label{font-size:11.5px;font-weight:700;color:var(--muted);margin-top:10px;letter-spacing:.04em}
.m-gal-chip-pur{border-color:#f0c68a;background:#fffaf2}
.m-gal-chip-pur.active{background:#8a5300;border-color:#8a5300;color:#fff}
.m-gal-chip{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--line);background:#fff;color:var(--ink);border-radius:999px;padding:5px 11px;font-size:12.5px;font-weight:600;line-height:1.2}
.m-gal-chip.active{background:var(--ink);color:#fff;border-color:var(--ink)}
.m-gal-chip-n{font-size:11px;opacity:.75;font-weight:700}
.m-gal-admin{display:flex;gap:8px;margin-top:10px}
.m-gal-admin .m-btn{flex:1 1 0;min-width:0}
.m-gal-count{font-size:12px;color:var(--muted);margin-top:9px}
.m-gal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.m-gal-card{margin:0;border:1px solid var(--line);border-radius:14px;background:#fff;overflow:hidden;display:flex;flex-direction:column}
.m-gal-card img{width:100%;aspect-ratio:1/1;object-fit:contain;background:var(--surface-soft);display:block}
.m-gal-card img.is-broken{opacity:.25}
.m-gal-card.is-removed img{opacity:.45;filter:grayscale(.5)}
.m-gal-name{font-size:12.5px;font-weight:600;padding:7px 9px 0;line-height:1.35;overflow-wrap:anywhere}
.m-gal-tag{display:inline-block;font-size:10px;font-weight:700;color:#8a5300;background:#fff4e5;border:1px solid #f0c68a;border-radius:999px;padding:0 6px;margin-left:4px;vertical-align:1px}
/* 【批9】卡片上的「采购单名称」分类标签（只是名称，绝无金额 / 供应商 / 单据）。 */
.m-gal-tag.is-pur{color:#0b5cad;background:#eef6ff;border-color:#a9cdf3}
.m-gal-acts{display:flex;flex-wrap:wrap;gap:5px;padding:8px 9px 10px;margin-top:auto}
.m-gal-act{flex:1 1 auto;min-width:0;border:1px solid var(--line);background:var(--surface-soft);color:var(--ink);border-radius:9px;padding:6px 6px;font-size:11.5px;font-weight:600;line-height:1.2}
.m-gal-act.danger{color:#a3342b;border-color:#f2cfcb;background:#fdeceb}
.m-gal-sheet{max-height:82vh;max-height:min(82vh,82dvh)}
.m-gal-blocks{display:flex;flex-direction:column;gap:8px;margin:10px 0}
.m-gal-block{display:flex;align-items:center;gap:9px;border:1px solid var(--line);border-radius:12px;padding:8px;background:#fff}
.m-gal-block img{width:52px;height:52px;flex:0 0 auto;object-fit:contain;border-radius:9px;background:var(--surface-soft)}
.m-gal-block-info{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:2px}
.m-gal-block-info strong{font-size:13px;overflow-wrap:anywhere}
.m-gal-block-info span{font-size:11.5px;color:var(--muted)}
.m-gal-block-acts{flex:0 0 auto;display:flex;flex-direction:column;gap:5px}
.m-gal-block-acts .m-btn{min-height:30px;padding:4px 9px;font-size:11.5px}

/* ===== 【采购明细图片 + 采购单据 · 批4】纯新增样式（不动任何既有选择器）===== */
.m-pur-media{margin-top:10px;border-top:1px dashed var(--line);padding-top:10px}
.m-pur-media-title{font-size:12.5px;font-weight:700;color:var(--ink);display:flex;flex-wrap:wrap;gap:4px;align-items:baseline}
.m-pur-media-hint{font-size:12px;color:var(--muted);margin-top:7px;line-height:1.45}
.m-pur-media-note{font-size:11.5px;color:var(--muted);margin-top:8px;line-height:1.45}
.m-pur-media-acts{display:flex;gap:8px;margin-top:9px}
.m-pur-media-acts .m-btn{flex:1 1 0;min-width:0;min-height:34px;padding:6px 8px;font-size:12.5px}
.m-pur-thumbs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:9px}
.m-pur-thumb{margin:0;position:relative;border:1px solid var(--line);border-radius:11px;background:#fff;overflow:hidden;display:flex;flex-direction:column}
.m-pur-thumb.is-cover{border-color:#8a5300;box-shadow:0 0 0 1px #f0c68a inset}
.m-pur-thumb img{width:100%;aspect-ratio:1/1;object-fit:contain;background:var(--surface-soft);display:block}
.m-pur-thumb img.is-broken{opacity:.25}
.m-pur-thumb-cover{position:absolute;top:5px;left:5px;font-size:10px;font-weight:700;color:#8a5300;background:#fff4e5;border:1px solid #f0c68a;border-radius:999px;padding:0 6px;line-height:16px}
.m-pur-thumb-acts{display:flex;flex-wrap:wrap;gap:4px;padding:6px}
.m-pur-thumb-acts .m-gal-act{flex:1 1 42%;min-width:0;padding:5px 4px;font-size:11px}
.m-pur-docs{display:flex;flex-wrap:wrap;gap:7px;min-width:0;max-width:100%;margin-top:9px}
.m-pur-doc{flex:1 1 100%;display:flex;align-items:center;gap:7px;border:1px solid var(--line);border-radius:11px;background:#fff;padding:7px 8px}
.m-pur-doc-open{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:8px;border:0;background:none;padding:0;text-align:left;color:var(--ink)}
.m-pur-doc-icon{flex:0 0 auto;width:34px;height:34px;border-radius:8px;background:var(--surface-soft);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}
.m-pur-doc-main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:2px}
.m-pur-doc-name{flex:1 1 auto;min-width:0;font-size:12.5px;font-weight:600;overflow-wrap:anywhere}
.m-pur-doc-size{flex:0 0 auto;font-size:11px;color:var(--muted)}
.m-pur-doc-acts{flex:0 0 auto;display:flex;gap:4px}
.m-pur-doc-acts .m-gal-act{flex:0 0 auto;min-width:30px;padding:5px 7px;font-size:11.5px}
/* ===== 【批7 · 修】明细里「石材图片区 / 采购单据区」分区 + 图片类单据缩略图 + 卡片单据角标 ===== */
.m-pur-sec{margin-top:11px;padding:9px;border:1px solid var(--line);border-radius:12px;background:var(--surface-soft)}
.m-pur-sec[data-pur-sec="document"]{background:#fff8ee;border-color:#f0dcc0}
.m-pur-sec-head{display:flex;flex-wrap:wrap;gap:4px 8px;align-items:baseline;justify-content:space-between}
.m-pur-sec-name{font-size:12.5px;font-weight:700;color:var(--ink)}
.m-pur-sec-name b{color:#8a5300}
.m-pur-sec-hint{font-size:11px;color:var(--muted)}
.m-pur-sec .m-pur-thumbs,.m-pur-sec .m-pur-docs{margin-top:8px}
.m-pur-thumb.is-doc{flex:0 1 calc((100% - 14px) / 3);border-color:#f0dcc0}
.m-pur-thumb-doc{position:absolute;top:5px;left:5px;font-size:10px;font-weight:700;color:#8a5300;background:#fff4e5;border:1px solid #f0c68a;border-radius:999px;padding:0 6px;line-height:16px}
/* ===== 【采购清单详情 · 批11】材质图 + 单据图**同一排**（材质图在最前 / 最左）
   宿主规格（本轮更正上一轮）：每条明细最后一区是「一排缩略图」= [材质图][单据图][单据图]…，
   材质图与单据图在**同一个横向容器**里并排（材质图**不再**单独占一排、也不在单据之上）；窄屏只允许**同容器内**自动换行。
   做法：材质图那一格（.m-pur-covers-inline）作为 .m-pur-docs.m-pur-docs-detail 的**第一个 flex 子项**，
        其后紧跟 purDocReadHtml 产出的单据缩略图 / PDF 卡片 —— 直接复用既有 .m-pur-docs（display:flex;flex-wrap:wrap;gap:7px），
        不新增容器、不拆成两个块。仅 2 组最小新增规则：
        ① 这一排顶对齐，并用**自身的上虚线 + 9px 内边距**承接原「采购单据 · N 个」小标题提供的分隔
           （小标题本轮去掉：这一排同时含材质图与单据图，任何单一标题都名不符实；单据数量仍在文字块「单据」一行，
            见 purDetailItemHtml 注释，信息不丢）；
        ② 本排内材质图与单据缩略图**统一尺寸** clamp(52px,16vw,62px)（项目既有 clamp 习惯）：
           320 宽 = 52px、390 宽 = 62px ⇒ 320 宽下一行可排 4 张、390 宽可排 5 张，
           「材质图 + 3 张单据缩略图」在 320 宽下仍是同一排，不会被挤爆 / 被迫换行。
           （单据缩略图原为「容器宽度三等分」≈87~94px，与 62px 材质图并排时大小不一且更早换行，故仅在本排内收窄为固定尺寸；
             .m-pur-sec 里编辑页的单据缩略图、.m-pur-thumb.is-doc 的通用规则**均不受影响**。） */
/* 【修·批12】本排显式允许换行：材质图格排不下时在卡片宽度内折行，单据紧随其后继续排（同一换行流）。 */
.m-pur-docs-detail{margin-top:9px;padding-top:9px;border-top:1px dashed var(--line);align-items:flex-start;flex-wrap:wrap;min-width:0;max-width:100%}
.m-pur-docs-detail>.m-pur-covers-inline .m-pur-cover{width:clamp(52px,16vw,62px);height:clamp(52px,16vw,62px)}
.m-pur-docs-detail>.m-pur-thumb.is-doc{flex:0 0 auto;width:clamp(52px,16vw,62px)}
.m-pur-doc-badge{display:inline-flex;align-items:center;height:24px;padding:0 9px;border-radius:999px;background:#fff4e5;border:1px solid #f0c68a;color:#8a5300;font-size:11.5px;font-weight:700}
/* ===== 【批13 · 采购清单列表】名字区（列表卡「材质图」位置改为产品名：横排 / 自动换行 / 可折叠）
   只**新增**选择器，不改动任何既有规则；本区**不含图片**，纯文字胶囊 + 一个纯文字折叠按钮 + 行尾单据角标。
   卡片内换行、不溢出、不横向滚动：容器 flex-wrap + min-width:0 + max-width:100%，
   单个胶囊 max-width:100% 且长名字 overflow-wrap:anywhere 断行。字号与既有小标签（.m-pur-badge 11px / .m-pur-doc-badge 11.5px）一致。 */
.m-pur-names{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0;max-width:100%;margin:9px 0 2px;overflow-wrap:anywhere}
.m-pur-name{max-width:100%;min-width:0;padding:3px 9px;border-radius:999px;background:var(--surface-soft);border:1px solid var(--line);color:var(--ink);font-size:11.5px;font-weight:650;line-height:1.35;overflow-wrap:anywhere;word-break:break-word}
.m-pur-names:not(.m-pur-names-expanded) .m-pur-name-extra{display:none}
.m-pur-names-toggle{flex:0 0 auto;min-height:22px;padding:3px 9px;border-radius:999px;border:1px solid var(--line-strong);background:#fff;color:var(--muted);font-size:11.5px;font-weight:700;line-height:1.35}
.m-pur-names-docs{margin-left:auto;flex:0 0 auto;font-size:11.5px;font-weight:700;color:var(--muted);white-space:nowrap}
/* ===== 【从石材图片库选择 · 批6】图片来源选择器 + 图库选择器 ===== */
.m-covpick-hint{font-size:12.5px;color:var(--muted);margin:0 0 10px}
.m-covpick-list{display:flex;flex-direction:column;gap:8px}
.m-covpick-item{display:flex;align-items:center;flex-wrap:wrap;gap:11px;min-width:0;width:100%;text-align:left;border:1px solid var(--line);background:#fff;color:var(--ink);border-radius:14px;padding:12px 13px;line-height:1.3}
.m-covpick-item.is-stone{border-color:#d9b44a;background:#fffdf4}
.m-covpick-ico{flex:0 0 auto;width:34px;height:34px;border-radius:10px;background:var(--surface-soft);display:flex;align-items:center;justify-content:center;font-size:17px}
.m-covpick-main{flex:1 1 auto;min-width:0}
.m-covpick-label{display:block;font-size:15px;font-weight:700}
.m-covpick-sub{display:block;font-size:11.5px;color:var(--muted);margin-top:2px}
.m-covpick-foot{margin-top:12px}
.m-covgal .m-gal-search{margin-bottom:0}
.m-covgal-count{font-size:12px;color:var(--muted);margin:9px 0}
.m-covgal-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;max-height:46vh;overflow:auto;-webkit-overflow-scrolling:touch}
.m-covgal-card{margin:0;border:1px solid var(--line);border-radius:12px;background:#fff;overflow:hidden;position:relative}
.m-covgal-card.is-sel{border-color:#1f7a4d;box-shadow:0 0 0 2px rgba(31,122,77,.18)}
.m-covgal-media{position:relative}
.m-covgal-media img{width:100%;aspect-ratio:1/1;object-fit:contain;display:block;background:var(--surface-soft)}
.m-covgal-media img.is-broken{opacity:.25}
.m-covgal-tick{position:absolute;right:5px;top:5px;width:20px;height:20px;border-radius:999px;border:2px solid #fff;background:rgba(0,0,0,.28);color:#fff;font-size:12px;font-weight:800;display:flex;align-items:center;justify-content:center}
.m-covgal-card.is-sel .m-covgal-tick{background:#1f7a4d;border-color:#1f7a4d}
.m-covgal-name{font-size:11px;font-weight:600;padding:5px 6px 6px;line-height:1.3;overflow-wrap:anywhere}
.m-covgal-foot{margin-top:11px;border-top:1px solid var(--line);padding-top:10px}
.m-covgal-sel{font-size:12.5px;color:var(--ink);margin-bottom:8px}
.m-covgal-warn{color:#b23b2e;font-weight:700;margin-left:6px}
.m-covgal-btns{display:flex;gap:8px}
.m-covgal-btns .m-btn{flex:1 1 0;min-width:0}

/* ===== 【新建采购单 · 批10】待上传附件（内存态）：状态角标 + 失败描边 + 分区底色 =====
   纯**新增**选择器：不改任何既有规则（既有 .m-pur-* / .m-btn / .m-form-err 全部复用，
   所以卡片、按钮、缩略图网格与批4 的已上传区完全同款，不引入新框架、不新色调）。 */
.m-pur-sec[data-pur-sec="pending"]{background:#fffdf4;border-color:#e8d9a8}
.m-pur-pend-state{position:absolute;top:5px;left:5px;font-size:10px;font-weight:700;color:#8a5300;background:#fff4e5;border:1px solid #f0c68a;border-radius:999px;padding:0 6px;line-height:16px}
.m-pur-pend-state.is-busy{color:#0b5cad;background:#eef6ff;border-color:#a9cdf3}
.m-pur-pend-state.is-error{color:#a3342b;background:#fdeceb;border-color:#f2cfcb}
.m-pur-thumb.is-pend-err{border-color:#f2cfcb}
.m-pur-sec[data-pur-sec="pending"] .m-pur-media-acts .m-btn{min-height:34px;padding:6px 8px;font-size:12.5px}
/* 【客户追踪】iframe 容器：占满头部/后台导航与底部 tab 之间的剩余高度。 */
.m-page.m-tracker-page{display:flex;flex-direction:column;height:100dvh;padding-bottom:38px;overflow:hidden}
.m-page.m-tracker-page.tabs-open{padding-bottom:calc(var(--tab-h) + var(--safe-bottom))}
.m-tracker-body{flex:1;min-height:0;background:#f8f7f3}
.m-tracker-frame{width:100%;height:100%;border:0;display:block}
/* 【后台一级导航 · 折叠】默认收起为一行：当前板块名 + 菜单▾；点开显示全部 chip。
   展开与否只切 .open，不重渲染页面；状态在本次页面加载内由 S.adminNavOpen 记住。 */
.m-admin-nav-toggle{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;min-height:clamp(34px,9vw,40px);padding:6px clamp(11px,3.2vw,14px);border:1px solid var(--line-strong);background:#fff;border-radius:999px;color:var(--ink);font-weight:700;font-size:clamp(12.5px,3.5vw,14.5px);text-align:left}
.m-admin-nav-cur{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.m-admin-nav-cue{flex:0 0 auto;color:var(--muted);font-weight:650}
.m-admin-nav-when-open{display:none}
.m-admin-topnav.open .m-admin-nav-when-closed{display:none}
.m-admin-topnav.open .m-admin-nav-when-open{display:inline}
/* 【开合过渡】display 无法过渡 → 改用 max-height + opacity + translateY；
   .open 时展开、非 .open 时收起；收起后 pointer-events:none 防止误点隐藏的 chips。 */
.m-admin-nav-rows{display:flex;flex-direction:column;gap:clamp(5px,1.5vw,7px);
  max-height:0;opacity:0;transform:translateY(-6px);overflow:hidden;pointer-events:none;
  transition:max-height .26s cubic-bezier(.22,.61,.36,1),opacity .2s ease,transform .26s cubic-bezier(.22,.61,.36,1);
  will-change:max-height,opacity}
.m-admin-topnav.open .m-admin-nav-rows{max-height:min(60vh,420px);opacity:1;transform:none;pointer-events:auto}
@media (prefers-reduced-motion:reduce){
  .m-admin-nav-rows{transition:none}
}
/* 【客户追踪 · 底部导航折叠】只作用于本页：默认收成一条细条，点开还原正常的「产品展示 / 我的」。
   展开与否只切 .open + 页面 .tabs-open，不重渲染页面；状态在本次页面加载内由 S.trackerTabsOpen 记住。 */
.m-bottom-tabs.m-tabs-collapsible{height:38px;padding:0;display:flex;align-items:center;justify-content:center}
.m-bottom-tabs.m-tabs-collapsible.open{height:calc(var(--tab-h) + var(--safe-bottom));padding:6px 26px var(--safe-bottom);display:block}
.m-bottom-tabs.m-tabs-collapsible .m-tabs-items{display:none}
.m-bottom-tabs.m-tabs-collapsible.open .m-tabs-items{display:grid;grid-template-columns:1fr 1fr;height:100%}
.m-bottom-tabs.m-tabs-collapsible.open .m-tabs-toggle{position:absolute;top:2px;right:14px}
.m-tabs-toggle{border:0;background:transparent;color:var(--muted);font-size:12px;font-weight:650;padding:5px 12px;border-radius:999px;letter-spacing:.02em}
.m-tabs-toggle:active{background:var(--accent-soft)}
.m-tabs-when-open{display:none}
.m-bottom-tabs.m-tabs-collapsible.open .m-tabs-when-closed{display:none}
.m-bottom-tabs.m-tabs-collapsible.open .m-tabs-when-open{display:inline}
/* 【来源导入 · 本地上传图片】只有图片、没有链接时的入库入口（与「粘贴网页链接」并排）。
   布局：面板头（标题 + 已选 N/20）→ 空态 / 缩略图网格 / 表格式批量录入 → 入口按钮
   → 归属（新建 / 挂已有）→ 默认尺寸 + 套用到全部 → 选填折叠 → 底部开始上传。 */
.m-src-upload{padding:clamp(11px,3.2vw,14px)}
.m-upload-panel-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:6px}
.m-upload-title{margin:0;font-size:clamp(14px,3.9vw,16px);font-weight:750}
.m-upload-count{color:var(--muted);font-size:clamp(12px,3.3vw,13px);font-weight:650;white-space:nowrap}
.m-upload-count strong{color:var(--accent-dark)}
.m-upload-hint{margin:0 0 10px;color:var(--muted);font-size:clamp(11.5px,3.2vw,12.5px);line-height:1.6}
.m-upload-empty{border:1px dashed var(--line-strong);border-radius:var(--radius-sm);padding:14px 12px;color:var(--muted);font-size:clamp(12px,3.4vw,13.5px);text-align:center;background:var(--surface-soft)}
.m-upload-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(7px,2.2vw,10px)}
.m-upload-item{position:relative;margin:0;display:flex;flex-direction:column;gap:4px}
.m-upload-thumb{position:relative;display:block;width:100%;padding:0;border:1px solid var(--line);background:var(--surface-soft);border-radius:var(--radius-sm);overflow:hidden;aspect-ratio:1 / 1}
.m-upload-thumb img{width:100%;height:100%;object-fit:contain;display:block}
.m-upload-cover{position:absolute;left:4px;top:4px;padding:1px 6px;border-radius:999px;background:rgba(36,35,32,.72);color:#fff;font-size:10.5px;font-weight:700}
.m-upload-dim{font-size:11px;color:var(--muted);text-align:center;cursor:pointer;line-height:1.35;word-break:break-all}
.m-upload-del{position:absolute;right:3px;top:3px;border:0;border-radius:999px;padding:2px 7px;background:rgba(182,69,61,.9);color:#fff;font-size:10.5px;font-weight:700}
.m-upload-viewtabs{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:12px 0 10px}
.m-upload-viewtab{min-height:30px;border:1px solid var(--line-strong);background:#fff;border-radius:999px;color:var(--ink);font-weight:700;font-size:clamp(12px,3.4vw,13.5px)}
.m-upload-viewtab.on{background:var(--accent-soft);border-color:var(--accent);color:var(--accent-dark)}
.m-upload-table{display:flex;flex-direction:column;gap:8px}
.m-upload-table-head,.m-upload-row{display:grid;grid-template-columns:44px 1fr 1fr 1fr;gap:6px;align-items:center}
.m-upload-table-head{color:var(--muted);font-size:11px;text-align:center}
.m-upload-table-head span:first-child{text-align:left}
.m-upload-row>img{width:44px;height:44px;object-fit:contain;background:var(--surface-soft);border-radius:8px;border:1px solid var(--line)}
.m-upload-num{padding:6px 4px;text-align:center;font-size:13px}
.m-upload-target{margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}
.m-upload-modes{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:10px}
.m-upload-mode{min-height:30px;border:1px solid var(--line-strong);background:#fff;border-radius:999px;color:var(--ink);font-weight:700;font-size:clamp(12px,3.4vw,13.5px)}
.m-upload-mode.on{background:var(--accent-soft);border-color:var(--accent);color:var(--accent-dark)}
.m-upload-label{display:block;margin:8px 0 4px;color:var(--muted);font-size:11.5px;font-weight:650}
.m-upload-defaults{margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}
.m-upload-numgrid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px}
.m-upload-extra{margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}
.m-upload-extra>summary{cursor:pointer;color:var(--accent-dark);font-size:clamp(12px,3.4vw,13.5px);font-weight:700}
.m-upload-foot{margin-top:12px}
.m-upload-limit{display:block;margin-top:6px;color:var(--warning);font-size:11.5px;text-align:center}
.m-upload-submitrow{margin-top:12px}
.m-upload-progress{margin-top:8px;color:var(--muted);font-size:12px;text-align:center}

/* ===== 【采购明细 · 尺寸明细】(用户 2026-09-27 确认) 纯**新增**选择器 =====
   一条明细下面一层尺寸明细：表格式一行一条（尺寸 / 片数 / 面积㎡ / 单价），底部「＋ 添加尺寸」，
   块下方显示「本品种合计（N 片 · X㎡ · ¥Y）」。全部复用既有 .m-input / .m-pur-* 观感；
   本组选择器全部新增，不改任何既有规则。 */
.m-pur-sizes{margin:2px 0 10px;padding:9px 9px 8px;border:1px solid var(--line);border-radius:12px;background:#fff}
.m-pur-sizes-title{font-size:12.5px;font-weight:700;color:var(--ink);margin-bottom:7px}
.m-pur-size-head,.m-pur-size-row{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(0,1fr) minmax(0,1fr) minmax(0,1fr) auto;gap:5px;align-items:center}
.m-pur-size-head{color:var(--muted);font-size:11px;text-align:center;padding:0 0 4px}
.m-pur-size-head span:first-child{text-align:left}
.m-pur-size-row{margin-bottom:6px}
.m-pur-size-row .m-input{min-width:0;min-height:40px;padding:7px 5px;font-size:13px;text-align:center;font-variant-numeric:tabular-nums}
.m-pur-size-row .m-input:first-child{text-align:left}
.m-pur-size-del{flex:0 0 auto;border:1px solid #efd1cd;background:#fff1ef;color:var(--danger);border-radius:999px;min-width:32px;min-height:32px;font-size:13px;line-height:1;font-family:inherit;cursor:pointer}
.m-pur-size-add{margin-top:2px}
.m-pur-size-sum{margin-top:9px;padding-top:8px;border-top:1px dashed var(--line);font-size:12px;color:var(--muted);overflow-wrap:anywhere}
.m-pur-size-sum strong{color:var(--ink);font-weight:700}
/* 详情页只读态：同网格、去掉删除列（4 列），沿用既有色调。 */
.m-pur-sizes-ro{margin:10px 0 2px;background:var(--surface-soft)}
.m-pur-size-row-ro{grid-template-columns:minmax(0,1.35fr) minmax(0,1fr) minmax(0,1fr) minmax(0,1fr);margin-bottom:0}
.m-pur-size-row-ro span{padding:7px 5px;text-align:center;font-size:13px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.m-pur-size-row-ro span:first-child{text-align:left}
@media (max-width:360px){
  .m-pur-size-head,.m-pur-size-row{gap:4px}
  .m-pur-size-row .m-input{min-height:38px;padding:6px 3px;font-size:12.5px}
  .m-pur-size-row-ro span{font-size:12.5px}
}

/* ===== 【边料管理 · 批1】手机端三屏（**纯新增**选择器，不改任何既有规则）=====
   版式硬要求：清单页 = flex 列布局（顶部工具条 + 列表 `flex:1;overflow-y:auto` + 底部操作条
   作为最后一个 flex 子项）。**不用「固定高度容器 + grid/gap」**：卡片行不会被拉伸、
   顶部「在架 / 已下架」页签（沿用 .m-segment）也不会被撑成巨型药丸。 */
.m-edge-head-btn{border:1px solid var(--line-strong);background:#fff;color:var(--ink);border-radius:999px;padding:6px 12px;font-size:12.5px;font-weight:700;white-space:nowrap}
.m-page.m-edge-page{display:flex;flex-direction:column;height:100dvh;overflow:hidden;padding-bottom:calc(var(--tab-h) + var(--safe-bottom))}
.m-edge-top{position:relative;z-index:3;flex:0 0 auto;padding:10px 14px 8px;background:var(--bg);display:grid;gap:8px}
.m-edge-search{display:flex;gap:8px;align-items:center}
.m-edge-search .m-input{flex:1;min-width:0}
.m-edge-clear{flex:0 0 auto;border:1px solid var(--line-strong);background:#fff;color:var(--muted);border-radius:999px;width:36px;height:36px;font-size:16px;line-height:1}
/* 【边料颜色】搜索框下的一排单选颜色标签：横向可滑动、隐藏滚动条。 */
.m-edge-colorbar{display:flex;align-items:center;gap:7px;height:25px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.m-edge-colorbar::-webkit-scrollbar{display:none}
.m-edge-ctag{flex:0 0 auto;display:inline-flex;align-items:center;gap:5px;height:25px;padding:0 9px;border:1px solid var(--line);border-radius:999px;background:#fff;color:var(--muted);font-size:12px;line-height:1;white-space:nowrap}
.m-edge-ctag i{flex:0 0 auto;width:7px;height:7px;border-radius:50%;border:1px solid rgba(0,0,0,.12)}
.m-edge-ctag.on{border-color:var(--accent);color:var(--accent-dark);font-weight:700;box-shadow:0 0 0 1px var(--accent) inset}
.m-edge-ctag[data-color="green"] i{background:#4e7d4a}
.m-edge-ctag[data-color="red"] i{background:#b6453d}
.m-edge-ctag[data-color="white"] i{background:#f2efe8}
.m-edge-ctag[data-color="beige"] i{background:#e3cf9e}
.m-edge-ctag[data-color="black"] i{background:#33312e}
.m-edge-ctag[data-color="blue"] i{background:#3f6f9e}
.m-edge-ctag[data-color="gray"] i{background:#9a958c}
.m-edge-ctag[data-color="other"] i{background:#c9c2b4}
.m-edge-scroll{flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:0 14px 12px}
.m-edge-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px;align-items:start}
.m-edge-card{position:relative;min-width:0;background:#fff;border:1px solid var(--line);border-radius:14px;overflow:hidden;display:flex;flex-direction:column}
.m-edge-card.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset}
.m-edge-check{position:absolute;left:8px;top:8px}
.m-edge-cover{position:relative;width:100%;aspect-ratio:16 / 10;background:var(--surface-soft);overflow:hidden;display:flex;align-items:center;justify-content:center}
.m-edge-cover img{width:100%;height:100%;object-fit:cover;display:block}
.m-edge-cover img.is-broken{opacity:.25}
.m-edge-none{color:var(--muted);font-size:12px}
.m-edge-body{min-width:0;padding:8px 9px 9px;display:flex;flex-direction:column;gap:3px}
.m-edge-name{min-width:0;font-weight:750;font-size:clamp(12.5px,3.6vw,14px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.35}
.m-edge-dim{color:var(--muted);font-size:clamp(11px,3.2vw,12px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-variant-numeric:tabular-nums}
.m-edge-area-lbl{color:var(--ink);font-size:clamp(11px,3.2vw,12px);font-weight:650;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-variant-numeric:tabular-nums}
/* 卡片两个标签**分两排**（flex-direction:column）、排间距 4px；每个标签单行省略号，
   点一下弹小浮层显示完整内容（.m-edge-tip）；卡片高度不随名字 / 标签长度变化。 */
.m-edge-tags{display:flex;flex-direction:column;gap:4px;margin-top:2px;min-width:0}
.m-edge-tag{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background:var(--surface-soft);border:1px solid var(--line);border-radius:999px;padding:2px 7px;font-size:clamp(10.5px,3vw,11.5px);color:var(--muted);line-height:1.5}
.m-edge-tip{position:fixed;z-index:1200;max-width:200px;background:rgba(36,35,32,.94);color:#fff;border-radius:10px;padding:7px 10px;font-size:12.5px;line-height:1.45;box-shadow:0 6px 20px rgba(0,0,0,.22);word-break:break-word}
/* 底部固定操作条：列表页的**最后一个 flex 子项**（不是 fixed 定位，避免与列表互相挤压）。 */
.m-edge-bar{flex:0 0 auto;display:flex;align-items:center;gap:10px;background:rgba(255,255,255,.97);border-top:1px solid var(--line);padding:9px 14px;min-height:64px}
.m-edge-bar .m-action-info{flex:1;min-width:0;overflow:hidden}
.m-edge-bar .m-action-main{font-weight:750;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 320px 窄屏下操作条不横向溢出：按钮收窄、字号下调、信息区可压缩（文字省略号）。 */
.m-edge-bar .m-btn{min-width:0;padding:8px 10px;font-size:12.5px;white-space:nowrap;flex:0 0 auto}
/* 清单顶部：整页分享（主色实心）/ 复制链接（白底描边）并排两个按钮。 */
.m-edge-share-bar{display:flex;gap:9px;margin-bottom:12px}
.m-edge-share-bar .m-edge-share-btn{flex:1;min-width:0;min-height:22px;height:22px;padding:0 8px;font-size:12px;line-height:1;white-space:nowrap}
/* 边料详情：大图 + 缩略图条 + 字段表；只有「编辑」按钮（下架 / 彻底删除只在清单页）。 */
.m-edge-detail{padding:14px}
.m-edge-hero{width:100%;aspect-ratio:16 / 10;background:var(--surface-soft);border:1px solid var(--line);border-radius:14px;overflow:hidden;display:flex;align-items:center;justify-content:center}
.m-edge-hero img{width:100%;height:100%;object-fit:contain;display:block}
.m-edge-hero img.is-broken{opacity:.25}
.m-edge-strip{display:flex;gap:8px;overflow-x:auto;padding:10px 0 2px}
.m-edge-strip-item{flex:0 0 auto;width:64px;height:48px;padding:0;border:1px solid var(--line);border-radius:9px;overflow:hidden;background:var(--surface-soft)}
.m-edge-strip-item.on{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset}
.m-edge-strip-item img{width:100%;height:100%;object-fit:cover;display:block}
.m-edge-fields{margin:12px 0;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:#fff}
.m-edge-field{display:flex;gap:10px;padding:10px 12px;border-top:1px solid var(--line);align-items:flex-start}
.m-edge-field:first-child{border-top:0}
.m-edge-field-k{flex:0 0 76px;color:var(--muted);font-size:12.5px}
.m-edge-field-v{flex:1;min-width:0;font-size:13.5px;overflow-wrap:anywhere}
/* 边料管理（上传）/ 编辑页：缩略图网格 + ＋、长宽两个输入框 + 面积实时预览、保管人只读。 */
.m-edge-media{margin-bottom:14px}
.m-edge-media-title{font-weight:750;font-size:13.5px;margin-bottom:8px}
.m-edge-thumbgrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-bottom:8px}
.m-edge-thumb{position:relative;margin:0;aspect-ratio:1 / 1;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--surface-soft)}
.m-edge-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.m-edge-thumb img.is-broken{opacity:.25}
.m-edge-thumb.is-pending{border-color:var(--accent)}
.m-edge-thumb-del{position:absolute;right:3px;top:3px;border:0;border-radius:999px;width:22px;height:22px;line-height:1;background:rgba(182,69,61,.92);color:#fff;font-size:13px;font-weight:700}
.m-edge-add{border:1px dashed var(--line-strong);border-radius:10px;background:var(--surface-soft);color:var(--accent-dark);font-size:24px;font-weight:400;aspect-ratio:1 / 1;min-height:44px}
.m-edge-numgrid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.m-edge-area-live{margin-top:7px;color:var(--muted);font-size:12.5px}
.m-edge-area-live strong{color:var(--accent-dark);font-variant-numeric:tabular-nums}
.m-edge-readonly{background:var(--surface-soft);color:var(--muted)}
/* 320px 窄屏：三列卡片不横向溢出、不把字挤成竖排（省略号 + min-width:0 兜底）；
   底栏新增「分享」后同步收窄按钮与间距，全选 / 已选N项 / 分享 / 下架 / 彻底删除仍在一行。 */
@media (max-width:320px){
  .m-edge-grid{gap:8px}
  .m-edge-body{padding:7px}
  .m-edge-share-bar{gap:7px}
  .m-edge-share-bar .m-edge-share-btn{min-height:22px;height:22px;padding:0 6px;font-size:12px}
  .m-edge-bar{gap:7px;padding:9px 10px}
  .m-edge-bar .m-btn{padding:8px 7px;font-size:12px}
  .m-edge-thumbgrid{gap:6px}
  .m-edge-field-k{flex-basis:64px}
}

/* ===== 【小精品 · 边料精选】客户侧展示页 + 管理端分享卡片（**纯新增**选择器，不改既有规则）=====
   版式硬要求：展示页 = flex 列（头部固定 + 列表 `flex:1;overflow-y:auto`），卡片区一行 2 个平铺；
   底栏沿用统一 .m-bottom-tabs（.m-tabs-3 三等分），**不用「固定高度容器 + grid/gap」**。 */
.m-bottom-tabs.m-tabs-3{grid-template-columns:1fr 1fr 1fr}
.m-page.m-edge-showcase-page{display:flex;flex-direction:column;height:100dvh;overflow:hidden;padding-bottom:calc(var(--tab-h) + var(--safe-bottom))}
.m-es-head{flex:0 0 auto;padding:12px 14px 8px;background:var(--bg)}
.m-es-title{font-size:clamp(15px,4.4vw,18px);font-weight:750;overflow-wrap:anywhere}
.m-es-desc{font-size:12.5px;color:var(--muted);margin-top:4px;overflow-wrap:anywhere}
.m-es-scroll{flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:0 14px 14px}
.m-es-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;align-items:start}
.m-es-card{min-width:0;background:#fff;border:1px solid var(--line);border-radius:14px;overflow:hidden;display:flex;flex-direction:column}
.m-es-cover{width:100%;aspect-ratio:16 / 10;background:var(--surface-soft);overflow:hidden;display:flex;align-items:center;justify-content:center}
.m-es-cover img{width:100%;height:100%;object-fit:cover;display:block}
.m-es-cover img.is-broken{opacity:.25}
.m-es-none{color:var(--muted);font-size:12px}
.m-es-body{min-width:0;padding:8px 9px 9px;display:flex;flex-direction:column;gap:3px;align-items:flex-start}
.m-es-name{max-width:100%;font-weight:750;font-size:clamp(12.5px,3.6vw,14px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.35}
.m-es-dim,.m-es-area{max-width:100%;font-size:clamp(11px,3.2vw,12px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-variant-numeric:tabular-nums}
.m-es-dim{color:var(--muted)}
.m-es-area{color:var(--ink);font-weight:650}
.m-es-tag{margin-top:2px;background:var(--surface-soft);border:1px solid var(--line);border-radius:999px;padding:2px 8px;font-size:clamp(10.5px,3vw,11.5px);color:var(--muted)}
/* 管理端「边料清单」顶部分享卡片（滚动区第一块，随列表滚动）。 */
.m-share-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px;margin-bottom:12px}
.m-share-card-main{display:flex;gap:11px;align-items:center;min-width:0}
.m-share-card-cover{flex:0 0 96px;width:96px;aspect-ratio:16 / 10;border-radius:11px;overflow:hidden;background:var(--surface-soft);display:flex;align-items:center;justify-content:center}
.m-share-card-cover img{width:100%;height:100%;object-fit:cover;display:block}
.m-share-card-cover img.is-broken{opacity:.25}
.m-share-none{color:var(--muted);font-size:11.5px}
.m-share-card-info{flex:1;min-width:0}
.m-share-card-title{font-weight:750;font-size:clamp(14px,4vw,16px);overflow-wrap:anywhere}
.m-share-card-desc{font-size:12.5px;color:var(--muted);margin-top:4px;overflow-wrap:anywhere}
.m-share-card-domain{font-size:12px;color:var(--accent-dark);margin-top:4px;font-variant-numeric:tabular-nums}
.m-share-card-actions{display:flex;gap:9px;margin-top:12px}
.m-share-card-actions>.m-btn{flex:1;min-width:0;padding:10px 8px;font-size:13px}
/* 「发送给客户」面板：同一张卡片预览 + 标题 / 描述 / 封面 / 有效期。 */
.m-share-preview{display:flex;gap:11px;align-items:center;min-width:0;border:1px solid var(--line);border-radius:13px;padding:10px;background:var(--surface-soft);margin-bottom:12px}
.m-share-preview-cover{flex:0 0 88px;width:88px;aspect-ratio:16 / 10;border-radius:10px;overflow:hidden;background:#fff;display:flex;align-items:center;justify-content:center;color:var(--muted);font-size:11.5px}
.m-share-preview-cover img{width:100%;height:100%;object-fit:cover;display:block}
.m-share-preview-info{flex:1;min-width:0}
.m-share-preview-title{font-weight:750;font-size:14.5px;overflow-wrap:anywhere}
.m-share-preview-desc{font-size:12.5px;color:var(--muted);margin-top:4px;overflow-wrap:anywhere}
.m-share-preview-domain{font-size:12px;color:var(--accent-dark);margin-top:4px}
.m-share-covers{display:flex;gap:8px;overflow-x:auto;padding:2px 0 4px}
.m-share-cover-pick{flex:0 0 auto;width:64px;height:44px;padding:0;border:1px solid var(--line);border-radius:9px;overflow:hidden;background:var(--surface-soft)}
.m-share-cover-pick.on{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset}
.m-share-cover-pick img{width:100%;height:100%;object-fit:cover;display:block}
/* 320px 窄屏：两列卡片不横向溢出、分享卡片与面板预览同步收窄。 */
@media (max-width:320px){
  .m-es-grid{gap:8px}
  .m-es-body{padding:7px}
  .m-share-card-cover{flex-basis:80px;width:80px}
  .m-share-card-actions>.m-btn{padding:9px 6px;font-size:12.5px}
  .m-share-preview-cover{flex-basis:74px;width:74px}
}

/* ============================================================================
   【权限骨架 · 批2-B】角色管理 / 权限点预览（纯新增类名，不影响任何既有选择器）
     · .m-role-perms     角色卡与用户表单的权限点胶囊（自动换行）
     · .m-perm-group     角色表单里的权限点分组标题 + 行
     · .m-role-preview   用户表单「角色」下拉下方的权限预览容器
   ============================================================================ */
.m-role-perms{display:flex;flex-wrap:wrap;gap:6px;margin:7px 0 2px}
.m-role-perms .m-chip{min-height:28px;padding:4px 10px;font-size:12.5px}
/* 【批次C · F3/F7】「仅最高权限」标注：勾上只显示入口、直连接口仍 403。 */
.m-perm-tag{display:inline-block;margin-left:6px;padding:1px 7px;border-radius:999px;background:#fff4e5;border:1px solid #f0c07a;color:#a15c00;font-size:11px;line-height:1.6;vertical-align:middle;white-space:nowrap}
.m-perm-group{margin:10px 0 2px}
.m-perm-group+.m-perm-group{margin-top:14px}
.m-perm-group-t{font-size:13px;font-weight:800;color:var(--muted);margin:0 0 2px}
.m-perm-group .m-user-perm{margin-top:6px}
.m-role-preview{margin-top:6px}
.m-role-preview:empty{display:none}

/* ============================================================================
   【角色页改版 · 2026-10-31】卡片 → 行式列表 + 内置/自建分组 + 详情弹层
     （设计稿 design/roles-after.png；纯新增类名，上面既有 .m-role-perms / .m-perm-group 等保留不动，
     用户管理页与权限预览仍在用）。最小可读 11px、小字颜色统一 #6b6459（白底对比 ≈5.4:1）。
   ============================================================================ */
.m-role-ov{display:flex;align-items:center;gap:14px;padding:14px 15px;margin-bottom:13px}
.m-role-ov-main{flex:1;min-width:0}
.m-role-ov-num{font-size:23px;font-weight:800;letter-spacing:.4px;font-variant-numeric:tabular-nums;line-height:1.2}
.m-role-ov-num small{font-size:12px;font-weight:600;color:var(--muted);margin-left:5px;letter-spacing:0}
.m-role-ov-sub{font-size:11.5px;color:#6b6459;margin-top:5px}
.m-role-ov-side{text-align:right;font-size:11.5px;color:#6b6459;line-height:1.75;flex:0 0 auto}
.m-role-ov-side b{color:var(--ink);font-weight:700;font-variant-numeric:tabular-nums}

.m-role-group-h{display:flex;align-items:baseline;gap:8px;padding:0 4px;margin:14px 0 7px}
.m-role-group-h>span{font-size:11.5px;font-weight:800;letter-spacing:1.2px;color:#6b6459}
.m-role-group-h>i{font-style:normal;font-size:11px;color:#7d7566}
.m-role-list{background:var(--surface);border:1px solid var(--line);border-radius:14px;overflow:hidden;box-shadow:var(--shadow)}
.m-role-row{display:flex;align-items:center;gap:12px;width:100%;padding:13px 14px;border:0;border-bottom:1px solid #f1ede4;background:transparent;font-family:inherit;text-align:left;color:var(--ink);-webkit-tap-highlight-color:transparent}
.m-role-row:last-child{border-bottom:0}
.m-role-row:active{background:var(--surface-soft)}
.m-role-ava{width:34px;height:34px;flex:0 0 34px;border-radius:11px;display:flex;align-items:center;justify-content:center;font-size:13.5px;font-weight:700}
.m-role-ava.lg{width:44px;height:44px;flex:0 0 44px;border-radius:14px;font-size:16px}
.m-role-ava.owner{background:#f0e2c9;color:#8a5a00}
.m-role-ava.sales{background:#e2ecf2;color:#245c7c}
.m-role-ava.custom{background:#e8ece4;color:#425c39}
.m-role-row-main{flex:1;min-width:0}
.m-role-row-name{display:flex;align-items:center;gap:7px;font-size:14.5px;font-weight:650;letter-spacing:.2px;overflow-wrap:anywhere}
.m-role-row-name em{font-style:normal;font-size:11px;font-weight:650;padding:1px 6px;border-radius:5px;background:#f2ece1;color:#6c5940;white-space:nowrap}
.m-role-row-sub{font-size:11.5px;color:#6b6459;margin-top:3px;font-variant-numeric:tabular-nums}
.m-role-row-side{display:flex;align-items:center;gap:7px;font-size:11.5px;color:#6b6459;flex:0 0 auto;white-space:nowrap}
.m-role-row-side>b{font-size:14px;color:var(--ink);font-weight:700;font-variant-numeric:tabular-nums}
.m-role-lock{width:22px;height:22px;border-radius:50%;background:#f6f0e6;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;color:#6f5730}
.m-role-chev{color:#a89e8c;font-size:16px;line-height:1;padding-left:2px}
.m-role-note{font-size:11px;color:#6b6459;line-height:1.8;padding:12px 4px 2px}

/* 详情弹层 */
.m-role-detail{display:flex;align-items:center;gap:13px;padding:14px;border:1px solid var(--line);border-radius:14px;background:var(--surface-soft);margin-bottom:12px}
.m-role-detail-main{flex:1;min-width:0}
.m-role-detail-name{font-size:17px;font-weight:800;letter-spacing:.3px;overflow-wrap:anywhere}
.m-role-detail-sub{font-size:11.5px;color:#6b6459;margin-top:4px}
.m-role-gauge-row{display:flex;align-items:center;gap:8px;margin-top:9px;max-width:170px}
.m-role-gauge{height:4px;border-radius:2px;background:#e6e0d4;overflow:hidden;flex:1;min-width:0}
.m-role-gauge>i{display:block;height:100%;background:var(--accent);border-radius:2px}
.m-role-gauge-t{font-size:11px;color:#6b6459;font-variant-numeric:tabular-nums;white-space:nowrap;flex:0 0 auto}
.m-role-locked-note{font-size:12px;line-height:1.7;color:#6b6459;background:#f7f2e8;border:1px solid #ecdfc6;border-radius:11px;padding:10px 12px;margin-bottom:11px}
.m-perm-block{border:1px solid var(--line);border-radius:13px;overflow:hidden;margin-top:10px;background:var(--surface)}
.m-perm-block-h{display:flex;align-items:center;gap:8px;padding:10px 13px;background:#faf8f4;border-bottom:1px solid #f1ede4}
.m-perm-block-h>span{font-size:12px;font-weight:800;letter-spacing:1px;color:#5f584b}
.m-perm-block-h>b{margin-left:auto;font-size:11px;font-weight:700;color:#6b6459;font-variant-numeric:tabular-nums}
.m-perm-block .m-user-perm{margin:0;border:0;border-bottom:1px solid #f5f1e9;border-radius:0;background:transparent;padding:11px 13px}
.m-perm-block .m-user-perm:last-child{border-bottom:0}
.m-perm-block .m-user-perm-copy>strong{font-size:13.5px;font-weight:600;display:inline}
/* 「仅最高权限」紧跟权限名（既有 CSS 把 strong 设成 block，标签会被挤到下一行） */
.m-perm-block .m-user-perm-copy .m-subtle{margin-top:3px}
/* 表头「新建」是 <button>，抹掉浏览器默认边框与底色（.m-header-link 原本只当 <a> 用） */
.m-header-side.right .m-header-link{border:0;background:transparent;font-family:inherit;line-height:1;padding:8px 2px;cursor:pointer}
.m-header-side.right .m-header-link:active{opacity:.6}
.m-role-detail-links{display:flex;gap:16px;justify-content:center;margin-top:14px}
.m-role-detail-links>button{border:0;background:transparent;font-family:inherit;font-size:13px;font-weight:600;color:var(--accent-dark);padding:8px 4px;-webkit-tap-highlight-color:transparent}
.m-role-detail-links>button.danger{color:var(--danger)}

/* ===== 来源导入 · 三块按来源分色（本地上传=蓝 / 链石云仓=金 / 华研·网页链接=绿） =====
   照 srcimport-mock/mock.html 的视觉方案：容器左侧色条 + 标题淡底（含主色小图标块与
   右上角 pill）+ 标题文字主色 + 块内主按钮同色；块间距略增大。
   DOM 侧只加了 .m-src-blk 与 .blk-local / .blk-chain / .blk-hua 三个类，未动结构。 */
.m-src-blk{border:1px solid var(--line);border-left:5px solid var(--line);border-radius:var(--radius);background:var(--surface);box-shadow:var(--shadow);overflow:hidden;margin:0 0 22px}
.m-src-blk.blk-local{border-left-color:var(--c-local)}
.m-src-blk.blk-chain{border-left-color:var(--c-chain)}
.m-src-blk.blk-hua{border-left-color:var(--c-hua)}
.m-src-blk>.m-section-title{display:flex;align-items:center;gap:9px;margin:0;padding:11px 13px;font-weight:700}
.m-src-blk>.m-section-title::before{content:"⬆";flex:none;width:26px;height:26px;border-radius:9px;display:grid;place-items:center;background:var(--c-local);color:#fff;font-size:14px;font-weight:700}
.m-src-blk>.m-section-title::after{flex:none;margin-left:auto;font-size:11px;font-weight:700;line-height:1.7;border-radius:99px;padding:2px 9px;background:#fff;border:1px solid var(--line);white-space:nowrap}
.m-src-blk.blk-local>.m-section-title{background:var(--c-local-bg);color:var(--c-local)}
.m-src-blk.blk-chain>.m-section-title{background:var(--c-chain-bg);color:var(--c-chain)}
.m-src-blk.blk-hua>.m-section-title{background:var(--c-hua-bg);color:var(--c-hua)}
.m-src-blk.blk-chain>.m-section-title::before{content:"链";background:var(--c-chain)}
.m-src-blk.blk-hua>.m-section-title::before{content:"华";background:var(--c-hua)}
.m-src-blk.blk-local>.m-section-title::after{content:"本地 · 蓝";color:var(--c-local);border-color:var(--c-local-line)}
.m-src-blk.blk-chain>.m-section-title::after{content:"链石 · 金";color:var(--c-chain);border-color:var(--c-chain-line)}
.m-src-blk.blk-hua>.m-section-title::after{content:"华研 · 绿";color:var(--c-hua);border-color:var(--c-hua-line)}
.m-src-blk>.m-card{border:0;border-radius:0;box-shadow:none;background:transparent}
.m-src-blk.blk-local .m-btn.primary{background:var(--c-local)}
.m-src-blk.blk-chain .m-btn.primary{background:var(--c-chain)}
.m-src-blk.blk-hua .m-btn.primary{background:var(--c-hua)}

/* 【来源导入 · 配色统一】每块的线框+底色跟随自己的主色；块内"有线框/有底色"的同色；最外圈整体大框
   （2026-10-01 老板要求：蓝的全蓝、绿的全绿、黄的全黄，外圈整体围起来） */
.m-src-blk.blk-local{border-color:var(--c-local-line);background:var(--c-local-bg)}
.m-src-blk.blk-chain{border-color:var(--c-chain-line);background:var(--c-chain-bg)}
.m-src-blk.blk-hua{border-color:var(--c-hua-line);background:var(--c-hua-bg)}
.m-src-blk.blk-local .m-card,.m-src-blk.blk-local .m-input,.m-src-blk.blk-local .m-textarea,.m-src-blk.blk-local .m-select,.m-src-blk.blk-local .m-btn:not(.primary),.m-src-blk.blk-local .m-src-target-host>*,.m-src-blk.blk-local .m-src-intro{border-color:var(--c-local-line)!important;background:#fff}
.m-src-blk.blk-chain .m-card,.m-src-blk.blk-chain .m-input,.m-src-blk.blk-chain .m-textarea,.m-src-blk.blk-chain .m-select,.m-src-blk.blk-chain .m-btn:not(.primary),.m-src-blk.blk-chain .m-src-target-host>*,.m-src-blk.blk-chain .m-src-intro{border-color:var(--c-chain-line)!important;background:#fff}
.m-src-blk.blk-hua .m-card,.m-src-blk.blk-hua .m-input,.m-src-blk.blk-hua .m-textarea,.m-src-blk.blk-hua .m-select,.m-src-blk.blk-hua .m-btn:not(.primary),.m-src-blk.blk-hua .m-src-target-host>*,.m-src-blk.blk-hua .m-src-intro{border-color:var(--c-hua-line)!important;background:#fff}
.m-src-blk.blk-local>.m-section-title{border-bottom:1px solid var(--c-local-line)}
.m-src-blk.blk-chain>.m-section-title{border-bottom:1px solid var(--c-chain-line)}
.m-src-blk.blk-hua>.m-section-title{border-bottom:1px solid var(--c-hua-line)}
.m-content.m-src-page{border:2px solid var(--accent);border-radius:16px;padding:12px 11px 4px;background:#fff;margin:10px}

/* 【来源导入 · 配色统一 v2】块内"所有"线框/底色跟随该块主色：
   直接在该块作用域里重写通用变量 --line / --line-strong / --surface-soft，
   这样块内任何用这些变量的元素（行、卡片、输入框、虚线框…）都会自动变成同色系。 */
.m-src-blk.blk-local{--line:var(--c-local-line);--line-strong:var(--c-local-line);--surface-soft:var(--c-local-bg)}
.m-src-blk.blk-chain{--line:var(--c-chain-line);--line-strong:var(--c-chain-line);--surface-soft:var(--c-chain-bg)}
.m-src-blk.blk-hua  {--line:var(--c-hua-line);  --line-strong:var(--c-hua-line);  --surface-soft:var(--c-hua-bg)}
.m-src-blk.blk-local .m-src-row,.m-src-blk.blk-local article,.m-src-blk.blk-local .m-card{border-color:var(--c-local-line)!important}
.m-src-blk.blk-chain .m-src-row,.m-src-blk.blk-chain article,.m-src-blk.blk-chain .m-card{border-color:var(--c-chain-line)!important}
.m-src-blk.blk-hua   .m-src-row,.m-src-blk.blk-hua   article,.m-src-blk.blk-hua   .m-card{border-color:var(--c-hua-line)!important}
/* 最外圈大框：提高优先级，防止被 .m-content 覆盖 */
.m-content.m-src-page{border:2px solid var(--accent)!important;border-radius:16px!important;padding:12px 11px 4px!important;background:#fff!important;margin:10px!important;box-sizing:border-box}

/* 【来源导入 · 配色统一 v3】把"归属/新建整料·挂到已有整料"这些子组件也纳入各自主色。
   它们有独立类名（m-upload-target / m-upload-modes / m-upload-mode / m-upload-existing …），
   v2 的通用变量覆盖不到，这里按块逐一上色。 */
.m-src-blk.blk-local .m-upload-target,.m-src-blk.blk-local .m-upload-modes,.m-src-blk.blk-local .m-upload-mode,.m-src-blk.blk-local .m-upload-existing,.m-src-blk.blk-local .m-upload-label,.m-src-blk.blk-local .m-src-import,.m-src-blk.blk-local .m-src-hint{border-color:var(--c-local-line)!important}
.m-src-blk.blk-chain .m-upload-target,.m-src-blk.blk-chain .m-upload-modes,.m-src-blk.blk-chain .m-upload-mode,.m-src-blk.blk-chain .m-upload-existing,.m-src-blk.blk-chain .m-upload-label,.m-src-blk.blk-chain .m-src-import,.m-src-blk.blk-chain .m-src-hint{border-color:var(--c-chain-line)!important}
.m-src-blk.blk-hua   .m-upload-target,.m-src-blk.blk-hua   .m-upload-modes,.m-src-blk.blk-hua   .m-upload-mode,.m-src-blk.blk-hua   .m-upload-existing,.m-src-blk.blk-hua   .m-upload-label,.m-src-blk.blk-hua   .m-src-import,.m-src-blk.blk-hua   .m-src-hint{border-color:var(--c-hua-line)!important}
.m-src-blk.blk-local .m-upload-mode.on{background:var(--c-local-bg);border-color:var(--c-local);color:var(--c-local)}
.m-src-blk.blk-chain .m-upload-mode.on{background:var(--c-chain-bg);border-color:var(--c-chain);color:var(--c-chain)}
.m-src-blk.blk-hua   .m-upload-mode.on{background:var(--c-hua-bg);border-color:var(--c-hua);color:var(--c-hua)}
.m-src-blk.blk-local .m-upload-target,.m-src-blk.blk-chain .m-upload-target,.m-src-blk.blk-hua .m-upload-target{background:transparent}
.m-src-blk.blk-local .m-src-textarea,.m-src-blk.blk-local .m-input,.m-src-blk.blk-local select{border-color:var(--c-local-line)!important}
.m-src-blk.blk-chain .m-src-textarea,.m-src-blk.blk-chain .m-input,.m-src-blk.blk-chain select{border-color:var(--c-chain-line)!important}
.m-src-blk.blk-hua   .m-src-textarea,.m-src-blk.blk-hua   .m-input,.m-src-blk.blk-hua   select{border-color:var(--c-hua-line)!important}

/* 【来源导入 · 配色统一 v4】块内"一律"跟随该块主色 + 收住横向溢出（让最外圈大框回到可视区）
   老板口径：板块里的线框和有底色的，都要跟这块自己的颜色一致。 */
.m-src-blk.blk-local *{border-color:var(--c-local-line)!important}
.m-src-blk.blk-chain *{border-color:var(--c-chain-line)!important}
.m-src-blk.blk-hua   *{border-color:var(--c-hua-line)!important}
.m-src-blk.blk-local *::placeholder{color:var(--c-local)}
.m-src-blk.blk-chain *::placeholder{color:var(--c-chain)}
.m-src-blk.blk-hua   *::placeholder{color:var(--c-hua)}
/* 主按钮保持自己的实色底；次按钮/输入框统一白底，线框按上面的规则走 */
.m-src-blk.blk-local .m-btn:not(.primary),.m-src-blk.blk-chain .m-btn:not(.primary),.m-src-blk.blk-hua .m-btn:not(.primary){background:#fff}
/* 最外圈大框：收住横向溢出 + 限制子元素宽度，保证框在屏幕上看得见 */
.m-content.m-src-page{border:2px solid var(--accent)!important;border-radius:16px!important;padding:12px 11px 4px!important;background:#fff!important;margin:10px!important;box-sizing:border-box!important;overflow-x:clip!important;max-width:calc(100% - 20px)!important}
@supports not (overflow:clip){
  .m-content.m-src-page{overflow-x:hidden!important}
}
.m-content.m-src-page *{max-width:100%;box-sizing:border-box}
.m-content.m-src-page textarea,.m-content.m-src-page input{overflow-wrap:anywhere;word-break:break-all}

/* 【来源导入 · 配色统一 v5】"非来源"板块（总览 / 已接入来源 / 手机端首页横幅…）统一主色系，
   保证这页不存在"没颜色的板块"（老板口径：每个板块都要有自己的颜色）。 */
.m-content.m-src-page .m-section:not(.m-src-blk){border:1px solid var(--accent)!important;background:#fff!important;border-radius:12px;overflow:hidden}
.m-content.m-src-page .m-section:not(.m-src-blk)>.m-section-title{background:var(--accent-soft)!important;color:var(--accent-dark)!important;border-bottom:1px solid var(--accent)!important}
.m-content.m-src-page .m-section:not(.m-src-blk) .m-card,.m-content.m-src-page .m-section:not(.m-src-blk) .m-input,.m-content.m-src-page .m-section:not(.m-src-blk) .m-textarea,.m-content.m-src-page .m-section:not(.m-src-blk) .m-select,.m-content.m-src-page .m-section:not(.m-src-blk) .m-btn:not(.primary),.m-content.m-src-page .m-section:not(.m-src-blk) .m-src-row{border-color:var(--accent)!important}
.m-content.m-src-page .m-section:not(.m-src-blk) *{border-color:var(--accent)!important}

/* 【来源导入 · 配色统一 v6】块内"有底色"的控件（缩略图 / 表格式批量录入 / 选择控件…）
   底色统一换成**该块的浅色系**，文字用该块主色（老板口径：有底色的也要跟板块同色）。 */
.m-src-blk.blk-local .m-btn:not(.primary),.m-src-blk.blk-local .m-upload-mode,.m-src-blk.blk-local .m-src-pick,.m-src-blk.blk-local .m-src-covercount,.m-src-blk.blk-local .m-chip{background:var(--c-local-bg)!important;color:var(--c-local)!important}
.m-src-blk.blk-chain .m-btn:not(.primary),.m-src-blk.blk-chain .m-upload-mode,.m-src-blk.blk-chain .m-src-pick,.m-src-blk.blk-chain .m-src-covercount,.m-src-blk.blk-chain .m-chip{background:var(--c-chain-bg)!important;color:var(--c-chain)!important}
.m-src-blk.blk-hua   .m-btn:not(.primary),.m-src-blk.blk-hua   .m-upload-mode,.m-src-blk.blk-hua   .m-src-pick,.m-src-blk.blk-hua   .m-src-covercount,.m-src-blk.blk-hua   .m-chip{background:var(--c-hua-bg)!important;color:var(--c-hua)!important}
/* 选中态：深一点的同色，便于区分 */
.m-src-blk.blk-local .m-upload-mode.on{background:var(--c-local)!important;color:#fff!important}
.m-src-blk.blk-chain .m-upload-mode.on{background:var(--c-chain)!important;color:#fff!important}
.m-src-blk.blk-hua   .m-upload-mode.on{background:var(--c-hua)!important;color:#fff!important}

/* 【来源导入 · 配色统一 v7】
   ① 命中真类名 .m-upload-viewtab（「缩略图 / 表格式批量录入」）——此前所有规则都没打到它；
   ② 块内输入框/文本框的线框从"浅线色"升级为"主色"，避免看着像灰。 */
.m-src-blk.blk-local .m-upload-viewtab{background:var(--c-local-bg)!important;color:var(--c-local)!important;border:1px solid var(--c-local-line)!important}
.m-src-blk.blk-chain .m-upload-viewtab{background:var(--c-chain-bg)!important;color:var(--c-chain)!important;border:1px solid var(--c-chain-line)!important}
.m-src-blk.blk-hua   .m-upload-viewtab{background:var(--c-hua-bg)!important;color:var(--c-hua)!important;border:1px solid var(--c-hua-line)!important}
.m-src-blk.blk-local .m-upload-viewtab.on{background:var(--c-local)!important;color:#fff!important;border-color:var(--c-local)!important}
.m-src-blk.blk-chain .m-upload-viewtab.on{background:var(--c-chain)!important;color:#fff!important;border-color:var(--c-chain)!important}
.m-src-blk.blk-hua   .m-upload-viewtab.on{background:var(--c-hua)!important;color:#fff!important;border-color:var(--c-hua)!important}
.m-src-blk.blk-local .m-input,.m-src-blk.blk-local .m-textarea,.m-src-blk.blk-local .m-select{border-color:var(--c-local)!important}
.m-src-blk.blk-chain .m-input,.m-src-blk.blk-chain .m-textarea,.m-src-blk.blk-chain .m-select{border-color:var(--c-chain)!important}
.m-src-blk.blk-hua   .m-input,.m-src-blk.blk-hua   .m-textarea,.m-src-blk.blk-hua   .m-select{border-color:var(--c-hua)!important}
.m-src-blk.blk-local .m-upload-count strong{color:var(--c-local)}
.m-src-blk.blk-chain .m-upload-count strong{color:var(--c-chain)}
.m-src-blk.blk-hua   .m-upload-count strong{color:var(--c-hua)}

/* 【来源导入 · 配色统一 v8】折叠箭头（▶/▼）与标题小图标统一跟随该块主色 */
.m-src-blk.blk-local .m-upload-extra>summary,.m-src-blk.blk-local summary{color:var(--c-local)!important}
.m-src-blk.blk-chain .m-upload-extra>summary,.m-src-blk.blk-chain summary{color:var(--c-chain)!important}
.m-src-blk.blk-hua   .m-upload-extra>summary,.m-src-blk.blk-hua   summary{color:var(--c-hua)!important}
.m-src-blk.blk-local summary::marker,.m-src-blk.blk-local summary::-webkit-details-marker{color:var(--c-local)!important}
.m-src-blk.blk-chain summary::marker,.m-src-blk.blk-chain summary::-webkit-details-marker{color:var(--c-chain)!important}
.m-src-blk.blk-hua   summary::marker,.m-src-blk.blk-hua   summary::-webkit-details-marker{color:var(--c-hua)!important}
.m-src-blk.blk-local .m-section-title::before{background:var(--c-local)!important}
.m-src-blk.blk-chain .m-section-title::before{background:var(--c-chain)!important}
.m-src-blk.blk-hua   .m-section-title::before{background:var(--c-hua)!important}
.m-src-blk.blk-local .m-upload-hint,.m-src-blk.blk-local .m-subtle{color:var(--c-local)!important}

/* 【来源导入 · v9】去掉最外圈大框（老板要求）：恢复页面容器为原本的"无框"形态 */
.m-content.m-src-page{border:0!important;border-radius:0!important;box-shadow:none!important;margin:0!important;padding:14px!important;background:transparent!important}

/* 【来源导入 · v10】整页去掉"黄色(主色系)"：v5 给非来源板块上的主色框/底一律还原为默认中性。
   只保留三个来源块自己的颜色（蓝/金/绿）。 */
.m-content.m-src-page .m-section:not(.m-src-blk){border:1px solid var(--line)!important;background:var(--surface)!important;border-radius:var(--radius)!important;overflow:visible!important}
.m-content.m-src-page .m-section:not(.m-src-blk)>.m-section-title{background:transparent!important;color:var(--ink)!important;border-bottom:0!important}
.m-content.m-src-page .m-section:not(.m-src-blk) .m-card,.m-content.m-src-page .m-section:not(.m-src-blk) .m-input,.m-content.m-src-page .m-section:not(.m-src-blk) .m-textarea,.m-content.m-src-page .m-section:not(.m-src-blk) .m-select,.m-content.m-src-page .m-section:not(.m-src-blk) .m-btn:not(.primary),.m-content.m-src-page .m-section:not(.m-src-blk) .m-src-row{border-color:var(--line)!important;background:var(--surface)!important}
.m-content.m-src-page .m-section:not(.m-src-blk) .m-btn:not(.primary){color:var(--ink)!important}

/* 【来源导入 · v11】非来源板块（已接入来源 / 总览 / 手机端首页横幅）**去掉最外框**，做成平铺形态。
   只保留三个来源块（蓝/金/绿）自己的框——那是要的。 */
.m-content.m-src-page .m-section:not(.m-src-blk){border:0!important;background:transparent!important;box-shadow:none!important;border-radius:0!important;padding-left:0!important;padding-right:0!important}
.m-content.m-src-page .m-section:not(.m-src-blk)>.m-section-title{border:0!important;padding-left:0!important;padding-right:0!important}
.m-content.m-src-page .m-section:not(.m-src-blk) .m-src-row{border:1px solid var(--line)!important}

/* ============================================================================
   【来源导入 · 6 格各一色调类】2026-10-14 追加（老板看图确认：6 个来源格各一个颜色，
   方便一眼分辨）。为 6 格各配一个色调类 blk-t1…blk-t6（金 / 橙 / 紫 / 绿 / 蓝 / 青），
   沿用既有配色机制：色值写成 :root 里的 CSS 变量（--c-t1…--c-t6，与 --c-chain 同处），
   并按上面 .m-src-blk.blk-* 那套规则块（左侧色条、标题底色/字色、::before 角标、::after 标签、
   primary 按钮背景、输入框边框、.m-src-blk 背景与边框…）复制成 6 份。
   本地卡 .blk-local 与其它页面在用的 .blk-chain / .blk-hua 规则原样保留，未改、未删。
   ============================================================================ */
/* 1 链石云仓（料号）· 金 · 角标「链」 */
.m-src-blk.blk-t1{border-left-color:var(--c-t1)}
.m-src-blk.blk-t1{border-color:var(--c-t1-line);background:var(--c-t1-bg)}
.m-src-blk.blk-t1{--line:var(--c-t1-line);--line-strong:var(--c-t1-line);--surface-soft:var(--c-t1-bg)}
.m-src-blk.blk-t1>.m-section-title{background:var(--c-t1-bg);color:var(--c-t1);border-bottom:1px solid var(--c-t1-line)}
.m-src-blk.blk-t1>.m-section-title::before{content:"链";background:var(--c-t1)}
.m-src-blk.blk-t1>.m-section-title::after{content:"LS · 金";color:var(--c-t1);border-color:var(--c-t1-line)}
.m-src-blk.blk-t1 .m-btn.primary{background:var(--c-t1)}
.m-src-blk.blk-t1 .m-card,.m-src-blk.blk-t1 .m-input,.m-src-blk.blk-t1 .m-textarea,.m-src-blk.blk-t1 .m-select,.m-src-blk.blk-t1 .m-src-target-host>*,.m-src-blk.blk-t1 .m-src-intro{border-color:var(--c-t1-line)!important;background:#fff}
.m-src-blk.blk-t1 .m-src-row,.m-src-blk.blk-t1 article,.m-src-blk.blk-t1 .m-card{border-color:var(--c-t1-line)!important}
.m-src-blk.blk-t1 .m-upload-target,.m-src-blk.blk-t1 .m-upload-mode,.m-src-blk.blk-t1 .m-src-import,.m-src-blk.blk-t1 .m-src-hint{border-color:var(--c-t1-line)!important}
.m-src-blk.blk-t1 .m-input,.m-src-blk.blk-t1 .m-textarea,.m-src-blk.blk-t1 .m-select{border-color:var(--c-t1)!important}
.m-src-blk.blk-t1 *{border-color:var(--c-t1-line)!important}
.m-src-blk.blk-t1 *::placeholder{color:var(--c-t1)}
.m-src-blk.blk-t1 .m-btn:not(.primary){background:var(--c-t1-bg)!important;color:var(--c-t1)!important;border-color:var(--c-t1-line)!important}
.m-src-blk.blk-t1 .m-section-title::before{background:var(--c-t1)!important}
.m-src-blk.blk-t1 .m-upload-hint,.m-src-blk.blk-t1 .m-subtle{color:var(--c-t1)!important}
/* 2 石材云仓（料号）· 橙 · 角标「仓」 */
.m-src-blk.blk-t2{border-left-color:var(--c-t2)}
.m-src-blk.blk-t2{border-color:var(--c-t2-line);background:var(--c-t2-bg)}
.m-src-blk.blk-t2{--line:var(--c-t2-line);--line-strong:var(--c-t2-line);--surface-soft:var(--c-t2-bg)}
.m-src-blk.blk-t2>.m-section-title{background:var(--c-t2-bg);color:var(--c-t2);border-bottom:1px solid var(--c-t2-line)}
.m-src-blk.blk-t2>.m-section-title::before{content:"仓";background:var(--c-t2)}
.m-src-blk.blk-t2>.m-section-title::after{content:"SCYC · 橙";color:var(--c-t2);border-color:var(--c-t2-line)}
.m-src-blk.blk-t2 .m-btn.primary{background:var(--c-t2)}
.m-src-blk.blk-t2 .m-card,.m-src-blk.blk-t2 .m-input,.m-src-blk.blk-t2 .m-textarea,.m-src-blk.blk-t2 .m-select,.m-src-blk.blk-t2 .m-src-target-host>*,.m-src-blk.blk-t2 .m-src-intro{border-color:var(--c-t2-line)!important;background:#fff}
.m-src-blk.blk-t2 .m-src-row,.m-src-blk.blk-t2 article,.m-src-blk.blk-t2 .m-card{border-color:var(--c-t2-line)!important}
.m-src-blk.blk-t2 .m-upload-target,.m-src-blk.blk-t2 .m-upload-mode,.m-src-blk.blk-t2 .m-src-import,.m-src-blk.blk-t2 .m-src-hint{border-color:var(--c-t2-line)!important}
.m-src-blk.blk-t2 .m-input,.m-src-blk.blk-t2 .m-textarea,.m-src-blk.blk-t2 .m-select{border-color:var(--c-t2)!important}
.m-src-blk.blk-t2 *{border-color:var(--c-t2-line)!important}
.m-src-blk.blk-t2 *::placeholder{color:var(--c-t2)}
.m-src-blk.blk-t2 .m-btn:not(.primary){background:var(--c-t2-bg)!important;color:var(--c-t2)!important;border-color:var(--c-t2-line)!important}
.m-src-blk.blk-t2 .m-section-title::before{background:var(--c-t2)!important}
.m-src-blk.blk-t2 .m-upload-hint,.m-src-blk.blk-t2 .m-subtle{color:var(--c-t2)!important}
/* 3 啄木鸟·石材码单 · 紫 · 角标「啄」 */
.m-src-blk.blk-t3{border-left-color:var(--c-t3)}
.m-src-blk.blk-t3{border-color:var(--c-t3-line);background:var(--c-t3-bg)}
.m-src-blk.blk-t3{--line:var(--c-t3-line);--line-strong:var(--c-t3-line);--surface-soft:var(--c-t3-bg)}
.m-src-blk.blk-t3>.m-section-title{background:var(--c-t3-bg);color:var(--c-t3);border-bottom:1px solid var(--c-t3-line)}
.m-src-blk.blk-t3>.m-section-title::before{content:"啄";background:var(--c-t3)}
.m-src-blk.blk-t3>.m-section-title::after{content:"ZMN · 紫";color:var(--c-t3);border-color:var(--c-t3-line)}
.m-src-blk.blk-t3 .m-btn.primary{background:var(--c-t3)}
.m-src-blk.blk-t3 .m-card,.m-src-blk.blk-t3 .m-input,.m-src-blk.blk-t3 .m-textarea,.m-src-blk.blk-t3 .m-select,.m-src-blk.blk-t3 .m-src-target-host>*,.m-src-blk.blk-t3 .m-src-intro{border-color:var(--c-t3-line)!important;background:#fff}
.m-src-blk.blk-t3 .m-src-row,.m-src-blk.blk-t3 article,.m-src-blk.blk-t3 .m-card{border-color:var(--c-t3-line)!important}
.m-src-blk.blk-t3 .m-upload-target,.m-src-blk.blk-t3 .m-upload-mode,.m-src-blk.blk-t3 .m-src-import,.m-src-blk.blk-t3 .m-src-hint{border-color:var(--c-t3-line)!important}
.m-src-blk.blk-t3 .m-input,.m-src-blk.blk-t3 .m-textarea,.m-src-blk.blk-t3 .m-select{border-color:var(--c-t3)!important}
.m-src-blk.blk-t3 *{border-color:var(--c-t3-line)!important}
.m-src-blk.blk-t3 *::placeholder{color:var(--c-t3)}
.m-src-blk.blk-t3 .m-btn:not(.primary){background:var(--c-t3-bg)!important;color:var(--c-t3)!important;border-color:var(--c-t3-line)!important}
.m-src-blk.blk-t3 .m-section-title::before{background:var(--c-t3)!important}
.m-src-blk.blk-t3 .m-upload-hint,.m-src-blk.blk-t3 .m-subtle{color:var(--c-t3)!important}
/* 4 华研软件 · 绿 · 角标「华」 */
.m-src-blk.blk-t4{border-left-color:var(--c-t4)}
.m-src-blk.blk-t4{border-color:var(--c-t4-line);background:var(--c-t4-bg)}
.m-src-blk.blk-t4{--line:var(--c-t4-line);--line-strong:var(--c-t4-line);--surface-soft:var(--c-t4-bg)}
.m-src-blk.blk-t4>.m-section-title{background:var(--c-t4-bg);color:var(--c-t4);border-bottom:1px solid var(--c-t4-line)}
.m-src-blk.blk-t4>.m-section-title::before{content:"华";background:var(--c-t4)}
.m-src-blk.blk-t4>.m-section-title::after{content:"HY · 绿";color:var(--c-t4);border-color:var(--c-t4-line)}
.m-src-blk.blk-t4 .m-btn.primary{background:var(--c-t4)}
.m-src-blk.blk-t4 .m-card,.m-src-blk.blk-t4 .m-input,.m-src-blk.blk-t4 .m-textarea,.m-src-blk.blk-t4 .m-select,.m-src-blk.blk-t4 .m-src-target-host>*,.m-src-blk.blk-t4 .m-src-intro{border-color:var(--c-t4-line)!important;background:#fff}
.m-src-blk.blk-t4 .m-src-row,.m-src-blk.blk-t4 article,.m-src-blk.blk-t4 .m-card{border-color:var(--c-t4-line)!important}
.m-src-blk.blk-t4 .m-upload-target,.m-src-blk.blk-t4 .m-upload-mode,.m-src-blk.blk-t4 .m-src-import,.m-src-blk.blk-t4 .m-src-hint{border-color:var(--c-t4-line)!important}
.m-src-blk.blk-t4 .m-input,.m-src-blk.blk-t4 .m-textarea,.m-src-blk.blk-t4 .m-select{border-color:var(--c-t4)!important}
.m-src-blk.blk-t4 *{border-color:var(--c-t4-line)!important}
.m-src-blk.blk-t4 *::placeholder{color:var(--c-t4)}
.m-src-blk.blk-t4 .m-btn:not(.primary){background:var(--c-t4-bg)!important;color:var(--c-t4)!important;border-color:var(--c-t4-line)!important}
.m-src-blk.blk-t4 .m-section-title::before{background:var(--c-t4)!important}
.m-src-blk.blk-t4 .m-upload-hint,.m-src-blk.blk-t4 .m-subtle{color:var(--c-t4)!important}
/* 5 搜石网（石管家）· 蓝 · 角标「搜」 */
.m-src-blk.blk-t5{border-left-color:var(--c-t5)}
.m-src-blk.blk-t5{border-color:var(--c-t5-line);background:var(--c-t5-bg)}
.m-src-blk.blk-t5{--line:var(--c-t5-line);--line-strong:var(--c-t5-line);--surface-soft:var(--c-t5-bg)}
.m-src-blk.blk-t5>.m-section-title{background:var(--c-t5-bg);color:var(--c-t5);border-bottom:1px solid var(--c-t5-line)}
.m-src-blk.blk-t5>.m-section-title::before{content:"搜";background:var(--c-t5)}
.m-src-blk.blk-t5>.m-section-title::after{content:"SS · 蓝";color:var(--c-t5);border-color:var(--c-t5-line)}
.m-src-blk.blk-t5 .m-btn.primary{background:var(--c-t5)}
.m-src-blk.blk-t5 .m-card,.m-src-blk.blk-t5 .m-input,.m-src-blk.blk-t5 .m-textarea,.m-src-blk.blk-t5 .m-select,.m-src-blk.blk-t5 .m-src-target-host>*,.m-src-blk.blk-t5 .m-src-intro{border-color:var(--c-t5-line)!important;background:#fff}
.m-src-blk.blk-t5 .m-src-row,.m-src-blk.blk-t5 article,.m-src-blk.blk-t5 .m-card{border-color:var(--c-t5-line)!important}
.m-src-blk.blk-t5 .m-upload-target,.m-src-blk.blk-t5 .m-upload-mode,.m-src-blk.blk-t5 .m-src-import,.m-src-blk.blk-t5 .m-src-hint{border-color:var(--c-t5-line)!important}
.m-src-blk.blk-t5 .m-input,.m-src-blk.blk-t5 .m-textarea,.m-src-blk.blk-t5 .m-select{border-color:var(--c-t5)!important}
.m-src-blk.blk-t5 *{border-color:var(--c-t5-line)!important}
.m-src-blk.blk-t5 *::placeholder{color:var(--c-t5)}
.m-src-blk.blk-t5 .m-btn:not(.primary){background:var(--c-t5-bg)!important;color:var(--c-t5)!important;border-color:var(--c-t5-line)!important}
.m-src-blk.blk-t5 .m-section-title::before{background:var(--c-t5)!important}
.m-src-blk.blk-t5 .m-upload-hint,.m-src-blk.blk-t5 .m-subtle{color:var(--c-t5)!important}
/* 6 其他网站 · 青 · 角标「网」 */
.m-src-blk.blk-t6{border-left-color:var(--c-t6)}
.m-src-blk.blk-t6{border-color:var(--c-t6-line);background:var(--c-t6-bg)}
.m-src-blk.blk-t6{--line:var(--c-t6-line);--line-strong:var(--c-t6-line);--surface-soft:var(--c-t6-bg)}
.m-src-blk.blk-t6>.m-section-title{background:var(--c-t6-bg);color:var(--c-t6);border-bottom:1px solid var(--c-t6-line)}
.m-src-blk.blk-t6>.m-section-title::before{content:"网";background:var(--c-t6)}
.m-src-blk.blk-t6>.m-section-title::after{content:"其他 · 青";color:var(--c-t6);border-color:var(--c-t6-line)}
.m-src-blk.blk-t6 .m-btn.primary{background:var(--c-t6)}
.m-src-blk.blk-t6 .m-card,.m-src-blk.blk-t6 .m-input,.m-src-blk.blk-t6 .m-textarea,.m-src-blk.blk-t6 .m-select,.m-src-blk.blk-t6 .m-src-target-host>*,.m-src-blk.blk-t6 .m-src-intro{border-color:var(--c-t6-line)!important;background:#fff}
.m-src-blk.blk-t6 .m-src-row,.m-src-blk.blk-t6 article,.m-src-blk.blk-t6 .m-card{border-color:var(--c-t6-line)!important}
.m-src-blk.blk-t6 .m-upload-target,.m-src-blk.blk-t6 .m-upload-mode,.m-src-blk.blk-t6 .m-src-import,.m-src-blk.blk-t6 .m-src-hint{border-color:var(--c-t6-line)!important}
.m-src-blk.blk-t6 .m-input,.m-src-blk.blk-t6 .m-textarea,.m-src-blk.blk-t6 .m-select{border-color:var(--c-t6)!important}
.m-src-blk.blk-t6 *{border-color:var(--c-t6-line)!important}
.m-src-blk.blk-t6 *::placeholder{color:var(--c-t6)}
.m-src-blk.blk-t6 .m-btn:not(.primary){background:var(--c-t6-bg)!important;color:var(--c-t6)!important;border-color:var(--c-t6-line)!important}
.m-src-blk.blk-t6 .m-section-title::before{background:var(--c-t6)!important}
.m-src-blk.blk-t6 .m-upload-hint,.m-src-blk.blk-t6 .m-subtle{color:var(--c-t6)!important}

/* 【来源导入 · 6 格色调类 v6–v8 对应段】上面 6 份照搬了 v1–v5 那套规则块；这里把后面
   v6（块内"有底色"控件浅底 + 主色字、选中态实底）、v7（视图切换 tab、输入框主色线框）、
   v8（折叠箭头 ▶/▼ 与 summary 标记）三段也按 6 格各补一份，保证 6 格与旧 blk-chain/blk-hua
   表现完全一致（旧类规则原样保留、未删改）。 */
.m-src-blk.blk-t1 .m-upload-target,.m-src-blk.blk-t1 .m-upload-modes,.m-src-blk.blk-t1 .m-upload-mode,.m-src-blk.blk-t1 .m-upload-existing,.m-src-blk.blk-t1 .m-upload-label,.m-src-blk.blk-t1 .m-src-import,.m-src-blk.blk-t1 .m-src-hint{border-color:var(--c-t1-line)!important}
.m-src-blk.blk-t1 .m-upload-target{background:transparent}
.m-src-blk.blk-t1 .m-upload-mode,.m-src-blk.blk-t1 .m-src-pick,.m-src-blk.blk-t1 .m-src-covercount,.m-src-blk.blk-t1 .m-chip{background:var(--c-t1-bg)!important;color:var(--c-t1)!important}
.m-src-blk.blk-t1 .m-upload-mode.on{background:var(--c-t1)!important;color:#fff!important}
.m-src-blk.blk-t1 .m-upload-viewtab{background:var(--c-t1-bg)!important;color:var(--c-t1)!important;border:1px solid var(--c-t1-line)!important}
.m-src-blk.blk-t1 .m-upload-viewtab.on{background:var(--c-t1)!important;color:#fff!important;border-color:var(--c-t1)!important}
.m-src-blk.blk-t1 .m-upload-count strong{color:var(--c-t1)}
.m-src-blk.blk-t1 .m-upload-extra>summary,.m-src-blk.blk-t1 summary{color:var(--c-t1)!important}
.m-src-blk.blk-t1 summary::marker,.m-src-blk.blk-t1 summary::-webkit-details-marker{color:var(--c-t1)!important}
.m-src-blk.blk-t2 .m-upload-target,.m-src-blk.blk-t2 .m-upload-modes,.m-src-blk.blk-t2 .m-upload-mode,.m-src-blk.blk-t2 .m-upload-existing,.m-src-blk.blk-t2 .m-upload-label,.m-src-blk.blk-t2 .m-src-import,.m-src-blk.blk-t2 .m-src-hint{border-color:var(--c-t2-line)!important}
.m-src-blk.blk-t2 .m-upload-target{background:transparent}
.m-src-blk.blk-t2 .m-upload-mode,.m-src-blk.blk-t2 .m-src-pick,.m-src-blk.blk-t2 .m-src-covercount,.m-src-blk.blk-t2 .m-chip{background:var(--c-t2-bg)!important;color:var(--c-t2)!important}
.m-src-blk.blk-t2 .m-upload-mode.on{background:var(--c-t2)!important;color:#fff!important}
.m-src-blk.blk-t2 .m-upload-viewtab{background:var(--c-t2-bg)!important;color:var(--c-t2)!important;border:1px solid var(--c-t2-line)!important}
.m-src-blk.blk-t2 .m-upload-viewtab.on{background:var(--c-t2)!important;color:#fff!important;border-color:var(--c-t2)!important}
.m-src-blk.blk-t2 .m-upload-count strong{color:var(--c-t2)}
.m-src-blk.blk-t2 .m-upload-extra>summary,.m-src-blk.blk-t2 summary{color:var(--c-t2)!important}
.m-src-blk.blk-t2 summary::marker,.m-src-blk.blk-t2 summary::-webkit-details-marker{color:var(--c-t2)!important}
.m-src-blk.blk-t3 .m-upload-target,.m-src-blk.blk-t3 .m-upload-modes,.m-src-blk.blk-t3 .m-upload-mode,.m-src-blk.blk-t3 .m-upload-existing,.m-src-blk.blk-t3 .m-upload-label,.m-src-blk.blk-t3 .m-src-import,.m-src-blk.blk-t3 .m-src-hint{border-color:var(--c-t3-line)!important}
.m-src-blk.blk-t3 .m-upload-target{background:transparent}
.m-src-blk.blk-t3 .m-upload-mode,.m-src-blk.blk-t3 .m-src-pick,.m-src-blk.blk-t3 .m-src-covercount,.m-src-blk.blk-t3 .m-chip{background:var(--c-t3-bg)!important;color:var(--c-t3)!important}
.m-src-blk.blk-t3 .m-upload-mode.on{background:var(--c-t3)!important;color:#fff!important}
.m-src-blk.blk-t3 .m-upload-viewtab{background:var(--c-t3-bg)!important;color:var(--c-t3)!important;border:1px solid var(--c-t3-line)!important}
.m-src-blk.blk-t3 .m-upload-viewtab.on{background:var(--c-t3)!important;color:#fff!important;border-color:var(--c-t3)!important}
.m-src-blk.blk-t3 .m-upload-count strong{color:var(--c-t3)}
.m-src-blk.blk-t3 .m-upload-extra>summary,.m-src-blk.blk-t3 summary{color:var(--c-t3)!important}
.m-src-blk.blk-t3 summary::marker,.m-src-blk.blk-t3 summary::-webkit-details-marker{color:var(--c-t3)!important}
.m-src-blk.blk-t4 .m-upload-target,.m-src-blk.blk-t4 .m-upload-modes,.m-src-blk.blk-t4 .m-upload-mode,.m-src-blk.blk-t4 .m-upload-existing,.m-src-blk.blk-t4 .m-upload-label,.m-src-blk.blk-t4 .m-src-import,.m-src-blk.blk-t4 .m-src-hint{border-color:var(--c-t4-line)!important}
.m-src-blk.blk-t4 .m-upload-target{background:transparent}
.m-src-blk.blk-t4 .m-upload-mode,.m-src-blk.blk-t4 .m-src-pick,.m-src-blk.blk-t4 .m-src-covercount,.m-src-blk.blk-t4 .m-chip{background:var(--c-t4-bg)!important;color:var(--c-t4)!important}
.m-src-blk.blk-t4 .m-upload-mode.on{background:var(--c-t4)!important;color:#fff!important}
.m-src-blk.blk-t4 .m-upload-viewtab{background:var(--c-t4-bg)!important;color:var(--c-t4)!important;border:1px solid var(--c-t4-line)!important}
.m-src-blk.blk-t4 .m-upload-viewtab.on{background:var(--c-t4)!important;color:#fff!important;border-color:var(--c-t4)!important}
.m-src-blk.blk-t4 .m-upload-count strong{color:var(--c-t4)}
.m-src-blk.blk-t4 .m-upload-extra>summary,.m-src-blk.blk-t4 summary{color:var(--c-t4)!important}
.m-src-blk.blk-t4 summary::marker,.m-src-blk.blk-t4 summary::-webkit-details-marker{color:var(--c-t4)!important}
.m-src-blk.blk-t5 .m-upload-target,.m-src-blk.blk-t5 .m-upload-modes,.m-src-blk.blk-t5 .m-upload-mode,.m-src-blk.blk-t5 .m-upload-existing,.m-src-blk.blk-t5 .m-upload-label,.m-src-blk.blk-t5 .m-src-import,.m-src-blk.blk-t5 .m-src-hint{border-color:var(--c-t5-line)!important}
.m-src-blk.blk-t5 .m-upload-target{background:transparent}
.m-src-blk.blk-t5 .m-upload-mode,.m-src-blk.blk-t5 .m-src-pick,.m-src-blk.blk-t5 .m-src-covercount,.m-src-blk.blk-t5 .m-chip{background:var(--c-t5-bg)!important;color:var(--c-t5)!important}
.m-src-blk.blk-t5 .m-upload-mode.on{background:var(--c-t5)!important;color:#fff!important}
.m-src-blk.blk-t5 .m-upload-viewtab{background:var(--c-t5-bg)!important;color:var(--c-t5)!important;border:1px solid var(--c-t5-line)!important}
.m-src-blk.blk-t5 .m-upload-viewtab.on{background:var(--c-t5)!important;color:#fff!important;border-color:var(--c-t5)!important}
.m-src-blk.blk-t5 .m-upload-count strong{color:var(--c-t5)}
.m-src-blk.blk-t5 .m-upload-extra>summary,.m-src-blk.blk-t5 summary{color:var(--c-t5)!important}
.m-src-blk.blk-t5 summary::marker,.m-src-blk.blk-t5 summary::-webkit-details-marker{color:var(--c-t5)!important}
.m-src-blk.blk-t6 .m-upload-target,.m-src-blk.blk-t6 .m-upload-modes,.m-src-blk.blk-t6 .m-upload-mode,.m-src-blk.blk-t6 .m-upload-existing,.m-src-blk.blk-t6 .m-upload-label,.m-src-blk.blk-t6 .m-src-import,.m-src-blk.blk-t6 .m-src-hint{border-color:var(--c-t6-line)!important}
.m-src-blk.blk-t6 .m-upload-target{background:transparent}
.m-src-blk.blk-t6 .m-upload-mode,.m-src-blk.blk-t6 .m-src-pick,.m-src-blk.blk-t6 .m-src-covercount,.m-src-blk.blk-t6 .m-chip{background:var(--c-t6-bg)!important;color:var(--c-t6)!important}
.m-src-blk.blk-t6 .m-upload-mode.on{background:var(--c-t6)!important;color:#fff!important}
.m-src-blk.blk-t6 .m-upload-viewtab{background:var(--c-t6-bg)!important;color:var(--c-t6)!important;border:1px solid var(--c-t6-line)!important}
.m-src-blk.blk-t6 .m-upload-viewtab.on{background:var(--c-t6)!important;color:#fff!important;border-color:var(--c-t6)!important}
.m-src-blk.blk-t6 .m-upload-count strong{color:var(--c-t6)}
.m-src-blk.blk-t6 .m-upload-extra>summary,.m-src-blk.blk-t6 summary{color:var(--c-t6)!important}
.m-src-blk.blk-t6 summary::marker,.m-src-blk.blk-t6 summary::-webkit-details-marker{color:var(--c-t6)!important}

/* ===== 【全部仓 / 本地仓】本地副本标记 =====
   全部仓里同一颗料会出现两条（原行 + #L 副本）；副本统一带高对比金色「本地」角标，
   保证在来源导入 / 首页产品 / 库存列表都能一眼区分。 */
.m-local-badge{display:inline-block;margin-right:6px;padding:2px 7px;border-radius:5px;background:#b8894a;color:#fff;font-size:11px;font-weight:700;line-height:17px;letter-spacing:.2px;vertical-align:1px;white-space:nowrap;font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif}
.m-src-localtag{display:inline-flex;align-items:center;justify-content:center;background:#f3e7d3!important;color:#8a6126!important;border:1px solid #dcc29a!important;font-weight:600}
.m-src-localcopy-btn{color:#8a6126!important;border-color:#dcc29a!important;background:#fffaf2!important;font-weight:600;white-space:nowrap;flex:0 0 auto;padding-left:13px;padding-right:13px}
.m-src-localtag{white-space:nowrap;flex:0 0 auto}
.m-src-localcopy-btn:active{background:#f3e7d3!important}
.m-localcopy-note{padding:10px 12px;border-radius:8px;background:#fbf5e9;border:1px solid #ead7b4;color:#5c4726;font-size:13px;line-height:1.6}

/* ============================================================
   【用户管理 · 行列表改版 2026-10-31】
   一人一行；权限开关与危险动作全部收进详情弹层。
   类名统一 m-usr- 前缀，避免与旧 m-user-* 冲突。
   ============================================================ */
.m-usr-ov{display:flex;align-items:center;gap:12px;padding:14px 15px;border:1px solid var(--line);border-radius:14px;background:var(--surface);margin-bottom:11px}
.m-usr-ov-main{flex:1;min-width:0}
.m-usr-ov-num{font-size:23px;font-weight:700;letter-spacing:.4px;font-variant-numeric:tabular-nums;line-height:1.1}
.m-usr-ov-num small{font-size:12px;font-weight:500;color:var(--muted);margin-left:5px;letter-spacing:0}
.m-usr-ov-sub{font-size:11.5px;color:var(--muted);margin-top:4px}
.m-usr-ov-btn{flex:0 0 auto;background:var(--accent-dark);color:#fff;border:none;border-radius:10px;padding:9px 14px;font-size:13px;font-weight:700;font-family:inherit;letter-spacing:.3px;cursor:pointer}

.m-usr-group{display:flex;align-items:baseline;gap:8px;padding:3px 4px 6px}
.m-usr-group span{font-size:12.5px;font-weight:700;color:var(--muted);letter-spacing:.4px}
.m-usr-group i{font-style:normal;font-size:11px;color:var(--muted)}

.m-usr-list{background:var(--surface);border:1px solid var(--line);border-radius:14px;overflow:hidden;margin-bottom:10px}
.m-usr-row{display:flex;align-items:center;gap:11px;padding:12px 14px;border-bottom:1px solid var(--line);background:var(--surface);cursor:pointer}
.m-usr-row:last-child{border-bottom:none}
.m-usr-row:active{background:var(--surface-soft)}
.m-usr-ava{flex:0 0 38px;width:38px;height:38px;border-radius:11px;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700}
.m-usr-ava.owner{background:#f2e3cc;color:#7a5628}
.m-usr-ava.sales{background:#e2ecf3;color:#1f5570}
.m-usr-ava.custom{background:#e3ece1;color:#3d5c3d}
.m-usr-ava.off{background:#eceae5;color:#8a8377}
.m-usr-main{flex:1;min-width:0}
.m-usr-nm{font-size:15px;font-weight:650;letter-spacing:.2px;display:flex;align-items:center;gap:6px;overflow-wrap:anywhere}
.m-usr-nm.off{color:#8a8377}
.m-usr-nm em{font-style:normal;font-size:10.5px;font-weight:700;padding:1px 6px;border-radius:999px;background:rgba(165,122,63,.18);color:#8a5a00;letter-spacing:.2px;flex:0 0 auto}
.m-usr-sub{font-size:11.5px;color:var(--muted);margin-top:3px;display:flex;align-items:center;gap:6px;overflow-wrap:anywhere}
.m-usr-dot{width:5px;height:5px;border-radius:50%;background:#8aa88a;display:inline-block;flex:0 0 5px}
.m-usr-dot.off{background:#c0b8a8}
.m-usr-side{flex:0 0 auto;text-align:right;font-size:11.5px;color:var(--muted);line-height:1.4}
.m-usr-side b{font-weight:700;color:var(--ink);font-variant-numeric:tabular-nums}
.m-usr-chev{color:#bdb5a5;font-size:17px;margin-left:2px;flex:0 0 auto}

.m-usr-note{font-size:11.5px;color:var(--muted);line-height:1.65;padding:2px 5px 0}

/* 详情弹层 */
.m-usr-who{display:flex;align-items:center;gap:12px;margin-bottom:6px}
.m-usr-who .m-usr-ava{width:46px;height:46px;flex:0 0 46px;border-radius:13px;font-size:17px}
.m-usr-who-n{font-size:16px;font-weight:700;overflow-wrap:anywhere}
.m-usr-who-s{font-size:11.5px;color:var(--muted);margin-top:4px}
.m-usr-sect{font-size:11.5px;font-weight:700;color:var(--muted);letter-spacing:.5px;margin:14px 0 2px;padding-left:2px}
.m-usr-sect.danger{color:var(--danger);margin-top:18px}

/* 【iOS 微信输入 · 2026-10-31】iOS WKWebView（微信内置浏览器）对字号 <16px 的输入框
   聚焦时会强制缩放页面，中文输入法偶尔跟着失灵。登录/注册卡片里的输入框统一 16px，
   只影响这两张卡，不动全站其它输入框。 */
.m-login-card input,.m-login-card textarea{font-size:16px}

/* 【边料归属筛选 · 2026-10-31】全部 / 本厂边料 / 客户边料：
   细长条、三等分并排一行（不做成大块按钮）。 */
.m-edge-ownbar{display:flex;gap:6px;height:22px;align-items:center}
.m-edge-otag{flex:1 1 0;min-width:0;height:22px;padding:0 4px;border:1px solid var(--line);border-radius:999px;background:#fff;color:var(--muted);font-size:12px;line-height:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.m-edge-otag-share{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:700}
.m-edge-otag-share:active{background:var(--accent-dark);border-color:var(--accent-dark)}
.m-edge-otag.on{border-color:var(--accent);color:var(--accent-dark);font-weight:700;box-shadow:0 0 0 1px var(--accent) inset}

/* 【2026-10-31】定价行「提交 / 编辑」并排一行，按钮高度压到原来的一半左右（44px → 26px）。 */
.m-pricing-actions{display:flex;gap:8px;margin-top:8px}
.m-pricing-actions .m-btn{flex:1 1 0;min-height:26px;height:26px;padding:0 10px;margin:0;
  font-size:13px;font-weight:600;line-height:24px;border-radius:9px}

/* 【2026-10-31 全站按钮压窄】并排的操作按钮统一压到 26px 高（原 44px），
   与定价页「提交 / 编辑」保持一致；独占整行的主按钮（.full 且不在按钮行里）不动。
   只改高度与内边距，颜色、字号层级、圆角风格一律沿用原样式。 */
.m-btn-row .m-btn{min-height:26px;height:26px;padding:0 12px;margin:0;font-size:13px;
  line-height:24px;border-radius:9px;flex:1 1 0;min-width:0}
.m-btn-row{gap:8px}
.m-btn-row .m-btn.small{min-height:24px;height:24px;padding:0 9px;font-size:12px;flex:0 0 auto}
/* 卡片/列表里单独出现的小按钮同样压窄 */
.m-card .m-btn.small,.m-pricing-row .m-btn.small{min-height:24px;height:24px;padding:0 9px;font-size:12px}

/* 【2026-10-31 全站按钮压窄 · 第二批】独占整行的大按钮（.full / 主按钮）同样压窄：
   44px → 30px，内边距同步收小；并排按钮行仍是 26px（上一批规则优先）。 */
.m-btn{min-height:30px;padding:6px 14px;font-size:14px;line-height:18px;border-radius:10px}
.m-btn.full{min-height:30px;padding:6px 14px}
/* 登录 / 主要提交这类大按钮若单独定过高度，一并压到 34px 以内 */
.m-login-btn,.m-btn.primary.full{min-height:32px;height:auto;padding:7px 14px;font-size:15px;line-height:18px}
/* 并排行内的按钮维持更矮（放在最后，优先级最高） */
.m-btn-row .m-btn{min-height:26px;height:26px;padding:0 12px;font-size:13px;line-height:24px}
.m-btn-row .m-btn.small{min-height:24px;height:24px;padding:0 9px;font-size:12px}

/* 【PRICEBOX-COMPACT-20261031】定价行里的价格输入框/只读数值：44px -> 30px，和按钮同一高度档，
   标签与间距同步收紧；只作用于定价行内部，其它页面输入框不受影响。 */
.m-pricing-price .m-input{min-height:30px;height:30px;padding:3px 9px;font-size:14px;line-height:24px;border-radius:8px}
.m-pricing-price span{font-size:12px;line-height:1.3;color:var(--muted,#6f685c)}
.m-pricing-price strong{min-height:30px;display:flex;align-items:center;justify-content:flex-end;
  font-size:15px;line-height:1.2}
.m-pricing-price-grid{gap:8px}
.m-price-unit{font-size:11px;font-style:normal;color:#a19a8b;margin-left:3px}
.m-price-tag{font-size:10px;font-style:normal;color:#8a6b3d;background:#f6efe1;border:1px solid #e7d9c0;
  border-radius:8px;padding:0 5px;margin-left:4px;white-space:nowrap}

/* 【ALLINPUT-COMPACT-20261031】全站单行输入框统一压到 30px（原 44/46px），与定价行输入框、按钮同一高度档。
   只改单行 input / select 的高度与上下内边距：
   - 多行文本框（textarea / .m-textarea）**不动**，它需要垂直空间。
   - 左右内边距**不动**，避免破坏搜索框图标的留白。
   - 字号统一 14px，保证 30px 高度里文字不挤。 */
.m-input:not(.m-textarea),.m-select{
  min-height:30px!important;height:30px!important;
  padding-top:4px!important;padding-bottom:4px!important;
  font-size:14px;border-radius:9px;
}
.m-input:not(.m-textarea){line-height:22px}
.m-select{line-height:20px}

/* 【PRICE-ONELINE-AUTOFIT-20261031】定价行：两格有内容就并排两列；只有「报价」一格时自动占满整行。 */
.m-pricing-price-grid.pricing-oneline{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}
.m-pricing-price.is-old strong{color:#8a6b3d}

/* 【SOURCE-SIMPLE-20261031】其他租户「图片下载」单框 + 候选列表。
   仅 simple 形态渲染这些 class 的节点；JM 七格页面不引用，不受影响。 */
.m-src-simple-card{padding:16px 14px}
.m-src-simple-label{font-size:15px;font-weight:650;color:#6b6558;margin:0 0 10px 2px;letter-spacing:.5px}
.m-src-simple-input{width:100%;box-sizing:border-box;min-height:96px;resize:vertical;
  padding:12px 14px;border:1px solid var(--line-strong);border-radius:12px;background:var(--surface);
  font:inherit;font-size:16px;line-height:1.5;color:var(--ink);outline:none}
.m-src-simple-input:focus{border-color:var(--accent)}
.m-src-simple-run{margin-top:14px}
.m-src-simple-result{margin-top:12px}
.m-src-simple-result:empty{display:none}
.m-src-simple-done{font-size:14px;font-weight:650;color:var(--ink);line-height:1.6}
.m-src-simple-empty{font-size:14px;color:#8a8272;line-height:1.6}
.m-src-simple-cands{margin-top:4px}
.m-src-found{margin:22px 2px 10px;font-size:13px;color:#8a8272}
.m-src-cand{display:flex;align-items:center;gap:12px;background:var(--surface);
  border:1px solid var(--line-strong);border-radius:12px;padding:13px 14px;margin-bottom:10px}
.m-src-cand:active{background:var(--accent-soft)}
.m-src-cand.is-busy{opacity:.55;pointer-events:none}
.m-src-cand-main{flex:1;min-width:0}
.m-src-cand-name{font-size:16px;font-weight:650;color:var(--ink);margin-bottom:5px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.m-src-cand-meta{font-size:13px;color:#8a8272;line-height:1.5;word-break:break-all}
.m-src-cand-go{font-size:13px;font-weight:650;color:var(--accent);white-space:nowrap}

/* ===== 【片级定价 2026-11-02】点整扎 → 一行三片的片网格 =====
   价格输入框只在网格里；预览层（.m-piece-preview）只看图，没有任何输入框。 */
.m-pieces-backdrop{z-index:132}
.m-pieces-sheet{max-height:92vh;max-height:min(92vh,92dvh)}
.m-pieces-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}
.m-pieces-title{font-size:16px;font-weight:800}
.m-pieces-head-right{display:flex;align-items:center;gap:8px}
.m-pieces-all{font-size:12px;color:var(--accent);background:none;border:0;padding:4px 2px}
.m-pieces-close{font-size:12px;color:var(--muted);background:none;border:0;padding:4px 0}
.m-pieces-bar{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:12px;color:var(--muted);margin-bottom:6px}
.m-pieces-bar b{color:var(--text)}
.m-pieces-hint{margin-bottom:10px}
.m-piece-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
.m-piece-tile{position:relative;border:1px solid var(--line);border-radius:11px;overflow:hidden;background:#fff}
.m-piece-tile.on{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.m-piece-check{position:absolute;top:5px;left:5px;z-index:2;width:19px;height:19px;border-radius:6px;border:1.5px solid rgba(255,255,255,.95);background:rgba(20,20,20,.28);color:#fff;font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center;padding:0}
.m-piece-check.on{background:var(--accent);border-color:#fff}
.m-piece-thumb{display:block;cursor:zoom-in}
.m-piece-thumb>img{width:100%;height:86px;object-fit:cover;display:block;background:#efece6}
.m-piece-thumb>img.is-broken{background:#efece6}
.m-piece-body{padding:5px 6px 7px;min-width:0}
.m-piece-code{font-size:10.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.m-piece-area{font-size:10px;color:#a49c8e;margin-top:1px}
.m-piece-input{margin-top:4px;padding:5px 6px;font-size:12px;font-weight:600;text-align:right;border-radius:7px}
.m-piece-input.own{border-color:var(--accent);color:var(--accent);background:#f2fbf5}
.m-piece-price{margin-top:4px;font-size:12px;font-weight:600;text-align:right;color:#a49c8e}
.m-piece-price.own{color:var(--accent)}
.m-pieces-actions{display:flex;gap:8px;margin-top:11px}
.m-pieces-actions>.m-btn{flex:1}
.m-pieces-foot{margin-top:9px;font-size:11.5px;color:var(--muted)}
.m-pieces-foot b{color:var(--accent)}

/* 预览层：只看图 */
.m-piece-preview-backdrop{position:fixed;inset:0;z-index:140;background:rgba(20,19,17,.86);display:flex;align-items:center;justify-content:center;padding:14px;overflow:auto}
.m-piece-preview{width:100%;max-width:var(--page-max);background:#1b1916;border-radius:18px;overflow:hidden;color:#efece5}
.m-piece-preview-bar{display:flex;align-items:center;justify-content:space-between;padding:10px 13px;font-size:12px;color:#d8d2c6}
.m-piece-preview-nav{font-size:17px;padding:2px 8px;color:#d8d2c6;cursor:pointer}
.m-piece-preview-img{width:100%;max-height:56vh;display:block;background:#111;overflow:hidden;line-height:0}
.m-piece-preview-img>img{width:100%;height:auto;max-height:56vh;object-fit:contain;display:block;margin:0 auto}
.m-piece-preview-info{padding:11px 14px 13px}
.m-piece-preview-code{font-size:14px;font-weight:700}
.m-piece-preview-meta{font-size:11.5px;color:#a39c8e;margin-top:3px}
.m-piece-preview-price{font-size:12.5px;color:#d8d2c6;margin-top:8px}
.m-piece-preview-price b{color:#fff;font-size:14px}
.m-piece-preview-tip{font-size:11px;color:#8e8779;margin-top:5px}
.m-piece-preview-acts{display:flex;gap:8px;padding:0 14px 14px}
.m-piece-preview-acts>.m-btn{flex:1}
.m-pieces-upload{margin-top:8px}
.m-pieces-upload>.m-btn.full{width:100%}
/* 跟随整扎价时：框里显示整扎价但是灰的，改过才变绿 */
.m-piece-input.follow{color:#a49c8e;font-weight:500;background:#fff}
.m-pieces-from{color:#a49c8e;font-size:10.5px;margin-left:4px}
/* 报价后面「进入整料」按钮（2026-11-02 老板要求） */
.m-pricing-price-inline{display:flex;align-items:center;gap:6px;min-width:0}
.m-pricing-price-inline>.m-input{flex:1;min-width:0}
.m-pricing-price-inline>strong{flex:1;min-width:0}
.m-pricing-enter-btn{flex:0 0 auto;padding:9px 11px;font-size:12.5px;line-height:1.1;border-radius:9px;border:1px solid var(--accent);background:#fff;color:var(--accent);white-space:nowrap;font-weight:600}
.m-pricing-enter-btn:active{background:#f6efe2}
/* 【2026-11-02】报价行：输入框左半边、「进入整料」按钮右半边，各占一行的一半 */
.m-pricing-price-inline{gap:8px}
.m-pricing-price-inline>.m-input{flex:1 1 50%;min-width:0}
.m-pricing-price-inline>.m-pricing-enter-btn{flex:0 0 calc(50% - 4px);width:calc(50% - 4px);text-align:center;display:flex;align-items:center;justify-content:center;padding:9px 8px}
/* 按钮独立成格，跟输入框/拆片报价等分这一行 */
.m-pricing-enter-cell{min-width:0}
.m-pricing-enter-cell .m-pricing-enter-btn{width:100%;height:100%;min-height:40px;display:flex;align-items:center;justify-content:center;padding:8px 6px}
.m-pricing-price-inline{display:none}
/* 【2026-11-02】7号仓「进入整料」里的本扎报价行 */
.m-pieces-pricebar{display:flex;align-items:center;gap:8px;margin-bottom:10px;padding:9px 10px;border:1px solid var(--line);border-radius:11px;background:#fbfaf8}
.m-pieces-pricebar>label{font-size:12px;color:var(--muted);white-space:nowrap;margin:0}
.m-pieces-pricebar>.m-input{flex:1 1 auto;min-width:0;margin:0}
.m-pieces-pricebar>.m-btn{flex:0 0 auto;white-space:nowrap;padding:9px 14px}
/* 【修】本扎报价行必须一行排开：输入框不要 width:100% 撑行 */
.m-pieces-pricebar{flex-wrap:nowrap}
.m-pieces-pricebar>.m-input{flex:1 1 0%;width:auto;min-width:0}/* 【修 · 2026-11-02】7号仓片图预览：以前这几个块没有任何定位样式，
   只有 .m-piece-preview-bar 那套（给另一个预览用），结果点图看不出东西。 */
.m-piece-preview{max-height:calc(100dvh - 28px);display:flex;flex-direction:column}
.m-piece-preview-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 14px;font-size:13.5px;font-weight:700;color:#efece5}
.m-piece-preview-head>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.m-piece-preview-head .m-pieces-close{flex:0 0 auto;min-height:32px;padding:0 12px;border:1px solid rgba(255,255,255,.28);border-radius:999px;background:transparent;color:#efece5;font-size:12.5px;font-weight:650}
.m-wh7p-meta{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 14px 10px;font-size:12px;color:#a39c8e}
.m-wh7p-meta strong{color:#fff;font-size:13.5px;font-weight:700}
.m-wh7p-nav{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 14px 14px;font-size:12px;color:#a39c8e}
.m-wh7p-nav>button{flex:1 1 0%;min-height:36px;border:1px solid rgba(255,255,255,.24);border-radius:10px;background:rgba(255,255,255,.07);color:#efece5;font-size:13px;font-weight:650}
.m-wh7p-nav>span{flex:0 0 auto;color:#d8d2c6;font-size:12.5px}
/* 【2026-11-02】联盟卡片上的价格行：价格加粗突出，单位小字灰。 */
.m-pricing-block-price{margin-top:5px;font-size:15px;font-weight:800;color:var(--accent);line-height:1.25}
.m-pricing-block-price.is-empty{font-size:12.5px;font-weight:600;color:var(--muted)}
.m-pricing-block-price .m-price-unit{font-size:11px;font-weight:600;color:var(--muted);font-style:normal}
.m-pricing-block-price-from{font-size:11.5px;font-weight:600;color:var(--muted)}
/* 【2026-11-02】联盟整料页的片卡报价行（只读，价来自上传方）。 */
.m-slab-price{margin-top:5px;font-size:13.5px;font-weight:800;color:var(--accent);line-height:1.2}
.m-slab-price .m-price-unit{font-size:10.5px;font-weight:600;color:var(--muted);font-style:normal;margin-left:2px}
.m-slab-price .m-slab-price-empty{font-size:12px;font-weight:600;color:var(--muted)}
