@charset "UTF-8";
  :root{
    --primary:#7C3AED;
    --primary-rgb:124 58 237;
    --primary-soft:#F3EEFF;
    --primary-hover:#6D28D9;
    --bg:#F5F6FA;
    --panel:#FFFFFF;
    /* 卡片里再套一层的浅底（设置页的开关行 .stg-switch-row）。这个变量以前只在
       使用处写了 var(--bg-2,#F8FAFC) 兜底、从没定义过 —— 浅色下看不出问题，
       暗色下兜底值生效，整行变成白底 + 浅色字，标题几乎读不出来。补两套定义。 */
    --bg-2:#F8FAFC;
    --border:#EBEDF3;
    /* 语义状态色（保存成功 / 失败） */
    --ok:#047857;
    --danger:#DC2626;
    /* 输入框统一规格：边框 / 圆角 / 高度 / 字号，全站共用一套，避免粗细高低不一 */
    --input-border:#D8DCE6;
    --input-radius:7px;
    --text:#1F2430;
    --text-2:#5B6270;
    --text-3:#9AA1AE;
    --sidebar-w:150px;
    --header-h:56px;
    --sub-h:48px;
  }
  *{margin:0;padding:0;box-sizing:border-box}
  html,body{height:100%}
  body{
    /* "CaoEmoji" 是全站自托管的图标字体（css/emoji.css），必须排在 sans-serif 之前：
       系统字体栈里没有彩色 emoji，走到它就命中；而 sans-serif 兜底时会取系统 emoji 字体，
       一旦被它接手，各系统又是三套图标。不要往它前面加 Segoe UI Emoji 之类的系统 emoji 字体。 */
    font-family:"PingFang SC","Microsoft YaHei","Helvetica Neue",Arial,"CaoEmoji",sans-serif;
    background:var(--bg);color:var(--text);font-size:14px;-webkit-font-smoothing:antialiased;
    overflow:hidden;
  }
  a{text-decoration:none;color:inherit}

  /* ---------- 悬浮岛通用 ---------- */
  .island{
    background:rgba(255,255,255,.78);
    -webkit-backdrop-filter:blur(18px) saturate(150%);
    backdrop-filter:blur(18px) saturate(150%);
    border:1px solid rgba(255,255,255,.55);
    box-shadow:0 10px 30px rgba(20,24,35,.10);
    border-radius:16px;
  }

  /* ---------- 整页背景层（电话接单背景图片铺满全屏，位于所有内容之下） ---------- */
  .page-bg{
    position:fixed;inset:0;z-index:0;pointer-events:none;
    background-color:transparent;background-repeat:no-repeat;background-position:center;background-size:cover;
  }
  .page-bg.off{display:none}

  /* ---------- 布局 ---------- */
  /* 未登录（会话恢复前）不绘制应用外壳，避免登录页刷新时闪出空导航栏 */
  body:not(.authed) .layout{display:none}
  .layout{display:flex;height:100vh;padding:12px;gap:12px;position:relative;z-index:1}

  /* ---------- 一级菜单 悬浮岛 ---------- */
  .sidebar{
    width:96px;flex:none;display:flex;flex-direction:column;
    background:rgba(255,255,255,.78);
    -webkit-backdrop-filter:blur(18px) saturate(150%);
    backdrop-filter:blur(18px) saturate(150%);
    border:1px solid rgba(255,255,255,.55);
    box-shadow:0 10px 30px rgba(20,24,35,.10);
    border-radius:16px;
    overflow:hidden;
  }
  .brand{display:flex;align-items:center;justify-content:center;padding:14px 0 6px}
  .logo-mark{
    width:40px;height:40px;border-radius:12px;
    background:linear-gradient(135deg,rgb(var(--primary-rgb) / .88),var(--primary-hover));
    color:#fff;display:flex;align-items:center;justify-content:center;font-size:19px;font-weight:600;
    background-size:cover;background-position:center;
    box-shadow:0 6px 16px rgb(var(--primary-rgb) / .35);
  }
  .nav{padding:8px 8px;flex:1;overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}
  .nav::-webkit-scrollbar{width:0;display:none}
  .nav-item{
    display:flex;align-items:center;justify-content:center;height:44px;padding:0 6px;border-radius:11px;
    color:var(--text-2);cursor:pointer;margin-bottom:4px;font-size:13.5px;transition:.15s;user-select:none;
  }
  .nav-item:hover{background:rgb(var(--primary-rgb) / .07);color:var(--text)}
  .nav-item.active{
    background:var(--primary);color:#fff;font-weight:600;
    box-shadow:0 6px 16px rgb(var(--primary-rgb) / .35);
  }
  .side-foot{padding:8px;border-top:1px solid rgba(120,130,150,.12)}
  .nav-item.mini{height:38px;font-size:12.5px;color:var(--text-3);margin-bottom:0}
  .side-foot .nav-item{display:flex;align-items:center;justify-content:flex-start;gap:9px;padding:0 10px}
  .side-foot .nav-item:hover{background:rgb(var(--primary-rgb) / .07);color:var(--text)}
  .side-foot .nav-item.active{background:var(--primary-soft);color:var(--primary);font-weight:600}
  /* 收银台：图标 + 文字，位置在菜单区末尾、分隔线之上。
     96px 的侧栏里「图标+3 个字」刚好占满，所以居中对齐、收紧内边距，
     否则「收银台」会被拆成两行 */
  .sidebar .side-cashier{flex:none;justify-content:center;gap:6px;margin:0 8px 10px;padding:0 8px}
  .side-cashier-ico{width:15px;height:15px;flex:none;opacity:.85;transition:.15s}
  .side-cashier-txt{white-space:nowrap;letter-spacing:.2px}
  .side-cashier:hover .side-cashier-ico{opacity:1;transform:translateY(-1px)}

  /* 个人中心：竖排三层（头像 / 姓名 / 角色）。
     侧栏只有一格宽，横排时「个人中心」四个字必被截成「个…」，竖排才装得下 */
  .side-user{
    display:flex;flex-direction:column;align-items:center;gap:3px;
    padding:10px 4px 9px;margin:4px 0;border-radius:11px;cursor:pointer;
    text-align:center;user-select:none;transition:.15s;
  }
  .side-user:hover{background:rgb(var(--primary-rgb) / .07)}
  .side-user.active{background:var(--primary-soft)}
  .side-ava-wrap{position:relative;width:32px;height:32px;flex:none;display:block}
  .side-ava{
    width:32px;height:32px;border-radius:50%;flex:none;object-fit:cover;display:block;
    background:#E7E9F0;box-shadow:0 0 0 2px rgba(255,255,255,.6);
  }
  /* 作者样式里的 display:block 会盖掉 [hidden] 的 UA 规则，得显式写一条 */
  .side-ava[hidden]{display:none}
  /* 没上传头像时的占位：不显示破图，给一个中性的人像符号 */
  .side-ava-fb{
    position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
    border-radius:50%;background:#EEF0F6;color:#9AA1AE;font-size:16px;line-height:1;
    box-shadow:0 0 0 2px rgba(255,255,255,.6);
  }
  .side-ava-wrap.has-img .side-ava-fb{display:none}
  .side-user-name{
    max-width:100%;font-size:12.5px;line-height:1.25;font-weight:600;color:var(--text);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .side-user-role{
    max-width:100%;font-size:11px;line-height:1.2;color:var(--text-3);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .side-user-role:empty{display:none}

  /* 个人中心悬浮菜单：贴在侧栏右侧弹出。
     fixed 是必须的 —— .sidebar 有 overflow:hidden，放进去会被裁掉。
     位置由 JS 按 #sideUser 的矩形算，这里只管长相与进出动画 */
  .side-menu{
    position:fixed;z-index:9200;left:-9999px;top:0;min-width:128px;padding:5px;
    background:#fff;border:1px solid var(--border);border-radius:11px;
    box-shadow:0 10px 28px rgba(20,24,35,.16);
    opacity:0;visibility:hidden;transform:translateX(-6px) scale(.97);transform-origin:left center;
    transition:opacity .14s ease,transform .14s ease,visibility .14s;
  }
  .side-menu.on{opacity:1;visibility:visible;transform:none}
  .side-menu-item{
    display:flex;align-items:center;gap:8px;height:34px;padding:0 10px;border-radius:8px;
    font-size:13px;color:var(--text);cursor:pointer;white-space:nowrap;user-select:none;
  }
  .side-menu-item svg{flex:none;opacity:.7}
  .side-menu-item:hover{background:rgb(var(--primary-rgb) / .09);color:var(--primary)}
  .side-menu-item:hover svg{opacity:1}
  /* 退出登录做个轻量的红：和「个人中心」区分开，避免手滑 */
  #sideMenuLogout:hover{background:rgba(225,29,72,.08);color:#E11D48}
  body.theme-dark .side-menu{background:#282A34;border-color:rgba(255,255,255,.10)}

  /* ---------- 主区 ---------- */
  .main{
    flex:1;min-width:0;display:flex;flex-direction:column;
    height:100%;overflow:hidden;position:relative;
  }

  /* 二级菜单 悬浮岛 */
  /* z-index 需高于 .content.layer-up(5)，否则会被电话接单页铺满的 content 盖住而无法点击 */
  .subbar-wrap{padding:0 0 10px;display:flex;flex:none;position:relative;z-index:10}
  .subbar-island{
    display:flex;align-items:center;gap:3px;padding:7px;
    background:rgba(255,255,255,.78);
    -webkit-backdrop-filter:blur(18px) saturate(150%);
    backdrop-filter:blur(18px) saturate(150%);
    border:1px solid rgba(255,255,255,.55);
    box-shadow:0 8px 24px rgba(20,24,35,.08);
    border-radius:14px;
    overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none;
  }
  .subbar-island::-webkit-scrollbar{height:0;display:none}
  .subbar-island.hidden{display:none}
  .sub-item{
    height:38px;display:flex;align-items:center;gap:8px;padding:0 15px 0 11px;font-size:13.5px;border-radius:10px;
    color:var(--text-2);font-weight:500;cursor:pointer;white-space:nowrap;transition:.18s;
    border:1px solid transparent;
  }
  .sub-ico{
    width:24px;height:24px;border-radius:7px;flex:none;
    display:inline-flex;align-items:center;justify-content:center;
    font-size:13.5px;line-height:1;
    background:rgba(120,130,150,.10);
    transition:.18s;
  }
  .sub-item:hover{background:rgb(var(--primary-rgb) / .07);color:var(--text)}
  .sub-item:hover .sub-ico{background:rgb(var(--primary-rgb) / .16);transform:translateY(-1px)}
  .sub-item.active{
    background:linear-gradient(135deg, var(--primary), var(--primary-hover));
    color:#fff;font-weight:700;
    box-shadow:0 6px 14px rgb(var(--primary-rgb) / .35);
  }
  .sub-item.active .sub-ico{background:rgba(255,255,255,.22)}

  .content{
    flex:1;overflow-y:auto;overflow-x:hidden;padding:0 0 88px;
    scrollbar-width:none;-ms-overflow-style:none;
    position:relative;z-index:1;
  }
  .content::-webkit-scrollbar{width:0;display:none}
  /* 电话接单：content 与 .subbar-wrap 顶对齐（从 .main 顶部起），并预留菜单高度避免遮挡表单首行 */
  .content.layer-up{position:absolute;inset:0;z-index:5;padding-top:56px}

  /* ---------- 页面脚本按需加载的占位 ----------
     页面脚本不在 index.html 里同步下载了（见 router.js），第一次进某个一级菜单
     会有一次网络往返。这里摆一个居中的小转圈，避免内容区空白让人以为点坏了。
     脚本已经下过的菜单永远不会出现它；深色主题下颜色跟着 --text-3 走，不用另配。 */
  .page-loading{
    display:flex;flex-direction:column;align-items:center;justify-content:center;
    gap:10px;min-height:300px;color:var(--text-3);font-size:13px;
    animation:plfade .18s ease-out both;
  }
  .page-loading em{font-style:normal;font-size:12px;color:var(--text-3);opacity:.8}
  /* 进收银台时的整屏版：收银台自己接管 body，不画在 #content 里 */
  .page-loading.is-full{position:fixed;inset:0;z-index:9600;min-height:0;background:var(--bg)}
  .page-loading.is-err{color:var(--danger)}
  .page-loading.is-err .pl-ring{border-top-color:var(--danger)}
  .pl-ring{
    width:18px;height:18px;border-radius:50%;
    border:2px solid rgb(var(--primary-rgb) / .18);
    border-top-color:rgb(var(--primary-rgb) / .85);
    animation:plspin .75s linear infinite;
  }
  @keyframes plspin{to{transform:rotate(360deg)}}
  @keyframes plfade{from{opacity:0}to{opacity:1}}

  /* 面包屑 + 标题 */
  .crumb{font-size:12px;color:var(--text-3);margin-bottom:6px}
  .page-head{display:flex;align-items:center;justify-content:flex-end;margin-bottom:14px}
  .page-title{font-size:17px;font-weight:600}
  .page-actions{margin-left:auto;display:flex;gap:8px}
  .btn{
    height:38px;padding:0 16px;border:1px solid var(--border);background:#fff;border-radius:6px;
    font-size:13px;color:var(--text-2);cursor:pointer;display:inline-flex;align-items:center;gap:6px;
  }
  .btn:hover{border-color:#D8DAE3}
  .btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}
  .btn.primary:hover{background:var(--primary-hover)}

  /* 空状态 */
  .blank{
    background:var(--panel);border:1px solid var(--border);border-radius:10px;
    padding:60px 20px;text-align:center;color:var(--text-3);
  }
  .blank .ico{font-size:34px;opacity:.35;display:block;margin-bottom:12px}
  .blank .t{font-size:14px;color:var(--text-2);margin-bottom:4px}
  .blank .d{font-size:12.5px}

  /* 占位骨架 */
  .skel-card{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:18px;margin-bottom:12px}
  .skel-row{height:12px;border-radius:4px;background:linear-gradient(90deg,#F1F2F6,#E8EAF0,#F1F2F6);background-size:200% 100%;animation:sh 1.4s infinite}
  @keyframes sh{0%{background-position:200% 0}100%{background-position:-200% 0}}
  .skel-row + .skel-row{margin-top:10px}

  /* ---------- 系统设置表单 ---------- */
  .setting-card{background:var(--panel);border:1px solid var(--border);border-radius:10px;width:100%;padding:8px 24px}
  .form-row{display:flex;gap:18px;padding:20px 0;border-bottom:1px solid var(--border)}
  .form-row:last-of-type{border-bottom:none}
  .form-row>label{width:96px;flex:none;font-size:14px;font-weight:600;padding-top:9px}
  .field{flex:1;min-width:0}

  /* ---------- 设置 → 系统设置 → 菜单排序 ----------
     一级菜单：整块可拖动（⠿ 把手）+ ↑↓；二级标签：只能 ↑↓。
     为什么二级不做拖拽：二级标签嵌在一级块里面，嵌套 draggable 在部分浏览器
     会拖起父级，与其赌实现不如给两个明确的小箭头。 */
  .mo-list{display:flex;flex-direction:column;gap:8px;max-width:760px}
  .mo-item{
    display:grid;grid-template-columns:18px 20px minmax(0,1fr) auto;align-items:center;gap:8px;
    padding:10px 12px;border:1px solid var(--border);border-radius:10px;background:var(--panel);
    transition:border-color .15s, box-shadow .15s;
  }
  .mo-item.dragging{opacity:.45}
  .mo-item.drop-before{box-shadow:inset 0 2px 0 rgb(var(--primary-rgb) / .75)}
  .mo-item.drop-after{box-shadow:inset 0 -2px 0 rgb(var(--primary-rgb) / .75)}
  .mo-grip{cursor:grab;color:var(--text-3);font-size:13px;line-height:1;letter-spacing:-2px;user-select:none}
  .mo-item:active .mo-grip{cursor:grabbing}
  .mo-ico{font-size:14px;text-align:center;line-height:1}
  .mo-name{font-size:13.5px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .mo-moves{display:flex;gap:4px}
  .mo-mv{
    width:22px;height:22px;padding:0;display:inline-flex;align-items:center;justify-content:center;
    border:1px solid var(--border);border-radius:6px;background:var(--panel);
    color:var(--text-3);font-size:11px;line-height:1;cursor:pointer;
  }
  .mo-mv:hover{border-color:rgb(var(--primary-rgb) / .5);color:var(--primary);background:var(--primary-soft)}
  .mo-subs{
    grid-column:1 / -1;display:flex;flex-wrap:wrap;align-items:center;gap:6px;
    margin-top:2px;padding-top:8px;border-top:1px dashed var(--border);
  }
  .mo-chip{
    display:inline-flex;align-items:center;gap:2px;padding:2px 4px 2px 9px;
    border:1px solid var(--border);border-radius:999px;background:var(--bg-2);
    font-size:12px;color:var(--text-2);
  }
  .mo-chip-t{line-height:1.6;white-space:nowrap}
  .mo-chip .mo-mv{width:17px;height:17px;border:0;background:transparent;font-size:10px;border-radius:50%}
  .mo-chip .mo-mv:hover{background:rgb(var(--primary-rgb) / .14);color:var(--primary)}
  .mo-none{font-size:12px;color:var(--text-3)}
  .field input[type=text],
  .field input[type=password],
  .field input[type=number],
  .field input[type=tel]{
    width:100%;max-width:1000px;height:38px;border:1px solid var(--input-border,#D8DCE6);border-radius:var(--input-radius,7px);padding:0 12px;font-size:13.5px;
    color:var(--text);background:#fff;outline:none;transition:.15s;font-family:inherit;
  }
  .field input[type=text]:focus,
  .field input[type=password]:focus,
  .field input[type=number]:focus,
  .field input[type=tel]:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft)}
  .hint{font-size:12px;color:var(--text-3);margin-top:7px}
  .fav-pick{display:flex;align-items:center;gap:16px}
  .fav-prev{
    width:46px;height:46px;border-radius:11px;
    background:linear-gradient(135deg,rgb(var(--primary-rgb) / .88),var(--primary-hover));
    background-size:cover;background-position:center;
    color:#fff;display:flex;align-items:center;justify-content:center;font-size:20px;font-weight:600;flex:none;
  }
  .fav-opts{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
  .fav-opts .up{
    height:38px;padding:0 14px;border:1px dashed var(--border);background:#fff;border-radius:9px;font-size:13px;
    color:var(--text-2);cursor:pointer;display:flex;align-items:center;
  }
  .fav-opts .up:hover{border-color:rgb(var(--primary-rgb) / .40)}
  .fav-opts .up input{display:none}
  /* ===== 表单页脚带：左说明 / 右主操作（设置页 3 处共用） ===== */
  .form-actions{
    display:flex;align-items:center;justify-content:flex-end;
    flex-wrap:wrap;gap:10px 12px;
    margin-top:10px;                     /* 仅系统设置页生效（上方无卡片收口线） */
    padding:16px 0 10px;border-top:1px solid var(--border);
  }
  .form-actions .btn{ flex:none; }       /* 按钮永不被压缩 */
  /* 上方是"左侧导航 + 分组卡片"时，卡片自带底边收口，页脚不再补第二条线 */
  .stg-layout + .form-actions{ margin-top:0; border-top:0; padding-top:18px; }
  .form-actions .tip{
    flex:0 1 auto;position:relative;min-width:0;
    max-width:min(100%,480px);
    margin-right:auto;                   /* 吃掉中间空白 → 按钮恒贴右；勿删，删了提示会被推回按钮边 */
    font-size:12.5px;line-height:1.55;
    /* 12.5px 必须 ≥4.5:1（AA 下限，非"目标值"）：--text-3 实测 2.60/3.62 不达标，勿降噪。
       要更不抢眼：减字数 > 降层级（位置/分组/字重）> 字号下限 12px；对比度不可降。 */
    color:var(--text-2);
    overflow-wrap:anywhere;              /* 长密钥/URL 不撑破页脚带 */
  }
  .form-actions .tip:empty{ display:none; }
  /* 状态符号悬挂在左外侧留白，不进布局流 → 状态切换时文字零位移 */
  .form-actions .tip::before{
    content:"\2713";position:absolute;left:-15px;top:0;
    width:12px;text-align:center;font-weight:700;visibility:hidden;
  }
  .form-actions .tip.is-ok{ color:var(--ok); }
  .form-actions .tip.is-ok::before{ visibility:visible; }
  .form-actions .tip.is-err{ color:var(--danger); }
  .form-actions .tip.is-err::before{ content:"!";visibility:visible; }
  @media (max-width:900px){              /* 与 .stg-layout 折叠断点一致 */
    .form-actions{ gap:8px 12px; padding:12px 0 6px; }
    .form-actions .tip{ flex:1 1 100%; max-width:none; margin-right:0; }
    .stg-layout + .form-actions{ padding-top:14px; }
  }
  .toast{
    /* 顶部提示：水平居中于 .content（left 由 showToast 按容器实测宽度算出），不再贴页面底部 */
    position:fixed;top:16px;left:50%;transform:translateX(-50%);background:rgba(31,36,48,.92);color:#fff;
    padding:10px 18px;border-radius:8px;font-size:13px;z-index:9500;opacity:0;transition:opacity .25s,top .25s;pointer-events:none;
    max-width:min(560px,86vw);text-align:center;box-shadow:0 6px 18px rgba(17,24,39,.18);
  }
  .toast.show{opacity:1}

  /* ---------- 个人设置（仅当前账号生效） ---------- */
  .seg{display:inline-flex;background:rgba(120,130,150,.10);border-radius:8px;padding:3px}
  .seg-btn{
    border:none;background:transparent;color:var(--text-2);font-family:inherit;font-size:13px;
    height:32px;padding:0 16px;border-radius:6px;cursor:pointer;transition:.15s;
  }
  .seg-btn:hover{color:var(--text)}
  .seg-btn.on{background:#fff;color:var(--primary);font-weight:600;box-shadow:0 1px 3px rgba(20,24,35,.10)}
  .pp-note{
    font-size:13px;line-height:1.6;color:var(--text-2);
    background:var(--primary-soft,#EDE9FE);border:1px solid rgb(var(--primary-rgb) / .18);
    border-radius:10px;padding:11px 14px;margin:4px 0 18px;
  }
  .pp-note b{color:var(--primary)}
  .pp-state{font-size:12px;color:var(--text-3);margin-top:8px}
  .pp-state.is-personal{color:#C2410C;font-weight:600}
  .pp-reset{
    margin-top:10px;height:34px;padding:0 14px;border:1px solid var(--border);background:#fff;border-radius:7px;
    font-size:12.5px;color:var(--text-2);cursor:pointer;transition:.15s;
  }
  .pp-reset:hover{border-color:rgb(var(--primary-rgb) / .40);color:var(--text)}

  /* ---------- 账号设置 ---------- */
  .acct-card{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:14px 18px;margin-bottom:14px}
  .acct-head{display:flex;align-items:center;gap:8px;margin-bottom:12px}
  .acct-title{font-size:14px;font-weight:600;color:var(--text)}
  .acct-ro{font-size:12px;color:var(--text-2);background:#F1F3F8;border-radius:8px;padding:6px 10px}
  .pwd-tag{margin-left:6px;font-family:inherit;font-size:11px;color:#C2410C;background:#FFF1E7;border-radius:6px;padding:1px 6px;white-space:nowrap}
  /* 账号没绑门店时的那一格：比普通文字再淡一点，一眼看出「不限」 */
  .shop-none{ color:var(--text-3,#9aa3b2); }

  /* 送货员微信绑定码弹窗 */
  .wxbind-dlg{ --dlg-w:400px; --dlg-h:380px; }
  .wxbind-h{ font-size:12.5px; color:var(--text-2,#5b6273); line-height:1.7; margin-bottom:14px; }
  .wxbind-code{
    font-family:var(--font-mono,ui-monospace,monospace);
    font-size:30px; font-weight:700; letter-spacing:2px;
    text-align:center; color:var(--primary,#2F6FED);
    background:#F2F7FF; border-radius:10px; padding:14px 0;
    user-select:all;
  }
  .wxbind-exp{ text-align:center; font-size:12px; color:var(--text-3,#889); margin-top:8px; }
  .wxbind-tip{ font-size:11.5px; color:var(--text-3,#889); line-height:1.7; margin-top:14px; }
  /* 指引弹窗里的命令行：单独一块，长参数可以折行，别挤成一片 */
  .wxbind-tip code{ display:block; margin:6px 0; padding:8px 10px; background:#F1F5F9; border-radius:6px;
    font-family:ui-monospace,Menlo,Consolas,monospace; font-size:11px; line-height:1.7; color:#334155;
    white-space:pre-wrap; word-break:break-all; }
  body.theme-dark .wxbind-tip code{ background:#262A35; color:#C7CEDA; }

  /* 账号头像 */
  .ava-sm{
    width:22px;height:22px;border-radius:50%;object-fit:cover;
    margin-right:6px;vertical-align:middle;background:#E7E9F0;
    display:inline-flex;align-items:center;justify-content:center;
    font-size:12px;line-height:1;flex:none;
  }
  .ava-sm.ava-ph{color:var(--text-3)}
  .ava-pick{display:flex;align-items:center;gap:12px}
  .ava-up{
    width:56px;height:56px;border-radius:50%;overflow:hidden;flex:none;
    background:#E7E9F0;display:flex;align-items:center;justify-content:center;font-size:22px;
  }
  .ava-up img{width:100%;height:100%;object-fit:cover;display:block}
  .ava-act{display:flex;flex-direction:column;align-items:flex-start;gap:6px;min-width:0}
  .ava-act .btn{padding:5px 12px;font-size:12px;height:auto}
  .acct-title small{font-size:12px;font-weight:400;color:var(--text-3);margin-left:8px}
  .acct-head .btn{margin-left:0}
  .acct-head .spacer{margin-left:auto}
  .role-chip{
    display:inline-flex;align-items:center;height:21px;padding:0 8px;border-radius:6px;
    font-size:11.5px;font-weight:600;background:var(--primary-soft);color:var(--primary);white-space:nowrap;
  }
  .role-chip.is-loose{background:rgba(148,163,184,.16);color:var(--text-3);font-weight:500}
  .role-row{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px dashed var(--border)}
  .role-row:last-child{border-bottom:none}
  .role-name{width:130px;flex:none;font-size:13px;font-weight:600;color:var(--text)}
  .role-scope{display:block;font-size:11.5px;font-weight:400;color:var(--text-3);margin-top:2px}
  .role-mods{flex:1;display:flex;flex-wrap:wrap;gap:6px;min-width:0}
  .role-act{flex:none;display:flex;gap:12px}
  .perm-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:6px}
  .perm-item{
    display:flex;align-items:center;gap:8px;padding:9px 12px;border:1px solid var(--border);border-radius:8px;
    font-size:13px;color:var(--text-2);cursor:pointer;user-select:none;
  }
  .perm-item.on{border-color:rgb(var(--primary-rgb) / .45);background:var(--primary-soft);color:var(--primary);font-weight:600}
  .perm-item input{accent-color:var(--primary);cursor:pointer}

  /* ---- 角色权限树（模块 → 页面 → 动作） ---- */
  .perm-tpls{display:flex;flex-wrap:wrap;gap:8px}
  .perm-tpl{
    height:30px;padding:0 12px;border-radius:8px;cursor:pointer;font-size:12.5px;
    border:1px solid var(--border);background:var(--panel);color:var(--text-2);
    transition:border-color .14s,background .14s,color .14s;
  }
  .perm-tpl:hover{border-color:rgb(var(--primary-rgb) / .35);color:var(--primary)}
  .perm-tpl.is-all{border-color:rgb(var(--primary-rgb) / .35);color:var(--primary);background:var(--primary-soft)}

  .perm-tree{max-height:300px;overflow:auto;border:1px solid var(--border);border-radius:10px;padding:4px 10px;background:var(--panel)}
  .perm-tree::-webkit-scrollbar{width:8px}
  .perm-tree::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}

  .perm-mod{padding:8px 0;border-bottom:1px dashed var(--border)}
  .perm-mod:last-child{border-bottom:none}
  .perm-mod-hd{display:flex;align-items:center;gap:10px;margin-bottom:4px}
  .perm-mod-t{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--text);cursor:pointer;user-select:none}
  .perm-mod.is-on .perm-mod-t{color:var(--primary)}
  .perm-mod-n{margin-left:auto;font-size:11.5px;color:var(--text-3)}
  /* 「仅管理员可进」：收银台模块的硬门槛提示，勾了也不生效，必须写明白 */
  .perm-mod-gate{flex:none;font-size:10.5px;line-height:1;font-weight:600;white-space:nowrap;
    padding:3px 6px;border-radius:5px;color:var(--primary);
    background:rgb(var(--primary-rgb) / .10);border:1px solid rgb(var(--primary-rgb) / .25)}
  .perm-mod input,.perm-pg input{accent-color:var(--primary);cursor:pointer;width:14px;height:14px}

  .perm-page{display:flex;align-items:flex-start;gap:10px;padding:4px 0 4px 22px}
  .perm-pg{display:flex;align-items:center;gap:8px;min-width:120px;font-size:12.5px;color:var(--text-2);cursor:pointer;user-select:none}
  .perm-acts{display:flex;flex-wrap:wrap;gap:6px;flex:1;min-width:0}
  .perm-act{
    padding:2px 9px;border-radius:999px;border:1px solid var(--border);font-size:11.5px;
    color:var(--text-3);cursor:pointer;user-select:none;transition:.14s;
  }
  .perm-act.on{border-color:rgb(var(--primary-rgb) / .4);background:var(--primary-soft);color:var(--primary);font-weight:600}

  /* 「订单操作按钮」这类只有动作、不对应页面的组（2026-11-07）：
     不出现页面 checkbox，改成一条说明 + 动作胶囊，左边不再缩进留空 */
  .perm-page-acts{flex-direction:column;align-items:stretch;gap:6px;padding-top:6px}
  .perm-pg-note{display:flex;flex-direction:column;gap:2px;min-width:0;cursor:default}
  .perm-pg-note b{font-size:12.5px;color:var(--text-2);font-weight:600}
  .perm-pg-note span{font-size:11px;color:var(--text-3);line-height:1.4}
  /* 页面名后面那句「按钮在下面统一配」的小字 */
  .perm-pg-tip{font-style:normal;font-size:10.5px;color:var(--text-3);margin-left:6px;font-weight:400}

  /* 一个页面都没授权的账号进来时看到的兜底屏 */
  .noperm-box{
    margin:80px auto;max-width:460px;text-align:center;padding:32px 28px;
    border:1px solid var(--border);border-radius:16px;background:var(--panel);
  }
  .noperm-ico{font-size:34px;line-height:1;margin-bottom:12px}
  .noperm-t{font-size:16px;font-weight:700;color:var(--text);margin-bottom:8px}
  .noperm-d{font-size:13px;color:var(--text-3);line-height:1.7}

  /* 弹窗：遮罩全屏覆盖（含侧边栏），弹窗本体居中于 .main 区域
     （layout padding 12 + sidebar 96 + gap 12 = 主区左偏移 120px，用不对称 padding 实现） */
  .dlg-mask{
    position:fixed;inset:0;z-index:8000;display:flex;align-items:center;justify-content:center;
    padding:12px 12px 12px calc(12px + 96px + 12px);
    background:rgba(17,20,30,.42);
  }
  /* 弹窗尺寸一律固定：宽高由 --dlg-w / --dlg-h 决定，绝不随内容伸缩。
     内容比弹窗高就在 .dlg-body 里滚动，比弹窗矮就留白 —— 打开、切换选项卡、
     加载完成前后，弹窗的框都不会跳动。
     max-* 只用于「窗口比弹窗还小」时兜底收缩，正常分辨率下不生效。 */
  .dlg{
    width:var(--dlg-w,560px);height:var(--dlg-h,600px);
    max-width:100%;max-height:100%;display:flex;flex-direction:column;
    background:var(--panel);border-radius:14px;box-shadow:0 24px 60px rgba(17,20,30,.28);overflow:hidden;
  }
  /* 尺寸档：给 openDialog 第 4 个参数用，也可以在 HTML 里直接挂类 */
  .dlg.dlg-xs{--dlg-w:460px;--dlg-h:260px}
  .dlg.dlg-sm{--dlg-w:520px;--dlg-h:460px}
  .dlg.dlg-md{--dlg-w:560px;--dlg-h:600px}
  .dlg.dlg-lg{--dlg-w:760px;--dlg-h:680px}
  .dlg.dlg-xl{--dlg-w:980px;--dlg-h:700px}
  .dlg-head{
    flex:none;display:flex;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border);
    font-size:15px;font-weight:600;color:var(--text);
  }
  .dlg-x{margin-left:auto;cursor:pointer;color:var(--text-3);font-size:15px;line-height:1}
  .dlg-body{padding:4px 20px;overflow-y:auto;flex:1;min-height:0;overscroll-behavior:contain}
  .dlg-foot{flex:none;display:flex;justify-content:flex-end;gap:10px;padding:14px 20px;border-top:1px solid var(--border)}
  .dlg .form-row{padding:14px 0}
  .dlg .form-row>label{width:78px;font-size:13px;padding-top:10px}
  .dlg .field input[type=text],.dlg .field input[type=password],.dlg .field select.po-in{max-width:none}
  body.theme-dark .dlg{background:#22242D}
  /* 自适应高度：内容少时不留半屏空白（核销弹窗只有一两行商品）。
     上限仍按视口走，商品多的时候内部滚动，不会顶出屏幕 */
  .dlg.is-auto{height:auto;max-height:88vh}

  /* ---------- 电话接单：右侧任务/排名面板（悬浮在卡片右上角，不参与排版） ---------- */
  .po-card{position:relative}
  .po-side{
    position:absolute;top:18px;right:20px;z-index:5;
    width:36%;flex:none;display:flex;flex-direction:column;gap:14px;
    /* 限定高度，内容过多时整列上下滚动，不被内容撑大（以卡片为界） */
    max-height:calc(100% - 36px);
    overflow-y:auto;
    overscroll-behavior:contain;
    padding-right:4px;
    scrollbar-width:thin;
    scrollbar-color:rgba(130,140,160,.45) transparent;
  }
  .po-side::-webkit-scrollbar{width:6px}
  .po-side::-webkit-scrollbar-thumb{background:rgba(130,140,160,.45);border-radius:3px}
  .po-side::-webkit-scrollbar-track{background:transparent}
  .side-panel{
    background:rgba(255,255,255,.72);
    -webkit-backdrop-filter:blur(14px) saturate(160%);
    backdrop-filter:blur(14px) saturate(160%);
    border:1px solid rgba(255,255,255,.6);border-radius:12px;
    padding:12px 14px 10px;
    /* 内容过多时在卡片内部上下滚动，不被内容撑大（高度由 .po-side 分配） */
    overflow-y:auto;
    overscroll-behavior:contain;
    /* 可滚动但不显示滚动条 */
    scrollbar-width:none;          /* Firefox */
    -ms-overflow-style:none;       /* 旧 Edge/IE */
  }
  /* 任务进度面板：撑满 po-side 剩余高度（底边随「本单备注」行对齐），内容超出时内部滚动 */
  .po-side .side-panel:first-child{flex:1 1 auto;min-height:280px}
  .po-side .side-panel:last-child{flex:0 0 auto}
  .side-panel::-webkit-scrollbar{display:none;width:0;height:0}  /* Chrome/Safari */
  .sp-title-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}
  .sp-title{flex:1;min-width:0;text-align:left;font-size:13px;font-weight:700;color:var(--text)}
  .sp-sub{flex:none;font-size:10.5px;color:var(--text-3)}

  /* 个人销售任务进度：名称一行 + 进度条（已完成/总量 + 剩余）；行可点击加入购买清单 */
  .tk-row{display:flex;flex-direction:column;gap:5px;padding:6px 0}
  #poTaskList .tk-row{cursor:pointer;border-radius:8px;padding-left:6px;padding-right:6px;transition:background .15s}
  #poTaskList .tk-row:hover{background:rgb(var(--primary-rgb) / .07)}
  #poTaskList .tk-row:hover .tk-name{color:var(--primary)}
  .tk-top{display:flex;align-items:flex-start;gap:6px}
  .tk-name{flex:1;min-width:0;font-size:12px;color:var(--text-2);line-height:1.4}
  /* 会员关联：标签与商品名匹配 → 「有关联」徽标 + 名称加粗变蓝 */
  .tk-rel{
    flex:none;margin-top:1px;padding:1px 7px;border-radius:9px;
    background:#EEF2FF;border:1px solid rgb(var(--primary-rgb) / .35);
    color:var(--primary);
    font-size:10.5px;font-weight:600;line-height:1.5;white-space:nowrap;
  }
  .tk-name.is-related{color:var(--primary);font-weight:700}
  /* 超额完成标记 */
  .tk-over{
    flex:none;margin-top:1px;padding:1px 6px;border-radius:6px;
    background:#FFE8D6;color:#C2410C;
    font-size:10.5px;font-weight:700;line-height:1.5;white-space:nowrap;
  }
  .tk-bar{
    display:flex;align-items:center;height:24px;border-radius:12px;
    background:#E8E9ED;overflow:hidden;
  }
  /* 超额完成：进度条换橙色（比常规紫色更醒目，呼应"超额"的兴奋感），与常规进度区分 */
  .tk-row.is-over .tk-bar{background:#FFE8D6}
  .tk-row.is-over .tk-fill{background:#EA580C}
  .tk-fill{
    flex:none;height:100%;min-width:56px;max-width:100%;border-radius:12px;
    background:#8B7CF6;display:flex;align-items:center;justify-content:center;
    transition:width .25s ease;
  }
  .tk-fill b{font-size:12px;font-weight:700;color:#fff;letter-spacing:.2px;line-height:1}
  /* 会员关联：进度条霓虹灯动画（紫色光晕呼吸 + 流光扫过） */
  .tk-bar.is-neon .tk-fill{animation:tk-neon 1.8s ease-in-out infinite}
  .tk-bar.is-neon .tk-fill::after{
    content:'';position:absolute;inset:0;border-radius:inherit;
    background:linear-gradient(105deg,transparent 35%,rgba(255,255,255,.45) 50%,transparent 65%);
    background-size:220% 100%;animation:tk-shine 2.4s linear infinite;
  }
  .tk-fill{position:relative;overflow:hidden}
  @keyframes tk-neon{
    0%,100%{box-shadow:0 0 4px 1px rgba(139,124,246,.55),0 0 10px 2px rgba(139,124,246,.22)}
    50%{box-shadow:0 0 9px 3px rgba(139,124,246,.9),0 0 20px 7px rgba(139,124,246,.42)}
  }
  @keyframes tk-shine{
    from{background-position:180% 0}
    to{background-position:-80% 0}
  }
  body.theme-dark .tk-rel{background:rgb(var(--primary-rgb) / .16)}
  body.theme-dark .tk-name.is-related{color:#9DB4FF}
  .tk-rest{
    flex:1;min-width:0;text-align:center;line-height:1;
    font-size:12px;font-weight:700;color:#1F2230;letter-spacing:.2px;
  }

  /* 接单任务排名 */
  .rank-avatars{display:flex;gap:6px}
  .rk{flex:1;display:flex;flex-direction:column;align-items:center;gap:5px;min-width:0}
  .rk-ava{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:20px;overflow:hidden}
  .rk-img{width:100%;height:100%;object-fit:cover;display:block}
  .rk-name{font-size:11px;color:var(--text-2);white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
  .rk.gray .rk-ava{background:#E7E9F0;filter:grayscale(1);opacity:.55}
  .rk.gray .rk-name{color:var(--text-3)}
  /* 当前账号本人：与前面几名之间加一条竖线，名字位改显示名次 */
  .rk-sep{flex:none;align-self:flex-start;width:1px;height:40px;background:rgba(130,140,160,.42)}
  .rk.is-self .rk-name{color:var(--text-2);font-weight:700;letter-spacing:.2px}
  /* 当前账号本人头像：用真实头像，加一圈描边标识「我」 */
  .rk.is-self .rk-ava.is-self-ava{box-shadow:0 0 0 2px rgba(139,124,246,.65);background:#EDEAFB}
  /* 窄屏时隐藏悬浮面板，避免压住表单 */
  @media (max-width:1140px){ .po-side{display:none} }

  /* ---------- 电话接单 ---------- */
  .po-card{
    background:rgba(255,255,255,.72);
    -webkit-backdrop-filter:blur(14px) saturate(160%);
    backdrop-filter:blur(14px) saturate(160%);
    border:1px solid rgba(255,255,255,.6);border-radius:14px;
    box-shadow:0 8px 32px rgba(31,36,48,.12);
    width:100%;max-width:1000px;margin:0 auto;padding:4px 24px 0;
  }
  .po-row{display:flex;padding:13px 0;align-items:center}
  /* display:flex 会盖掉 UA 的 [hidden]{display:none} —— 「厂家优惠」这类按条件显隐的行
     就会留下一条空壳（label 在、右侧空白）。凡是 .po-row 加 hidden 的都得靠这条兜住 */
  .po-row[hidden]{display:none}
  .po-row:last-of-type{border-bottom:none}
  .po-row>label{width:76px;flex:none;font-size:13.5px;color:var(--text);font-weight:600;align-self:center}
  .po-fields{flex:1;min-width:0;display:flex;gap:12px;flex-wrap:wrap;align-items:center}
  /* 含整块表格/多行内容的行（如「购买商品」）保持标题顶部对齐，避免标题浮在中间 */
  .po-row.po-row--top{align-items:flex-start}
  .po-row.po-row--top>label{align-self:flex-start}
  /* 标题与内容「第一行」垂直居中对齐（如「付款方式」标题对齐第一排按钮）
     --chip-pad：按钮组上内边距，标题同步补偿，保证标题中心与首个按钮中心同高 */
  .po-row.po-row--l1{--chip-pad:3px;align-items:flex-start}
  .po-row.po-row--l1>label{align-self:flex-start;line-height:34px;padding-top:var(--chip-pad)}
  .po-in{
    /* flex-basis 用 auto（而非 0）：否则作为纵向 flex（column）的直接子元素时，
       高度会被 flex-basis:0 覆盖而塌成内容高度（曾导致 19px 的"扁输入框"）。
       横向 flex 中 grow:1 仍会撑满剩余宽度，布局不变。 */
    flex:1 1 auto;min-width:0;max-width:500px;height:38px;border:1px solid var(--input-border,#D8DCE6);border-radius:var(--input-radius,7px);
    padding:0 11px;font-size:13.5px;color:var(--text);background:#fff;outline:none;transition:.15s;
    font-family:inherit;
  }
  .po-in:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft)}
  .po-in::placeholder{color:#C3C7D1}
  select.po-in{appearance:none;background-image:linear-gradient(45deg,transparent 50%,#9AA1AE 50%),linear-gradient(135deg,#9AA1AE 50%,transparent 50%);
    background-position:calc(100% - 15px) 17px,calc(100% - 10px) 17px;background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:30px;max-width:180px}
  .po-search-wrap{position:relative;flex:1;max-width:500px;min-width:200px}
  .po-search-wrap .po-in{max-width:none;width:100%;padding-right:34px}
  .po-search-wrap .ic{position:absolute;right:10px;top:11px;color:var(--text-3);font-size:14px}

  /* 本单客服：只读显示当前登录账号，非下拉 */
  .po-staff{display:inline-flex;align-items:center;gap:10px;height:38px;padding:0 13px;border:1px dashed var(--border);border-radius:8px;background:var(--bg-soft,#F5F6F8);max-width:100%}
  .po-staff-ava{width:26px;height:26px;border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;font-size:15px;background:#E7E9F0;overflow:hidden;color:var(--text-2)}
  .po-staff-ava img{width:100%;height:100%;object-fit:cover;display:block}
  .po-staff-name{font-size:13.5px;color:var(--text);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}
  .po-staff-tag{flex:none;font-size:11px;line-height:18px;padding:0 7px;border-radius:9px;background:var(--primary-soft,#EDE9FE);color:var(--primary,#7C3AED);font-weight:600}
  .po-staff-tag.no-perm{background:#FEF3C7;color:#B45309}
  body.theme-dark .po-staff{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.16)}
  body.theme-dark .po-staff-ava{background:rgba(255,255,255,.08);color:var(--text-2)}

  /* 地址名称：「他的地址」按钮内嵌到输入框右侧 */
  .po-addr-wrap{position:relative;flex:1;min-width:0;max-width:500px}
  .po-addr-wrap .po-in{max-width:none;width:100%;padding-right:84px}
  .po-addr-wrap .btn{
    position:absolute;right:5px;top:5px;height:28px;padding:0 10px;font-size:12px;border-radius:5px;
    max-width:210px;overflow:hidden;flex:none;
  }
  .po-addr-wrap .btn span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* 顾客备注：「更新」按钮内嵌到输入框右侧（宽度由 fitRemarkRow 自适应，避开悬浮面板）。
     样式与「他的地址」完全一致：同一个输入框内嵌动作，一个填成主色实心、一个留白，
     视觉上会让人以为「更新」更重要或更危险。两者都是次要动作，统一走默认 .btn。 */
  .po-remark-wrap{max-width:500px}
  .po-remark-wrap .po-in{padding-right:68px}
  .po-remark-wrap .btn{min-width:56px}

  /* 顾客姓名：宽度固定 110px，右侧紧跟会员信息。
     整行限宽 510px：卡片内容左缘到右侧任务面板左缘约 520px（面板占卡片右侧 36% +
     right:20px），姓名行留在面板左边——会员数据再长也只折行/缩写/省略，
     不会钻进面板底下或冲出可视区（2026-11-08 修「积分冲出页面」）。 */
  .po-name-fields{flex-wrap:nowrap;align-items:center;max-width:510px}
  .po-in.po-name{width:110px;max-width:110px;flex:none}
  /* 发送门店下拉定宽 140px（用户指定）。
     它原来靠 .po-in 的 flex:1 撑满 500px，把右边的「运力 + 配送距离」仪表一路顶到
     悬浮任务面板底下（面板绝对定位盖住卡片右 36%），距离数值直接被盖住看不见。
     注：最长的「濮阳县工业路店」在 140px 里会被省略号截断，展开的下拉列表仍是全名。 */
  .po-fields>#poStore{width:140px;max-width:140px;flex:0 0 auto}
  /* 会员信息固定在顾客姓名右侧（紧凑内联，无卡片底色）。
     允许收缩（flex-shrink + min-width:0）与内部折行：空间不够时「积分」自动掉到第二行，
     而不是 nowrap 硬顶出去。 */
  .po-stats-line{margin-left:0;flex:0 1 auto;min-width:0;max-width:100%;display:flex;align-items:center;border-radius:8px;padding:4px 8px;transition:background .15s}
  /* 命中会员时整条可点：开会员详情抽屉（积分记录 / 余额变动） */
  .po-stats-line.is-link{cursor:pointer}
  .po-stats-line.is-link:hover{background:rgb(var(--primary-rgb) / .08)}
  .po-stats-line.is-link:hover .pstat b{color:var(--primary)}
  /* 陌生号码：提示还没档案，发单会自动建档 */
  .po-stats-line.is-new{background:rgba(255,163,51,.1)}
  .po-stats-line.is-new .pstat b{color:#B26A00}
  /* 项间距 10px + 12.5px 字号 + 16px 图标：整条压紧，5~7 位积分/余额也能单行放下
     （实测三项常规值 ≈330px + 间距 20px ≤ 372px 可用宽）；折行只作极端数据兜底 */
  .po-stats{display:flex;align-items:center;gap:4px 10px;flex-wrap:wrap;min-width:0}
  .pstat{display:inline-flex;align-items:center;gap:5px;font-size:12.5px;color:var(--text-2);white-space:nowrap}
  /* 数值上限 6em：大数已由 JS 缩写（cnCompact），这里只兜底「级别」这类长文字 ——
     6em 是三项并排仍能塞进 372px 的上限，超长级别省略号截断，悬停看全名 */
  .pstat b{font-weight:600;color:var(--text);max-width:6em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .pstat i{
    width:16px;height:16px;border-radius:4px;flex:none;font-style:normal;font-size:9px;
    background:#2A2F3A;color:#FFD166;display:inline-flex;align-items:center;justify-content:center;
  }
  /* 缓存值标记：显示的是凌晨同步下来的余额/积分（接口暂时不通时用），淡一点不抢眼。
     放在「标签」行末尾——统计条那一行横向空间会被右侧任务面板挤掉。 */
  .po-stale-tip{height:22px;padding:0 8px;border-radius:11px;background:rgba(0,0,0,.05);
    font-size:11px;color:var(--text-3);display:inline-flex;align-items:center;white-space:nowrap;flex:none}
  .po-stats-line.is-stale .pstat b{color:var(--text-2)}
  .po-stats-line.is-stale{background:rgba(0,0,0,.035)}
  .tag-pill{height:26px;padding:0 11px;border-radius:14px;background:#F5F5F9;border:1px solid var(--border);
    font-size:12.5px;color:var(--text-2);display:inline-flex;align-items:center}
  /* 会员标签：单行不换行，溢出折叠为 +N，点击 +N 弹窗查看全部 */
  .po-tags{display:flex;flex-wrap:nowrap;align-items:center;gap:8px;min-width:0;overflow:hidden}
  .po-tags [hidden]{display:none!important}
  .po-tags .tag-pill{flex:none;white-space:nowrap}
  .tag-pill.tag-more{cursor:pointer;background:#fff;border-style:dashed;color:var(--primary);font-weight:600}
  .tag-pill.tag-more:hover{border-color:rgb(var(--primary-rgb) / .55);background:var(--primary-soft)}
  /* 会员标签弹窗：高度跟内容走（标签个数不定，固定 420 会留一大片空白）。
     .dlg-body 通到 flex:1 撑满整框，flex 容器又多行换行时 align-content 默认 stretch
     —— 行会被拉高平分剩余高度，标签之间就出现几十像素的空隙（2026-11-09 用户报障）。
     这里高度改 auto + align-content:flex-start，行高回到标签自身高度。 */
  .dlg.dlg-tags{--dlg-w:420px;--dlg-h:auto;max-height:min(460px,100%)}
  .dlg-tags-body{display:flex;flex-wrap:wrap;gap:10px;padding:18px 20px 22px;align-content:flex-start}
  .po-status{font-size:12.5px;color:var(--text-3);line-height:26px}
  .po-status b{color:var(--text-2);font-weight:600}
  /* 「发送门店」右侧的「运力 + 配送距离」仪表。
     2026-11-08 重做（原来是一串纯文字「运力 · 在线 0/2 · 待绑定 1 · 配送中 0」）：
     现在是与下拉框等高的两块胶囊，左边运力分段、右边距离独立成块 ——
       [ 运力 ●在线 0/2 │ 待绑定 1 │ 配送中 0 ]  [ 📍 2.3 km ]
     距离按 3km / 5km 递进变色：远单客服要提前跟顾客打招呼，不能只是一串灰字。
     0 人仍是红色告警（发过去没人送）；数字一律等宽，60 秒刷一次不左右跳。
     max-width 是硬约束：右侧任务/排名面板绝对定位盖住卡片右边 36%，
     这一条以前能长到 800 多 px，后面几个字就跑到面板底下去了。 */
  .po-cap{
    display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;
    max-width:min(100%,500px);min-width:0;font-size:12px;color:var(--text-3);
  }
  .po-cap-main{
    display:inline-flex;align-items:center;height:38px;padding:0 2px;
    border:1px solid var(--input-border,#D8DCE6);border-radius:var(--input-radius,7px);
    background:#FBFBFD;cursor:help;min-width:0;
  }
  .po-cap-t{padding:0 8px 0 7px;font-size:11.5px;font-weight:600;color:var(--text-2);letter-spacing:.02em}
  .po-cap-none{padding:0 9px 0 1px;font-size:12px;color:var(--text-3);white-space:nowrap}
  /* 每个指标一段，段间一条 20px 高的细竖线（比分隔点更整齐，也不会被「·」读成小数点） */
  .po-cap-seg{
    display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 8px;
    border-left:1px solid #E7EAF2;white-space:nowrap;
  }
  .po-cap-k{font-size:11.5px;color:var(--text-3)}
  .po-cap-seg b{
    font-size:14px;font-weight:600;color:var(--text);line-height:1;
    font-variant-numeric:tabular-nums;
  }
  .po-cap-dim{font-size:11.5px;color:var(--text-3);margin-left:-2px}
  /* 在线状态点：有人绿、没人红（红点比改字色更快被眼角捕捉到） */
  .po-cap-dot{width:6px;height:6px;border-radius:50%;background:#22C55E;flex:none;
    box-shadow:0 0 0 2.5px rgba(34,197,94,.14)}
  .po-cap-live.is-zero .po-cap-dot{background:#DC2626;box-shadow:0 0 0 2.5px rgba(220,38,38,.14)}
  .po-cap-live.is-zero b{color:#DC2626}
  /* 配送距离块：门店 → 收货地址 */
  .po-cap-dist{
    display:inline-flex;align-items:center;gap:4px;height:38px;padding:0 12px;
    border-radius:var(--input-radius,7px);background:#EEF4FF;color:#1D4ED8;cursor:help;
    white-space:nowrap;
  }
  .po-cap-dist b{font-size:14px;font-weight:600;line-height:1;font-variant-numeric:tabular-nums}
  .po-cap-unit{font-size:11px;opacity:.78;margin-left:-1px}
  /* 定位针用 CSS 画（水滴旋转 45°），省一个内联 SVG，也能跟着 currentColor 变色 */
  .po-cap-pin{
    width:9px;height:9px;flex:none;background:currentColor;opacity:.72;
    border-radius:50% 50% 50% 0;transform:rotate(-45deg);margin:0 2px 2px 0;
  }
  .po-cap-dist.is-far{background:#FFF6E8;color:#B45309}
  .po-cap-dist.is-far2{background:#FEF1F1;color:#B91C1C}
  .po-cap-dist.is-none,.po-cap-dist.is-busy{background:#F5F6FA;color:var(--text-3)}
  .po-cap-dist.is-busy .po-cap-k{animation:poDistPulse 1.2s ease-in-out infinite}
  @keyframes poDistPulse{0%,100%{opacity:.45}50%{opacity:1}}
  /* 0 人只红「运力」二字和在线那一段，待绑定/配送中照常中性 —— 全红会把真正的告警淹掉 */
  .po-cap.is-zero .po-cap-t{color:#DC2626}
  .po-cap.is-idle{opacity:.85}
  .po-cap.is-err .po-cap-none{color:#DC2626;text-decoration:underline dotted;cursor:pointer}
  body.theme-dark .po-cap-main{background:#1E222B;border-color:#313641}
  body.theme-dark .po-cap-seg{border-left-color:#313641}
  body.theme-dark .po-cap-dist{background:#1B2436;color:#93B4FB}
  body.theme-dark .po-cap-dist.is-far{background:#2A2318;color:#FBBF24}
  body.theme-dark .po-cap-dist.is-far2{background:#2B1A1A;color:#F87171}
  body.theme-dark .po-cap-dist.is-none,body.theme-dark .po-cap-dist.is-busy{background:#1E222B;color:var(--text-3)}
  body.theme-dark .po-cap.is-zero .po-cap-t,body.theme-dark .po-cap-live.is-zero b{color:#F87171}

  .po-table{width:100%;border-collapse:collapse;font-size:13px}
  .po-table th{background:#FAFAFC;color:var(--text-3);font-weight:500;text-align:left;padding:9px 10px;
    border-bottom:1px solid var(--border);font-size:12.5px;white-space:nowrap}
  .po-table td{padding:10px;border-bottom:1px solid #F5F6FA;color:var(--text-2);vertical-align:middle}
  .po-table td.empty{text-align:center;color:var(--text-3);padding:24px 0}
  .po-table .qty{max-width:64px;height:38px;padding:0 6px;flex:none}
  /* 库存「2415箱 3瓶」这类拆箱文本不许折行，一折就看不出来是几个箱 */
  .po-table .po-stock-cell{white-space:nowrap}
  /* 库存口径：跟着「发送门店」走。选了门店单元格用主题色，没选就是普通色 */
  .po-table .po-stock-cell.is-store{color:var(--text-1);font-weight:500}
  .po-table .po-stock-cell.is-store-miss{color:var(--text-3);font-weight:400;cursor:help}
  /* 口径圆点（在「可售库存」左边，不带文案）：灰=快照，绿=刚从进销存实时读到的，悬停有提示 */
  .po-stock-scope{display:inline-block;width:5px;height:5px;border-radius:50%;flex:none;
    background:#C9CCD4;margin-right:5px;vertical-align:2px;cursor:default}
  .po-stock-scope.is-live{background:#2FA55A}
  .po-stock-scope[hidden]{display:none}
  body.theme-dark .po-stock-scope{background:#5A5F6C}
  body.theme-dark .po-stock-scope.is-live{background:#4FD07E}
  .gsel-table td.gs-stockc.is-store{color:var(--text-1);font-weight:500}
  .po-table .ck-col{width:34px;text-align:center}
  .po-table .ck-col input[type=checkbox]{width:15px;height:15px;cursor:pointer;accent-color:var(--primary)}
  /* 品名列：缩略图 + 名称 + 条码/属性；整块可点，点开商品详情抽屉 */
  .g-cell{display:flex;align-items:center;gap:10px;min-width:0;cursor:pointer;border-radius:8px;
    transition:background .15s}
  .g-cell:hover{background:rgb(var(--primary-rgb) / .06)}
  .g-cell:focus-visible{outline:2px solid var(--primary);outline-offset:2px}
  .g-img{
    width:46px;height:46px;border-radius:6px;flex:none;object-fit:cover;
    display:flex;align-items:center;justify-content:center;
    color:#fff;font-size:17px;font-weight:700;overflow:hidden;position:relative;
  }
  /* 商品中心同步来的真实图：绝对定位盖住底下的「首字色块」，
     图挂了会被 onerror 移除，自然露出首字，不会出现破图 */
  .g-img>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:inherit}
  .g-info{min-width:0}
  .g-title{font-size:13px;color:var(--text);line-height:1.4;overflow-wrap:anywhere;word-break:normal}
  /* 商品有备注（商品中心 → 备注）：名称加粗 + 主题色 + 小圆点，悬停弹出气泡，与选品器完全一致 */
  .po-table .g-title.has-rec{position:relative;display:inline-block;font-weight:700;color:var(--primary);cursor:help}
  .po-table .g-title.has-rec .g-rec-dot{
    display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--primary);
    margin-left:5px;vertical-align:middle;
  }
  .po-table .g-title.has-rec::after{
    content:attr(data-note);
    position:absolute;left:0;bottom:calc(100% + 7px);z-index:40;
    max-width:280px;padding:7px 11px;border-radius:8px;
    background:var(--primary);color:#fff;
    font-size:12px;font-weight:500;line-height:1.55;text-align:left;white-space:normal;
    box-shadow:0 6px 18px rgb(var(--primary-rgb) / .35);
    opacity:0;visibility:hidden;transform:translateY(4px);
    transition:opacity .15s ease,transform .15s ease,visibility .15s;
    pointer-events:none;
  }
  .po-table .g-title.has-rec::before{
    content:'';position:absolute;left:14px;bottom:calc(100% + 2px);z-index:40;
    border:5px solid transparent;border-top-color:var(--primary);
    opacity:0;visibility:hidden;transform:translateY(4px);
    transition:opacity .15s ease,transform .15s ease,visibility .15s;
    pointer-events:none;
  }
  .po-table .g-title.has-rec:hover::after,
  .po-table .g-title.has-rec:hover::before{opacity:1;visibility:visible;transform:translateY(0)}
  /* 清单里的气泡一律朝上：上方是表头/表单行，不会被卡片裁切；
     朝下会压住自己的编码/属性行，反而不易读（选品器里是弹窗裁剪才做第一行朝下） */
  body.theme-dark .po-table .g-title.has-rec{color:#A78BFA}
  .g-sub{font-size:11px;color:var(--text-3);line-height:1.6}
  /* 商品编码下面那行：整箱系数 / 价位段 / 商品类型（进销存「商品自定义属性」002 / 004 / 001） */
  .g-meta{display:flex;flex-wrap:wrap;gap:4px;margin-top:2px}
  .g-meta .gm{
    font-size:10.5px;line-height:16px;padding:0 6px;border-radius:8px;white-space:nowrap;
    color:var(--text-2);background:rgba(120,130,150,.10);
  }
  .g-meta .gm.type{color:#C2570B;background:rgba(245,166,35,.16)}
  body.theme-dark .g-meta .gm{background:rgba(255,255,255,.08);color:var(--text-2)}
  body.theme-dark .g-meta .gm.type{color:#FFAB6B;background:rgba(245,166,35,.18)}
  /* 售价：可以直接输入自定义金额（回车确定），右侧 ▾ 展开档位价快速套用 */
  .g-price-wrap{position:relative;display:inline-block;vertical-align:middle}
  .po-table .g-price{
    width:90px;height:36px;padding:0 22px 0 6px;text-align:right;
    font-variant-numeric:tabular-nums;cursor:text;
  }
  .po-table .g-price:hover{border-color:var(--primary-hover,#8B5CF6)}
  .g-price-more{
    position:absolute;right:1px;top:1px;bottom:1px;width:22px;padding:0;
    display:flex;align-items:center;justify-content:center;
    border:none;background:transparent;color:var(--text-3);
    cursor:pointer;border-radius:0 6px 6px 0;font-family:inherit;transition:.15s;
  }
  /* 小三角用边框画，比「▾」字符在各分辨率下都清楚 */
  .g-price-more::before{
    content:'';width:0;height:0;
    border-left:3.6px solid transparent;border-right:3.6px solid transparent;
    border-top:4.6px solid currentColor;
  }
  .g-price-more:hover{color:var(--primary);background:rgb(var(--primary-rgb) / .10)}
  .g-price-menu{
    position:absolute;z-index:60;top:calc(100% + 4px);right:0;min-width:118px;padding:4px;
    background:#fff;border-radius:9px;
    box-shadow:0 12px 30px rgba(20,26,40,.22),0 2px 6px rgba(20,26,40,.10),0 0 0 1px rgba(20,26,40,.07);
  }
  .g-price-menu[hidden]{display:none}
  .g-price-menu.up{top:auto;bottom:calc(100% + 4px)}
  .g-price-menu .g-pm{
    display:block;width:100%;padding:7px 10px;border:none;border-radius:5px;
    background:transparent;font-family:inherit;font-size:13px;line-height:1.35;
    font-variant-numeric:tabular-nums;text-align:right;
    color:var(--text-2);cursor:pointer;transition:.12s;
  }
  .g-price-menu .g-pm:hover{background:rgb(var(--primary-rgb) / .08);color:var(--primary)}
  .g-price-menu .g-pm.on{color:var(--primary);font-weight:700}
  .g-price-menu .g-pm.cur{background:rgb(var(--primary-rgb) / .14)}
  body.theme-dark .g-price-menu{background:#272A34;box-shadow:0 10px 26px rgba(0,0,0,.55),0 0 0 1px rgba(255,255,255,.08)}
  /* 销售单位：多单位商品的行内下拉（切单位时价格跟着换）；列宽压到 60px 省空间 */
  .po-table .g-unit{width:60px;height:36px;padding:0 10px;font-size:12.5px;cursor:pointer}
  .po-table .g-unit-cell{white-space:nowrap;padding:10px 6px}
  /* 选品器「单位」列的多单位徽标（悬停看各单位价） */
  .gs-unit-n{
    display:inline-block;margin-left:4px;padding:0 5px;border-radius:8px;vertical-align:1px;
    font-size:10.5px;line-height:15px;font-weight:600;cursor:help;
    color:var(--primary);background:rgb(var(--primary-rgb) / .12);
  }
  /* 操作：红「删」绿「转」竖排（横向只占一个按钮宽，省出的宽度给商品名） */
  .po-table td.g-ops{width:52px;padding:8px 6px;white-space:normal;vertical-align:middle}
  .po-table td.g-ops .g-btn{display:block;width:100%;padding:5px 0;font-size:12px;line-height:1.35;letter-spacing:1px}
  .po-table td.g-ops .g-btn.green{margin:4px 0 0}
  .g-btn{
    border:none;border-radius:4px;color:#fff;font-size:12.5px;line-height:1;
    padding:6px 13px;cursor:pointer;transition:.15s;font-family:inherit;
  }
  .g-btn.red{background:#E5484D}
  .g-btn.red:hover{background:#D13438}
  .g-btn.green{background:#7CC142;margin-left:6px}
  .g-btn.green:hover{background:#6BAD33}
  .po-link{color:var(--primary);cursor:pointer;font-size:12.5px}
  .po-actions-row{display:flex;gap:10px;padding:12px 0 2px;align-items:stretch}
  /* 库存不足：行内数量框标红 + 清单下方汇总（默认拦截发单） */
  .po-table tr.is-short td{background:rgba(229,72,77,.045)}
  .po-table .qty.is-over{border-color:#E5484D;box-shadow:0 0 0 3px rgba(229,72,77,.14)}
  /* 冷藏：清单行内开关 + 商品名前缀徽标（样式对齐设置页的开关观感） */
  .po-table .cold-col{width:74px;text-align:center}
  .po-table .g-cold-cell{white-space:nowrap}
  .cold-sw{position:relative;display:inline-flex;align-items:center;vertical-align:middle;cursor:pointer}
  .cold-sw input{position:absolute;inset:0;width:100%;height:100%;opacity:0;margin:0;cursor:pointer}
  .cold-sl{
    position:relative;display:block;width:36px;height:20px;border-radius:999px;background:#DDE1E9;
    transition:background .18s;
  }
  .cold-sl::after{
    content:'';position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;
    background:#fff;box-shadow:0 1px 3px rgba(20,26,40,.22);transition:transform .18s;
  }
  .cold-sw.on .cold-sl{background:#0EA5E9}
  .cold-sw.on .cold-sl::after{transform:translateX(16px)}
  .cold-sw.locked .cold-sl{background:#0284C7}
  .cold-sw input:focus-visible + .cold-sl{box-shadow:0 0 0 3px rgba(14,165,233,.28)}
  .cold-lock{margin-left:3px;font-size:10.5px;line-height:1;vertical-align:middle;opacity:.75;cursor:help}
  /* 禁止冷藏（订单设置里设为「禁止」的商品/品类）：开关锁死在关闭态，点了会说明原因。
     圆点必须显式复位到左侧：一旦跟 .on 同时存在（历史脏数据 / 极端时序），
     只管背景色会出现「灰底 + 圆点在右」——看着就是开着且关不掉，与规则正好相反。 */
  .cold-sw.banned .cold-sl{background:#E7E9F0}
  .cold-sw.banned .cold-sl::after{background:#C7CCD8;transform:none}
  .cold-sw.banned{cursor:not-allowed}
  body.theme-dark .cold-sw.banned .cold-sl{background:#33363F}
  .cold-tag{
    display:inline-flex;align-items:center;height:16px;padding:0 5px;margin-right:5px;
    border-radius:4px;vertical-align:1px;font-size:10.5px;font-weight:700;letter-spacing:.2px;
    color:#0369A1;background:rgba(14,165,233,.14);
  }
  .cold-tag[hidden]{display:none}
  /* 赠品标（组合里配了「赠」的行）：售价 0，名称前挂这个，客服和门店都一眼看出是送的 */
  .g-gift-tag{
    display:inline-flex;align-items:center;height:16px;padding:0 5px;margin-right:5px;
    border-radius:4px;vertical-align:1px;font-size:10.5px;font-weight:700;letter-spacing:.2px;
    color:#B45309;background:rgba(245,158,11,.16);
  }
  body.theme-dark .g-gift-tag{color:#FFC15E;background:rgba(245,158,11,.22)}
  /* ===== 冷藏行氛围特效（设置 → 冷藏商品 → 行内特效，值存 cold_goods.fx） =====
     背景一律画在 tr 上——td 一旦有底色就会把 tr 的图盖住；
     动画只动 background-position / background-color，属于便宜的合成动画，
     行数再翻页也不会卡。所有浓度都压着：看得出在动，但不跟商品名、输入框抢注意力。

     选择器写成 `.is-cold[data-cold-fx="x"]`，好处是**同一套样式既作用于**
     接单清单的 tr.is-cold，也作用于设置页的预览块（.stg-fx-prev）——
     预览看到的和清单里的完全一致，不用维护两份。

     air    冷雾流动：薄霜 + 左端冷雾 + 一团白气自左向右
     snow   风雪飘雪：冷风带自左向右掠过，夹着两层雪花（远小慢、近大快）
     frost  冰霜结晶：四边霜纹常驻，冷色缓慢呼吸
     aurora 冰蓝流光：一道斜向冷光反复扫过
     none   只留淡蓝底色，不动 */

  /* 所有特效共用的底色（none 也靠它） */
  .is-cold[data-cold-fx]{
    background-color:rgba(56,189,248,.12);
    transition:background-color .28s ease;
  }

  /* ---------- ① air：冷雾流动（默认） ---------- */
  .is-cold[data-cold-fx="air"]{
    background-image:
      /* 顶部霜面：贴着行上沿，往下 8px 化掉 */
      linear-gradient(180deg, rgba(255,255,255,.80) 0, rgba(255,255,255,.40) 2px, rgba(255,255,255,0) 8px),
      /* 左侧冷雾：贴着行的左端，往右自然散掉（radial 比 linear 更像「雾」） */
      radial-gradient(150% 190% at 0% 50%, rgba(186,230,253,.85) 0%, rgba(186,230,253,.30) 30%, rgba(186,230,253,0) 64%),
      /* 主气团：一团有轮廓的白气（窄、陡），从左掠到右 */
      linear-gradient(90deg, rgba(186,230,253,0) 0%, rgba(186,230,253,.20) 14%, rgba(255,255,255,.50) 34%,
        rgba(186,230,253,.22) 52%, rgba(255,255,255,.42) 68%, rgba(186,230,253,0) 100%),
      /* 细气流：跑得快一点，追着主气团 */
      linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,.20) 30%, rgba(255,255,255,.34) 50%,
        rgba(255,255,255,.20) 70%, rgba(255,255,255,0) 100%);
    background-size:100% 100%, 100% 100%, 34% 100%, 12% 100%;
    background-repeat:no-repeat;
    background-position:0 0, 0 0, -110% 0, -120% 0;
    animation:poColdAir 9s ease-in-out infinite;
  }
  /* 0→62% 走完整行，剩下 38% 留白，让「飘过」有呼吸间隔而不是一直扫 */
  @keyframes poColdAir{
    0%  {background-position:0 0, 0 0, -110% 0, -120% 0}
    62% {background-position:0 0, 0 0,  200% 0,  190% 0}
    100%{background-position:0 0, 0 0,  200% 0,  190% 0}
  }

  /* ---------- ② snow：风雪飘雪 ----------
     雪花用「一颗 = 一层 radial-gradient + 横向平铺」拼出来（CSS 没有多点的渐变，
     一颗一点最省事）。平铺宽度和位移都取整数倍，动画首尾无缝。
     浅色行底上纯白小点几乎看不见，所以每颗雪花做成「白芯 + 一圈淡蓝光晕」，
     靠那圈冷蓝把白点从背景里托出来；两层速度不同 = 视差（远小慢、近大快）。 */
  .is-cold[data-cold-fx="snow"]{
    background-image:
      /* 顶部薄霜 */
      linear-gradient(180deg, rgba(255,255,255,.82) 0, rgba(255,255,255,.36) 2px, rgba(255,255,255,0) 8px),
      /* 左端冷雾（风的源头） */
      radial-gradient(150% 190% at 0% 50%, rgba(186,230,253,.80) 0%, rgba(186,230,253,.26) 30%, rgba(186,230,253,0) 62%),
      /* 风带：横向拉长的柔光，从左边一直吹到右边 */
      linear-gradient(90deg, rgba(226,247,255,0) 0%, rgba(226,247,255,.14) 12%, rgba(255,255,255,.46) 34%,
        rgba(226,247,255,.14) 56%, rgba(255,255,255,.36) 74%, rgba(226,247,255,0) 100%),
      /* 雪花 A：远、小、慢（6 颗，96px 一格） */
      radial-gradient(circle 2.4px at 10px 24%, rgba(255,255,255,1) 0 42%, rgba(186,230,253,.55) 48%, rgba(186,230,253,0) 72%),
      radial-gradient(circle 2px   at 44px 70%, rgba(255,255,255,.96) 0 42%, rgba(186,230,253,.48) 48%, rgba(186,230,253,0) 72%),
      radial-gradient(circle 2.2px at 70px 38%, rgba(255,255,255,.98) 0 42%, rgba(186,230,253,.50) 48%, rgba(186,230,253,0) 72%),
      radial-gradient(circle 1.8px at 26px 86%, rgba(255,255,255,.92) 0 42%, rgba(186,230,253,.42) 48%, rgba(186,230,253,0) 72%),
      radial-gradient(circle 2.1px at 84px 60%, rgba(255,255,255,.95) 0 42%, rgba(186,230,253,.44) 48%, rgba(186,230,253,0) 72%),
      radial-gradient(circle 1.7px at 58px 14%, rgba(255,255,255,.90) 0 42%, rgba(186,230,253,.40) 48%, rgba(186,230,253,0) 72%),
      /* 雪花 B：近、大、快（4 颗，140px 一格） */
      radial-gradient(circle 3.6px at 16px 32%, rgba(255,255,255,1) 0 40%, rgba(186,230,253,.60) 46%, rgba(186,230,253,0) 74%),
      radial-gradient(circle 3.1px at 104px 62%, rgba(255,255,255,.97) 0 40%, rgba(186,230,253,.54) 46%, rgba(186,230,253,0) 74%),
      radial-gradient(circle 3.8px at 64px 82%, rgba(255,255,255,.99) 0 40%, rgba(186,230,253,.58) 46%, rgba(186,230,253,0) 74%),
      radial-gradient(circle 2.9px at 122px 18%, rgba(255,255,255,.94) 0 40%, rgba(186,230,253,.48) 46%, rgba(186,230,253,0) 74%);
    background-size:100% 100%, 100% 100%, 42% 100%,
      96px 100%, 96px 100%, 96px 100%, 96px 100%, 96px 100%, 96px 100%,
      140px 100%, 140px 100%, 140px 100%, 140px 100%;
    background-repeat:no-repeat, no-repeat, no-repeat,
      repeat-x, repeat-x, repeat-x, repeat-x, repeat-x, repeat-x,
      repeat-x, repeat-x, repeat-x, repeat-x;
    background-position:0 0, 0 0, -110% 0,
      0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0;
    animation:poColdSnow 9s linear infinite;
  }
  /* 风带 0→62% 掠完一遍就歇着（一阵风吹过的呼吸感）；
     雪花全程匀速：小雪花 9s 走 2 格（192px，远、慢），大雪花走 3 格（420px，近、快），
     位移都是平铺宽度的整数倍 → 首尾无缝，看不到「抖一下」。 */
  @keyframes poColdSnow{
    0%  {background-position:0 0, 0 0, -110% 0,
          0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0, 0 0}
    62% {background-position:0 0, 0 0,  210% 0,
          119px 0, 119px 0, 119px 0, 119px 0, 119px 0, 119px 0,
          260px 0, 260px 0, 260px 0, 260px 0}
    100%{background-position:0 0, 0 0,  210% 0,
          192px 0, 192px 0, 192px 0, 192px 0, 192px 0, 192px 0,
          420px 0, 420px 0, 420px 0, 420px 0}
  }

  /* ---------- ③ frost：冰霜结晶 ---------- */
  .is-cold[data-cold-fx="frost"]{
    background-image:
      /* 上下两边结霜：行越窄越像冰柜玻璃 */
      linear-gradient(180deg, rgba(255,255,255,.90) 0, rgba(255,255,255,.42) 3px, rgba(255,255,255,0) 10px),
      linear-gradient(0deg,   rgba(255,255,255,.70) 0, rgba(255,255,255,.24) 2px, rgba(255,255,255,0) 8px),
      /* 左端白霜团 */
      radial-gradient(150% 190% at 0% 50%, rgba(186,230,253,.78) 0%, rgba(186,230,253,.24) 32%, rgba(186,230,253,0) 66%),
      /* 交叉细纹：两组斜线叠出冰晶的棱。行很矮，纹路一密就像划痕，所以间距放大、透明度压低 */
      repeating-linear-gradient(114deg, rgba(255,255,255,.13) 0 1px, rgba(255,255,255,0) 1px 17px),
      repeating-linear-gradient(66deg,  rgba(255,255,255,.09) 0 1px, rgba(255,255,255,0) 1px 23px),
      /* 几颗冰晶亮点：霜不只是线，还要有颗粒 */
      radial-gradient(circle 2.4px at 22% 22%, rgba(255,255,255,.95) 0 42%, rgba(186,230,253,.45) 50%, rgba(186,230,253,0) 74%),
      radial-gradient(circle 2px   at 68% 76%, rgba(255,255,255,.90) 0 42%, rgba(186,230,253,.40) 50%, rgba(186,230,253,0) 74%),
      radial-gradient(circle 2.6px at 88% 30%, rgba(255,255,255,.92) 0 42%, rgba(186,230,253,.42) 50%, rgba(186,230,253,0) 74%);
    background-size:100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%;
    background-repeat:no-repeat;
    animation:poColdFrost 6s ease-in-out infinite;
  }
  /* 只让冷色自己慢慢明暗，位置一毫米都不动——最安静的一档 */
  @keyframes poColdFrost{
    0%, 100%{background-color:rgba(56,189,248,.10)}
    50%     {background-color:rgba(56,189,248,.19)}
  }

  /* ---------- ④ aurora：冰蓝流光 ---------- */
  .is-cold[data-cold-fx="aurora"]{
    background-image:
      linear-gradient(180deg, rgba(255,255,255,.70) 0, rgba(255,255,255,.30) 2px, rgba(255,255,255,0) 8px),
      /* 主冷光：斜向（115deg）拉长，扫过时有冰面反光的味道 */
      linear-gradient(115deg, rgba(125,211,252,0) 0%, rgba(125,211,252,.24) 28%, rgba(224,247,255,.50) 44%,
        rgba(125,211,252,.22) 60%, rgba(125,211,252,0) 100%),
      /* 副流光：窄、亮、跑得更快 */
      linear-gradient(115deg, rgba(255,255,255,0) 0%, rgba(255,255,255,.24) 44%, rgba(255,255,255,.34) 50%,
        rgba(255,255,255,.24) 56%, rgba(255,255,255,0) 100%);
    background-size:100% 100%, 44% 220%, 22% 220%;
    background-repeat:no-repeat;
    background-position:0 0, -120% 0, -60% 0;
    animation:poColdAurora 7s ease-in-out infinite;
  }
  @keyframes poColdAurora{
    0%  {background-position:0 0, -120% 0,  -60% 0}
    70% {background-position:0 0,  220% 0,  260% 0}
    100%{background-position:0 0,  220% 0,  260% 0}
  }

  /* ---------- ⑤ none：不动 ---------- */
  .is-cold[data-cold-fx="none"]{background-image:none;animation:none}

  /* 设置页的预览条：和清单行共用上面那套特效，所见即所得 */
  .stg-fx-prev{
    position:relative;height:54px;margin-top:10px;border-radius:8px;overflow:hidden;
    border:1px solid var(--border);background:#fff;
  }
  .stg-fx-prev::after{
    content:'预览';position:absolute;right:8px;bottom:5px;font-size:11px;
    color:rgba(90,100,120,.55);letter-spacing:1px;
  }
  body.theme-dark .stg-fx-prev{background:#171A21;border-color:#2C3040}

  body.theme-dark .cold-sl{background:#3A3F4C}
  body.theme-dark .cold-tag{color:#7DD3FC;background:rgba(14,165,233,.22)}
  /* 深色主题：底色加深，雾与光带整体压一档，别在暗底上刺眼
     （snow 的白雪花在暗底本来就好看，只调底色，不再重列 10 层渐变） */
  body.theme-dark .is-cold[data-cold-fx]{background-color:rgba(14,165,233,.18)}
  body.theme-dark .is-cold[data-cold-fx="air"]{
    background-image:
      linear-gradient(180deg, rgba(186,230,253,.22) 0, rgba(186,230,253,.10) 2px, rgba(186,230,253,0) 8px),
      radial-gradient(150% 190% at 0% 50%, rgba(125,211,252,.34) 0%, rgba(56,189,248,.13) 32%, rgba(56,189,248,0) 66%),
      linear-gradient(90deg, rgba(186,230,253,0) 0%, rgba(186,230,253,.08) 15%, rgba(186,230,253,.20) 36%,
        rgba(186,230,253,.08) 53%, rgba(186,230,253,.16) 69%, rgba(186,230,253,0) 100%),
      linear-gradient(90deg, rgba(224,249,255,0) 0%, rgba(224,249,255,.07) 30%, rgba(224,249,255,.16) 50%,
        rgba(224,249,255,.07) 70%, rgba(224,249,255,0) 100%);
  }
  body.theme-dark .is-cold[data-cold-fx="frost"]{
    background-image:
      linear-gradient(180deg, rgba(186,230,253,.26) 0, rgba(186,230,253,.12) 3px, rgba(186,230,253,0) 10px),
      linear-gradient(0deg,   rgba(186,230,253,.18) 0, rgba(186,230,253,.08) 2px, rgba(186,230,253,0) 8px),
      radial-gradient(150% 190% at 0% 50%, rgba(125,211,252,.30) 0%, rgba(56,189,248,.12) 32%, rgba(56,189,248,0) 66%),
      repeating-linear-gradient(114deg, rgba(186,230,253,.07) 0 1px, rgba(186,230,253,0) 1px 11px),
      repeating-linear-gradient(66deg,  rgba(186,230,253,.05) 0 1px, rgba(186,230,253,0) 1px 14px);
  }
  body.theme-dark .is-cold[data-cold-fx="aurora"]{
    background-image:
      linear-gradient(180deg, rgba(186,230,253,.20) 0, rgba(186,230,253,.08) 2px, rgba(186,230,253,0) 8px),
      linear-gradient(115deg, rgba(56,189,248,0) 0%, rgba(56,189,248,.20) 26%, rgba(186,230,253,.34) 44%,
        rgba(56,189,248,.18) 62%, rgba(56,189,248,0) 100%),
      linear-gradient(115deg, rgba(224,249,255,0) 0%, rgba(224,249,255,.10) 44%, rgba(224,249,255,.16) 50%,
        rgba(224,249,255,.10) 56%, rgba(224,249,255,0) 100%);
  }
  /* 库存不足的行：告警优先，特效让位（旧写法是 :not(.is-short)，
     现在按预设拆开了，用一条更高优先级的重置把特效关掉，逻辑等价） */
  .is-cold.is-short[data-cold-fx],
  body.theme-dark .is-cold.is-short[data-cold-fx]{
    background-image:none;animation:none;background-color:transparent;
  }
  /* 系统开了「减少动态效果」：特效默认定格（保留静态的霜与底色，不闪不动）。
     这是无障碍规范该有的行为，但很多人是被动中招（关掉 Windows 视觉效果、
     走远程桌面、节能模式都会命中），在设置页只会看到一块「不动」的预览，
     很容易误判成功能坏了。所以给一个显式的 data-cold-fx-motion="force" 出口：
     由使用者在设置里主动勾选，才覆盖系统的减少动态效果。 */
  @media (prefers-reduced-motion: reduce){
    .is-cold[data-cold-fx]:not([data-cold-fx-motion="force"]){animation:none !important}
  }
  .po-stock-warn{
    margin-top:10px;padding:10px 14px;border-radius:8px;line-height:1.6;font-size:12.5px;
    border:1px solid rgba(229,72,77,.30);background:rgba(229,72,77,.06);color:#B42318;
  }
  .po-stock-warn b{font-weight:700}
  .po-stock-warn .tip{display:block;margin-top:2px;font-size:12px;color:var(--text-3)}
  .po-stock-warn ul{margin:6px 0 0;padding-left:18px}
  .po-stock-warn li{margin-top:2px;font-variant-numeric:tabular-nums}
  .po-stock-warn.allow{border-color:rgba(245,166,35,.45);background:rgba(245,166,35,.10);color:#B45309}
  body.theme-dark .po-stock-warn{background:rgba(229,72,77,.12);color:#FF9B9E}
  body.theme-dark .po-stock-warn.allow{background:rgba(245,166,35,.14);color:#FFC078}
  .po-add-big{flex:1;min-width:0}
  .btn.blue{background:#3B82F6;border-color:#3B82F6;color:#fff}
  .btn.blue:hover{background:#2563EB}
  .btn[disabled]{color:#C3C7D1;background:#F5F6FA;border-color:var(--border);cursor:not-allowed}
  .btn.block{width:100%;justify-content:center}

  .chips{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
  .chip{height:34px;padding:0 14px;border:1px solid var(--border);background:#fff;border-radius:5px;
    font-size:12.5px;color:var(--text-2);cursor:pointer;transition:.15s;font-family:inherit}
  .chip:hover{border-color:rgb(var(--primary-rgb) / .40);color:var(--primary)}
  .chip.on{border-color:var(--primary);background:var(--primary-soft);color:var(--primary);font-weight:600}
  /* 「最近没再用过」的付款方式以前画成虚线灰字（.chip.is-stale），已去掉：
     电话单上一排按钮忽然有两个变灰，客服会当成"点不了"，实际是可点的，
     而"近 7 天有没有人用过"对他们接单没有任何用处。排序里仍把少用的排后面。 */
  /* 无余额会员禁用储值卡（设置 → 订单设置 → 付款方式 里开启才生效）：
     置灰 + 禁用光标；仍留在原位，让收银员知道「有这么个方式，但这单不能用」 */
  .chip.is-disabled,
  .chip.is-disabled:hover{
    opacity:.42;cursor:not-allowed;border-style:dashed;
    border-color:var(--border);color:var(--text-3);background:#fff;
  }
  body.theme-dark .chip.is-disabled,
  body.theme-dark .chip.is-disabled:hover{background:transparent}
  .combo-switch{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--text-2);cursor:pointer;margin-top:4px;flex:0 0 100%;align-self:flex-start}
  .combo-switch input{width:15px;height:15px;accent-color:var(--primary);cursor:pointer}
  /* 组合支付：应付金额 + 各付款方式分摊金额（不限混合数量） */
  .combo-panel{flex:0 0 100%;width:100%;max-width:560px;margin-top:10px;border:1px solid var(--border);border-radius:10px;padding:12px 14px;background:rgba(120,130,150,.04);align-self:flex-start}
  .combo-due{display:flex;align-items:baseline;gap:10px;font-size:13px;margin-bottom:10px}
  .combo-due .k{color:var(--text-2)}
  .combo-due .v{font-size:16px;font-weight:800;color:var(--text);font-variant-numeric:tabular-nums}
  .combo-lack{font-size:12.5px;color:#D92D20;font-variant-numeric:tabular-nums}
  .combo-lack.ok{color:#07A05A}
  .combo-lack.over{color:#C77A12}
  .combo-rows{display:flex;flex-direction:column;gap:8px}
  .combo-row{display:grid;grid-template-columns:98px 1fr auto;align-items:center;gap:10px}
  .combo-row .lb{font-size:13px;font-weight:600;color:var(--text);text-align:right;word-break:break-all}
  .combo-inp{height:34px;width:100%;border:1px solid var(--input-border,#D8DCE6);border-radius:var(--input-radius,7px);padding:0 10px;font-size:13.5px;color:var(--text);background:var(--panel);font-variant-numeric:tabular-nums}
  .combo-inp:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px rgba(35,120,235,.12)}
  .combo-all{cursor:pointer;font-size:13px;color:var(--primary);white-space:nowrap;user-select:none}
  .combo-all:hover{text-decoration:underline}
  body.theme-dark .combo-panel{background:rgba(255,255,255,.03)}

  .po-total{display:inline-block;padding-top:3px;line-height:32px;font-size:22px;font-weight:700;color:#E5484D;letter-spacing:.5px}
  /* 积分抵扣：开关 + 一句说明；抵扣金额挂在应付金额右侧做减法记录 */
  .po-point{display:flex;align-items:center;gap:10px;min-height:32px}
  .po-point-t{font-size:12.5px;color:var(--text-2);line-height:1.5}
  .po-point-t.is-off{color:var(--text-3)}
  .po-cut{display:inline-block;margin-left:10px;padding:1px 8px;border-radius:10px;
    font-size:11.5px;font-weight:600;color:var(--ok);
    background:color-mix(in srgb, var(--ok) 12%, transparent);line-height:18px;vertical-align:6px}

  /* 厂家优惠提醒（接单页）：优惠券下面单列一行，只在清单里真有参与商品时出现。
     文案由「传值商品」页的规则渲染；这里的金额/档位都是**提示**，不影响应付金额 ——
     真正减多少由微信按厂家条码算。后台「接单页会这样显示」直接复用这套样式。
     横幅带 9px 内边距：标题下沉 10px，标签同步下沉才对得上第一行文字
     （照 .po-row--top 顶对齐会高出标题半个字）。 */
  .po-row.po-row--promo{align-items:flex-start}
  .po-row.po-row--promo>label{align-self:flex-start;padding-top:10px}
  .po-sp{
    display:flex;gap:10px;align-items:flex-start;width:100%;max-width:560px;
    padding:9px 12px 10px;border-radius:9px;line-height:1.6;font-size:12.5px;color:var(--text-2);
    background:linear-gradient(100deg,rgb(var(--primary-rgb) / .07),rgb(var(--primary-rgb) / .02));
    border:1px solid rgb(var(--primary-rgb) / .18);
  }
  .po-sp-ico{flex:none;font-size:14px;line-height:1.4}
  .po-sp-txt{min-width:0;display:flex;flex-direction:column;gap:3px}
  .po-sp-h{color:var(--text);font-size:12.5px}
  .po-sp-h b{color:var(--primary);font-weight:700}
  .po-sp-rule b{color:#C2410C;font-weight:700}
  body.theme-dark .po-sp-rule b{color:#FBBF24}
  .po-sp-meta{display:flex;flex-wrap:wrap;gap:5px;margin-top:3px}
  .po-sp-chip{
    display:inline-block;padding:1px 8px;border-radius:999px;font-size:11.5px;line-height:17px;
    background:rgba(120,130,150,.10);border:1px solid rgba(120,130,150,.18);color:var(--text-2);
    font-variant-numeric:tabular-nums;
  }
  .po-sp-chip.on{background:rgba(245,166,35,.14);border-color:rgba(245,166,35,.34);color:#B45309;font-weight:600}
  body.theme-dark .po-sp-chip{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.12)}
  body.theme-dark .po-sp-chip.on{background:rgba(245,158,11,.16);border-color:rgba(245,158,11,.36);color:#FCD34D}
  /* 发单前的「储值卡 vs 厂家优惠」弹窗：沿用横幅的配色，别另起一套 */
  .psp-modal{width:540px;max-width:94vw}
  .psp-hero{
    display:flex;gap:10px;align-items:flex-start;padding:12px 14px;border-radius:10px;
    background:linear-gradient(100deg,rgb(var(--primary-rgb) / .08),rgb(var(--primary-rgb) / .02));
    border:1px solid rgb(var(--primary-rgb) / .20);
  }
  .psp-ico{flex:none;font-size:16px;line-height:1.4}
  .psp-hero-t{min-width:0}
  .psp-t{font-size:13.5px;font-weight:600;color:var(--text);line-height:1.55;margin-bottom:4px}
  .psp-t b{color:var(--primary);font-weight:700}
  .psp-s{font-size:12.5px;color:var(--text-2);line-height:1.7}
  .psp-s b{color:#C2410C;font-weight:700}
  body.theme-dark .psp-s b{color:#FBBF24}
  .psp-rule{margin-top:9px;font-size:12px;color:var(--text-3);line-height:1.65}
  .psp-rule b{color:#C2410C;font-weight:700}
  body.theme-dark .psp-rule b{color:#FBBF24}
  .psp-lab{margin:15px 0 8px;font-size:12.5px;color:var(--text-3)}
  .psp-picks .chip{height:32px;padding:0 12px;font-size:12.5px}
  .psp-empty{
    font-size:12.5px;line-height:1.65;color:#B45309;padding:9px 12px;border-radius:8px;
    background:rgba(245,166,35,.10);border:1px solid rgba(245,166,35,.26);
  }
  body.theme-dark .psp-empty{color:#FCD34D;background:rgba(245,158,11,.12);border-color:rgba(245,158,11,.30)}
  .psp-ops{display:flex;align-items:center;gap:10px;margin-top:16px}
  .psp-keep{
    margin-right:auto;background:none;border:0;padding:2px 0;cursor:pointer;
    font-size:12.5px;color:var(--text-3);text-decoration:underline;text-underline-offset:3px;
  }
  .psp-keep:hover{color:var(--text-2)}
  .gr-sw.is-point.on{background:var(--primary)}
  .gr-sw.is-point.on::after{left:20px}
  #poPay{padding-top:var(--chip-pad,3px)}
  #poPayRefresh{padding-top:0;font-size:13px}
  .po-foot{position:fixed;left:calc(96px + 24px);right:12px;bottom:12px;z-index:30;
    display:flex;justify-content:center;gap:14px;padding:14px 0;border-radius:14px;
    background:rgba(255,255,255,.85);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
    border:1px solid rgba(255,255,255,.55);box-shadow:0 10px 30px rgba(20,24,35,.12)}
  .po-foot .btn{height:38px;padding:0 26px}
  /* 预约配送按钮（2026-11-09）：未选时是淡橙描边的次要按钮，选完变橙色实心并显示时间。
     状态必须一眼能看出来 —— 发单按钮旁边挂一个「看不出约没约上」的按钮最危险。 */
  .po-book-btn{display:inline-flex;align-items:center;gap:6px;padding:0 20px;
    border:1px solid #FBC98A;background:#FFF8EF;color:#B45309;font-weight:600}
  .po-book-btn:hover{border-color:#F97316;background:#FFF3E4}
  .po-book-btn.is-set{background:#F97316;border-color:#F97316;color:#fff;
    box-shadow:0 2px 10px rgba(249,115,22,.30)}
  .po-book-btn.is-set:hover{background:#EA580C;border-color:#EA580C}
  .po-book-btn[hidden]{display:none}

  /* ===== 预约配送弹窗 ===== */
  .bk-modal{width:580px;max-width:100%;max-height:100%;background:#fff;border-radius:12px;
    box-shadow:0 18px 50px rgba(10,14,22,.35);display:flex;flex-direction:column;overflow:hidden}
  .bk-head{flex:none;display:flex;align-items:baseline;gap:10px;padding:14px 44px 11px 16px;
    border-bottom:1px solid var(--border);position:relative}
  .bk-head b{font-size:14.5px;color:var(--text)}
  .bk-sub{font-size:12px;color:var(--text-3);line-height:1.5}
  .bk-x{position:absolute;right:12px;top:11px;width:24px;height:24px;display:flex;
    align-items:center;justify-content:center;border-radius:6px;cursor:pointer;
    color:var(--text-3);font-size:14px;line-height:1}
  .bk-x:hover{background:#F1F3F6;color:var(--text)}
  .bk-body{padding:14px 16px 2px;overflow:auto}
  .bk-sec{margin-bottom:15px}
  .bk-lb{display:flex;align-items:baseline;gap:8px;font-size:12.5px;font-weight:700;
    color:var(--text-2);margin-bottom:8px}
  .bk-lb-tip{font-weight:400;color:var(--text-3);font-size:11.5px;line-height:1.4}
  .bk-days{display:flex;gap:8px;flex-wrap:wrap}
  .bk-day{display:flex;flex-direction:column;align-items:center;gap:1px;min-width:66px;
    padding:7px 10px;border:1px solid var(--border);border-radius:9px;background:#fff;
    cursor:pointer;line-height:1.25;transition:border-color .12s,background .12s}
  .bk-day b{font-size:12.5px;font-weight:700;color:var(--text)}
  .bk-day i{font-style:normal;font-size:11px;color:var(--text-3)}
  .bk-day:hover{border-color:#F97316}
  .bk-day.on{background:#FFF3E4;border-color:#F97316}
  .bk-day.on b{color:#B45309}
  /* 时段表：按 15 分钟一档铺满，固定的最小宽度让人能「横着扫」找时间 */
  .bk-slots{display:grid;grid-template-columns:repeat(auto-fill,minmax(72px,1fr));gap:7px;
    max-height:236px;overflow:auto;padding-right:2px}
  .bk-slot{height:32px;border:1px solid var(--border);border-radius:7px;background:#fff;
    font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--text);cursor:pointer;
    transition:border-color .12s,background .12s,color .12s}
  .bk-slot:hover:not(.off){border-color:#F97316;color:#B45309}
  .bk-slot.on{background:#F97316;border-color:#F97316;color:#fff;font-weight:700}
  /* 已过点 / 来不及备货：画出来但点不动 —— 全藏掉会让人以为系统坏了 */
  .bk-slot.off{background:#F7F8FA;color:#C2C8D0;border-color:#EDEFF2;cursor:not-allowed;
    text-decoration:line-through}
  .bk-note{width:100%}
  .bk-foot{flex:none;display:flex;align-items:center;gap:10px;padding:12px 16px;
    border-top:1px solid var(--border);background:#FCFCFD}
  .bk-foot .spacer{flex:1}
  .bk-foot .bk-clear{color:#B42318;border-color:#F5A9A2;background:#FEF7F6}
  .bk-foot .bk-clear:hover{background:#FEF0EF}
  .bk-foot .btn{height:34px;padding:0 18px}

  .bg-prev{width:46px;height:46px;border-radius:8px;border:1px solid var(--border);background-size:cover;background-position:center;background-repeat:no-repeat;background-color:#EEF1F6;flex:none}
  .bg-clear-btn{height:38px;padding:0 14px;border:1px solid var(--border);background:#fff;border-radius:7px;font-size:12.5px;color:var(--text-2);cursor:pointer}
  .bg-clear-btn:hover{border-color:rgb(var(--primary-rgb) / .40)}
  .bg-row{display:flex;align-items:center;gap:12px;margin-bottom:12px}
  .bg-sub-label{width:72px;flex:none;font-size:13.5px;color:var(--text-2)}

  /* 登录页头像底色：取色器 + 预设色块 */
  .lpbg-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  .lpbg-row input[type=color]{
    width:32px;height:30px;padding:0;border:1px solid var(--border);border-radius:8px;
    background:#fff;cursor:pointer;flex:none;
  }
  .lpbg-presets{display:flex;gap:7px;align-items:center}
  .lpbg-presets button{
    width:28px;height:28px;border-radius:8px;border:1px solid rgba(15,23,42,.12);
    cursor:pointer;padding:0;transition:transform .12s ease,box-shadow .12s ease;
  }
  .lpbg-presets button:hover{transform:translateY(-1px)}
  .lpbg-presets button.on{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--primary)}
  body.theme-dark .lpbg-row input[type=color]{background:#2b2f3a;border-color:#3b4150}

  /* ---------- 登录页（版面参考有赞登录页：容器 948 / 卡片 550 / 侧栏 382 / 卡片高 520） ---------- */
  /* 底色用一层极浅的斜向渐变：登录框不再有自己的白底，靠这点冷暖差把右侧和左图分开 */
  /* 整页底：没配背景图时的兜底深青渐变（低调一点，配了图这层就完全被图盖住）。
     用户要的是「登录框背后那块白的去掉」——所以背景不能是浅色，
     白卡浮在深色上才立得住；浅底 + 白卡会糊成一整块白。 */
  .login-page{position:fixed;inset:0;z-index:9000;
    background:linear-gradient(150deg,#07242F 0%,#0B4E5E 58%,#0A6E86 100%);overflow:auto;display:none}
  .login-page.on{display:flex}
  /* 首帧（脚本执行前）由 <head> 内联脚本按登录标记决定显示什么，避免闪屏 */
  html.boot-anon .login-page{display:flex}
  html.boot-authed .login-page{display:none}
  html.boot-anon .layout,
  html.boot-authed .layout{display:none}

  /* 背景图铺满整屏。原来是塞在左面板里的（absolute inset:0 只覆盖左半），
     右栏就露出页面底色 —— 看起来就是「右边一块绿」。改成整页 fixed 层。
     有图才淡入：设置是异步拿的，先画渐变只会闪一下。 */
  .lp-page-bg{
    position:fixed;inset:0;z-index:0;
    background-size:cover;background-position:center;background-repeat:no-repeat;
    opacity:0;transition:opacity .35s ease;
  }
  .lp-page-bg.has{opacity:1}
  /* 压一层深色纱：换什么图都要保证左边白字读得清。
     左深右浅 —— 右边只有白卡，不需要压那么黑，否则图白铺了。 */
  .lp-page-veil{
    position:fixed;inset:0;z-index:0;pointer-events:none;
    background:linear-gradient(102deg,
      rgba(4,26,35,.92) 0%,rgba(4,26,35,.80) 34%,
      rgba(4,26,35,.52) 64%,rgba(4,26,35,.34) 100%);
  }

  /* 整页两栏：左边品牌面板吃掉剩余宽度，右边登录卡固定 674（卡 550 + 左右留白）。
     z-index 抬高，压在背景图与压暗层之上。 */
  .lp-inner{position:relative;z-index:1;display:flex;width:100%;min-height:100%;min-width:1120px}

  /* ---------- 左：品牌面板（背景交给整页的 .lp-page-bg，这里保持透明） ---------- */
  .lp-hero{
    position:relative;flex:1 1 auto;min-width:0;display:flex;overflow:hidden;
    background:transparent;
  }
  .lp-hero-in{
    position:relative;z-index:2;display:flex;flex-direction:column;justify-content:space-between;
    gap:40px;width:100%;min-height:100%;box-sizing:border-box;padding:52px 60px;color:#fff;
  }
  .lp-hero-top{display:flex;align-items:center;gap:14px}
  .lp-hero-id{display:flex;flex-direction:column;gap:4px;min-width:0}
  .lp-site{font-size:12.5px;color:rgba(255,255,255,.66);letter-spacing:.4px}
  .lp-hero-copy h1{margin:0;font-size:clamp(30px,2.4vw,42px);line-height:1.28;font-weight:800;letter-spacing:-.5px}
  .lp-hero-copy p{margin:18px 0 0;font-size:14.5px;line-height:1.85;color:rgba(255,255,255,.76);max-width:460px}
  .lp-feats{list-style:none;margin:30px 0 0;padding:0;display:flex;flex-direction:column;gap:12px}
  .lp-feats li{display:flex;align-items:center;gap:10px;font-size:14px;color:rgba(255,255,255,.88)}
  .lp-feats b{
    width:22px;height:22px;flex:none;border-radius:7px;background:rgba(255,255,255,.14);
    display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;
  }
  .lp-hero-foot{font-size:12.5px;color:rgba(255,255,255,.44);letter-spacing:.3px}

  /* 头像与背景都是「可被设置覆盖」的：未拿到设置前先不画，
     否则先看见默认「曹」，几百毫秒后被换成自定义图 —— 就是「刚打开和刷新后不一样」。
     由 boot 在设置就绪后给 .login-page 加 chrome-ready（最多等 1.5 秒兜底）。 */
  .lp-hero{opacity:0;transition:opacity .2s ease}
  .login-page.chrome-ready .lp-hero{opacity:1}

  .lp-logo{
    width:52px;height:52px;border-radius:15px;flex:none;
    display:flex;align-items:center;justify-content:center;
    color:#fff;font-weight:700;font-size:23px;letter-spacing:.5px;
    background-size:cover;background-position:center;
    background-image:linear-gradient(135deg,rgb(var(--primary-rgb) / .95),var(--primary-hover));
    box-shadow:0 10px 24px rgba(2,20,28,.32),inset 0 1px 0 rgba(255,255,255,.18);
  }
  .lp-name{font-size:17px;font-weight:700;color:#fff;letter-spacing:.2px}
  .lp-wrap{
    flex:0 0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;
    gap:18px;width:674px;padding:40px 62px;box-sizing:border-box;background:transparent;
  }
  /* 登录框：白底 + 圆角 + 细边 + 深投影，浮在整页深青渐变上。
     （2026-11-05 用户澄清：要去掉的是它**背后**那块白，不是它自己的白底） */
  .lp-lcard{
    width:550px;flex:none;box-sizing:border-box;position:relative;min-height:620px;
    display:flex;flex-direction:column;padding:44px 52px 34px;
    background:#fff;border-radius:18px;
    box-shadow:0 30px 70px rgba(2,20,28,.34),0 2px 8px rgba(2,20,28,.16);
  }
  /* align-items 用 flex-end（非 baseline）：标签盒子高度固定后，字号变化不会推动彼此 */
  .lp-head{display:flex;align-items:flex-end;color:#98A1AF;font-size:16px;padding-bottom:26px}
  /* 标签盒子宽高固定（按激活态 26px 字号预留），激活时文字在固定盒子内放大，自身与相邻标签都不位移 */
  .lp-tab{
    cursor:pointer;margin-right:22px;white-space:nowrap;user-select:none;flex:none;
    height:30px;display:inline-flex;align-items:flex-end;
    transition:font-size .16s ease,color .16s ease;
  }
  .lp-tab.t4{width:84px}
  .lp-tab.t5{width:104px}
  .lp-tab.t6{width:86px}
  /* 登录方式开关：class 由 <head> 内联脚本按本地缓存先打上（见 index.html），
     被禁用的 tab 首帧就不画 —— 否则刷新时会先闪出来再被 JS 藏掉。
     设置拉到之后 applyLoginMethods() 会增删这几个 class，CSS 只认 class，不认内联样式，
     这样"改设置 → 重新打开"两边不会打架。 */
  html.lm-no-pwd #ltPwd,
  html.lm-no-code #ltCode,
  html.lm-no-wx #ltWx{display:none}
  .lp-tab:last-child{margin-right:0}
  .lp-tab.on{color:#0F172A;font-size:20px;font-weight:700}

  .login-form.hidden{display:none}
  /* 两个登录表单叠放：容器高度 = 两者最大值，切换时下方内容不位移。
     align-content 必须是 start —— 用 center 时表单会被推到容器中部，
     标题下面凭空多出一大片空白，看着像页面没加载完（2026-11-05 用户反馈）。 */
  .lp-forms{display:grid;flex:0 0 auto;min-height:200px;align-content:start}
  .lp-forms > .login-form{grid-area:1 / 1;transition:opacity .16s ease}
  .lp-forms > .login-form.hidden{display:block;visibility:hidden;opacity:0;pointer-events:none}
  .li-row{position:relative;display:flex;align-items:center;gap:16px}
  .li-row + .li-row{margin-top:16px}
  .li-cc-wrap{width:140px;flex:none;height:48px;border-bottom:1px solid #DCDFE6;transition:.15s}
  .li-cc-wrap:focus-within{border-bottom-color:var(--primary)}
  .li-cc{
    width:100%;height:100%;border:0;background:transparent;outline:none;padding:0 8px 0 0;
    font-size:16px;color:#323232;cursor:pointer;font-family:inherit;
  }
  /* 白卡上的输入框：#F7F8FB 浅底 + 细边，白底白框会看不出边界 */
  .li-field{
    flex:1;min-width:0;display:flex;align-items:center;height:52px;padding:0 15px;
    background:#F7F8FB;border:1px solid #E5EAF2;border-radius:11px;
    transition:border-color .15s,background .15s,box-shadow .15s;
  }
  .li-field:focus-within{
    background:#fff;border-color:rgb(var(--primary-rgb) / .5);
    box-shadow:0 0 0 4px rgb(var(--primary-rgb) / .1);
  }
  .li-in{
    flex:1;min-width:0;height:100%;border:0;background:transparent;outline:none;
    font-size:15.5px;color:#323233;font-family:inherit;padding:0;
  }
  .li-in::placeholder{color:#C0C4CC}
  .li-row.has-link .li-in{padding-right:104px}
  .li-link{
    position:absolute;right:16px;top:50%;transform:translateY(-50%);font-size:14px;color:var(--primary);
    cursor:pointer;white-space:nowrap;user-select:none;background:transparent;padding-left:10px;
  }
  .li-link.dis{color:#969799;cursor:not-allowed}

  /* 错误提示永久预留一行高度（visibility 占位而非 display:none），\n     报错出现/消失时表单内容高度恒定，登录按钮位置不再跳动 */
  .li-err{visibility:hidden;min-height:21px;margin-top:12px;font-size:13.5px;color:#D40000;line-height:1.5}
  .li-err.show{visibility:visible}
  .li-hint{font-size:13px;color:#98A1AF;margin-top:16px;line-height:1.65}
  .li-hint a{color:var(--primary);cursor:pointer;text-decoration:none}
  .li-hint a:hover{text-decoration:underline}
  /* 620 高的框里内容只有 480 出头：把「帮助说明」贴到底部当页脚，
     空白就有了归属，不会像中间缺了一块。 */
  .li-foot{
    margin-top:auto;padding-top:18px;
    border-top:1px solid #E1E6EE;font-size:12px;color:#8E97A6;line-height:1.6;
  }
  .li-checks{padding-top:0;margin-top:6px}
  .li-check{display:flex;align-items:center;gap:8px;font-size:14px;color:#4B5563;
    cursor:pointer;user-select:none}
  .li-check input{width:15px;height:15px;margin:0;accent-color:var(--primary);cursor:pointer;flex:none}
  .li-submit{
    flex:none;width:100%;height:52px;margin-top:16px;border:0;border-radius:11px;background:var(--primary);color:#fff;
    font-size:16px;font-weight:600;letter-spacing:.5px;cursor:pointer;transition:.15s;font-family:inherit;
    box-shadow:0 8px 20px rgb(var(--primary-rgb) / .28);
  }
  .li-submit:hover{background:var(--primary-hover)}
  .li-submit:disabled,
  .li-submit.is-off{background:#C8CAD0;color:#fff;cursor:not-allowed}
  /* 提交中：明确的活动态（主色 + 半透明 + 等待光标），不再复用 is-off 的灰色禁用外观 */
  .li-submit.is-loading{background:var(--primary);color:#fff;cursor:wait;opacity:.78}
  .li-submit.is-loading:hover{background:var(--primary)}
  /* 加载态小圆点动画，提示「正在登录」而非「按钮坏了」 */
  .li-submit.is-loading::after{
    content:'';display:inline-block;width:14px;height:14px;margin-left:10px;vertical-align:-2px;
    border:2px solid rgba(255,255,255,.45);border-top-color:#fff;border-radius:50%;
    animation:li-spin .7s linear infinite;
  }
  @keyframes li-spin{to{transform:rotate(360deg)}}

  /* ---------- 微信扫码登录 ----------
     二维码由微信官方 SDK 内嵌 iframe（固定 300×400）。
     卡片高度已经按它统一成 636（三种方式一样高），所以这里不再单独加高，
     只把两个输入表单让出来，并让扫码区吃掉剩余高度。 */
  .lp-lcard.mode-wx .lp-forms{display:none}
  /* 表单藏起来后内容会全挤在顶部，让扫码区吃掉剩余高度并垂直居中 */
  .lp-lcard.mode-wx #formWx{display:flex;flex-direction:column;justify-content:center;flex:1 1 auto}
  .lp-lcard.mode-wx .li-foot{display:none}
  .lp-lcard.mode-wx.has-qr #formWx{justify-content:center}
  .lp-lcard.mode-wx .li-checks,
  .lp-lcard.mode-wx .li-submit{display:none}
  /* 扫码态没有表单校验，那 21px 的占位留着只会把卡片顶高 6px，
     切换标签时整张卡往上跳一下 —— 这里一并收掉 */
  .lp-lcard.mode-wx .li-err{display:none}
  /* 扫码区：微信官方 iframe 是固定 300×400，卡高 620 里正好放得下。
     align-items 必须是 flex-start —— 用 center 时 400 高的 iframe 会在
     容器里上下各溢 34px，再被 overflow:hidden 一裁，二维码顶边就被切掉一条
     （用户看到的「排版异常」就是这个）。所以既不缩放也不裁切。 */
  .lp-qr{
    width:300px;height:400px;margin:0 auto;position:relative;
    display:flex;align-items:flex-start;justify-content:center;
  }
  .lp-qr iframe{width:300px !important;height:400px !important;border:0;display:block;background:#fff}
  .lp-lcard.mode-wx .lp-qr{height:400px}
  /* 没有二维码（未配置/加载失败）时不要留 400px 空白，提示自己居中。
     第二条是为了盖过上面 .mode-wx 的固定高度（那条权重更高）。 */
  .lp-qr.is-empty{height:auto;min-height:88px;padding:18px 0}
  .lp-lcard.mode-wx .lp-qr.is-empty{height:auto;min-height:88px;overflow:visible}
  .lp-qr-ph{font-size:14px;color:#969799;text-align:center;line-height:1.7}
  .lp-qr-tip{margin-top:10px;text-align:center;font-size:15px;color:#323233}
  .lp-qr-tip.bad{color:#C0392B}
  .lp-qr-sub{margin-top:8px;text-align:center;font-size:13px;color:#969799;line-height:1.6}
  .lp-qr-sub a{color:var(--primary);cursor:pointer;text-decoration:none}
  .lp-qr-sub a:hover{text-decoration:underline}
  /* 已扫码、等手机确认时的轻提示 */
  .lp-qr-wait{
    position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
    gap:10px;background:rgba(255,255,255,.94);border-radius:10px;font-size:14px;color:#323233;
  }
  .lp-qr-wait .dot{width:9px;height:9px;border-radius:50%;background:var(--primary);animation:li-spin 1s linear infinite}

  /* ---------- 个人设置 · 绑定微信弹窗 ---------- */
  .wxscan-mask{
    position:fixed;inset:0;background:rgba(15,23,42,.45);display:flex;align-items:center;justify-content:center;
    z-index:3200;padding:20px;box-sizing:border-box;
  }
  /* 扫码确认框：高度按「二维码态」定死（300×400 的 iframe + 说明 + 按钮），
     密码态内容少就留白，不会先小后大跳一下 */
  .wxscan-dlg{
    width:392px;height:min(620px,88vh);max-width:100%;overflow-y:auto;overscroll-behavior:contain;
    background:#fff;border-radius:14px;padding:22px 22px 18px;
    box-shadow:0 18px 50px rgba(15,23,42,.22);box-sizing:border-box;
  }
  .wxscan-dlg h4{margin:0 0 6px;font-size:17px;color:#1f2937}
  .wxscan-dlg .ws-sub{margin:0 0 16px;font-size:13px;color:#6b7280;line-height:1.65}
  .wxscan-dlg .ws-in{
    width:100%;height:42px;border:1px solid #DCDFE6;border-radius:8px;padding:0 12px;
    font-size:14px;box-sizing:border-box;outline:none;font-family:inherit;
  }
  .wxscan-dlg .ws-in:focus{border-color:var(--primary)}
  .wxscan-dlg .ws-err{min-height:18px;margin-top:8px;font-size:13px;color:#C0392B;line-height:1.5}
  .wxscan-dlg .ws-qr{width:300px;height:400px;margin:0 auto;display:flex;align-items:center;justify-content:center;position:relative}
  .wxscan-dlg .ws-qr iframe{width:300px !important;height:400px !important;border:0}
  .wxscan-dlg .ws-btns{display:flex;gap:10px;justify-content:flex-end;margin-top:16px}
  .ws-btn{
    height:38px;padding:0 18px;border-radius:8px;border:1px solid #DCDFE6;background:#fff;color:#323233;
    font-size:14px;cursor:pointer;font-family:inherit;
  }
  .ws-btn:hover{border-color:#C0C4CC}
  .ws-btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}
  .ws-btn.primary:hover{background:var(--primary-hover);border-color:var(--primary-hover)}
  .ws-btn[disabled]{opacity:.6;cursor:not-allowed}
  body.dark .wxscan-dlg{background:#23262F;color:#e5e7eb}
  body.dark .wxscan-dlg h4{color:#f3f4f6}
  body.dark .wxscan-dlg .ws-in{background:#2b2f3a;border-color:#3b4150;color:#e5e7eb}
  body.dark .ws-btn{background:#2b2f3a;border-color:#3b4150;color:#e5e7eb}
  /* 个人设置 · 微信绑定状态行 */
  .pp-wx{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
  .pp-wx-state{font-size:13px;color:#969799}
  .pp-wx-state.on{color:#059669}


  /* 版权：宽屏放在左面板底部（.lp-hero-foot），窄屏才落到卡片下面 */
  .lp-foot{display:none;text-align:center;font-size:12.5px;color:rgba(255,255,255,.55)}
  .ad-prev{
    width:86px;height:112px;border-radius:8px;border:1px solid var(--border);flex:none;
    background-size:cover;background-position:center;background-color:#F1F2F6;
  }
  @media (max-width:1200px){
    .lp-inner{min-width:0}
    .lp-hero{display:none}
    /* 只剩一张卡居中：纱改成上下均匀，否则左边黑右边亮，像压了一半 */
    .lp-page-veil{background:linear-gradient(180deg,rgba(4,26,35,.74) 0%,rgba(4,26,35,.62) 100%)}
    .lp-wrap{width:100%;padding:32px 24px;box-sizing:border-box;background:transparent}
    .lp-lcard{width:100%;max-width:550px;margin:0 auto}
    .lp-foot{display:block}
  }

  /* 矮屏（投影 / 笔记本半屏 / 系统缩放放大后）：
     620 的固定高度会把「登录」按钮顶到可视区外，这时候优先保证一屏能看全，
     宁可让三种模式的高度略有差异 —— 看不见按钮比切换时移一下严重得多。 */
  @media (max-height:760px){
    .lp-wrap{padding-top:24px;padding-bottom:24px}
    .lp-lcard{min-height:540px;padding:32px 52px 26px}
    .lp-forms{min-height:170px}
  }
  @media (max-height:620px){
    .lp-wrap{padding-top:16px;padding-bottom:16px}
    .lp-lcard{min-height:0}
    .lp-forms{min-height:0}
  }

  /* ---------- 暗夜模式 ---------- */
  body.theme-dark{
    --bg:#15161A; --panel:#1E2027; --border:#2C2F38; --input-border:#3A3F4F;
    --bg-2:#23262E;                    /* 比 panel 再亮一档，开关行才有一层"框"的感觉 */
    --ok:#34D399;
    --danger:#F87171;
    --text:#E9EBF2; --text-2:#A9AFC0; --text-3:#717784;
    /* 兜底值：正常情况下由 body.accent-* 覆盖 */
    --primary:#A78BFA;                 /* 暗色下提亮主色，保证文字可读 */
    --primary-rgb:167 139 250;
    --primary-soft:rgb(var(--primary-rgb) / .18);
    --primary-hover:#C4B5FD;
  }
  /* 暗色下二级菜单选中态：主色实心胶囊，与一级菜单同语言 */
  body.theme-dark .sub-item{color:var(--text-2)}
  body.theme-dark .sub-ico{background:rgba(255,255,255,.08)}
  body.theme-dark .sub-item:hover{background:rgba(255,255,255,.07);color:var(--text)}
  body.theme-dark .sub-item:hover .sub-ico{background:rgb(var(--primary-rgb) / .22)}
  body.theme-dark .sub-item.active{
    background:linear-gradient(135deg, var(--primary), var(--primary-hover));
    color:#1B1530;font-weight:700;
    box-shadow:0 6px 14px rgb(var(--primary-rgb) / .35);
  }
  body.theme-dark .sub-item.active .sub-ico{background:rgba(27,21,48,.16)}
  body.theme-dark .nav-item.active{
    background:var(--primary);color:#1B1530;font-weight:700;
    box-shadow:0 6px 16px rgb(var(--primary-rgb) / .40);
  }

  /* ---------- 主题配色（主色调） ---------- */
  /* 浅色：主色 / 主色 RGB / 悬浮态 / 柔和底色 */
  body.accent-purple{--primary:#7C3AED;--primary-rgb:124 58 237;  --primary-hover:#6D28D9;--primary-soft:rgb(var(--primary-rgb) / .10)}
  body.accent-blue  {--primary:#2563EB;--primary-rgb:37 99 235;   --primary-hover:#1D4ED8;--primary-soft:rgb(var(--primary-rgb) / .10)}
  body.accent-green {--primary:#16A34A;--primary-rgb:22 163 74;   --primary-hover:#15803D;--primary-soft:rgb(var(--primary-rgb) / .10)}
  body.accent-orange{--primary:#EA580C;--primary-rgb:234 88 12;   --primary-hover:#C2410C;--primary-soft:rgb(var(--primary-rgb) / .10)}
  body.accent-rose  {--primary:#E11D48;--primary-rgb:225 29 72;   --primary-hover:#BE123C;--primary-soft:rgb(var(--primary-rgb) / .10)}
  body.accent-cyan  {--primary:#0891B2;--primary-rgb:8 145 178;   --primary-hover:#0E7490;--primary-soft:rgb(var(--primary-rgb) / .10)}
  /* 暗夜：主色提亮，保证在深色背景上的可读性 */
  body.theme-dark.accent-purple{--primary:#A78BFA;--primary-rgb:167 139 250;--primary-hover:#C4B5FD;--primary-soft:rgb(var(--primary-rgb) / .18)}
  body.theme-dark.accent-blue  {--primary:#7DA6FB;--primary-rgb:125 166 251;--primary-hover:#A5C0FC;--primary-soft:rgb(var(--primary-rgb) / .18)}
  body.theme-dark.accent-green {--primary:#6EE7A8;--primary-rgb:110 231 168;--primary-hover:#9BF0C4;--primary-soft:rgb(var(--primary-rgb) / .18)}
  body.theme-dark.accent-orange{--primary:#FDBA74;--primary-rgb:253 186 116;--primary-hover:#FDD9AE;--primary-soft:rgb(var(--primary-rgb) / .18)}
  body.theme-dark.accent-rose  {--primary:#FB9CA8;--primary-rgb:251 156 168;--primary-hover:#FDC0C8;--primary-soft:rgb(var(--primary-rgb) / .18)}
  body.theme-dark.accent-cyan  {--primary:#67E8F9;--primary-rgb:103 232 249;--primary-hover:#A5F0FA;--primary-soft:rgb(var(--primary-rgb) / .18)}

  /* 主题配色选择器 */
  .accent-pick{display:flex;gap:10px;flex-wrap:wrap}
  .acc{
    display:inline-flex;align-items:center;gap:7px;height:34px;padding:0 13px 0 8px;
    border:1px solid var(--border);background:#fff;border-radius:17px;
    font-size:12.5px;color:var(--text-2);cursor:pointer;transition:.15s;font-family:inherit;
  }
  .acc:hover{border-color:rgb(var(--primary-rgb) / .40)}
  .acc i{width:18px;height:18px;border-radius:50%;background:var(--c);flex:none;display:block}
  .acc.sel{border-color:var(--c);color:var(--text);font-weight:600;box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .12)}
  body.theme-dark .acc{background:#23252E}
  /* 付款方式等 chip 原来写死白底，暗色下会亮成一排白条（收银台 14 个按钮尤其刺眼） */
  body.theme-dark .chip{background:#262932;border-color:var(--border)}
  body.theme-dark .sidebar,
  body.theme-dark .subbar-island{
    background:rgba(35,38,47,.78);
    border-color:rgba(255,255,255,.08);
    box-shadow:0 10px 30px rgba(0,0,0,.35);
  }
  body.theme-dark .setting-card,
  body.theme-dark .gcard{ border-color:var(--border); }
  body.theme-dark .nav-item:hover,
  body.theme-dark .sub-item:hover{ background:rgba(255,255,255,.06); }
  body.theme-dark .side-foot{ border-top-color:rgba(255,255,255,.08); }
  body.theme-dark .side-user:hover{ background:rgba(255,255,255,.06); }
  body.theme-dark .side-ava,
  body.theme-dark .side-ava-fb{ box-shadow:0 0 0 2px rgba(255,255,255,.10); }
  body.theme-dark .side-ava-fb{ background:#2C2F3A; color:#8B92A2; }
  body.theme-dark .skel-card,
  body.theme-dark .blank{ background:var(--panel); }
  body.theme-dark .po-table th{ background:#23252E; }
  body.theme-dark .field input[type=text],
  body.theme-dark .field input[type=password],
  body.theme-dark .field input[type=number],
  body.theme-dark .field input[type=tel],
  body.theme-dark .po-in,
  body.theme-dark select{ background:#1E2027; color:var(--text); }
  body.theme-dark .po-card{ background:rgba(40,42,52,.72); border-color:var(--border); box-shadow:none; }
  body.theme-dark .side-panel{ background:rgba(40,42,52,.72); border-color:var(--border); box-shadow:none; }
  body.theme-dark .tk-bar{ background:rgba(255,255,255,.10); }
  body.theme-dark .tk-rest{ color:#E8EAF0; }
  body.theme-dark .tk-over{ background:rgba(234,88,12,.22); color:#FF9E5E; }
  body.theme-dark .tk-row.is-over .tk-bar{ background:rgba(234,88,12,.16); }
  body.theme-dark .rk.gray .rk-ava{ background:#2C2F38; }
  body.theme-dark .po-foot{ background:rgba(40,42,52,.85); }
  body.theme-dark .btn{ background:#262932; color:var(--text-2); border-color:var(--border); }
  body.theme-dark .fav-opts .up,
  body.theme-dark .bg-clear-btn{ background:#262932; color:var(--text-2); border-color:var(--border); }
  body.theme-dark .btn:hover{ border-color:rgb(var(--primary-rgb) / .40); }
  body.theme-dark .btn.primary{ background:var(--primary); border-color:var(--primary); color:#fff; }
  body.theme-dark .po-foot{ border-color:rgba(255,255,255,.08); }
  body.theme-dark .seg{ background:rgba(255,255,255,.08); }
  body.theme-dark .seg-btn{ color:var(--text-2); }
  body.theme-dark .seg-btn.on{ background:#2E3140; color:#C9B8FF; }
  body.theme-dark .pp-note{ background:rgba(124,58,237,.14); border-color:rgba(124,58,237,.30); color:var(--text-2); }
  body.theme-dark .pp-note b{ color:#C9B8FF; }
  body.theme-dark .pp-state.is-personal{ color:#FF9E5E; }
  body.theme-dark .pp-reset{ background:#262932; color:var(--text-2); border-color:var(--border); }
  body.theme-dark .pp-reset:hover{ border-color:rgb(var(--primary-rgb) / .40); }

  /* ---------- 列表页（小程序订单 / 订单查询） ---------- */
  .lp-card{
    background:rgba(255,255,255,.72);
    -webkit-backdrop-filter:blur(14px) saturate(160%);
    backdrop-filter:blur(14px) saturate(160%);
    border:1px solid rgba(255,255,255,.6);border-radius:14px;
    box-shadow:0 8px 32px rgba(31,36,48,.12);
    width:100%;max-width:1000px;margin:0 auto;padding:16px 20px 20px;
  }
  body.theme-dark .lp-card{ background:rgba(40,42,52,.72); border-color:var(--border); box-shadow:none; }

  /* 自动发单运行中：卡片呼吸光晕 + 横向流光（仅抓单页开启自动发单时挂 .auto-working） */
  .lp-card.auto-working{
    border-color:rgba(22,163,74,.42);
    animation:lpBreath 3s ease-in-out infinite;
  }
  .lp-card.auto-working::after{
    content:'';position:absolute;inset:0;border-radius:14px;pointer-events:none;
    /* 窄条高光，横向扫过（不是整片绿色蒙版） */
    background:linear-gradient(104deg,
      rgba(255,255,255,0) 43%, rgba(34,197,94,.06) 47%,
      rgba(34,197,94,.16) 50%, rgba(34,197,94,.06) 53%, rgba(255,255,255,0) 57%);
    background-size:300% 100%;background-repeat:no-repeat;
    animation:lpSweep 3.4s linear infinite;
  }
  .lp-card.auto-working::before{
    background:linear-gradient(90deg, #16A34A, rgba(34,197,94,.45) 55%, transparent);
    animation:lpBar 3s ease-in-out infinite;
  }
  @keyframes lpBreath{
    0%,100%{ box-shadow:0 8px 32px rgba(31,36,48,.12), 0 0 0 1px rgba(22,163,74,.16), 0 0 18px rgba(34,197,94,.18); }
    50%    { box-shadow:0 10px 36px rgba(31,36,48,.14), 0 0 0 1px rgba(22,163,74,.32), 0 0 34px rgba(34,197,94,.36); }
  }
  @keyframes lpSweep{ 0%{background-position:180% 0} 100%{background-position:-80% 0} }
  @keyframes lpBar{ 0%,100%{opacity:.55} 50%{opacity:1} }
  body.theme-dark .lp-card.auto-working{
    box-shadow:0 0 0 1px rgba(34,197,94,.24), 0 0 26px rgba(34,197,94,.22);
    animation:lpBreathDark 3s ease-in-out infinite;
  }
  @keyframes lpBreathDark{
    0%,100%{ box-shadow:0 0 0 1px rgba(34,197,94,.18), 0 0 16px rgba(34,197,94,.16); }
    50%    { box-shadow:0 0 0 1px rgba(34,197,94,.34), 0 0 32px rgba(34,197,94,.32); }
  }
  @media (prefers-reduced-motion: reduce){
    .lp-card.auto-working,
    .lp-card.auto-working::after,
    .lp-card.auto-working::before{ animation:none; }
  }

  /* 顶部指标条 */
  .lp-kpis{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:14px}
  .kpi{
    flex:1;min-width:120px;border-radius:10px;padding:10px 14px;
    border:1px solid var(--border);background:#fff;cursor:pointer;transition:.15s;
  }
  .kpi:hover{border-color:rgb(var(--primary-rgb) / .40);transform:translateY(-1px)}
  .kpi.on{border-color:var(--primary);background:var(--primary-soft)}
  .kpi .k{font-size:12px;color:var(--text-2);margin-bottom:3px}
  .kpi .v{font-size:19px;font-weight:700;color:var(--text);line-height:1.25}
  .kpi .v small{font-size:12px;font-weight:500;color:var(--text-3);margin-left:3px}
  .kpi.on .v{color:var(--primary)}
  body.theme-dark .kpi{background:#23252E}

  /* 筛选栏 */
  .lp-filter{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
  .lp-filter .po-in{max-width:200px}
  .lp-filter .grow{flex:1;min-width:220px;max-width:none}
  .lp-filter .seg{display:inline-flex;background:rgba(120,130,150,.10);border-radius:8px;padding:3px}
  .lp-filter .seg button{
    height:28px;padding:0 13px;border:0;background:transparent;border-radius:6px;
    font-size:12.5px;color:var(--text-2);cursor:pointer;font-family:inherit;transition:.15s;
  }
  .lp-filter .seg button.on{background:#fff;color:var(--primary);font-weight:600;box-shadow:0 1px 3px rgba(20,24,35,.10)}
  body.theme-dark .lp-filter .seg button.on{background:#2E3140}
  .btn.sm{height:38px;padding:0 14px;font-size:12.5px}

  /* ===== 统一行内操作按钮：全站胶囊样式（编辑/查看/删除/上架/下架） =====
     用法：<button class="act-btn act-edit|act-view|act-del|act-up|act-down">，全站一致 */
  .act-btn{
    display:inline-flex;align-items:center;justify-content:center;
    height:26px;padding:0 13px;border-radius:999px;
    font-size:12px;line-height:1;font-family:inherit;cursor:pointer;
    border:1px solid transparent;white-space:nowrap;
    transition:background .15s,border-color .15s,color .15s;
  }
  .act-btn + .act-btn{margin-left:6px}
  .act-edit{background:rgb(var(--primary-rgb) / .10);border-color:rgb(var(--primary-rgb) / .30);color:var(--primary)}
  .act-edit:hover{background:rgb(var(--primary-rgb) / .18)}
  .act-view{background:#F4F5F9;border-color:var(--border);color:var(--text-2)}
  .act-view:hover{background:#EBEDF3;color:var(--text-1)}
  .act-del{background:rgba(229,72,77,.08);border-color:rgba(229,72,77,.30);color:#E5484D}
  .act-del:hover{background:rgba(229,72,77,.15)}
  .act-up{background:rgba(14,159,110,.08);border-color:rgba(14,159,110,.30);color:#0E9F6E}
  .act-up:hover{background:rgba(14,159,110,.15)}
  .act-down{background:rgba(226,135,67,.08);border-color:rgba(226,135,67,.32);color:#CC7635}
  .act-down:hover{background:rgba(226,135,67,.15)}
  /* 再次购买：浅蓝胶囊（匹配购买记录弹窗） */
  .act-buy{background:rgba(59,130,246,.08);border-color:rgba(59,130,246,.32);color:#2563EB}
  .act-buy:hover{background:rgba(59,130,246,.16)}
  .act-btn[disabled]{opacity:.45;cursor:not-allowed}
  .act-btn[disabled]:hover{background:inherit}
  body.theme-dark .act-view{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.14);color:var(--text-2)}
  body.theme-dark .act-view:hover{background:rgba(255,255,255,.10);color:var(--text-1)}
  body.theme-dark .act-del{background:rgba(229,72,77,.14);border-color:rgba(229,72,77,.32)}
  body.theme-dark .act-del:hover{background:rgba(229,72,77,.22)}

  /* ---------------- 购买记录（手风琴折叠） ---------------- */
  .po-acc-sum{font-size:12.5px;color:var(--text-3);white-space:nowrap;margin-right:6px}

  .ph-inline{margin:4px 0 14px;border:1px solid var(--border);border-radius:10px;background:#fff;overflow:hidden}
  .ph{display:flex;flex-direction:column}
  .ph-head{flex:none;display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--border);font-size:14px;font-weight:700;color:var(--text)}
  /* 表格自己滚：以前这里是空数据，面板永远只有一行「暂无购买记录」；
     现在真有 100 多条明细，50 条/页时整页会被拉成一条长龙，把下面的商品清单顶出屏幕。
     固定高度 + 表头吸顶，翻页/条数怎么改版面都不动。 */
  .ph-body{flex:1;padding:0;max-height:360px;overflow:auto}
  .ph-table{width:100%;border-collapse:collapse;font-size:13px}
  .ph-table th{position:sticky;top:0;z-index:1;background:#FAFAFC;color:var(--text-3);font-weight:500;text-align:left;padding:9px 12px;border-bottom:1px solid var(--border);white-space:nowrap}
  .ph-table td{padding:9px 12px;border-bottom:1px solid #F0F1F5;color:var(--text);vertical-align:middle;white-space:nowrap}
  .ph-table td.ph-name{max-width:300px;overflow:hidden;text-overflow:ellipsis}
  .ph-table .ph-num{text-align:right;font-variant-numeric:tabular-nums}
  /* 赠品小标：历史行里赠品是 0 元，光看金额容易以为「这单怎么不要钱」 */
  .ph-gift{display:inline-block;margin-left:6px;padding:0 5px;border-radius:4px;background:rgba(255,163,51,.16);color:#B26A00;font-style:normal;font-size:11px;line-height:16px;vertical-align:middle}
  .ph-table tr:hover td{background:#FAFBFF}
  .ph-foot{flex:none;display:flex;align-items:center;gap:12px;padding:10px 16px;border-top:1px solid var(--border);flex-wrap:wrap}
  .ph-count{font-size:12.5px;color:var(--text-3);white-space:nowrap}
  .ph-pager{display:flex;align-items:center;gap:6px;margin-left:auto;flex-wrap:wrap}
  .ph-pager select{height:28px;border:1px solid var(--border);border-radius:6px;background:#fff;font-size:12.5px;color:var(--text);padding:0 4px}
  .ph-pg{min-width:28px;height:28px;padding:0 6px;border:1px solid var(--border);background:#fff;border-radius:6px;font-size:12.5px;color:var(--text-2);cursor:pointer;line-height:1}
  .ph-pg:hover{border-color:rgb(var(--primary-rgb) / .45);color:var(--primary)}
  .ph-pg.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
  .ph-pg[disabled]{opacity:.4;cursor:not-allowed}
  .ph-go{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;color:var(--text-3)}
  .ph-go input{width:48px;height:28px;border:1px solid var(--border);border-radius:6px;text-align:center;font-size:12.5px;color:var(--text);background:#fff}
  body.theme-dark .ph{background:#262833}
  body.theme-dark .ph-head{border-color:rgba(255,255,255,.14);color:var(--text)}
  body.theme-dark .ph-table th{background:#2C2F3A;color:var(--text-2)}
  body.theme-dark .ph-table td{border-color:rgba(255,255,255,.08)}
  body.theme-dark .ph-table tr:hover td{background:rgba(255,255,255,.03)}
  body.theme-dark .ph-gift{background:rgba(255,163,51,.22);color:#F0B45E}
  body.theme-dark .ph-foot{border-color:rgba(255,255,255,.14)}
  body.theme-dark .ph-pager select,body.theme-dark .ph-pg,body.theme-dark .ph-go input{background:#2E323E;border-color:rgba(255,255,255,.18);color:var(--text)}

  /* ---------------- 自动发单卡单提醒（2026-11-10） ----------------
     常驻在电话接单页 / 抓单页顶部：单子卡住了要一直看得见，
     每 30 秒铃声 + 边框脉冲一次，直到这单真发出去。 */
  .stuck-bar{
    position:sticky;top:0;z-index:6;
    margin:0 0 12px;padding:12px 14px 10px;
    border:1px solid rgba(192,57,43,.42);border-left-width:4px;border-radius:12px;
    background:rgba(255,247,237,.98);
    box-shadow:0 4px 14px rgba(192,57,43,.10);
  }
  .stuck-bar[hidden]{display:none}
  .stuck-bar.is-ring{animation:stuck-ring .9s ease}
  @keyframes stuck-ring{
    0%,100%{box-shadow:0 4px 14px rgba(192,57,43,.10)}
    35%{box-shadow:0 0 0 4px rgba(192,57,43,.18),0 6px 20px rgba(192,57,43,.24)}
  }
  .stuck-hd{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  .stuck-ico{font-size:15px;line-height:1;color:#C0392B}
  .stuck-hd b{font-size:13.5px;color:#8E2F22}
  .stuck-tip{font-size:11.5px;color:#A9695C}
  .stuck-mute{
    margin-left:auto;height:24px;padding:0 9px;border:1px solid rgba(192,57,43,.3);
    border-radius:7px;background:transparent;color:#8E2F22;font-size:12px;
    font-family:inherit;cursor:pointer;transition:.15s;white-space:nowrap;
  }
  .stuck-mute:hover{background:rgba(192,57,43,.08)}
  .stuck-list{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}
  .stuck-list li{
    display:flex;align-items:center;gap:10px;flex-wrap:wrap;
    padding:6px 10px;border-radius:9px;background:rgba(255,255,255,.72);
    font-size:12px;color:var(--text-2);
  }
  .stuck-no{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600;color:var(--text)}
  .stuck-who{color:var(--text-2)}
  .stuck-addr{
    color:var(--text-3);max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .stuck-why{color:#B4462F}
  .stuck-go{
    margin-left:auto;height:24px;padding:0 10px;border:1px solid rgba(192,57,43,.42);
    border-radius:7px;background:#C0392B;color:#fff;font-size:12px;font-family:inherit;
    cursor:pointer;transition:.15s;white-space:nowrap;
  }
  .stuck-go:hover{background:#A93226}
  .stuck-list li.stuck-more{background:transparent;color:#A9695C;font-size:11.5px;padding:2px 10px}

  body.theme-dark .stuck-bar{background:rgba(66,33,30,.97);border-color:rgba(224,122,110,.5)}
  body.theme-dark .stuck-hd b{color:#F0A79B}
  body.theme-dark .stuck-tip{color:#C58F86}
  body.theme-dark .stuck-ico{color:#E07A6E}
  body.theme-dark .stuck-mute{color:#F0A79B;border-color:rgba(224,122,110,.4)}
  body.theme-dark .stuck-list li{background:rgba(255,255,255,.05)}
  body.theme-dark .stuck-why{color:#F09A86}
  body.theme-dark .stuck-go{background:#B4392C;border-color:rgba(224,122,110,.5)}

  /* ---------------- 抓单分发 ---------------- */
  .grab-wrap{display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap}
  .grab-main{flex:1;min-width:560px;padding:16px 18px}
  .grab-side{width:300px;flex:none;display:flex;flex-direction:column;gap:14px}
  .grab-steps{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap}
  .gstep{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--text-3);font-weight:600}
  .gstep i{width:20px;height:20px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:var(--border);color:var(--text-2);font-style:normal;font-size:12px}
  .gstep.on{color:var(--primary)}
  .gstep.on i{background:var(--primary);color:#fff}
  .gstep-arrow{color:var(--text-3)}
  .grab-fetch{padding:26px 0 10px;text-align:center}
  .grab-fetch .btn.primary{font-size:15px;padding:10px 28px;border-radius:999px}
  .grab-fetch-hint{margin-top:12px;font-size:13px;color:var(--text-3);line-height:1.7}
  .grab-nomore{margin-top:12px;font-size:13px;color:#CC7635;background:rgba(226,135,67,.08);border:1px solid rgba(226,135,67,.25);border-radius:8px;padding:8px 14px;display:inline-block}
  /* display:inline-block 会盖掉 UA 的 [hidden]（display:none），
     「暂无新的待发订单」就会一直挂在那儿 —— 取回订单后也消不掉 */
  .grab-nomore[hidden]{display:none}
  .grab-manual{margin-top:16px;border-top:1px dashed var(--border);padding-top:14px;text-align:left}
  .grab-manual .gd-row{justify-content:flex-start}
  .grab-manual .gd-row input{min-width:280px}
  .grab-manual-hint{margin-top:8px;font-size:12.5px;color:var(--text-3)}
  .gd-map{margin-top:14px;border:1px solid var(--border);border-radius:10px;overflow:hidden;background:#fff}
  .gd-map-title{display:flex;align-items:center;gap:8px;padding:9px 14px;font-size:13px;font-weight:700;color:var(--text);border-bottom:1px solid var(--border)}
  .gd-map-mode{margin-left:auto;font-size:11.5px;font-weight:600;color:var(--primary);background:rgb(var(--primary-rgb) / .10);padding:1px 9px;border-radius:999px}
  #gMap{height:320px}
  #gMapSvg svg{display:block;width:100%;height:auto}
  body.theme-dark .gd-map{background:#262833;border-color:rgba(255,255,255,.14)}
  body.theme-dark .gd-map-title{border-color:rgba(255,255,255,.14)}
  .grab-empty{padding:30px 0;text-align:center;color:var(--text-3);font-size:14px}
  .grab-empty .ico{font-size:30px;display:block;margin-bottom:8px}
  .grab-ohead{display:flex;align-items:center;gap:10px;padding-bottom:10px;border-bottom:1px solid var(--border);margin-bottom:12px;flex-wrap:wrap}
  .grab-badge{background:rgb(var(--primary-rgb) / .10);color:var(--primary);font-size:12px;font-weight:600;padding:2px 10px;border-radius:999px}
  .grab-ohead .mono{font-size:15px;font-weight:700;color:var(--text)}
  .grab-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px 16px;margin-bottom:14px}
  .grab-grid .gi.wide{grid-column:span 3}
  .grab-grid label{display:block;font-size:12px;color:var(--text-3);margin-bottom:2px}
  .grab-grid b{font-size:13.5px;font-weight:500;color:var(--text);word-break:break-all}
  .grab-grid .gi-note textarea.g-note{width:100%;min-height:48px;resize:vertical;line-height:1.5;font-family:inherit;font-size:13.5px}
  .grab-table{width:100%;border-collapse:separate;border-spacing:0;font-size:13.5px;margin-bottom:0;background:#FAFBFD;border:1px solid var(--border)}
  .grab-table th{background:#EEF2F8;color:#4A5568;font-weight:600;text-align:left;padding:10px 14px;border-bottom:1px solid var(--border);white-space:nowrap}
  .grab-table th:first-child{border-top-left-radius:10px}
  .grab-table th:last-child{border-top-right-radius:10px}
  .grab-table td{padding:12px 14px;border-bottom:1px solid #ECEFF5;color:var(--text);white-space:normal}
  .grab-table tbody tr:nth-child(even) td{background:#F5F7FB}
  .grab-table tbody tr:hover td{background:rgb(var(--primary-rgb) / .06)}
  .grab-table tbody tr:last-child td{border-bottom:none}
  .grab-table tbody tr:last-child td:first-child{border-bottom-left-radius:10px}
  .grab-table tbody tr:last-child td:last-child{border-bottom-right-radius:10px}
  .grab-table td:first-child{font-weight:500}
  .grab-table .num{text-align:right;font-variant-numeric:tabular-nums}
  .grab-table .num:not(:first-child){color:#37455C}
  .grab-total{display:flex;justify-content:flex-end;align-items:baseline;gap:8px;font-size:13.5px;color:var(--text-2);padding:12px 14px;background:#FAFBFD;border:1px solid var(--border);border-top:none;border-radius:0 0 10px 10px}
  .grab-total b{font-size:20px;color:#E5484D;font-weight:700}
  /* 过单明细：商城编码展开成本站商品后的「仓库视角」 */
  .grab-pass{margin-top:12px;border:1px solid var(--border);border-radius:10px;overflow:hidden}
  .grab-pass-h{
    display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 14px;
    font-size:12.5px;font-weight:700;color:var(--text);
    background:rgb(var(--primary-rgb) / .05);border-bottom:1px solid var(--border);
  }
  .grab-pass-h span{font-size:11.5px;font-weight:400;color:var(--text-3)}
  .grab-pass-body{display:flex;flex-wrap:wrap;gap:6px;padding:11px 14px;background:var(--panel)}
  .grab-pill{
    display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:999px;
    background:rgba(120,130,150,.1);font-size:12px;color:var(--text);
  }
  .grab-pill b{font-weight:700}
  .grab-pill i{
    font-style:normal;font-size:10.5px;font-weight:700;color:#fff;background:#CC7635;
    border-radius:4px;padding:0 4px;margin-right:2px;
  }
  .grab-pill.is-gift{background:rgba(204,118,53,.12);color:#A85E27}
  .grab-dispatch{margin-top:14px;border-top:1px dashed var(--border);padding-top:14px}
  .gd-title{font-size:13.5px;font-weight:700;color:var(--text);margin-bottom:8px}
  .gd-reco{display:flex;align-items:center;gap:10px;background:rgb(var(--primary-rgb) / .06);border:1px solid rgb(var(--primary-rgb) / .25);border-radius:8px;padding:9px 12px;margin-bottom:10px;flex-wrap:wrap}
  .gd-star{font-size:12.5px;font-weight:700;color:var(--primary);white-space:nowrap}
  .gd-star.warn{color:#CC7635}
  .gd-reco b{font-size:13.5px;color:var(--text)}
  .gd-why{font-size:12.5px;color:var(--text-3)}
  .gd-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
  .gd-row select{min-width:240px}
  .grq-card{padding:14px 16px}
  .grq-head{display:flex;align-items:center;font-size:14px;font-weight:700;color:var(--text);margin-bottom:10px}
  .grq-count{margin-left:auto;background:rgb(var(--primary-rgb) / .10);color:var(--primary);font-size:12px;font-weight:600;padding:1px 9px;border-radius:999px}
  .grq-list{display:flex;flex-direction:column;gap:6px;max-height:300px;overflow-y:auto}
  .grq-row{display:flex;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;cursor:pointer;transition:border-color .15s ease,background .15s ease}
  .grq-row:hover{border-color:rgb(var(--primary-rgb) / .45);background:rgb(var(--primary-rgb) / .04)}
  .grq-row.done{cursor:default;flex-direction:column;align-items:stretch;gap:3px}
  .grq-row.done:hover{border-color:var(--border);background:none}
  .grq-l1{display:flex;align-items:center;gap:8px}
  .grq-l1 em{margin-left:auto;font-style:normal;color:var(--text);font-variant-numeric:tabular-nums;font-weight:600}
  .grq-l2{display:flex;gap:10px;font-size:12px;color:var(--text-3);white-space:nowrap;overflow:hidden}
  .grq-l2 span{flex:none;overflow:hidden;text-overflow:ellipsis}
  .grq-row b{font-size:12px;color:var(--text)}
  .grq-row span{flex:1;min-width:0;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .grq-row em{font-style:normal;color:var(--text);font-variant-numeric:tabular-nums}
  .grq-mode{font-style:normal;font-size:11px;font-weight:600;padding:1px 7px;border-radius:999px;white-space:nowrap}
  .grq-mode.auto{background:rgba(46,164,79,.12);color:#2EA44F}
  .grq-mode.man{background:rgba(226,135,67,.14);color:#CC7635}
  .grq-empty{font-size:12.5px;color:var(--text-3);text-align:center;padding:14px 0}
  body.theme-dark .grab-table th{background:rgba(255,255,255,.04);color:var(--text-2)}
  body.theme-dark .grab-table td{border-color:rgba(255,255,255,.08)}
  body.theme-dark .gd-reco{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.18)}
  body.theme-dark .grq-row{border-color:rgba(255,255,255,.14)}

  /* 表格 */
  .lp-table-wrap{overflow-x:auto;border-radius:10px;border:1px solid var(--border)}
  /* 横向滚动条：6px + 25% 灰几乎看不见，用户不知道表格右边还有内容（操作列常常就在那儿）。
     加高到 8px 并加深，滚动条本身就成了「这里还能往右滑」的提示。 */
  .lp-table-wrap::-webkit-scrollbar{height:8px}
  .lp-table-wrap::-webkit-scrollbar-track{background:rgba(120,130,150,.06);border-radius:4px}
  .lp-table-wrap::-webkit-scrollbar-thumb{background:rgba(120,130,150,.42);border-radius:4px}
  .lp-table-wrap::-webkit-scrollbar-thumb:hover{background:rgba(120,130,150,.62)}
  .lp-table{width:100%;border-collapse:collapse;font-size:13px;min-width:880px}
  .lp-table th{
    background:#FAFAFC;color:var(--text-3);font-weight:500;text-align:left;
    padding:10px 12px;border-bottom:1px solid var(--border);font-size:12.5px;white-space:nowrap;
  }
  .lp-table td{padding:11px 12px;border-bottom:1px solid #F5F6FA;color:var(--text-2);white-space:nowrap}
  .lp-table tbody tr:last-child td{border-bottom:none}
  .lp-table tbody tr:hover{background:rgb(var(--primary-rgb) / .035)}
  body.theme-dark .lp-table th{background:#23252E}
  body.theme-dark .lp-table td{border-bottom-color:#262932}
  .lp-table .mono{font-family:"SF Mono",Menlo,Consolas,monospace;font-size:12.5px;color:var(--text)}
  .lp-table .amt{color:#E5484D;font-weight:700;font-size:13.5px}
  /* 文本操作按钮（编辑/删除/详情/移除等）：表格、角色列表、头像等处统一风格 */
  .op{color:var(--primary);cursor:pointer;font-size:12.5px;line-height:1;user-select:none;transition:opacity .15s}
  .op:hover{text-decoration:underline}
  .op:active{opacity:.65}
  .lp-table .op{margin-right:10px}
  .lp-table .mut{color:var(--text-3)}
  /* 操作列横滑时钉右：.is-pinned 由 core/table.js 在 scrollLeft>1 时挂上。
     列多的表（商品中心 14 列 / 销售任务 15 列）在窄窗口里按钮会被滑出视野，
     钉住之后滑到哪儿都能点。静止时不钉——否则会盖住相邻列（状态开关只露半截）。 */
  .lp-table-wrap.is-pinned .lp-table th:last-child,
  .lp-table-wrap.is-pinned .lp-table td:last-child{
    position:sticky;right:0;z-index:2;
    background:var(--panel);
    box-shadow:-14px 0 16px -14px rgba(31,36,48,.3);
  }
  .lp-table-wrap.is-pinned .lp-table th:last-child{background:#FAFAFC}
  body.theme-dark .lp-table-wrap.is-pinned .lp-table th:last-child{background:#23252E}

  /* 可排序表头（地址档案的「被使用」）：三段式 降序 → 升序 → 取消 */
  .lp-table th.adr-sort{cursor:pointer;user-select:none;transition:.15s}
  .lp-table th.adr-sort:hover{color:var(--primary)}
  .lp-table th.adr-sort.on{color:var(--primary);background:rgb(var(--primary-rgb) / .07)}
  .adr-arr{font-style:normal;font-size:9px;margin-left:3px;color:var(--primary)}

  /* 状态徽标 */
  .st{display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 9px;border-radius:11px;font-size:12px;border:1px solid transparent}
  .st i{width:5px;height:5px;border-radius:50%;background:currentColor;display:block}
  .st.wait{background:#FFF7E6;color:#B45309;border-color:#F7E3BC}
  .st.pick{background:#EEF4FE;color:#1D4ED8;border-color:#D3E2FB}
  .st.send{background:#F0EEFF;color:#6D28D9;border-color:#DDD5FB}
  .st.done{background:#EBF9F1;color:#0E9F6E;border-color:#C7EFDD}
  .st.cancel{background:#F5F6FA;color:#8A909E;border-color:#E7E9F0}
  .st.warn{background:#FEF1F1;color:#D9363E;border-color:#F8D6D7}

  /* 分页 */
  .lp-page{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:14px;flex-wrap:wrap}
  .lp-page .info{font-size:12.5px;color:var(--text-3)}
  .pager{display:flex;gap:6px;flex-wrap:wrap;max-width:100%;align-items:center}
  .pager .pg-dots{display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:28px;color:var(--text-3);font-size:12px;letter-spacing:1px;user-select:none}
  .pager button{
    min-width:30px;height:30px;padding:0 9px;border:1px solid var(--border);background:#fff;border-radius:7px;
    font-size:12.5px;color:var(--text-2);cursor:pointer;font-family:inherit;transition:.15s;
  }
  .pager button:hover{border-color:rgb(var(--primary-rgb) / .40);color:var(--primary)}
  .pager button.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
  body.theme-dark .pager button{background:#23252E}

  .lp-empty{text-align:center;padding:44px 0;color:var(--text-3);font-size:13px}
  .lp-empty .ico{font-size:30px;display:block;margin-bottom:10px;opacity:.35}

  /* 宫格入口 */
  .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px}  .gcard{
    background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:18px;cursor:pointer;transition:.15s;
  }
  .gcard:hover{border-color:rgb(var(--primary-rgb) / .40);box-shadow:0 4px 14px rgb(var(--primary-rgb) / .08);transform:translateY(-1px)}
  .gcard .gi{font-size:20px;margin-bottom:10px}
  .gcard .gt{font-size:14.5px;font-weight:600;margin-bottom:4px}
  .gcard .gd{font-size:12px;color:var(--text-3)}

  /* ---------- 本地独立模式（原演示模式，已去除「演示」标签，见 js/core/demo.js） ----------
     登录卡不再显示「演示模式」徽标，作为正式的本地运行模式 */

  /* ---------- 接单页背景图库（系统设置 / 个人设置共用） ---------- */
  .bg-gallery{display:flex;flex-wrap:wrap;gap:10px}
  .bg-thumb{
    position:relative;width:128px;height:80px;border-radius:8px;overflow:hidden;cursor:pointer;
    border:2px solid transparent;box-shadow:0 2px 8px rgba(31,36,48,.10);transition:.15s;flex:none;
  }
  .bg-thumb img{width:100%;height:100%;object-fit:cover;display:block}
  .bg-thumb:hover{transform:translateY(-2px);box-shadow:0 4px 14px rgba(31,36,48,.16)}
  .bg-thumb.is-cur{border-color:var(--primary)}
  .bg-cur-tag{
    position:absolute;left:0;bottom:0;right:0;padding:2px 0;text-align:center;
    background:rgb(var(--primary-rgb) / .85);color:#fff;font-size:10.5px;font-weight:700;
    display:none;
  }
  .bg-thumb.is-cur .bg-cur-tag{display:block}
  .bg-del{
    position:absolute;top:2px;right:2px;width:20px;height:20px;border-radius:50%;
    background:rgba(0,0,0,.55);color:#fff;font-size:11px;line-height:20px;text-align:center;
    display:none;
  }
  .bg-thumb:hover .bg-del{display:block}
  .bg-del:hover{background:#E5484D}
  body.theme-dark .bg-thumb{box-shadow:0 2px 8px rgba(0,0,0,.4)}
  /* 选用图库大图时的等待态（大图按 id 单独取，通常几十毫秒，慢网才看得见） */
  .bg-thumb.is-loading::after{
    content:'';position:absolute;inset:0;background:rgba(255,255,255,.45);
    background-image:linear-gradient(90deg,transparent,rgba(255,255,255,.8),transparent);
    background-size:60% 100%;background-repeat:no-repeat;animation:bgThumbSweep 1s linear infinite;
  }
  @keyframes bgThumbSweep{0%{background-position:-60% 0}100%{background-position:160% 0}}

  /* ---------- 接单页氛围装扮（个人设置 / 系统设置共用） ---------- */
  /* 装扮选择：一排小胶囊，选中的用主色描边。图标用 emoji，不额外拉图 */
  .atmo-pick{display:flex;flex-wrap:wrap;gap:8px;flex:1;min-width:0}
  .atmo-chip{
    display:inline-flex;align-items:center;gap:6px;
    padding:7px 12px;border-radius:10px;cursor:pointer;
    border:1px solid var(--border);background:var(--panel);color:var(--text-2);
    font-size:13px;line-height:1;transition:border-color .15s,color .15s,background .15s;
  }
  .atmo-chip .ico{font-size:14px;line-height:1}
  .atmo-chip:hover{border-color:color-mix(in srgb, var(--primary) 55%, var(--border));color:var(--text)}
  .atmo-chip.on{background:var(--primary-soft);border-color:var(--primary);color:var(--primary);font-weight:600}
  .atmo-chip:focus-visible{outline:2px solid color-mix(in srgb, var(--primary) 45%, transparent);outline-offset:2px}

  /* 氛围画布：铺满视口，压在内容之上、弹窗之下；pointer-events 全关，不挡点击 */
  /* 雪花层压在最前面（z-index 30）：卡片是半透明白，雪放在它后面会被
     backdrop-filter 糊成一片白雾，等于没下雪。canvas 不接事件，压着也不挡操作 */
  .atmo{position:fixed;inset:0;z-index:30;pointer-events:none;overflow:hidden}
  .atmo[hidden]{display:none}
  .atmo canvas{position:absolute;inset:0;width:100%;height:100%;opacity:.82}
  /* 积雪檐单独一层，留在界面后面：只给冬天 / 圣诞挂。
     用「沿 x 轴平铺的半球」而不是几个大椭圆 —— 椭圆半径给大了就是一颗颗白鸡蛋，
     平铺的半圆才会读成压在边上的雪。两层不同周期叠一下，边缘才不呆板。 */
  .atmo-cap-wrap{position:fixed;inset:0;z-index:2;pointer-events:none;overflow:hidden;display:none}
  body[data-atmo="winter"] .atmo-cap-wrap,
  body[data-atmo="christmas"] .atmo-cap-wrap{display:block}
  .atmo-cap{position:absolute;opacity:0;transition:opacity .6s ease;pointer-events:none}
  body[data-atmo="winter"] .atmo-cap,
  body[data-atmo="christmas"] .atmo-cap{opacity:1}
  .atmo-cap-bl{
    left:-30px;bottom:-30px;width:250px;height:170px;
    background:
      radial-gradient(66px 44px at 32% 78%, #fff 96%, rgba(255,255,255,0) 100%) 0 0/100% 100% no-repeat,
      radial-gradient(44px 30px at 64% 86%, #fff 96%, rgba(255,255,255,0) 100%) 0 0/100% 100% no-repeat;
    filter:drop-shadow(0 2px 6px rgba(148,163,184,.35));
  }
  .atmo-cap-br{
    right:-30px;bottom:-30px;width:280px;height:180px;
    background:
      radial-gradient(74px 48px at 68% 80%, #fff 96%, rgba(255,255,255,0) 100%) 0 0/100% 100% no-repeat,
      radial-gradient(48px 32px at 36% 88%, #fff 96%, rgba(255,255,255,0) 100%) 0 0/100% 100% no-repeat;
    filter:drop-shadow(0 2px 6px rgba(148,163,184,.35));
  }
  /* 工作卡片顶沿的积雪：真正压在「模块边角」上，而不是只贴在屏幕边。
     只在雪类主题出现；.po-card 本来 position:relative，伪元素直接贴顶走。
     右侧 .side-panel 是内部滚动容器（overflow-y:auto），伪元素会跟着内容
     一起滚走，所以那两块不挂雪 —— 宁缺也别出现「雪会滑走」的怪相 */
  body[data-atmo="winter"] .po-card::before,
  body[data-atmo="christmas"] .po-card::before{
    content:'';position:absolute;left:-1px;right:-1px;top:-1px;height:12px;
    pointer-events:none;z-index:3;
    border-radius:inherit;
    background:
      radial-gradient(10px 7px at 50% 0, #fff 96%, rgba(255,255,255,0) 100%) 0 0/22px 10px repeat-x,
      linear-gradient(#fff 0 5px, rgba(255,255,255,0) 5px);
    filter:drop-shadow(0 1px 2px rgba(148,163,184,.45));
  }
  body.theme-dark[data-atmo="winter"] .po-card::before,
  body.theme-dark[data-atmo="christmas"] .po-card::before{opacity:.72}
  /* 暗色下雪别太白得刺眼，压一点亮度让它融进深色界面 */
  body.theme-dark[data-atmo="winter"] .atmo-cap,
  body.theme-dark[data-atmo="christmas"] .atmo-cap{opacity:.55}
  /* 打印/导出时不带装扮 */
  @media print{ .atmo{display:none !important} }

  /* ---------- 商品选择器弹窗 ---------- */
  .gsel-mask{
    position:fixed;inset:0;z-index:1000;background:rgba(20,24,32,.45);
    display:flex;align-items:center;justify-content:center;
    padding:12px 12px 12px calc(12px + 96px + 12px);
  }
  /* 选品器：宽高固定 1320×820，不随商品数量/筛选结果变化 */
  .gsel{
    width:var(--gsel-w,1320px);height:var(--gsel-h,820px);
    max-width:100%;max-height:100%;background:#fff;border-radius:10px;
    box-shadow:0 18px 50px rgba(10,14,22,.35);display:flex;flex-direction:column;overflow:hidden;
  }
  .gsel-head{
    flex:none;display:flex;align-items:center;justify-content:space-between;
    padding:12px 16px;font-size:14px;font-weight:700;color:var(--text);
    border-bottom:1px solid var(--border);
  }
  .gsel-x{cursor:pointer;color:var(--text-3);font-size:13px;padding:2px 6px;border-radius:4px}
  .gsel-x:hover{background:#F2F3F7;color:var(--text)}
  .gsel-body{flex:1;display:flex;min-height:0}
  /* 左侧分类树 */
  .gsel-side{
    flex:none;width:208px;border-right:1px solid var(--border);overflow-y:auto;
    padding:8px 6px;background:#FAFBFD;
  }
  .gsel-cat{
    display:flex;align-items:center;gap:6px;padding:7px 8px;border-radius:6px;
    font-size:12.5px;color:var(--text-2);cursor:pointer;user-select:none;
  }
  .gsel-cat:hover{background:rgb(var(--primary-rgb) / .07)}
  .gsel-cat.on{background:var(--primary-soft);color:var(--primary);font-weight:600}
  .gsel-cat .arr{font-size:9px;color:var(--text-3);flex:none}
  .gsel-cat .cn{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .gsel-cat .cnt{font-size:11px;color:var(--text-3)}
  /* 三级分类树（中仑分类本身就是「香烟 > 国产烟 > 粗支」）：
     用缩进表达层级，箭头单独可点——点箭头只展开/收起，点名字才筛选。
     没有下级的行也保留箭头位（空 span），否则同一级的文字会左右错开。 */
  .gsel-cat .arr{width:12px;text-align:center;transition:transform .12s ease}
  .gsel-cat.has-kids .arr{cursor:pointer;border-radius:3px}
  .gsel-cat.has-kids .arr:hover{background:rgb(var(--primary-rgb) / .14);color:var(--primary)}
  .gsel-cat.open .arr{transform:rotate(90deg)}
  .gsel-cat.lv2{padding-left:20px}
  .gsel-cat.lv3{padding-left:34px;font-size:12px}
  .gsel-cat.in-path{color:var(--primary)}
  .gsel-cat.in-path .arr{color:var(--primary)}
  .gsel-cat-all{border-bottom:1px dashed var(--border);border-radius:6px 6px 0 0;margin-bottom:4px;padding-bottom:8px}
  .gsel-cat-all.on{background:var(--primary-soft);color:var(--primary);font-weight:600}
  body.theme-dark .gsel-cat-all:hover{background:rgba(255,255,255,.06)}
  /* 右侧主区 */
  .gsel-main{flex:1;min-width:0;display:flex;flex-direction:column;padding:10px 14px 0}
  .gsel-tools{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:10px}
  .gsel-in{
    height:32px;border:1px solid var(--border);border-radius:5px;padding:0 9px;
    font-size:12.5px;color:var(--text);background:#fff;font-family:inherit;
  }
  .gsel-in.grow{flex:1;min-width:120px}
  /* 搜索框包一层，右侧挂一键清空：直接给 input 加 padding-right 腾位置，
     按钮绝对定位压在里面 —— 这样工具条的高度、对齐都不变 */
  .gsel-kw{position:relative;flex:1;min-width:120px;display:flex;align-items:center}
  .gsel-kw .gsel-in.grow{width:100%;flex:1;padding-right:30px}
  .gsel-kw-x{
    position:absolute;right:5px;top:5px;width:22px;height:22px;padding:0;
    display:none;align-items:center;justify-content:center;
    border:0;border-radius:50%;background:rgba(15,23,42,.08);color:var(--text-3);
    font-size:10px;line-height:1;cursor:pointer;
  }
  .gsel-kw.has-val .gsel-kw-x{display:flex}
  .gsel-kw-x:hover{background:rgba(15,23,42,.16);color:var(--text)}
  body.theme-dark .gsel-kw-x{background:rgba(255,255,255,.12);color:var(--text-2)}
  body.theme-dark .gsel-kw-x:hover{background:rgba(255,255,255,.22)}
  .gsel-in.num{width:88px}
  .gsel-in.tiny{width:44px;text-align:center}
  .gsel-sep{color:var(--text-3)}
  .gsel-btn{
    height:32px;padding:0 10px;border:1px solid var(--border);background:#fff;border-radius:5px;
    font-size:12.5px;cursor:pointer;font-family:inherit;
  }
  .gsel-btn:hover{border-color:rgb(var(--primary-rgb) / .5)}
  .gsel-quick{
    height:32px;display:inline-flex;align-items:center;padding:0 10px;border-radius:5px;
    border:1px solid var(--border);background:#fff;font-size:12px;color:var(--text-2);
    cursor:pointer;white-space:nowrap;user-select:none;
  }
  .gsel-quick:hover{color:var(--primary);border-color:rgb(var(--primary-rgb) / .5)}
  /* 品类推荐按钮：选中态 + 该品类的推荐商品数角标 */
  .gsel-quick-group{display:inline-flex;align-items:center;gap:6px;flex:0 0 auto;flex-wrap:nowrap}
  .gsel-quick.reco{position:relative;gap:4px}
  .gsel-quick.on{background:var(--primary-soft);color:var(--primary);border-color:rgb(var(--primary-rgb) / .45);font-weight:600}
  .gsel-quick.off{opacity:.55}
  .gsel-quick .n{
    font-style:normal;font-size:10.5px;line-height:14px;min-width:14px;text-align:center;
    padding:0 4px;border-radius:8px;color:var(--primary);background:rgb(var(--primary-rgb) / .12);
  }
  .gsel-quick .n:empty{display:none}
  .gsel-quick.busy{pointer-events:none;opacity:.6}
  /* 「含淘汰」开关：进销存已淘汰的商品默认不出现在选品列表，勾上才显示 */
  .gsel-q-void{
    height:32px;display:inline-flex;align-items:center;gap:5px;padding:0 10px;border-radius:5px;
    border:1px dashed var(--border);background:#fff;font-size:12px;color:var(--text-2);
    cursor:pointer;white-space:nowrap;user-select:none;
  }
  .gsel-q-void[hidden]{display:none}
  .gsel-q-void:hover{color:#B91C1C;border-color:#F0B4B4}
  .gsel-q-void input{width:13px;height:13px;margin:0;accent-color:#DC2626;cursor:pointer}
  .gsel-q-void.on{color:#B91C1C;border-style:solid;border-color:#F0B4B4;background:#FEF2F2;font-weight:600}
  body.theme-dark .gsel-q-void{background:rgba(255,255,255,.03)}
  body.theme-dark .gsel-q-void.on{background:rgba(220,38,38,.14);border-color:rgba(248,113,113,.5);color:#FCA5A5}
  /* 选品列表里的「淘汰」角标 + 行淡出 */
  .gs-void-tag{
    display:inline-block;margin-left:5px;padding:0 5px;height:16px;line-height:16px;border-radius:3px;
    font-size:10px;font-weight:600;color:#B91C1C;background:#FEE2E2;vertical-align:middle;
  }
  .gsel-table tr.is-erp-void .gs-name{color:var(--text-3)}
  .gsel-table tr.is-erp-void .g-img{opacity:.5}
  /* 推荐筛选提示条（品类推荐生效时出现） */
  .gsel-tip{
    display:flex;align-items:center;justify-content:space-between;gap:10px;margin:-2px 0 8px;
    padding:6px 10px;border-radius:6px;background:var(--primary-soft);color:var(--primary);font-size:12px;
  }
  .gsel-tip[hidden]{display:none !important}
  .gsel-tip .gs-tip-x{cursor:pointer;font-size:11.5px;opacity:.85;white-space:nowrap}
  .gsel-tip .gs-tip-x:hover{opacity:1;text-decoration:underline}
  /* 推荐奖励列：> 0 的高亮，一眼看出哪些商品能进推荐 */
  .gsel-table .gs-bonus.on{color:#C2410C;font-weight:700}
  /* ---------- 打开时的引导画面（不展示商品明细） ---------- */
  .gsel-idle{
    flex:1;min-height:0;overflow:auto;display:flex;align-items:center;justify-content:center;
    padding:26px 26px 30px;border:1px solid var(--border);border-radius:8px;
    background:
      radial-gradient(720px 260px at 10% -12%,rgb(var(--primary-rgb) / .12),transparent 62%),
      radial-gradient(520px 220px at 100% 110%,rgb(var(--primary-rgb) / .07),transparent 60%),
      linear-gradient(180deg,#FCFCFE,#F6F7FB);
  }
  /* hidden 要压过上面的 display:flex，否则切回列表时引导画面不消失 */
  .gsel-idle[hidden], .gsel-tablewrap[hidden], .gsel-page[hidden], .gsel-picked[hidden]{display:none}
  /* 引导画面下没有分页器，「确定」靠右站，别孤零零停在左边 */
  .gsel-foot.is-idle{justify-content:flex-end}
  .gsi-wrap{width:100%;max-width:860px}
  .gsi-brand{display:flex;align-items:center;gap:14px;margin-bottom:24px}
  .gsi-logo{
    flex:none;width:54px;height:54px;border-radius:15px;display:flex;align-items:center;justify-content:center;
    background:linear-gradient(135deg,var(--primary),var(--primary-hover));color:#fff;
    font-size:25px;font-weight:800;letter-spacing:0;
    box-shadow:0 10px 24px rgb(var(--primary-rgb) / .30);
  }
  .gsi-t{font-size:19px;font-weight:800;color:var(--text);letter-spacing:.3px}
  .gsi-s{font-size:12.5px;color:var(--text-3);margin-top:4px}
  .gsi-s b{color:var(--primary);font-size:15px;margin-right:2px;font-variant-numeric:tabular-nums}
  .gsi-sec{display:flex;align-items:baseline;gap:8px;margin:0 0 10px;font-size:12.5px;font-weight:700;color:var(--text-2)}
  .gsi-sec-tip{font-size:11.5px;font-weight:400;color:var(--text-3)}
  .gsi-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(172px,1fr));gap:10px}
  .gsi-card{
    display:flex;flex-direction:column;align-items:flex-start;gap:2px;
    padding:11px 13px;text-align:left;font-family:inherit;cursor:pointer;
    border:1px solid var(--border);border-radius:10px;background:#fff;
    transition:border-color .12s,box-shadow .12s,transform .12s;
  }
  .gsi-card:hover{border-color:rgb(var(--primary-rgb) / .55);box-shadow:0 6px 18px rgb(var(--primary-rgb) / .13);transform:translateY(-1px)}
  .gsi-card .gsi-k{font-size:13px;font-weight:700;color:var(--text)}
  .gsi-card .gsi-v{font-size:12.5px;font-weight:700;color:var(--primary);font-variant-numeric:tabular-nums}
  .gsi-card .gsi-d{font-size:11px;color:var(--text-3)}
  .gsi-card.is-reco{border-color:rgb(var(--primary-rgb) / .35);background:rgb(var(--primary-rgb) / .05)}
  .gsi-card.is-off .gsi-v{color:var(--text-3);font-weight:500}
  .gsi-tips{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:18px;font-size:11.5px;color:var(--text-3)}
  .gsi-chip{
    padding:3px 10px;border-radius:12px;border:1px solid var(--border);background:#fff;
    font-size:11.5px;color:var(--text-2);font-family:inherit;cursor:pointer;
  }
  .gsi-chip:hover{border-color:rgb(var(--primary-rgb) / .5);color:var(--primary)}
  .gsi-chip.is-plain{cursor:default;background:transparent;border-style:dashed}
  .gsi-chip.is-plain:hover{border-color:var(--border);color:var(--text-2)}
  .gsi-loading{display:flex;align-items:center;gap:10px;padding:18px 2px;font-size:12.5px;color:var(--text-3)}
  .gsi-loading i{
    width:14px;height:14px;border-radius:50%;flex:none;
    border:2px solid rgb(var(--primary-rgb) / .25);border-top-color:var(--primary);
    animation:gsiSpin .8s linear infinite;
  }
  @keyframes gsiSpin{to{transform:rotate(360deg)}}
  body.theme-dark .gsel-idle{
    background:
      radial-gradient(720px 260px at 10% -12%,rgb(var(--primary-rgb) / .20),transparent 62%),
      radial-gradient(520px 220px at 100% 110%,rgb(var(--primary-rgb) / .12),transparent 60%),
      linear-gradient(180deg,#1B1D24,#171921);
  }
  body.theme-dark .gsi-card{background:#20232B;border-color:#2C303A}
  body.theme-dark .gsi-logo{
    background:rgb(var(--primary-rgb) / .18);color:var(--primary);
    box-shadow:inset 0 0 0 1px rgb(var(--primary-rgb) / .35);
  }
  body.theme-dark .gsi-card.is-reco{background:rgb(var(--primary-rgb) / .14);border-color:rgb(var(--primary-rgb) / .40)}
  body.theme-dark .gsi-chip{background:#20232B;border-color:#2C303A;color:var(--text-2)}
  /* 深色下 `.btn` 的通用底色会盖掉 `.blue`（(0,2,1) > (0,2,0)），确定按钮变成没底的灰字 */
  body.theme-dark .btn.blue{background:#3B82F6;border-color:#3B82F6;color:#fff}
  body.theme-dark .btn.blue:hover{background:#2563EB}
  @media (prefers-reduced-motion:reduce){
    .gsi-loading i{animation:none}
    .gsi-card:hover{transform:none}
  }
  /* 表格 */
  .gsel-tablewrap{flex:1;min-height:0;overflow:auto;border:1px solid var(--border);border-radius:8px}
  /* 服务端查询中：只把表格压暗一点，不换成骨架屏——避免每次输入都闪一下 */
  .gsel-tablewrap.is-loading{opacity:.55;cursor:progress;transition:opacity .12s ease}
  body.theme-dark .gsel-tablewrap.is-loading{opacity:.5}
  .gsel-table{width:100%;border-collapse:collapse;font-size:12.5px}
  .gsel-table th{
    position:sticky;top:0;background:#FAFAFC;color:var(--text-3);font-weight:500;text-align:left;
    padding:8px 9px;border-bottom:1px solid var(--border);font-size:12px;white-space:nowrap;z-index:1;
  }
  .gsel-table td{padding:7px 9px;border-bottom:1px solid #F5F6FA;color:var(--text-2);vertical-align:middle}
  /* 库存列：「1806箱 2听」不能被拆成两行，拆了就分不清是哪一格的数 */
  .gsel-table td.gs-stockc{white-space:nowrap;font-variant-numeric:tabular-nums}
  .gsel-table tr:hover td{background:rgb(var(--primary-rgb) / .04)}
  /* 整行可点：单击勾选、双击直接加入清单（以前只有小方框能点） */
  .gsel-table tbody tr[data-id]{cursor:pointer}
  /* 键盘光标：↑↓ 选中那一行，和鼠标悬停区分开（悬停可能同时在人手位置） */
  .gsel-table tbody tr.is-kb{background:rgb(var(--primary-rgb) / .10);box-shadow:inset 3px 0 0 var(--primary)}
  body.theme-dark .gsel-table tbody tr.is-kb{background:rgb(var(--primary-rgb) / .22)}
  .gsel-table tr.is-on td{background:rgb(var(--primary-rgb) / .07)}
  .gsel-table tr.is-on:hover td{background:rgb(var(--primary-rgb) / .11)}
  body.theme-dark .gsel-table tr.is-on td{background:rgb(var(--primary-rgb) / .16)}
  body.theme-dark .gsel-table tr.is-on:hover td{background:rgb(var(--primary-rgb) / .22)}
  .gsel-table .ck{width:34px;text-align:center}
  .gsel-table .ck input[type=checkbox]{width:14px;height:14px;cursor:pointer;accent-color:var(--primary)}
  .gsel-table .g-img.sm{width:38px;height:38px;font-size:14px;border-radius:5px}
  .gsel-name, .gs-name{color:var(--primary);font-size:12.5px;line-height:1.4;cursor:pointer;word-break:break-all}
  /* 商品备注提示：仅「商品中心」维护了备注的商品，在名称上高亮（加粗+主题色），悬停显示备注 */
  .gsel-table .gs-name{color:var(--text-2)}
  .gsel-table .gs-name.has-rec{font-weight:700;color:var(--primary)}
  .gsel-table .gs-name.has-rec .gs-rec-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--primary);margin-left:5px;vertical-align:middle}
  /* 备注气泡：改由 fixed 浮层承担（见 order.js 的 showNote）。
     原来用 ::after 绝对定位画在名称上：气泡会撑出表格容器的滚动条 → 名称列变窄重新换行
     → 鼠标「离开」名称再「进入」→ 气泡反复显示/隐藏，看起来就是频闪。 */
  .gs-note-tip{
    position:fixed;left:0;top:0;z-index:9600;max-width:300px;
    padding:7px 11px;border-radius:8px;
    background:var(--primary);color:#fff;
    font-size:12px;font-weight:500;line-height:1.55;text-align:left;white-space:normal;
    box-shadow:0 8px 22px rgb(var(--primary-rgb) / .35);
    opacity:0;transform:translateY(3px);
    transition:opacity .12s ease,transform .12s ease;
    pointer-events:none;                 /* 绝不接收鼠标：不参与 hover，也就不可能抖 */
  }
  .gs-note-tip.on{opacity:1;transform:translateY(0)}
  .gs-note-tip[hidden]{display:none}
  body.theme-dark .gs-note-tip{background:#4A3F7A;color:#F3F0FF;box-shadow:0 8px 22px rgba(0,0,0,.55)}
  .gs-sub{font-size:11px;color:var(--text-3);line-height:1.6;display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;margin-top:2px}
  /* 商品编码与商品类型：名称下方的小字，编码用等宽数字，类型用浅色标签区分 */
  .gs-sub .gs-code{font-variant-numeric:tabular-nums;letter-spacing:.2px}
  .gs-sub .gs-gtype{
    padding:0 5px;border-radius:4px;font-size:10.5px;line-height:15px;
    color:#C2570B;background:rgba(245,166,35,.16);
  }
  body.theme-dark .gs-sub .gs-gtype{color:#FFAB6B;background:rgba(245,166,35,.18)}
  .gsel-table .sort{cursor:pointer;user-select:none}
  .gsel-table .sort:hover{color:var(--primary)}
  .gsel-table .sort.on{color:var(--primary);font-weight:600}
  .gsel-table .sort i{font-style:normal;font-size:10px}
  .gsel-table td.empty{text-align:center;color:var(--text-3);padding:26px 0}
  /* 底部 */
  /* 已选商品条：常驻在表格与底部按钮之间，翻页 / 切分类都不丢 */
  .gsel-picked{
    flex:none;margin-top:8px;padding:7px 10px 8px;border-radius:8px;
    border:1px solid var(--border);background:#FAFBFD;
  }
  .gsel-picked.has{background:rgb(var(--primary-rgb) / .05);border-color:rgb(var(--primary-rgb) / .28)}
  .gsp-head{display:flex;align-items:center;gap:10px;margin-bottom:6px;font-size:12px;color:var(--text-3)}
  .gsp-tt{color:var(--text-2);font-weight:600;white-space:nowrap}
  .gsp-tt b{color:var(--primary);font-size:13px;margin:0 1px}
  .gsp-tip{flex:1;min-width:0;font-size:11.5px}
  .gsp-clear{
    flex:none;cursor:pointer;padding:1px 8px;border-radius:10px;font-size:11.5px;color:var(--text-3);
  }
  .gsp-clear:hover{color:#E5484D;background:rgba(229,72,77,.10)}
  .gsp-list{display:flex;flex-wrap:wrap;gap:6px;max-height:76px;overflow-y:auto}
  .gsp-chip{
    display:inline-flex;align-items:center;gap:5px;max-width:300px;padding:3px 6px 3px 7px;
    border-radius:14px;border:1px solid var(--border);background:#fff;
    font-size:12px;color:var(--text-2);
  }
  .gsp-chip .dot{flex:none;width:6px;height:6px;border-radius:50%}
  .gsp-chip .nm{max-width:200px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .gsp-chip .du{
    flex:none;padding:0 5px;border-radius:7px;font-size:10.5px;line-height:15px;
    color:var(--primary);background:rgb(var(--primary-rgb) / .12);
  }
  .gsp-chip .x{flex:none;padding:0 3px;border-radius:50%;cursor:pointer;font-size:11px;line-height:1;color:var(--text-3)}
  .gsp-chip .x:hover{color:#E5484D}
  .gsp-empty{font-size:11.5px;color:var(--text-3)}
  body.theme-dark .gsel-picked{background:rgba(255,255,255,.03)}
  body.theme-dark .gsp-chip{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.10)}
  .gsel-foot{
    flex:none;display:flex;align-items:center;justify-content:space-between;gap:12px;
    padding:10px 0 12px;
  }
  .gsel-page{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-3);flex-wrap:wrap}
  .gs-count{white-space:nowrap}
  .gsel-page select{
    height:28px;border:1px solid var(--border);border-radius:4px;font-size:12px;
    background:#fff;color:var(--text);font-family:inherit;
  }
  .gsel-pg{
    min-width:26px;height:26px;padding:0 6px;border:1px solid var(--border);background:#fff;
    border-radius:4px;font-size:12px;color:var(--text-2);cursor:pointer;font-family:inherit;
  }
  .gsel-pg:hover{border-color:rgb(var(--primary-rgb) / .5)}
  .gsel-pg.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
  .gsel-pg:disabled{color:#C3C7D1;cursor:not-allowed;background:#F5F6FA}
  .gs-ellipsis{color:var(--text-3)}
  .gs-go-l{white-space:nowrap}
  /* 暗色 */
  body.theme-dark .gsel{background:#262833}
  body.theme-dark .gsel-head{border-color:var(--border);color:var(--text)}
  body.theme-dark .gsel-side{background:#1E2027;border-color:var(--border)}
  body.theme-dark .gsel-in, body.theme-dark .gsel-btn, body.theme-dark .gsel-quick,
  body.theme-dark .gsel-pg, body.theme-dark .gsel-page select{background:#1E2027;color:var(--text);border-color:var(--border)}
  body.theme-dark .gsel-table th{background:#23252E}
  body.theme-dark .gsel-table td{border-color:rgba(255,255,255,.06)}
  body.theme-dark .gsel-quick.on{background:rgb(var(--primary-rgb) / .18)}
  body.theme-dark .gsel-table .gs-bonus.on{color:#FF9F6B}

  /* 地址选择器：无左侧分类树的单栏布局 + 行内操作按钮。
     宽度收到 860px：默认 1320px 时「地址描述」列独占 804px，而实际内容最长只 225px，
     中间空出一大片（用户反馈）。860 下描述列约 344px：长地址仍可折行，短地址不再留白。 */
  .gsel.asel{--gsel-w:860px}
  /* 概览态内容只有一屏的三分之一高，弹窗跟着收；切到明细列表自动回到 820px */
  .gsel.asel.is-stats{--gsel-h:560px}
  .gsel-body.full{display:block}
  .gsel-main.full{height:100%;box-sizing:border-box;padding-bottom:10px}
  .gsel-btn.blue{background:var(--primary);border-color:var(--primary);color:#fff}
  .gsel-btn.blue:hover{background:var(--primary-hover);border-color:var(--primary-hover)}
  .gsel-op{
    height:24px;padding:0 10px;border:none;border-radius:4px;font-size:12px;cursor:pointer;
    font-family:inherit;margin-right:6px;
  }
  .gsel-op.blue{background:rgb(var(--primary-rgb) / .12);color:var(--primary)}
  .gsel-op.blue:hover{background:rgb(var(--primary-rgb) / .22)}
  .gsel-op.red{background:#FDECEC;color:#E5484D}
  .gsel-op.red:hover{background:#FADADA}
  body.theme-dark .gsel-op.red{background:rgba(229,72,77,.16)}
  .asel .a-type{color:var(--text-2)}
  .asel .a-desc{color:var(--text-2)}
  .asel .a-ops{white-space:nowrap}
  /* 配送距离：真实驾车距离用等宽数字；未定位/未算出来用浅灰，别让人误读成 0 公里 */
  .asel .a-dist{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--text)}
  .asel .a-dist.muted{color:var(--text-3);font-size:12px}
  /* 使用次数：和距离一样右对齐等宽，方便竖着扫一眼挑「常用地址」；
     0 次是真实信息（新地址或纯坐标点），用浅灰而不是藏起来 */
  .asel .a-use{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--text)}
  .asel .a-use.muted{color:var(--text-3)}

  /* ---------- 地址选择器首屏：概览统计（2026-11-08） ----------
     以前一开弹窗就拉一万三千条明细（1~2 秒白屏），多数查询根本用不到；
     现在首屏只显示服务端 GROUP BY 出来的统计，明细按条件分页取。
     分组标签即筛选入口：点一下带着条件进列表，再点一下取消。 */
  .as-ov{flex:1;min-height:0;overflow-y:auto;padding:14px 2px 4px}
  .as-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:12px}
  .as-kpi{position:relative;padding:11px 13px;border:1px solid var(--border);border-radius:10px;background:#FAFBFD}
  .as-kpi b{display:block;font-size:21px;line-height:1.15;color:var(--text);font-variant-numeric:tabular-nums}
  .as-kpi span{display:block;margin-top:3px;font-size:12px;color:var(--text-3)}
  .as-kpi i{position:absolute;right:11px;top:11px;font-style:normal;font-size:11px;line-height:18px;
    padding:0 7px;border-radius:9px;background:var(--primary-soft);color:var(--primary);font-variant-numeric:tabular-nums}
  .as-tip{margin:0 0 12px;font-size:12px;color:var(--text-3);line-height:1.6}
  .as-sec{margin-bottom:12px}
  .as-sec-h{display:flex;align-items:baseline;gap:8px;margin-bottom:7px}
  .as-sec-h b{font-size:12.5px;color:var(--text)}
  .as-sec-h span{font-size:11px;color:var(--text-3)}
  .as-chips{display:flex;flex-wrap:wrap;gap:7px}
  .as-chip{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 10px;
    border:1px solid var(--border);border-radius:7px;background:#fff;font-family:inherit;
    font-size:12.5px;color:var(--text-2);cursor:pointer;transition:border-color .14s,background .14s,color .14s}
  .as-chip:hover{border-color:rgb(var(--primary-rgb) / .45);background:rgb(var(--primary-rgb) / .05);color:var(--primary)}
  .as-chip.on{border-color:rgb(var(--primary-rgb) / .55);background:var(--primary-soft);color:var(--primary);font-weight:600}
  .as-chip-n{font-style:normal;font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums}
  .as-chip:hover .as-chip-n,.as-chip.on .as-chip-n{color:var(--primary)}
  .as-ov-load,.as-ov-empty{padding:36px 0;text-align:center;font-size:12.5px;color:var(--text-3);line-height:1.9}
  .as-list{flex:1;min-height:0;display:flex;flex-direction:column}
  .as-list-bar{display:flex;align-items:center;gap:10px;margin:2px 0 8px}
  .as-back{flex:none;height:26px;padding:0 10px;border:1px solid var(--border);border-radius:6px;
    background:#fff;font-family:inherit;font-size:12px;color:var(--text-2);cursor:pointer;transition:.14s}
  .as-back:hover{border-color:rgb(var(--primary-rgb) / .45);color:var(--primary)}
  .as-crumb{flex:1;min-width:0;font-size:12px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .as-list-n{flex:none;font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums}
  /* .as-list 是 flex、.gsel-foot 也有自己的 display，hidden 属性会被类规则盖掉，显式兜底 */
  .as-list[hidden],.gsel-foot[hidden]{display:none!important}
  body.theme-dark .as-kpi{background:rgba(255,255,255,.04)}
  body.theme-dark .as-chip,body.theme-dark .as-back{background:#2E313C;border-color:var(--border)}
  body.theme-dark .as-chip.on{background:rgb(var(--primary-rgb) / .18)}

  /* ---------- 他的地址：会员历史收货地址选择器 ----------
     2026-11-06 按站内视觉规范重做（用户：图标按钮和内容边框都不符合本站风格）：
       · 壳高度按内容走 —— 0 条地址时不再是一张 820px 高、450px 全空的白板；
       · 分类换成站内那套「分段选择器」（同 .aform-seg：浅槽 + 选中白块），
         原来的首尾相连实心色块在站内找不到第二处；
       · 表格去掉外层卡片描边，表头/行统一 16px 内距、12px 表头、行间 1px 分隔；
       · 关闭按钮给 30×30 热区 + hover（原来是个裸 ✕，只有 12px 宽，还点不出反馈）；
       · 分页只有一页时整块收起，页码用 28×28 圆角小按钮，选中是主色浅底而不是实心色块。 */
  .his-dlg{--gsel-w:1000px;height:auto;max-height:min(720px, calc(100vh - 88px))}
  .his-head{gap:8px}
  .his-member{font-size:12.5px;font-weight:500;color:var(--text-3);font-variant-numeric:tabular-nums}
  .his-x{
    margin-left:auto;flex:none;width:30px;height:30px;border-radius:8px;
    display:flex;align-items:center;justify-content:center;
    color:var(--text-3);font-size:14px;line-height:1;cursor:pointer;transition:background .15s,color .15s;
  }
  .his-x:hover{background:var(--bg-2);color:var(--text)}

  /* 顾客信息条：姓名 / 等级 / 手机号 + 4 个统计，中间用细分隔线断开 */
  .his-cust{padding:14px 20px 0}
  .his-cust-main{
    display:flex;align-items:center;gap:14px;padding:12px 16px;
    border:1px solid var(--border);border-radius:12px;background:var(--bg-2);
  }
  .his-cust-ava{
    width:40px;height:40px;flex:none;border-radius:50%;
    display:flex;align-items:center;justify-content:center;
    background:var(--primary-soft);color:var(--primary);font-size:16px;font-weight:700;
  }
  .his-cust-id{min-width:150px}
  .his-cust-n{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;color:var(--text)}
  .his-cust-n em{
    font-style:normal;font-size:11px;font-weight:600;line-height:1;
    padding:4px 8px;border-radius:999px;background:var(--primary-soft);color:var(--primary);
  }
  .his-cust-n em.is-new{background:rgba(255,163,51,.16);color:#B26A00}
  .his-cust-p{margin-top:5px;font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums}
  .his-cust-kpi{margin-left:auto;display:flex;align-items:center}
  .his-cust-kpi span{
    display:flex;flex-direction:column;align-items:flex-end;gap:4px;
    padding:0 18px;border-left:1px solid var(--border);
  }
  .his-cust-kpi span:first-child{border-left:none;padding-left:0}
  .his-cust-kpi span:last-child{padding-right:0}
  .his-cust-kpi i{font-style:normal;font-size:11.5px;color:var(--text-3)}
  .his-cust-kpi b{font-size:15px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums}
  .his-cust-empty{
    padding:12px 14px;border:1px dashed var(--border);border-radius:12px;
    font-size:12.5px;color:var(--text-3);background:var(--bg-2);
  }

  /* 分类：分段选择器（与「新建地址 → 类型」同一个组件语言） */
  .his-tools{display:flex;align-items:center;gap:14px;padding:14px 20px 12px}
  .his-seg{display:flex;background:var(--bg-2);border-radius:9px;padding:3px;gap:3px}
  .his-tab{
    height:30px;padding:0 16px;border:0;border-radius:7px;background:transparent;
    font-size:13px;color:var(--text-3);cursor:pointer;font-family:inherit;transition:.15s;
  }
  .his-tab:hover{color:var(--text-2)}
  .his-tab.is-cur{
    background:var(--panel);color:var(--primary);font-weight:600;
    box-shadow:0 1px 4px rgba(17,20,30,.14), inset 0 0 0 1px rgb(var(--primary-rgb) / .28);
  }
  .his-sum{margin-left:auto;font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums}

  /* 表格：容器只留 1px 圆角描边，表头与行共用 16px 内距 */
  .his-tablewrap{
    flex:1 1 auto;min-height:0;max-height:460px;overflow:auto;
    border:1px solid var(--border);border-radius:10px;background:var(--panel);
    margin:0 20px;
  }
  .his-table{width:100%;border-collapse:separate;border-spacing:0;font-size:12.5px}
  .his-table th{
    position:sticky;top:0;z-index:1;background:var(--bg-2);color:var(--text-3);
    font-weight:500;font-size:12px;text-align:left;padding:10px 16px;
    border-bottom:1px solid var(--border);white-space:nowrap;
  }
  .his-table td{padding:11px 16px;border-bottom:1px solid var(--border);color:var(--text-2);vertical-align:middle}
  .his-table tbody tr:last-child td{border-bottom:0}
  .his-table tr{cursor:pointer}
  .his-table tbody tr:hover td{background:rgb(var(--primary-rgb) / .04)}
  .his-table tr.is-sel td{background:var(--primary-soft)}
  .his-table .r{text-align:right}
  .his-name{font-weight:600;color:var(--text)}
  .his-desc{color:var(--text-2)}
  /* 房间号是顾客自己写的一栏，有人填「13-3-2楼东」也有人填「电联」，单行截断别撑破表格 */
  .his-room{color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:130px}
  .his-dim{color:var(--text-3)}
  .his-cnt{font-variant-numeric:tabular-nums;font-weight:600;color:var(--text)}

  /* 操作列：删除 / 恢复。窄按钮，不抢地址本身的注意力 */
  .his-table .his-op{white-space:nowrap;padding-left:6px}
  .his-del, .his-undo-btn{
    height:24px;padding:0 9px;border:1px solid var(--border);border-radius:7px;
    background:var(--panel);color:var(--text-3);font-size:12px;font-family:inherit;
    line-height:22px;cursor:pointer;transition:.15s;white-space:nowrap;
  }
  .his-del:hover{ color:#C0392B;border-color:rgba(192,57,43,.45);background:rgba(192,57,43,.06) }
  /* 「点两次才生效」的中间态：整颗变红，和派单里的取消按钮一个语义 */
  .his-del.is-armed{ color:#fff;background:#C0392B;border-color:#C0392B }
  .his-del[disabled], .his-undo-btn[disabled]{ opacity:.55;cursor:default }
  .his-undo-btn:hover:not([disabled]){ color:var(--primary);border-color:rgb(var(--primary-rgb) / .45) }
  /* 已删除的条目：虚线框 + 灰字，一眼看出不是正常行，也不会被误双击填入 */
  .his-table tr.is-ghost{cursor:default}
  .his-table tr.is-ghost td{background:var(--bg-2);color:var(--text-3);font-style:italic}
  .his-table tr.is-ghost:hover td{background:var(--bg-2)}

  /* 空态：一块完整的提示，而不是一行灰字挂在几百像素的空白里 */
  .his-empty{padding:46px 20px 50px;text-align:center}
  .his-empty-ico{
    width:44px;height:44px;margin:0 auto 12px;border-radius:50%;
    display:flex;align-items:center;justify-content:center;
    background:var(--bg-2);color:var(--text-3);font-size:19px;
  }
  .his-empty-t{font-size:13px;font-weight:600;color:var(--text-2)}
  .his-empty-d{margin-top:6px;font-size:12px;color:var(--text-3);line-height:1.6}

  /* 底栏：左边一句用法，右边分页；只有一页时整块分页收起来 */
  .his-foot{flex:none;display:flex;align-items:center;gap:14px;padding:12px 20px 14px;border-top:1px solid var(--border)}
  .his-foot-hint{font-size:12px;color:var(--text-3)}
  /* 「已删 N 条 · 查看」：删除只是从列表移除，得留一个点得到的回来入口 */
  .his-undo{
    height:26px;padding:0 10px;border:1px dashed var(--border);border-radius:8px;
    background:transparent;color:var(--text-3);font-size:12px;font-family:inherit;
    cursor:pointer;transition:.15s;white-space:nowrap;
  }
  .his-undo:hover{ color:var(--primary);border-color:rgb(var(--primary-rgb) / .45) }
  .his-undo[hidden]{display:none}
  .his-pager{margin-left:auto;display:flex;align-items:center;gap:8px}
  .his-pager[hidden]{display:none}
  .his-pager select{
    height:28px;border:1px solid var(--border);border-radius:8px;background:var(--panel);
    font-size:12px;color:var(--text-2);padding:0 6px;font-family:inherit;cursor:pointer;
  }
  .his-pg{
    min-width:28px;height:28px;padding:0 8px;border:1px solid var(--border);border-radius:8px;
    background:var(--panel);font-size:12.5px;color:var(--text-2);cursor:pointer;font-family:inherit;
    font-variant-numeric:tabular-nums;transition:.15s;
  }
  .his-pg:hover:not([disabled]){border-color:rgb(var(--primary-rgb) / .45);color:var(--primary)}
  .his-pg[disabled]{opacity:.45;cursor:not-allowed}
  .his-pg.on{
    background:var(--primary-soft);border-color:rgb(var(--primary-rgb) / .45);
    color:var(--primary);font-weight:600;
  }
  .his-go{
    width:44px;height:28px;border:1px solid var(--border);border-radius:8px;background:var(--panel);
    text-align:center;font-size:12.5px;color:var(--text);font-family:inherit;outline:none;
  }
  .his-go:focus{border-color:rgb(var(--primary-rgb) / .6)}
  .his-ops{white-space:nowrap}

  /* ---------- 新建/编辑地址弹窗：左表单 + 右真实地图 ---------- */
  .aform-dlg{--dlg-w:1080px;--dlg-h:680px}
  /* 左表单 / 右地图：高度由弹窗分配，内部各自滚动，不再用 min-height 撑 */
  .aform-body{flex:1;min-height:0;display:flex;gap:22px;padding:24px}
  /* 左栏字段多时自己滚，不把右栏地图挤扁 */
  .aform-left{width:400px;flex:none;display:flex;flex-direction:column;gap:18px;padding-top:8px;overflow-y:auto;overscroll-behavior:contain}
  .aform-row{display:flex;align-items:center;gap:12px}
  .aform-row>label{width:72px;flex:none;font-size:13px;color:var(--text-2);text-align:right}
  .aform-row>label i{color:#E5484D;font-style:normal;margin-right:1px;font-weight:600}
  /* 类型：分段选择器 */
  .aform-seg{display:flex;flex:1;background:#F2F3F7;border-radius:9px;padding:3px;gap:3px}
  .aform-seg label{flex:1;position:relative;cursor:pointer}
  .aform-seg input{position:absolute;inset:0;opacity:0;cursor:pointer}
  .aform-seg span{
    display:flex;align-items:center;justify-content:center;height:30px;border-radius:7px;
    font-size:13px;color:var(--text-3);transition:.15s;user-select:none;
  }
  .aform-seg input:checked + span{
    background:#fff;color:var(--primary);font-weight:600;
    box-shadow:0 1px 4px rgba(17,20,30,.14), inset 0 0 0 1px rgb(var(--primary-rgb) / .28);
  }
  .aform-seg label:hover span{color:var(--text-2)}
  .aform-seg input:checked + span:hover{color:var(--primary)}
  /* 输入控件 */
  .aform-in{
    flex:1;min-width:0;height:40px;border:1px solid var(--border);border-radius:8px;padding:0 12px;
    font-size:13.5px;color:var(--text);background:#fff;font-family:inherit;box-sizing:border-box;
    transition:border-color .15s, box-shadow .15s;
  }
  .aform-in:focus{outline:none;border-color:rgb(var(--primary-rgb) / .6);box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .13)}
  .aform-in::placeholder{color:#B4B9C6}
  /* 省 / 市 / 区 三个下拉挤在一行：去掉多余内边距，字号收小一档 */
  .aform-field>.aform-in{flex:1;min-width:0}
  #afProv,#afCity,#afDist{padding:0 4px;font-size:12.5px;cursor:pointer}
  #afLng,#afLat{font-size:11.5px;letter-spacing:.2px;padding:0 6px;background:#F7F8FA}
  /* 配送距离：算出来是驾车距离就绿色，没算出来是灰的提示 */
  .aform-dist{font-size:13px;font-weight:600;color:var(--text-3);white-space:nowrap;font-variant-numeric:tabular-nums}
  .aform-dist.ok{color:#0E7C66}
  .aform-mini{
    flex:none;height:30px;padding:0 10px;border:1px solid var(--border);border-radius:7px;
    background:#fff;font-size:12px;color:var(--text-2);cursor:pointer;font-family:inherit;transition:.15s;
  }
  .aform-mini:hover{border-color:rgb(var(--primary-rgb) / .55);color:var(--primary);background:var(--primary-soft)}
  body.theme-dark .aform-mini{background:#1E2027;color:var(--text-2)}
  /* 地图容器：Leaflet 需要明确高度，否则底图铺不开 */
  .af-map{width:100%;height:100%;min-height:420px;border-radius:8px;background:#EEF0F4}
  .aform-loc{
    /* 左上角被 Leaflet 的缩放按钮占着，从 56px 起排，避免压住 +/- */
    position:absolute;left:56px;top:12px;right:12px;max-width:78%;z-index:900;
    padding:7px 11px;border-radius:8px;font-size:12px;line-height:1.5;
    color:var(--primary);background:rgba(255,255,255,.94);
    box-shadow:0 4px 16px rgba(17,20,30,.16);backdrop-filter:blur(4px);
    overflow:hidden;text-overflow:ellipsis;
  }
  .aform-loc.warn{color:#B42318;background:rgba(255,245,244,.96)}
  body.theme-dark .aform-loc{background:rgba(32,34,42,.94);color:#C4B5FD}
  body.theme-dark .aform-loc.warn{color:#FF9B9E;background:rgba(58,32,34,.94)}
  /* 地址搜索组件：输入 + 🔍 */
  .aform-field{flex:1;min-width:0;display:flex;gap:8px;align-items:center}
  .aform-search{
    flex:none;width:40px;height:40px;border:1px solid var(--border);border-radius:8px;background:#fff;
    font-size:14px;cursor:pointer;color:var(--text-2);transition:.15s;
  }
  .aform-search:hover{border-color:rgb(var(--primary-rgb) / .55);color:var(--primary);background:var(--primary-soft)}
  /* 地图定位结果卡片 / 复位按钮 */
  .aform-geo{
    position:absolute;left:12px;top:12px;padding:8px 12px;border-radius:8px;max-width:75%;
    background:rgba(255,255,255,.94);box-shadow:0 4px 16px rgba(17,20,30,.16);backdrop-filter:blur(4px);
  }
  .aform-geo .t{font-size:12.5px;font-weight:600;color:var(--primary);margin-bottom:2px}
  .aform-geo .c{font-size:11px;color:#7A8290;font-family:Consolas,monospace}
  .aform-reset{
    position:absolute;right:12px;top:12px;height:26px;padding:0 12px;border:none;border-radius:999px;
    background:rgba(255,255,255,.94);box-shadow:0 2px 10px rgba(17,20,30,.14);
    font-size:11.5px;color:#5A6473;cursor:pointer;
  }
  .aform-reset:hover{color:var(--primary)}
  /* 保存 + 提示 */
  .aform-save{height:40px;border-radius:8px;font-weight:600;letter-spacing:6px;padding:0 34px}
  .aform-hint{font-size:11.5px;color:var(--text-3);margin-left:84px;margin-top:-8px}
  .aform-hint i{color:#E5484D;font-style:normal}
  .aform-hint span{color:var(--primary);font-weight:600}
  /* 详细地址只读：由选定点位的地址数据带出来，浅底表示不可手打 */
  .aform-in[readonly]{background:#F7F8FA;color:var(--text-2);cursor:default}
  .aform-in[readonly]::placeholder{color:#B4B9C6}
  body.theme-dark .aform-in[readonly]{background:#17181D;color:var(--text-2)}
  /* 所在区域：默认区域锁成一句结论，点「修改」才展开三级下拉 */
  .aform-region{flex:1;min-width:0;display:flex;align-items:center;gap:8px}
  /* display:flex 会盖掉 [hidden] 的默认 display:none，必须显式补回来 */
  .aform-region[hidden],.aform-sels[hidden]{display:none}
  .aform-region-t{
    flex:1;min-width:0;height:40px;display:flex;align-items:center;padding:0 12px;border-radius:8px;
    border:1px solid rgb(var(--primary-rgb) / .26);background:rgb(var(--primary-rgb) / .05);
    font-size:13px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-sizing:border-box;
  }
  .aform-region-t.is-empty{color:var(--text-3);border-color:var(--border);background:transparent}
  .aform-sels{display:flex;gap:8px;flex:1;min-width:0}
  /* 类型没选时把分段控件描红，配合顶部 toast */
  .aform-seg.is-err{box-shadow:inset 0 0 0 1px #E5484D;background:rgba(229,72,77,.06)}
  /* 名称搜索结果：fixed 定位，避免被弹窗的 overflow 裁掉；列表内部滚动，滚轮不外溢 */
  .af-res{
    position:fixed;z-index:8600;overflow:auto;overscroll-behavior:contain;padding:0 6px 6px;border-radius:10px;
    background:var(--panel);border:1px solid var(--border);box-shadow:0 18px 44px rgba(17,20,30,.22);
  }
  .af-res::-webkit-scrollbar{width:8px}
  .af-res::-webkit-scrollbar-thumb{background:rgba(130,140,160,.4);border-radius:4px}
  .af-res::-webkit-scrollbar-track{background:transparent}
  .af-res-hd{
    position:sticky;top:0;z-index:2;margin:0 -6px 4px;padding:9px 12px 8px;
    background:var(--panel);border-radius:10px 10px 0 0;border-bottom:1px solid var(--border);
    font-size:11.5px;color:var(--text-3);
  }
  .af-res-it{
    display:flex;align-items:baseline;gap:9px;width:100%;padding:8px 9px;border:none;border-radius:7px;
    background:transparent;text-align:left;cursor:pointer;font-family:inherit;
  }
  .af-res-it:hover,.af-res-it:focus-visible{background:var(--primary-soft);outline:none}
  .af-res-n{font-size:13px;font-weight:600;color:var(--text);max-width:52%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .af-res-a{flex:1;min-width:0;font-size:11.5px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .af-res-d{flex:none;font-size:11px;color:var(--primary);background:rgb(var(--primary-rgb) / .1);padding:1px 6px;border-radius:999px}
  .af-res-empty{padding:12px 10px;font-size:12px;line-height:1.75;color:var(--text-3)}
  body.theme-dark .af-res{background:#1E2027;border-color:#2C2F3A}
  /* 设置页 · 默认所在区域 */
  .if-region{display:flex;flex-wrap:wrap;gap:8px;align-items:center;width:100%}
  .if-region>select{flex:1;min-width:96px}
  .if-region-clr{
    flex:none;width:30px;height:30px;border:1px solid var(--border);border-radius:7px;background:#fff;
    color:var(--text-3);cursor:pointer;font-size:12px;line-height:1;transition:.15s;
  }
  .if-region-clr:hover{border-color:rgba(229,72,77,.5);color:#E5484D;background:rgba(229,72,77,.06)}
  body.theme-dark .if-region-clr{background:#1E2027;color:var(--text-2)}
  .if-region-tip{width:100%;font-size:11.5px;line-height:1.65;color:var(--text-3)}
  /* 地址列表 · 距离口径（KM 后面跟 骑行 / 驾车 / 直线 小字） */
  .adr-dist-v small{margin-left:3px;font-size:10px;font-weight:600;color:var(--text-3)}
  /* 地图面板 */
  .aform-map{
    flex:1;min-width:0;position:relative;border-radius:10px;overflow:hidden;
    border:1px solid var(--border);background:#F6F4EE;
  }
  .aform-map-tip{
    position:absolute;left:12px;bottom:12px;z-index:900;padding:5px 12px;font-size:11.5px;border-radius:999px;
    color:#7A8290;background:rgba(255,255,255,.92);backdrop-filter:blur(4px);
    box-shadow:0 2px 10px rgba(17,20,30,.12);
  }
  body.theme-dark .aform-in{background:#1E2027;color:var(--text)}
  body.theme-dark .aform-seg{background:#17181D}
  body.theme-dark .aform-seg input:checked + span{background:#2A2C36}

  /* ---------- 档案中心 · 会员列表（只读，外部数据） ---------- */
  .mem-card{max-width:1600px}
  .mem-banner{
    display:flex;align-items:center;gap:8px;margin-bottom:14px;
    padding:9px 14px;border-radius:9px;font-size:12.5px;color:var(--text-2);
    background:rgb(var(--primary-rgb) / .06);border:1px solid rgb(var(--primary-rgb) / .18);
  }
  .mem-banner .ico{font-size:14px}
  /* 商品中心说明横幅：标题 + 补充说明两行，避免长句折行混乱 */
  .gr-banner{
    display:flex;align-items:flex-start;gap:12px;margin-bottom:14px;
    padding:12px 16px;border-radius:10px;
    background:rgb(var(--primary-rgb) / .06);border:1px solid rgb(var(--primary-rgb) / .18);
  }
  .gr-banner .gr-banner-ico{font-size:20px;line-height:1.4;flex:none}
  .gr-banner .gr-banner-txt .t{font-size:13px;font-weight:700;color:var(--text);margin-bottom:3px}
  .gr-banner .gr-banner-txt .d{font-size:12.5px;line-height:1.7;color:var(--text-2)}
  /* 会员头像 / 等级徽章 */
  .mem-user{display:inline-flex;align-items:center;gap:9px}
  .mem-ava{
    width:30px;height:30px;border-radius:50%;flex:none;
    display:inline-flex;align-items:center;justify-content:center;
    font-size:13px;font-weight:700;color:#fff;
  }
  .mem-ava.gold{background:linear-gradient(135deg,#F59E0B,#D97706)}
  .mem-ava.silver{background:linear-gradient(135deg,#94A3B8,#64748B)}
  .mem-ava.normal{background:linear-gradient(135deg,#A78BFA,#7C3AED)}
  .mem-ava.xl{width:52px;height:52px;font-size:22px}
  .mem-name{color:var(--text);font-weight:600;font-size:13px}
  .mem-lv{
    display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:10px;
    font-size:11.5px;font-weight:600;border:1px solid transparent;
  }
  .mem-lv.gold{background:#FFF7E6;color:#B45309;border-color:#F7E3BC}
  .mem-lv.silver{background:#F1F5F9;color:#475569;border-color:#DDE3EC}
  .mem-lv.normal{background:var(--primary-soft);color:var(--primary);border-color:rgb(var(--primary-rgb) / .25)}
  /* 「本地」标识：本站自建会员。绿色系，和中仑同步来的会员一眼能分开 */
  .mem-src{
    display:inline-flex;align-items:center;height:18px;padding:0 6px;border-radius:4px;
    font-style:normal;font-size:10.5px;font-weight:600;letter-spacing:.5px;
    color:#1a7f37;background:rgba(26,127,55,.12);border:1px solid rgba(26,127,55,.28);
  }
  body.theme-dark .mem-src{color:#6fdc8c;background:rgba(111,220,140,.14);border-color:rgba(111,220,140,.3)}
  .mem-table{min-width:960px}
  .mem-table tbody tr{cursor:pointer}
  .mem-empty{text-align:center;padding:38px 0 !important;color:var(--text-3);font-size:13px}
  /* ---------- 会员详情抽屉 ---------- */
  .mem-drawer-mask{
    position:fixed;inset:0;z-index:220;background:rgba(20,24,35,.38);
    opacity:0;transition:opacity .22s;backdrop-filter:blur(2px);
  }
  .mem-drawer-mask.open{opacity:1}
  /* 悬浮岛形态（2026-11-04）：上下左右都不贴边，四角都是圆的，从右侧带一点位移滑进来。
     以前贴死右边、圆角只在左侧，看着像「侧栏」而不是「浮层」；拉开 14px 之后
     下面的页面还露一圈，用户知道自己是浮在上面、关掉就回原页面。 */
  .mem-drawer{
    position:absolute;top:14px;right:14px;bottom:14px;width:min(480px,94vw);
    background:var(--panel);border:1px solid var(--border);border-radius:16px;
    box-shadow:0 24px 70px rgba(17,20,30,.26);
    transform:translateX(28px) scale(.994);opacity:0;
    transition:transform .26s cubic-bezier(.22,1,.36,1),opacity .18s ease;
    display:flex;flex-direction:column;overflow:hidden;
  }
  .mem-drawer-mask.open .mem-drawer{transform:none;opacity:1}
  .mem-d-head{
    flex:none;display:flex;align-items:center;justify-content:space-between;
    padding:16px 20px;border-bottom:1px solid var(--border);
  }
  .mem-d-title{font-size:15px;font-weight:700;color:var(--text);display:flex;align-items:center;gap:10px}
  .mem-d-readonly{
    font-size:11px;font-weight:500;color:var(--text-3);padding:2px 8px;border-radius:9px;
    background:rgba(120,130,150,.10);
  }
  .mem-d-body{flex:1;overflow-y:auto;padding:20px}
  .mem-d-loading{text-align:center;color:var(--text-3);padding:60px 0;font-size:13px}
  .mem-d-id{display:flex;align-items:center;gap:14px;margin-bottom:18px}
  .mem-d-name{font-size:17px;font-weight:700;color:var(--text);display:flex;align-items:center;gap:8px}
  .mem-d-phone{font-size:13px;color:var(--text-2);margin-top:3px}
  /* minmax(0,1fr)：会员编码这种 19 位长数字会把 1fr 的 min-width 撑开，
     导致右侧「注册渠道」被压成三行；用 minmax(0,..) 强制等分，长内容在格内换行。 */
  .mem-d-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-bottom:18px}
  /* 本地账本操作条：充值 / 赠送 / 并入中仑 */
  .mem-d-ops{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 10px}
  .mem-d-merge-tip{
    margin:0 0 12px;padding:7px 10px;border-radius:8px;font-size:11.5px;line-height:1.7;
    color:#1a7f37;background:rgba(26,127,55,.08);border:1px solid rgba(26,127,55,.2);
  }
  body.theme-dark .mem-d-merge-tip{color:#6fdc8c;background:rgba(111,220,140,.1);border-color:rgba(111,220,140,.22)}
  .mem-d-cell{
    border:1px solid var(--border);border-radius:10px;padding:10px 12px;
    display:flex;flex-direction:column;gap:4px;background:rgba(120,130,150,.04);
  }
  .mem-d-cell.wide{grid-column:span 3}
  .mem-d-cell .k{font-size:11.5px;color:var(--text-3)}
  .mem-d-cell .v{font-size:14.5px;font-weight:700;color:var(--text);overflow-wrap:anywhere}
  .mem-d-cell .v small{font-size:11.5px;font-weight:500;color:var(--text-3)}
  .mem-d-sec{
    font-size:13px;font-weight:700;color:var(--text);margin:18px 0 10px;
    display:flex;align-items:center;gap:8px;
  }
  .mem-d-count{font-size:11.5px;font-weight:500;color:var(--text-3)}
  .mem-d-tags{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
  .mem-d-notag{font-size:12.5px;color:var(--text-3)}
  /* 累计消费异步补算中：先给个「…」的呼吸感，别让格子空着像坏了 */
  .mem-spend-loading{color:var(--text-3);font-weight:500;font-size:13px;animation:memSpendPulse 1.2s ease-in-out infinite}
  @keyframes memSpendPulse{0%,100%{opacity:.45}50%{opacity:1}}
  @media (prefers-reduced-motion:reduce){ .mem-spend-loading{animation:none;opacity:.75} }
  /* 抽屉页签：会员资料 / 积分记录 / 余额变动 */
  .mem-d-tabs{display:flex;gap:6px;margin:-2px 0 14px;border-bottom:1px solid var(--border);padding-bottom:0}
  .mem-d-tab{
    border:none;background:transparent;cursor:pointer;font-family:inherit;font-size:13px;
    color:var(--text-2);padding:8px 12px;border-bottom:2px solid transparent;margin-bottom:-1px;
  }
  .mem-d-tab:hover{color:var(--text)}
  .mem-d-tab.on{color:var(--primary);border-bottom-color:var(--primary);font-weight:600}
  .mem-d-sync{
    display:flex;align-items:center;gap:10px;justify-content:space-between;
    margin-bottom:12px;padding:8px 10px;border-radius:9px;background:rgba(120,130,150,.06);
  }
  .mem-d-sync-t{font-size:11.5px;color:var(--text-3)}
  /* 积分 / 储值流水 */
  .mem-log-head{font-size:11.5px;color:var(--text-3);margin:2px 0 8px}
  .mem-log-note{font-size:11.5px;color:var(--text-3);margin:-4px 0 8px;opacity:.9}
  .mem-log{
    border:1px solid var(--border);border-radius:10px;padding:9px 11px;margin-bottom:7px;
    background:rgba(120,130,150,.03);
  }
  .ml-top{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
  .ml-type{font-size:13px;font-weight:600;color:var(--text)}
  .ml-amt{font-size:14px;font-weight:700;font-variant-numeric:tabular-nums}
  .ml-amt.in{color:#E5484D}     /* 增加（充值 / 得积分）用红：中式记账口径 */
  .ml-amt.out{color:#16A34A}    /* 减少用绿 */
  .ml-amt.zero{color:var(--text-3)}
  .ml-sub{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:11.5px;color:var(--text-2);margin-top:3px}
  .ml-sub.ml-dim{color:var(--text-3);justify-content:flex-start;flex-wrap:wrap;gap:6px}
  .ml-remain{color:var(--text-3)}
  .mem-log-more{width:100%;margin-top:4px}
  .tag-pill.tag-erp{background:rgb(var(--primary-rgb) / .1);border-color:rgb(var(--primary-rgb) / .3);color:var(--primary)}
  /* 会员列表里的标签列：最多两个胶囊 + +N */
  .mem-tags{display:inline-flex;align-items:center;gap:4px;max-width:100%;overflow:hidden}
  .tag-pill.sm{height:20px;padding:0 7px;font-size:11px;border-radius:10px;flex:none}
  .tag-pill.sm.tag-more{background:transparent;color:var(--text-3)}
  /* ---------- 地址批量导入弹窗 ---------- */
  .dlg-import{height:auto;max-height:calc(100vh - 48px);width:min(920px,calc(100vw - 32px))}
  .dlg-import .imp-body{padding:16px 18px;overflow:auto;flex:1;min-height:0}
  .dlg-import .gsel-foot{padding:10px 18px 12px;border-top:1px solid var(--border)}
  .imp-step{margin-bottom:16px}
  .imp-step:last-child{margin-bottom:4px}
  .imp-t{font-size:13px;font-weight:700;color:var(--text);margin-bottom:8px}
  .imp-sum{font-weight:500;font-size:12px;color:var(--text-3);margin-left:6px}
  .imp-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
  .imp-hint{font-size:11.5px;color:var(--text-3);line-height:1.6}
  .imp-file{font-size:12px;color:var(--text-2)}
  .imp-text{
    width:100%;min-height:84px;resize:vertical;margin-bottom:8px;
    font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.7;
  }
  .imp-opts{display:flex;gap:18px;flex-wrap:wrap;font-size:12.5px;color:var(--text-2);margin-bottom:10px}
  .imp-opts label{display:inline-flex;align-items:center;gap:6px;cursor:pointer}
  .imp-prev{max-height:290px;overflow:auto;border:1px solid var(--border);border-radius:10px}
  .imp-prev table{width:100%;table-layout:fixed}
  .imp-prev th{position:sticky;top:0;z-index:1;background:var(--panel)}
  .imp-prev td,.imp-prev th{font-size:12px;padding:7px 9px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .imp-prev tr.imp-dup td{color:var(--text-3)}
  .imp-tag{font-size:11px;padding:1px 7px;border-radius:999px;white-space:nowrap}
  .imp-tag.imp-ok{background:rgba(22,163,74,.12);color:#16A34A}
  .imp-tag.imp-dup{background:rgba(120,130,150,.15);color:var(--text-3)}
  .imp-tag.imp-bad{background:rgba(229,72,77,.12);color:#E5484D}
  .imp-more{text-align:center;color:var(--text-3);font-size:11.5px;padding:8px}
  .imp-prog{height:6px;border-radius:3px;background:rgba(120,130,150,.15);overflow:hidden;margin-top:6px}
  .imp-prog i{display:block;height:100%;width:0;background:var(--primary);transition:width .2s}
  .imp-status{font-size:11.5px;color:var(--text-2);margin-top:8px;min-height:16px}
  .dlg-import .imp-actions{display:flex;gap:8px}
  /* 会员标签编辑：胶囊内嵌删除按钮 */
  .tag-pill.tag-edit{padding-right:5px;gap:2px}
  .tag-pill .tag-del{
    border:none;background:transparent;cursor:pointer;color:var(--text-3);
    font-size:11px;line-height:1;padding:2px 3px;border-radius:50%;margin-left:2px;
  }
  .tag-pill .tag-del:hover{background:rgba(239,68,68,.12);color:#EF4444}
  .tag-pill.tag-add{
    cursor:pointer;border-style:dashed;color:var(--primary);font-weight:600;background:#fff;
  }
  .tag-pill.tag-add:hover{border-color:rgb(var(--primary-rgb) / .55);background:var(--primary-soft)}
  .md-tag-editor{display:flex;gap:8px;margin-top:10px}
  .md-tag-editor[hidden]{display:none}
  .md-tag-in{
    flex:1;min-width:0;height:32px;padding:0 10px;border:1px solid var(--border);border-radius:8px;
    font-size:13px;color:var(--text);background:#fff;outline:none;
  }
  .md-tag-in:focus{border-color:rgb(var(--primary-rgb) / .6);box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .12)}
  .md-tag-ok{height:32px;padding:0 14px;flex:none}
  .md-tag-sug{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:10px}
  .md-tag-sug-label{font-size:11.5px;color:var(--text-3)}
  .md-tag-chip{
    cursor:pointer;height:24px;padding:0 9px;border-radius:12px;font-size:12px;
    border:1px dashed var(--border);background:#FAFAFC;color:var(--text-2);
  }
  .md-tag-chip:hover{border-color:rgb(var(--primary-rgb) / .5);color:var(--primary);background:var(--primary-soft)}
  .mem-d-remark{
    padding:10px 12px;border-radius:9px;font-size:12.5px;color:var(--text-2);line-height:1.6;
    background:rgba(245,166,35,.08);border:1px solid rgba(245,166,35,.22);
  }
  .mem-d-orders{display:flex;flex-direction:column;gap:8px}
  .mem-d-order{
    border:1px solid var(--border);border-radius:10px;padding:11px 13px;transition:.15s;
  }
  .mem-d-order:hover{border-color:rgb(var(--primary-rgb) / .40)}
  .mo-top{display:flex;align-items:center;gap:8px}
  .mo-no{font-size:12.5px;color:var(--text);font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .mo-amt{font-size:13px}
  .mo-goods{font-size:12.5px;color:var(--text-2);margin-top:5px;line-height:1.5}
  .mo-sub{font-size:11.5px;color:var(--text-3);margin-top:3px}
  .mem-d-noorder{
    text-align:center;color:var(--text-3);font-size:12.5px;
    padding:26px 0;border:1px dashed var(--border);border-radius:10px;
  }
  /* 暗色主题 */
  body.theme-dark .mem-ava.silver{background:linear-gradient(135deg,#64748B,#475569)}
  body.theme-dark .mem-lv.gold{background:rgba(245,158,11,.14);color:#FBBF24;border-color:rgba(245,158,11,.30)}
  body.theme-dark .mem-lv.silver{background:rgba(148,163,184,.12);color:#B6C2D2;border-color:rgba(148,163,184,.28)}
  body.theme-dark .mem-drawer{background:#1E2027;box-shadow:0 24px 70px rgba(0,0,0,.55)}
  body.theme-dark .mem-d-cell{background:rgba(255,255,255,.03)}
  body.theme-dark .mem-d-remark{background:rgba(245,166,35,.10);border-color:rgba(245,166,35,.25);color:var(--text-2)}
  body.theme-dark .mem-d-order:hover{border-color:rgb(var(--primary-rgb) / .45)}
  /* ---------- 会员详情 · 商品记录（2026-11-06） ----------
     抽屉只有 480px：六项内容分三行摆（名称 / 单位·数量·单价·合计 / 日期·单号），
     挤成七列表格会全部截断。复购按钮跟名称同一行右侧，位置固定好点。 */
  .mem-d-goods{display:flex;flex-direction:column;gap:8px}
  .mem-goods-row{
    border:1px solid var(--border);border-radius:10px;padding:10px 12px;
    background:rgba(120,130,150,.03);
  }
  .mem-goods-row.is-gift{background:rgba(204,118,53,.07);border-color:rgba(204,118,53,.28)}
  .mg-top{display:flex;align-items:flex-start;gap:8px}
  .mg-n{
    flex:1;min-width:0;font-size:13px;font-weight:600;color:var(--text);line-height:1.5;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  }
  .mg-buy{flex:none;height:26px;padding:0 10px;font-size:12px;line-height:1}
  .mg-meta{display:flex;align-items:center;gap:5px;flex-wrap:wrap;margin-top:5px;font-size:11.5px;color:var(--text-2)}
  .mg-dot{color:var(--text-3)}
  .mg-sum{color:var(--text);font-weight:600}
  .mg-gift{
    font-style:normal;font-size:10.5px;font-weight:600;color:#A85E27;
    background:rgba(204,118,53,.14);padding:0 5px;border-radius:4px;
  }
  .mg-sub{margin-top:4px;font-size:11px;color:var(--text-3)}
  /* 商品记录底部：读取范围提示 + 调整入口（2026-11-08）
     提示常驻在列表最下面，空状态也带着 —— 否则「近 365 天没买过」看着像这会员一次都没来过。
     虚线框是为了和上面的商品卡片区分开：这是「说明」不是一条明细。 */
  .mem-hist-foot{
    display:flex;align-items:center;gap:10px;margin-top:10px;padding:9px 11px;
    border:1px dashed var(--border);border-radius:10px;background:rgba(120,130,150,.04);
  }
  .mhf-txt{flex:1;min-width:0}
  .mhf-main{font-size:12px;font-weight:600;color:var(--text-2)}
  .mhf-sub{font-size:11px;color:var(--text-3);margin-top:2px}
  .mhf-btn{
    flex:none;border:1px solid var(--border);background:var(--panel);color:var(--text-2);
    font-family:inherit;font-size:11.5px;padding:4px 9px;border-radius:7px;cursor:pointer;
  }
  .mhf-btn:hover{color:var(--primary);border-color:rgb(var(--primary-rgb) / .45)}
  .mh-tip{color:var(--text-3);font-size:11.5px}
  body.theme-dark .mem-hist-foot{background:rgba(255,255,255,.03)}
  body.theme-dark .mem-goods-row{background:rgba(255,255,255,.03)}

  /* ---------- 档案中心 · 地址列表（与发单页共用地址簿） ---------- */
  /* ---------- 订单日志抽屉（复用 mem-drawer 外壳，仅内容不同） ---------- */
  .olog-ov{border:1px solid var(--border);border-radius:12px;padding:12px 14px;margin-bottom:2px;background:rgba(120,130,150,.04)}
  .olog-ov-st{margin-bottom:8px}
  .olog-ov-row{display:flex;justify-content:space-between;font-size:12.5px;padding:3px 0}
  .olog-ov-row .k{color:var(--text-3)}
  .olog-ov-row .v{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}
  .olog-sec{font-size:13px;font-weight:700;color:var(--text);margin:18px 0 10px;display:flex;align-items:center;gap:8px}
  .olog-sec-tip{margin-left:auto;font-weight:500;font-size:11px;color:var(--text-3)}
  .olog-sum{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  .olog-cell{border:1px solid var(--border);border-radius:10px;padding:9px 11px;display:flex;flex-direction:column;gap:4px;background:rgba(120,130,150,.04);min-width:0}
  .olog-cell.wide{grid-column:span 2}
  .olog-cell .k{font-size:11.5px;color:var(--text-3)}
  .olog-cell .v{font-size:13.5px;font-weight:700;color:var(--text);word-break:break-all;line-height:1.5}
  .olog-tl{list-style:none;margin:4px 0 0;padding:0}
  .olog-node{display:grid;grid-template-columns:62px 22px 1fr;align-items:stretch}
  .olog-time{font-size:12px;color:var(--text-2);text-align:right;padding:12px 8px 0 0;font-variant-numeric:tabular-nums;white-space:nowrap}
  .olog-rail{position:relative;display:flex;justify-content:center}
  .olog-rail::before{content:'';position:absolute;top:14px;bottom:-2px;width:2px;background:var(--border)}
  .olog-node:last-child .olog-rail::before{bottom:auto;height:18px}
  .olog-dot{position:relative;z-index:1;width:12px;height:12px;border-radius:50%;margin-top:14px;background:var(--text-3);border:2px solid var(--panel)}
  .olog-node.done .olog-dot{background:var(--primary)}
  .olog-node.warn .olog-dot{background:#F5A623}
  .olog-node.cancel .olog-dot{background:#EF4444}
  .olog-node.mut .olog-dot{background:#9AA3B2}
  .olog-node.pending .olog-dot{background:var(--panel);border-color:var(--border)}
  .olog-card{border:1px solid var(--border);border-radius:10px;padding:10px 12px;margin:2px 0 16px;background:rgba(120,130,150,.04)}
  .olog-node.cancel .olog-card{border-color:rgba(239,68,68,.30);background:rgba(239,68,68,.04)}
  .olog-node.warn .olog-card{border-color:rgba(245,166,35,.30);background:rgba(245,166,35,.05)}
  .olog-nt{font-size:13.5px;font-weight:700;color:var(--text);display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  .olog-badge{font-size:11px;font-weight:600;padding:1px 8px;border-radius:9px;white-space:nowrap}
  .olog-badge.ok{background:rgba(7,193,96,.12);color:#07A05A}
  .olog-badge.warn{background:rgba(245,166,35,.14);color:#C77A12}
  .olog-badge.late{background:rgba(239,68,68,.12);color:#D92D20}
  .olog-badge.mut{background:rgba(120,130,150,.12);color:var(--text-3)}
  .olog-nd{margin-top:6px;font-size:12.5px;color:var(--text-2);line-height:1.7}
  .olog-nd .r{display:flex;gap:6px}
  .olog-nd .r .k{color:var(--text-3);flex:none;min-width:72px}
  .olog-nd .r .v{color:var(--text);flex:1;word-break:break-all}
  .olog-remarks{border:1px solid var(--border);border-radius:10px;padding:10px 12px;background:rgba(245,166,35,.06);display:flex;flex-direction:column;gap:6px}
  .olog-remarks .k{color:var(--text-3);margin-right:6px}
  .olog-remarks span:last-child{color:var(--text-2);line-height:1.6}
  /* 暗色主题 */
  body.theme-dark .olog-ov{background:rgba(255,255,255,.03)}
  body.theme-dark .olog-cell{background:rgba(255,255,255,.03)}
  body.theme-dark .olog-card{background:rgba(255,255,255,.03)}
  body.theme-dark .olog-node.cancel .olog-card{background:rgba(239,68,68,.08)}
  body.theme-dark .olog-node.warn .olog-card{background:rgba(245,166,35,.08)}
  body.theme-dark .olog-remarks{background:rgba(245,166,35,.08)}

  /* ---------- 商品详情抽屉（复用 mem-drawer 外壳） ---------- */
  .gd-hero{display:flex;gap:14px;align-items:flex-start}
  .gd-main{
    width:170px;height:170px;border-radius:12px;flex:none;position:relative;overflow:hidden;
    display:flex;align-items:center;justify-content:center;
    color:#fff;font-size:46px;font-weight:700;
  }
  .gd-main-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
  /* 主图可点放大：右下角一个小角标提示「能点」，悬停时图片轻微提亮 */
  .gd-main.zoomable{cursor:zoom-in}
  .gd-main.zoomable:hover .gd-main-img{filter:brightness(1.06)}
  .gd-zoom{
    position:absolute;right:6px;bottom:6px;z-index:2;width:22px;height:22px;
    display:flex;align-items:center;justify-content:center;
    border:0;border-radius:6px;padding:0;cursor:zoom-in;
    font-size:12px;line-height:1;color:#fff;
    background:rgba(15,18,26,.5);backdrop-filter:blur(2px);
  }
  .gd-zoom:hover{background:rgba(15,18,26,.72)}
  .gd-side{min-width:0;flex:1;display:flex;flex-direction:column;gap:8px;padding-top:2px}
  .gd-name{font-size:15.5px;font-weight:700;color:var(--text);line-height:1.5;word-break:break-all}
  .gd-tags{display:flex;flex-wrap:wrap;gap:5px}
  .gd-tag{
    font-size:11px;line-height:18px;padding:0 7px;border-radius:9px;white-space:nowrap;
    color:var(--text-2);background:rgba(120,130,150,.12);
  }
  .gd-tag.type{color:#C2570B;background:rgba(245,166,35,.16)}
  .gd-tag.void{color:#D92D20;background:rgba(239,68,68,.12)}
  .gd-tag.stop{color:#C77A12;background:rgba(245,166,35,.14)}
  .gd-price{display:flex;align-items:baseline;gap:6px}
  .gd-price .k{font-size:11.5px;color:var(--text-3)}
  .gd-price .v{font-size:21px;font-weight:800;color:#D92D20;font-variant-numeric:tabular-nums}
  .gd-price .u{font-size:11.5px;color:var(--text-3)}
  .gd-note{font-size:12px;color:var(--text-2);line-height:1.6;word-break:break-all}
  .gd-note .k{color:var(--text-3);margin-right:6px}
  .gd-thumbs{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
  .gd-thumb{
    width:58px;height:58px;padding:0;border-radius:8px;overflow:hidden;cursor:pointer;
    border:2px solid transparent;background:rgba(120,130,150,.08);
  }
  .gd-thumb.on{border-color:var(--primary)}
  .gd-thumb img{width:100%;height:100%;object-fit:cover;display:block}
  .gd-sec{font-size:13px;font-weight:700;color:var(--text);margin:18px 0 10px;display:flex;align-items:center;gap:8px}
  .gd-sec-tip{margin-left:auto;font-weight:500;font-size:11px;color:var(--text-3)}
  .gd-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  .gd-cell{
    border:1px solid var(--border);border-radius:10px;padding:9px 11px;
    display:flex;flex-direction:column;gap:3px;min-width:0;background:rgba(120,130,150,.04);
  }
  .gd-cell .k{font-size:11.5px;color:var(--text-3)}
  .gd-cell .v{font-size:13.5px;font-weight:700;color:var(--text);word-break:break-all;line-height:1.5}
  .gd-cell .v small{font-size:11px;font-weight:500;color:var(--text-3)}
  .gd-units{width:100%;border-collapse:collapse;font-size:12.5px}
  .gd-units th{
    text-align:left;font-weight:500;color:var(--text-3);padding:7px 8px;white-space:nowrap;
    background:rgba(120,130,150,.05);border-bottom:1px solid var(--border);
  }
  .gd-units td{padding:8px;border-bottom:1px solid var(--border);color:var(--text-2);font-variant-numeric:tabular-nums}
  .gd-units tr.on td{color:var(--text);font-weight:700;background:rgb(var(--primary-rgb) / .05)}
  .gd-base{
    margin-left:5px;font-size:10px;font-weight:600;padding:1px 5px;border-radius:7px;
    color:var(--primary);background:rgb(var(--primary-rgb) / .12);vertical-align:1px;
  }
  body.theme-dark .gd-cell{background:rgba(255,255,255,.03)}
  body.theme-dark .gd-thumb{background:rgba(255,255,255,.05)}
  body.theme-dark .gd-units th{background:rgba(255,255,255,.04)}

  /* ---------- 图片放大查看（灯箱，点商品主图打开） ---------- */
  /* 看图器固定深色：商品图多是白底电商图，浅色遮罩会糊成一片，深色才有对比 */
  .imgv-mask{
    position:fixed;inset:0;z-index:900;display:flex;flex-direction:column;
    background:rgba(10,12,18,.93);opacity:0;transition:opacity .18s;
  }
  .imgv-mask.open{opacity:1}
  .imgv-bar{
    display:flex;align-items:center;gap:10px;padding:12px 16px;color:#fff;flex:none;
    background:linear-gradient(180deg, rgba(0,0,0,.55), rgba(0,0,0,0));
  }
  .imgv-title{
    font-size:13.5px;font-weight:600;max-width:60vw;color:#fff;
    text-shadow:0 1px 3px rgba(0,0,0,.6);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .imgv-count{
    margin-left:auto;font-size:12px;color:rgba(255,255,255,.72);
    font-variant-numeric:tabular-nums;
  }
  .imgv-x{
    width:32px;height:32px;flex:none;border:0;border-radius:8px;cursor:pointer;
    color:#fff;font-size:15px;line-height:1;background:rgba(255,255,255,.12);
  }
  .imgv-x:hover{background:rgba(255,255,255,.22)}
  .imgv-stage{
    flex:1;min-height:0;position:relative;overflow:hidden;
    display:flex;align-items:center;justify-content:center;
    cursor:zoom-in;touch-action:none;
  }
  .imgv-stage.zoomed{cursor:grab}
  .imgv-stage.grabbing{cursor:grabbing}
  .imgv-img{
    max-width:92vw;max-height:calc(100vh - 132px);object-fit:contain;
    -webkit-user-drag:none;user-select:none;
    transform-origin:center center;transition:transform .16s ease;
    box-shadow:0 12px 40px rgba(0,0,0,.45);
  }
  .imgv-img.no-anim{transition:none}
  .imgv-nav{
    position:absolute;top:50%;transform:translateY(-50%);
    width:40px;height:40px;display:flex;align-items:center;justify-content:center;
    border:0;border-radius:50%;cursor:pointer;color:#fff;font-size:24px;line-height:1;
    background:rgba(255,255,255,.12);backdrop-filter:blur(4px);
  }
  .imgv-nav:hover{background:rgba(255,255,255,.24)}
  .imgv-nav.prev{left:16px}
  .imgv-nav.next{right:16px}
  .imgv-tips{
    flex:none;text-align:center;font-size:11.5px;color:rgba(255,255,255,.72);
    padding:10px 16px 14px;
    background:linear-gradient(0deg, rgba(0,0,0,.55), rgba(0,0,0,0));
  }
  .imgv-mask.failed .imgv-img{display:none}

  .adr-card{max-width:1600px}
  /* 门店档案：内容和另外两个档案页一样宽 */
  .st-card{max-width:1600px}
  .adr-table{min-width:980px}
  .adr-table tbody tr{cursor:default}
  .adr-type{
    display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:10px;
    font-size:11.5px;font-weight:600;border:1px solid transparent;
  }
  .adr-type.xiaoqu{background:#EBF9F1;color:#0E9F6E;border-color:#C7EFDD}
  .adr-type.fandian{background:#FFF1E6;color:#C2570B;border-color:#F8DDC4}
  .adr-type.qita{background:#EEF2FF;color:#4F5BC4;border-color:#DCE0FB}
  body.theme-dark .adr-type.xiaoqu{background:rgba(14,159,110,.14);color:#3DDCA0;border-color:rgba(14,159,110,.30)}
  body.theme-dark .adr-type.fandian{background:rgba(226,135,67,.14);color:#FFAB6B;border-color:rgba(226,135,67,.30)}
  body.theme-dark .adr-type.qita{background:rgba(99,112,220,.16);color:#A5AEFF;border-color:rgba(99,112,220,.32)}
  .adr-name{color:var(--text);font-weight:600;font-size:13px}
  .adr-desc{color:var(--text-2)}
  .adr-creator{
    display:inline-flex;align-items:center;gap:5px;color:var(--text-2);
  }
  .adr-creator::before{
    content:'';width:6px;height:6px;border-radius:50%;flex:none;
    background:linear-gradient(135deg,#A78BFA,#7C3AED);
  }
  .adr-use{font-weight:700;font-size:12.5px}
  .adr-use.hot{color:#C2570B}
  .adr-use.zero{color:var(--text-3);font-weight:500}
  body.theme-dark .adr-use.hot{color:#FFAB6B}
  /* 距门店：真实驾车距离加粗可读；未定位/未计算用浅灰说明，不冒充 0 公里 */
  .adr-dist{white-space:nowrap}
  .adr-dist-v{font-weight:700;font-size:12.5px;color:#0E7C66;font-variant-numeric:tabular-nums}
  .adr-dist-none{font-size:12px;color:var(--text-3)}
  body.theme-dark .adr-dist-v{color:#5EEAD4}

  /* ---------- 商品 · 商品中心页 ---------- */
  .gr-card{max-width:1600px}
  .gr-table{min-width:1140px}
  .gr-table tbody tr{cursor:default}
  .gr-table tbody tr:hover{background:rgb(var(--primary-rgb) / .03)}
  /* 货号多为 13 位条码，字号略小并禁止换行，避免被列宽裁掉 */
  .gr-code{color:var(--text-2);font-size:12px;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  /* 货号 / 条码两段式：上行货号（spucode），下行条码。一物多码（听 / 半箱 / 箱），
     最多铺 3 行，其余折成 “+N”，完整清单在单元格 title 里 */
  .gr-code .gr-code-no{display:block;color:var(--text);font-weight:600;font-size:12px;line-height:1.5}
  .gr-code .gr-bar{display:block;margin-top:1px;color:var(--text-3);font-size:11px;line-height:1.45;letter-spacing:.2px}
  .gr-code .gr-bar.more{color:var(--primary);font-weight:600}
  .gr-img{
    width:42px;height:42px;border-radius:9px;display:inline-flex;align-items:center;justify-content:center;
    font-size:22px;background:#F6F7FB;border:1px solid var(--border);overflow:hidden;flex:0 0 auto;
  }
  body.theme-dark .gr-img{background:rgba(255,255,255,.05)}
  /* 进销存同步来的真实商品图：等比裁切填满 42×42 圆角块 */
  .gr-img img{width:100%;height:100%;object-fit:cover;display:block;border-radius:8px}
  /* 无图 / 图片加载失败（img 被 onerror 移除）时回落 emoji 图标 */
  .gr-img:empty::after{content:attr(data-emoji);line-height:1}
  .gr-cat{font-size:12px;color:var(--text-2);line-height:1.35;word-break:break-all}
  .gr-name{color:var(--text);font-weight:600;font-size:13px;line-height:1.4;display:block}
  .gr-sub{margin-top:3px;display:flex;gap:10px;flex-wrap:wrap}
  .gr-sub span{font-size:11.5px;color:var(--text-3);line-height:1.4}
  .gr-price{font-variant-numeric:tabular-nums;color:var(--text)}
  .gr-price.vip{color:#C2570B;font-weight:600}
  body.theme-dark .gr-price.vip{color:#FFAB6B}
  /* 作废开关（开=已作废：商品不再进入接单选品，也无法被搜索到） */
  .gr-sw{
    display:inline-block;width:38px;height:20px;border-radius:10px;cursor:pointer;position:relative;
    background:#C9CEDA;transition:background .18s;vertical-align:middle;
  }
  .gr-sw::after{
    content:'';position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;
    background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25);transition:left .18s;
  }
  .gr-sw.on{background:#DC2626}
  .gr-sw.on::after{left:20px}
  .gr-sw:focus-visible{outline:2px solid rgba(220,38,38,.4);outline-offset:2px}
  /* 可赠开关：开 = 绿。和「隐藏」共用一套尺寸，但颜色必须区分开 ——
     两个开关挨着放，一红一绿才不会让人以为点的是同一个（红=停用、绿=允许）。 */
  .gr-sw.pos.on{background:#0E9F6E}
  .gr-sw.pos:focus-visible{outline:2px solid rgba(14,158,110,.4);outline-offset:2px}
  body.theme-dark .gr-sw.pos.on{background:#10B981}

  /* ---- 商品同步 / 实时库存 ---- */
  .gr-sync-bar{
    display:flex;flex-wrap:wrap;gap:6px 16px;margin:0 0 12px;padding:9px 14px;
    border-radius:9px;background:rgb(var(--primary-rgb) / .05);
    font-size:12px;color:var(--text-2);line-height:1.7;
  }
  .gr-sync-bar span{position:relative;padding-left:11px}
  .gr-sync-bar span::before{
    content:'';position:absolute;left:0;top:8px;width:4px;height:4px;border-radius:50%;
    background:var(--text-3);
  }
  .gr-sync-bar.warn{background:#FFF7E6;color:#A15C00}
  .gr-sync-bar.warn span::before{background:#D97706}
  body.theme-dark .gr-sync-bar.warn{background:rgba(245,158,11,.13);color:#FBBF24}

  /* 库存：多单位商品显示「12箱 3瓶」，单单位（白酒等）仍是一串数字。
     后面 .gr-table td{white-space:normal} 的优先级更高，这里必须带上 .gr-table，
     否则「70箱 1半箱」会被拆成两行，扫一眼分不清是同一格 */
  .gr-stock{font-variant-numeric:tabular-nums;font-weight:600;color:var(--text)}
  .gr-table .gr-stock{white-space:nowrap}
  .gr-stock.zero{color:#DC2626}
  .gr-stock.none{color:var(--text-3);font-weight:400}

  .gr-dlg{--dlg-w:680px;--dlg-h:620px}

  .gr-rule{display:flex;flex-direction:column;gap:9px;padding:2px 0 18px}
  .gr-rule .r{display:flex;gap:9px;font-size:12.5px;line-height:1.75;color:var(--text-2)}
  .gr-rule .r b{color:var(--text);font-weight:600}
  .gr-rule .r i{
    flex:none;width:18px;height:18px;border-radius:50%;margin-top:3px;
    display:flex;align-items:center;justify-content:center;
    font-style:normal;font-size:11px;font-weight:700;color:#fff;background:#12B76A;
  }
  .gr-rule .r i.plus{background:#3B82F6}

  .gr-prog{height:6px;border-radius:99px;background:rgb(var(--primary-rgb) / .12);overflow:hidden}
  .gr-prog-bar{height:100%;width:0;border-radius:99px;background:var(--primary);transition:width .25s ease}
  .gr-prog-txt{margin-top:10px;font-size:12.5px;color:var(--text-2);line-height:1.7;min-height:20px}
  .gr-prog-txt.done{color:#067647}
  .gr-prog-txt.err{color:#DC2626}

  .gr-set{display:flex;flex-direction:column;gap:2px}
  .gr-set-row{
    display:flex;align-items:flex-start;gap:14px;padding:9px 0;
    border-bottom:1px dashed var(--border);cursor:pointer;
  }
  .gr-set-row:last-child{border-bottom:0}
  /* display:flex 会盖掉 [hidden] 的浏览器默认样式，必须显式处理，否则切换模式时该隐藏的行仍会显示 */
  .gr-set-row[hidden]{display:none !important}
  .gr-set-row .k{flex:none;width:96px;font-size:12.5px;color:var(--text-2);padding-top:8px}
  .gr-set-row .v{
    flex:1;font-size:12.5px;color:var(--text-2);line-height:1.9;
    display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  }
  .gr-set-row .v input[type=checkbox]{width:15px;height:15px;accent-color:var(--primary);flex:none;margin:0}
  .gr-set-row .v .po-in{max-width:150px}
  .gr-set-row .v input[type=time]{max-width:132px}
  .gr-set-row .v select.po-in{max-width:180px}
  .gr-set-hint{
    margin-top:14px;padding:8px 12px;border-radius:8px;
    background:rgb(var(--primary-rgb) / .05);font-size:12px;color:var(--text-3);
  }
  /* 已作废行：名称置灰 + 角标 */
  .gr-table tr.is-void .gr-name{color:var(--text-3);text-decoration:line-through}
  .gr-table tr.is-void .gr-price,.gr-table tr.is-void .gr-code{color:var(--text-3)}
  .gr-table tr.is-void .gr-code .gr-code-no{color:var(--text-3)}
  .gr-void-tag{
    display:inline-block;margin-left:6px;padding:0 6px;height:17px;line-height:17px;border-radius:4px;
    font-size:10.5px;font-weight:600;color:#B91C1C;background:#FEE2E2;vertical-align:middle;
  }
  .gr-void-tag[hidden]{display:none}
  body.theme-dark .gr-void-tag{color:#FCA5A5;background:rgba(220,38,38,.18)}
  /* 进销存商品状态徽标：正常 / 停售 / 停购 / 淘汰。
     与「作废」是两个维度：作废是本站开关，这里是进销存的商品状态。 */
  .gr-st-cell{text-align:center}
  .gr-st{
    display:inline-block;padding:0 6px;height:19px;line-height:19px;border-radius:4px;
    font-size:11px;font-weight:600;white-space:nowrap;cursor:default;
  }
  .gr-st.ok{color:#0F7B4F;background:#E6F6EE}
  .gr-st.stop{color:#A16207;background:#FEF6E0}
  .gr-st.nopur{color:#1D4ED8;background:#E8EEFD}
  .gr-st.void{color:#B91C1C;background:#FEE2E2}
  .gr-st.sen{color:var(--text-3);background:rgba(0,0,0,.04);font-weight:400}
  body.theme-dark .gr-st.ok{color:#6EE7B7;background:rgba(16,185,129,.16)}
  body.theme-dark .gr-st.stop{color:#FCD34D;background:rgba(217,119,6,.18)}
  body.theme-dark .gr-st.nopur{color:#93C5FD;background:rgba(37,99,235,.20)}
  body.theme-dark .gr-st.void{color:#FCA5A5;background:rgba(220,38,38,.18)}
  body.theme-dark .gr-st.sen{background:rgba(255,255,255,.06)}
  /* 进销存淘汰的商品：整行淡下去，但不划删除线（还能看懂是什么） */
  .gr-table tr.is-erp-void .gr-name{color:var(--text-3)}
  .gr-table tr.is-erp-void .gr-img{opacity:.45}
  /* 推荐奖励 / 备注 */
  .gr-in{width:72px;height:30px;padding:0 8px;font-size:12.5px}
  .gr-note{width:230px;height:60px;padding:5px 8px;font-size:12.5px;resize:vertical;line-height:1.4}

  /* ---------- 商品 · 捆绑商品页 ---------- */
  .gb-card{max-width:1600px}
  .gb-table{min-width:900px}
  .gb-table tbody tr{cursor:default}
  .gb-table tbody tr:hover{background:rgb(var(--primary-rgb) / .03)}
  .gr-img.sm{width:34px;height:34px;font-size:17px;border-radius:8px}
  .gb-main{display:flex;align-items:center;gap:10px}
  .gb-main-txt{min-width:0;flex:1 1 auto}
  /* 赠品名超长时省略而不是撑破格子：之前只给了 min-width:0，
     .gr-name 是 block 且没 ellipsis，长名字直接把内容顶出 .gb-main-txt（实测溢出 61px），
     连带把表格撑宽、把「状态/操作」列挤出可视区。 */
  .gb-main-txt .gr-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .gb-main-txt .gr-code{margin-top:2px}
  .gb-broken{background:#EEF0F4;border-style:dashed;color:var(--text-3);opacity:.75}
  .gb-broken-t{font-size:12.5px;color:var(--text-3)}
  .gb-details{display:flex;flex-direction:column;gap:9px}
  .gb-d{display:flex;align-items:center;gap:9px;padding:5px 8px;border-radius:9px;background:rgba(120,130,150,.05)}
  .gb-d-txt{min-width:0}
  .gb-d-name{font-size:12.5px;color:var(--text);font-weight:600;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .gb-d-price{font-size:11.5px;color:var(--text-3);margin-top:1px}
  .gb-d.gb-broken{background:transparent;border:1px dashed var(--border)}
  .gb-d.gb-broken .gb-d-name{color:var(--text-3);font-weight:500}
  .gb-ops{gap:8px;align-items:center}
  .gb-ops .btn{white-space:nowrap;flex:none}
  /* 图片名称 / 组合明细 / 操作按钮统一随行垂直居中，彼此对齐 */
  .gb-table td{vertical-align:middle}
  .btn.ghost{color:var(--primary);border-color:rgb(var(--primary-rgb) / .35);background:var(--primary-soft)}
  .btn.danger{color:#C0392B;border-color:rgba(192,57,43,.30);background:rgba(192,57,43,.06)}
  .btn.danger:hover{background:rgba(192,57,43,.12)}
  body.theme-dark .btn.danger{color:#FF8A80;border-color:rgba(255,138,128,.35);background:rgba(255,138,128,.08)}
  /* 组合弹窗 */
  .gb-dlg{--dlg-w:880px;--dlg-h:660px}
  .gb-form{flex:1;min-height:0;padding:16px 22px 18px;display:flex;flex-direction:column;gap:18px;overflow-y:auto;overscroll-behavior:contain}
  .gb-f-row{display:flex;flex-direction:column;gap:8px}
  .gb-f-row > label{font-size:12.5px;font-weight:600;color:var(--text-2)}
  .gb-f-details{display:flex;flex-direction:column;gap:8px}
  .gb-f-d{display:flex;align-items:center;gap:8px}
  .gb-f-d .gb-f-g{flex:1;min-width:0}
  .gb-f-d .gb-f-qty{width:64px;flex:none}
  .gb-f-d .gb-f-price{width:84px;flex:none}
  .gb-f-d .gb-f-spec{width:90px;flex:none}
  .gb-f-gift{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;color:var(--text-2);flex:none;cursor:pointer}
  .gb-f-gift input{accent-color:var(--primary);cursor:pointer}
  .gb-f-del{
    flex:none;width:26px;height:26px;border-radius:7px;border:1px solid var(--border);background:var(--panel);
    color:var(--text-3);cursor:pointer;font-size:12px;line-height:1;transition:.15s;
  }
  .gb-f-del:hover{color:#C0392B;border-color:rgba(192,57,43,.4);background:rgba(192,57,43,.06)}
  .gb-f-tip{font-size:11.5px;color:var(--text-3);padding:8px 10px;border-radius:8px;background:rgb(var(--primary-rgb) / .06);border:1px solid rgb(var(--primary-rgb) / .15)}
  .gb-f-foot{display:flex;justify-content:flex-end;gap:10px;padding:14px 22px;border-top:1px solid var(--border)}

  /* ---------- 商品 · 组合弹窗（① 主商品 ② 带出的商品） ---------- */
  .gb-step{display:flex;flex-direction:column;gap:10px}
  .gb-step-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  .gb-step-h > i{
    flex:none;width:18px;height:18px;border-radius:50%;font-style:normal;
    background:rgb(var(--primary-rgb) / .12);color:var(--primary);
    font-size:11px;font-weight:800;display:inline-flex;align-items:center;justify-content:center;
  }
  .gb-step-h > b{font-size:13px;color:var(--text);font-weight:600}
  .gb-step-h > span{font-size:11.5px;color:var(--text-3)}

  /* 主商品：没选时是一整块虚线按钮，选中后是卡片（图片 / 名称 / 货号 / 更换） */
  .gb-pick{
    display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;text-align:left;cursor:pointer;
    border:1px solid var(--border);border-radius:12px;background:var(--panel);
    transition:border-color .15s, background .15s;
  }
  .gb-pick:hover{border-color:rgb(var(--primary-rgb) / .45);background:rgb(var(--primary-rgb) / .04)}
  .gb-pick.is-on{cursor:default;background:rgb(var(--primary-rgb) / .045);border-color:rgb(var(--primary-rgb) / .3)}
  .gb-pick.is-on:hover{background:rgb(var(--primary-rgb) / .045)}
  .gb-pick.is-on .btn{margin-left:auto;flex:none}
  .gb-pick-empty{border-style:dashed;color:var(--text-2)}
  .gb-pick-plus{
    flex:none;width:36px;height:36px;border-radius:10px;font-size:18px;font-weight:600;
    display:inline-flex;align-items:center;justify-content:center;
    background:rgb(var(--primary-rgb) / .1);color:var(--primary);
  }
  .gb-pick-txt{display:flex;flex-direction:column;gap:2px;min-width:0}
  .gb-pick-txt b{font-size:13px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .gb-pick-txt i{font-style:normal;font-size:11.5px;color:var(--text-3)}

  /* 明细表格：商品 / 单位 / 参考单价 / 数量 / 小计 / 删除 */
  .gb-lines{border:1px solid var(--border);border-radius:12px;overflow:hidden}
  /* 明细分之间的比例说明：数量同时是联动比例，写清楚比让人猜强 */
  .gb-ratio-tip{
    padding:7px 10px;border-radius:8px;font-size:11.5px;line-height:1.55;color:var(--text-3);
    background:rgba(120,130,150,.06);border:1px dashed var(--border);
  }
  .gb-ratio-tip b{color:var(--text-2);font-weight:600}
  .gb-ft{width:100%;border-collapse:collapse;table-layout:fixed}
  .gb-ft thead th{
    padding:8px 10px;text-align:left;white-space:nowrap;font-size:11.5px;font-weight:600;color:var(--text-3);
    background:rgba(120,130,150,.05);border-bottom:1px solid var(--border);
  }
  .gb-ft td{padding:8px 10px;border-bottom:1px solid var(--border);vertical-align:middle;font-size:12.5px;color:var(--text-2)}
  .gb-ft tbody tr:last-child td{border-bottom:none}
  .gb-ft .c-unit{width:100px}
  .gb-ft .c-price{width:96px;text-align:right}
  .gb-ft .c-qty{width:78px}
  .gb-ft .c-sum{width:92px;text-align:right;font-weight:600;color:var(--text)}
  .gb-ft .c-op{width:44px;text-align:center}
  .gb-l{display:flex;align-items:center;gap:9px;min-width:0}
  .gb-l-t{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}
  .gb-l-t b{font-size:12.5px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .gb-l-t span{font-size:11px;color:var(--text-3)}
  .gb-l-gift{
    flex:none;height:22px;padding:0 8px;border-radius:6px;font-size:11px;cursor:pointer;transition:.15s;
    border:1px solid var(--border);background:var(--panel);color:var(--text-3);
  }
  .gb-l-gift:hover{color:var(--primary);border-color:rgb(var(--primary-rgb) / .4)}
  .gb-l-gift.is-on{background:rgba(245,158,11,.12);border-color:rgba(245,158,11,.45);color:#B45309;font-weight:600}
  .gb-ft .gb-l-unit,.gb-ft .gb-l-qty{width:100%;height:28px;padding:0 6px;font-size:12.5px}
  .gb-ft tr.is-gift .gb-l-price{color:var(--text-3);text-decoration:line-through}
  .gb-ft tr.is-gift .gb-l-sum{color:var(--text-3);font-weight:500}
  .gb-lines-empty{padding:22px 12px;text-align:center;font-size:12px;color:var(--text-3)}
  .gb-add-btn{align-self:flex-start}

  /* 合计条 */
  .gb-sum{
    display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border-radius:10px;
    background:rgb(var(--primary-rgb) / .06);border:1px solid rgb(var(--primary-rgb) / .15);
  }
  .gb-sum > span{font-size:11.5px;color:var(--text-3)}
  .gb-sum > b{font-size:13px;color:var(--text-2);font-weight:600;white-space:nowrap}
  .gb-sum em{font-style:normal;font-size:18px;font-weight:800;color:#E5484D;margin-left:8px}

  /* 列表页：主商品右侧「N 件」、赠品小标 */
  .gb-cnt{
    flex:none;margin-left:auto;padding:2px 8px;border-radius:20px;
    font-size:11px;color:var(--text-3);background:rgba(120,130,150,.1);
  }
  .gb-tag{
    display:inline-block;margin-right:4px;padding:0 4px;border-radius:4px;
    font-style:normal;font-size:10.5px;font-weight:700;color:#B45309;
    background:rgba(245,158,11,.14);
  }
  body.theme-dark .gb-tag{color:#FFC15E;background:rgba(245,158,11,.2)}
  body.theme-dark .gb-l-gift.is-on{color:#FFC15E;border-color:rgba(245,158,11,.5);background:rgba(245,158,11,.16)}

  /* ---------- 商品 · 商品赠送页（买赠） ---------- */
  .gd-table{min-width:860px;table-layout:fixed}
  /* 列宽微调：原来的 26%/200/86/120 是从 980 的表格宽度推的，压到 860 之后
     操作列只剩 120 装不下「编辑 删除」（td 内容溢出 6px，把整表又撑出滚动）。
     这里重分：赠品 26%→29%（名字能多露三个字）、赠送方式 200→164、状态 86→76、
     操作 120→138，参加条件列刚好还是 270 不变。
     操作列 138 = 左右 padding 12 + 两个按钮 114（52+10+52）——
     少 1px 都会让「删除」贴到表格右边框上（128 时右边只剩 2px），
     而其余页面（政策 200/任务 200/档案 76…）的按钮右侧都留 12px，这里对齐同一口径。
     列宽写在 goods.js 的 inline style 里，那个文件有并行改动，先用 CSS 盖。 */
  .gd-table thead th:nth-child(1){width:29%!important}
  .gd-table thead th:nth-child(3){width:164px!important}
  .gd-table thead th:nth-child(4){width:76px!important}
  .gd-table thead th:nth-child(5){width:138px!important}
  .gd-table tbody tr{cursor:default}
  .gd-table tbody tr:hover{background:rgb(var(--primary-rgb) / .03)}
  .gd-table td{vertical-align:middle}
  /* 条件卡撑满整列：auto 布局下 td 宽度被内容决定，几张卡宽窄不一，看着像没对齐 */
  .gd-table .gd-conds{width:100%}
  .gd-table .gd-cond{width:100%}
  .gd-qty{
    flex:none;margin-left:auto;padding:2px 8px;border-radius:20px;white-space:nowrap;
    font-size:11px;font-weight:600;color:#B45309;background:rgba(245,158,11,.14);
  }
  body.theme-dark .gd-qty{color:#FFC15E;background:rgba(245,158,11,.2)}
  .gd-conds{display:flex;flex-direction:column;gap:6px}
  .gd-cond{display:flex;align-items:center;gap:9px;padding:5px 8px;border-radius:9px;background:rgba(120,130,150,.05)}
  .gd-cond-t{min-width:0}
  /* 条件商品名：给两行。表格压到 860 后这一列只有 270px，单行只能放十几个字，
     「泰山工匠原浆精酿啤酒11.2°P 750ML」会被砍掉规格 —— 而规格正是分辨商品的关键。 */
  .gd-cond-n{
    font-size:12.5px;font-weight:600;color:var(--text);line-height:1.4;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
    white-space:normal;overflow:hidden;
  }
  .gd-cond-m{font-size:11.5px;color:var(--text-3);margin-top:1px}
  .gd-cond-m b{color:var(--text-2);font-weight:700}
  .gd-vip{
    display:inline-block;margin-left:6px;padding:0 5px;border-radius:4px;font-style:normal;
    font-size:10.5px;font-weight:600;color:#0369A1;background:rgba(14,165,233,.13);
  }
  body.theme-dark .gd-vip{color:#7DD3FC;background:rgba(14,165,233,.2)}
  .gd-join{
    align-self:flex-start;margin-left:10px;padding:0 6px;border-radius:4px;
    font-size:10.5px;font-weight:700;color:var(--text-3);background:rgba(120,130,150,.12);
  }
  .gd-join.is-all{color:#7C3AED;background:rgba(124,58,237,.12)}
  body.theme-dark .gd-join.is-all{color:#C4B5FD;background:rgba(124,58,237,.22)}
  .gd-mode{
    display:inline-block;padding:0 6px;border-radius:5px;font-size:11px;font-weight:700;
    color:#0F766E;background:rgba(13,148,136,.12);
  }
  .gd-mode.is-fixed{color:#6D28D9;background:rgba(124,58,237,.12)}
  body.theme-dark .gd-mode{color:#5EEAD4;background:rgba(13,148,136,.2)}
  body.theme-dark .gd-mode.is-fixed{color:#C4B5FD;background:rgba(124,58,237,.22)}
  .gd-mode-t{font-size:11.5px;color:var(--text-3);margin-top:3px;line-height:1.4}

  /* 弹窗 */
  .gd-dlg{--dlg-w:900px;--dlg-h:780px}
  .gd-form{gap:16px}
  .gd-give-row{display:flex;align-items:center;gap:8px}
  .gd-give-row > label{font-size:12.5px;color:var(--text-2);font-weight:600;flex:none}
  .gd-num{width:76px;height:32px;text-align:center;flex:none}
  .gd-unit{width:110px;height:32px;flex:none}
  .gd-give-tip{font-size:11.5px;color:var(--text-3)}
  /* 赠品小组（2026-11-08）：一行一个候选，左侧序号就是「只赠其中一个」时的优先顺序 */
  .gd-pool{display:flex;flex-direction:column;gap:8px}
  .gd-pool-i{
    display:flex;align-items:center;gap:9px;padding:8px 10px;
    border:1px solid var(--border);border-radius:10px;background:#fff;
  }
  body.theme-dark .gd-pool-i{background:#2C2F38}
  .gd-pool-no{
    flex:none;width:18px;height:18px;border-radius:50%;display:inline-flex;align-items:center;
    justify-content:center;font-size:11px;font-weight:700;color:var(--primary);
    background:rgb(var(--primary-rgb) / .12);
  }
  .gd-pool-i img,.gd-pool-i .gb-img{width:32px;height:32px;border-radius:7px;object-fit:cover;flex:none}
  .gd-pool-i .gb-pick-txt{flex:1;min-width:0}
  /* .po-in 是 flex:1 1 auto，放进这一行会被压成一条缝（单位框挤成「瓶▾」这种），必须锁死 */
  .gd-pool-unit{width:88px;max-width:88px;height:30px;flex:0 0 auto;font-size:12px;padding:0 6px}
  .gd-pool-mv{
    flex:0 0 auto;width:24px;height:24px;border-radius:6px;border:1px solid var(--border);
    background:#fff;color:var(--text-2);font-size:12px;line-height:1;cursor:pointer;
    display:inline-flex;align-items:center;justify-content:center;
  }
  /* 删除按钮在这个上下文同样要定尺寸，否则被 text-overflow 压成小点 */
  .gd-pool-i .gb-f-del{
    flex:0 0 auto;width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;
    border-radius:6px;padding:0;
  }
  body.theme-dark .gd-pool-mv{background:#23252E;border-color:#3A3F4C}
  .gd-pool-mv:disabled{opacity:.35;cursor:default}
  /* 列表页格子里的「择一 / 全送 · 共 N 个候选」小字 */
  .gd-pool-more{font-size:11px;color:var(--primary);margin-top:2px}
  .gd-pick-tag{
    display:inline-block;margin-left:6px;padding:1px 6px;border-radius:5px;
    font-size:10.5px;font-weight:600;color:#0F766E;background:rgba(13,148,136,.12);vertical-align:2px;
  }
  .gd-pick-tag.is-all{color:#B45309;background:rgba(180,83,9,.12)}
  body.theme-dark .gd-pick-tag{color:#5EEAD4;background:rgba(13,148,136,.2)}
  body.theme-dark .gd-pick-tag.is-all{color:#FBBF24;background:rgba(180,83,9,.22)}
  .gd-match-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;align-self:flex-start}
  .gd-match{display:inline-flex;padding:3px;border-radius:9px;background:rgba(120,130,150,.09)}
  /* 说明必须跟着按钮走：两种关系算出来的份数完全不同，光看「满足一项」猜不出来 */
  .gd-match-tip{font-size:11.5px;line-height:1.6;color:var(--text-3)}
  .gd-seg{
    padding:5px 14px;border:none;border-radius:7px;background:transparent;cursor:pointer;
    font-size:12.5px;color:var(--text-2);transition:.15s;
  }
  .gd-seg.on{background:var(--panel);color:var(--primary);font-weight:600;box-shadow:0 1px 3px rgba(17,20,30,.1)}
  .gd-mode-pick{display:grid;grid-template-columns:1fr 1fr;gap:10px}
  .gd-mode-b{
    display:flex;flex-direction:column;gap:3px;padding:10px 12px;text-align:left;cursor:pointer;
    border:1px solid var(--border);border-radius:11px;background:var(--panel);transition:.15s;
  }
  .gd-mode-b b{font-size:12.5px;color:var(--text);font-weight:600}
  .gd-mode-b span{font-size:11.5px;color:var(--text-3);line-height:1.4}
  .gd-mode-b:hover{border-color:rgb(var(--primary-rgb) / .4)}
  .gd-mode-b.on{border-color:rgb(var(--primary-rgb) / .55);background:rgb(var(--primary-rgb) / .06)}
  .gd-mode-b.on b{color:var(--primary)}
  .gd-ft .c-unit{width:98px}
  .gd-ft .c-qty{width:84px}
  .gd-ft .c-vip{width:150px}
  .gd-c-unit,.gd-c-qty,.gd-c-vip{width:100%;height:28px;padding:0 6px;font-size:12.5px}
  /* 规则预览：上下两行，句子可能很长（多条件 + 价格门槛），挤一行会被截断 */
  .gd-preview{flex-direction:column;align-items:flex-start;gap:5px}
  .gd-preview > span{font-size:11.5px;color:var(--text-3)}
  .gd-preview > b{font-size:12.5px;color:var(--text);font-weight:600;line-height:1.6;text-align:left}

  /* ---------- 商品 · 商城组合页 ---------- */
  .gc-card{max-width:1600px}
  /* 编码是过单的匹配键，做成等宽标签：和商品名混在一起时一眼能挑出来对 */
  .gc-code{
    display:inline-block;padding:3px 9px;border-radius:6px;
    background:rgb(var(--primary-rgb) / .08);border:1px solid rgb(var(--primary-rgb) / .22);
    font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
    font-size:12.5px;color:var(--primary);font-weight:700;letter-spacing:.4px;white-space:nowrap;
  }
  .gc-sum{font-size:13px;font-weight:600;color:var(--text);white-space:nowrap}
  .gc-pager-wrap{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
  .gc-jump{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text-2)}
  .gc-jump .po-in{width:56px;height:28px;text-align:center;font-size:12.5px}
  .gc-dlg{--dlg-w:880px;--dlg-h:560px}
  /* 编码行：输入框 + 右侧实时提示（提醒它要和商城 goods_code 一致） */
  .gc-code-row{display:flex;flex-direction:column;align-items:flex-start;gap:6px}
  .gc-code-in{
    flex:none;width:280px;height:36px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
    font-size:14px;font-weight:600;letter-spacing:.6px;
  }
  .gc-code-tip{font-size:11.5px;color:var(--text-3);line-height:1.5}
  .gb-d-price b{color:var(--text-2);font-weight:600}

  /* ---------- 商品 · 商品政策页 ---------- */
  .gp-card{max-width:1600px}
  .gp-table{min-width:1000px}
  .gp-table tbody tr{cursor:default}
  .gp-table tbody tr:hover{background:rgb(var(--primary-rgb) / .03)}
  .gp-table td{vertical-align:middle}
  .btn.gold{background:#F5A623;border-color:#F5A623;color:#fff}
  .btn.gold:hover{background:#E09412;border-color:#E09412}
  body.theme-dark .btn.gold{background:rgba(245,166,35,.18);border-color:rgba(245,166,35,.45);color:#FFC15E}
  body.theme-dark .btn.gold:hover{background:rgba(245,166,35,.30)}
  .gp-size{height:28px;font-size:12.5px;padding:0 6px}
  .gp-view .gb-f-row input,
  .gp-view .gb-f-row select{background:rgba(120,130,150,.06);color:var(--text-2)}
  .gp-view .gb-f-row input:disabled,
  .gp-view .gb-f-row select:disabled{cursor:not-allowed}

  /* ---------- 商品政策 · 添加/编辑弹窗（2026-11-08 按运营给的表单重做） ---------- */
  .gp-dlg{--dlg-w:780px;--dlg-h:auto}
  .gp-form{display:grid;grid-template-columns:1fr 1fr;gap:15px 20px;align-content:start}
  @media (max-width:720px){ .gp-form{grid-template-columns:1fr} .gp-span2{grid-column:auto} }
  .gp-field{display:flex;flex-direction:column;gap:6px;min-width:0}
  .gp-field > label{font-size:12.5px;font-weight:600;color:var(--text-2)}
  .gp-req{font-style:normal;color:#E5484D;margin-left:2px}
  .gp-span2{grid-column:1/-1}
  .gp-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  .gp-line .po-in{width:92px}
  .gp-line .seg{flex:none}
  .gp-suffix{font-size:12px;color:var(--text-3);white-space:nowrap}
  .gp-unit{display:flex;align-items:stretch;border:1px solid var(--input-border);border-radius:8px;background:var(--panel);overflow:hidden}
  .gp-unit:focus-within{border-color:var(--primary);box-shadow:0 0 0 2px rgb(var(--primary-rgb) / .12)}
  .gp-unit input{flex:1;min-width:0;border:0;background:transparent;color:var(--text);padding:8px 10px;font-family:inherit;font-size:13px;outline:none}
  .gp-unit span{display:flex;align-items:center;padding:0 11px;font-size:12px;color:var(--text-3);border-left:1px solid var(--border);background:rgba(120,130,150,.05)}

  /* 选商品：一个卡片 + 一个「选择/更换」按钮，和销售任务的选品手感一致 */
  .gp-pick{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  .gp-pick-card{
    position:relative;display:flex;align-items:center;gap:10px;min-width:230px;max-width:100%;
    border:1px solid var(--border);border-radius:10px;padding:6px 12px 6px 6px;background:var(--panel);
  }
  .gp-pick-img{
    width:52px;height:52px;flex:none;border-radius:8px;overflow:hidden;background:rgba(120,130,150,.06);
    display:flex;align-items:center;justify-content:center;font-size:24px;
  }
  .gp-pick-img img{width:100%;height:100%;object-fit:cover}
  .gp-pick-t{min-width:0}
  .gp-pick-n{font-size:13px;font-weight:600;color:var(--text);line-height:1.35;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .gp-pick-u{font-size:11.5px;color:var(--text-3);margin-top:2px}
  .gp-pick-btn{
    display:inline-flex;align-items:center;gap:6px;height:64px;min-width:106px;justify-content:center;
    border:1px dashed var(--input-border);border-radius:10px;background:transparent;color:var(--text-2);
    font-family:inherit;font-size:13px;cursor:pointer;transition:.15s;
  }
  .gp-pick-btn:hover{border-color:var(--primary);color:var(--primary);background:rgb(var(--primary-rgb) / .04)}
  .gp-pick-btn b{font-size:18px;line-height:1;font-weight:400}

  /* 活动政策：一行一条，可增删 */
  .gp-acts{display:flex;flex-direction:column;gap:8px}
  .gp-act{display:flex;align-items:center;gap:8px}
  .gp-act-i{flex:none;font-size:12px;color:var(--text-3);width:64px}
  .gp-act input{flex:1;min-width:0}
  .gp-act-del{
    flex:none;width:30px;height:30px;border-radius:8px;border:1px solid var(--border);background:transparent;
    color:var(--text-3);cursor:pointer;font-size:13px;line-height:1;transition:.15s;
  }
  .gp-act-del:hover{border-color:#E5484D;color:#E5484D;background:rgba(229,72,77,.06)}
  .gp-act-add{
    align-self:flex-start;display:inline-flex;align-items:center;gap:5px;height:30px;padding:0 12px;
    border:1px dashed var(--input-border);border-radius:8px;background:transparent;color:var(--primary);
    font-family:inherit;font-size:12.5px;cursor:pointer;transition:.15s;
  }
  .gp-act-add:hover{background:rgb(var(--primary-rgb) / .06);border-color:var(--primary)}

  /* 查看：照运营给的那张「商品图片 / 名称 / 单位」三列信息表 */
  .gp-view-body{padding:16px 20px 6px;overflow-y:auto;min-height:0}
  .gp-vt{width:100%;border-collapse:collapse;font-size:13px}
  .gp-vt th,.gp-vt td{border:1px solid var(--border);padding:10px 13px;text-align:left;vertical-align:middle;word-break:break-word}
  .gp-vt th{width:106px;font-weight:500;color:var(--text-2);background:rgba(120,130,150,.06);white-space:nowrap}
  .gp-vt td{color:var(--text)}
  .gp-vt .gp-vt-img{padding:8px}
  .gp-vt-img .gp-pick-img{width:76px;height:76px}
  .gp-vt-acts{line-height:1.75;white-space:pre-wrap}
  .gp-vt-act-i{color:var(--text-3);margin-right:4px}

  /* ---------- 商品 · 传值商品（厂家活动条码） ----------
     卖的时候用真实条码，微信支付下单时才换成厂家条码。
     表格就是运营给的那张：勾选 / 商品 / 单位 / 传值名称 / 条码 / 传值条码 / 移除。 */
  .sg-card{max-width:1500px}
  /* 顶部说明条 + 通用小件（2026-11-09 厂家活动页下线，这套从它的 CSS 里迁过来） */
  .sg-hero{
    display:flex;gap:13px;align-items:flex-start;margin:0 0 14px;padding:13px 15px;
    background:linear-gradient(100deg,rgb(var(--primary-rgb) / .07),rgb(var(--primary-rgb) / .02));
    border:1px solid rgb(var(--primary-rgb) / .14);border-radius:12px;
  }
  .sg-hero-ico{font-size:20px;line-height:1.2}
  .sg-hero-txt .t{font-size:13.5px;font-weight:600;color:var(--text);margin-bottom:3px}
  .sg-hero-txt .d{font-size:12.5px;color:var(--text-2);line-height:1.65}
  .sg-dim{color:var(--text-3);font-size:12.5px}
  .sg-tag{display:inline-block;padding:2px 8px;border-radius:999px;font-size:11.5px;line-height:1.6;white-space:nowrap;background:rgba(120,130,150,.14);color:var(--text-3)}
  .sg-tag.green{background:rgba(18,183,106,.12);color:#0E9F5E}
  .sg-form{overflow:auto;padding:4px 20px 8px;flex:1;min-height:0}
  .sg-f{display:flex;flex-direction:column;gap:6px;min-width:0}
  .sg-f > span{font-size:12.5px;font-weight:600;color:var(--text-2)}
  .sg-hint{margin-top:9px;font-size:12px;color:var(--text-3);line-height:1.6}
  /* 商品多选弹窗 */
  .sg-pick-bar{display:flex;gap:10px;align-items:center;padding:0 20px 10px}
  .sg-pick-cnt{font-size:12.5px;color:var(--text-2);white-space:nowrap}
  .sg-pick-body{flex:1;min-height:200px;max-height:56vh;overflow:auto;margin:0 20px;border:1px solid var(--border);border-radius:10px}
  .sg-pick-row{
    display:flex;align-items:center;gap:10px;padding:8px 12px;cursor:pointer;
    border-bottom:1px solid var(--border);font-size:12.5px;
  }
  .sg-pick-row:last-child{border-bottom:0}
  .sg-pick-row:hover{background:rgba(120,130,150,.05)}
  .sg-pick-row.on{background:rgb(var(--primary-rgb) / .06)}
  .sg-pick-row input{flex:none}
  .sg-pick-row .n{flex:1;min-width:0;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .sg-pick-row .c{width:130px;color:var(--text-3);font-variant-numeric:tabular-nums}
  .sg-pick-row .u{width:44px;color:var(--text-2);text-align:right}
  .sg-table{min-width:1080px}
  .sg-table td{vertical-align:middle}
  .sg-th-cb,.sg-td-cb{width:38px;text-align:center;padding-left:8px !important;padding-right:0 !important}
  .sg-td-cb input{cursor:pointer}
  /* 换过厂家条码的行左侧加一道色条，扫一眼就知道哪些已在用活动价 */
  .sg-table tbody tr.sg-on td:first-child{box-shadow:inset 3px 0 0 rgb(var(--primary-rgb) / .55)}
  .sg-table tbody tr.sg-saved{background:rgb(18,183,106,.07)}
  .sg-goods{display:flex;gap:10px;align-items:center;min-width:0}
  .sg-img{
    width:44px;height:44px;flex:none;border-radius:8px;overflow:hidden;
    background:rgba(120,130,150,.07);display:flex;align-items:center;justify-content:center;font-size:20px;
  }
  .sg-img img{width:100%;height:100%;object-fit:cover;display:block}
  .sg-img.noimg i{display:block}
  .sg-img:not(.noimg) i{display:none}
  .sg-nm{min-width:0;line-height:1.4}
  .sg-nm b{
    display:block;font-size:13px;font-weight:600;color:var(--text);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:260px;
  }
  .sg-nm span{font-size:11.5px;color:var(--text-3)}
  .sg-code{font-size:12.5px;color:var(--text-2);font-variant-numeric:tabular-nums;word-break:break-all}
  .sg-in{width:100%;height:32px;font-size:12.5px}
  .sg-in-code{font-variant-numeric:tabular-nums}
  .sg-in-code:focus{background:rgb(247,144,9,.06)}
  .sg-foot{display:flex;align-items:center;gap:14px;padding:12px 16px 16px;flex-wrap:wrap}
  .sg-foot .gp-pick-btn{height:36px;min-width:104px}
  .sg-foot .info{font-size:12.5px;color:var(--text-3)}
  .sg-gap{flex:1}
  .sg-warn{color:#B45309}
  body.theme-dark .sg-warn{color:#FCD34D}
  /* 通道规则：按整单判，一行说完，多了没人看 */
  .sg-rule{display:block;margin-top:6px;color:var(--text-2)}
  .sg-rule b{color:var(--text)}
  /* 预览里的通道横幅：一眼看出这单走微信还是建行 */
  .sg-chan{display:flex;align-items:flex-start;gap:8px;padding:9px 12px;border-radius:8px;
    font-size:12.5px;line-height:1.6;margin-bottom:10px;color:var(--text);
    background:rgb(var(--primary-rgb) / .08);border:1px solid rgb(var(--primary-rgb) / .22)}
  .sg-chan b{color:var(--primary)}
  .sg-chan.ccb{background:rgb(120 130 145 / .09);border-color:rgb(120 130 145 / .25)}
  .sg-chan.ccb b{color:var(--text)}
  .sg-chan.none{background:rgb(180 83 9 / .08);border-color:rgb(180 83 9 / .28)}
  .sg-chan.none b{color:#B45309}
  .sg-chan .u{color:var(--text-3)}
  /* 选品弹窗：已在清单里的置灰 */
  .sg-pick-row.sg-dup{opacity:.5;cursor:default}
  .sg-pick-row.sg-dup .u{color:var(--text-3)}
  .sg-bulk-dlg{--dlg-w:420px}
  .sg-bulk-dlg .sg-form{padding:14px 18px 4px;display:flex;flex-direction:column;gap:12px}
  .sg-prev-dlg{--dlg-w:720px;height:auto;max-height:82vh}
  .sg-prev-dlg .dlg-x{cursor:pointer}
  .sg-prev-body{padding:0 20px 6px;overflow:auto;max-height:56vh}
  .sg-prev-sum{font-size:12.5px;color:var(--text-2);margin-bottom:10px;line-height:1.7}
  .sg-prev-warn{color:#B45309;font-size:12px;margin-top:4px}
  body.theme-dark .sg-prev-warn{color:#FCD34D}
  .sg-prev-tb{min-width:0}
  .sg-prev-tb td{font-size:12.5px}

  /* ---------- 传值商品 · 厂家满减规则（接单页提示用） ----------
     这块只写文案，不参与算钱：运营照厂家规则填「满多少减多少 / 每人几次」，
     接单页「优惠券」下面那行提示跟着变。厂家改规则，改这一处就够。 */
  .sg-rules{
    margin:0 0 14px;padding:13px 15px 12px;border:1px solid var(--border);border-radius:12px;
    background:rgba(120,130,150,.035);
  }
  .sg-rules-hd{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:11px}
  .sg-rules-t{display:flex;align-items:center;gap:8px;font-size:13.5px;font-weight:600;color:var(--text)}
  .sg-rules-d{font-size:12px;color:var(--text-3);line-height:1.6}
  .sg-rules-d b{color:var(--text-2)}
  .sg-rules-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(196px,1fr));gap:12px 14px}
  .sg-rules-grid .po-in{height:34px;font-size:13px;max-width:none}
  .sg-range{display:flex;align-items:center;gap:7px;min-width:0}
  .sg-range .po-in{flex:1;min-width:0;padding:0 8px}
  .sg-range i{font-style:normal;font-size:12px;color:var(--text-3);flex:none}
  .sg-num{display:flex;align-items:center;gap:7px}
  .sg-num .po-in{width:104px;flex:none}
  .sg-num i{font-style:normal;font-size:12.5px;color:var(--text-2)}
  .sg-rules-tiers{margin-top:14px}
  .sg-rules-lb{font-size:12.5px;font-weight:600;color:var(--text-2);margin-bottom:8px}
  .sg-rules-lb i{font-style:normal;font-weight:400;font-size:12px;color:var(--text-3);margin-left:7px}
  .sg-tiers{display:flex;flex-direction:column;gap:8px}
  .sg-tier{display:flex;align-items:center;gap:8px;flex-wrap:nowrap}
  .sg-tier .k{font-size:12.5px;color:var(--text-2);white-space:nowrap}
  .sg-tier .po-in{width:96px;height:32px;flex:none;font-variant-numeric:tabular-nums}
  .sg-tier-x{
    width:26px;height:26px;flex:none;border:1px solid var(--border);border-radius:6px;background:#fff;
    color:var(--text-3);font-size:12px;line-height:1;cursor:pointer;transition:.15s;font-family:inherit;
  }
  .sg-tier-x:hover{color:#D92D20;border-color:rgba(217,45,32,.35);background:rgba(217,45,32,.05)}
  body.theme-dark .sg-tier-x{background:transparent}
  .sg-tier-empty{padding:9px 2px;font-size:12.5px;color:var(--text-3)}
  .sg-tiers-foot{display:flex;align-items:center;gap:14px;margin-top:9px;flex-wrap:wrap}
  .sg-max{font-size:12.5px;color:var(--text-2)}
  .sg-max b{font-size:15px;color:#C2410C;margin:0 4px;font-variant-numeric:tabular-nums}
  .sg-max i{font-style:normal;font-size:11.5px;color:var(--text-3)}
  body.theme-dark .sg-max b{color:#FBBF24}
  .sg-rules-prev{margin-top:14px}
  .sg-rules-prev > .l{display:block;font-size:12px;color:var(--text-3);margin-bottom:6px}
  .sg-rules-msg{font-size:12.5px;color:var(--text-3)}
  .sg-rules-foot{
    display:flex;align-items:center;gap:14px;margin-top:14px;flex-wrap:wrap;
    padding-top:11px;border-top:1px dashed var(--border);
  }
  .sg-switch{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--text-2);cursor:pointer}
  .sg-switch input{width:15px;height:15px;accent-color:var(--primary);cursor:pointer}


  /* ---------- 商品 · 销售任务页 ---------- */
  .gt-card{max-width:1600px}
  .gt-table{min-width:1000px}
  .gt-table tbody tr{cursor:default}
  .gt-table tbody tr:hover{background:rgb(var(--primary-rgb) / .03)}
  .gt-table td{vertical-align:middle}
  .gt-sep{color:var(--text-3);font-size:12.5px}
  .gt-time{font-variant-numeric:tabular-nums;color:var(--text-2);font-size:12.5px}
  .gt-badge{
    display:inline-flex;align-items:center;height:20px;padding:0 9px;border-radius:10px;
    font-size:11.5px;font-weight:600;border:1px solid transparent;
  }
  .gt-badge.run{background:#EBF9F1;color:#0E9F6E;border-color:#C7EFDD}
  .gt-badge.wait{background:#EEF2FF;color:#4F5BC4;border-color:#DCE0FB}
  .gt-badge.done{background:#F1F5F9;color:#64748B;border-color:#DDE3EC}
  body.theme-dark .gt-badge.run{background:rgba(14,159,110,.14);color:#3DDCA0;border-color:rgba(14,159,110,.30)}
  body.theme-dark .gt-badge.wait{background:rgba(99,112,220,.16);color:#A5AEFF;border-color:rgba(99,112,220,.32)}
  body.theme-dark .gt-badge.done{background:rgba(148,163,184,.12);color:#B6C2D2;border-color:rgba(148,163,184,.28)}
  .gt-sort{cursor:pointer;user-select:none;white-space:nowrap}
  .gt-sort:hover{color:var(--primary)}
  .gt-sort.on{color:var(--primary)}
  .gt-sort .gt-arr{font-size:11px;opacity:.7}
  .gt-neg{color:#C0392B;font-weight:700}
  body.theme-dark .gt-neg{color:#FF8A80}
  /* 关联商品已从商品中心删除：任务自身还留着名字/单位，别把整行显示成「图片加载失败」 */
  .gt-gone-tag{
    display:inline-block;margin-left:6px;padding:1px 6px;border-radius:6px;vertical-align:1px;
    font-size:11px;font-weight:600;line-height:16px;white-space:nowrap;
    color:#B45309;background:#FEF3C7;border:1px solid #FDE68A;
  }
  body.theme-dark .gt-gone-tag{color:#FCD34D;background:rgba(180,83,9,.22);border-color:rgba(180,83,9,.40)}
  /* 参与门店 / 参与客服列：名单长了放不下，一行省略，hover 看全。
     选择器带 .gt-table 是为了压过后面的 `.gt-table td{white-space:normal}`
     （那条是为品名换行用的），否则名单会在格子里折成两三行、把行高撑乱。 */
  .gt-table .gt-stores{
    max-width:118px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
    font-size:12.5px;color:var(--text-2);
  }
  .gt-table .gt-all{font-size:11.5px;color:var(--text-3)}
  /* 任务总量：400 ×16 —— 小字标出份数，免得看不出这个数是怎么乘出来的 */
  .gt-table .gt-target{font-variant-numeric:tabular-nums}
  .gt-table .gt-mul{margin-left:3px;font-style:normal;font-size:11px;color:var(--text-3)}

  /* ---------- 销售任务 · 添加 / 编辑表单（分区卡片 + 双栏） ----------
     旧版是「左标签 + 右字段」的单列长表：弹窗 960px 宽，字段却都卡在 520px 以内，
     右半边整片空白，还要一路往下滚，看不到全局。现在按业务拆成区块：
       ① 任务商品（通栏，商品格子横向铺）
       ② 任务维度（通栏一条，三选一）
       ③ 参与范围 ｜ 时间与目标（并排两栏，高度也接近）
       ④ 奖罚规则（三列并排）
     字段标签从左侧竖列改成字段上方的小标题，说明压成一行灰字；
     高度少了近一半，宽度也用满了。 */
  .gtf-dlg{--dlg-w:880px;--dlg-h:700px}
  .gtf{flex:1;min-height:0;display:flex;flex-direction:column;gap:10px;padding:14px 18px;overflow-y:auto;overscroll-behavior:contain}
  /* 同 .gtr：弹窗高度固定后，子块一律不收缩，超出交给 .gtf 自己滚 */
  .gtf > *{flex:none}

  /* 分区卡片 */
  .gtf-sec{
    display:flex;flex-direction:column;gap:10px;
    padding:12px 14px;border:1px solid var(--border);border-radius:12px;
    background:rgba(120,130,150,.035);
  }
  body.theme-dark .gtf-sec{background:rgba(255,255,255,.035)}
  .gtf-sec-h{position:relative;display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-left:10px}
  .gtf-sec-h::before{
    content:'';position:absolute;left:0;top:50%;transform:translateY(-50%);
    width:3px;height:13px;border-radius:2px;background:var(--primary);
  }
  .gtf-sec-h b{font-size:13.5px;font-weight:700;color:var(--text)}
  .gtf-sec-h em{font-style:normal;font-size:11.5px;color:var(--text-3);line-height:1.5}
  /* 只放一个单选组的那种区块：横着排成一条，别竖着占三层 */
  .gtf-sec-bar{flex-direction:row;align-items:center;gap:14px;flex-wrap:wrap;padding:9px 14px}
  .gtf-bar-t{position:relative;flex:none;padding-left:10px;font-size:13.5px;font-weight:700;color:var(--text)}
  .gtf-bar-t::before{
    content:'';position:absolute;left:0;top:50%;transform:translateY(-50%);
    width:3px;height:13px;border-radius:2px;background:var(--primary);
  }
  .gtf-sec-bar .gtf-hint{flex:1 1 auto;min-width:0}

  /* 商品区：空态时「选择商品」按钮与提示并排，别让提示单独占一整行 */
  .gtf-picks-row{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}
  .gtf-picks-row .gtf-picks{flex:0 1 auto;max-width:100%}
  .gtf-pick-hint{flex:1 1 200px;min-width:180px;padding-top:6px}

  /* 两栏：参与范围 / 时间与目标。窄屏自动落成单列 */
  .gtf-cols{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);gap:12px;align-items:start}
  @media (max-width:780px){.gtf-cols{grid-template-columns:minmax(0,1fr)}}

  /* 字段：小标题在上、控件居中、说明垫底 */
  .gtf-fd{position:relative;display:flex;flex-direction:column;gap:6px;min-width:0}
  .gtf-f-lb{font-size:12.5px;font-weight:600;color:var(--text-2);line-height:1.3}
  .gtf-f-lb.req::before{content:'*';color:#E5484D;margin-right:3px;font-weight:700}
  .gtf-in{
    width:100%;height:38px;padding:0 12px;border-radius:8px;
    border:1px solid var(--input-border);background:var(--panel);color:var(--text);
    font-size:13px;font-family:inherit;outline:none;transition:.15s;
  }
  .gtf-in:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .12)}
  .gtf-in::placeholder{color:var(--text-3)}
  .gtf-in:disabled{background:rgba(120,130,150,.06);color:var(--text-2);cursor:not-allowed}
  .gtf-in.narrow{max-width:180px}
  .gtf-hint{font-size:11.5px;color:var(--text-3);line-height:1.5}
  .gtf-hint b{color:var(--text-2);font-weight:600}

  /* 任务维度：三选一，选完联动下面「参与门店 / 参与客服」两行的显隐 */
  .gtf-dims{display:flex;flex-wrap:wrap;gap:8px}
  .gtf-dims label{
    display:flex;align-items:center;gap:6px;height:34px;padding:0 12px;border-radius:8px;
    border:1px solid var(--border);background:var(--panel);
    font-size:12.5px;color:var(--text-2);cursor:pointer;transition:.15s;user-select:none;
  }
  .gtf-dims label:hover{border-color:rgb(var(--primary-rgb) / .45)}
  .gtf-dims label.on{border-color:var(--primary);background:rgb(var(--primary-rgb) / .08);color:var(--primary);font-weight:600}
  .gtf-dims input{accent-color:var(--primary);margin:0}
  .gtf-dims i{font-style:normal;font-size:11px;color:var(--text-3);margin-left:2px}
  .gtf-dims label.on i{color:var(--primary)}

  /* 商品格：图片 + 品名 + 单位，最后一格是「＋ 选择商品」 */
  .gtf-picks{display:flex;flex-wrap:wrap;gap:10px}
  .gtf-pick{
    position:relative;width:100px;border:1px solid var(--border);border-radius:10px;padding:6px;
    background:var(--panel);display:flex;flex-direction:column;align-items:center;gap:4px;
  }
  .gtf-pick-img{
    width:100%;height:64px;border-radius:7px;overflow:hidden;
    display:flex;align-items:center;justify-content:center;font-size:26px;background:rgba(120,130,150,.06);
  }
  .gtf-pick-img img{width:100%;height:100%;object-fit:cover}
  .gtf-pick-n{
    width:100%;font-size:11.5px;color:var(--text-2);text-align:center;line-height:1.3;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  }
  .gtf-pick-u{font-size:11px;color:var(--text-3)}
  /* 任务单位下拉：多单位商品（瓶 / 半箱 / 箱）在卡片里就地切换 */
  .gtf-pick-sel{
    max-width:86px;height:21px;padding:0 2px;border-radius:5px;font-family:inherit;
    border:1px solid var(--input-border);background:var(--panel);color:var(--text-2);
    font-size:11px;cursor:pointer;outline:none;
  }
  .gtf-pick-sel:focus{border-color:var(--primary);box-shadow:0 0 0 2px rgb(var(--primary-rgb) / .12)}
  .gtf-pick-x{
    position:absolute;top:-7px;right:-7px;width:19px;height:19px;border-radius:50%;
    background:#E5484D;color:#fff;font-size:10px;line-height:19px;text-align:center;
    cursor:pointer;opacity:0;transition:.15s;box-shadow:0 2px 6px rgba(0,0,0,.18);
  }
  .gtf-pick:hover .gtf-pick-x{opacity:1}
  /* 编辑态：唯一的商品卡片本身就是「更换商品」的入口，做出可点的手感 */
  .gtf-pick.is-swap{cursor:pointer;transition:border-color .15s, box-shadow .15s}
  .gtf-pick.is-swap:hover{border-color:rgb(var(--primary-rgb) / .5);box-shadow:0 3px 12px rgba(15,23,42,.09)}
  .gtf-pick.is-swap:hover .gtf-pick-img{opacity:.85}
  .gtf-pick.is-swap::after{
    content:'更换';position:absolute;left:50%;top:24px;transform:translateX(-50%);
    padding:1px 7px;border-radius:8px;font-size:10px;color:#fff;background:rgb(var(--primary-rgb) / .82);
    opacity:0;transition:.15s;pointer-events:none;
  }
  .gtf-pick.is-swap:hover::after{opacity:1}
  .gtf-add{
    width:100px;min-height:96px;border:1px dashed rgb(var(--primary-rgb) / .45);border-radius:10px;
    background:rgb(var(--primary-rgb) / .04);color:var(--primary);cursor:pointer;
    display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;transition:.15s;
  }
  .gtf-add:hover{background:rgb(var(--primary-rgb) / .10);border-color:var(--primary)}
  .gtf-add-plus{font-size:22px;line-height:1}
  .gtf-add-t{font-size:11.5px}

  /* 日期区间（原生 date 输入自带日历按钮，不再另加图标） */
  .gtf-range{display:flex;align-items:center;gap:8px}
  .gtf-range .gtf-in{max-width:none;flex:1;min-width:0}
  .gtf-to{flex:none;font-size:12.5px;color:var(--text-2)}

  /* 门店多选：按钮 + 悬浮面板（面板不撑开布局，绝对定位浮在按钮正下方） */
  .gtf-selbox{position:relative}
  .gtf-sel{
    display:flex;align-items:center;justify-content:space-between;gap:8px;
    width:100%;height:38px;padding:0 12px;border-radius:8px;
    border:1px solid var(--input-border);background:var(--panel);color:var(--text);
    font-size:13px;font-family:inherit;cursor:pointer;text-align:left;transition:.15s;
  }
  .gtf-sel:hover{border-color:rgb(var(--primary-rgb) / .45)}
  .gtf-sel:disabled{cursor:not-allowed;background:rgba(120,130,150,.06)}
  .gtf-sel > span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
  .gtf-sel .is-ph{color:var(--text-3)}
  .gtf-caret{
    flex:none;width:0;height:0;
    border-left:4.5px solid transparent;border-right:4.5px solid transparent;border-top:5px solid var(--text-3);
  }
  .gtf-pop{
    position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:40;max-height:250px;
    display:flex;flex-direction:column;padding:6px;border-radius:10px;
    background:var(--panel);border:1px solid var(--border);box-shadow:0 14px 34px rgba(15,23,42,.16);
  }
  .gtf-pop[hidden]{display:none}
  .gtf-opt{
    display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:7px;
    font-size:13px;color:var(--text);cursor:pointer;
  }
  .gtf-opt:hover{background:rgb(var(--primary-rgb) / .07)}
  .gtf-opt input{accent-color:var(--primary);cursor:pointer;flex:none}
  .gtf-opt.is-all{border-bottom:1px solid var(--border);border-radius:7px 7px 0 0}
  .gtf-opt.is-all em{margin-left:auto;font-style:normal;font-size:11.5px;color:var(--text-3)}
  .gtf-pop-list{overflow-y:auto;padding-top:4px}
  .gtf-pop-empty{padding:16px 10px;text-align:center;font-size:12.5px;color:var(--text-3)}

  /* 数量 / 单价输入框里的单位后缀（元/件、箱…） */
  .gtf-unit-wrap{position:relative}
  .gtf-unit-wrap .gtf-in{padding-right:58px}
  .gtf-unit{position:absolute;right:12px;top:50%;transform:translateY(-50%);font-size:12px;color:var(--text-3);pointer-events:none}

  /* 奖罚三列：完成 / 超额 / 未完成，各自一列，下面一行是算法 */
  .gtf-rates{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
  @media (max-width:680px){.gtf-rates{grid-template-columns:minmax(0,1fr)}}
  .gtf-rate{display:flex;flex-direction:column;gap:6px;min-width:0}
  .gtf-rate-f{font-size:11px;color:var(--text-3);line-height:1.45}

  /* 底部预估：把三个算法现算一遍给人看，公式对不对一眼就知道 */
  .gtf-sum{
    display:flex;flex-wrap:wrap;align-items:center;gap:8px;
    padding:11px 14px;border-radius:10px;
    background:rgb(var(--primary-rgb) / .06);border:1px solid rgb(var(--primary-rgb) / .14);
  }
  .gtf-sum[hidden]{display:none}
  .gtf-sum-t{font-size:12.5px;color:var(--text-2)}
  .gtf-sum-t b{font-size:13.5px;color:var(--primary)}
  .gtf-sum-i{font-size:12.5px;color:var(--text-2);padding:2px 8px;border-radius:6px;background:rgba(255,255,255,.75)}
  /* 免责说明只是备注，别做成比金额还抢眼的蓝字 */
  .gtf-sum-note{margin-left:auto;font-size:11.5px;color:var(--text-3)}
  body.theme-dark .gtf-sum-i{background:rgba(255,255,255,.07)}
  body.theme-dark .gtf-pop{box-shadow:0 14px 34px rgba(0,0,0,.45)}

  /* ---------- 销售任务 · 查看（进展 + 销售报表） ----------
     这块只读、只看数，所以不套表单的标签列，改成「大数字 + 两张小表」，
     任务结束后运营一眼要看的是：完成多少、谁完成的、奖罚多少。 */
  .gtr-dlg{--dlg-w:980px;--dlg-h:700px}
  .gtr{flex:1;min-height:0;padding:18px 24px 16px;overflow-y:auto;display:flex;flex-direction:column;gap:14px}
  /* 弹性列里的子项默认会被压缩：弹窗顶到 72vh 后，展开「每日明细」会被压成 0 高，
     看着像点了没反应。子项一律不收缩，超出交给 .gtr 自己滚。 */
  .gtr > *{flex:none}
  .gtr-loading,.gtr-error{padding:36px 10px;text-align:center;font-size:13px;color:var(--text-3)}
  .gtr-error{color:#C0392B}

  .gtr-head{display:flex;align-items:center;gap:12px}
  .gtr-thumb{
    flex:none;width:46px;height:46px;border-radius:11px;display:flex;align-items:center;justify-content:center;
    font-size:22px;background:rgba(120,130,150,.08);border:1px solid var(--border);overflow:hidden;
  }
  .gtr-thumb img{width:100%;height:100%;object-fit:cover;border-radius:10px;display:block}
  .gtr-head-t{flex:1;min-width:0}
  .gtr-title{font-size:15px;font-weight:700;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .gtr-meta{margin-top:4px;display:flex;flex-wrap:wrap;gap:4px 12px;font-size:12px;color:var(--text-3)}
  .gtr-meta span{max-width:340px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

  .gtr-kpi{
    display:flex;gap:16px;padding:14px 16px;border-radius:12px;
    background:rgb(var(--primary-rgb) / .05);border:1px solid rgb(var(--primary-rgb) / .14);
  }
  .gtr-kpi-l{flex:1;min-width:0}
  .gtr-kpi-v{font-size:13px;color:var(--text-2)}
  .gtr-kpi-v b{font-size:26px;font-weight:800;color:var(--primary);margin-right:4px;font-variant-numeric:tabular-nums}
  .gtr-kpi-v i{font-style:normal;color:var(--text-3);font-size:12.5px}
  .gtr-bar{height:8px;border-radius:5px;margin:9px 0 7px;background:rgba(120,130,150,.16);overflow:hidden}
  .gtr-bar > i{display:block;height:100%;border-radius:5px;background:var(--primary);transition:width .3s}
  .gtr-kpi-s{font-size:12px;color:var(--text-3)}
  .gtr-kpi-r{flex:none;display:flex;align-items:stretch;gap:10px}
  .gtr-kpi-r > div{
    display:flex;flex-direction:column;gap:2px;justify-content:center;
    padding:6px 12px;border-radius:9px;background:rgba(255,255,255,.72);
  }
  .gtr-kpi-r span{font-size:11.5px;color:var(--text-3);white-space:nowrap}
  .gtr-kpi-r b{font-size:14px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums;white-space:nowrap}
  .gtr-kpi-r .is-sum{background:var(--primary)}
  .gtr-kpi-r .is-sum span{color:rgba(255,255,255,.82)}
  /* 合计块是主色实底，数字一律白色：原来沿用了 .gtr-neg 的深红，
     深红压在蓝底上对比度极低（暗色主题下更糊），不符合视觉规范。
     正负交给符号本身表达，块内不再换色。 */
  .gtr-kpi-r .is-sum b{font-size:16px;color:#fff !important}
  body.theme-dark .gtr-kpi-r > div{background:rgba(255,255,255,.07)}
  body.theme-dark .gtr-kpi-r .is-sum{background:var(--primary)}
  .gtr-neg{color:#C0392B !important}
  .gtr-pos{color:#0E9F6E !important}
  body.theme-dark .gtr-neg{color:#FF8A80 !important}
  body.theme-dark .gtr-pos{color:#3DDCA0 !important}

  .gtr-tip{font-size:12px;color:var(--text-3);line-height:1.6}
  .gtr-tip.is-done{color:#0E9F6E}
  body.theme-dark .gtr-tip.is-done{color:#3DDCA0}
  .gtr-tip.is-warn{color:#B45309}
  body.theme-dark .gtr-tip.is-warn{color:#FCD34D}
  .gtr-live{font-size:12.5px;color:var(--text-2);padding:8px 11px;border-radius:8px;background:rgba(245,166,35,.10);border:1px solid rgba(245,166,35,.28)}
  .gtr-live b{color:#B45309}
  body.theme-dark .gtr-live b{color:#FCD34D}

  /* 两张维度表并排；单维任务只有一张时自动占满整行，窄屏落成上下 */
  .gtr-dims{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px}
  .gtr-dim{border:1px solid var(--border);border-radius:10px;overflow:hidden;background:var(--panel)}
  .gtr-dim-h{
    display:flex;align-items:center;justify-content:space-between;
    padding:10px 12px;font-size:12.5px;font-weight:700;color:var(--text);
    background:rgba(120,130,150,.05);border-bottom:1px solid var(--border);
  }
  .gtr-dim-h span{font-weight:400;font-size:11.5px;color:var(--text-3)}
  /* 数据来源标签：收银机 / 兜底订单 —— 一排 0 到底是「没卖」还是「没接上」，得能看出来 */
  .gtr-src{
    margin-left:6px;margin-right:auto;font-style:normal;font-size:10px;font-weight:600;
    padding:1px 6px;border-radius:6px;white-space:nowrap;line-height:1.6;
    background:rgb(var(--primary-rgb) / .12);color:var(--primary);
  }
  .gtr-src.is-warn{background:rgba(217,119,6,.14);color:#B45309}
  body.theme-dark .gtr-src.is-warn{color:#FCD34D}
  /* 名单可能有十几家店 / 十几个客服：表体自己滚、表头吸顶，弹窗高度才稳得住。
     滚动条要常显一条细的 —— 否则用户以为只有前 8 家门店参与了任务。 */
  .gtr-dim-b{
    max-height:286px;overflow:auto;
    scrollbar-width:thin;scrollbar-color:rgba(120,130,150,.34) transparent;
  }
  .gtr-dim-b::-webkit-scrollbar{width:8px;height:8px}
  .gtr-dim-b::-webkit-scrollbar-thumb{background:rgba(120,130,150,.32);border-radius:4px}
  .gtr-dim-b::-webkit-scrollbar-track{background:transparent}
  .gtr-table{width:100%;border-collapse:collapse;font-size:12.5px}
  .gtr-table th{
    padding:7px 10px;text-align:left;font-weight:600;font-size:11.5px;color:var(--text-3);
    border-bottom:1px solid var(--border);white-space:nowrap;
  }
  .gtr-table.is-dim thead th{position:sticky;top:0;z-index:1;background:var(--panel)}
  .gtr-table td{padding:8px 10px;border-bottom:1px solid rgba(120,130,150,.10);color:var(--text-2)}
  .gtr-table tbody tr:last-child td{border-bottom:none}
  .gtr-table tbody tr:hover{background:rgb(var(--primary-rgb) / .03)}
  .gtr-table .r{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
  .gtr-table .r i{font-style:normal;color:var(--text-3)}
  .gtr-table .gtr-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .gtr-table .gtr-share{color:var(--text-3)}
  .gtr-table .gtr-day{font-variant-numeric:tabular-nums;color:var(--text-2)}
  /* 成绩表：名称让位给进度条，行高比明细表再紧一点 */
  .gtr-table.is-dim td{padding:7px 8px}
  .gtr-table.is-dim .gtr-name{max-width:116px}
  .gtr-prog-col{width:106px}
  /* 「进度」「奖罚」可点排序：默认淡箭头提示能点，点过之后主色 + 方向箭头 */
  .gtr-table th.gtr-sort{cursor:pointer;user-select:none;transition:color .15s}
  .gtr-table th.gtr-sort:hover{color:var(--primary)}
  .gtr-sort-i{display:inline-block;margin-left:3px;font-style:normal;font-size:11px;color:var(--text-3);opacity:.78}
  .gtr-table th.gtr-sort.is-on{color:var(--primary)}
  .gtr-table th.gtr-sort.is-on .gtr-sort-i{opacity:1;color:var(--primary)}
  .gtr-prog{display:flex;align-items:center;gap:6px}
  .gtr-prog-bar{flex:none;width:54px;height:5px;border-radius:3px;background:rgba(120,130,150,.18);overflow:hidden}
  .gtr-prog-bar > b{display:block;height:100%;border-radius:3px;background:var(--primary)}
  .gtr-prog-bar > b.is-done{background:#0E9F6E}
  .gtr-prog-n{font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums;white-space:nowrap}
  .gtr-table tr.is-idle .gtr-name b{font-weight:500;color:var(--text-3)}
  .gtr-table tr.is-idle .r{color:var(--text-3)}
  .gtr-zero{color:var(--text-3) !important}
  .gtr-tag{
    margin-left:4px;font-style:normal;font-size:10px;padding:1px 5px;border-radius:6px;
    background:rgba(120,130,150,.14);color:var(--text-3);white-space:nowrap;
  }
  /* 退单量：跟着「完成 / 任务」走，用罚色但压低饱和度，别抢了完成数的视线 */
  .gtr-rf{
    margin-left:5px;font-style:normal;font-size:10.5px;padding:0 5px;border-radius:6px;
    background:rgba(214,69,69,.10);color:var(--fail,#D64545);
    font-variant-numeric:tabular-nums;white-space:nowrap;cursor:help;
  }
  body.theme-dark .gtr-prog-bar{background:rgba(255,255,255,.14)}
  body.theme-dark .gtr-table.is-dim thead th{background:var(--panel)}
  .gtr-empty{padding:20px 12px;text-align:center;font-size:12px;color:var(--text-3)}

  .gtr-note{font-size:11.5px;color:var(--text-3);line-height:1.6}
  .gtr-daily{border:1px solid var(--border);border-radius:10px;overflow:hidden}
  .gtr-daily > summary{
    padding:10px 12px;cursor:pointer;font-size:12.5px;font-weight:600;color:var(--text-2);
    background:rgba(120,130,150,.05);list-style:none;
  }
  .gtr-daily > summary::-webkit-details-marker{display:none}
  .gtr-daily > summary::before{content:'\25B8 ';color:var(--text-3)}
  .gtr-daily[open] > summary::before{content:'\25BE '}
  .gtr-daily .gtr-table{border-top:1px solid var(--border)}

  @media (max-width: 820px){
    .gtr-dims{grid-template-columns:1fr}
    .gtr-kpi{flex-direction:column}
    .gtr-kpi-r{flex-wrap:wrap}
  }

  /* ---------- 商品 · 库存对比页（商品库存看板） ---------- */
  .gs-card{max-width:1600px}
  .gs-tabs{
    display:flex;align-items:center;justify-content:space-between;gap:12px;
    padding:0 16px;border-bottom:1px solid var(--border);flex-wrap:wrap;
  }
  .gs-tab-list{display:flex;gap:4px;flex-wrap:wrap}
  .gs-tab{
    position:relative;padding:13px 14px;font-size:13.5px;color:var(--text-2);
    cursor:pointer;user-select:none;transition:.15s;
  }
  .gs-tab:hover{color:var(--primary)}
  .gs-tab.on{color:var(--primary);font-weight:700}
  .gs-tab.on::after{
    content:'';position:absolute;left:12px;right:12px;bottom:0;height:2.5px;
    border-radius:2px;background:var(--primary);
  }
  .gs-panel{padding:16px}
  .gs-title{font-size:16px;font-weight:700;color:var(--text)}
  .gs-hint{font-size:12.5px;color:var(--text-3);margin:6px 0 14px}
  .gs-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
  .gs-kpi{
    border:1px solid var(--border);border-radius:10px;padding:12px 16px;
    background:rgba(120,130,150,.04);
  }
  .gs-kpi .k{font-size:12.5px;color:var(--text-3)}
  .gs-kpi .v{font-size:24px;font-weight:800;margin-top:4px;font-variant-numeric:tabular-nums}
  .gs-kpi .v.blue{color:var(--primary)}
  .gs-kpi .v.green{color:#0E9F6E}
  .gs-kpi .v.orange{color:#C2570B}
  .gs-kpi .v.teal{color:#0D9488}
  body.theme-dark .gs-kpi .v.green{color:#3DDCA0}
  body.theme-dark .gs-kpi .v.orange{color:#FFAB6B}
  body.theme-dark .gs-kpi .v.teal{color:#2DD4BF}
  .gs-check-time{font-size:12.5px;color:var(--text-3);margin-left:auto;white-space:nowrap}
  .gs-table{min-width:900px}
  .gs-table tbody tr{cursor:default}
  .gs-table tbody tr:hover{background:rgb(var(--primary-rgb) / .03)}
  .gs-table td{vertical-align:middle}
  .gs-table input[type="checkbox"]{accent-color:var(--primary);cursor:pointer;width:15px;height:15px}
  .gs-mall{color:var(--text-2);font-size:12.5px;line-height:1.5}
  .gs-stock{font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}
  .gs-stores{display:flex;flex-direction:column;gap:3px;height:57px;overflow-y:auto}
  .gs-store{font-size:11.5px;color:var(--text-2);line-height:1.5}
  .gs-store i{
    font-style:normal;color:var(--primary);font-weight:600;margin-right:4px;
    font-variant-numeric:tabular-nums;
  }
  .gs-ops{gap:8px;align-items:center}
  .gs-ops .btn{white-space:nowrap;flex:none;padding:0 10px}
  .btn.light{color:var(--primary);border-color:rgb(var(--primary-rgb) / .35);background:rgb(var(--primary-rgb) / .08)}
  .btn.light:hover{background:rgb(var(--primary-rgb) / .16)}
  .btn.light:disabled{opacity:.45;cursor:not-allowed}
  .btn.green{background:#0E9F6E;border-color:#0E9F6E;color:#fff}
  .btn.green:hover{background:#0B8A5F;border-color:#0B8A5F}
  .btn.orange{background:#E28743;border-color:#E28743;color:#fff}
  .btn.orange:hover{background:#CC7635;border-color:#CC7635}
  body.theme-dark .btn.green{background:rgba(14,159,110,.20);border-color:rgba(14,159,110,.45);color:#3DDCA0}
  body.theme-dark .btn.orange{background:rgba(226,135,67,.18);border-color:rgba(226,135,67,.45);color:#FFAB6B}
  .gt-badge.blue{background:var(--primary-soft);color:var(--primary);border-color:rgb(var(--primary-rgb) / .25)}
  .gt-badge.green{background:#EBF9F1;color:#0E9F6E;border-color:#C7EFDD}
  .gt-badge.orange{background:#FFF1E6;color:#C2570B;border-color:#F8DDC4}
  body.theme-dark .gt-badge.green{background:rgba(14,159,110,.14);color:#3DDCA0;border-color:rgba(14,159,110,.30)}
  body.theme-dark .gt-badge.orange{background:rgba(226,135,67,.14);color:#FFAB6B;border-color:rgba(226,135,67,.30)}

  /* ---------- 商品模块视觉强化：页头横幅 + 表格辨识度 ---------- */
  /* 页面顶部彩色渐变横幅 */
  .g-hero{
    position:relative;overflow:hidden;
    display:flex;align-items:center;gap:14px;
    max-width:1240px;margin:0 auto 14px;padding:18px 22px;
    border-radius:14px;color:#fff;
    background:linear-gradient(120deg, var(--primary), var(--primary-hover) 62%, color-mix(in srgb, var(--primary) 72%, #000));
    box-shadow:0 10px 26px rgb(var(--primary-rgb) / .28);
  }
  .g-hero-deco{position:absolute;border-radius:50%;background:rgba(255,255,255,.12);pointer-events:none}
  .g-hero-deco.d1{width:150px;height:150px;right:-38px;top:-72px}
  .g-hero-deco.d2{width:90px;height:90px;right:96px;bottom:-48px;background:rgba(255,255,255,.08)}
  .g-hero-ico{
    width:48px;height:48px;border-radius:13px;flex:none;position:relative;
    display:inline-flex;align-items:center;justify-content:center;font-size:24px;
    background:rgba(255,255,255,.20);
    box-shadow:inset 0 0 0 1px rgba(255,255,255,.28);
  }
  .g-hero-txt{position:relative;min-width:0}
  .g-hero-txt .t{font-size:17px;font-weight:800;letter-spacing:.5px;line-height:1.3}
  .g-hero-txt .d{font-size:12.5px;opacity:.85;margin-top:3px}
  body.theme-dark .g-hero{
    box-shadow:0 10px 26px rgba(0,0,0,.35);
    background:linear-gradient(120deg, color-mix(in srgb, var(--primary) 82%, #000), var(--primary-hover));
  }
  body.theme-dark .g-hero-txt .d{opacity:.75}
  /* 表头：主色底 + 主色粗字，行斑马纹，内容区不再一片白 */
  .lp-table th{
    background:linear-gradient(180deg, rgb(var(--primary-rgb) / .12), rgb(var(--primary-rgb) / .06));
    color:var(--primary);font-weight:700;
    border-bottom:2px solid rgb(var(--primary-rgb) / .35);
  }
  body.theme-dark .lp-table th{
    background:linear-gradient(180deg, rgb(var(--primary-rgb) / .20), rgb(var(--primary-rgb) / .10));
    border-bottom-color:rgb(var(--primary-rgb) / .40);
  }
  .lp-table tbody tr:nth-child(even){background:rgba(120,130,150,.035)}
  body.theme-dark .lp-table tbody tr:nth-child(even){background:rgba(255,255,255,.028)}
  .lp-table tbody tr:hover{background:rgb(var(--primary-rgb) / .06)}
  /* 卡片顶部主色细条，强化区块感 */
  .lp-card{position:relative}
  .lp-card::before{
    content:'';position:absolute;left:0;top:0;right:0;height:3px;
    border-radius:14px 14px 0 0;pointer-events:none;
    background:linear-gradient(90deg, var(--primary), rgb(var(--primary-rgb) / .25) 55%, transparent);
    opacity:.85;
  }
  body.theme-dark .lp-card::before{opacity:.5}
  /* 库存看板 KPI：按语义上色 */
  .gs-kpi.k-blue{border-color:rgb(var(--primary-rgb) / .35);background:linear-gradient(135deg, rgb(var(--primary-rgb) / .10), rgb(var(--primary-rgb) / .03))}
  .gs-kpi.k-green{border-color:rgba(14,159,110,.35);background:linear-gradient(135deg, rgba(14,159,110,.10), rgba(14,159,110,.03))}
  .gs-kpi.k-orange{border-color:rgba(226,135,67,.35);background:linear-gradient(135deg, rgba(226,135,67,.12), rgba(226,135,67,.03))}
  .gs-kpi.k-teal{border-color:rgba(13,148,136,.35);background:linear-gradient(135deg, rgba(13,148,136,.10), rgba(13,148,136,.03))}
  /* 横幅宽度跟随各页卡片宽度 */
  .g-hero:has(+ .gr-card){max-width:1600px}
  .g-hero:has(+ .gb-card), .g-hero:has(+ .gc-card){max-width:1600px}
  .g-hero:has(+ .gp-card){max-width:1600px}
  .g-hero:has(+ .gt-card), .g-hero:has(+ .gs-card){max-width:1600px}
  /* 商品模块表格：长文本可换行，表格始终与卡片同宽，不出现横向滚动条 */
  .gr-table td,.gb-table td,.gp-table td,.gt-table td,.gs-table td{white-space:normal}
  /* 操作列按钮强制单行横向排列、禁止换行（特异性高于上面的 .gb-table td 等，确保覆盖 white-space:normal）；其他页面同理 */
  .lp-table td.gb-ops,.lp-table td.gs-ops,.lp-table td.g-ops,.lp-table td.his-ops,.asel .a-ops{white-space:nowrap;vertical-align:middle}
  /* 商品模块：操作列去掉底部行分隔线（按钮下方漂浮的浅色短线） */
  .gr-table td:last-child,.gb-table td:last-child,.gp-table td:last-child,.gt-table td:last-child,.gs-table td:last-child{border-bottom:0}
  /* 表头与日期列一律单行：这两处一折行（「单 位」「2026-11- / 01~2026-11-30」）
     比横向滚动更难读；表格容器本身可以左右滚，够宽时自然全部铺开。 */
  .gt-table th{white-space:nowrap}
  .gt-table .gt-time{white-space:nowrap}
  .gr-table .gt-badge,.gb-table .gt-badge,.gp-table .gt-badge,.gt-table .gt-badge,.gs-table .gt-badge{white-space:nowrap}
  .gs-table .gs-store{white-space:normal}

  /* ---------- 转门店弹窗（购买清单「转」/ 批量转单） ---------- */
  .transfer-modal{ width:min(680px,100%); height:min(640px,100%); }
  .transfer-modal .gsel-body{ flex-direction:column; padding:0; }
  .tf-prod{
    flex:none; border-bottom:1px solid var(--border);
    padding:14px 16px; background:#FAFBFC;
  }
  .tf-prod .g-img{ width:44px;height:44px;border-radius:6px; }
  .tf-multi{ font-size:13px; color:var(--text); line-height:1.8; }
  .tf-multi b{ color:var(--primary); }
  .tf-chip{
    display:inline-block; background:var(--primary-soft,#EAF1FF); color:var(--primary,#2F6FED);
    font-size:12px; padding:2px 9px; border-radius:11px; margin:2px 4px 2px 0;
  }
  .tf-scroll{ flex:1; min-height:0; border:none; border-radius:0; }
  .tf-row{ cursor:pointer; }
  .tf-row.on td{ background:var(--primary-soft,rgba(59,130,246,.08)); }
  .tf-row.on .tf-shop{ color:var(--primary,#2F6FED); font-weight:600; }
  .tf-shop{ font-size:13px; color:var(--text); }
  .tf-stock{ font-size:12.5px; color:#4A5568; font-variant-numeric:tabular-nums; }
  .tf-cap{ font-size:12px; color:#9AA3B2; white-space:nowrap; }
  /* 运力 / 库存都是异步补的：占位（读取中 / — / 未配编码）用更浅的字重，
     别让人误以为是「0 单」这种真实数据。0 人则要红出来，那是「转过去没人送」。 */
  .tf-cap .tf-cap-main{ color:#4A5568; font-weight:600; }
  .tf-cap .tf-cap-main.tf-zero{ color:#DC2626; }
  .tf-dim{ color:#AEB5C2; font-weight:400; }
  body.theme-dark .tf-stock,body.theme-dark .tf-cap{ color:#8E94A2 }
  body.theme-dark .tf-cap .tf-cap-main{ color:#D6DAE3 }
  body.theme-dark .tf-cap .tf-cap-main.tf-zero{ color:#F87171 }
  .transfer-modal .gsel-foot{ flex:none; display:flex; justify-content:flex-end; gap:10px; padding:12px 16px; border-top:1px solid var(--border); }

  /* ---------- 自动发单开关（线上接单） ---------- */
  .grab-fetch-row{ display:flex; align-items:center; justify-content:center; gap:16px; flex-wrap:wrap; }
  .auto-wrap{ display:inline-flex; align-items:center; gap:8px; cursor:pointer; user-select:none; }
  .auto-sw{
    width:40px; height:22px; border-radius:11px; background:#CBD5E1;
    position:relative; display:inline-block; transition:background .2s; flex:none;
  }
  .auto-sw::after{
    content:''; position:absolute; top:2px; left:2px; width:18px; height:18px;
    border-radius:50%; background:#fff; box-shadow:0 1px 3px rgba(0,0,0,.25); transition:left .2s;
  }
  .auto-sw.on{ background:#16A34A; }
  .auto-sw.on::after{ left:20px; }
  .auto-lb{ font-size:13.5px; color:var(--text,#333); }
  .auto-status{ margin-top:10px; font-size:12.5px; color:#4A5568; }

  /* ---------- 订单设置 · 暂停计时开关（复用全局开关 .gr-sw，与商品「作废」开关风格统一；开启态用主题主色，区别于红色告警） ---------- */
  .stg-switch-row{
    display:flex; align-items:center; justify-content:space-between; gap:18px;
    padding:18px 20px; background:var(--bg-2,#F8FAFC); border:1px solid var(--border); border-radius:12px;
  }
  .stg-switch-l{ min-width:0; }
  .stg-switch-t{ font-size:15px; font-weight:700; color:var(--text,#1f2a37); margin-bottom:4px; }
  .stg-switch-d{ font-size:12.5px; color:var(--text-2,#64748B); line-height:1.55; }
  .gr-sw.is-pause.on{ background:var(--primary); }
  .gr-sw.is-pause:focus-visible{ outline:2px solid color-mix(in srgb, var(--primary) 45%, transparent); outline-offset:2px; }

  /* ---------- 订单查询（重构版：筛选区 + 订单卡片列表） ---------- */
  .q-filter{ background:#F5F7FA; border:1px solid var(--border); border-radius:10px; padding:14px 16px 12px; margin-bottom:14px; }
  /* 检索条件：2 行 × 5 列的等宽网格（标签 + 控件） */
  .qf-grid{ display:grid; grid-template-columns:repeat(5, minmax(0,1fr)); gap:10px 18px; margin-bottom:12px; }
  .qf-item{ display:flex; align-items:center; gap:8px; min-width:0; }
  .qf-item .qf-lb{ flex:none; white-space:nowrap; }
  .qf-item .po-in{ flex:1; min-width:0; width:auto; max-width:none; }
  .qf-row{ display:flex; align-items:center; gap:10px; margin-bottom:10px; flex-wrap:wrap; }
  .qf-lb{ font-size:13px; color:var(--text); flex:none; min-width:0; }
  /* 锁死的筛选项（收银台的门店条件）：看起来就不能改，避免有人一直点它。
     用 disabled 的 select 而不是纯文字，是为了让这一格和其他条件对齐。 */
  .qf-item.is-locked .po-in,
  .qf-item.is-locked .po-in:disabled{
    background:#EEF2F7; color:var(--text-2,#475569); cursor:not-allowed;
    -webkit-text-fill-color:var(--text-2,#475569); opacity:1;
  }
  .qf-lock{
    flex:none; padding:1px 6px; border-radius:999px; font-size:11px; line-height:1.6;
    background:rgb(var(--primary-rgb) / .10); color:var(--primary); white-space:nowrap;
  }
  body.theme-dark .qf-item.is-locked .po-in,
  body.theme-dark .qf-item.is-locked .po-in:disabled{ background:#262A35; color:#A8B0C0; -webkit-text-fill-color:#A8B0C0; }
  .qf-mid{ width:170px; flex:none; }
  .qf-grow{ flex:1; min-width:140px; max-width:320px; }
  /* ---------- 日期/时间框空值提示（订单查询 · 销售任务共用） ----------
     原生 datetime-local / date 空值时，显示的是浏览器内部的占位符
     「yyyy/mm/日 --:--」—— 月份用英文 mm、日却用中文「日」，中英混杂，
     看着像格式坏了。placeholder 属性对它无效，::placeholder 选不中，
     :placeholder-shown 也不生效（实测 matches() 返回 false），
     所以只能：包一层 + JS 判空打 .is-empty + 把内部编辑区文字变透明。
     宽度由使用方各自给（发单时间 190、销售任务 200），这里只管结构与文案。 */
  .dt-cell{ position:relative; display:inline-flex; align-items:center; flex:none; }
  .dt-cell > input{ width:100%; }
  .dt-ph{
    position:absolute; left:12px; top:50%; transform:translateY(-50%);
    font-size:13.5px; font-weight:400; color:var(--text-3,#8695A8);
    pointer-events:none; display:none; white-space:nowrap;
  }
  .dt-cell.is-empty .dt-ph{ display:block; }
  .dt-cell.is-empty > input::-webkit-datetime-edit{ color:transparent; }
  /* 聚焦后必须让位：datetime-local 不是整块输入框，聚焦会切成「年 / 月 / 日 / 时 / 分」
     几个可点选的分段，并自动选中第一段（蓝底白字）。这时透明只对没选中的分段有效，
     选中的那段照样把「yyyy」露出来，和下面的中文提示叠在一起 —— 就是这次的错乱。
     所以聚焦期间收起提示、恢复正常字色，让原生分段（yyyy/mm/日 --:--）回来：
     用户要逐段填，本来就需要看见这几段。 */
  .dt-cell.is-empty > input:focus::-webkit-datetime-edit{ color:var(--text); }
  .dt-cell.is-empty > input:focus ~ .dt-ph{ display:none; }
  .dt-cell > input::-webkit-calendar-picker-indicator{ cursor:pointer; }

  /* 发单时间通栏行：时间选择器 + 胶囊快捷区间（今天/昨天/近3天/近7天） */
  .qf-span .dt-cell{ width:190px; }
  .qf-dt{ cursor:pointer; }
  /* 销售任务筛选栏的日期框：原设计 200（.lp-filter .po-in 的 max-width） */
  .lp-filter .dt-cell{ width:200px; }
  .qf-sep{ color:var(--text-3); flex:none; }
  .qf-push{ margin-left:26px; }
  /* 发单时间通栏行：时间选择器 + 胶囊快捷区间（今天/昨天/近3天/近7天） */
  .qf-span{ grid-column:1 / -1; }
  .qf-span2{ grid-column:span 2; } /* 商品名称跨两列，右缘与上一行对齐 */
  /* gap 5→4：1088 宽下 7 个胶囊 + 两个日期框比网格宽 2px，收 6px 刚好放下，
     不用换行（换行会把「本季度」甩到第二行，更难看） */
  .qf-chips{ display:flex; gap:4px; flex:none; margin-left:6px; }
  .qf-chip{ font-size:12px; line-height:1; padding:6px 12px; border-radius:999px; border:1px solid var(--border); background:#fff; color:var(--text-2,#555); cursor:pointer; user-select:none; white-space:nowrap; transition:background .15s, color .15s, border-color .15s; }
  .qf-chip:hover{ border-color:var(--primary,#2F6FED); color:var(--primary,#2F6FED); }
  .qf-chip.on{ background:var(--primary,#2F6FED); border-color:var(--primary,#2F6FED); color:#fff; font-weight:600; }
  .qf-ops{ display:flex; gap:10px; padding-left:0; margin-top:2px; }
  .btn.blue{ background:var(--primary,#2F6FED); color:#fff; border-color:var(--primary,#2F6FED); }
  .btn.blue:hover{ filter:brightness(1.06); }

  /* 订单卡片 9 列网格：商品信息/单价数量/订单金额/收货人号码/会员等级/发单人时间/配送人号码/订单状态/操作 */
  .q-grid9{ display:grid; grid-template-columns:minmax(0,1.55fr) 96px 84px 132px 148px 184px 162px 92px 172px; align-items:center; }
  .q-head{ padding:9px 0; border-bottom:1px solid var(--border); font-size:12.5px; color:var(--text-2,#555); font-weight:600; }
  .q-head > span:first-child{ padding-left:10px; } /* 与卡片内容左对齐 */
  .q-head span{ text-align:center; }
  .q-head span:first-child{ text-align:left; }
  .q-head .qo-c{ text-align:center; }

  /* ===== 订单卡片（按截图样式）：顶部信息条 + 9 列主体 + 备注行 ===== */
  .qo-card{ border:1px solid #C9C9C9; border-radius:10px; margin:18px 0; background:#fff; position:relative; overflow:hidden; transition:border-color .15s, box-shadow .15s; }
  /* 鼠标触碰：边框转黑，便于定位当前订单 */
  .qo-card:hover{ border-color:#000; box-shadow:0 2px 10px rgba(31,41,55,.07); }
  /* 从消息通知点进来定位到的那一单：蓝框 + 三次呼吸，扫一眼就知道该处理哪张。
     动画结束后只留边框（颜色落回主色半透明），免得整页一直闪。 */
  .qo-card.is-hit{
    border-color:var(--primary);
    box-shadow:0 0 0 2px rgb(var(--primary-rgb) / .35), 0 8px 22px rgb(var(--primary-rgb) / .18);
    animation:qoHit 900ms ease-in-out 3;
  }
  @keyframes qoHit{
    0%,100%{ box-shadow:0 0 0 2px rgb(var(--primary-rgb) / .18), 0 8px 22px rgb(var(--primary-rgb) / .10); }
    50%    { box-shadow:0 0 0 5px rgb(var(--primary-rgb) / .34), 0 10px 26px rgb(var(--primary-rgb) / .22); }
  }
  @media (prefers-reduced-motion: reduce){ .qo-card.is-hit{ animation:none; } }
  /* 已取消订单：整卡转为灰色调（去色 + 灰底 + 虚线边框 + 斜纹），与正常订单明显区分 */
  .qo-card.is-cancel{
    border-color:#BFC4CC; border-style:dashed; background-color:#F4F5F7;
    background-image:repeating-linear-gradient(45deg, rgba(15,23,42,.04) 0 8px, rgba(15,23,42,0) 8px 16px);
    filter:grayscale(1); opacity:.88;
    transition:border-color .15s, box-shadow .15s, opacity .15s;
  }
  .qo-card.is-cancel:hover{ border-color:#6B7280; opacity:1; }
  .qo-card.is-cancel .qo-seq{ border-color:#9AA3B2; color:#6B7280; background:#EDEFF2; }
  .qo-card.is-cancel .qo-amt b{ color:#7A8089; }
  .qo-cancel-tag{
    flex:none; font-size:11.5px; font-weight:600; color:#6B7280; background:#E6E8EB;
    border:1px solid #C9CDD4; border-radius:6px; padding:1px 8px; line-height:1.5; letter-spacing:.2px;
  }
  /* ===== 预约单标识（2026-11-09） =====
     门店一屏几十张卡，「约了几点」必须第一眼看见，所以给了三处冗余：
     左侧橙色竖条（扫视时最先命中的位置）+ 单号旁橙色药丸（带还剩多久）+ 时间轴显示预约时刻。
     用橙色而不是红色：红在这张卡上已经被「超时」占了，预约是「待办」不是「事故」。 */
  .qo-card.is-book{ box-shadow:inset 4px 0 0 #F97316; }
  .qo-card.is-book:hover{ box-shadow:inset 4px 0 0 #F97316, 0 2px 10px rgba(31,41,55,.07); }
  .qo-book-tag{
    flex:none; display:inline-flex; align-items:center; gap:3px;
    font-size:11.5px; font-weight:700; line-height:1.6;
    color:#B45309; background:#FFF4E5; border:1px solid #FBC98A;
    border-radius:6px; padding:1px 8px; letter-spacing:.2px; white-space:nowrap;
  }
  /* 已过预约时间还没送达：整颗转红，和「超时」是同一件事的两种表达 */
  .qo-book-tag.is-late{ color:#B42318; background:#FEF0EF; border-color:#F5A9A2; }
  .qo-ntime.bookwait{ color:#B45309; font-weight:700; }
  .qo-book-note span:last-child{ color:#B45309; font-weight:600; }
  /* 顶部信息条：序号块 + 编号/地址/地图图标/门店/转单打印 + 节点流程 + 总倒计时框 */
  .qo-top{ display:flex; align-items:center; gap:14px; padding:20px 14px 17px 10px; border-bottom:1px solid #EEF0F4; }
  .qo-seq{
    width:56px; height:46px; border:1.5px solid #333; border-radius:8px; flex:none; box-sizing:border-box;
    display:flex; align-items:center; justify-content:center; font-size:16px; font-weight:700; color:#333; background:#fff;
  }
  .qo-lines{ min-width:0; flex:1; }
  .qo-line{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; font-size:12.5px; color:var(--text); margin-bottom:3px; }
  .qo-line:last-child{ margin-bottom:0; }
  .qo-k{ color:var(--text-2,#666); flex:none; }
  .qo-no{ color:var(--primary,#2F6FED); cursor:pointer; }
  .qo-no:hover{ text-decoration:underline; }
  .qo-shop{ color:#fff; font-weight:600; background:var(--primary,#2F6FED); padding:0 10px; border-radius:9px; font-size:11.5px; flex:none; display:inline-flex; align-items:center; justify-content:center; height:28px; box-sizing:border-box; }
  .qo-addr{ color:#4A5568; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }
  /* 进店销售：没有地址，用暖色文字说明「没有配送这回事」，别让它看着像地址缺失 */
  .qo-addr.qo-walkin{ color:#B45309; }
  body.theme-dark .qo-addr.qo-walkin{ color:#FCD34D; }
  .qo-mapico{
    flex:none; display:inline-flex; align-items:center; justify-content:center;
    width:24px; height:24px; border-radius:6px; color:#E5484D; cursor:pointer;
    background:#FEECEC; border:1px solid #F8C9C9; transition:all .15s;
  }
  .qo-mapico:hover{ background:#E5484D; color:#fff; border-color:#E5484D; }
  .qo-act.pil{ color:var(--text-2,#555); border:1px solid var(--border); background:#F7F8FA; padding:0 16px; border-radius:7px; font-size:12.5px; white-space:nowrap; display:inline-flex; align-items:center; justify-content:center; height:28px; box-sizing:border-box; }
  .qo-act.pil:hover{ color:var(--primary,#2F6FED); border-color:var(--primary,#2F6FED); background:#fff; }
  .qo-cd.urgent, .qo-cdbox.urgent{ background:#DC2626; }

  /* 收货位置地图弹窗 */
  .am-modal{ width:760px; max-width:94vw; max-height:90vh; overflow:auto; background:#fff; border-radius:12px; padding:16px 18px; box-shadow:0 10px 40px rgba(0,0,0,.18); }
  .am-head{ display:flex; align-items:center; justify-content:space-between; font-size:15px; font-weight:700; color:var(--text); margin-bottom:10px; }
  .am-x{ cursor:pointer; color:#9AA3B2; font-size:14px; line-height:1; }
  .am-x:hover{ color:var(--text); }
  .am-addr{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:12.5px; margin-bottom:10px; }
  .am-at{ color:var(--text); font-weight:600; }
  /* Leaflet 必须给容器一个**确定高度**，否则瓦片一块都不画（高度 0 时可视区算成 0×0） */
  .am-map{ height:340px; position:relative; border:1px solid var(--border); border-radius:8px; overflow:hidden; background:#EEF1F5; }
  .am-map .leaflet-container{ height:100%; background:#EEF1F5; }
  /* 这种「红钉」是 Leaflet 的 divIcon：桌面端默认会给白色方块底 + 灰边框，
     而 .sf-pin-wrap 的去底样式写在移动端媒体查询里，所以这里必须自己再声明一次 */
  .am-map .sf-pin-wrap{ background:transparent; border:0; }
  .am-wait{ display:flex; align-items:center; justify-content:center; gap:8px; height:100%; font-size:13px; color:var(--text-3,#889); }
  .am-wait::before{
    content:''; width:14px; height:14px; border-radius:50%;
    border:2px solid #D6DEEA; border-top-color:var(--primary,#2F6FED);
    animation:amSpin .8s linear infinite;
  }
  @keyframes amSpin{ to{ transform:rotate(360deg); } }
  .am-empty{
    height:100%; display:flex; flex-direction:column; align-items:center; justify-content:center;
    gap:6px; padding:0 40px; text-align:center; background:#F7F9FC;
  }
  .am-empty b{ font-size:13.5px; color:var(--text); }
  .am-empty span{ font-size:12.5px; line-height:1.6; color:var(--text-3,#889); }
  .am-empty .am-tip{ font-size:11.5px; color:#B4791A; }
  /* 门店蓝点：只标位置，不抢红钉（红钉才是这单要送到的地方）。
     店名给个白底药丸，否则压在高德底图的 POI 文字上就糊成一片看不清。 */
  .am-map .am-store-pin{ background:transparent; border:0; z-index:400; }
  .am-map .am-store-pin i{
    display:block; width:12px; height:12px; border-radius:50%;
    background:#2F6FED; border:3px solid #fff; box-sizing:border-box;
    box-shadow:0 0 0 2px rgba(47,111,237,.35),0 2px 5px rgba(0,0,0,.25);
  }
  .am-map .am-store-pin b{
    position:absolute; left:16px; top:-10px; padding:1px 7px; border-radius:9px;
    background:rgba(255,255,255,.95); border:1px solid rgba(47,111,237,.35);
    box-shadow:0 1px 3px rgba(0,0,0,.14);
    font-size:11px; font-weight:600; color:#2F6FED; white-space:nowrap; line-height:16px;
  }
  .am-meta{ margin-top:12px; padding-top:10px; border-top:1px solid var(--border,#EDF0F4); display:flex; flex-direction:column; gap:3px; }
  .am-row{ display:flex; gap:8px; align-items:flex-start; font-size:12.5px; line-height:1.65; }
  .am-row i{ flex:none; width:60px; font-style:normal; color:var(--text-3,#889); }
  .am-row span{ flex:1; min-width:0; color:var(--text-2,#555); word-break:break-all; }
  .am-row.am-warn span{ color:#B4791A; font-size:11.5px; }
  .am-ops{ display:flex; justify-content:flex-end; gap:10px; margin-top:14px; flex-wrap:wrap; }
  /* 修正：Leaflet 的 divIcon 自带白色方块底 + 灰边框（.leaflet-div-icon），
     原来这份去底样式只写在 ≤900px 的媒体查询里，桌面端「档案 → 门店」的红钉
     一直显示成一个白方块。这里补一条全局的，两个页面一起好。 */
  .sf-pin-wrap{ background:transparent; border:0; }

  /* 订单备注弹窗 */
  .orem-modal{ width:480px; max-width:94vw; }
  .orem-ta{
    width:100%; height:110px; box-sizing:border-box; resize:vertical;
    border:1px solid var(--border); border-radius:8px; padding:10px 12px;
    font-size:13px; font-family:inherit; line-height:1.6; color:var(--text);
  }
  .orem-ta:focus{ outline:none; border-color:var(--primary,#2F6FED); }
  .orem-ops{ display:flex; align-items:center; justify-content:flex-end; gap:12px; margin-top:10px; }
  .orem-count{ font-size:11.5px; color:var(--text-3,#889); }

  /* 跑腿代送弹窗（UU跑腿）：先亮地址，再亮运费 —— 坐席确认的是「从哪取、送到哪、多少钱」 */
  .erd-modal{ width:520px; max-width:94vw; }
  .erd-ord{ display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; margin-bottom:10px; font-size:12.5px; }
  .erd-ord b{ font:600 12.5px/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; color:var(--text); }
  .erd-ord span{ color:var(--text-2,#556); }
  .erd-ord em{ margin-left:auto; font-style:normal; color:var(--text-3,#889); font-size:12px; }
  .erd-body{ min-height:86px; }
  .erd-wait{ padding:18px 0; text-align:center; font-size:12.5px; color:var(--text-3,#889); }
  .erd-row{ display:flex; gap:8px; align-items:flex-start; padding:5px 0; font-size:12.5px; line-height:1.6; }
  .erd-row i{ flex:none; width:32px; font-style:normal; color:var(--text-3,#889); }
  .erd-row span{ color:var(--text); word-break:break-all; }
  .erd-src{ font-size:11.5px; color:var(--text-3,#889); line-height:1.5; padding:0 0 2px 40px; }
  .erd-fee{ margin-top:10px; padding-top:10px; border-top:1px dashed var(--border); display:flex; flex-direction:column; gap:6px; }
  .erd-fee > div{ display:flex; align-items:baseline; gap:8px; font-size:12.5px; }
  .erd-fee i{ flex:none; width:56px; font-style:normal; color:var(--text-3,#889); }
  .erd-fee b{ color:var(--text); font-weight:600; }
  .erd-money{ color:#E34D4D; font-size:15px; }
  /* 费用构成（起步价/夜间费/重量费）：比主金额弱一档，长的时候允许换行 */
  .erd-det{ font-weight:500 !important; font-size:12px; color:var(--text-2,#556); line-height:1.5; word-break:break-all; }
  .erd-mono{ font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; }
  .erd-tip{ margin-top:8px; font-size:11.5px; line-height:1.6; color:var(--text-3,#889); }
  .erd-err{ padding:14px; border-radius:8px; background:#FEF2F2; color:#B42318; font-size:12.5px; line-height:1.6; }
  .erd-ok{ padding:16px; border-radius:8px; background:#F0FDF4; color:#15803D; font-size:12.5px; line-height:1.7; text-align:center; }
  .erd-code{ margin-top:6px; font:600 15px/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; color:#0F172A; }
  .erd-ops{ display:flex; justify-content:flex-end; gap:10px; margin-top:14px; }

  /* 顾客付款链接弹窗：链接长、要能整段选中，所以用只读输入框而不是 <p> */
  .pfl-modal{ width:520px; max-width:94vw; }
  .pfl-tip{ margin:2px 0 8px; font-size:12.5px; line-height:1.6; color:var(--text-2,#556); }
  .pfl-url{
    width:100%; box-sizing:border-box; padding:9px 11px;
    border:1px solid var(--border); border-radius:8px; background:var(--panel,#fff);
    font:12.5px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
    color:var(--text); text-overflow:ellipsis;
  }
  .pfl-url:focus{ outline:none; border-color:var(--primary,#2F6FED); }
  .pfl-ops{ display:flex; align-items:center; gap:10px; margin-top:10px; flex-wrap:wrap; }
  /* 提示（成功/失败原因）始终独占整行，三个按钮在下一行右对齐。
     原来提示和按钮挤一行：有了「打印付款码」第三个按钮之后，一行放不下，
     提示会被压成两三个字宽。空提示直接不占位，常态下不留空白。 */
  .pfl-state{ flex:1 1 100%; min-width:0; font-size:11.5px; color:var(--text-3,#889); line-height:1.5; }
  .pfl-state:empty{ display:none; }
  .pfl-ops > .btn:first-of-type{ margin-left:auto; }
  .pfl-state.is-err{
    font-size:12px; line-height:1.55; color:#c0392b;
  }

  /* ===== 付款码贴纸（58mm 热敏纸，可打印宽 48mm）=====
     贴在酒/箱子上，顾客扫一下就是这一单。屏上不占位，只有 body.pf-print
     的打印态才出现 —— 收银小票那套是 body > :not(#cshReceipt) 全局隐藏，
     直接复用会把贴纸一起藏掉，所以单独开一个开关，两边互不影响。 */
  #pflPrint{ display:none; }
  .pflq{
    width:48mm; margin:0 auto; text-align:center;
    color:#000; background:#fff;
    font-family:"PingFang SC","Microsoft YaHei",sans-serif;
  }
  .pflq-shop{ font-size:10pt; font-weight:600; line-height:1.3; }
  .pflq-k{ font-size:8.5pt; color:#333; margin-top:1mm; letter-spacing:1pt; }
  .pflq-amt{ font-size:19pt; font-weight:800; line-height:1.1; margin:.6mm 0 2mm; letter-spacing:-.3pt; }
  .pflq-qr{ line-height:0; }
  .pflq-qr svg{ display:block; margin:0 auto; }
  .pflq-tip{ font-size:9pt; font-weight:600; margin-top:2mm; line-height:1.4; }
  .pflq-no{ font-size:6.5pt; color:#555; margin-top:1mm; letter-spacing:.2pt; word-break:break-all; }

  @media print{
    body.pf-print > :not(#pflPrint){ display:none !important; }
    body.pf-print #pflPrint{ display:block !important; }
    /* 万一收银小票容器也在页面上，别让两张一起出纸 */
    body.pf-print #cshReceipt{ display:none !important; }
  }

  /* 指派送货员弹窗：列表里按门店分组会太长，直接在每行标出所属门店 */
  .orider-modal{ width:420px; max-width:94vw; }
  .orider-list{ max-height:340px; overflow:auto; border:1px solid var(--border); border-radius:8px; }
  .orider-empty{ padding:18px; text-align:center; font-size:12.5px; color:var(--text-3,#889); }
  .orider-row{
    display:flex; align-items:center; gap:10px; width:100%; padding:10px 12px;
    background:none; border:0; border-bottom:1px solid #EEF0F4; cursor:pointer; text-align:left;
  }
  .orider-row:last-child{ border-bottom:0; }
  .orider-row:hover{ background:var(--primary-soft,#F2F7FF); }
  .orider-row.on{ background:var(--primary-soft,#F2F7FF); }
  .orider-ava{
    width:28px; height:28px; border-radius:50%; flex:0 0 28px;
    display:flex; align-items:center; justify-content:center;
    background:var(--primary,#2F6FED); color:#fff; font-size:12px;
  }
  .orider-if{ display:flex; flex-direction:column; gap:2px; min-width:0; }
  .orider-if b{ font-size:13px; color:var(--text); font-weight:600; }
  .orider-if i{ font-size:11.5px; color:var(--text-3,#889); font-style:normal; }
  .orider-tag{ margin-left:auto; font-size:11px; color:var(--text-3,#889); white-space:nowrap; }
  .orider-ops{ display:flex; align-items:center; justify-content:flex-end; gap:10px; margin-top:10px; }
  .orider-hint{ font-size:11.5px; color:var(--text-3,#889); margin-top:8px; }

  /* 9 列主体：各列间细分隔线 */
  .qo-main{ padding:10px 0; border-bottom:1px solid #EEF0F4; }
  .qo-main > div{ padding:2px 10px; min-width:0; }
  .qo-main > div + div{ border-left:1px solid #EEF0F4; }
  .qo-act{ color:var(--primary,#2F6FED); cursor:pointer; white-space:nowrap; }
  .qo-act:hover{ text-decoration:underline; }
  /* 商品信息列 */
  .qo-goods{ display:flex; flex-direction:column; gap:8px; }
  .qo-item{ display:flex; align-items:center; gap:10px; min-height:48px; min-width:0; }
  .qo-img{
    width:44px; height:44px; border-radius:6px; color:#fff; font-size:16px; font-weight:600;
    display:flex; align-items:center; justify-content:center; flex:none;
    overflow:hidden; position:relative;
  }
  /* 商品真图：绝对定位盖住底下的首字色块。图挂了 onerror 会移除自己，
     自然露出首字，不会出现破图框（和接单页 .g-img 同一套做法） */
  .qo-img>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:inherit}
  .qo-gt{ display:flex; flex-direction:column; gap:2px; min-width:0; }
  .qo-nm{ color:var(--text); font-size:12.5px; font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .qo-gsub{ font-style:normal; font-size:11.5px; color:var(--text-3); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .qo-gmeta{ font-size:11.5px; color:var(--text-3); }
  /* 单价/数量列 */
  .qo-pqcol{ display:flex; flex-direction:column; gap:8px; justify-content:center; }
  .qo-pqrow{ display:flex; flex-direction:column; gap:3px; }
  .qo-pq{ font-size:12.5px; color:var(--text); font-variant-numeric:tabular-nums; text-align:center; }
  /* 订单金额列 */
  .qo-amt{ display:flex; flex-direction:column; gap:4px; align-items:center; }
  .qo-amt b{ color:#E34D4D; font-size:15px; font-variant-numeric:tabular-nums; }
  .qo-paytag{ font-size:11px; color:var(--primary,#2F6FED); background:#E8F1FE; padding:1px 8px; border-radius:8px; white-space:nowrap; }
  /* 组合支付：每种付款方式一个标签、逐行显示各自实际分摊金额（列宽不够时省略号 + title 兜底） */
  .qo-amt .qo-paytag{ max-width:100%; overflow:hidden; text-overflow:ellipsis; }
  .qo-paytag.is-mix{
    align-self:stretch; text-align:center; padding-left:4px; padding-right:4px;
    background:#EFF3FA; color:#3E4C63; box-shadow:inset 0 0 0 1px rgba(47,111,237,.12);
  }
  /* 积分抵扣：橙色=「减项」，与蓝色付款方式、灰色组合支付区分开，
     顾客用的积分是钱以外的东西，不能让收银员以为是另一种付款方式 */
  .qo-paytag.is-cut{ background:#FFF2E4; color:#B9690A; box-shadow:inset 0 0 0 1px rgba(201,113,12,.14); }
  /* 收货人 / 发单人 / 配送人列 */
  .qo-cust{ display:flex; flex-direction:column; gap:3px; justify-content:center; text-align:center; }
  .qo-cust b{ font-size:12.5px; color:var(--text); font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .qo-cust i{ font-style:normal; font-size:11.5px; color:var(--text-3); }
  /* 收货人姓名可点：点击在右侧拉出会员抽屉（悬停变主题色 + 虚线下划线提示可点） */
  .qo-cust-nm{
    cursor:pointer; border-radius:4px; padding:1px 4px; margin:-1px -4px;
    align-self:center; max-width:100%;
    transition:color .16s, background-color .16s;
  }
  .qo-cust-nm:hover, .qo-cust-nm:focus-visible{
    color:var(--primary,#2F6FED); background:#EAF2FE;
    text-decoration:underline; text-decoration-style:dotted; text-underline-offset:3px;
    outline:none;
  }
  .qo-cust-nm:active{ transform:translateY(.5px); }
  body.theme-dark .qo-cust-nm:hover, body.theme-dark .qo-cust-nm:focus-visible{ background:rgba(255,255,255,.08); }
  /* 发单人 / 配送人：圆形头像 + 姓名 + 副行（时间 / 手机号） */
  .qo-sender, .qo-rider{ display:flex; align-items:center; min-width:0; }
  .qo-per{ display:flex; align-items:center; gap:8px; min-width:0; }
  .qo-pif{ display:flex; flex-direction:column; gap:2px; min-width:0; }
  .qo-pif b{ font-size:12.5px; color:var(--text); font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .qo-pif i{ font-style:normal; font-size:11.5px; color:var(--text-3); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .qo-ava{
    flex:none; width:30px; height:30px; border-radius:50%; overflow:hidden; background:#C9CFD8;
    color:#fff; font-size:13px; font-weight:600; display:flex; align-items:center; justify-content:center;
    box-shadow:inset 0 0 0 1px rgba(0,0,0,.06);
  }
  .qo-ava img{ width:100%; height:100%; object-fit:cover; display:block; }
  .qo-ava.empty{ background:#E3E7ED !important; color:#A6AEBB; box-shadow:inset 0 0 0 1px #D3D9E1; }
  .qo-per.empty .qo-pif b{ font-weight:400; }
  .qo-mut{ color:var(--text-3); font-weight:400; }
  /* 「待绑单」那一格可点：点开派单弹窗，把单直接挂到骑手名下（不用他再扫码） */
  .qo-per.is-assign{ cursor:pointer; border-radius:8px; margin:-3px -6px; padding:3px 6px; transition:background .12s; }
  .qo-per.is-assign:hover{ background:rgb(var(--primary-rgb) / .07); }
  .qo-per.is-assign:hover .qo-pif b{ color:var(--primary); }
  .qo-per.is-assign:hover .qo-ava.empty{ background:rgb(var(--primary-rgb) / .16) !important; color:var(--primary); }
  .qo-per.is-assign .qo-pif i{ color:var(--primary); opacity:.9; }
  /* 预约单还没到备货时间：配送人这格写「预约 今天 16:00 · 到点前再派」，
     不写「待绑单 · 点击指派」—— 那是在催一件还没到点的事（2026-11-10 用户要求）。
     仍然可点（提前定骑手没问题），只是颜色从「催办蓝」换成预约的琥珀色。 */
  .qo-per.is-bookwait .qo-pif b{ color:#B45309; }
  .qo-per.is-bookwait .qo-pif i{ color:#B45309; opacity:.9; }
  .qo-per.is-assign.is-bookwait:hover{ background:rgba(180,83,9,.07); }
  .qo-per.is-assign.is-bookwait:hover .qo-pif b{ color:#B45309; }
  body.theme-dark .qo-per.is-bookwait .qo-pif b,
  body.theme-dark .qo-per.is-bookwait .qo-pif i{ color:#FDBA74; }
  /* 已取消的单：配送人那格也摘掉点击（qoApplyCanceledActs 去掉 data-assign 后补这个外观）。
     不给 hover 高亮、不给手型 —— 看着就不像能点，和操作列里那些置灰项是同一套语气。 */
  .qo-per.is-offcell{ cursor:default; opacity:.62; }
  .qo-per.is-offcell .qo-pif i{ color:var(--text-3); opacity:1; }
  .qo-per.is-offcell:hover{ background:none; }
  /* 分配配送员弹窗 */
  .dlg.dlg-assign{ --dlg-w:460px; --dlg-h:auto; max-height:min(520px,100%); }
  .dlg-assign .asg-sub{ margin-left:8px; font-size:12.5px; font-weight:400; color:var(--text-3); }
  .asg-loading{ padding:28px 0; text-align:center; font-size:13px; color:var(--text-3); }
  .asg-row{ display:flex; align-items:center; gap:10px; padding:10px 8px; border-radius:9px; cursor:pointer; }
  .asg-row:hover{ background:rgb(var(--primary-rgb) / .07); }
  .asg-row.is-busy{ opacity:.5; pointer-events:none; }
  .asg-main{ display:flex; flex-direction:column; gap:2px; min-width:0; flex:1; }
  .asg-main b{ font-size:13px; color:var(--text); font-weight:600; }
  .asg-main i{ font-style:normal; font-size:11.5px; color:var(--text-3); }
  .asg-tag{ flex:none; font-size:11.5px; padding:2px 8px; border-radius:20px; white-space:nowrap; }
  .asg-tag.on{ background:#E7F7F1; color:#05603A; }
  .asg-tag.busy{ background:#EEF2FF; color:#3730A3; }
  .asg-tag.off{ background:#F2F3F6; color:var(--text-3); }
  .asg-tag.nowx{ background:#FEF3C7; color:#B45309; }
  /* 当前配送员那一行：换了人以后还能一眼看出原来是派给谁 */
  .asg-row.is-current{ background:rgb(var(--primary-rgb) / .09); box-shadow:inset 0 0 0 1px rgb(var(--primary-rgb) / .22); }
  .asg-row.is-current:hover{ background:rgb(var(--primary-rgb) / .13); }
  .asg-row.is-current .asg-main b{ color:var(--primary); }
  body.theme-dark .asg-row.is-current{ background:rgb(var(--primary-rgb) / .18); }
  /* 取消配送员是「点两次才生效」，armed 状态用告警色，和退款按钮一个调子 */
  /* 底部按钮一律不换行：文案一长（确定取消？）会把按钮撑成两行，连「关闭」也被顶歪 */
  .dlg-assign .dlg-foot .btn{ white-space:nowrap; }
  .dlg-assign .btn.is-armed{ color:#C0392B; border-color:rgba(192,57,43,.45); background:rgba(192,57,43,.10); box-shadow:0 0 0 3px rgba(192,57,43,.14); }
  body.theme-dark .dlg-assign .btn.is-armed{ color:#FF8A80; border-color:rgba(255,138,128,.45); background:rgba(255,138,128,.10); }
  .asg-empty{ padding:26px 6px; text-align:center; }
  .asg-empty b{ display:block; font-size:13.5px; color:var(--text); margin-bottom:8px; }
  .asg-empty span{ font-size:12.5px; color:var(--text-3); line-height:1.75; }
  .asg-note{ margin-right:auto; font-size:11.5px; color:var(--text-3); line-height:1.6; max-width:250px; }
  body.theme-dark .asg-tag.on{ background:rgba(16,185,129,.16); color:#6EE7B7; }
  body.theme-dark .asg-tag.busy{ background:rgba(99,102,241,.18); color:#C7D2FE; }
  body.theme-dark .asg-tag.off{ background:rgba(255,255,255,.07); color:#9AA0AE; }
  /* 会员等级 / 订单状态列 */
  .qo-lvl{ text-align:center; font-size:12.5px; color:var(--text); }
  .qo-stc{ text-align:center; font-size:12.5px; }
  /* 操作列：绿色链接组 */
  .qo-acts{ display:flex; flex-wrap:wrap; align-items:center; gap:2px 3px; font-size:12.5px; }
  .qo-acts .qo-act{ color:#0E9F6E; }
  .qo-acts .qo-act.danger{ color:#E5484D; }
  .qo-acts .qo-act.danger:hover{ color:#C0242A; }
  /* 跑腿中：按钮换成「已发」的橙色，跟其他绿色动作分开，避免再点一次重复发单 */
  .qo-acts .qo-act.is-on{ color:#C2670C; }
  .qo-acts .qo-act.is-on:hover{ color:#9A4F06; }
  /* 当前身份不能取消的单（客服 + 已绑配送员）：置灰但仍显示，
     鼠标悬停给出原因与「该找谁」。和「没权限直接隐藏」是两件事 —— 藏起来只会让人以为坏了 */
  .qo-acts .qo-act.is-off{ color:#B6BEC9; cursor:not-allowed; text-decoration:none; }
  .qo-acts .qo-act.is-off:hover{ color:#B6BEC9; text-decoration:none; }
  body.theme-dark .qo-acts .qo-act.is-off{ color:#5A606E; }
  .qo-acts i{ color:#9CA8B5; font-style:normal; }
  /* 备注行 */
  .qo-remarks{ background:#F7F8FA; min-height:50px; padding:8px 14px 8px 10px; display:flex; align-items:center; gap:26px; flex-wrap:wrap; font-size:12px; }
  .qo-remarks > div{ display:flex; gap:5px; min-width:0; }
  .qo-remarks .qo-k{ color:#9AA3B2; }
  .qo-remarks span{ color:var(--text-2,#555); }
  /* 「支付成功」标记：收到支付回调（小程序 / 微信支付）后贴在订单金额列最下方 */
  .qo-payok{
    display:inline-flex; align-items:center; gap:4px; height:20px; padding:0 8px 0 5px; margin-top:1px;
    border-radius:10px; background:#E9F8F0; border:1px solid rgba(7,193,96,.26);
    color:#0A8A4C; font-size:11px; font-weight:600; line-height:1; letter-spacing:.2px;
    white-space:nowrap; user-select:none;
    box-shadow:0 1px 2px rgba(7,193,96,.10);
  }
  .qo-payok svg{ flex:none; width:13px; height:13px; display:block; }
  .qo-card.is-cancel .qo-payok{ opacity:.55; filter:grayscale(.35); }
  /* 说明：订单卡片底色固定为白（暗色主题下同样保持白卡），所以标记不做暗色反色，避免白卡上出现浅绿字 */

  /* ---------- 订单查询页：整体宽度 1500px ---------- */
  .q-card{ max-width:1500px; }

  /* ---------- 订单卡片顶部条：节点流程（打印 → 绑单 → 送达）+ 蓝色总倒计时框 ---------- */
  .qo-flow{ margin-left:auto; display:flex; align-items:center; gap:10px; flex:none; }
  .qo-node{ display:flex; flex-direction:column; align-items:center; line-height:1.3; }
  .qo-node b{ font-size:12.5px; font-weight:600; color:var(--text-2,#555); white-space:nowrap; }
  .qo-ntime{ font-size:11.5px; color:#A6AEBB; font-variant-numeric:tabular-nums; white-space:nowrap; }
  .qo-ntime.done-t{ color:#0E9F6E; font-weight:600; }
  .qo-ntime.done-t.late{ color:#DC2626; }
  .qo-ntime.qo-count{ color:#2F6FED; font-weight:700; }
  .qo-ntime.overdue{ color:#DC2626; font-weight:700; }
  .qo-ntime.mut{ color:#A6AEBB; }
  .qo-node.cur b{ color:#2F6FED; }
  .qo-node.wait b{ color:#A6AEBB; }
  .qo-node.done b{ color:#0E9F6E; }
  .qo-node.done.late b{ color:#DC2626; }
  .qo-node.over b{ color:#DC2626; }
  .qo-dash{ color:#C4CBD4; font-style:normal; flex:none; font-size:12px; }
  .qo-cdbox{
    margin-left:8px; background:#2F6FED; color:#fff; font-weight:700;
    font-variant-numeric:tabular-nums; font-size:15px; padding:6px 12px; border-radius:8px;
    min-width:120px; text-align:center; flex:none;
  }
  /* 总计时进行中：蓝色（未超时）/ 红色（已超设定配送时限）
     动效 = 框内高光条左右扫过：overflow 裁剪 + 伪元素 transform 位移（GPU 合成，不逐帧重绘，
     不做心跳/呼吸缩放，光效不越出边框） */
  .qo-cdbox.run{ position:relative; z-index:0; overflow:hidden; }
  .qo-cdbox.run::after{
    content:''; position:absolute; top:-45%; bottom:-45%; left:0; width:34%;
    pointer-events:none; z-index:1; border-radius:2px;
    background:linear-gradient(100deg,
      rgba(255,255,255,0) 0%, rgba(255,255,255,.28) 38%,
      rgba(255,255,255,.60) 52%, rgba(255,255,255,.24) 66%, rgba(255,255,255,0) 100%);
    transform:translateX(-120%) skewX(-16deg);
    animation:qoSweep 2.6s ease-in-out infinite;
    will-change:transform;
  }
  .qo-cdbox.run.overdue{ background:#DC2626; }
  .qo-cdbox.run.overdue::after{ animation-duration:1.5s; }
  /* 总计时超过设定配送时限：红色=超时配送订单 */
  .qo-cdbox.overdue{ background:#DC2626; color:#fff; }
  /* 总计时定格（送达完成）：未超配送时限绿色，超时红色=超时配送订单；计时结束不再有动效 */
  .qo-cdbox.fin{ background:#0E9F6E; color:#fff; animation:none; overflow:visible; }
  .qo-cdbox.fin::after{ display:none; }
  .qo-cdbox.fin.overdue{ background:#DC2626; color:#fff; animation:none; }
  @keyframes qoSweep{
    0%{ transform:translateX(-120%) skewX(-16deg); opacity:0; }
    14%{ opacity:1; }
    58%{ transform:translateX(320%) skewX(-16deg); opacity:1; }
    72%,100%{ transform:translateX(320%) skewX(-16deg); opacity:0; }
  }
  @media (prefers-reduced-motion: reduce){
    .qo-cdbox.run::after, .qo-cdbox.run.overdue::after{ animation:none; opacity:0; }
  }
  .qo-finetag{ font-size:12px; color:#0E9F6E; font-weight:700; background:#E6F9F0; padding:6px 12px; border-radius:8px; margin-left:8px; flex:none; }
  .qo-finhalt{ font-size:12px; color:#9AA3B2; font-weight:600; background:#EEF0F3; padding:6px 12px; border-radius:8px; margin-left:8px; flex:none; }

  /* ---------- 取消单履约复盘（20261030c）：
     ① 顶部条节点改「时间轴」口径（时刻 + 累计耗时 + 卡点停多久）② 卡片内一条复盘条
     ③ 点开是竖向履约时间线圈。整套口径与计时器一致：都以发单时刻为 0。 */
  /* 取消卡片：整体灰化只作用于信息区，复盘条与时间轴保持彩色——否则"卡点红"会被滤成灰 */
  .qo-card.is-cancel{ filter:none; opacity:1; }
  .qo-card.is-cancel .qo-lines,
  .qo-card.is-cancel .qo-main,
  .qo-card.is-cancel .qo-remarks{ filter:grayscale(1); opacity:.9; }
  /* 节点时间两行：时刻 / 累计耗时 */
  .qo-ntime{ display:inline-flex; flex-direction:column; align-items:center; line-height:1.22; }
  .qo-ntime em{ font-style:normal; font-size:10.5px; color:#9AA3B2; font-weight:600; }
  .qo-ntime.overdue em{ color:#DC2626; }
  .qo-node.over b{ color:#DC2626; }
  /* 取消单顶部条：卡点环节做成红色断点胶囊，一眼看出"这单死在哪个环节" */
  .qo-flow.is-void{ gap:8px; }
  .qo-flow.is-void .qo-node{ padding:3px 8px; border-radius:8px; margin:-3px 0; }
  .qo-flow.is-void .qo-node.over{ background:#FEECEC; border:1px solid #F5C2BC; }
  .qo-flow.is-void .qo-node.over b{ color:#B42318; }
  /* 卡点但未超时限（顾客提前取消）：橙色，避免被误读成"履约超时" */
  .qo-flow.is-void .qo-node.stuck{ background:#FFF6E8; border:1px solid #F3DCB4; }
  .qo-flow.is-void .qo-node.stuck b,
  .qo-flow.is-void .qo-node.stuck .qo-ntime,
  .qo-flow.is-void .qo-node.stuck .qo-ntime em{ color:#B8791A; }
  .qo-node.stuck b{ color:#B8791A; }
  .qo-node.stuck .qo-ntime{ color:#B8791A; }
  .qo-node.stuck .qo-ntime em{ color:#C9A063; }
  .qo-flow.is-void .qo-node.done{ background:#EEF9F3; border:1px solid #CBEBD9; }
  .qo-flow.is-void .qo-node.done.late{ background:#FEECEC; border-color:#F5C2BC; }
  .qo-flow.is-void .qo-node.halt{ opacity:.55; }
  /* 取消：末端红色虚线框（替代原「流程终止」灰块） */
  .qo-cdbox.void{
    background:#fff; color:#DC2626; border:1.5px dashed #F0A9A4; box-shadow:none;
    min-width:auto; font-size:13px; padding:5px 12px; overflow:visible; animation:none;
  }
  .qo-cdbox.void::after{ display:none; }
  /* 暂停计时：关闭所有进行中计时，计时框显示【暂停计时】 */
  .qo-cdbox.paused{
    background:#64748B; color:#fff; animation:none; overflow:visible;
    font-size:13.5px; letter-spacing:2px; min-width:104px;
  }
  .qo-cdbox.paused::after{ display:none; }
  .qo-ntime.paused{ color:#64748B; font-weight:700; }
  .qo-ntime.paused em{ display:none; }
  /* 演示/展示订单（no_timer）：冻结计时，显示「不计时」，不参与实时倒计时 */
  .qo-cdbox.notimer{ background:#EEF2F6; color:#64748B; animation:none; overflow:visible; font-size:13.5px; letter-spacing:1px; min-width:104px; border:1px dashed #C3CDD9; }
  .qo-cdbox.notimer::after{ display:none; }
  /* 预约单还没进提醒窗口：总计时框改说「待预约 今天 20:30」，不再是走空的秒表。
     琥珀色与卡片左侧那条预约色条（.qo-card.is-book）同一套，一眼能对上。
     字号比秒表小一档：这里显示的是时刻而不是 00:00:00.0，给足宽度会显得空。 */
  .qo-cdbox.book{
    background:#FFF7ED; color:#B45309; border:1px dashed #FDBA74;
    animation:none; overflow:visible; font-size:13px; letter-spacing:0; min-width:104px;
  }
  .qo-cdbox.book::after{ display:none; }
  body.theme-dark .qo-cdbox.book{ background:#3A2A14; color:#FDBA74; border-color:#7C4A15; }
  .qo-ntime.notimer{ color:#64748B; font-weight:700; }
  .qo-ntime.notimer em{ display:none; }
  /* 复盘条 */
  .qo-recap{
    display:flex; align-items:center; gap:10px; flex-wrap:wrap;
    padding:8px 14px; border-bottom:1px solid #EEF0F4; background:#F7F9FC;
    font-size:12px; color:#4A5568; transition:background-color .15s;
  }
  .qo-recap:hover{ background:#EEF3FB; }
  .qo-recap.warn{ background:#FFF7F5; border-bottom-color:#FBE2DC; }
  .qo-recap.warn:hover{ background:#FFEFEB; }
  .qo-recap-hd{ flex:none; font-size:11px; font-weight:700; letter-spacing:.4px; color:#fff; background:#8A93A3; border-radius:5px; padding:2px 7px; }
  .qo-recap.warn .qo-recap-hd{ background:#E5484D; }
  .qo-recap-cut{ font-weight:600; color:#374151; }
  .qo-recap.warn .qo-recap-cut{ color:#B42318; }
  .qo-recap-segs{ display:inline-flex; align-items:center; gap:6px; }
  .qo-recap-segs i{
    font-style:normal; display:inline-flex; align-items:center; gap:5px;
    padding:2px 8px; border-radius:6px; background:#fff; border:1px solid #E3E7ED; color:#5A6473;
  }
  .qo-recap-segs i b{ font-weight:700; font-variant-numeric:tabular-nums; }
  .qo-recap-segs i.ok b{ color:#0E9F6E; }
  .qo-recap-segs i.late b{ color:#DC2626; }
  .qo-recap-segs i.bad{ background:#FEECEC; border-color:#F8C9C9; color:#B42318; }
  .qo-recap-segs i.bad b{ color:#DC2626; }
  /* 未超时限的卡点：橙色，与"履约超时"的红区分开 */
  .qo-recap:not(.warn) .qo-recap-segs i.bad{ background:#FFF6E8; border-color:#F3DCB4; color:#8A5A00; }
  .qo-recap:not(.warn) .qo-recap-segs i.bad b{ color:#B8791A; }
  .qo-recap-segs i.na b{ color:#A6AEBB; }
  .qo-recap-rs{ color:#6B7280; background:#EEF0F3; border-radius:6px; padding:2px 8px; }
  .qo-recap-tot{ margin-left:auto; color:#5A6473; }
  .qo-recap-tot b{ color:#111827; font-variant-numeric:tabular-nums; font-size:13px; }
  .qo-recap-more{ flex:none; color:var(--primary,#2F6FED); font-weight:600; }
  .qo-recap:hover .qo-recap-more{ text-decoration:underline; }

  /* 履约时间线弹窗 */
  .ftl-modal{ width:600px; max-width:94vw; }
  .ftl-top{ display:flex; align-items:center; gap:10px; padding:8px 10px; background:#F5F7FA; border-radius:8px; margin-bottom:12px; font-size:12.5px; flex-wrap:wrap; }
  .ftl-no{ font-weight:700; color:#2F6FED; }
  .ftl-mem{ color:#5A6473; }
  .ftl-tot{ margin-left:auto; font-weight:700; color:#374151; font-variant-numeric:tabular-nums; }
  .ftl-tot.warn{ color:#DC2626; }
  .ftl-row{ position:relative; display:flex; gap:12px; padding-bottom:16px; }
  .ftl-row::before{ content:''; position:absolute; left:7px; top:16px; bottom:0; width:2px; background:#E5E9EF; }
  .ftl-row.last::before{ display:none; }
  .ftl-dot{ position:relative; flex:none; width:16px; height:16px; border-radius:50%; background:#fff; border:2px solid #C9CFD8; margin-top:2px; z-index:1; box-sizing:border-box; }
  .ftl-row.start .ftl-dot{ border-color:#2F6FED; background:#2F6FED; box-shadow:inset 0 0 0 3px #fff; }
  .ftl-row.ok .ftl-dot{ border-color:#0E9F6E; background:#0E9F6E; box-shadow:inset 0 0 0 3px #fff; }
  .ftl-row.late .ftl-dot{ border-color:#DC2626; background:#DC2626; box-shadow:inset 0 0 0 3px #fff; }
  .ftl-row.miss .ftl-dot{ border-color:#DC2626; background:#FEECEC; }
  .ftl-row.miss.soft .ftl-dot{ border-color:#E0A62B; background:#FFF6E8; }
  .ftl-modal .ftl-row.miss.soft .ftl-dur{ color:#B8791A; }
  .ftl-row.end .ftl-dot{ border-color:#6B7280; background:#6B7280; box-shadow:inset 0 0 0 3px #fff; }
  .ftl-row.na{ opacity:.55; }
  .ftl-body{ min-width:0; flex:1; }
  .ftl-th{ display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; }
  .ftl-th b{ font-size:13px; color:#1F2937; }
  .ftl-clock{ font-size:12.5px; font-weight:700; color:#374151; font-variant-numeric:tabular-nums; }
  .ftl-dur{ font-size:11.5px; color:#0E9F6E; font-weight:700; }
  .ftl-row.late .ftl-dur, .ftl-row.miss .ftl-dur{ color:#DC2626; }
  .ftl-sub{ font-size:11.5px; color:#6B7280; line-height:1.55; margin-top:2px; }
  .ftl-verdict{ margin-top:2px; padding:10px 12px; border-radius:8px; background:#F1F6FF; color:#2C4A7C; font-size:12px; line-height:1.65; }
  .ftl-verdict.warn{ background:#FFF4F2; color:#8F2A20; }
  .ftl-verdict b{ font-weight:700; }
  .ftl-ops{ display:flex; justify-content:flex-end; margin-top:12px; }
  /* 取消弹窗：履约进度 + 原因选择 */
  .ocn-prog{ font-weight:600; color:#2F6FED; }
  .ocn-prog.warn{ color:#DC2626; }
  .ocn-fld{ margin-top:10px; }
  .ocn-fld label{ display:block; font-size:12.5px; color:#4A5568; margin-bottom:5px; }
  .ocn-hint{ display:block; margin-top:3px; color:#9AA3B2; font-size:11.5px; line-height:1.5; }
  .ocn-sel{
    width:100%; height:36px; border:1px solid var(--border,#D8DEE7); border-radius:8px;
    padding:0 10px; font-size:13px; color:#1F2937; background:#fff; font-family:inherit; cursor:pointer;
  }
  /* 弹窗暗色：卡片保持白底（既有实现），但弹窗本身切深色，需反色 */
  body.theme-dark .ftl-top{ background:#262A31; }
  body.theme-dark .ftl-th b, body.theme-dark .ftl-clock{ color:#E8EBF0; }
  body.theme-dark .ftl-sub{ color:#9AA3B2; }
  body.theme-dark .ftl-tot{ color:#E8EBF0; }
  body.theme-dark .ftl-dot{ border-color:#4A505C; background:#1E2027; }
  body.theme-dark .ftl-row::before{ background:#333844; }
  body.theme-dark .ftl-verdict{ background:#20283A; color:#B9CBE8; }
  body.theme-dark .ftl-verdict.warn{ background:#31201F; color:#F3BDB6; }
  body.theme-dark .ocn-sel{ background:#262A31; color:#E8EBF0; border-color:#3A3F49; }

  /* ---------- 取消原因「必选」态（20261030d） ----------
     未选择原因时：下拉描红、确认按钮置灰不可点、行下给出原因提示 */
  .ocn-req{
    display:inline-block; margin-left:6px; padding:1px 6px; border-radius:4px;
    font-style:normal; font-size:11px; font-weight:700; letter-spacing:.2px;
    color:#B42318; background:#FEECEC; border:1px solid #F6C9C4;
  }
  .ocn-sel.is-empty{ border-color:#E0A62B; background:#FFFBF2; }
  .ocn-sel.has-val{ border-color:#B7DCF5; }
  .ocn-sel:focus{ outline:none; border-color:var(--primary,#2563EB); box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .14); }
  /* [hidden] 会被 display:flex 盖掉（老问题）：没有错误时这一格必须整块消失，
     否则按钮上方永远挂着一个空的红色「!」 */
  .ocn-err[hidden]{ display:none; }
  .ocn-err{
    margin-top:6px; font-size:12px; font-weight:600; color:#B42318;
    display:flex; align-items:center; gap:5px;
  }
  .ocn-err::before{
    content:'!'; flex:none; width:14px; height:14px; border-radius:50%;
    background:#DC2626; color:#fff; font-size:10px; font-weight:700;
    display:flex; align-items:center; justify-content:center;
  }
  .ocn-ops .btn.sm.danger:disabled,
  .ocn-ops .btn.sm.danger[disabled]{
    opacity:.45; cursor:not-allowed; box-shadow:none; filter:grayscale(.4);
  }
  /* ---------- 修改支付弹窗（2026-11-10） ----------
     金额是这张弹窗的主角：给足宽度、等宽数字；下面紧跟「比原单多/少多少」，
     改金额的人第一眼要看的就是这个差值。 */
  .ocn-modal .rpy-amt{
    width:100%; height:38px; font-size:16px; font-weight:700; letter-spacing:.2px;
    font-variant-numeric:tabular-nums; text-align:right; padding-right:12px;
  }
  .rpy-diff{ margin-top:6px; font-size:12px; font-weight:600; color:#6B7280; }
  .rpy-diff.is-up{ color:#B45309; }        /* 多收：需要人再看一眼 */
  .rpy-diff.is-down{ color:#0E7C86; }      /* 少收：同上，只是方向不同 */
  .rpy-diff.is-bad{ color:#B42318; }
  body.theme-dark .rpy-diff{ color:#9AA3B2; }
  body.theme-dark .rpy-diff.is-up{ color:#F5B45A; }
  body.theme-dark .rpy-diff.is-down{ color:#5FD0C0; }
  body.theme-dark .ocn-modal .rpy-amt{ background:#262A31; color:#E8EBF0; border-color:#3A3F49; }

  /* ---------- 组合支付的行（2026-11-10） ----------
     一行 = 一种方式 + 它收了多少。金额靠右、等宽数字：几行叠在一起时，
     眼睛能竖着比出「谁收了多少」，不用逐个读。 */
  .rpy-pays{ display:flex; flex-direction:column; gap:6px; }
  .rpy-prow{ display:flex; align-items:center; gap:6px; }
  .rpy-prow .rpy-pname{ flex:1 1 auto; min-width:0; }
  .rpy-prow .rpy-pamt{
    flex:0 0 110px; width:110px; height:36px; padding:0 9px;
    text-align:right; font-weight:600; font-variant-numeric:tabular-nums;
  }
  .rpy-pdel{
    flex:0 0 26px; width:26px; height:26px; border-radius:6px; cursor:pointer;
    border:1px solid var(--border,#D8DEE7); background:#fff; color:#9AA3B2;
    font-size:12px; line-height:1; padding:0;
  }
  .rpy-pdel:hover{ color:#B42318; border-color:#F6C9C4; background:#FEF6F5; }
  .rpy-pdel.is-ph{ border:0; background:none; cursor:default; pointer-events:none; }
  .rpy-add{
    margin-top:7px; padding:5px 10px; border-radius:7px; cursor:pointer;
    border:1px dashed #C8D2DF; background:#F7F9FC; color:#3D5A80;
    font-size:12px; font-weight:600; font-family:inherit;
  }
  .rpy-add:hover{ background:#EEF3FA; border-color:#9DB6D4; }
  .rpy-add[hidden]{ display:none; }        /* [hidden] 在本站被 display 盖掉过一次，加保险 */
  .rpy-sum{
    margin-top:7px; font-size:12px; font-weight:600; color:#6B7280;
    font-variant-numeric:tabular-nums;
  }
  .rpy-sum[hidden]{ display:none; }
  .rpy-sum.is-ok{ color:#0E7C86; }          /* 分摊正好等于支付金额 */
  .rpy-sum.is-gap, .rpy-sum.is-over{ color:#B45309; }   /* 不等：差额线下处理 */
  body.theme-dark .rpy-pdel{ background:#262A31; border-color:#3A3F49; color:#8C96A6; }
  body.theme-dark .rpy-pdel:hover{ background:#3A2320; border-color:#5C322C; color:#F3BDB6; }
  body.theme-dark .rpy-add{ background:#262A31; border-color:#3A3F49; color:#A8C4E8; }
  body.theme-dark .rpy-add:hover{ background:#2E3440; }
  body.theme-dark .rpy-sum{ color:#9AA3B2; }
  body.theme-dark .rpy-sum.is-ok{ color:#5FD0C0; }
  body.theme-dark .rpy-sum.is-gap, body.theme-dark .rpy-sum.is-over{ color:#F5B45A; }
  body.theme-dark .ocn-modal .rpy-prow .rpy-pamt{ background:#262A31; color:#E8EBF0; border-color:#3A3F49; }

  /* 改支付换单后，订单备注行里的「已换单为 D…」—— 不抢戏，但要一眼能找到 */
  .qo-rep{ color:#B45309; }
  .qo-rep .qo-k{ color:#B45309; opacity:.75; }
  /* 标签与单号之间要留一道缝：「转单 · 由 12店 转入D2026…」粘在一起没法读 */
  .qo-rep span:last-child{ font-weight:700; letter-spacing:.2px; margin-left:6px; }
  body.theme-dark .qo-rep, body.theme-dark .qo-rep .qo-k{ color:#F5B45A; }

  /* ---------- 转单（2026-11-10） ----------
     新单的门店标识后面挂一个「12店转入」，与「已取消」一样属于**一眼要看见**的信息：
     新门店要先知道这单是别人转来的（货要重备、顾客可能已经在等），
     所以不藏在备注栏，直接贴在店名后面。用描边 + 紫色，不和实心的店名块抢。 */
  .qo-shop-trf{
    flex:none; display:inline-flex; align-items:center; height:28px; box-sizing:border-box;
    margin-left:4px; padding:0 8px; border-radius:9px;
    font-size:11px; font-weight:600; letter-spacing:.2px; white-space:nowrap;
    color:#5B4B8A; background:#F3F0FC; border:1px solid #D9D0F5;
  }
  /* 转单的换单关系（与「改支付」同为换单，但性质不同：一个换钱、一个换履约方） */
  .qo-rep.qo-trf{ color:#5B4B8A; }
  .qo-rep.qo-trf .qo-k{ color:#5B4B8A; opacity:.78; }
  body.theme-dark .qo-shop-trf{ color:#C9BDF5; background:#2A2440; border-color:#463C6B; }
  body.theme-dark .qo-rep.qo-trf, body.theme-dark .qo-rep.qo-trf .qo-k{ color:#C9BDF5; }

  /* ---------- 订单日志 → 人工操作（order_logs）并入时间轴 ----------
     与流程节点共用一条 rail：系统算出来的节点由时间/状态着色，人工操作固定用紫色，
     扫一眼就知道「哪几步是人干的」。不再单开一段列表（2026-11-10 用户要求）。 */
  .olog-node.op .olog-dot{ background:#7C3AED; }
  .olog-node.op .olog-card{ border-color:rgba(124,58,237,.28); background:rgba(124,58,237,.045); }
  .olog-badge.op{ background:rgba(124,58,237,.12); color:#6D28D9; }
  /* 自由文本行（detail 里没有「键：值」的长句）：铺满整行，不占 k 列的空位 */
  .olog-nd .r.full{ display:block; }
  .olog-nd .r.full .v{ color:var(--text-2); }
  body.theme-dark .olog-node.op .olog-card{ background:rgba(124,58,237,.14); border-color:rgba(167,139,250,.34); }
  body.theme-dark .olog-badge.op{ background:rgba(167,139,250,.18); color:#C4B5FD; }

  body.theme-dark .ocn-sel.is-empty{ background:#2A241C; border-color:#7A5A20; }
  body.theme-dark .ocn-req{ background:#3A2320; color:#F3BDB6; border-color:#5C322C; }
  body.theme-dark .ocn-err{ color:#F3BDB6; }


  /* ---------- 订单设置页：分组卡片式布局（20261029k） ---------- */
  .stg-wrap{ padding:2px 0 4px; }
  /* 顶部概览条 */
  .stg-hero{
    display:flex; align-items:center; justify-content:space-between; gap:14px; flex-wrap:wrap;
    border:1px solid rgb(var(--primary-rgb) / .20); border-radius:12px; padding:13px 16px; margin-bottom:14px;
    background:linear-gradient(115deg, rgb(var(--primary-rgb) / .10), rgb(var(--primary-rgb) / .03) 58%, rgb(var(--primary-rgb) / 0));
  }
  .stg-hero-l{ display:flex; align-items:center; gap:12px; min-width:0; }
  .stg-hero-ico{
    width:40px; height:40px; border-radius:11px; flex:none; display:flex; align-items:center; justify-content:center;
    color:#fff; font-size:17px; font-weight:700;
    background:linear-gradient(135deg, rgb(var(--primary-rgb) / .92), var(--primary-hover));
    box-shadow:0 4px 12px rgb(var(--primary-rgb) / .28);
  }
  .stg-hero-t{ font-size:15px; font-weight:700; letter-spacing:.2px; }
  .stg-hero-d{ font-size:12.5px; color:var(--text-3); margin-top:3px; line-height:1.5; }
  .stg-hero-r{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
  .stg-chip{
    display:inline-flex; align-items:center; gap:6px; height:30px; padding:0 12px; border-radius:15px;
    background:var(--panel); border:1px solid var(--border); font-size:12.5px; color:var(--text-3); white-space:nowrap;
  }
  .stg-chip b{ font-size:13.5px; font-weight:700; color:var(--text); font-variant-numeric:tabular-nums; }
  /* 分组卡片（视觉精致化：图标徽章 + 左侧语义色条），视觉令牌与系统设置页统一 */
  .stg-group{
    background:var(--bg-1,#fff);
    border:1px solid var(--border,#E5E7EB);
    border-left:3px solid var(--accent,var(--primary));
    border-radius:10px;
    margin-bottom:16px;
    overflow:hidden;
  }
  .stg-group:last-of-type{ margin-bottom:0; }
  /* 深色主题：分组卡片跟随主题（原先 --bg-1 未定义会恒为白色，导致深色下白底浅字看不清） */
  body.theme-dark .stg-group{ background:#22252E; border-color:#2E3140; border-left-color:var(--accent,var(--primary)); }
  body.theme-dark .stg-group-head{ border-color:#2E3140; }
  /* 深色下输入框比卡片再深一档，保证边界可辨 */
  body.theme-dark .stg-group .po-in{ background:#191B22; border-color:#3A3F4F; }
  body.theme-dark .stg-group .po-in:focus{ border-color:var(--primary); }
  .stg-group-head{
    display:flex; align-items:center; gap:12px;
    padding:15px 20px;
    border-bottom:1px solid var(--border,#E5E7EB);
  }
  .stg-group-ico{
    width:38px; height:38px; border-radius:10px; flex:none;
    display:flex; align-items:center; justify-content:center; font-size:18px; line-height:1;
  }
  .stg-group-meta{ min-width:0; flex:1; }
  .stg-group-t{ font-size:15px; font-weight:700; color:var(--text,#1f2a37); }
  .stg-group-d{ font-size:12.5px; color:var(--text-3,#64748B); margin-top:3px; line-height:1.5; }
  .stg-group-d strong{ color:var(--text-2,#475569); }
  .stg-group-body{ padding:18px 20px 20px; }
  /* 语义色（图标底色 + 左侧色条） */
  .accent-blue{ --accent:#3B82F6; }
  .accent-blue .stg-group-ico{ background:#EFF6FF; }
  .accent-purple{ --accent:#7C3AED; }
  .accent-purple .stg-group-ico{ background:#F5F3FF; }
  .accent-amber{ --accent:#F59E0B; }
  .accent-amber .stg-group-ico{ background:#FFFBEB; }
  .accent-cyan{ --accent:#0EA5E9; }
  .accent-cyan .stg-group-ico{ background:#F0F9FF; }
  .accent-pink{ --accent:#EC4899; }
  .accent-pink .stg-group-ico{ background:#FDF2F8; }
  .accent-teal{ --accent:#14B8A6; }
  .accent-teal .stg-group-ico{ background:#F0FDFA; }
  /* ---- 默认销售单位：Tab / 添加行 / 已配置芯片 ---- */
  .stg-utabs{
    display:flex;gap:6px;margin-bottom:14px;padding:3px;border-radius:9px;
    background:rgba(120,130,150,.10);width:max-content;
  }
  .stg-utab{
    border:none;background:transparent;font-family:inherit;font-size:13px;color:var(--text-3);
    padding:6px 16px;border-radius:7px;cursor:pointer;transition:.15s;
  }
  .stg-utab:hover{color:var(--text-2)}
  .stg-utab.on{background:#fff;color:var(--primary);font-weight:600;box-shadow:0 1px 4px rgba(20,26,40,.10)}
  body.theme-dark .stg-utab.on{background:#2E313C}
  .stg-upane{display:none}
  .stg-upane.on{display:block}
  .stg-uadd{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px}
  .stg-uadd .po-in{max-width:230px}
  .stg-uadd .po-in.grow{flex:1;min-width:220px;max-width:none}
  .stg-uarrow{font-size:12.5px;color:var(--text-3);white-space:nowrap}
  .stg-ulist{display:flex;flex-wrap:wrap;gap:8px;min-height:34px}
  .stg-uchip{
    display:inline-flex;align-items:center;gap:6px;padding:5px 8px 5px 10px;
    border:1px solid var(--border);border-radius:16px;background:rgba(120,130,150,.05);
    font-size:12.5px;color:var(--text-2);
  }
  .stg-uchip .c{font-weight:600;color:var(--text)}
  .stg-uchip .cd{font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums}
  .stg-uchip .a{font-size:11px;color:var(--text-3)}
  .stg-uchip b{font-weight:700;color:var(--primary)}
  .stg-uchip .x{cursor:pointer;color:var(--text-3);font-size:11px;padding:0 2px;border-radius:50%}
  .stg-uchip .x:hover{color:#E5484D}
  .stg-uempty{font-size:12.5px;color:var(--text-3);line-height:1.6}
  .stg-uhint{margin-top:14px;font-size:12px;color:var(--text-3);line-height:1.6}
  /* ---- 冷藏缺货规则说明（2026-11-08）：常驻在「冷藏商品」区块顶部 ----
     它有别于下面那些开关：那几条是本站自己的配置，这条讲的是门店端的临时动作，
     所以用一块带底色的说明卡区分开，而不是又一行小灰字 —— 否则没人会读。 */
  .stg-cold-rule{
    margin:0 0 18px;padding:12px 14px;border-radius:10px;line-height:1.7;
    background:rgba(62,123,182,.07);border:1px solid rgba(62,123,182,.22);
  }
  .stg-cold-rule-t{font-size:12.5px;font-weight:700;color:#2F6395;margin-bottom:6px}
  .stg-cold-rule-l{margin:0;padding-left:16px;font-size:12px;color:var(--text-2)}
  .stg-cold-rule-l li{margin:3px 0}
  .stg-cold-rule-l li b{color:var(--text);font-weight:600}
  body.theme-dark .stg-cold-rule{background:rgba(62,123,182,.14);border-color:rgba(62,123,182,.4)}
  body.theme-dark .stg-cold-rule-t{color:#8FB8E0}
  /* ---- 冷藏商品：总开关关掉时配置区变灰但仍可见（免得不小心以为丢了配置） ---- */
  .stg-cold-body{transition:opacity .18s}
  .stg-cold-body.is-off{opacity:.45;pointer-events:none;filter:grayscale(1)}
  .stg-cold-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:16px 0 18px}
  .stg-cold-row .k{font-size:12.5px;color:var(--text-2);font-weight:600;white-space:nowrap}
  .stg-cold-row .po-in{width:132px;height:36px;flex:none}
  .stg-cold-row .hint{font-size:12px;color:var(--text-3)}
  /* 行内特效：一排胶囊 + 下方预览条（预览复用清单行那套背景动画） */
  .stg-cold-row-fx{align-items:flex-start;margin-top:-2px}
  .stg-cold-row-fx .k{padding-top:9px}
  .stg-fx-field{flex:1;min-width:0;max-width:620px}
  .stg-fx-pick{display:flex;flex-wrap:wrap;gap:8px}
  .stg-fx-btn{
    height:34px;padding:0 15px;border:1px solid var(--border);border-radius:17px;
    background:#fff;font-size:12.5px;color:var(--text-2);cursor:pointer;
    font-family:inherit;transition:.15s;white-space:nowrap;
  }
  .stg-fx-btn:hover{border-color:rgb(var(--primary-rgb) / .45);color:var(--primary)}
  .stg-fx-btn.on{
    border-color:var(--primary);color:var(--primary);font-weight:600;
    background:rgb(var(--primary-rgb) / .08);box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .07);
  }
  body.theme-dark .stg-fx-btn{background:#1D2029}
  body.theme-dark .stg-fx-btn.on{background:rgb(var(--primary-rgb) / .16)}
  .stg-uchip.is-force{border-color:rgba(8,145,178,.45);background:rgba(8,145,178,.08)}
  .stg-uchip.is-force b{color:#0891B2}
  body.theme-dark .stg-uchip.is-force{background:rgba(8,145,178,.18)}
  /* 禁止冷藏：与「强制」用相反的暖灰红，一眼分得清是「锁开」还是「锁关」 */
  .stg-uchip.is-ban{border-color:rgba(180,83,9,.38);background:rgba(245,166,35,.10)}
  .stg-uchip.is-ban b{color:#B45309}
  body.theme-dark .stg-uchip.is-ban{background:rgba(245,166,35,.16)}
  body.theme-dark .stg-uchip.is-ban b{color:#FBBF24}
  /* 参与·默认关闭：虚线边框 + 灰蓝字，表示「在名单里但默认不开」，
     和实心的「冷藏」（默认开）一眼能分开，又不像强制/禁止那样带锁的含义 */
  .stg-uchip.is-off{border-style:dashed;border-color:rgba(120,130,150,.55);background:transparent}
  .stg-uchip.is-off b{color:var(--text-3);font-weight:600}
  body.theme-dark .stg-uchip.is-off{border-color:rgba(170,180,200,.45)}
  body.theme-dark .stg-uchip.is-off b{color:rgba(200,208,224,.85)}
  /* 被品类规则覆盖（如白酒设了禁止，单品的「强制冷藏」不生效）：整条压暗 + 「被品类覆盖」小标，
     否则用户会以为这条设置丢了。 */
  .stg-uchip.is-shadow{opacity:.72;border-style:dashed}
  .stg-uchip.is-shadow b{text-decoration:line-through;text-decoration-thickness:1px}
  .stg-uchip .ov{
    font-size:10.5px;line-height:15px;padding:0 5px;border-radius:5px;
    color:#B45309;background:rgba(245,166,35,.16);font-weight:700;white-space:nowrap;
  }
  body.theme-dark .stg-uchip .ov{color:#FBBF24;background:rgba(245,166,35,.2)}
  .stg-uhits{
    max-height:246px;margin:-4px 0 12px;overflow-y:auto;background:#fff;
    border:1px solid var(--border);border-radius:8px;
  }
  .stg-uhit{
    display:flex;align-items:center;gap:10px;padding:8px 12px;cursor:pointer;
    font-size:12.5px;border-bottom:1px solid #F5F6FA;
  }
  .stg-uhit:last-child{border-bottom:none}
  .stg-uhit:hover{background:rgb(var(--primary-rgb) / .06)}
  .stg-uhit .nm{flex:1;min-width:0;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .stg-uhit .cd{font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums}
  .stg-uhit .un{font-size:11.5px;color:var(--text-3);white-space:nowrap}
  .stg-uhit.none{color:var(--text-3);cursor:default}
  /* 兜底：.stg-uhit 若被写成 <button>（付款方式面板历史写法），
     必须抹掉 UA 的灰底 / 边框 / 自适应宽度 —— 否则会渲染成一列窄方块 */
  button.stg-uhit{
    width:100%;text-align:left;background:transparent;border:0;
    border-bottom:1px solid #F5F6FA;color:inherit;font-family:inherit;
  }
  body.theme-dark .stg-uhits{background:#262933}
  body.theme-dark .stg-uhit{border-color:rgba(255,255,255,.06)}
  /* 分组卡片 */
  .stg-card{ background:var(--panel); border:1px solid var(--border); border-radius:12px; margin-bottom:14px; overflow:hidden; }
  .stg-hd{ display:flex; align-items:flex-start; gap:10px; padding:13px 18px; border-bottom:1px solid var(--border); background:rgba(120,130,150,.045); }
  .stg-hd-bar{ width:3px; height:15px; margin-top:3px; border-radius:2px; flex:none; background:var(--primary); }
  .stg-hd-t{ font-size:14.5px; font-weight:700; line-height:1.35; }
  .stg-hd-d{ font-size:12.5px; color:var(--text-3); line-height:1.55; margin-top:2px; }
  .stg-body{ padding:15px 18px 16px; }
  /* 时限并排卡片 */
  .stg-tgrid{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; }
  .stg-tcell{
    border:1px solid var(--border); border-radius:10px; padding:12px 14px 13px;
    background:rgba(120,130,150,.035); transition:border-color .15s, background .15s, box-shadow .15s;
  }
  .stg-tcell:hover{ border-color:rgb(var(--primary-rgb) / .42); background:rgb(var(--primary-rgb) / .05); }
  .stg-tcell.is-focus{ border-color:var(--primary); background:rgb(var(--primary-rgb) / .06); box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .16); }
  .stg-tcell.is-bad input{ border-color:#DC2626; }
  .stg-ttop{ display:flex; align-items:center; gap:8px; margin-bottom:10px; }
  .stg-tno{
    width:22px; height:22px; border-radius:50%; flex:none; display:flex; align-items:center; justify-content:center;
    font-size:12px; font-weight:700; color:#fff; background:var(--primary);
  }
  .stg-tname{ font-size:13.5px; font-weight:700; }
  .stg-tstep{ margin-left:auto; font-size:11.5px; color:var(--text-3); background:rgba(120,130,150,.14); border-radius:10px; padding:2px 8px; white-space:nowrap; }
  .stg-tinput{ display:flex; align-items:center; gap:8px; }
  .stg-tinput input{
    width:132px; flex:none; text-align:center; height:38px; border:1px solid var(--border); border-radius:7px; padding:0 12px;
    font-size:17px; font-weight:700; color:var(--text); background:#fff; outline:none; transition:.15s; font-family:inherit;
    font-variant-numeric:tabular-nums;
  }
  .stg-tinput input:focus{ border-color:var(--primary); box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .16); }
  .stg-tinput em{ font-style:normal; font-size:12.5px; color:var(--text-2); flex:none; }
  .stg-thint{ font-size:12px; color:var(--text-3); line-height:1.6; margin-top:9px; }
  /* 时限三格下方的递增校验提示（只读反馈，不再提供一键预设按钮） */
  .stg-tfoot{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-top:12px; }
  .stg-tip{ font-size:12.5px; display:inline-flex; align-items:center; gap:6px; color:var(--text-3); }
  .stg-tip i{ width:6px; height:6px; border-radius:50%; background:currentColor; flex:none; }
  .stg-tip.good{ color:#0E9F6E; }
  .stg-tip.bad{ color:#DC2626; }
  /* 进销存推单：两张模式卡（点击即切换保存） */
  .stg-push-opt{ display:block; width:100%; text-align:left; padding:14px 16px; border:1px solid var(--border); border-radius:12px; background:var(--panel); cursor:pointer; transition:border-color .15s,background .15s; }
  .stg-push-opt:hover{ border-color:var(--input-border); }
  .stg-push-opt.on{ border-color:var(--primary); background:var(--primary-soft); }
  .stg-push-opt:disabled{ opacity:.6; cursor:default; }
  .stg-push-h{ display:flex; align-items:center; gap:8px; font-size:14px; font-weight:500; color:var(--text); margin-bottom:6px; }
  .stg-push-h em{ font-style:normal; font-size:10.5px; font-weight:400; color:var(--primary); background:var(--panel); border-radius:4px; padding:1px 6px; }
  .stg-push-d{ display:block; font-size:12.5px; line-height:1.65; color:var(--text-2); }
  .stg-push-n{ display:block; font-size:12px; line-height:1.6; color:var(--text-3); margin-top:6px; }
  body.theme-dark .stg-push-opt{ background:#22252E; border-color:#2E3140; }
  body.theme-dark .stg-push-opt.on{ background:rgb(var(--primary-rgb) / .16); border-color:var(--primary); }
  body.theme-dark .stg-push-h em{ background:rgba(255,255,255,.08); }
  /* 概要胶囊容器（时限当下值 / 取消原因项数），与系统设置页观感统一 */
  .stg-chips{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-top:12px; }

  /* 跨日退款面板：小标题 + 可点选的品类/账号胶囊 */
  .stg-sub-t{
    display:flex;align-items:baseline;gap:8px;margin:0 0 2px;
    font-size:12.5px;font-weight:600;color:var(--text-2);
  }
  .stg-sub-t span{font-weight:400;font-size:11.5px;color:var(--text-3)}
  .rfr-chip{
    display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 12px;border-radius:15px;
    border:1px solid var(--border);background:var(--panel);color:var(--text-2);
    font-size:12.5px;cursor:pointer;user-select:none;transition:.15s;
  }
  .rfr-chip:hover{border-color:rgb(var(--primary-rgb) / .45);color:var(--primary)}
  .rfr-chip.on{background:rgb(var(--primary-rgb) / .10);border-color:var(--primary);color:var(--primary);font-weight:600}
  .rfr-chip i{font-style:normal;font-size:11px;color:var(--text-3)}
  .rfr-chip.on i{color:var(--primary)}
  .rfr-goods{display:flex;flex-wrap:wrap;gap:8px}
  .rfr-g{
    display:inline-flex;align-items:center;gap:8px;max-width:260px;
    padding:6px 8px 6px 10px;border-radius:9px;border:1px solid var(--border);
    background:rgba(120,130,150,.05);font-size:12.5px;color:var(--text-2);
  }
  .rfr-g b{font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .rfr-g span{flex:none;color:var(--text-3);font-size:11.5px}
  .rfr-g button{
    flex:none;border:none;background:transparent;color:var(--text-3);cursor:pointer;font-size:12px;line-height:1;
  }
  .rfr-g button:hover{color:#C0392B}
  /* 两栏 */
  .stg-2col{ display:grid; grid-template-columns:minmax(0,1.3fr) minmax(0,1fr); gap:14px; }
  /* 取消原因卡片：右侧预览按内容定高，不随左列长列表拉伸，避免大片空白 */
  #stgRsnCard .stg-2col > .stg-box{ align-self:start; }
  .stg-box{ border:1px solid var(--border); border-radius:10px; padding:12px 14px 13px; background:rgba(120,130,150,.035); }
  .stg-box-t{ font-size:12.5px; font-weight:700; color:var(--text-2); margin-bottom:10px; display:flex; align-items:center; gap:7px; }
  .stg-box-t i{ width:5px; height:13px; border-radius:3px; background:var(--primary); display:inline-block; flex:none; }
  .stg-cmp{ display:flex; flex-direction:column; gap:9px; }
  .stg-cmp-row{ display:flex; align-items:baseline; gap:8px; font-size:12.5px; }
  .stg-cmp-row .k{ width:82px; flex:none; color:var(--text-3); }
  .stg-cmp-row .v{ min-width:0; font-weight:700; color:var(--text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .stg-cmp-row .v.mut{ color:var(--text-3); font-weight:600; }
  .stg-mini{ height:22px; padding:0 9px; border-radius:11px; font-size:11.5px; font-weight:700; display:inline-flex; align-items:center; color:#fff; flex:none; }
  /* 效果预览（真实节点样式） */
  .stg-preview{ border:1px solid var(--border); border-radius:10px; overflow:hidden; margin-bottom:14px; }
  .stg-pv-hd{ padding:8px 13px; font-size:12.5px; font-weight:700; color:var(--text-2); background:rgba(120,130,150,.06); border-bottom:1px solid var(--border); display:flex; align-items:center; gap:7px; }
  .stg-pv-hd i{ width:5px; height:13px; border-radius:3px; background:var(--primary); display:inline-block; flex:none; }
  .stg-pv-stage{ position:relative; z-index:0; display:flex; justify-content:center; align-items:center; padding:16px 14px; }
  .stg-pv-stage .qo-flow{ margin-left:0; }
  .stg-pv-cap{ padding:0 13px 11px; font-size:12px; color:var(--text-3); text-align:center; line-height:1.6; }
  /* 颜色规则表 */
  .stg-table-wrap{ overflow-x:auto; }
  .stg-table{ width:100%; border-collapse:separate; border-spacing:0; font-size:13px; border:1px solid var(--border); border-radius:10px; overflow:hidden; }
  .stg-table th{
    background:rgba(120,130,150,.06); font-size:12.5px; font-weight:700; color:var(--text-2);
    text-align:left; padding:9px 12px; border-bottom:1px solid var(--border); white-space:nowrap;
  }
  .stg-table td{ padding:10px 12px; border-bottom:1px solid var(--border); color:var(--text-2); line-height:1.6; vertical-align:middle; }
  .stg-table tr:last-child td{ border-bottom:none; }
  .stg-table tbody tr:hover td{ background:rgba(120,130,150,.04); }
  .stg-sw{ width:12px; height:12px; border-radius:4px; display:inline-block; box-shadow:inset 0 0 0 1px rgba(0,0,0,.08); margin-right:7px; vertical-align:-2px; flex:none; }
  .stg-mono{ font-family:ui-monospace,Menlo,Consolas,monospace; font-size:11.5px; color:var(--text-3); }
  .stg-nodewrap{ display:flex; justify-content:center; min-width:96px; }
  .stg-sub{ font-size:13px; font-weight:700; margin:16px 0 9px; display:flex; align-items:center; gap:7px; }
  .stg-sub::before{ content:''; width:3px; height:13px; border-radius:2px; background:var(--primary); flex:none; }
  .stg-legend{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; }
  .stg-lg{ display:flex; align-items:center; gap:12px; border:1px solid var(--border); border-radius:10px; padding:11px 13px; background:rgba(120,130,150,.035); }
  .stg-lg .qo-cdbox{ margin-left:0; flex:none; min-width:104px; }
  .stg-lg-t{ font-size:13px; font-weight:700; color:var(--text); }
  .stg-lg-d{ font-size:12px; color:var(--text-3); margin-top:2px; line-height:1.55; }
  @media (max-width:960px){
    .stg-tgrid{ grid-template-columns:minmax(0,1fr); }
    .stg-2col, .stg-legend{ grid-template-columns:minmax(0,1fr); }
  }
  /* 订单设置：左侧分组导航 + 右侧内容面板（20261030x） */
  .stg-layout{ display:flex; gap:0; align-items:flex-start; }
  .stg-nav{
    width:236px; flex:none; position:sticky; top:8px; align-self:flex-start;
    display:flex; flex-direction:column; gap:4px;
    padding:6px 16px 6px 4px; border-right:1px solid var(--border);
  }
  .stg-nav-item{
    display:flex; align-items:center; gap:11px; width:100%; text-align:left;
    padding:10px 12px; border-radius:10px; cursor:pointer; border:1px solid transparent;
    background:transparent; font:inherit; color:var(--text-2,#475569);
    transition:background .15s, border-color .15s, color .15s;
  }
  .stg-nav-item:hover{ background:rgba(120,130,150,.06); }
  .stg-nav-item.active{ background:rgb(var(--primary-rgb) / .08); border-color:rgb(var(--primary-rgb) / .22); }
  .stg-nav-item.active .stg-nav-t{ color:var(--primary); }
  .stg-nav-ico{
    width:34px; height:34px; border-radius:9px; flex:none;
    display:flex; align-items:center; justify-content:center; font-size:16px; line-height:1;
    background:color-mix(in srgb, var(--accent,#7C3AED) 16%, #fff);
  }
  .stg-nav-item.active .stg-nav-ico{ box-shadow:0 0 0 2px rgb(var(--primary-rgb) / .20); }
  .stg-nav-meta{ min-width:0; display:flex; flex-direction:column; gap:1px; }
  .stg-nav-t{ font-size:13.5px; font-weight:700; color:var(--text,#1f2a37); line-height:1.3; }
  .stg-nav-d{ font-size:11.5px; color:var(--text-3,#64748B); line-height:1.4;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
  .stg-panels{ flex:1; min-width:0; padding-left:22px; }
  .stg-panel{ display:none; }
  .stg-panel.active{ display:block; animation:stgPanelIn .18s ease; }
  @keyframes stgPanelIn{ from{ opacity:.35; transform:translateY(4px); } to{ opacity:1; transform:none; } }
  @media (max-width:900px){
    .stg-layout{ flex-direction:column; }
    .stg-nav{
      width:auto; flex-direction:row; border-right:none; border-bottom:1px solid var(--border);
      padding:8px 2px; overflow-x:auto; gap:8px; position:static;
    }
    .stg-nav-item{ width:auto; flex:none; padding:9px 12px; }
    .stg-nav-d{ display:none; }
    .stg-panels{ padding-left:0; padding-top:16px; }
  }
  body.theme-dark .stg-nav-ico{ background:color-mix(in srgb, var(--accent,#7C3AED) 26%, transparent); }
  body.theme-dark .stg-nav-item.active{ background:rgb(var(--primary-rgb) / .16); }
  body.theme-dark .stg-nav-item:hover{ background:rgba(255,255,255,.05); }
  /* 订单设置页：暗夜模式适配 */
  body.theme-dark .stg-hd{ background:rgba(255,255,255,.035); }
  body.theme-dark .stg-pv-hd{ background:rgba(255,255,255,.05); }
  body.theme-dark .stg-table th{ background:rgba(255,255,255,.05); }
  body.theme-dark .stg-tcell,
  body.theme-dark .stg-box,
  body.theme-dark .stg-lg{ background:rgba(255,255,255,.035); }
  body.theme-dark .stg-tinput input{ background:#1E2027; color:var(--text); border-color:rgba(255,255,255,.14); }
  body.theme-dark .stg-chip,
  body.theme-dark .stg-hero{
    border-color:var(--border);
    background:linear-gradient(115deg, rgb(var(--primary-rgb) / .18), rgb(var(--primary-rgb) / .055) 58%, rgb(var(--primary-rgb) / 0));
  }
  /* 订单设置：节点状态徽章配色（与规则表一致） */
  .stg-badge-wait{ background:#A6AEBB; }
  .stg-badge-run{ background:#2F6FED; }
  .stg-badge-over{ background:#DC2626; }
  .stg-badge-done{ background:#0E9F6E; }
  .stg-badge-late{ background:#DC2626; }
  /* 预览条内的「迷你订单卡」：左信息 / 右节点流（同时建立堆叠上下文，令计时框光晕可见） */
  .stg-pv-card{
    position:relative; z-index:0; width:100%;
    display:flex; align-items:center; gap:16px; flex-wrap:wrap;
    border:1px solid var(--border); border-radius:9px; padding:11px 14px;
    background:rgba(120,130,150,.035);
  }
  .stg-pv-card .qo-flow{ margin-left:auto; }
  .stg-pv-info{ display:flex; align-items:center; gap:9px; min-width:0; flex-wrap:wrap; font-size:12.5px; color:var(--text-3); }
  .stg-pv-no{ font-weight:700; color:var(--text); font-variant-numeric:tabular-nums; letter-spacing:.3px; }
  .stg-pv-shop{ color:var(--text-2); }
  .stg-pv-tag{ font-size:11.5px; color:var(--text-2); background:rgba(120,130,150,.16); border-radius:9px; padding:2px 8px; }
  .stg-lg{ position:relative; z-index:0; }
  /* ---------- 取消订单确认弹窗（20261029m） ---------- */
  .ocn-modal{ width:440px; max-width:94vw; }
  .ocn-warn{
    display:flex; align-items:flex-start; gap:9px;
    background:rgba(220,38,38,.07); border:1px solid rgba(220,38,38,.22);
    border-radius:9px; padding:11px 13px; font-size:12.5px; line-height:1.7; color:var(--text-2);
  }
  .ocn-wico{
    flex:none; width:18px; height:18px; margin-top:1px; border-radius:50%;
    background:#DC2626; color:#fff; font-size:12px; font-weight:700;
    display:inline-flex; align-items:center; justify-content:center;
  }
  .ocn-rows{ margin:12px 0 4px; border:1px solid var(--border); border-radius:9px; overflow:hidden; }
  .ocn-row{ display:flex; align-items:center; gap:10px; font-size:12.5px; padding:8px 12px; }
  .ocn-row + .ocn-row{ border-top:1px solid var(--border); }
  .ocn-row span{ flex:none; width:74px; color:var(--text-3); }
  .ocn-row b{ font-weight:600; color:var(--text); min-width:0; word-break:break-all; }
  .ocn-no{ font-variant-numeric:tabular-nums; letter-spacing:.3px; }
  .ocn-amt{ color:#DC2626; }
  /* 「取消后处理」一栏：要动钱时标红，只是作废时保持普通色 —— 一眼能分出是哪种取消 */
  .ocn-plan{ font-weight:600; }
  .ocn-plan.money{ color:#DC2626; }
  body.theme-dark .ocn-plan.money{ color:#FF8A80; }
  .ocn-ops{ display:flex; align-items:center; justify-content:flex-end; gap:10px; margin-top:14px; }
  body.theme-dark .ocn-warn{ background:rgba(255,138,128,.09); border-color:rgba(255,138,128,.26); }
  body.theme-dark .ocn-amt{ color:#FF8A80; }

  /* ---------- 订单退款弹窗（20261104） ---------- */
  .rfd-modal{ width:660px; max-width:96vw; }
  .rfd-loading{ padding:22px 0; text-align:center; font-size:12.5px; color:var(--text-3); }
  .rfd-err{
    margin:8px 0 4px; padding:12px 14px; border-radius:9px;
    background:rgba(220,38,38,.06); border:1px solid rgba(220,38,38,.22);
    color:#B42318; font-size:12.5px; line-height:1.7;
  }
  body.theme-dark .rfd-err{ background:rgba(255,138,128,.09); border-color:rgba(255,138,128,.26); color:#FFB4AB; }
  .rfd-ok{ padding:16px 2px; font-size:13px; color:var(--text-2); }
  .rfd-sum2{ border:1px solid var(--border); border-radius:9px; overflow:hidden; margin-bottom:10px; }
  .rfd-row2{ display:flex; align-items:center; gap:10px; font-size:12.5px; padding:7px 12px; }
  .rfd-row2 + .rfd-row2{ border-top:1px solid var(--border); }
  .rfd-row2 > span{ flex:none; width:82px; color:var(--text-3); }
  .rfd-row2 > b{ font-weight:600; color:var(--text); min-width:0; word-break:break-all; }
  .rfd-row2 i{ font-style:normal; font-variant-numeric:tabular-nums; }
  .rfd-done{ color:var(--text-3); }
  .rfd-left{ color:#0E9F6E; }
  body.theme-dark .rfd-left{ color:#4ADE80; }
  .rfd-warn{
    display:flex; align-items:flex-start; gap:9px; margin-bottom:10px;
    background:rgba(240,173,20,.10); border:1px solid rgba(240,173,20,.32);
    border-radius:9px; padding:10px 12px; font-size:12.5px; line-height:1.7; color:var(--text-2);
  }
  .rfd-wico{
    flex:none; width:18px; height:18px; margin-top:1px; border-radius:50%;
    background:#E0A62B; color:#fff; font-size:12px; font-weight:700;
    display:inline-flex; align-items:center; justify-content:center;
  }
  body.theme-dark .rfd-warn{ background:rgba(255,207,112,.10); border-color:rgba(255,207,112,.28); }
  /* 跨日退提示：审批态用蓝色「审」，拦截态用红色，别让人把「要审批」看成「已经退了」 */
  .rfd-warn.is-block{ margin-bottom:12px; }
  .rfd-warn.is-audit{ background:rgb(var(--primary-rgb) / .07); border-color:rgb(var(--primary-rgb) / .30); }
  .rfd-warn.is-audit .rfd-wico{ background:var(--primary); font-size:11px; }
  .rfd-warn.is-block:not(.is-audit){ background:rgba(220,53,69,.08); border-color:rgba(220,53,69,.30); }
  .rfd-warn.is-block:not(.is-audit) .rfd-wico{ background:#C0392B; }
  body.theme-dark .rfd-warn.is-audit{ background:rgb(var(--primary-rgb) / .12); border-color:rgb(var(--primary-rgb) / .38); }
  body.theme-dark .rfd-warn.is-block:not(.is-audit){ background:rgba(255,138,128,.10); border-color:rgba(255,138,128,.30); }

  /* ---------- 跨日退款审批弹窗 ---------- */
  .rfa-modal{ width:min(760px,100%) }
  .rfa-body{ padding:14px 18px 18px; max-height:70vh; overflow-y:auto; }
  .rfa-h{ font-size:12.5px; font-weight:700; color:var(--text-2); margin-bottom:10px }
  .rfa-h b{ color:var(--primary); font-size:14px }
  .rfa-row{
    display:flex; align-items:flex-start; gap:12px; padding:12px;
    border:1px solid var(--border); border-radius:10px; margin-bottom:10px;
    background:rgba(120,130,150,.03);
  }
  .rfa-main{ flex:1; min-width:0 }
  .rfa-t{ display:flex; align-items:center; gap:10px; flex-wrap:wrap }
  .rfa-t .mono{ font-family:ui-monospace,Menlo,Consolas,monospace; font-size:12.5px; color:var(--text-2) }
  .rfa-t b{ font-size:15px; color:#C0392B }
  .rfa-scope{
    font-style:normal; font-size:11px; padding:1px 7px; border-radius:8px;
    background:rgb(var(--primary-rgb) / .10); color:var(--primary); border:1px solid rgb(var(--primary-rgb) / .28);
  }
  .rfa-lines{ margin-top:6px; font-size:12.5px; color:var(--text-2); line-height:1.6 }
  .rfa-meta{ margin-top:4px; font-size:11.5px; color:var(--text-3) }
  .rfa-ops{ flex:none; display:flex; flex-direction:column; gap:6px }
  .rfa-empty{ padding:26px 10px; text-align:center; font-size:12.5px; color:var(--text-3) }
  .rfa-done{ border:1px solid var(--border); border-radius:10px; overflow:hidden }
  .rfa-drow{
    display:grid; grid-template-columns:1fr 90px 76px 90px 130px; align-items:center; gap:8px;
    padding:8px 12px; font-size:12px; color:var(--text-2); border-top:1px solid var(--border);
  }
  .rfa-drow:first-child{ border-top:none }
  .rfa-drow .mono{ font-family:ui-monospace,Menlo,Consolas,monospace; font-size:11.5px }
  .rfa-st{ font-style:normal; font-size:11px; padding:1px 7px; border-radius:8px; text-align:center; white-space:nowrap }
  .rfa-st.s1{ background:rgba(120,130,150,.14); color:var(--text-2) }
  .rfa-st.s2{ background:rgba(16,185,129,.14); color:#0E9F6E }
  .rfa-st.s3{ background:rgba(220,53,69,.12); color:#C0392B }
  .rfa-by,.rfa-at{ color:var(--text-3); font-size:11.5px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap }
  body.theme-dark .rfa-st.s2{ color:#3DDCA0 }
  body.theme-dark .rfa-st.s3{ color:#FF8A80 }

  /* 工具栏「跨日退审批」：有代办时数字变亮 */
  #qRefundAuditN:not(:empty){
    display:inline-flex; align-items:center; justify-content:center;
    min-width:18px; height:18px; margin-left:6px; padding:0 5px; border-radius:9px;
    background:#C0392B; color:#fff; font-size:11px; font-style:normal; font-weight:700;
  }
  .rfd-lines{ border:1px solid var(--border); border-radius:9px; overflow:hidden; }
  .rfd-lrow{
    display:grid; align-items:center; gap:6px; padding:7px 10px; font-size:12.5px;
    grid-template-columns:20px minmax(0,1fr) 62px 52px 44px 78px 74px;
    border-top:1px solid var(--border);
  }
  .rfd-lrow.is-head{
    border-top:0; background:rgba(0,0,0,.02); color:var(--text-3);
    font-size:11.5px; padding:6px 10px;
  }
  body.theme-dark .rfd-lrow.is-head{ background:rgba(255,255,255,.04); }
  .rfd-lrow.is-on{ background:rgb(var(--primary-rgb) / .06); }
  .rfd-lrow.is-out{ opacity:.5; }
  .rfd-lrow > span{ min-width:0; }
  .rfd-lrow.is-head > span:nth-child(n+3){ text-align:right; }
  .rfd-n{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--text); }
  .rfd-n em{ font-style:normal; font-size:11px; color:var(--text-3); margin-left:4px; }
  .rfd-p,.rfd-q,.rfd-d,.rfd-a{ text-align:right; font-variant-numeric:tabular-nums; color:var(--text-2); }
  .rfd-a{ font-weight:600; color:var(--text); }
  .rfd-chk{ display:flex; align-items:center; justify-content:center; }
  .rfd-chk input{ width:15px; height:15px; accent-color:var(--primary,#2563EB); cursor:pointer; }
  .rfd-i input{
    width:100%; height:28px; padding:0 6px; text-align:right;
    border:1px solid var(--border); border-radius:6px; background:var(--panel);
    color:var(--text); font-size:12.5px; font-variant-numeric:tabular-nums;
  }
  .rfd-i input:focus{ outline:none; border-color:var(--primary,#2563EB); box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .14); }
  body.theme-dark .rfd-i input{ background:#262A31; color:#E8EBF0; border-color:#3A3F49; }
  .rfd-tools{ display:flex; align-items:center; gap:8px; margin:10px 0 0; flex-wrap:wrap; }
  .rfd-tip{ font-size:11.5px; color:var(--text-3); }
  .rfd-sum{
    display:flex; align-items:baseline; gap:8px; margin-top:12px;
    font-size:13px; color:var(--text-2);
  }
  .rfd-sum b{ font-size:20px; font-weight:700; color:#DC2626; font-variant-numeric:tabular-nums; }
  .rfd-sum i{ font-style:normal; font-size:11.5px; color:var(--text-3); }
  body.theme-dark .rfd-sum b{ color:#FF8A80; }
  .rfd-fld{ margin-top:12px; }
  .rfd-fld label{ display:block; font-size:12.5px; color:var(--text-2); margin-bottom:5px; }
  .rfd-fld label span{ font-size:11.5px; color:var(--text-3); margin-left:8px; }
  .rfd-fld input{
    width:100%; height:34px; padding:0 10px; border:1px solid var(--border); border-radius:8px;
    background:var(--panel); color:var(--text); font-size:12.5px;
  }
  .rfd-fld input:focus{ outline:none; border-color:var(--primary,#2563EB); box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .14); }
  body.theme-dark .rfd-fld input{ background:#262A31; color:#E8EBF0; border-color:#3A3F49; }
  .rfd-ops{ display:flex; align-items:center; justify-content:flex-end; gap:10px; margin-top:14px; }
  .rfd-ops .btn.danger.is-armed{ box-shadow:0 0 0 3px rgba(220,38,38,.18); }
  /* 弹窗在暗夜模式下的底色（否则白底 + 浅色文字不可读） */
  body.theme-dark .am-modal{ background:#1E2027; box-shadow:0 10px 40px rgba(0,0,0,.6); }
  body.theme-dark .am-x{ color:#8891A3; }
  body.theme-dark .am-x:hover{ color:#E9EBF2; }

  /* ---------- 订单设置 · 取消原因选项维护（20261030d） ---------- */
  .stg-rsn-add{ display:flex; gap:8px; margin-bottom:10px; }
  .stg-rsn-add input{
    flex:1; min-width:0; height:36px; padding:0 11px; font-family:inherit; font-size:13px;
    border:1px solid var(--border); border-radius:8px; background:var(--panel-2, #fff); color:var(--text);
  }
  .stg-rsn-add input:focus{ outline:none; border-color:var(--primary); box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .12); }
  .stg-rsn-list{ display:flex; flex-direction:column; gap:7px; }
  .stg-rsn-row{
    display:flex; align-items:center; gap:8px; padding:7px 8px;
    border:1px solid var(--border); border-radius:9px; background:var(--panel-2, #fff);
    transition:border-color .15s, background-color .15s;
  }
  .stg-rsn-row:hover{ border-color:var(--primary); }
  .stg-rsn-row.is-bad{ border-color:#DC2626; background:#FFF5F5; }
  .stg-rsn-no{
    flex:none; width:22px; height:22px; border-radius:50%; display:flex; align-items:center; justify-content:center;
    font-size:11px; font-weight:700; color:var(--primary); background:rgb(var(--primary-rgb) / .10);
  }
  .stg-rsn-txt{
    flex:1; min-width:0; height:30px; padding:0 8px; font-family:inherit; font-size:13px; font-weight:600; color:var(--text);
    border:1px solid transparent; border-radius:6px; background:transparent;
  }
  .stg-rsn-txt:hover{ border-color:var(--border); }
  .stg-rsn-txt:focus{ outline:none; border-color:var(--primary); background:var(--panel, #fff); }
  .stg-rsn-op{
    flex:none; width:24px; height:24px; border-radius:6px; cursor:pointer; font-size:12px; line-height:1;
    border:1px solid var(--border); background:transparent; color:var(--text-2); display:flex; align-items:center; justify-content:center;
  }
  .stg-rsn-op:hover:not([disabled]){ border-color:var(--primary); color:var(--primary); background:rgb(var(--primary-rgb) / .08); }
  .stg-rsn-op[disabled]{ opacity:.32; cursor:not-allowed; }
  .stg-rsn-op.del:hover:not([disabled]){ border-color:#DC2626; color:#DC2626; background:rgba(220,38,38,.08); }
  .stg-rsn-foot{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-top:10px; }
  .stg-rsn-count{ font-size:12px; color:var(--text-3); }
  .stg-rsn-reset{
    border:none; background:none; font:inherit; font-size:12px; cursor:pointer;
    color:var(--primary); text-decoration:underline; text-underline-offset:2px; padding:0;
  }
  .stg-rsn-reset:hover{ opacity:.8; }

  /* ===== 订单操作项（设置 → 订单设置）=====
     左边是已选的（可排序），右边是候选池。两边共用 .stg-rsn-op 那套小按钮。 */
  .stg-qk{ display:grid; grid-template-columns:1fr 1fr; gap:16px; }
  @media (max-width:1100px){ .stg-qk{ grid-template-columns:1fr; } }
  .stg-qk-col{ min-width:0; display:flex; flex-direction:column; gap:8px; }
  .stg-qk-hd{
    display:flex; align-items:center; justify-content:space-between; gap:8px;
    font-size:12.5px; font-weight:600; color:var(--text);
  }
  .stg-qk-n{
    font-size:11.5px; font-weight:600; color:var(--primary);
    background:var(--primary-soft); border-radius:999px; padding:1px 9px;
  }
  .stg-qk-list{ display:flex; flex-direction:column; gap:6px; min-height:46px; }
  .stg-qk-row{
    display:flex; align-items:center; gap:8px; padding:6px 8px;
    border:1px solid var(--border); border-radius:9px; background:#fff;
    transition:border-color .15s;
  }
  .stg-qk-row:hover{ border-color:var(--primary); }
  .stg-qk-no{
    flex:none; width:22px; height:22px; border-radius:50%;
    display:flex; align-items:center; justify-content:center;
    font-size:11.5px; font-weight:600; color:var(--primary); background:var(--primary-soft);
  }
  .stg-qk-nm{
    flex:1; min-width:0; display:flex; flex-direction:column; gap:1px;
    font-size:13px; font-weight:600; color:var(--text); line-height:1.35;
  }
  .stg-qk-nm i{
    font-style:normal; font-size:11.5px; font-weight:400; color:var(--text-3,#889);
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  }
  .stg-qk-pool{ display:flex; flex-wrap:wrap; gap:8px; }
  .stg-qk-chip{
    height:30px; padding:0 12px; border:1px solid var(--border); border-radius:999px;
    background:#fff; font-family:inherit; font-size:12.5px; color:var(--text);
    cursor:pointer; transition:border-color .15s, color .15s, background-color .15s;
  }
  .stg-qk-chip:hover:not(:disabled){ border-color:var(--primary); color:var(--primary); background:var(--primary-soft); }
  .stg-qk-chip:disabled{ opacity:.45; cursor:not-allowed; }
  /* 已加进快捷区的：虚线边框 + 灰底，但仍然看得清字（跟「满 5 个后没得选」的
     半透明不是一回事，两者别混成一样淡） */
  .stg-qk-chip.is-on,
  .stg-qk-chip.is-on:disabled{
    opacity:1; border-style:dashed; border-color:#D8DDE6;
    background:#F2F4F8; color:var(--text-3,#8A93A3); cursor:default;
  }
  .stg-qk-cap{ font-size:11.5px; color:var(--text-3,#889); line-height:1.65; }
  .stg-qk-empty{
    font-size:12px; color:var(--text-3,#889); text-align:center;
    padding:14px 10px; border:1px dashed var(--border); border-radius:9px;
  }
  .stg-qk-pv{ margin-top:14px; }
  .stg-qk-pv-line{
    display:flex; align-items:center; gap:8px; padding:10px 12px;
    background:#fff; border:1px solid var(--border); border-radius:8px;
    margin:0 0 10px; overflow:hidden;
  }
  .stg-qk-pv-line .qo-addr{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .stg-qk-none{ font-size:11.5px; color:var(--text-3,#889); }
  /* 卡片标题右侧计数徽标 */
  .stg-hd-r{ margin-left:auto; flex:none; display:flex; align-items:center; gap:8px; }
  .stg-rsn-cap{ font-size:11.5px; line-height:1.6; color:var(--text-3); }
  /* 右侧预览：还原取消弹窗里的原因选择区 */
  .stg-rsn-pv{ padding:2px 0 0; }
  .stg-rsn-pv-lb{ font-size:12px; color:var(--text-3); margin-bottom:6px; display:block; }
  .stg-rsn-pvsel{
    width:100%; height:34px; padding:0 10px; font-family:inherit; font-size:12.5px;
    border:1px solid #E0A62B; border-radius:8px; background:#FFFBF3; color:#8A6A2A; margin-bottom:10px;
  }
  .stg-rsn-pv-ops{ display:flex; justify-content:flex-end; gap:8px; }
  .stg-rsn-pv-cap{ margin-top:10px; font-size:11.5px; line-height:1.7; color:var(--text-3); }
  .stg-rsn-empty{
    padding:18px 12px; text-align:center; font-size:12.5px; color:var(--text-3);
    border:1px dashed var(--border); border-radius:9px; background:var(--panel-2, #fff);
  }
  body.theme-dark .stg-rsn-row.is-bad{ background:rgba(220,38,38,.10); }
  body.theme-dark .stg-rsn-pvsel{ background:#2A2318; border-color:#7A5A20; color:#E8C98C; }

  /* ---------- 档案中心 · 门店 ---------- */
  .store-addr{ color:var(--text-2,#64748B); }
  .store-muted{ color:#9CA8B5; font-size:12.5px; }
  .store-qr-modal{ width:420px; }
  .store-qr-modal .am-head{ display:flex; align-items:center; justify-content:space-between; gap:12px; font-size:16px; font-weight:700; margin-bottom:6px; }
  .qr-box{ display:flex; align-items:center; justify-content:center; padding:16px 0 6px; }
  .qr-box img{ width:260px; height:260px; object-fit:contain; border:1px solid var(--border,#E5E7EB); border-radius:12px; background:#fff; }
  .qr-empty{ width:260px; height:260px; display:flex; align-items:center; justify-content:center; border:1px dashed var(--border,#E5E7EB); border-radius:12px; color:#9CA8B5; font-size:13px; }
  .qr-cap{ font-size:12.5px; color:#8A94A6; text-align:center; padding:6px 4px 10px; line-height:1.6; }
  .store-form{ display:flex; flex-direction:column; gap:14px; padding:4px 2px 2px; }
  .sf-row{ display:grid; grid-template-columns:92px 1fr; align-items:center; gap:12px; }
  .sf-row > span{ font-size:13.5px; color:var(--text-2,#64748B); }
  .sf-row > span i{ color:#E5484D; font-style:normal; margin-left:2px; }
  .sf-hint{ margin:-2px 0 4px 104px; font-size:12px; color:var(--text-3); line-height:1.6; }
  .sf-row .po-in{ width:100%; }
  /* 门店启用开关（滑块）：关掉 = 客服发单选不到、门店账号登录不了也开不了台、调拨不算这家店 */
  .sf-switch-wrap{ display:flex; flex-direction:column; gap:6px; min-width:0; }
  .sf-switch{ display:inline-flex; align-items:center; gap:10px; cursor:pointer; user-select:none; width:max-content; }
  .sf-switch input{ position:absolute; opacity:0; width:0; height:0; }
  .sf-switch i{ position:relative; width:42px; height:23px; border-radius:999px; background:#CBD5E1; transition:background .18s; flex:none; }
  .sf-switch i::after{ content:''; position:absolute; top:2px; left:2px; width:19px; height:19px; border-radius:50%; background:#fff; box-shadow:0 1px 3px rgba(15,23,42,.25); transition:transform .18s; }
  .sf-switch input:checked + i{ background:var(--primary,#1E6FFF); }
  .sf-switch input:checked + i::after{ transform:translateX(19px); }
  .sf-switch input:focus-visible + i{ box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .25); }
  .sf-switch b{ font-size:13.5px; font-weight:600; color:var(--text); }
  .sf-switch b.off{ color:#E5484D; }
  .sf-switch-wrap .sf-hint{ margin:0; }
  /* 列表里的小号开关（门店列表「状态」列） */
  .sf-switch-sm{ gap:8px; }
  .sf-switch-sm i{ width:36px; height:20px; }
  .sf-switch-sm i::after{ width:16px; height:16px; }
  .sf-switch-sm input:checked + i::after{ transform:translateX(16px); }
  .sf-switch-sm b{ font-size:12.5px; font-weight:500; }
  .sf-switch-sm input:disabled + i{ opacity:.55; }
  body.theme-dark .sf-switch i{ background:#3A3F4D; }
  /* 深色下必须补一条：`body.theme-dark .sf-switch i` 的权重比 `input:checked + i` 高，
     不补的话打开状态在深色主题里还是灰的 */
  body.theme-dark .sf-switch input:checked + i{ background:var(--primary,#1E6FFF); }
  body.theme-dark .sf-switch b.off{ color:#F87171; }
  .sf-qr{ display:flex; align-items:flex-start; gap:14px; }
  .sf-qr-pv{ width:120px; height:120px; flex:none; display:flex; align-items:center; justify-content:center; border:1px dashed var(--border,#E5E7EB); border-radius:10px; overflow:hidden; background:#fff; }
  .sf-qr-pv img{ width:100%; height:100%; object-fit:contain; }
  .sf-qr-ops{ display:flex; flex-direction:column; gap:8px; align-items:flex-start; }
  .sf-qr-btns{ display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
  .sf-qr-meta{ font-size:12px; color:var(--text-3,#94A3B8); }
  .qr-meta{ text-align:center; font-size:12px; color:var(--text-3,#94A3B8); margin:-6px 0 10px; }
  .sf-delwrap{ border-top:1px dashed var(--border,#E5E7EB); padding-top:12px; }
  .sf-del{ background:transparent; border:0; color:#E5484D; cursor:pointer; font-size:13px; text-decoration:underline; padding:0; }
  .store-drawer-foot{ flex:none; display:flex; align-items:center; gap:10px; padding:14px 20px; border-top:1px solid var(--border,#E5E7EB); background:var(--panel,#fff); }
  body.theme-dark .store-drawer-foot{ background:#1E2027; border-color:#2E3140; }

  /* ---------- 门店抽屉：加宽 + 分区（地址定位 / 银行 / 其他 / 进销存） ---------- */
  .mem-drawer-lg{ width:min(620px,96vw); }
  .sf-sec{ border:1px solid var(--border,#E5E7EB); border-radius:12px; padding:14px 16px; display:flex; flex-direction:column; gap:12px; background:var(--panel,#fff); }
  body.theme-dark .sf-sec{ background:#232630; border-color:#2E3140; }
  /* display:flex 会盖掉 UA 的 [hidden]{display:none}，加盟店要收起这几块必须显式写 */
  .sf-sec[hidden]{ display:none; }
  .sf-sec-t{ font-size:13px; font-weight:700; color:var(--text); display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
  .sf-sec-t::before{ content:''; width:3px; height:13px; border-radius:2px; background:var(--primary,#1E6FFF); flex:none; }
  .sf-sec-b{ font-weight:400; font-size:11.5px; color:#92600A; background:#FFF7E6; border:1px solid #F2D9A0; border-radius:20px; padding:2px 8px; }
  body.theme-dark .sf-sec-b{ background:rgba(245,158,11,.14); border-color:rgba(245,158,11,.4); color:#FCD34D; }
  .sf-region{ display:grid; grid-template-columns:1fr 1fr 1fr; gap:8px; }
  .sf-region .po-in{ width:100%; }
  .sf-addr{ width:100%; box-sizing:border-box; }
  .sf-mapwrap{ border:1px solid var(--border,#E5E7EB); border-radius:10px; overflow:hidden; }
  .sf-map{ height:220px; width:100%; flex:none; background:#EEF1F5; z-index:0; }
  .sf-mapbar{ display:flex; align-items:center; gap:10px; padding:8px 10px; background:#F8FAFC; border-top:1px solid var(--border,#E5E7EB); }
  body.theme-dark .sf-mapbar{ background:#1B1E26; border-color:#2E3140; }
  .sf-maptip{ font-size:12px; color:var(--text-2,#64748B); line-height:1.4; }
  .sf-coord{ display:grid; grid-template-columns:1fr 1fr auto; gap:8px; align-items:end; }
  .sf-coord label{ display:flex; flex-direction:column; gap:4px; font-size:12px; color:var(--text-2,#64748B); }
  .sf-coord .po-in{ width:100%; box-sizing:border-box; }
  .sf-loc-tip{ font-size:12.5px; line-height:1.5; padding:8px 10px; border-radius:8px; }
  .sf-loc-tip.ok{ background:#ECFDF5; color:#065F46; border:1px solid #A7F3D0; }
  .sf-loc-tip.warn{ background:#FFF7E6; color:#92600A; border:1px solid #F2D9A0; }
  body.theme-dark .sf-loc-tip.ok{ background:rgba(16,185,129,.12); color:#6EE7B7; border-color:rgba(16,185,129,.35); }
  body.theme-dark .sf-loc-tip.warn{ background:rgba(245,158,11,.12); color:#FCD34D; border-color:rgba(245,158,11,.35); }
  .sf-secret{ display:flex; gap:8px; align-items:center; }
  .sf-secret .po-in{ flex:1; min-width:0; }
  .sf-eye{ flex:none; border:1px solid var(--input-border,#D8DCE6); background:transparent; color:var(--text-2,#64748B); border-radius:var(--input-radius,7px); padding:0 12px; height:38px; cursor:pointer; font-size:12.5px; font-family:inherit; }
  .sf-eye:hover{ border-color:var(--primary,#1E6FFF); color:var(--primary,#1E6FFF); }
  /* 地图标记（Leaflet divIcon） */
  .sf-pin-wrap{ background:transparent; border:0; }
  .sf-pin{ display:block; width:22px; height:22px; border-radius:50% 50% 50% 0; transform:rotate(-45deg); background:#E5484D; border:3px solid #fff; box-shadow:0 2px 6px rgba(0,0,0,.35); box-sizing:border-box; }
  .leaflet-container{ font-family:inherit; }

  /* ---------- 设置 · 接口设置（js/pages/setting.js API_IF_GROUPS） ---------- */
  .if-groups{ display:flex; flex-direction:column; gap:16px; }
  /* 左侧导航上的配置状态点：灰=未配置 橙=部分 绿=已配置 */
  .if-dot{
    display:inline-block; width:6px; height:6px; border-radius:50%;
    background:#CBD5E1; margin-right:6px; vertical-align:middle;
  }
  .if-dot.part{ background:#F59E0B; }
  .if-dot.full{ background:#10B981; }
  .stg-nav-item .stg-nav-d{ -webkit-line-clamp:1; }
  body.theme-dark .if-dot{ background:#4B5563; }
  .if-grid{ display:grid; grid-template-columns:1fr 1fr; gap:14px 18px; }
  .if-f{ display:flex; flex-direction:column; gap:6px; min-width:0; }
  .if-f.wide{ grid-column:1 / -1; }
  .if-f.wide .po-in{ max-width:none; }   /* 整行字段（如接口地址）跟随整行宽度，避免右侧空一截 */
  .if-f.hide{ display:none; }
  .if-f > span{ font-size:13px; color:var(--text-2,#64748B); }
  .if-f .po-in{ width:100%; box-sizing:border-box; }
  .if-secret{ display:flex; gap:8px; align-items:center; }
  .if-secret .po-in{ flex:1; min-width:0; }
  .if-f.wide .if-secret{ max-width:680px; }
  /* 接口设置 · 测试发送（短信） */
  .if-test{ margin-top:16px; border-top:1px dashed var(--border); padding-top:14px; }
  .if-test-hd{ margin-bottom:10px; }
  .if-test-t{ display:block; font-size:13.5px; font-weight:700; color:var(--text,#1f2a37); }
  .if-test-d{ display:block; font-size:12.5px; color:var(--text-3,#64748B); margin-top:2px; line-height:1.5; }
  .if-test-row{ display:flex; gap:10px; align-items:center; flex-wrap:wrap; }
  .if-test-row .po-in{ height:38px; }
  .if-test-row #smsTestPhone{ width:220px; flex:none; }
  .if-test-row #smsTestText{ flex:1; min-width:220px; }
  .if-test-res{
    margin-top:10px; font-size:12.5px; line-height:1.7; border-radius:8px;
    padding:10px 12px; border:1px solid var(--border); background:rgba(120,130,150,.05); color:var(--text-2,#475569);
    word-break:break-all;
  }
  .if-test-res.is-ok{ border-color:#86EFAC; background:#F0FDF4; color:#166534; }
  .if-test-res.is-err{ border-color:#FCA5A5; background:#FEF2F2; color:#991B1B; }
  .if-test-res.is-info{ border-color:rgb(var(--primary-rgb) / .35); background:rgb(var(--primary-rgb) / .06); color:var(--text-2,#475569); }
  .if-test-meta{ color:var(--text-3,#64748B); font-size:11.5px; }
  .if-eye{
    flex:none; height:38px; padding:0 12px; border-radius:var(--input-radius,7px); cursor:pointer; font-family:inherit; font-size:12.5px;
    border:1px solid var(--input-border,#D8DCE6); background:transparent; color:var(--text-2,#64748B);
  }
  .if-eye:hover{ border-color:var(--primary,#1E6FFF); color:var(--primary,#1E6FFF); }
  .if-switch{
    display:flex; align-items:center; justify-content:space-between; gap:16px;
    margin-top:16px; padding-top:14px; border-top:1px dashed var(--border,#E5E7EB);
  }
  .if-switch-t{ font-size:13.5px; font-weight:600; color:var(--text); }
  .if-switch-d{ font-size:12.5px; color:var(--text-2,#64748B); margin-top:3px; line-height:1.5; }
  body.theme-dark .if-switch{ border-color:#2E3140; }
  @media (max-width:760px){ .if-grid{ grid-template-columns:1fr; } }
  body.theme-dark .store-qr-modal{ background:#1E2027; }

  /* ---------- 统一下拉：原生 select 外观归一 + 自绘悬浮面板 ----------
     原生 <select> 展开后的选项列表由系统绘制（各端样式不一、不跟深色主题、
     在弹窗里还可能被裁切），CSS 无法控制。这里统一关掉原生外观，
     由 js/core/select.js 接管弹出层，选项在 .cx-sel-pop 里自绘。 */
  /* 特异性说明：body.theme-dark select{background:...} 是 (0,1,2) 的 background 简写，
     会把 background-image/size/position 一并重置成 auto（深色下箭头被拉成一大片灰底就是这么来的）。
     所以这里统一用 (0,2,2) 的画像压过它，且 image/size/position 必须在同一条规则里写全。 */
  body:not(.theme-dark) select:not([multiple]),
  body.theme-dark select:not([multiple]){
    -webkit-appearance:none;-moz-appearance:none;appearance:none;
    background-position:calc(100% - 12px) calc(50% - 1px),calc(100% - 7px) calc(50% - 1px);
    background-size:5px 5px,5px 5px;
    background-repeat:no-repeat,no-repeat;
    padding-right:26px;cursor:pointer;
  }
  body:not(.theme-dark) select:not([multiple]){
    background-image:linear-gradient(45deg,transparent 50%,#9AA1AE 50%),linear-gradient(135deg,#9AA1AE 50%,transparent 50%);
  }
  body.theme-dark select:not([multiple]){
    background-image:linear-gradient(45deg,transparent 50%,#8B92A0 50%),linear-gradient(135deg,#8B92A0 50%,transparent 50%);
  }
  body select:not([multiple])::-ms-expand{display:none}
  /* 60px 窄框里的销售单位下拉：padding 由 .g-unit 自己定，箭头右移避让文字（放最后压过上面两条） */
  body .po-table select.g-unit{padding:0 10px;background-position:calc(100% - 9px) calc(50% - 1px),calc(100% - 4px) calc(50% - 1px)}
  /* 面板弹出时：与 :focus 同一套描边，明确「这个下拉正在被操作」 */
  select.cx-sel-open,select.cx-sel-open:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .16)}

  .cx-sel-pop{
    position:fixed;z-index:9600;
    min-width:92px;max-width:min(380px,calc(100vw - 16px));
    padding:5px;background:#fff;border-radius:10px;
    box-shadow:0 16px 36px rgba(20,26,40,.20),0 2px 6px rgba(20,26,40,.08),0 0 0 1px rgba(20,26,40,.07);
    overflow-y:auto;overscroll-behavior:contain;
    animation:cxSelIn .12s ease-out;
  }
  .cx-sel-pop[hidden]{display:none}
  .cx-sel-pop.up{animation-name:cxSelUp}
  @keyframes cxSelIn{from{opacity:0;transform:translateY(-5px) scale(.985)}to{opacity:1;transform:none}}
  @keyframes cxSelUp{from{opacity:0;transform:translateY(5px) scale(.985)}to{opacity:1;transform:none}}
  .cx-sel-grp{
    position:sticky;top:0;z-index:1;
    padding:7px 9px 5px;background:#fff;
    font-size:11.5px;font-weight:600;letter-spacing:.3px;color:var(--text-3);
    white-space:nowrap;
  }
  .cx-sel-opt{
    display:flex;align-items:center;gap:8px;
    padding:7px 9px;border-radius:6px;
    font-size:13px;line-height:1.35;color:var(--text-2);
    cursor:pointer;-webkit-user-select:none;user-select:none;
    transition:background .1s,color .1s;
  }
  .cx-sel-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .cx-sel-opt.is-hi{background:rgb(var(--primary-rgb) / .10);color:var(--primary)}
  .cx-sel-opt.is-on{color:var(--primary);font-weight:600}
  .cx-sel-opt.is-on::after{content:"\2713";flex:none;margin-left:4px;font-size:12px;line-height:1}
  .cx-sel-opt.is-disabled{color:#C0C4CE;cursor:not-allowed}
  .cx-sel-opt.is-disabled.is-hi{background:transparent;color:#C0C4CE}
  body.theme-dark .cx-sel-pop{background:#272A34;box-shadow:0 16px 36px rgba(0,0,0,.6),0 0 0 1px rgba(255,255,255,.09)}
  body.theme-dark .cx-sel-grp{background:#272A34;color:#7C8394}
  body.theme-dark .cx-sel-opt{color:#D3D7E0}
  body.theme-dark .cx-sel-opt.is-hi{background:rgb(var(--primary-rgb) / .20);color:#EDE9FE}
  body.theme-dark .cx-sel-opt.is-on{color:#C4B5FD}
  body.theme-dark .cx-sel-opt.is-disabled{color:#5A606E}
  body.theme-dark .cx-sel-opt.is-disabled.is-hi{background:transparent;color:#5A606E}

  /* ---------- 长列表检索面板（门店上百家那类，见 select.js 的 flatq）----------
     检索框/滚动区复用 .cx-cat-search / .cx-cat-list（树形面板那套），
     这里只补三样它没有的：命中高亮、行尾小标签、「最近」胶囊。 */
  .cx-sel-mk{
    background:rgb(var(--primary-rgb) / .16);color:var(--primary);
    border-radius:3px;padding:0 1px;font-weight:600;
  }
  body.theme-dark .cx-sel-mk{background:rgb(var(--primary-rgb) / .30);color:#EDE9FE}
  .cx-sel-hint{
    flex:none;margin-left:auto;padding-left:6px;
    font-size:11px;color:var(--text-3);letter-spacing:.2px;
    font-variant-numeric:tabular-nums;
  }
  body.theme-dark .cx-sel-hint{color:#7C8394}
  .cx-sel-badge{
    flex:none;margin-left:4px;padding:0 5px;height:16px;line-height:16px;
    border-radius:4px;background:var(--bg-2);color:var(--text-3);
    font-size:10.5px;font-weight:600;letter-spacing:.2px;
  }
  body.theme-dark .cx-sel-badge{background:#31353F;color:#8B92A0}
  .cx-sel-rec{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:0 1px 6px}
  .cx-sel-reclb{font-size:11px;color:var(--text-3);margin-right:2px}
  .cx-sel-chip{
    max-width:112px;height:22px;padding:0 8px;
    border:1px solid var(--border);border-radius:11px;background:transparent;
    color:var(--text-2);font-family:inherit;font-size:11.5px;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;
    transition:border-color .12s,color .12s,background .12s;
  }
  .cx-sel-chip:hover,.cx-sel-chip:focus-visible{
    border-color:var(--primary);color:var(--primary);
    background:rgb(var(--primary-rgb) / .06);outline:none;
  }
  body.theme-dark .cx-sel-chip{border-color:#3A3F4B;color:#B7BDC9}
  body.theme-dark .cx-sel-chip:hover,body.theme-dark .cx-sel-chip:focus-visible{
    border-color:#8B5CF6;color:#C4B5FD;background:rgb(var(--primary-rgb) / .18);
  }
  @media (prefers-reduced-motion:reduce){.cx-sel-pop{animation:none}}

  /* ---------- 商品类别树形面板（CxSelect 扩展，见 .tmp/cat-visual-spec.md v3）----------
     外壳复用 .cx-sel-pop：圆角/内边距/阴影/动画/z-index 全部不重写，
     这里只加「搜索顶栏 + 清空行 + 树行」这层。尺寸（宽 280~360 / 高 480）由
     js/core/select.js 的行内样式给（CSS 压不动 inline，改那里）。

     行内禁止任何 margin / 上下 padding：行高恒定 32px，keyboard 滚动按
     offsetTop 算，一加间距就会错位。缩进只用左 padding（12/28/44，步长 16）。 */
  .cx-cat-pop{display:flex;flex-direction:column;overflow:hidden}
  .cx-cat-list{position:relative;flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain}

  /* 顶部检索行：在滚动区之外，永远不跟着滚走 */
  .cx-cat-search{position:relative;flex:none;height:28px;margin:0 0 5px}
  .cx-cat-search input{
    width:100%;height:28px;padding:0 26px;border:0;border-radius:6px;
    background:var(--bg-2);color:var(--text);font-family:inherit;font-size:12.5px;outline:none;
    transition:box-shadow .14s;
  }
  .cx-cat-search input:focus{box-shadow:0 0 0 2px rgb(var(--primary-rgb) / .16)}
  .cx-cat-search input::placeholder{color:var(--text-3)}   /* 占位符是 --text-3 的唯一例外 */
  .cx-cat-search .ic,.cx-cat-search .cx-cat-qx{position:absolute;top:7px;width:14px;height:14px;color:var(--text-2)}
  .cx-cat-search .ic{left:8px;pointer-events:none;display:flex}
  .cx-cat-search .cx-cat-qx{right:6px;cursor:pointer;font-size:12px;line-height:14px;text-align:center}
  .cx-cat-sep{flex:none;height:1px;margin:0 -5px 4px;background:var(--border)}

  /* 行：恒定 32px、零 margin */
  .cx-cat-row{
    display:flex;align-items:center;gap:8px;height:32px;margin:0;
    padding:0 9px;border-radius:6px;box-sizing:border-box;
    font-size:12.5px;font-weight:400;color:var(--text-2);
    cursor:pointer;-webkit-user-select:none;user-select:none;
    transition:background .1s,color .1s;
  }
  .cx-cat-row[data-depth="0"]{padding-left:12px;font-size:13px;font-weight:600}
  .cx-cat-row[data-depth="1"]{padding-left:12px;font-size:13px;font-weight:700;color:var(--text)}
  .cx-cat-row[data-depth="2"]{padding-left:28px;font-weight:600}
  .cx-cat-row[data-depth="3"]{padding-left:44px}
  .cx-cat-row.is-flat{padding-left:9px}
  .cx-cat-row:hover{background:rgb(var(--primary-rgb) / .06)}
  /* 选中：只加深 + 加粗，不上主色（主色压浅底在 accent-green 下只有 2.96:1） */
  .cx-cat-row.is-on{color:var(--text);font-weight:600;background:rgb(var(--primary-rgb) / .10)}
  .cx-cat-row.is-hi{background:rgb(var(--primary-rgb) / .10)}
  .cx-cat-row.is-flat.is-on,.cx-cat-row.is-flat.is-hi{background:rgb(var(--primary-rgb) / .10)}

  /* 细折角 chevron：5×5 + 1.5px 双描边；只有父行才画（叶子留空槽保证名称对齐） */
  .cx-cat-chev{flex:0 0 20px;width:20px;height:20px;display:flex;align-items:center;justify-content:center}
  .cx-cat-chev::before{content:none}
  .cx-cat-row.is-parent>.cx-cat-chev::before{
    content:"";width:5px;height:5px;margin-left:-2px;
    border-top:1.5px solid var(--text-3);border-right:1.5px solid var(--text-3);
    transform:rotate(45deg);transition:transform .16s, border-color .12s;
  }
  .cx-cat-row.is-parent.is-open>.cx-cat-chev::before{transform:rotate(135deg);margin-top:-2px;margin-left:0}
  .cx-cat-row.is-parent:hover>.cx-cat-chev::before{border-color:var(--text-2)}  /* 只变深，不变主色 */

  .cx-cat-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* 「全部」入口：轻量文字胶囊，常显不做 hover 才出现（否则名称宽度会跳） */
  .cx-cat-all-slot{flex:0 0 48px;display:flex;justify-content:flex-end;align-items:center}
  .cx-cat-all{
    position:relative;height:20px;line-height:20px;padding:0 7px;
    font-size:12px;font-weight:500;white-space:nowrap;
    border:1px solid var(--border);border-radius:5px;
    color:var(--text-2);background:transparent;
    transition:background .12s,border-color .12s,color .12s;
  }
  .cx-cat-all::after{content:"";position:absolute;inset:-6px -8px}   /* 32×32 热区，不占布局 */
  .cx-cat-row:hover .cx-cat-all,
  .cx-cat-row.is-hi .cx-cat-all{border-color:rgb(var(--primary-rgb) / .45);color:var(--primary);background:rgb(var(--primary-rgb) / .06)}
  .cx-cat-row.is-on>.cx-cat-all-slot .cx-cat-all{border-color:var(--primary);color:var(--text);background:rgb(var(--primary-rgb) / .12)}
  .cx-cat-row.is-on>.cx-cat-all-slot .cx-cat-all::before{content:"\2713 ";font-size:11px;color:var(--primary)}
  /* 搜索态：只提示「选了它 = 含全部子类」，不可点 */
  .cx-cat-all.is-hint{border:0;padding:0;background:transparent}
  .cx-cat-all.is-hint::after{content:none}
  /* 叶子行的勾号（没有「全部」入口，勾号放同一个 48px 槽里，行宽不跳） */
  .cx-cat-ck{font-size:11px;line-height:1;color:var(--primary);padding-right:4px}

  .cx-cat-n{flex:0 0 40px;text-align:right;font-size:12px;color:var(--text-2);font-variant-numeric:tabular-nums}
  .cx-cat-row[data-depth="0"]>.cx-cat-n,
  .cx-cat-row[data-depth="1"]>.cx-cat-n{font-weight:600}
  .cx-cat-row.is-on>.cx-cat-n{color:var(--text);opacity:.8}

  /* 展开中的一级吸顶（必做：15 个一级本身就撑满面板，不吸顶就不知道自己在哪个大类下） */
  .cx-cat-row[data-depth="1"].is-open{
    position:sticky;top:0;z-index:1;background:#fff;box-shadow:0 1px 0 var(--border);
  }
  body.theme-dark .cx-cat-row[data-depth="1"].is-open{background:#272A34}

  /* 搜索拍平：名称不截断，祖先路径先省略 */
  .cx-cat-row.is-flat>.cx-cat-chev{display:none}
  .cx-cat-row.is-flat>.cx-cat-name{flex:0 0 auto;max-width:100%}
  .cx-cat-row.is-flat>.cx-cat-all-slot{flex:0 0 auto;margin-left:2px}
  .cx-cat-crumb{
    flex:0 1 auto;min-width:0;margin-left:2px;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
    font-size:12px;font-weight:400;color:var(--text-2);
  }
  .cx-cat-empty{padding:20px 12px;text-align:center}
  .cx-cat-empty .t1{font-size:13px;font-weight:600;color:var(--text-2)}
  .cx-cat-empty .t2{margin-top:4px;font-size:12px;color:var(--text-2)}

  /* 滚动条：8px 槽 / 4px 滑块 / 透明轨道（与站内同款） */
  .cx-cat-list::-webkit-scrollbar{width:8px}
  .cx-cat-list::-webkit-scrollbar-thumb{background:rgba(130,140,160,.35);border-radius:8px;border:2px solid transparent;background-clip:padding-box}
  .cx-cat-list::-webkit-scrollbar-thumb:hover{background:rgba(130,140,160,.5);background-clip:padding-box}
  .cx-cat-list::-webkit-scrollbar-track{background:transparent}
  .cx-cat-list{scrollbar-width:thin;scrollbar-color:rgba(130,140,160,.35) transparent}

  /* 触屏 / 窄屏：行抬到 40px，检索框 32px（输入 16px 防 iOS 聚焦缩放） */
  @media (pointer:coarse),(max-width:760px){
    .cx-cat-row{height:40px}
    .cx-cat-search,.cx-cat-search input{height:32px}
    .cx-cat-search input{font-size:16px}
    .cx-cat-search .ic,.cx-cat-search .cx-cat-qx{top:9px}
    .cx-cat-all{height:24px;line-height:24px;padding:0 9px}
  }

/* ---------- 会员档案：进销存同步工具条 ---------- */
.mem-sync{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:9px 12px;margin:0 0 12px;border-radius:10px;
  background:var(--bg);border:1px solid var(--border)}
.mem-sync .btn{flex:none}
.mem-sync-txt{flex:1 1 260px;min-width:180px;font-size:12.5px;color:var(--text-3);line-height:1.5}
.mem-sync-txt.warn{color:#C2410C}
.mem-sync-txt.running{color:var(--primary)}
/* 「读取中仑会员数据」开关：单独靠右，别和同步状态文字挤在一起 */
.mem-sync-sw{
  flex:none;display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2);
  padding:4px 9px;border-radius:8px;border:1px solid var(--border);background:#fff;cursor:pointer;white-space:nowrap;
}
.mem-sync-sw input{margin:0}
body.theme-dark .mem-sync-sw{background:#23252E;border-color:#3A3F4C;color:#C7CCD8}
.mem-sync-prog{flex:1 1 200px;height:6px;border-radius:99px;background:rgb(var(--primary-rgb) / .14);overflow:hidden}
.mem-sync-prog[hidden]{display:none}
.mem-sync-prog i{display:block;height:100%;width:0;border-radius:99px;background:var(--primary);transition:width .4s ease}
.mem-off{color:#C2410C}
body.theme-dark .mem-sync{background:#1E2027;border-color:#2E3240}
body.theme-dark .mem-sync-prog{background:rgba(255,255,255,.12)}

/* ---------- 城市管理（设置 → 城市管理） ---------- */
.city-badge{display:inline-block;padding:1px 9px;border-radius:20px;font-size:12px;line-height:20px;
  border:1px solid var(--border);background:var(--panel);color:var(--text)}
.city-badge.ok{color:#137A46;border-color:#9AD3B4;background:rgba(19,122,70,.09)}
.city-badge.wait{color:#A86B00;border-color:#E5C07B;background:rgba(168,107,0,.09)}
.city-badge.bad{color:#C0392B;border-color:#E6A6A0;background:rgba(192,57,43,.09)}
.city-err{color:#C0392B;font-size:12px}
body.theme-dark .city-badge.ok{color:#7FDCA8;border-color:#2F6B4B;background:rgba(127,220,168,.12)}
body.theme-dark .city-badge.wait{color:#F0C674;border-color:#6B5324;background:rgba(240,198,116,.12)}
body.theme-dark .city-badge.bad{color:#F08A80;border-color:#6B2F2A;background:rgba(240,138,128,.12)}
body.theme-dark .city-err{color:#F08A80}

/* 列表里的「授权模块」单元格：没配过的城市显示「全部 N 个 / 未限制」，配过的显示缺哪几个 */
.city-mod{font-weight:600;color:var(--text);font-variant-numeric:tabular-nums}
.city-mod.all{font-weight:500;color:var(--text-2)}
.city-miss{margin-left:7px;font-size:11.5px;color:#A86B00}
.city-miss.none{color:var(--text-3)}
body.theme-dark .city-miss{color:#F0C674}
.city-ops{white-space:nowrap;text-align:right}
.city-table td{vertical-align:middle}

/* ---------- 城市授权抽屉（设置 → 城市管理 → 授权） ----------
   和会员详情抽屉同一种形态：悬浮岛，不贴边，滑进来。遮罩直接在 innerHTML 里插入，
   入场靠 animation，所以不需要 .open 类。 */
.city-mask{
  position:fixed;inset:0;z-index:230;background:rgba(20,24,35,.38);
  backdrop-filter:blur(2px);animation:cityMaskIn .18s ease both;
}
@keyframes cityMaskIn{from{opacity:0}to{opacity:1}}
.city-drawer{
  position:fixed;top:14px;right:14px;bottom:14px;z-index:231;width:min(430px,94vw);
  background:var(--panel);border:1px solid var(--border);border-radius:16px;
  box-shadow:0 24px 70px rgba(17,20,30,.26);
  display:flex;flex-direction:column;overflow:hidden;
  animation:cityDrIn .26s cubic-bezier(.22,1,.36,1) both;
}
@keyframes cityDrIn{from{opacity:0;transform:translateX(28px)}to{opacity:1;transform:none}}
.cd-head{
  flex:none;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  padding:15px 18px;border-bottom:1px solid var(--border);
}
.cd-t{font-size:15px;font-weight:700;color:var(--text)}
.cd-s{margin-top:3px;font-size:12px;color:var(--text-3)}
.cd-x{
  flex:none;width:28px;height:28px;border:0;border-radius:8px;background:transparent;
  color:var(--text-3);font-size:14px;cursor:pointer;line-height:1;
}
.cd-x:hover{background:rgba(120,130,150,.14);color:var(--text)}
.cd-hint{
  flex:none;padding:10px 18px;font-size:11.5px;line-height:1.7;color:var(--text-3);
  background:rgba(120,130,150,.05);border-bottom:1px solid var(--border);
}
.cd-body{flex:1;overflow-y:auto;padding:8px 10px}
.cd-foot{
  flex:none;display:flex;align-items:center;gap:8px;
  padding:12px 18px;border-top:1px solid var(--border);
}
.cd-note{flex:1;font-size:11px;line-height:1.5;color:var(--text-3)}

/* 模块树 */
.cm-block{border-radius:10px}
.cm-block.open{background:rgba(120,130,150,.05)}
.cm-row{display:flex;align-items:center;gap:9px;padding:8px;border-radius:9px}
.cm-row:hover{background:rgba(120,130,150,.07)}
.cm-name{flex:1;font-size:13.5px;color:var(--text);overflow-wrap:anywhere}
.cm-name.dim{color:var(--text-3)}
.cm-n{flex:none;font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
.cm-n.half{color:#A86B00}
body.theme-dark .cm-n.half{color:#F0C674}
.cm-more{
  flex:none;border:0;background:transparent;border-radius:6px;padding:2px 6px;
  font-size:11.5px;color:var(--text-3);cursor:pointer;
}
.cm-more:hover{color:var(--primary);background:rgba(120,130,150,.12)}
.cm-more.ghost{visibility:hidden}
.cm-subs{padding:0 8px 7px 34px;display:flex;flex-direction:column;gap:1px}
.cm-sub{display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:7px}
.cm-sub:hover{background:rgba(120,130,150,.06)}
.cm-tag{
  flex:none;font-size:10.5px;line-height:16px;padding:0 6px;border-radius:6px;
  color:var(--text-3);background:rgba(120,130,150,.14);
}
/* 自制复选框：17px 圆角方框，勾=主色+白对勾，半选=主色+白横杠 */
.cm-cb{
  flex:none;width:17px;height:17px;border-radius:5px;position:relative;cursor:pointer;
  border:1.5px solid #C3C9D6;background:var(--panel);transition:background .14s,border-color .14s;
}
.cm-cb.sm{width:15px;height:15px;border-radius:4px}
.cm-cb:hover{border-color:var(--primary)}
.cm-cb[data-state="on"],.cm-cb[data-state="half"]{background:var(--primary);border-color:var(--primary)}
.cm-cb[data-state="on"]::after{
  content:"";position:absolute;left:4px;top:4.5px;width:7px;height:3.5px;
  border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg);
}
.cm-cb.sm[data-state="on"]::after{left:3.5px;top:4px;width:6px;height:3px}
.cm-cb[data-state="half"]::after{
  content:"";position:absolute;left:3.5px;top:6px;width:8px;height:2px;
  border-radius:1px;background:#fff;
}
.cm-cb.sm[data-state="half"]::after{left:3px;top:5px;width:7px}
.cm-cb.is-off{opacity:.45;cursor:not-allowed}
.cm-cb.is-off:hover{border-color:#C3C9D6}
.cm-cb:focus-visible{outline:2px solid var(--primary);outline-offset:2px}
body.theme-dark .cm-cb{border-color:#4A5060}
body.theme-dark .city-drawer{border-color:#3A3F4F}
body.theme-dark .cd-x:hover{background:rgba(255,255,255,.08)}


/* ---------- 冷藏行特效：系统减少动态效果时的提示与开关 ---------- */
.stg-fx-motion{
  display:flex;align-items:flex-start;gap:8px;margin-top:8px;
  font-size:12.5px;line-height:1.6;color:var(--text-2);cursor:pointer;
}
.stg-fx-motion input{margin:2px 0 0;flex:none}
.stg-fx-motion b{color:#B45309;font-weight:600}
body.theme-dark .stg-fx-motion b{color:#F0C674}
.stg-fx-motion[hidden]{display:none}

  /* ================= 门店配送围栏规划工作台 =================
     全屏覆盖层：一张地图放所有门店的配送范围，左选门店、右改围栏。
     不放进弹窗，是因为要「一屏看全城」，弹窗再大也局促。 */
  .fn-wb{position:fixed;inset:0;z-index:3000;background:var(--bg);display:flex;flex-direction:column;font-size:13px;color:var(--text)}
  .fn-top{flex:none;height:52px;display:flex;align-items:center;gap:14px;padding:0 14px;background:var(--panel);border-bottom:1px solid var(--border)}
  .fn-title{font-size:15px;font-weight:600;display:flex;align-items:baseline;gap:10px}
  .fn-sub{font-size:12px;font-weight:400;color:var(--text-3)}
  .fn-tools{display:flex;gap:6px;margin-left:8px}
  .fn-tool{
    height:30px;padding:0 12px;border-radius:7px;border:1px solid var(--input-border);
    background:#fff;color:var(--text-2);font-family:inherit;font-size:12.5px;cursor:pointer;
  }
  .fn-tool:hover{border-color:#B9C0CE;color:var(--text)}
  .fn-tool.on{background:var(--primary-soft);border-color:var(--primary);color:var(--primary);font-weight:600}
  .fn-actions{margin-left:auto;display:flex;align-items:center;gap:8px}
  .fn-dirty{font-size:12px;color:#B45309;background:#FEF3C7;border-radius:6px;padding:3px 8px}
  .fn-btn{
    height:32px;padding:0 14px;border-radius:7px;border:1px solid var(--input-border);
    background:#fff;color:var(--text-2);font-family:inherit;font-size:13px;cursor:pointer;
  }
  .fn-btn:hover{border-color:#B9C0CE;color:var(--text)}
  .fn-btn.primary{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:500}
  .fn-btn.primary:hover{background:var(--primary-hover)}
  .fn-btn:disabled{opacity:.55;cursor:not-allowed}
  .fn-btn.block{width:100%;margin-top:10px}

  .fn-main{flex:1;display:flex;min-height:0}
  .fn-stores{flex:none;width:200px;background:var(--panel);border-right:1px solid var(--border);padding:12px 10px;overflow:auto}
  .fn-stores-h{font-size:12px;color:var(--text-3);margin-bottom:8px}
  .fn-stores-list{display:flex;flex-direction:column;gap:3px}
  .fn-store{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:7px;cursor:pointer;border:1px solid transparent}
  .fn-store:hover{background:#F7F8FC}
  .fn-store.on{background:var(--primary-soft);border-color:#D9CCFB}
  .fn-store i{flex:none;width:9px;height:9px;border-radius:3px}
  .fn-store .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}
  .fn-store.on .nm{color:var(--primary);font-weight:600}
  .fn-store .st{flex:none;font-size:11.5px;color:var(--text-3)}
  .fn-store .st.none{color:#C2410C}
  .fn-empty{font-size:12.5px;color:var(--text-3);padding:10px 4px;line-height:1.6}
  .fn-tip-h{font-size:12px;color:var(--text-3);margin:14px 0 6px}
  .fn-check{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--text-2);padding:4px 2px;cursor:pointer}
  .fn-check input{accent-color:var(--primary)}

  .fn-mapbox{flex:1;position:relative;min-width:0}
  .fn-map{position:absolute;inset:0;background:#EEF0F4}
  /* 放左下角：左上角是 Leaflet 的缩放按钮，压上去会点不到 */
  .fn-badge{
    position:absolute;left:12px;bottom:12px;z-index:500;background:rgba(255,255,255,.94);
    border:1px solid var(--border);border-radius:8px;padding:6px 10px;font-size:12px;color:var(--text-2);
    box-shadow:0 4px 12px rgba(20,24,35,.08);max-width:70%;
  }

  .fn-side{flex:none;width:246px;background:var(--panel);border-left:1px solid var(--border);padding:12px;overflow:auto}
  .fn-side-h{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;margin-bottom:10px}
  .fn-side-h i{width:10px;height:10px;border-radius:3px}
  .fn-side-n{margin-left:auto;font-size:11.5px;font-weight:400;color:var(--text-3)}
  .fn-side-empty{font-size:12.5px;color:var(--text-3);line-height:1.8;text-align:center;padding:40px 6px}
  .fn-side-empty span{font-size:11.5px;color:#B7BDC8}
  .fn-side-empty.sm{padding:16px 6px;background:#FAFBFD;border-radius:8px;text-align:left;padding-left:10px}
  .fn-fence-list{display:flex;flex-direction:column;gap:6px}
  .fn-fence{border:1px solid var(--border);border-radius:8px;padding:8px 9px;cursor:pointer;background:#fff}
  .fn-fence:hover{border-color:#D8DCE6}
  .fn-fence.on{border-color:var(--primary);background:var(--primary-soft)}
  .fn-fence-top{display:flex;align-items:center;gap:6px}
  .fn-fence-name{
    flex:1;min-width:0;border:1px solid transparent;background:transparent;border-radius:5px;
    font-family:inherit;font-size:13px;font-weight:600;color:var(--text);padding:2px 4px;
  }
  .fn-fence.on .fn-fence-name{color:var(--primary)}
  .fn-fence-name:hover{border-color:var(--border);background:#fff}
  .fn-fence-name:focus{outline:none;border-color:var(--input-border);background:#fff}
  .fn-fence-del{
    flex:none;width:20px;height:20px;border:none;background:transparent;color:var(--text-3);
    cursor:pointer;border-radius:4px;font-size:12px;line-height:1;
  }
  .fn-fence-del:hover{background:#FEE2E2;color:var(--danger)}
  .fn-fence-sub{display:flex;gap:5px;font-size:11.5px;color:var(--text-3);margin-top:4px;padding-left:4px}
  .fn-fence-on{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--text-2);margin-top:6px;padding-left:4px;cursor:pointer}
  .fn-fence-on input{accent-color:var(--primary)}
  .fn-warn{margin-top:10px;font-size:12px;line-height:1.65;color:#92400E;background:#FFFBEB;border:1px solid #FDE68A;border-radius:8px;padding:8px 10px}
  .fn-warn.over b{display:block;margin-bottom:3px;color:#B91C1C}
  .fn-warn.over span{color:#7F1D1D;font-size:11.5px}

  .fn-foot{
    flex:none;height:36px;display:flex;align-items:center;gap:12px;padding:0 14px;
    background:var(--panel);border-top:1px solid var(--border);font-size:12px;color:var(--text-3);
  }
  .fn-foot-r{margin-left:auto}

  /* 地图上的顶点 / 中点 / 门店标签（Leaflet divIcon） */
  .fn-vtx span{
    display:block;width:12px;height:12px;border-radius:50%;background:#fff;
    border:2.5px solid #185FA5;box-shadow:0 1px 4px rgba(20,24,35,.3);cursor:grab;
  }
  .fn-vtx.first span{background:#185FA5;border-color:#fff}
  .fn-mid span{
    display:block;width:9px;height:9px;border-radius:50%;background:#fff;
    border:1px solid #7AA6D6;opacity:.65;cursor:copy;transition:opacity .15s,transform .15s;
  }
  .fn-mid:hover span{opacity:1;transform:scale(1.4)}
  .fn-pin b{
    position:absolute;left:0;top:0;transform:translate(-50%,-50%);white-space:nowrap;
    background:#fff;border:1px solid #D8DCE6;border-radius:6px;padding:2px 7px;
    font-size:11.5px;font-weight:500;color:var(--text);box-shadow:0 2px 8px rgba(20,24,35,.14);
  }
  .fn-pin.on b{border-color:var(--primary);color:var(--primary);box-shadow:0 2px 10px rgba(124,58,237,.28)}
  .fn-pin.off b{opacity:.5}
  .fn-tip{
    background:rgba(31,36,48,.86);border:none;color:#fff;font-size:11.5px;
    padding:3px 8px;border-radius:5px;box-shadow:none;
  }
  .fn-tip::before{display:none}

  /* ===== 订单设置 · 会员价对应（黄金→会员价1 / 普通→会员价2） ===== */
  .stg-mp-row{
    display:flex;align-items:center;gap:14px;padding:12px 14px;margin-bottom:10px;
    border:1px solid var(--border);border-radius:10px;background:#fff;
  }
  .stg-mp-l{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
  .stg-mp-l b{font-size:13.5px;color:var(--text)}
  .stg-mp-d{font-size:12px;color:var(--text-3)}
  .stg-mp-row select.po-in{width:200px;flex:none}
  /* 积分设置：比例 / 上限这种「数字 + 单位」的行，右侧是一组小输入 */
  .stg-point-inline{display:flex;align-items:center;gap:8px;flex:none}
  .stg-point-inline .po-in{width:104px}
  .stg-point-inline .u{font-size:12.5px;color:var(--text-3);white-space:nowrap}
  /* 深色下这三条规则行原先是白底（.stg-mp-row 写死了 #fff），跟卡片一个颜色才对 */
  body.theme-dark .stg-mp-row{background:#22252E;border-color:#2E3140}

  /* ===== 订单设置 · 运力计算 =====
     上半是口径开关，下半是「各门店当前运力」预览表。
     预览必须一眼看出「哪家店没人」，所以 0 人的行整行淡红、人数标红；
     其余数字用等宽数字，刷新时不跳动。 */
  .stg-cap-preview{margin-top:18px;border:1px solid var(--border);border-radius:10px;background:#fff;overflow:hidden}
  .stg-cap-prev-head{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--border);background:#FAFBFD}
  .stg-cap-prev-t{font-size:13px;font-weight:700;color:var(--text)}
  .stg-cap-prev-at{flex:1;min-width:0;font-size:11.5px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .stg-cap-prev-head .btn{flex:none;height:28px;padding:0 12px;font-size:12px}
  .stg-cap-list{max-height:320px;overflow:auto}
  .stg-cap-empty{padding:22px 14px;text-align:center;font-size:12.5px;color:var(--text-3)}
  .stg-cap-empty.is-err{color:#DC2626}
  .stg-cap-table{width:100%;border-collapse:collapse;font-size:12.5px}
  .stg-cap-table th{
    position:sticky;top:0;z-index:1;background:#F7F8FC;color:var(--text-3);font-weight:500;
    text-align:left;padding:8px 10px;border-bottom:1px solid var(--border);white-space:nowrap;font-size:11.5px;
  }
  .stg-cap-table td{padding:8px 10px;border-bottom:1px solid #F3F4F8;color:var(--text-2);vertical-align:middle}
  .stg-cap-table tr:last-child td{border-bottom:none}
  .stg-cap-shop{color:var(--text);font-weight:600;white-space:nowrap}
  .stg-cap-n{font-variant-numeric:tabular-nums;white-space:nowrap}
  .stg-cap-n b{font-size:14px;color:var(--text)}
  .stg-cap-n.mut{color:var(--text-3)}
  .stg-cap-who{font-size:12px;color:var(--text-2);line-height:1.9}
  .stg-cap-who i{
    font-style:normal;margin-left:3px;padding:0 5px;border-radius:8px;
    background:rgb(var(--primary-rgb) / .10);color:var(--primary);font-size:10.5px;
  }
  .stg-cap-none{color:var(--text-3)}
  .stg-cap-table tr.is-zero{background:rgba(220,38,38,.045)}
  .stg-cap-table tr.is-zero .stg-cap-n b{color:#DC2626}
  body.theme-dark .stg-cap-preview{background:#22252E;border-color:#2E3140}
  body.theme-dark .stg-cap-prev-head{background:#1C1F27;border-color:#2E3140}
  body.theme-dark .stg-cap-table th{background:#1C1F27;border-color:#2E3140}
  body.theme-dark .stg-cap-table td{border-color:#2A2D38}
  body.theme-dark .stg-cap-table tr.is-zero{background:rgba(248,113,113,.08)}
  body.theme-dark .stg-cap-table tr.is-zero .stg-cap-n b{color:#F87171}

  /* ===== 订单设置 · 通知声音 =====
     每行是「开关 + 名字与说明 + 音色 + 试听」。开关关掉时整行压暗但不禁用 ——
     还能试听、还能改音色，只是接单时不会响，改完再打开就行。 */
  .stg-notify-list{display:flex;flex-direction:column;gap:10px;margin-top:4px}
  .stg-notify-row{
    display:flex;align-items:center;gap:14px;padding:12px 14px;
    border:1px solid var(--border);border-radius:10px;background:#fff;
    transition:opacity .15s;
  }
  .stg-notify-row .stg-notify-name{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
  .stg-notify-row .stg-notify-name b{font-size:13.5px;color:var(--text)}
  .stg-notify-row .stg-notify-name i{font-style:normal;font-size:12px;color:var(--text-3)}
  .stg-notify-row select.po-in{width:220px;flex:none}
  .stg-notify-row .btn{flex:none;min-width:64px}
  #pNotify.is-mute .stg-notify-row{opacity:.55}
  .stg-notify-vol{display:flex;align-items:center;gap:10px;flex:none;width:260px}
  .stg-notify-vol input[type=range]{flex:1;accent-color:var(--primary,#7C3AED);cursor:pointer}
  .stg-notify-vol b{width:44px;text-align:right;font-size:13px;font-variant-numeric:tabular-nums;color:var(--text-2)}
  /* ===== 循环播放 =====
     一块浅底把「开关 + 次数间隔 + 两个停止条件」框在一起：
     它们是一件事（响多久），散在音量下面会被当成三个无关设置。 */
  .stg-loop{
    margin:16px 0 4px;padding:14px 16px 6px;border-radius:12px;
    background:rgba(217,119,6,.05);border:1px solid rgba(217,119,6,.18);
  }
  /* 里面的开关行不再套一层卡片：外层已经有底有边，再套一层就是"俄罗斯套娃"，
     而且和下面两行复选框（透明底）对不齐 */
  .stg-loop > .stg-switch-row{
    padding:2px 0 14px;background:transparent;border:0;border-radius:0;
  }
  .stg-loop-in{display:flex;align-items:center;gap:8px;flex:none}
  .stg-loop-in .po-in{width:74px;text-align:center;font-variant-numeric:tabular-nums}
  .stg-loop-in span{font-size:13px;color:var(--text-2,#64748B);white-space:nowrap}
  .stg-loop-chk{
    display:flex;align-items:flex-start;gap:10px;padding:10px 0 12px;
    border-top:1px dashed rgba(217,119,6,.2);cursor:pointer;user-select:none;
  }
  .stg-loop-chk input{width:15px;height:15px;margin:2px 0 0;flex:none;accent-color:var(--primary,#7C3AED);cursor:pointer}
  .stg-loop-chk span{display:flex;flex-direction:column;gap:3px;min-width:0}
  .stg-loop .stg-loop-chk b{font-size:13px;font-weight:600;color:var(--text,#1f2a37)}
  .stg-loop .stg-loop-chk i{font-style:normal;font-size:12px;line-height:1.6;color:var(--text-3,#94A3B8)}
  /* ===== 自定义音效（上传的音频）=====
     列表默认隐藏，传过才有；每行是「名字 · 格式·大小·时长 · 用在哪 · 试听/删除」 */
  .stg-nf-box{
    margin-top:14px;padding:12px 14px;border:1px dashed var(--border);border-radius:10px;
    background:rgba(124,58,237,.03);
  }
  .stg-nf-box-h{display:flex;flex-direction:column;gap:3px;margin-bottom:10px}
  .stg-nf-box-h b{font-size:13px;color:var(--text)}
  .stg-nf-box-h span{font-size:12px;color:var(--text-3);line-height:1.55}
  .stg-nf-list{display:flex;flex-direction:column;gap:8px}
  .stg-nf-item{
    display:flex;align-items:center;gap:10px;padding:8px 10px;
    border:1px solid var(--border);border-radius:8px;background:#fff;
  }
  .stg-nf-nm{
    font-size:13px;color:var(--text);max-width:240px;flex:none;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .stg-nf-mt{
    flex:1;min-width:0;font-size:11.5px;color:var(--text-3);
    font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .stg-nf-item .btn{flex:none;min-width:56px}
  .stg-nf-del.is-armed{color:#DC2626;border-color:#FCA5A5;background:#FEF2F2}
  body.theme-dark .stg-nf-item{background:#22252E;border-color:#2E3140}
  body.theme-dark .stg-nf-box{background:rgba(124,58,237,.06);border-color:#2E3140}
  body.theme-dark .stg-nf-del.is-armed{background:#3A2222;border-color:#7F3A3A;color:#FCA5A5}
  body.theme-dark .stg-notify-row{background:#22252E;border-color:#2E3140}
  @media (max-width:900px){
    .stg-notify-row{flex-wrap:wrap}
    .stg-notify-row select.po-in{width:100%}
    .stg-notify-vol{width:100%}
  }

  /* ===== 版本水印与「有新版本」提示 =====
     背景：F5 曾被拦截成软刷新，js/css 不重载，用户怎么刷都是旧页面。
     现在页面显示构建号，服务器版本一变就弹提示，省得再靠猜。 */
  .lp-ver{margin-left:8px;font-size:11.5px;color:var(--text-3);opacity:.75;font-variant-numeric:tabular-nums}
  .side-ver{
    padding:6px 12px 2px;font-size:10.5px;line-height:1.4;color:var(--text-3);
    opacity:.6;font-variant-numeric:tabular-nums;letter-spacing:.02em;user-select:text;
  }
  .side-ver:hover{opacity:1}

  .upd-bar{
    position:fixed;right:20px;bottom:20px;z-index:4000;
    display:flex;align-items:center;gap:10px;
    padding:10px 12px 10px 14px;border-radius:12px;
    background:#1F2430;color:#fff;box-shadow:0 10px 30px rgba(16,20,30,.28);
    font-size:13px;animation:updIn .28s cubic-bezier(.2,.8,.3,1);
  }
  @keyframes updIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
  .upd-ico{font-size:15px;line-height:1}
  .upd-txt{color:#E8EAF0}
  .upd-btn{
    height:28px;padding:0 12px;border-radius:7px;border:none;cursor:pointer;
    background:#fff;color:#1F2430;font-family:inherit;font-size:12.5px;font-weight:600;
  }
  .upd-btn:hover{background:#EDEFF5}
  .upd-x{
    width:22px;height:22px;border:none;background:transparent;color:#9AA1B2;
    cursor:pointer;font-size:15px;line-height:1;border-radius:5px;padding:0;
  }
  .upd-x:hover{background:rgba(255,255,255,.12);color:#fff}

  @media (prefers-reduced-motion: reduce){
    .upd-bar{animation:none}
  }

  /* ============================================================
     收银台（#/cashier/*）
     独立界面：主站布局整体隐藏，自己一套「悬浮岛」多栏布局。
     版面照 2026-11-03 的线框图：
       左 导航窄岛（108px，与主站一级菜单同宽，图标在上、文字在下）
       中 商品筛选大岛 + 底部会员信息横条
       右 销售任务小岛 + 购物清单长岛
     四块都是 .csh-panel：半透明 + 毛玻璃 + 16px 圆角 + 12px 间距，
     和主站 .sidebar / .subbar-island 完全一套，换主色、切暗色都跟着变。
     字比主站大一号、点击区更宽 —— 收银员是站着、一边说话一边点的。
     ============================================================ */
  body.cashier-mode .layout,
  body.cashier-mode #pageBg{display:none !important}

  .csh-root{
    position:fixed;inset:0;z-index:2500;display:flex;gap:12px;padding:12px;
    font-size:14px;color:var(--text);
    /* 背景给两团主色柔光：悬浮岛是半透明的，底下纯平色会「糊成一片」看不出层次 */
    background:
      radial-gradient(1100px 620px at 6% -12%, rgb(var(--primary-rgb) / .12), transparent 62%),
      radial-gradient(900px 520px at 96% 112%, rgb(var(--primary-rgb) / .10), transparent 58%),
      var(--bg);
  }

  /* ---- 悬浮岛（与主站 .island 同一套语言） ---- */
  .csh-panel{
    background:rgba(255,255,255,.78);
    -webkit-backdrop-filter:blur(18px) saturate(150%);
    backdrop-filter:blur(18px) saturate(150%);
    border:1px solid rgba(255,255,255,.55);
    box-shadow:0 10px 30px rgba(20,24,35,.10);
    border-radius:16px;
    min-height:0;min-width:0;
  }
  body.theme-dark .csh-panel{
    background:rgba(35,38,47,.78);
    border-color:rgba(255,255,255,.08);
    box-shadow:0 10px 30px rgba(0,0,0,.35);
  }

  /* ---- 左侧导航岛 ---- */
  .csh-side{
    flex:none;width:108px;display:flex;flex-direction:column;
    padding:14px 8px 10px;overflow:hidden;
  }
  .csh-brand{display:flex;flex-direction:column;align-items:center;gap:6px;padding:2px 0 14px}
  .csh-logo{
    width:36px;height:36px;border-radius:12px;flex:none;
    background:linear-gradient(135deg,rgb(var(--primary-rgb) / .88),var(--primary-hover));
    color:#fff;display:flex;align-items:center;justify-content:center;font-size:17px;font-weight:700;
    box-shadow:0 6px 16px rgb(var(--primary-rgb) / .35);
  }
  /* 上传的收银台头像：铺满方形、去掉渐变底（图里自带配色） */
  .csh-logo-img{object-fit:cover;background:#fff;display:block}
  .csh-brand-t{font-size:11.5px;font-weight:600;color:var(--text-2);letter-spacing:.04em}
  .csh-navs{display:flex;flex-direction:column;gap:4px}
  /* 三个功能收银员天天点，图标是多余的一层识别。
     2026-11-05：名字下面加了快捷键键帽（Alt+1/2/3），所以从横排改竖排。 */
  .csh-nav{
    display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
    height:52px;border-radius:11px;cursor:pointer;color:var(--text-2);user-select:none;
    font-size:13px;font-weight:500;letter-spacing:.01em;white-space:nowrap;
    transition:background .12s,color .12s,box-shadow .12s;
  }
  .csh-nav-n{line-height:1.1}
  .csh-nav .kb{margin-left:0;min-width:16px;height:15px;padding:0 4px;font-size:10px;opacity:.7}
  .csh-nav.on .kb{border-color:rgba(255,255,255,.5);background:rgba(255,255,255,.18);color:#fff;opacity:.95}
  .csh-nav:hover{background:rgb(var(--primary-rgb) / .07);color:var(--text)}
  .csh-nav.on{
    background:var(--primary);color:#fff;font-weight:600;
    box-shadow:0 6px 16px rgb(var(--primary-rgb) / .32);
  }

  /* 门店选择放在导航岛底部：三栏里只有它属于「全局上下文」，跟导航一起才对。
     「门店」两个字去掉了：下拉本身就是店名，标签是重复信息。
     2026-11-04：它上面多了一个「快捷键」按钮，两者一起贴在岛底（.csh-side-btm）。 */
  .csh-side-btm{margin-top:auto;display:flex;flex-direction:column;gap:6px}
  /* 快捷键入口：竖排两行（⌨ 快捷键 / Alt+H），和「收单·订单·流水」同宽同圆角，
     虚线描边表示「这是个入口，不是当前页」 */
  .csh-side-kb{
    display:flex;flex-direction:column;align-items:center;gap:3px;
    padding:7px 4px 6px;border-radius:10px;
    border:1px dashed var(--border);background:transparent;
    color:var(--text-2);font-family:inherit;font-size:11.5px;line-height:1.2;cursor:pointer;
    transition:background .12s,color .12s,border-color .12s;
  }
  .csh-side-kb:hover{
    background:rgb(var(--primary-rgb) / .07);color:var(--text);
    border-color:rgb(var(--primary-rgb) / .38);
  }
  .csh-side-kb-l{display:inline-flex;align-items:center;gap:3px;white-space:nowrap}
  .csh-side-kb-i{font-size:11.5px;line-height:1;opacity:.9}
  .csh-side-kb .kb{margin-left:0;height:16px;font-size:10px;opacity:.85}
  .csh-side-store{display:flex;flex-direction:column;padding:0 2px 4px}
  .csh-side-lab{font-size:10.5px;color:var(--text-3);letter-spacing:.04em}
  .csh-store-sel{
    width:100%;height:30px;padding:0 4px;border-radius:8px;border:1px solid var(--input-border);
    background:#fff;font-family:inherit;font-size:11.5px;color:var(--text);cursor:pointer;
    text-overflow:ellipsis;
  }
  body.theme-dark .csh-store-sel{background:#23252E}
  /* 绑店账号：门店下拉禁用，视觉上「这台机器就是这个店」 */
  .csh-store-sel.is-locked,
  .csh-store-sel:disabled{
    background:#EEF2F7; color:var(--text-2,#475569); cursor:not-allowed; opacity:1;
  }
  body.theme-dark .csh-store-sel.is-locked,
  body.theme-dark .csh-store-sel:disabled{ background:#262A35; color:#A8B0C0; }

  .csh-side-foot{padding-top:8px;border-top:1px solid var(--border)}
  /* 左下角个人中心：直接复用主站 .side-user 的外观（头像 / 姓名 / 角色），
     悬停弹出「个人中心 / 退出登录」；替代原先的「← 返回主站」 */
  .csh-user{margin:0;padding:8px 2px 2px}
  .csh-ver{padding:2px 0 0;text-align:center;font-size:10px;color:var(--text-3);letter-spacing:.02em}

  /* 个人设置抽屉：收银台整层是 z-index 2500，抽屉必须抬到它上面才看得见。
     内容与「设置 → 个人设置」共用 personalSettingsHTML()，但抽屉传 hidePhoneBg：
     「接单页背景」调的是电话接单页的背景，收银员在收银台用不到，摆了只会误点。 */
  body.cashier-mode .pp-drawer-mask{z-index:2600}
  .pp-drawer-mask .setting-card{border:0;background:transparent;padding:0;border-radius:0}
  .pp-drawer-mask .mem-d-body{padding:16px 20px 24px}

  /* ---- 右侧主体：单一视口，里面按 tab 各自摆岛 ---- */
  .csh-main{flex:1;display:flex;min-width:0;min-height:0}

  /* ---- 点单页网格：中栏四块，右栏一块 ---- */
  .csh-pos{
    flex:1;display:grid;gap:12px;min-width:0;min-height:0;
    grid-template-columns:minmax(0,1fr) 384px;
    /* 中栏四行：商品（吃掉剩余高度）→ 销售任务 → 配送地址 → 会员信息，后三条按内容高。
       2026-11-06：销售任务原来是右栏第一块（竖排 5 行、384 宽），
       用户要求挪到商品区与配送地址之间 —— 商品区自然收上去，
       任务卡改成整条左栏宽（横排网格），右栏只剩购物清单拉满。 */
    grid-template-rows:minmax(0,1fr) auto auto auto;
  }
  .csh-pos--board{grid-template-rows:minmax(0,1fr)}
  .csh-pos--board .csh-board{grid-column:1;grid-row:1}
  .csh-pos--board .csh-detail{grid-column:2;grid-row:1}

  /* ---- 商品筛选岛 ---- */
  .csh-goods{grid-column:1;grid-row:1;display:flex;flex-direction:column;padding:14px 14px 10px}
  .csh-search{display:flex;align-items:center;gap:10px;margin-bottom:10px}
  .csh-search .po-in{flex:1;height:38px;font-size:14px;max-width:none}
  .csh-search-n{font-size:12px;color:var(--text-3);white-space:nowrap}
  .csh-cats{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px;max-height:66px;overflow:auto}
  .csh-cat{
    height:28px;padding:0 11px;border-radius:14px;border:1px solid var(--input-border);
    background:#fff;font-family:inherit;font-size:12.5px;color:var(--text-2);cursor:pointer;
    display:inline-flex;align-items:center;gap:5px;white-space:nowrap;
  }
  body.theme-dark .csh-cat{background:#23252E}
  .csh-cat:hover{border-color:#C3C9D6}
  .csh-cat.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
  .csh-cat i{font-style:normal;font-size:10.5px;opacity:.6}

  .csh-grid{
    flex:1;overflow:auto;display:grid;align-content:start;
    /* 有图之后单卡要 170px 才放得下「图 + 两行名字」，格子给窄了名字会被裁。
       2026-11-08 加到 206px：用户反馈商品名被截得太狠（「农夫山泉东方树叶青柑…」）。
       代价是同样屏宽少一列 —— 名字看得全比多看一个商品更要紧，认错货的成本高得多。 */
    grid-template-columns:repeat(auto-fill,minmax(206px,1fr));gap:8px;padding:2px 2px 8px;
  }
  .csh-card{
    position:relative;              /* 收藏星星绝对定位到右上角 */
    display:flex;align-items:stretch;gap:9px;
    /* 104px = 两行名字(35) + 价格(18) + 底部行(20，含冷藏开关按钮) + 间距 + 上下内边距。
       底部行那 20px 是被「冷藏有货」按钮撑起来的：96 时代只有 15px 高的库存文字，
       加按钮后不抬高基准高度，flex 就会从名字那里抢高度，第二行只剩半截。 */
    min-height:104px;padding:10px 10px;border-radius:11px;border:1px solid var(--border);
    background:#fff;font-family:inherit;text-align:left;cursor:pointer;
    transition:border-color .12s,box-shadow .12s,transform .06s;
  }
  body.theme-dark .csh-card{background:#23252E}
  .csh-card:hover{border-color:#CFD5E2;box-shadow:0 4px 14px rgba(20,24,35,.07)}
  .csh-card:active{transform:scale(.985)}
  /* 收藏页拖动排序（2026-11-06）：卡片可拖，右上角星星照旧可点。
     图上必须关掉指针事件与原生拖拽，否则按下就变成「拖一张图片」，卡片收不到 pointermove。 */
  .csh-grid.is-sortable .csh-card.is-movable{cursor:grab;user-select:none;-webkit-user-select:none}
  .csh-grid.is-sortable .csh-card.is-movable img{-webkit-user-drag:none;pointer-events:none}
  .csh-grid.is-sortable .csh-card.is-movable:active{transform:none}
  /* 被提起来的那张卡留在原地当**空位**：虚线框 + 主色淡底，内容淡掉但格子不塌，
     「放回哪里」这件事在整个拖动过程中一直看得见。 */
  .csh-grid.is-sortable .csh-card.is-hold{
    cursor:grabbing;background:rgb(var(--primary-rgb) / .07);box-shadow:none;
    border-color:transparent;                 /* 换成 outline：虚线不占布局，卡片不会因为描边变胖 */
    outline:2px dashed rgb(var(--primary-rgb) / .6);outline-offset:-2px;
    animation:csh-hold-breathe 1.5s ease-in-out infinite;
  }
  .csh-card.is-hold > *{opacity:0;transition:opacity .12s}
  @keyframes csh-hold-breathe{
    0%,100%{outline-color:rgb(var(--primary-rgb) / .55);background:rgb(var(--primary-rgb) / .06)}
    50%{outline-color:rgb(var(--primary-rgb) / .9);background:rgb(var(--primary-rgb) / .11)}
  }
  /* 跟随指针的浮层：轻放大 + 轻微倾斜 + 悬浮阴影 —— 「提起来」就是这三样给出来的。
     外层只管位移（即时跟手，不加过渡），内层管缩放与旋转（有过渡，落下时才收得柔）。 */
  .csh-float{position:fixed;left:0;top:0;z-index:9999;pointer-events:none;will-change:transform}
  .csh-float > .csh-card{
    width:100%;height:100%;margin:0;cursor:grabbing;
    border-color:rgb(var(--primary-rgb) / .55);
    box-shadow:0 24px 52px rgba(18,22,33,.30),0 8px 18px rgba(18,22,33,.18);
    transform:scale(1) rotate(0deg);
    transition:transform 170ms cubic-bezier(.22,1,.36,1),box-shadow 170ms;
  }
  /* 提起态：放大 + 轻微倾斜 + 更深的投影。倾斜只有 2.6°，够像「手里捏着一张卡」，
     再大就晃眼，收银台连续拖十几次会晕。 */
  .csh-float.is-lift > .csh-card{transform:scale(1.075) rotate(-2.6deg)}
  /* 松手归位：外层这时才开过渡，让浮层飞回空位 */
  .csh-float.is-back{transition:transform 200ms cubic-bezier(.22,1,.36,1)}
  body.theme-dark .csh-float > .csh-card{box-shadow:0 24px 52px rgba(0,0,0,.6),0 8px 18px rgba(0,0,0,.45)}
  body.csh-dragging{cursor:grabbing;user-select:none;-webkit-user-select:none}
  /* 拖拽柄：只在收藏页出现，压在商品图左上角的一颗小药丸。
     卡片本身要能点了加购，光靠「按住拖」看不出来能拖；这颗柄是给人看的提示，
     事件仍由整张卡接管（pointer-events:none）。 */
  .csh-drag{
    position:absolute;left:4px;top:4px;width:17px;height:17px;border-radius:5px;
    display:flex;align-items:center;justify-content:center;
    font-size:10px;line-height:1;letter-spacing:-1.5px;
    /* 主色淡底：白卡上是浅蓝、商品图上是同色小标，两边都能看清（纯白在浅色商品图上会隐身） */
    color:var(--primary);background:rgb(var(--primary-rgb) / .12);
    border:1px solid rgb(var(--primary-rgb) / .30);pointer-events:none;
  }
  .csh-card.is-movable:hover .csh-drag{background:rgb(var(--primary-rgb) / .22);border-color:rgb(var(--primary-rgb) / .55)}
  body.theme-dark .csh-drag{background:rgb(var(--primary-rgb) / .22);border-color:rgb(var(--primary-rgb) / .45)}
  /* 商品图：复用商品中心的 .gr-img（含无图时回落 emoji、加载失败自动移除 img） */
  .csh-card-img{width:54px;height:54px;font-size:22px;border-radius:10px;align-self:center}
  .csh-card-info{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:space-between;gap:3px}
  .csh-card-n{
    flex-shrink:0;                  /* 卡片变挤时也绝不压名字 —— 压了第二行只剩半个字 */
    font-size:12.5px;line-height:1.4;color:var(--text);word-break:break-all;
    /* 右上角有收藏星星（22px），名字第一行右侧要让开，否则最后一个字被盖住 */
    padding-right:18px;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  }
  /* 组合主商品的角标：点这张卡出去的是几件货，不是它自己 —— 不标出来会被当成点错 */
  .csh-card-bd{
    display:inline-block;margin-right:4px;padding:0 5px;border-radius:5px;
    font-style:normal;font-size:10.5px;font-weight:700;line-height:16px;vertical-align:1px;
    color:#B45309;background:rgba(245,158,11,.16);border:1px solid rgba(245,158,11,.3);
  }
  body.theme-dark .csh-card-bd{color:#FFC15E;background:rgba(245,158,11,.2);border-color:rgba(245,158,11,.4)}
  /* 「隐藏」小标：商品中心开了隐藏，只影响电话下单的选品弹窗，收银台照常卖。
     用中性灰 + 虚线边（和「组合」的实色标签区分），别抢商品名的注意力。 */
  .csh-card-hid{
    display:inline-block;margin-right:4px;padding:0 5px;border-radius:5px;
    font-style:normal;font-size:10.5px;font-weight:600;line-height:16px;vertical-align:1px;
    color:#5B6675;background:rgba(120,130,150,.1);border:1px dashed rgba(120,130,150,.42);
  }
  body.theme-dark .csh-card-hid{color:#A9B4C4;background:rgba(148,163,184,.08);border-color:rgba(148,163,184,.4)}
  /* 卡片底部一行：左库存、右冷藏开关。
     按钮放这里而不是价格行 —— 价格行要摆 ¥1280.00 + 单位，再加一个「冷藏有货」
     空间就不够了，实测把单位「箱」挤成省略号，等于把「按箱卖」这个关键信息弄丢。 */
  .csh-card-foot{display:flex;align-items:center;gap:6px;min-width:0}
  /* 冷藏缺货开关（2026-11-08）：文字开关。
     未标记是「冷藏有货」（淡描边、无底色，满屏都是也不吵），点一下变红底「冷藏缺货」，再点取消。
     为什么从名字前挪走：原来那里只有一朵 ❄，两个问题 ——
       ① 看不出能点，也看不出当前是「有货」还是「缺货」；
       ② 只有约 18×16，触屏点偏就落回卡片上，等于把商品加进清单。
     现在文字明确、高度 20px，商品名也能整行用满。 */
  .csh-card-co{
    flex-shrink:0;
    padding:0 6px;border-radius:6px;cursor:pointer;white-space:nowrap;
    font-style:normal;font-size:11px;line-height:18px;
    color:#5B7FA6;background:transparent;border:1px solid rgba(62,123,182,.30);
    transition:background .12s,color .12s,border-color .12s;
  }
  .csh-card-co:hover{background:rgba(62,123,182,.10);border-color:rgba(62,123,182,.46)}
  .csh-card-co.is-on{color:#fff;background:#D9433F;border-color:#C63B37;font-weight:700}
  .csh-card-co.is-on:hover{background:#C63B37}
  /* 被标缺货的卡片整体提示一下：颜色别太重，收银台满屏都是卡片 */
  .csh-card.is-coldout{border-color:rgba(217,67,63,.42)}
  body.theme-dark .csh-card-co{color:#9CC0E2;background:transparent;border-color:rgba(143,184,224,.34)}
  body.theme-dark .csh-card-co.is-on{color:#fff;background:#C63B37;border-color:#A8322F}
  /* 库存：只给当前这一页画出来的商品查（见 cashier.js 的 cshLoadStock）。
     flex:1 让它吃掉剩余宽度、按钮靠右贴边；库存文案过长就省略，别把按钮挤变形。 */
  .csh-card-st{
    flex:1;min-width:0;
    font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .csh-card-st.is-zero{color:var(--danger)}
  .csh-card-st.is-mute{color:#C3C9D6}
  /* 库存为 0：卡片先自曝「卖完了」，别等点下去才被拦。点它会给个抖动 + toast */
  .csh-card.is-nostock .csh-card-img{opacity:.4;filter:grayscale(1)}
  .csh-card.is-nostock .csh-card-n{color:var(--text-3)}
  .csh-card.is-deny{animation:cshDeny .42s ease}
  @keyframes cshDeny{
    0%,100%{transform:translateX(0)}
    20%{transform:translateX(-4px)}
    45%{transform:translateX(4px)}
    70%{transform:translateX(-2px)}
  }
  @media (prefers-reduced-motion: reduce){
    .csh-card.is-deny{animation:none;border-color:var(--danger)}
  }
  .csh-card-m{display:flex;align-items:baseline;gap:6px;flex-wrap:nowrap}
  /* 价格是收银员第一眼要看的，绝不缩；单位在极端窄卡上允许省略 */
  .csh-card-m b{flex-shrink:0;font-size:15px;font-weight:700;color:var(--primary);font-variant-numeric:tabular-nums}
  .csh-card-m i{flex-shrink:1;min-width:0;font-style:normal;font-size:11px;color:var(--text-3);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .csh-more{
    grid-column:1/-1;height:38px;border-radius:9px;border:1px dashed var(--input-border);
    background:#fff;font-family:inherit;font-size:12.5px;color:var(--text-2);cursor:pointer;
  }
  .csh-more:hover{border-color:var(--primary);color:var(--primary)}

  .csh-empty{
    grid-column:1/-1;text-align:center;padding:46px 12px;font-size:13px;color:var(--text-3);line-height:1.8;
  }
  .csh-empty span{font-size:12px;color:#BCC2CE}
  .csh-empty.sm{padding:26px 12px}

  /* ---- 中栏底部两条横条：配送地址（上） + 会员信息（下），同尺寸 ---- */
  .csh-membar,.csh-addrbar{
    grid-column:1;display:flex;align-items:center;gap:14px;
    /* 两条横条同高：74px 是会员卡（头像 38 + 边框 + 上下 6）加上条内边距的实际高度，
       配送地址条也按这个高度走，视觉上两条一样厚 */
    padding:11px 16px;min-height:74px;
  }
  .csh-addrbar{grid-row:3;align-items:stretch}
  .csh-membar{grid-row:4}
  .csh-membar-t{flex:none;font-size:12.5px;font-weight:600;color:var(--text-2);letter-spacing:.02em;align-self:center}
  .csh-phone{flex:none;width:186px;height:36px;font-size:13.5px;max-width:none;align-self:center}
  /* 查会员按钮（取代手机号输入框）：收银现场「按一下 → 看见人 → 选」，
     所以它长得像按钮而不是输入框，右边挂 member.focus 的键帽 */
  .csh-mem-btn{
    flex:none;display:inline-flex;align-items:center;justify-content:center;gap:0;
    height:36px;padding:0 14px;border-radius:10px;
    border:1px solid rgb(var(--primary-rgb) / .28);background:rgb(var(--primary-rgb) / .08);
    color:var(--primary);font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;
    transition:background .12s,border-color .12s,transform .12s;
  }
  .csh-mem-btn:hover{background:rgb(var(--primary-rgb) / .16);border-color:rgb(var(--primary-rgb) / .45)}
  .csh-mem-btn:active{transform:translateY(1px)}
  .csh-mem-btn .kb{margin-left:7px}
  /* 会员条与提货卡之间的竖分隔：两个入口互斥（拿提货卡来的人不结账、
     不攒积分），但不分开会被读成同一个功能的两半 */
  .csh-membar-sep{flex:none;width:1px;height:26px;background:var(--border);align-self:center}
  /* 没权限时按钮与分隔线一起藏（见 cashier.js 的 canAct 判断）。
     [hidden] 在这里必须显式写：flex 容器里的子元素一旦被别的规则改成 flex
     就会盖掉浏览器默认的 display:none，这类坑本站踩过多次 */
  .csh-membar-sep[hidden],.csh-mem-btn[hidden]{display:none}
  /* 提货卡按钮：比「查会员」低调一档（中性描边）。它是低频动作，
     不该跟会员抢同一个视觉层级 —— 收银台一天点几十次查会员，核销可能一次都没有 */
  .csh-pk-btn{border-color:var(--border);background:var(--panel);color:var(--text-2)}
  .csh-pk-btn:hover{background:rgb(var(--primary-rgb) / .08);border-color:rgb(var(--primary-rgb) / .35);color:var(--primary)}
  body.theme-dark .csh-pk-btn{background:#262932;border-color:#3A3F4C;color:#C3C9D6}
  body.theme-dark .csh-pk-btn:hover{background:rgb(var(--primary-rgb) / .18);color:#fff}
  .csh-member{
    flex:1;min-width:0;display:flex;align-items:center;
    font-size:12px;color:var(--text-3);
  }
  /* 会员卡：头像 + 姓名/等级/手机 + 两格数字 + 详情。
     原来姓名、等级、余额、积分挤成一行小字，收银台隔一米远读不出来；
     现在余额和积分各自成格、放大加粗，是最常被问的两个数。 */
  .csh-mem{
    flex:1;min-width:0;display:flex;align-items:center;gap:12px;
    padding:6px 12px;border-radius:11px;
    background:rgb(var(--primary-rgb) / .06);
    border:1px solid rgb(var(--primary-rgb) / .14);
  }
  .csh-mem-ava{
    flex:none;width:38px;height:38px;border-radius:50%;display:flex;align-items:center;justify-content:center;
    background:var(--primary);color:#fff;font-size:16px;font-weight:700;letter-spacing:0;
  }
  .csh-mem-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
  .csh-mem-top{display:flex;align-items:center;gap:8px;min-width:0}
  .csh-mem-top b{
    font-size:15px;font-weight:700;color:var(--text);line-height:1.2;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:180px;
  }
  .csh-mem-lv{
    flex:none;font-style:normal;background:var(--primary-soft);color:var(--primary);
    border-radius:5px;padding:1px 7px;font-size:10.5px;font-weight:600;line-height:1.6;
  }
  .csh-mem-sub{font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums;line-height:1.2}
  .csh-mem-stats{flex:none;display:flex;align-items:center}
  .csh-mem-st{
    display:flex;flex-direction:column;align-items:flex-end;gap:1px;padding:0 14px;
    border-left:1px solid rgb(var(--primary-rgb) / .18);
  }
  .csh-mem-st:first-child{border-left:none;padding-left:0}
  .csh-mem-st i{font-style:normal;font-size:10.5px;color:var(--text-3);white-space:nowrap;line-height:1.2}
  .csh-mem-st b{
    font-size:17px;font-weight:700;line-height:1.15;color:var(--text);
    font-variant-numeric:tabular-nums;white-space:nowrap;
  }
  .csh-mem-st b.is-bal{color:var(--ok)}
  .csh-mem-st b.is-pt{color:var(--primary)}
  .csh-mem-st b.is-zero{color:var(--text-3)}
  .csh-mem-none{color:var(--text-3);font-size:12.5px}
  .csh-mem-loading{color:var(--primary);font-size:12.5px}
  /* 点会员卡开详情抽屉（与「档案 → 会员」同一个抽屉） */
  .csh-member.is-link{cursor:pointer}
  .csh-member.is-link:hover .csh-mem{border-color:rgb(var(--primary-rgb) / .34)}
  .csh-mem-go{flex:none;font-size:11.5px;color:var(--primary);white-space:nowrap;padding-left:2px}
  .csh-member.is-link:hover .csh-mem-go{text-decoration:underline}
  body.cashier-mode .mem-drawer-mask{z-index:2600}

  /* ---- 配送地址条：空态是一个按钮，填过之后是卡片 ---- */
  .csh-addr{flex:1;min-width:0;display:flex;align-items:center}
  /* 地址块与「他的地址」并排：地址占满剩余宽度，按钮固定不缩 */
  .csh-addr-slot{flex:1;min-width:0;display:flex;align-items:center}
  .csh-addr-his{
    flex:none;height:46px;padding:0 13px;margin-left:8px;
    display:inline-flex;align-items:center;gap:5px;white-space:nowrap;
    border:1px solid var(--input-border);border-radius:11px;background:transparent;
    font-family:inherit;font-size:12.5px;color:var(--text-2);cursor:pointer;
    transition:border-color .12s,color .12s,background .12s;
  }
  .csh-addr-his:hover:not([disabled]){border-color:var(--primary);color:var(--primary);background:rgb(var(--primary-rgb) / .04)}
  .csh-addr-his[disabled]{opacity:.45;cursor:not-allowed}
  .csh-addr-add{
    width:100%;height:46px;display:flex;align-items:center;gap:9px;padding:0 14px;
    border:1px dashed var(--input-border);border-radius:11px;background:transparent;
    font-family:inherit;font-size:13px;color:var(--text-2);cursor:pointer;text-align:left;
    transition:border-color .12s,color .12s,background .12s;
  }
  .csh-addr-add:hover{border-color:var(--primary);color:var(--primary);background:rgb(var(--primary-rgb) / .04)}
  .csh-addr-add i{margin-left:auto;font-style:normal;font-size:11.5px;color:var(--text-3)}
  .csh-addr-plus{font-size:16px;font-weight:700;line-height:1;color:var(--primary)}
  .csh-addr-card{
    width:100%;display:flex;align-items:center;gap:10px;padding:6px 12px;height:46px;
    border-radius:11px;background:rgb(var(--primary-rgb) / .06);
    border:1px solid rgb(var(--primary-rgb) / .14);
  }
  .csh-addr-ico{flex:none;font-size:15px;line-height:1}
  .csh-addr-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
  .csh-addr-name{
    font-size:13.5px;font-weight:600;color:var(--text);line-height:1.2;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .csh-addr-sub{
    font-size:11.5px;color:var(--text-3);line-height:1.2;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .csh-addr-seat{
    flex:none;max-width:190px;padding:2px 9px;border-radius:6px;font-size:11.5px;color:var(--text-2);
    background:#fff;border:1px solid var(--border);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  /* 位置 + 距离两个小徽标成组，别把左边的名称/描述挤没 */
  .csh-addr-tags{flex:none;display:flex;align-items:center;gap:6px;min-width:0}
  .csh-addr-dist{
    flex:none;padding:2px 8px;border-radius:6px;font-size:11.5px;font-weight:600;
    color:var(--primary);background:rgb(var(--primary-rgb) / .10);
    border:1px solid rgb(var(--primary-rgb) / .18);
    white-space:nowrap;
  }
  .csh-addr-dist.is-wait{
    font-weight:400;color:var(--text-3);background:transparent;border-color:var(--border);
  }
  /* 弹窗里那行距离：选中地址后立刻算，算不出来就说清楚原因 */
  .csh-dist{
    margin:-6px 0 14px;padding:7px 10px;border-radius:8px;
    font-size:12px;color:var(--text-2);line-height:1.6;
    background:rgb(var(--primary-rgb) / .06);
    border:1px dashed rgb(var(--primary-rgb) / .22);
  }
  .csh-dist b{color:var(--primary);font-size:14px;font-weight:700;margin:0 2px}
  .csh-dist i{font-style:normal;color:var(--text-3);margin-left:6px}
  .csh-dist.is-none{color:var(--text-3);background:transparent;border-color:var(--border);border-style:solid}
  .csh-addr-op{
    flex:none;border:none;background:transparent;color:var(--primary);font-family:inherit;
    font-size:11.5px;cursor:pointer;padding:4px 6px;border-radius:6px;
  }
  .csh-addr-op:hover{background:rgb(var(--primary-rgb) / .10)}

  /* 地址弹窗里「已选好的那条地址」：名称 + 描述 + 更换。
     这一步只确认地址、紧接着填位置，所以不做成可编辑表单。 */
  .csh-addr-picked{
    display:flex;align-items:center;gap:10px;padding:10px 12px;margin-bottom:10px;
    border-radius:11px;background:rgb(var(--primary-rgb) / .06);
    border:1px solid rgb(var(--primary-rgb) / .14);
  }
  .csh-addr-picked .csh-link{flex:none}

  /* 收银台里的「订单」页 = 主站订单查询整页。
     给它自己的滚动容器：屏幕窄时表格整体横向滚，不把九列压成一团。 */
  .csh-qo{flex:1;min-width:0;min-height:0;overflow:auto;padding:0 2px 10px}
  .csh-qo .q-card{max-width:none}

  /* ---- 右栏：只剩购物清单（销售任务已挪到中栏） ---- */
  .csh-right{
    grid-column:2;grid-row:1/-1;display:flex;flex-direction:column;gap:12px;min-width:0;min-height:0;
  }

  /* 销售任务（2026-11-06 挪到中栏商品区下方，整条左栏宽）：
     内容还是接单页那个「个人销售任务进度」，复用 .tk-row / .tk-bar / .tk-fill，
     区别只是**横排**：一行按可用宽度自动放 3~5 个，最多两行（高度由 JS 算），
     再多就滚（滚动条藏掉）。
     卡片高度只由内容决定 —— 任务少时它就矮，商品区自动多占，不留空白。 */
  .csh-task{
    grid-column:1;grid-row:2;
    display:flex;flex-direction:column;gap:8px;padding:11px 14px 12px;
  }
  .csh-task-h{flex:none;display:flex;align-items:center;gap:8px;min-height:22px}
  .csh-task-h b{font-size:13.5px;font-weight:600;white-space:nowrap}
  .csh-task-n{font-size:11px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  /* 右半区：刚刚结算的那条 + 时钟。margin-left:auto 挂在包裹层上（不是挂那条绿色提示），
     这样没有「刚刚这单」时时钟照样贴右边。 */
  .csh-task-tail{margin-left:auto;display:flex;align-items:center;gap:10px;min-width:0}
  .csh-task-tail[hidden]{display:none}
  .csh-clock{flex:none;font-size:13px;font-weight:600;color:var(--text-2);font-variant-numeric:tabular-nums}
  .csh-task-list{
    flex:none;min-height:0;overflow-y:auto;overflow-x:hidden;
    display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));
    gap:2px 16px;padding:0;
    scrollbar-width:none;-ms-overflow-style:none;overscroll-behavior:contain;
  }
  .csh-task-list::-webkit-scrollbar{width:0;height:0;display:none}
  .csh-task-list .tk-row{
    min-width:0;cursor:pointer;border-radius:8px;padding:6px 8px;transition:background .12s;
    /* 名字一行的和两行的并排时，把进度条压到底 —— 否则一格高、一格低，
       四条进度条会错成一条波浪线（横排才有的问题，竖排时不明显）。 */
    justify-content:space-between;
  }
  .csh-task-list .tk-row:hover{background:rgb(var(--primary-rgb) / .07)}
  .csh-task-list .tk-row:hover .tk-name{color:var(--primary)}
  /* 网格行高由最高的那个撑开，名字最多两行 —— 不夹住的话长短不一的任务会高低错落 */
  .csh-task-list .tk-name{
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  }
  .csh-task-list .csh-empty{padding:11px 10px}
  /* 「刚刚结算 XS… ¥48 补打小票」：原来是卡片底部一条，现在卡片矮了，收到标题行里 */
  .csh-task-tail .csh-last{
    display:inline-flex;align-items:center;gap:8px;
    padding:3px 10px;font-size:11.5px;line-height:1.5;white-space:nowrap;
  }
  .csh-last{display:block;font-size:11.5px;color:var(--ok);background:rgb(16 185 129 / .10);
    border:1px solid rgb(16 185 129 / .25);border-radius:7px;padding:5px 9px}
  .csh-last b{font-variant-numeric:tabular-nums}

  .csh-cart{flex:1;display:flex;flex-direction:column;overflow:hidden}
  /* ===== 开卡条（2026-11-09）=====
     只在收银台「开卡模式」出现，压在购物清单标题上方：扫卡是第一动作，
     扫完才去左边选品。右栏只有 384px，卡号独占一行、姓名/手机号并排一行。 */
  .csh-cardbar{
    flex:none;display:flex;flex-direction:column;gap:6px;padding:8px 12px 9px;
    border-bottom:1px solid var(--border);
    background:rgb(var(--primary-rgb) / .05);
  }
  .csh-cardbar[hidden]{display:none}
  .csh-cb-row{display:flex;align-items:center;gap:6px}
  .csh-cb-t{flex:none;font-size:12px;font-weight:700;color:var(--primary);letter-spacing:.04em}
  .csh-cb-in{
    flex:1;min-width:0;height:32px;padding:0 9px;border:1px solid var(--input-border);
    border-radius:8px;background:var(--panel);color:var(--text);
    font-family:inherit;font-size:12.5px;
  }
  .csh-cb-in:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 2px rgb(var(--primary-rgb) / .12)}
  /* 卡号用等宽字：热敏票上的卡号也是等宽，扫码/念号时不容易看错位 */
  #cshCardNo{font-family:"Courier New",monospace;font-size:13.5px;font-weight:600;letter-spacing:.06em}
  .csh-cb-x{
    flex:none;height:32px;padding:0 10px;border:1px solid var(--border);border-radius:8px;
    background:transparent;color:var(--text-3);font-family:inherit;font-size:12px;cursor:pointer;
  }
  .csh-cb-x:hover{color:#c0392b;border-color:#e8b4ae}
  .csh-cb-st{font-size:11.5px;line-height:1.4;color:var(--text-3)}
  .csh-cb-st.is-ok{color:#1e8e5a;font-weight:600}
  .csh-cb-st.is-err{color:#c0392b;font-weight:600}
  body.theme-dark .csh-cb-st.is-ok{color:#57d99a}
  body.theme-dark .csh-cb-st.is-err{color:#ff8b7e}
  /* 开卡模式：按钮亮起来，提醒「现在这一单是卖卡，不是普通销售」 */
  .csh-pk-btn.is-on{
    border-color:var(--primary);background:rgb(var(--primary-rgb) / .16);
    color:var(--primary);font-weight:700;
  }
  body.theme-dark .csh-pk-btn.is-on{background:rgb(var(--primary-rgb) / .24);color:#fff}
  .csh-mem-btn:disabled{opacity:.45;cursor:not-allowed}
  /* 开卡模式的地址位：换成一句说明而不是禁用按钮 ——
     收银员看到「添加配送地址」会去点，点了没反应才是最难解释的 */
  .csh-addr-off{
    width:100%;display:flex;flex-direction:column;justify-content:center;gap:3px;
    padding:8px 14px;border-radius:11px;border:1px dashed var(--input-border);
  }
  .csh-addr-off span{font-size:13px;font-weight:600;color:var(--text-2)}
  .csh-addr-off i{font-style:normal;font-size:11.5px;color:var(--text-3)}

  .csh-cart-h{
    flex:none;height:46px;display:flex;align-items:center;gap:9px;padding:0 14px;
    border-bottom:1px solid var(--border);font-size:14px;
  }
  .csh-cart-h b{font-weight:600}
  .csh-cart-h span{font-size:12px;color:var(--text-3)}
  .csh-link{
    margin-left:auto;border:none;background:transparent;color:var(--primary);
    font-family:inherit;font-size:12.5px;cursor:pointer;padding:4px 6px;border-radius:5px;
  }
  .csh-link:hover{background:var(--primary-soft)}

  .csh-cart-body{flex:1;overflow:auto;padding:10px 12px}
  .csh-line{
    position:relative;padding:9px 10px;border-radius:9px;border:1px solid var(--border);
    margin-bottom:6px;background:#fff;
  }
  body.theme-dark .csh-line{background:#23252E}
  /* 清单行版式（2026-11-06 改）：名称完整换行 / 单价·小计 / 数量·动作，三行。
     原来是「名称单行省略 + 小计绝对定位右上」，长货名一截就认不出是哪个商品。 */
  .csh-line-main{display:flex;align-items:baseline;gap:8px;padding-right:74px}
  .csh-line-h{display:flex;align-items:flex-start;gap:6px;min-width:0}
  .csh-line-n{
    font-size:13.5px;font-weight:500;flex:1;min-width:0;line-height:1.36;
    /* 不截断：按容器宽度整段换行，名字多长都看得全 */
    white-space:normal;word-break:break-word;overflow-wrap:anywhere;
  }
  .csh-line-m{display:flex;align-items:baseline;gap:8px;margin-top:3px}
  .csh-line-p{flex:1;min-width:0;font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
  /* 会员「上次成交价」：只做参照，灰色小字，别抢本单金额的注意力 */
  .csh-line-last{
    flex:none;font-size:11px;color:var(--text-3);white-space:nowrap;
    font-variant-numeric:tabular-nums;cursor:help;text-decoration:underline dotted rgba(120,130,150,.5);
  }
  .csh-line-ctl{display:flex;align-items:center;gap:5px;width:fit-content}
  .csh-step{
    width:28px;height:28px;border-radius:7px;border:1px solid var(--input-border);background:#fff;
    font-family:inherit;font-size:15px;line-height:1;color:var(--text-2);cursor:pointer;
  }
  body.theme-dark .csh-step{background:#2C2F38}
  .csh-step:hover{border-color:var(--primary);color:var(--primary)}
  .csh-qty{
    width:44px;height:28px;text-align:center;border-radius:7px;border:1px solid var(--input-border);
    font-family:inherit;font-size:13.5px;font-variant-numeric:tabular-nums;
  }
  .csh-qty:focus{outline:none;border-color:var(--primary)}
  .csh-del{
    width:28px;height:28px;border-radius:7px;border:none;background:transparent;
    color:var(--text-3);font-size:15px;line-height:1;cursor:pointer;margin-left:4px;
  }
  .csh-del:hover{background:#FEE2E2;color:var(--danger)}
  .csh-line-b{display:flex;align-items:center;gap:8px;margin-top:7px}
  .csh-line-acts{margin-left:auto;display:flex;align-items:center;gap:5px}
  /* 行上的实心小按钮：赠 / 改 / 单位。
     键帽只在键盘选中这一行时显形（.is-kb），否则三个 Alt+X 挂上去 384 的右栏排不开 */
  .csh-lb{
    height:28px;padding:0 9px;border-radius:7px;border:1px solid var(--input-border);
    background:#fff;color:var(--text-2);font-family:inherit;font-size:12.5px;line-height:1;
    display:inline-flex;align-items:center;gap:4px;cursor:pointer;white-space:nowrap;
    transition:border-color .12s,color .12s,background .12s;
  }
  body.theme-dark .csh-lb{background:#2C2F38}
  .csh-lb:hover{border-color:var(--primary);color:var(--primary)}
  .csh-lb.is-on{
    background:rgb(var(--primary-rgb) / .10);border-color:rgb(var(--primary-rgb) / .40);color:var(--primary);
  }
  /* 商品中心没开「可赠」：按钮压暗但**仍可点**，点下去告诉收银员为什么不让改 */
  .csh-lb.is-off{opacity:.45}
  .csh-lb.is-off:hover{border-color:var(--input-border);color:var(--text-2)}
  /* 行内快捷键提示条：贴在清单标题下面，11px 灰字 + 小键帽 */
  .csh-cart-tip{
    flex:none;display:flex;align-items:center;gap:10px;padding:6px 14px;
    border-bottom:1px solid var(--border);font-size:11px;color:var(--text-3);
    background:rgb(var(--primary-rgb) / .03);
  }
  .csh-cart-tip[hidden]{display:none}
  .csh-cart-tip > span{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
  .csh-cart-tip > span:first-child{color:var(--text-3)}
  .csh-cart-tip .kb{font-size:9.5px;padding:1px 4px}
  /* 备注条（2026-11-10）：整单复购把原单的「本单备注」带过来时才有。
     贴着清单底、付款方式上方，浅黄底一行，字多就省略号 + 悬停看全文；
     右侧 ✕ 当场去掉这条备注 —— 备注是随单落库的，看不见就等于偷偷写了一句。 */
  .csh-note{
    flex:none;display:flex;align-items:center;gap:8px;padding:6px 14px;
    border-top:1px solid var(--border);font-size:12px;color:#8A5A00;
    background:rgb(245 166 35 / .10);
  }
  .csh-note[hidden]{display:none}
  .csh-note-k{flex:none;font-size:11px;color:#B45309}
  .csh-note-t{
    flex:1;min-width:0;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .csh-note-x{
    flex:none;width:20px;height:20px;border:0;border-radius:5px;cursor:pointer;
    background:transparent;color:#B45309;font-size:12px;line-height:1;
  }
  .csh-note-x:hover{background:rgb(245 166 35 / .22)}
  body.theme-dark .csh-note{background:rgb(245 166 35 / .14);color:#FFC15E}
  body.theme-dark .csh-note-k,body.theme-dark .csh-note-x{color:#FFC15E}
  .csh-line-sum{
    flex:none;font-size:14px;font-weight:700;
    color:var(--text);font-variant-numeric:tabular-nums;
  }
  /* 整行可点：开商品详情抽屉改价/改量（加减、数量框、删除按钮除外） */
  .csh-line{cursor:pointer}
  .csh-line:hover{border-color:#CFD5E2;box-shadow:0 2px 10px rgba(20,24,35,.06)}
  .csh-line-tag{
    font-style:normal;margin-left:6px;padding:1px 5px;border-radius:4px;
    background:#FEF3C7;color:#B45309;font-size:10px;font-weight:600;vertical-align:1px;
  }
  body.theme-dark .csh-line-tag{background:rgba(245,166,35,.18);color:#FFC15E}
  .csh-line-cold{
    font-style:normal;margin-left:6px;padding:1px 5px;border-radius:4px;
    background:#E0F2FE;color:#0369A1;font-size:10px;font-weight:600;vertical-align:1px;
  }
  body.theme-dark .csh-line-cold{background:rgba(56,189,248,.18);color:#7DD3FC}
  /* 赠品标记：名称前面已经有 [赠品] 前缀，这个小标签只是让一眼扫过去更快找到 */
  .csh-line-gift{
    font-style:normal;margin-left:6px;padding:1px 5px;border-radius:4px;
    background:rgb(var(--primary-rgb) / .12);color:var(--primary);font-size:10px;font-weight:600;vertical-align:1px;
  }

  /* ---- 清单行小弹窗：改价 / 换销售单位 ----
     居中卡片（不是右滑抽屉）：这两步是「一瞥一按就走」，
     抽屉从右边滑进来会把商品区遮掉，收银员回头还得再挪一次视线。 */
  .csh-px-mask{
    position:fixed;inset:0;z-index:2650;display:flex;align-items:center;justify-content:center;
    padding:20px;background:rgba(20,24,35,.38);backdrop-filter:blur(2px);
    opacity:0;transition:opacity .18s;
  }
  .csh-px-mask.open{opacity:1}
  .csh-px{
    width:min(360px,94vw);max-height:min(82vh,600px);display:flex;flex-direction:column;
    background:var(--panel);border:1px solid var(--border);border-radius:16px;overflow:hidden;
    box-shadow:0 24px 70px rgba(17,20,30,.26);
    transform:translateY(10px) scale(.985);opacity:0;
    transition:transform .22s cubic-bezier(.22,1,.36,1),opacity .16s ease;
  }
  .csh-px-mask.open .csh-px{transform:none;opacity:1}
  .csh-px-h{
    flex:none;display:flex;align-items:center;justify-content:space-between;
    padding:14px 18px;border-bottom:1px solid var(--border);
  }
  .csh-px-h b{font-size:14.5px;font-weight:700}
  /* 小弹窗通用说明行（换赠品弹窗用） */
  .csh-px-tip{padding:12px 18px 0;font-size:12px;color:var(--text-3);line-height:1.6}
  .csh-px-tip b{color:var(--text-2);font-weight:600}
  /* 「更换赠品」：比通用小弹窗宽一档 —— 一行要放下 图 + 名称 + 库存三块 */
  .csh-px.csh-px-wide{width:min(520px,94vw)}
  .csh-gswap{display:flex;flex-direction:column;gap:8px;padding:12px 18px 18px;overflow:auto}
  .csh-gswap-b{
    display:flex;align-items:center;gap:10px;text-align:left;
    padding:9px 12px;border-radius:10px;border:1px solid var(--border);background:#fff;
    font-family:inherit;cursor:pointer;transition:border-color .12s,background .12s;
  }
  body.theme-dark .csh-gswap-b{background:#2C2F38}
  .csh-gswap-b:hover{border-color:var(--primary)}
  .csh-gswap-b.is-cur{border-color:var(--primary);background:rgb(var(--primary-rgb) / .07)}
  /* 库存不够的仍可点（能看出差多少再决定），所以不整体压暗，只把这一行底色转淡红 */
  .csh-gswap-b.is-short{border-color:#F1D8D8;background:#FDF8F8}
  body.theme-dark .csh-gswap-b.is-short{background:#332A2C;border-color:#52393C}
  .csh-gswap .csh-gswap-img{width:40px;height:40px;font-size:19px;border-radius:8px}
  .csh-gswap-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
  .csh-gswap-n{
    font-size:13px;font-weight:600;color:var(--text);line-height:1.35;word-break:break-word;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  }
  .csh-gswap-m{font-size:11.5px;color:var(--text-3);line-height:1.4}
  .csh-gswap-m em{font-style:normal;color:#DC2626}
  body.theme-dark .csh-gswap-m em{color:#F87171}
  .csh-gswap-b.is-cur .csh-gswap-m{color:var(--primary)}
  /* 右侧库存块：等宽数字，纵向两行（「库存」+ 数量单位），换行时也不会把数字拆开 */
  .csh-gswap-stk{
    flex:0 0 auto;display:flex;flex-direction:column;align-items:flex-end;gap:1px;
    min-width:76px;padding-left:10px;border-left:1px solid var(--border);text-align:right;
  }
  .csh-gswap-stk i{font-style:normal;font-size:10.5px;color:var(--text-3);letter-spacing:.02em}
  .csh-gswap-stk b{
    font-size:13px;font-weight:700;color:var(--text);
    font-variant-numeric:tabular-nums;white-space:nowrap;
  }
  .csh-gswap-stk.is-short b,.csh-gswap-stk.is-zero b{color:#DC2626}
  body.theme-dark .csh-gswap-stk.is-short b,body.theme-dark .csh-gswap-stk.is-zero b{color:#F87171}
  .csh-gswap-stk.is-unknown b{color:var(--text-3);font-weight:600}
  /* 点了缺货的候选：横向抖一下，比只弹一句 toast 更容易定位到是哪一行被拒 */
  .csh-gswap-b.is-deny{animation:cshGswapDeny .36s cubic-bezier(.36,.07,.19,.97)}
  @keyframes cshGswapDeny{
    0%,100%{transform:translateX(0)}
    20%{transform:translateX(-5px)}
    45%{transform:translateX(4px)}
    70%{transform:translateX(-2px)}
  }
  /* 说明行右下角补一句库存口径（哪家店、实时） */
  .csh-gswap-src{display:block;margin-top:2px;font-size:11px;color:var(--text-3);opacity:.85}
  .csh-px-b{flex:1;min-height:0;overflow:auto;padding:14px 18px}
  /* 商品名完整换行 + 当前价/数量，确认没点错行 */
  .csh-px-nm{font-size:13px;font-weight:600;color:var(--text);line-height:1.4;word-break:break-word}
  .csh-px-nm i{display:block;margin-top:2px;font-style:normal;font-size:11.5px;font-weight:400;color:var(--text-3)}
  .csh-px-none{margin:12px 0 0;font-size:12px;color:var(--text-3)}
  .csh-px-tiers{display:flex;gap:8px;margin-top:12px}
  .csh-px-t{
    flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;align-items:flex-start;
    padding:8px 10px;border-radius:9px;border:1px solid var(--border);background:#fff;
    font-family:inherit;cursor:pointer;transition:border-color .12s,background .12s;
  }
  body.theme-dark .csh-px-t{background:#2C2F38}
  .csh-px-t i{font-style:normal;font-size:10.5px;color:var(--text-3);white-space:nowrap}
  .csh-px-t b{font-size:14px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}
  .csh-px-t:hover{border-color:var(--primary)}
  .csh-px-t.on{border-color:var(--primary);background:rgb(var(--primary-rgb) / .08)}
  .csh-px-t.on i{color:var(--primary)}
  .csh-px-t.on b{color:var(--primary)}
  .csh-px-in{
    display:flex;align-items:center;gap:8px;margin-top:12px;padding:0 12px;height:46px;
    border:1px solid var(--input-border);border-radius:11px;background:#fff;
  }
  body.theme-dark .csh-px-in{background:#23252E}
  .csh-px-in:focus-within{border-color:var(--primary);box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .14)}
  .csh-px-in span{font-size:15px;font-weight:700;color:var(--text-3)}
  .csh-px-in input{
    flex:1;min-width:0;border:none;outline:none;background:transparent;font-family:inherit;
    font-size:19px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums;
  }
  .csh-px-in em{font-style:normal;font-size:11.5px;color:var(--text-3);white-space:nowrap}
  .csh-px-list{display:flex;flex-direction:column;gap:6px;margin-top:12px}
  .csh-px-u{
    display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:9px;
    border:1px solid var(--border);background:#fff;font-family:inherit;cursor:pointer;
    text-align:left;transition:border-color .12s,background .12s;
  }
  body.theme-dark .csh-px-u{background:#2C2F38}
  .csh-px-u b{font-size:13.5px;font-weight:600;color:var(--text)}
  .csh-px-u i{
    font-style:normal;font-size:10.5px;font-weight:600;color:var(--text-3);
    background:rgba(120,130,150,.14);border-radius:4px;padding:1px 5px;
  }
  .csh-px-u span{margin-left:auto;font-size:13px;font-weight:600;color:var(--text-2);font-variant-numeric:tabular-nums}
  .csh-px-u:hover{border-color:var(--primary)}
  .csh-px-u.on{border-color:var(--primary);background:rgb(var(--primary-rgb) / .08)}
  .csh-px-u.on b,.csh-px-u.on span{color:var(--primary)}
  .csh-px-hint{margin-top:12px;font-size:11.5px;color:var(--text-3);line-height:1.7}
  .csh-px-hint kbd{
    display:inline-block;min-width:17px;padding:1px 5px;margin:0 2px;border-radius:4px;
    background:rgba(120,130,150,.14);font-family:inherit;font-size:10.5px;font-weight:600;
    color:var(--text-2);text-align:center;
  }
  .csh-px-f{
    flex:none;display:flex;gap:10px;justify-content:flex-end;
    padding:12px 18px;border-top:1px solid var(--border);
  }
  .csh-px-f .csh-btn{min-width:88px}

  /* ---- 清单行 · 商品详情抽屉（改售价 / 改数量） ---- */
  .csh-dw-mask{
    position:fixed;inset:0;z-index:2600;background:rgba(20,24,35,.38);
    opacity:0;transition:opacity .2s;backdrop-filter:blur(2px);
  }
  .csh-dw-mask.open{opacity:1}
  /* 与详情抽屉同一套悬浮岛：四边留 12px，四角圆，右滑入右滑出 */
  .csh-dw{
    position:absolute;top:12px;right:12px;bottom:12px;width:min(400px,92vw);
    display:flex;flex-direction:column;background:var(--panel);
    border:1px solid var(--border);border-radius:16px;overflow:hidden;
    box-shadow:0 24px 70px rgba(17,20,30,.26);
    transform:translateX(28px) scale(.994);opacity:0;
    transition:transform .26s cubic-bezier(.22,1,.36,1),opacity .18s ease;
  }
  .csh-dw-mask.open .csh-dw{transform:none;opacity:1}
  .csh-dw-h{
    flex:none;display:flex;align-items:center;justify-content:space-between;
    padding:16px 20px;border-bottom:1px solid var(--border);
  }
  .csh-dw-h b{font-size:15px;font-weight:700}
  .csh-dw-x{
    border:none;background:transparent;color:var(--text-3);font-size:15px;line-height:1;
    padding:5px;border-radius:6px;cursor:pointer;font-family:inherit;
  }
  .csh-dw-x:hover{background:rgba(120,130,150,.14);color:var(--text)}
  .csh-dw-b{flex:1;overflow:auto;padding:16px 20px}
  .csh-dw-id{display:flex;gap:12px;align-items:flex-start;padding-bottom:14px;border-bottom:1px solid var(--border)}
  .csh-dw-img{width:64px;height:64px;font-size:26px;border-radius:10px}
  .csh-dw-info{flex:1;min-width:0}
  .csh-dw-name{font-size:14px;font-weight:600;line-height:1.45;word-break:break-all}
  .csh-dw-sub{margin-top:4px;font-size:11.5px;color:var(--text-3)}
  .csh-dw-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px}
  .csh-dw-row .k{font-size:12.5px;color:var(--text-2)}
  .csh-dw-ctl{display:flex;align-items:center;gap:8px}
  .csh-dw-qty{width:64px;height:34px;text-align:center;font-variant-numeric:tabular-nums}
  .csh-dw-price{display:flex;align-items:center;gap:8px}
  .csh-dw-price .po-in{width:112px;height:34px;text-align:right;font-variant-numeric:tabular-nums;max-width:none}
  .csh-dw-price em{font-style:normal;font-size:11.5px;color:var(--text-3);white-space:nowrap}
  .csh-dw-sum{
    display:flex;align-items:baseline;justify-content:space-between;
    margin-top:18px;padding-top:12px;border-top:1px dashed var(--border);
  }
  .csh-dw-sum span{font-size:12.5px;color:var(--text-3)}
  .csh-dw-sum b{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums}
  .csh-dw-hint{margin-top:10px;font-size:11.5px;color:var(--text-3);line-height:1.6}

  /* 商品档案 + 库存分布：夹在商品头和「销售单位/数量」之间，
     一块浅底卡片把「只读信息」和下面的「可改字段」区分开 */
  /* 2026-11-07 重排后下面这批旧样式（灰卡 / 属性 chip / 门店胶囊）已不再生成，只留共用的小字 */
  .csh-dw-at{font-size:10.5px;font-weight:400;color:var(--text-3);white-space:nowrap}
  .csh-dw-stock{margin-top:0;padding-top:0;border-top:0}
  .csh-dw-foot{flex:none;display:flex;gap:8px;padding:14px 20px;border-top:1px solid var(--border)}
  /* 价档选择：售价 / 会员价1 / 会员价2，会员等级只决定默认高亮哪一档 */
  /* 档位按钮等宽：三档价格位数不同，按内容撑宽会一边胖一边瘦 */
  .csh-tier{flex:1;display:flex;gap:6px;justify-content:flex-end;min-width:0}
  .csh-tier-b{
    flex:1 1 0;min-width:0;
    display:flex;flex-direction:column;align-items:center;gap:1px;
    padding:5px 8px;border-radius:8px;border:1px solid var(--input-border);background:#fff;
    font-family:inherit;cursor:pointer;transition:border-color .12s,background .12s;
  }
  .csh-tier-b i{font-style:normal;font-size:10.5px;color:var(--text-3);line-height:1.25}
  .csh-tier-b b{font-size:13px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums;line-height:1.25}
  .csh-dw-row--tier{align-items:flex-start}
  .csh-dw-row--tier>.k{padding-top:7px}
  .csh-tier-b:hover{border-color:var(--primary)}
  .csh-tier-b.on{border-color:var(--primary);background:var(--primary-soft)}
  .csh-tier-b.on i,.csh-tier-b.on b{color:var(--primary)}

  /* ---- 商品选择区「含淘汰」开关（2026-11-07 需求 55） ---- */
  .csh-void-sw{
    display:inline-flex;align-items:center;gap:5px;flex:none;
    height:28px;padding:0 9px;border-radius:14px;border:1px solid var(--input-border);
    background:#fff;font-size:11.5px;color:var(--text-2);white-space:nowrap;cursor:pointer;
  }
  body.theme-dark .csh-void-sw{background:#23252E}
  .csh-void-sw input{width:13px;height:13px;margin:0;accent-color:var(--primary);cursor:pointer}
  .csh-void-sw i{font-style:normal;font-size:10px;color:var(--text-3);font-variant-numeric:tabular-nums}
  .csh-void-sw.is-on{border-color:var(--primary);background:var(--primary-soft);color:var(--primary);font-weight:600}
  .csh-void-sw.is-empty{opacity:.5;cursor:not-allowed}
  .csh-void-sw.is-empty input{cursor:not-allowed}
  /* 淘汰商品卡：虚线橙框 + 左上角「淘汰」标，别让收银员按正常货卖出去 */
  .csh-card.is-void{border-style:dashed;border-color:#D9A06B;background:#FFFCF7}
  body.theme-dark .csh-card.is-void{background:#2A2620}
  .csh-card-void{
    position:absolute;top:0;left:0;z-index:1;padding:1px 6px;
    border-radius:10px 0 8px 0;background:#B45309;color:#fff;
    font-size:10px;line-height:1.5;font-style:normal;
  }

  /* ---- 商品详情抽屉：加宽 + 库存查询 / 库存分布页签（需求 56） ---- */
  /* 商品信息抽屉：原来是「贴合内容的高度」（height:auto），信息页确实够用，
     但切到「库存查询 / 库存分布」时只剩 260px，一页 10 行都看不全（用户 2026-11-08）。
     现在跟普通抽屉一样撑满可用高度：四边各留 12px，**不贴屏幕最底**，
     圆角 / 悬浮阴影 / 右侧滑入的形态完全不变，只是变高。
     高度由 top + bottom 决定，内部分页（.csh-dw-b → 各页签）各自滚动。 */
  .csh-dw.is-wide{width:min(1040px,96vw);height:auto;top:12px;bottom:12px;max-height:none}
  /* 三个页签轮流占满中间这块：内容高的（库存表）自己滚，信息页不会被表格顶长 */
  .csh-dw.is-wide .csh-dw-b{display:flex;flex-direction:column;overflow:hidden}
  .csh-dw.is-wide .csh-dw-pane{flex:1;min-height:0;overflow:auto}
  .csh-dw-tabs{flex:none;display:flex;gap:4px;padding:0 20px;border-bottom:1px solid var(--border)}
  .csh-dw-tabs button{
    padding:11px 16px;border:none;border-bottom:2px solid transparent;background:transparent;
    font-family:inherit;font-size:13px;color:var(--text-3);cursor:pointer;
  }
  .csh-dw-tabs button:hover{color:var(--text)}
  .csh-dw-tabs button.on{color:var(--primary);border-bottom-color:var(--primary);font-weight:600}
  .csh-dw.is-wide .csh-dw-b{padding:0}
  .csh-dw-pane-info{padding:16px 20px 18px}
  .csh-dw-pane-q,.csh-dw-pane-d{padding:16px 20px 22px}

  /* ---- 商品信息面板：两栏重排（2026-11-07）----
     原先是 560px 单栏居中，1040px 的抽屉左右各空 240px；
     属性、库存汇总、16 家门店胶囊全堆在一张灰卡里，还和「库存分布」页签重复。 */
  .csh-dw-grid{display:grid;grid-template-columns:296px minmax(0,1fr);gap:16px 26px;align-items:stretch}
  .csh-dw-col{min-width:0}
  /* 左栏不跟着右栏拉高：卡片只包住自己的内容，底部不留空框 */
  .csh-dw-col--id{align-self:start}
  .csh-dw-col--id .csh-dw-id{padding-bottom:12px}
  .csh-dw-img{width:72px;height:72px;font-size:28px}
  .csh-dw-sect{margin-top:12px;padding:11px 12px 12px;border-radius:11px;background:#F6F8FB;border:1px solid var(--border)}
  body.theme-dark .csh-dw-sect{background:#23252E}
  .csh-dw-col--edit>.csh-dw-sect--stock{margin-top:0}
  .csh-dw-sect-h{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:8px;font-size:11.5px;font-weight:600;color:var(--text-2)}
  /* 档案：固定标签列，值单行省略，不再用 auto-fill 网格（列数随宽度乱跳） */
  .csh-dw-attrs{display:grid;grid-template-columns:minmax(0,1fr);gap:5px}
  .csh-dw-kv{display:grid;grid-template-columns:66px minmax(0,1fr);gap:8px;font-size:11.5px;line-height:1.5}
  .csh-dw-kv i{font-style:normal;color:var(--text-3);white-space:nowrap}
  .csh-dw-kv b{font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .csh-dw-kv.is-mut b{font-weight:400;color:var(--text-3)}
  /* 库存：四个数字块，本店主色高亮 */
  .csh-dw-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px}
  /* 标题占整行，数字与单位同一行（单位单占一行会把块撑高、看着松散） */
  .csh-dw-kpi{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:baseline;column-gap:4px;row-gap:1px;padding:8px 10px;border-radius:9px;background:#fff;border:1px solid var(--border)}
  .csh-dw-kpi i{grid-column:1/-1}
  body.theme-dark .csh-dw-kpi{background:#2A2D37}
  .csh-dw-kpi i{font-style:normal;font-size:10.5px;color:var(--text-3);white-space:nowrap}
  .csh-dw-kpi b{font-size:17px;font-weight:700;line-height:1.2;font-variant-numeric:tabular-nums}
  .csh-dw-kpi em{font-style:normal;font-size:10px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .csh-dw-kpi.is-mine{border-color:rgb(var(--primary-rgb) / .35);background:var(--primary-soft)}
  .csh-dw-kpi.is-mine b{color:var(--primary)}
  .csh-dw-kpi.is-mine.is-zero{border-color:#F3C7A8;background:#FFF7F1}
  .csh-dw-kpi.is-mine.is-zero b{color:#C2410C}
  /* 调价表单：标签列定宽、控件左对齐 —— 原来 space-between 把标签和控件拉到两端 */
  .csh-dw-form{display:grid;grid-template-columns:74px minmax(0,1fr);gap:11px 14px;align-items:center;margin-top:14px;padding-top:13px;border-top:1px solid var(--border)}
  /* po-in 是 flex:1 1 auto，放进网格列会被撑满整行 —— 这几处必须定宽 */
  .csh-dw-form .csh-dw-qty{flex:none;width:76px;max-width:none}
  .csh-dw-form .csh-dw-price .po-in{flex:none;width:124px;max-width:none}
  .csh-dw-form>.csh-dw-row{display:contents;margin:0}
  .csh-dw-form .csh-dw-row>.k{font-size:12.5px;color:var(--text-2);white-space:nowrap}
  .csh-tier{justify-content:flex-start}
  .csh-dw-sum{margin-top:14px}
  .csh-dw-col--edit{min-width:0}
  .csh-dw-foot .csh-btn{flex:none;min-width:96px;padding:0 18px}
  .csh-dw-foot .csh-btn.primary{margin-left:auto;min-width:148px}
  @media (max-width: 980px){
    .csh-dw-grid{grid-template-columns:minmax(0,1fr);gap:14px}
    .csh-dw-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}
  }
  /* display:flex / table-cell 会盖掉 UA 的 [hidden]，这里逐个显式复位 */
  .csh-dw-pane[hidden],.csh-dw-foot[hidden],.csk-gear[hidden],.csk-tb [hidden]{display:none}

  /* 两张表单的公共外观（照中仑截图：浅灰表头、细边框、数字右对齐、翻页条） */
  .csk{min-width:0}
  .csk-h{text-align:center;font-size:15px;font-weight:600;padding:2px 0 14px;border-bottom:1px solid var(--border)}
  .csk-filter{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;padding:14px 0 12px;border-bottom:1px solid var(--border)}
  .csk-f{display:flex;align-items:center;gap:6px;min-width:0}
  .csk-lb{font-size:12px;color:var(--text-3);white-space:nowrap}
  .csk-f .po-in{height:30px;font-size:12px;max-width:none}
  #cskKw{width:190px}
  #cskCat{width:140px}
  .csk-store{
    padding:4px 10px;border:1px solid var(--input-border);border-radius:6px;background:#F8F9FC;
    font-size:12px;color:var(--text-2);max-width:230px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  body.theme-dark .csk-store{background:#23252E}
  .csk-btns{gap:6px}
  .csk-ch{
    height:28px;padding:0 11px;border-radius:6px;border:1px solid var(--input-border);
    background:#fff;font-family:inherit;font-size:12px;color:var(--text-2);cursor:pointer;white-space:nowrap;
  }
  body.theme-dark .csk-ch{background:#23252E}
  .csk-ch:hover{border-color:var(--primary)}
  .csk-ch.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
  .csk-acts{margin-left:auto;display:flex;gap:6px;align-items:center}
  .csk-btn{
    height:30px;padding:0 16px;border-radius:6px;border:1px solid var(--input-border);
    background:#fff;font-family:inherit;font-size:12.5px;color:var(--text-2);cursor:pointer;
  }
  .csk-btn.primary{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
  .csk-gear-btn{
    width:30px;height:30px;border-radius:6px;border:1px solid var(--input-border);
    background:#fff;font-size:14px;cursor:pointer;line-height:1;color:var(--text-2);
  }
  body.theme-dark .csk-btn,body.theme-dark .csk-gear-btn{background:#23252E}
  .csk-gear{
    display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:8px;padding:8px 12px;
    border:1px solid var(--border);border-radius:8px;background:#F8F9FC;font-size:12px;
  }
  body.theme-dark .csk-gear{background:#23252E}
  .csk-gear b{font-size:12px;color:var(--text-2)}
  .csk-gear label{display:inline-flex;align-items:center;gap:4px;cursor:pointer}
  .csk-note{margin:9px 0;font-size:11px;color:var(--text-3);line-height:1.6}
  .csk-note .is-err{color:#C2410C}
  .csk-loading{padding:40px 0;text-align:center;color:var(--text-3);font-size:13px}

  .csk-tb{width:100%;border-collapse:collapse;font-size:12px}
  .csk-tb th,.csk-tb td{border:1px solid var(--border);padding:7px 9px;text-align:center;white-space:nowrap}
  .csk-tb thead th{background:#F3F5F9;color:var(--text-2);font-weight:600}
  body.theme-dark .csk-tb thead th{background:#2A2D37}
  .csk-tb tbody tr:nth-child(even){background:rgba(120,130,150,.035)}
  .csk-tb tbody tr:hover{background:var(--primary-soft)}
  .csk-tb .csk-c-no{width:52px}
  .csk-tb .csk-c-name{min-width:170px;max-width:230px}
  .csk-tb .csk-name{text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .csk-tb .num{text-align:right;font-variant-numeric:tabular-nums}
  .csk-tb .csk-empty{padding:26px 0;color:var(--text-3);font-size:12px}
  .csk-sort{cursor:pointer;user-select:none}
  .csk-sort i{font-style:normal;color:var(--text-3);font-size:10px}
  .csk-link{border:none;background:transparent;color:var(--primary);font-family:inherit;font-size:12px;cursor:pointer;padding:0 4px}
  .csk-link:hover{text-decoration:underline}
  .csk-tb tr.is-wh td{background:rgba(120,130,150,.05)}
  .csk-tb tr.is-mine .csk-name{color:var(--primary);font-weight:600}
  .csk-name em{
    font-style:normal;margin-left:6px;padding:1px 5px;border-radius:4px;
    background:var(--primary-soft);color:var(--primary);font-size:10px;font-weight:600;
  }

  .csk-pager{display:flex;align-items:center;justify-content:flex-end;gap:5px;margin-top:12px;flex-wrap:wrap}
  .csk-pg-info{margin-right:auto;font-size:11.5px;color:var(--text-3)}
  .csk-pg{
    min-width:28px;height:28px;padding:0 7px;border:1px solid var(--input-border);border-radius:6px;
    background:#fff;font-family:inherit;font-size:12px;color:var(--text-2);cursor:pointer;
  }
  body.theme-dark .csk-pg{background:#23252E}
  .csk-pg:hover:not(:disabled){border-color:var(--primary);color:var(--primary)}
  .csk-pg.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
  .csk-pg:disabled{opacity:.45;cursor:not-allowed}
  .csk-pg-dot{padding:0 3px;color:var(--text-3)}

  .csd-info{padding:12px 0 10px;border-bottom:1px solid var(--border)}
  .csd-info-r{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 10px;font-size:12px;line-height:1.9}
  .csd-info-r>span{color:var(--text-3);white-space:nowrap}
  .csd-info-r>b{font-weight:600;color:var(--text);margin-right:12px}
  .csd-info-r .csd-name{max-width:230px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .csd-bar{display:flex;align-items:center;justify-content:space-between;margin-top:10px}
  .csd-only{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2);cursor:pointer}
  .csd-only input{margin:0;accent-color:var(--primary)}
  .csd-tb .csk-c-name{min-width:150px}

  /* ---- 居中弹框（配送信息）与地址选择 ---- */
  .csh-dlg-mask{
    position:fixed;inset:0;z-index:2650;display:flex;align-items:center;justify-content:center;
    background:rgba(20,24,35,.38);opacity:0;transition:opacity .18s;backdrop-filter:blur(2px);
  }
  .csh-dlg-mask.open{opacity:1}
  /* 收银台居中弹框：宽高固定（--csh-dlg-w / --csh-dlg-h），内容超了在 .csh-dlg-b 里滚 */
  .csh-dlg{
    width:var(--csh-dlg-w,460px);height:var(--csh-dlg-h,560px);
    max-width:92vw;max-height:86vh;
    display:flex;flex-direction:column;
    background:var(--panel);border-radius:14px;box-shadow:0 20px 60px rgba(17,20,30,.24);
    transform:translateY(10px);transition:transform .18s;
  }
  .csh-dlg-mask.open .csh-dlg{transform:none}
  .csh-dlg-h{
    flex:none;display:flex;align-items:center;justify-content:space-between;
    padding:15px 18px;border-bottom:1px solid var(--border);
  }
  .csh-dlg-h b{font-size:15px;font-weight:700}
  .csh-dlg-b{flex:1;min-height:0;overflow:auto;padding:16px 18px}
  .csh-dlg-f{
    flex:none;display:flex;justify-content:flex-end;gap:8px;
    padding:12px 18px;border-top:1px solid var(--border);
  }
  /* 弹框底部按钮不要像抽屉那样平分整行：两个并排、靠右、有固定最小宽度 */
  .csh-dlg-f .csh-btn{flex:0 0 auto;min-width:92px;padding:0 20px}
  .csh-fld{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
  .csh-fld>span{font-size:12.5px;color:var(--text-2);font-weight:500}
  .csh-fld .po-in{width:100%;height:36px;max-width:none;font-size:13.5px}
  .csh-fld-row{display:flex;gap:8px}
  .csh-fld-row .po-in{flex:1;min-width:0}
  .csh-fld-row .btn{flex:none;height:36px;white-space:nowrap}
  .csh-dlg-tip{font-size:11.5px;color:var(--text-3);line-height:1.7}

  /* ---- 会员选择弹屏（后四位对上好几个人时用） ---- */
  .csh-mpick{--csh-dlg-w:520px;--csh-dlg-h:600px}
  /* 配送地址：内容只有「地址卡 + 距离 + 订单位置」三段，按这个体量定 460 高 */
  .csh-dlg-addr{--csh-dlg-h:460px}
  .csh-mpick-num{margin-left:8px;font-size:12px;font-weight:400;color:var(--text-3)}
  .csh-mpick-top{flex:none;padding:12px 18px 0}
  .csh-mpick-top .po-in{width:100%;height:36px;max-width:none;font-size:13.5px}
  .csh-mpick-list{flex:1;min-height:0;overflow:auto;padding:10px 12px 12px;display:flex;flex-direction:column;gap:6px}
  /* 快捷键打开、还没输号码时的引导：空列表不能是一片白 */
  .csh-mpick-empty{padding:34px 10px;text-align:center;font-size:13px;color:var(--text-2,#5b6273);line-height:1.9}
  .csh-mpick-empty span{font-size:11.5px;color:var(--text-3,#9aa3b2)}
  /* ---------- 会员选择器里的「就地新建会员」表单（2026-11-06） ----------
     搜不到号码时换掉空态提示：新客现场就能建档，不用先按散客结算、事后再补。
     表单本身用列表的整块宽度，字段竖排（收银台以键盘为主，横排反而要点得准）。 */
  .csh-mnew{
    display:flex;flex-direction:column;gap:12px;padding:16px 16px 14px;
    border:1px solid var(--border);border-radius:12px;background:#fff;
  }
  .csh-mnew-t{font-size:13.5px;font-weight:600;color:var(--text)}
  .csh-mnew-p{
    font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:15px;font-weight:700;
    color:var(--primary);letter-spacing:.6px;margin-top:-6px;
  }
  .csh-mnew-f{display:flex;align-items:center;gap:10px}
  .csh-mnew-f > label{
    flex:none;width:40px;font-size:12.5px;color:var(--text-2);font-weight:600;
  }
  .csh-mnew-f .po-in{height:32px;font-size:13px;flex:1;min-width:0}
  .csh-mnew-sex{display:inline-flex;gap:6px}
  .csh-mnew-sex button{
    height:30px;padding:0 16px;border-radius:8px;border:1px solid var(--input-border);
    background:#fff;font-family:inherit;font-size:13px;color:var(--text-2);cursor:pointer;transition:.14s;
  }
  .csh-mnew-sex button:hover{border-color:var(--primary);color:var(--primary)}
  .csh-mnew-sex button.on{background:rgb(var(--primary-rgb) / .1);border-color:var(--primary);color:var(--primary);font-weight:600}
  .csh-mnew-bd{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
  .csh-mnew-bd .po-in{width:52px;height:32px;flex:none;text-align:center;font-size:13px}
  .csh-mnew-bd i{font-style:normal;font-size:12px;color:var(--text-3)}
  .csh-mnew-bd em{font-style:normal;font-size:11px;color:var(--text-3);margin-left:10px}
  .csh-mnew-ok{width:100%;height:36px;margin-top:2px;display:inline-flex;align-items:center;justify-content:center;gap:8px}
  .csh-mnew-hint{font-size:11px;color:var(--text-3);line-height:1.6;margin-top:-4px}
  body.theme-dark .csh-mnew{background:#23262E}
  body.theme-dark .csh-mnew-sex button{background:#2C2F38}
  .csh-mpick-row{
    display:flex;align-items:center;gap:10px;width:100%;padding:9px 10px;
    border:1px solid var(--border);border-radius:10px;background:#fff;
    font-family:inherit;text-align:left;cursor:pointer;
    transition:border-color .12s,background .12s;
  }
  body.theme-dark .csh-mpick-row{background:#23252E;border-color:#3A3F4C}
  .csh-mpick-row:hover{border-color:#CFD5E2}
  .csh-mpick-row.on{border-color:var(--primary);background:var(--primary-soft)}
  .csh-mpick-ava{
    flex:none;width:34px;height:34px;border-radius:50%;display:grid;place-items:center;
    background:rgb(var(--primary-rgb) / .12);color:var(--primary);font-size:14px;font-weight:600;
  }
  .csh-mpick-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
  .csh-mpick-n{display:flex;align-items:center;gap:6px;font-size:13.5px;color:var(--text);font-weight:500}
  .csh-mpick-n em{
    font-style:normal;font-size:11px;font-weight:400;color:var(--primary);
    background:var(--primary-soft);border-radius:5px;padding:1px 6px;
  }
  .csh-mpick-p{font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums}
  /* 输满全号命中本人：等级标签后面再挂一个「精确」，让人一眼确认没认错人 */
  .csh-mpick-n em.csh-mpick-exact{
    color:#1a7f37;background:rgba(26,127,55,.12);font-weight:600;
  }
  body.theme-dark .csh-mpick-n em.csh-mpick-exact{color:#6fdc8c;background:rgba(111,220,140,.14)}
  .csh-mpick-row.is-exact{border-color:#7ec699}
  .csh-mpick-row.is-exact.on{border-color:var(--primary);background:var(--primary-soft)}
  .csh-mpick-st{
    flex:none;display:flex;flex-direction:column;align-items:flex-end;gap:2px;
    font-size:11.5px;color:var(--text-2);font-variant-numeric:tabular-nums;
  }
  .csh-mpick-st i{font-style:normal}

  /* 地址名称 = 「选择地址」入口：只读框 + 右侧提示，整块可点，跟发单页同一个选择器 */
  .csh-pickin-wrap{position:relative}
  .csh-pickin-wrap .csh-pickin{padding-right:64px;cursor:pointer}
  .csh-pickin-wrap .csh-pickin:hover{border-color:var(--primary)}
  .csh-pickin-ic{
    position:absolute;right:11px;top:50%;transform:translateY(-50%);
    font-size:12px;color:var(--primary);pointer-events:none;
  }

  /* 选择地址器是从收银台弹框（z 2650）里打开的，必须再高一层；
     收银台模式下 .layout 全隐藏，遮罩由 mountMask 改挂 body，左侧不再需要避让导航岛。
     「新建地址」表单（.dlg-mask，z 8000）本来就压在收银台之上，只需去掉那 96px 的侧栏留白。 */
  body.cashier-mode .gsel-mask{z-index:2900;padding:12px}
  body.cashier-mode .dlg-mask{padding:12px}

  body.theme-dark .csh-tier-b{background:#262932;border-color:#3A3F4C}
  body.theme-dark .csh-tier-b.on{background:rgb(var(--primary-rgb) / .18)}
  body.theme-dark .csh-addr-seat{background:#262932;border-color:#3A3F4C}
  body.theme-dark .csh-addr-dist{background:rgb(var(--primary-rgb) / .18);border-color:rgb(var(--primary-rgb) / .30)}
  body.theme-dark .csh-addr-dist.is-wait{background:transparent;border-color:var(--border)}
  body.theme-dark .csh-dist{background:rgb(var(--primary-rgb) / .10);border-color:rgb(var(--primary-rgb) / .26)}
  body.theme-dark .csh-dist.is-none{background:transparent;border-color:var(--border)}

  .csh-pay-box{flex:none;border-top:1px solid var(--border);padding:10px 13px 12px}
  /* 收款方式：按钮做小（2026-11-06）。
     原来 30px 高、14px 内距，十几家店的收款方式能把右栏下半截吃掉；
     现在 26px、9px 内距，同一块地方能多排一行，商品区就多出一行可见高度。 */
  .csh-pays{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:8px}
  .csh-pays-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:5px}
  .csh-pays-l{font-size:11.5px;color:var(--text-3)}
  .csh-pays .chip{height:26px;padding:0 9px;font-size:12px;border-radius:6px}
  .csh-pays .chip .kb{font-size:9px;padding:1px 3px;margin-left:4px}
  /* 不能选的退款方式（散客退储值卡）：复用 .chip.is-disabled 的虚线灰，
     再补一条 :disabled 兜住「没带 is-disabled 的单据」 */
  .csh-pays .chip:disabled{cursor:not-allowed}

  /* 组合支付开关：小号、靠右，不抢付款方式的位置 */
  .csh-combo-sw{
    display:inline-flex;align-items:center;gap:5px;cursor:pointer;
    font-size:11.5px;color:var(--text-2);user-select:none;
  }
  .csh-combo-sw input{width:13px;height:13px;accent-color:var(--primary);cursor:pointer;margin:0}
  .csh-combo-sw:hover{color:var(--primary)}
  .csh-combo{
    margin:8px 0 10px;padding:8px 10px;border-radius:9px;
    background:rgb(var(--primary-rgb) / .05);
    border:1px solid rgb(var(--primary-rgb) / .16);
  }
  .csh-combo-due{
    display:flex;align-items:baseline;gap:8px;margin-bottom:6px;
    font-size:11.5px;color:var(--text-3);
  }
  .csh-combo-due b{font-size:14px;font-weight:700;color:var(--text);margin-left:-2px}
  .csh-combo-due i{margin-left:auto;font-style:normal;font-size:11.5px;color:var(--text-2)}
  .csh-combo-due i.ok{color:#16A34A}
  .csh-combo-due i.over{color:#DC2626}
  .csh-combo-rows{display:flex;flex-direction:column;gap:6px;max-height:132px;overflow:auto}
  .csh-combo-row{display:flex;align-items:center;gap:8px}
  .csh-combo-row .lb{
    flex:none;max-width:104px;font-size:12px;color:var(--text-2);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  .csh-combo-inp{
    flex:1;min-width:0;height:30px;padding:0 8px;font-family:inherit;font-size:13px;
    border:1px solid var(--border);border-radius:7px;background:var(--panel);color:var(--text);
  }
  .csh-combo-inp:focus{outline:none;border-color:var(--primary)}
  .csh-combo-all{
    flex:none;height:28px;padding:0 9px;border-radius:7px;cursor:pointer;
    border:1px solid rgb(var(--primary-rgb) / .22);background:transparent;
    color:var(--primary);font-family:inherit;font-size:11.5px;
  }
  .csh-combo-all:hover{background:rgb(var(--primary-rgb) / .10)}
  .csh-combo-empty{font-size:11.5px;color:var(--text-3);line-height:1.7;padding:2px 0}

  /* 收藏星星：卡片右上角，点击只切换收藏、不加入清单 */
  .csh-fav{
    position:absolute;top:5px;right:6px;z-index:2;
    width:22px;height:22px;line-height:22px;text-align:center;border-radius:6px;
    font-size:15px;color:#C9CCD4;cursor:pointer;user-select:none;
    transition:color .12s,background .12s,transform .08s;
  }
  .csh-fav:hover{color:#F59E0B;background:rgba(245,158,11,.12);transform:scale(1.08)}
  .csh-fav.is-on{color:#F59E0B}
  .csh-fav.is-on:hover{color:#D97706}

  /* 「我的收藏」分类：与普通品类同一行，靠星星标出来 */
  .csh-cat-fav{color:#B4530A}
  .csh-cat-fav .csh-cat-star{font-size:11px;margin-right:3px}
  .csh-cat-fav.on{background:rgba(245,158,11,.16);color:#B4530A;border-color:rgba(245,158,11,.34)}

  /* 销售单位切换（清单行详情抽屉里） */
  .csh-units{display:flex;flex-wrap:wrap;gap:6px}
  .csh-unit-b{
    display:inline-flex;align-items:baseline;gap:4px;
    height:32px;padding:0 12px;border-radius:8px;cursor:pointer;
    border:1px solid var(--border);background:#fff;color:var(--text-2);
    font-family:inherit;font-size:12.5px;
  }
  .csh-unit-b i{font-style:normal;font-size:10.5px;color:var(--text-3)}
  .csh-unit-b:hover{border-color:var(--primary)}
  .csh-unit-b.on{background:var(--primary-soft);border-color:var(--primary);color:var(--primary);font-weight:600}
  .csh-unit-b.on i{color:var(--primary)}

  /* 收藏空态：给一条「去看全部商品」的出口 */
  .csh-fav-empty{line-height:1.9}
  .csh-empty-btn{
    margin-top:10px;height:30px;padding:0 14px;border-radius:8px;cursor:pointer;
    border:1px solid rgb(var(--primary-rgb) / .24);background:rgb(var(--primary-rgb) / .08);
    color:var(--primary);font-family:inherit;font-size:12.5px;
  }
  .csh-empty-btn:hover{background:rgb(var(--primary-rgb) / .14)}

  body.theme-dark .csh-unit-b{background:#262932;border-color:#3A3F4C}
  body.theme-dark .csh-unit-b.on{background:rgb(var(--primary-rgb) / .18);border-color:var(--primary)}
  body.theme-dark .csh-combo{background:rgb(var(--primary-rgb) / .09);border-color:rgb(var(--primary-rgb) / .24)}
  body.theme-dark .csh-combo-inp{background:#262932}
  body.theme-dark .csh-fav{color:#5A5F6B}
  body.theme-dark .csh-fav.is-on{color:#FBBF24}

  /* 结算金额（2026-11-06）：加粗、放大、红色。
     红色不是为了「涨」，是收银台的行业惯例 —— 一眼就能在整块面板里抓到那个数。 */
  .csh-total-row{display:flex;align-items:flex-end;justify-content:space-between;gap:10px;margin-bottom:10px}
  .csh-total-lb{flex:none;font-size:12.5px;color:var(--text-3);padding-bottom:5px}
  .csh-total-row > b{
    flex:none;font-size:30px;font-weight:800;color:var(--danger);
    font-variant-numeric:tabular-nums;line-height:1.1;letter-spacing:-.01em;
  }
  body.theme-dark .csh-total-row > b{color:#FF6B6B}

  /* 合计左边：原价 + 优惠明细（改价 / 积分 / 整单优惠），一行一项。
     顾客问「怎么少了 6 块」，收银员能指着屏幕说清楚，不用心算。
     display:flex 会盖掉 [hidden] 的 UA 规则，补一条显式的 */
  .csh-cut{flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:2px}
  .csh-cut[hidden]{display:none}
  .csh-cut-list{display:flex;flex-direction:column;align-items:flex-start;gap:1px;min-width:0;max-width:100%}
  .csh-cut-i{
    display:flex;align-items:baseline;gap:5px;font-size:11px;color:var(--text-3);
    font-variant-numeric:tabular-nums;white-space:nowrap;
  }
  .csh-cut-i b{font-weight:600;color:var(--primary)}
  .csh-cut-i.is-gross b{color:var(--text-3);opacity:.9;font-weight:500}
  /* 整单优惠入口：没优惠时是一颗淡按钮，有优惠时变实心并带上金额 */
  .csh-cut-btn{
    display:inline-flex;align-items:center;gap:4px;margin-top:2px;
    height:22px;padding:0 7px;border-radius:6px;cursor:pointer;
    border:1px dashed var(--input-border);background:transparent;
    font-family:inherit;font-size:11px;color:var(--text-3);white-space:nowrap;
    transition:border-color .12s,color .12s,background .12s;
  }
  .csh-cut-btn:hover{border-color:var(--primary);color:var(--primary)}
  .csh-cut-btn.is-on{
    border-style:solid;border-color:rgb(var(--primary-rgb) / .34);
    background:rgb(var(--primary-rgb) / .08);color:var(--primary);font-weight:600;
  }
  .csh-cut-btn.is-on b{font-weight:700}
  .csh-cut-btn .kb{font-size:9px;padding:1px 3px;background:rgba(120,130,150,.14);color:var(--text-3)}
  .csh-cut-btn.is-on .kb{color:var(--primary)}

  /* 整单优惠弹窗里的快捷档（抹零 / 折扣） */
  .csh-px-quick{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
  .csh-px-q{
    height:26px;padding:0 10px;border-radius:7px;cursor:pointer;
    border:1px solid var(--border);background:#fff;color:var(--text-2);
    font-family:inherit;font-size:11.5px;white-space:nowrap;
  }
  body.theme-dark .csh-px-q{background:#2C2F38}
  .csh-px-q:hover{border-color:var(--primary);color:var(--primary)}
  .csh-px-q.is-clear{margin-left:auto;color:var(--text-3)}
  .csh-px-q.is-clear:hover{border-color:var(--danger);color:var(--danger)}
  .csh-ds-sum{
    display:flex;align-items:baseline;gap:6px;margin-top:10px;
    font-size:12px;color:var(--text-3);
  }
  .csh-ds-sum b{font-size:15px;font-weight:700;color:var(--primary);font-variant-numeric:tabular-nums}
  .csh-ds-sum em{margin-left:auto;font-style:normal;font-size:11.5px;color:var(--text-3)}
  .csh-ds-sum em.is-err{color:var(--danger)}
  .csh-ds-sum em.is-warn{color:#B45309}
  /* 积分抵扣：合计下面一行小开关 + 抵扣金额。
     display:flex 会盖掉 [hidden] 的 UA 规则，得显式补一条，否则没会员时也会露出一颗空开关 */
  .csh-point{display:flex;align-items:center;gap:8px;margin:-4px 0 10px}
  .csh-point[hidden]{display:none}
  .csh-point-t{font-size:12px;color:var(--text-2)}
  .csh-point-t.is-off{color:var(--text-3)}
  .csh-checkout{
    width:100%;height:50px;border-radius:11px;border:none;cursor:pointer;
    background:var(--primary);color:#fff;font-family:inherit;font-size:16px;font-weight:600;
    letter-spacing:.06em;transition:background .12s;
  }
  .csh-checkout:hover:not(:disabled){background:var(--primary-hover)}
  .csh-checkout:disabled{background:#D9DCE4;color:#fff;cursor:not-allowed}
  /* 暗色下主色被提亮成浅紫，白字压在浅紫上只有 2:1 出头，按主站导航选中态的做法改成深字 */
  body.theme-dark .csh-checkout{color:#171326}
  body.theme-dark .csh-checkout:disabled{background:#33363F;color:#7C8394}
  body.theme-dark .csh-qty{background:#23252E;color:var(--text)}
  body.theme-dark .csh-more{background:#23252E;color:var(--text-2)}

  /* 面板类区块平时都是 flex，UA 的 [hidden] 压不住 —— 需要隐藏的地方显式补一条 */
  .csh-goods[hidden]{display:none}
  .csh-combo-sw[hidden]{display:none}
  /* ---- 接单台 ---- */
  .csh-board{display:flex;flex-direction:column;min-width:0;padding:14px 14px 10px}
  .csh-board-h{
    flex:none;display:flex;align-items:center;gap:10px;padding:0 0 10px;font-size:15px;
  }
  .csh-board-h b{font-weight:600}
  .csh-board-h span{font-size:12px;color:var(--text-3)}
  .csh-board-list{flex:1;overflow:auto;padding:2px 2px 8px;display:flex;flex-direction:column;gap:7px}
  .csh-ord{
    padding:10px 12px;border-radius:10px;border:1px solid var(--border);background:#fff;cursor:pointer;
    transition:border-color .12s,box-shadow .12s;
  }
  body.theme-dark .csh-ord{background:#23252E}
  .csh-ord:hover{border-color:#CFD5E2;box-shadow:0 3px 12px rgba(20,24,35,.06)}
  .csh-ord.on{border-color:var(--primary);background:var(--primary-soft)}
  .csh-ord-top{display:flex;align-items:baseline;gap:10px}
  .csh-ord-top b{font-size:13.5px;font-variant-numeric:tabular-nums}
  .csh-ord-amt{margin-left:auto;font-size:15px;font-weight:700;font-variant-numeric:tabular-nums}
  .csh-ord.on .csh-ord-amt{color:var(--primary)}
  .csh-ord-mid{margin-top:4px;font-size:12.5px;color:var(--text-2)}
  .csh-ord-bot{margin-top:6px;display:flex;align-items:center;gap:8px;min-width:0}
  .csh-ord-goods{
    font-size:11.5px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .csh-tag{
    flex:none;font-size:10.5px;color:var(--text-2);background:#F1F3F8;border-radius:5px;padding:2px 7px;
  }
  body.theme-dark .csh-tag{background:#2C2F38}
  /* 进店销售（无配送）在金流里要一眼认出来：暖色底，跟灰色「配送」标签拉开距离 */
  .csh-tag.is-walkin{color:#B45309;background:#FEF3C7}
  body.theme-dark .csh-tag.is-walkin{color:#FCD34D;background:#3A2E15}

  .csh-detail{
    display:flex;flex-direction:column;padding:16px;overflow:auto;
  }
  .csh-d-h{display:flex;align-items:center;gap:9px;margin-bottom:14px}
  .csh-d-h b{font-size:15px;font-variant-numeric:tabular-nums}
  .csh-d-rows{display:flex;flex-direction:column;gap:8px;margin-bottom:14px}
  .csh-d-rows>div{display:flex;gap:10px;font-size:12.5px}
  .csh-d-rows>div>span{flex:none;width:42px;color:var(--text-3)}
  .csh-d-rows>div>b{font-weight:500;color:var(--text);min-width:0;word-break:break-all}
  .csh-d-goods{
    flex:1;min-height:60px;border-top:1px solid var(--border);border-bottom:1px solid var(--border);
    padding:10px 0;margin-bottom:12px;overflow:auto;
  }
  .csh-d-line{display:flex;gap:8px;font-size:12.5px;padding:4px 0;color:var(--text-2)}
  .csh-d-line span{flex:1;min-width:0}
  .csh-d-line i{font-style:normal;color:var(--text-3);font-variant-numeric:tabular-nums}
  .csh-d-total{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:14px}
  .csh-d-total span{font-size:12.5px;color:var(--text-3)}
  .csh-d-total b{font-size:24px;font-weight:700;font-variant-numeric:tabular-nums}
  .csh-d-ops{display:flex;gap:8px}
  .csh-btn{
    flex:1;height:38px;border-radius:9px;border:1px solid var(--input-border);background:#fff;
    font-family:inherit;font-size:13.5px;color:var(--text-2);cursor:pointer;
  }
  body.theme-dark .csh-btn{background:#23252E}
  /* 上面这条权重比 .csh-btn.primary 高，主按钮在深色下会被刷成深灰底 —— 单独补回来 */
  /* 暗色主色是浅紫 #A78BFA，白字只有 2:1 对比度，改用深字 */
  body.theme-dark .csh-btn.primary{background:var(--primary);border-color:var(--primary);color:#1A1330}
  body.theme-dark .csh-btn.primary:hover{background:var(--primary-hover)}
  .csh-btn:hover{border-color:#C3C9D6;color:var(--text)}
  .csh-btn.primary{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
  .csh-btn.primary:hover{background:var(--primary-hover)}
  .csh-btn:disabled{opacity:.55;cursor:not-allowed}

  /* ---- 流水（门店流水明细） ----
     表体沿用 .dor-* 那套（与主站「数据中心 → 订单数据」同一张表、同一套变量），
     这里只补收银台特有的三件事：
       · 整页定高，表体自己滚 —— 表头 sticky、合计行 sticky 才有意义；
       · 门店徽标，说明这张表只看当前门店（没有门店筛选器）；
       · 主站那张表的弹层是 z-index:200，收银台外壳是 2500，不抬起来会被整层盖住。 */
  .csh-fd{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;padding:14px;gap:10px}
  .csh-fd .dor{flex:1;min-height:0}
  .csh-fd .dor-top,
  .csh-fd .dor-bar,
  .csh-fd .dor-tools{flex:none}
  /* 定高以后由表体接管滚动：不再按视口算 max-height（收银台的头尾高度和主站不一样） */
  .csh-fd .dor-gridwrap{flex:1 1 auto;min-height:180px;max-height:none}
  .csh-fd-store{
    display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--text-3);
    background:rgb(var(--primary-rgb) / .07);border:1px solid rgb(var(--primary-rgb) / .22);
    border-radius:999px;padding:2px 10px;
  }
  .csh-fd-store b{font-weight:600;color:var(--primary)}
  /* 1366 宽的收银屏上，主站那套 240px 的搜索框会把「重置」挤到第二行单独站着；
     这里让搜索框可伸缩，凑满一行就收。 */
  .csh-fd .dor-kw{flex:1 1 200px;min-width:150px}
  .csh-fd .dor-kw input{width:100%}
  /* 24 列在收银屏上必然横向滚动，「查看 / 退货退款」不能跟着滑出屏幕外：
     操作列钉在右边（表头连 top、表体连 right，两轴各钉一边互不干扰）。 */
  .csh-fd .dor-th[data-k="ops"]{
    position:sticky;right:0;z-index:4;
    background:var(--bg-2);box-shadow:-1px 0 0 var(--border);
  }
  .csh-fd .dor-td.ops{
    position:sticky;right:0;z-index:1;
    background:var(--panel);box-shadow:-1px 0 0 var(--border);
  }
  .csh-fd .dor-table tbody tr:hover .dor-td.ops{background:var(--bg-2)}
  body.cashier-mode .dor-mask{z-index:2600}

  /* 侧边栏「收银台」入口：主色描边，和普通菜单项区分开。
     描边颜色跟着 --primary-rgb 走（原来是写死的紫色 #DCCEFB，换青色主题时会打架） */
  .side-cashier{
    color:var(--primary) !important;font-weight:600;
    border:1px solid rgb(var(--primary-rgb) / .38);background:var(--primary-soft);
  }
  .side-cashier:hover{background:rgb(var(--primary-rgb) / .16) !important;border-color:rgb(var(--primary-rgb) / .6)}

  /* ============================================================
     配送设置（设置 → 配送设置）
     这一页是「配置 + 说明书」混合体：左边要能改，右边要让人看懂
     小程序到底长什么样、每个页面吃什么数据。所以不用纯表单排法。
     ============================================================ */
  .dlv-wrap{display:flex;flex-direction:column;gap:0}

  .dlv-sum{
    display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:16px;
  }
  .dlv-sum-i{
    background:#fff;border:1px solid var(--border);border-radius:10px;padding:12px 14px;
    display:flex;flex-direction:column;gap:5px;
  }
  .dlv-sum-i span{font-size:12px;color:var(--text-3)}
  .dlv-sum-i b{font-size:15px;font-weight:700;font-variant-numeric:tabular-nums}
  .dlv-sum-i b.ok{color:var(--ok)}
  .dlv-sum-i b.no{color:#B45309}

  .dlv-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-bottom:14px}
  .dlv-grid-4{grid-template-columns:repeat(4,1fr)}
  .dlv-grid.is-off{opacity:.5}
  .dlv-grid.is-off input{cursor:not-allowed}

  /* 直接挂在分组里的字段（不在一行两列的 .dlv-grid 里）单独给下边距，
     否则 textarea 的说明文字会和下一个字段的标签贴在一起 */
  .stg-group-body > .dlv-f{margin-bottom:14px}
  .dlv-f{display:flex;flex-direction:column;gap:6px;min-width:0}
  .dlv-k{font-size:12.5px;color:var(--text-2);font-weight:500}
  /* .po-in 全局带 max-width:500px（主站表单用的），这一页是整列布局，
     不解除的话 textarea 只占半截、右边空一大片，格子还会串行 */
  .dlv-wrap .po-in{max-width:none;width:100%}
  .dlv-f .po-in{height:36px;font-size:13.5px}
  .dlv-ta{height:auto!important;padding:9px 11px;line-height:1.6;resize:vertical;font-family:inherit}
  .dlv-hint{font-size:11.5px;color:var(--text-3);line-height:1.6}

  .dlv-switch-row{
    display:flex;align-items:flex-start;gap:16px;padding:12px 14px;margin-bottom:12px;
    border:1px solid var(--border);border-radius:10px;background:#FAFBFD;
  }
  .dlv-switch-l{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}
  .dlv-switch-l b{font-size:13.5px;color:var(--text)}
  .dlv-switch-l span{font-size:12px;color:var(--text-3);line-height:1.6}

  .dlv-sub-t{font-size:12.5px;color:var(--text-2);font-weight:600;margin:16px 0 8px}
  .dlv-banners{display:flex;flex-direction:column;gap:8px}
  .dlv-banner{
    display:flex;align-items:flex-start;gap:10px;padding:10px;
    border:1px solid var(--border);border-radius:9px;background:#FAFBFD;
  }
  .dlv-bn-i{
    flex:none;width:20px;height:20px;border-radius:6px;background:var(--primary-soft);
    color:var(--primary);font-size:11.5px;font-weight:700;
    display:flex;align-items:center;justify-content:center;margin-top:8px;
  }
  .dlv-bn-f{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}
  .dlv-bn-f .po-in{height:32px;font-size:12.5px}
  .dlv-bn-ops{flex:none;display:flex;flex-direction:column;gap:4px}
  .dlv-mini{
    width:24px;height:22px;border-radius:5px;border:1px solid var(--input-border);
    background:#fff;color:var(--text-2);font-size:12px;line-height:1;cursor:pointer;padding:0;
  }
  .dlv-mini:hover:not(:disabled){border-color:var(--primary);color:var(--primary)}
  .dlv-mini:disabled{opacity:.35;cursor:not-allowed}
  .dlv-mini.del:hover{background:#FEE2E2;border-color:#FCA5A5;color:var(--danger)}

  .dlv-add{
    margin-top:10px;height:34px;padding:0 14px;border-radius:8px;
    border:1px dashed var(--input-border);background:#fff;
    font-family:inherit;font-size:12.5px;color:var(--text-2);cursor:pointer;
  }
  .dlv-add:hover{border-color:var(--primary);color:var(--primary)}
  .dlv-empty{font-size:12.5px;color:var(--text-3);padding:14px;text-align:center;border:1px dashed var(--border);border-radius:9px}

  .dlv-table{width:100%;border-collapse:collapse;font-size:12.5px}
  .dlv-table th{
    text-align:left;font-weight:500;color:var(--text-3);padding:8px 10px;
    border-bottom:1px solid var(--border);background:#FAFBFD;
  }
  .dlv-table td{padding:8px 10px;border-bottom:1px solid #F3F4F8;color:var(--text-2)}
  .dlv-table tr:last-child td{border-bottom:none}
  .dlv-table td:first-child{color:var(--text);font-weight:500;white-space:nowrap}
  .dlv-table code{
    background:#F1F3F8;border-radius:4px;padding:1px 5px;font-size:11.5px;
    font-family:ui-monospace,Menlo,Consolas,monospace;color:var(--text-2);
  }

  @media (max-width:1100px){
    .dlv-grid-4{grid-template-columns:repeat(2,1fr)}
    .dlv-sum{grid-template-columns:repeat(2,1fr)}
  }

/* ================= 键位提示 / 键位表 / 小票打印 =================
   键帽统一用 .kb：小药丸 + 等宽字体，紧跟在按钮文案后面。
   颜色只用弱化灰，别抢主按钮的注意力。 */
.kb{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:19px;height:18px;padding:0 5px;margin-left:6px;
  border-radius:4px;border:1px solid var(--border);
  background:rgba(17,20,30,.04);color:var(--text-2);
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:11px;line-height:1;white-space:nowrap;vertical-align:middle;
}
body.theme-dark .kb{background:rgba(255,255,255,.08);border-color:#3A3F4C;color:#C3C9D6}
.kb-mini{min-width:14px;height:15px;padding:0 4px;margin-left:5px;font-size:10.5px;opacity:.75}
.kb-light{
  border-color:rgba(255,255,255,.42);background:rgba(255,255,255,.16);
  color:#fff;margin-left:8px;
}
.kb-hint{margin-left:8px;flex:none;opacity:.9}

/* 键盘焦点：不只靠浏览器默认虚线，收银台隔一米也要看得见 */
.csh-card.is-kb{outline:2px solid var(--primary);outline-offset:1px;border-color:var(--primary)}
.csh-line.is-kb{outline:2px solid var(--primary);outline-offset:-2px;border-radius:8px}
.csh-line:focus{outline:none}
.csh-line:focus-visible{outline:2px solid var(--primary);outline-offset:-2px}

/* 会员条「换会员」：只在认到人之后出现 */
.csh-mem-swap{
  flex:none;height:32px;padding:0 13px;border-radius:9px;
  border:1px solid var(--input-border);background:#fff;color:var(--text-2);
  font-family:inherit;font-size:12.5px;font-weight:500;cursor:pointer;
  display:inline-flex;align-items:center;transition:border-color .12s,color .12s;
}
.csh-mem-swap:hover{border-color:var(--primary);color:var(--primary)}
body.theme-dark .csh-mem-swap{background:#262932;border-color:#3A3F4C;color:#C3C9D6}
/* display:inline-flex 会盖掉浏览器对 [hidden] 的 display:none，必须补这一条 */
.csh-mem-swap[hidden]{display:none}

/* 刚刚结算那条上的「补打小票」 */
.csh-last-print{
  margin-left:8px;height:22px;padding:0 8px;border-radius:6px;
  border:1px solid var(--input-border);background:#fff;color:var(--text-2);
  font-family:inherit;font-size:11.5px;cursor:pointer;display:inline-flex;align-items:center;
}
.csh-last-print:hover{border-color:var(--primary);color:var(--primary)}
body.theme-dark .csh-last-print{background:#262932;border-color:#3A3F4C}

/* ---- 键位表（Alt+H） ---- */
.kb-help-mask{
  position:fixed;inset:0;z-index:3200;display:flex;align-items:center;justify-content:center;
  background:rgba(20,24,35,.42);backdrop-filter:blur(2px);opacity:0;transition:opacity .16s;
}
.kb-help-mask.open{opacity:1}
/* 左侧抽屉形态（2026-11-04）：收银台左下「快捷键」按钮与 Alt+H 共用同一个 help()。
   贴左边、满高、圆角只留右侧，从左侧滑进来 —— 遮罩只压暗不模糊，右边的商品格还看得见。 */
.kb-help-mask.is-drawer{align-items:center;justify-content:flex-start;backdrop-filter:none}
.kb-help-mask.is-drawer .kb-help{
  width:min(430px,92vw);height:calc(100% - 28px);max-height:none;margin-left:14px;
  border:1px solid var(--border);border-radius:16px;
  transform:translateX(-28px) scale(.994);opacity:0;
  transition:transform .26s cubic-bezier(.22,1,.36,1),opacity .18s ease;
  box-shadow:0 24px 70px rgba(17,20,30,.26);
}
.kb-help-mask.is-drawer.open .kb-help{transform:none;opacity:1}
.kb-help{
  width:min(780px,94vw);height:min(640px,86vh);display:flex;flex-direction:column;overflow:hidden;
  background:var(--panel);border-radius:16px;box-shadow:0 24px 70px rgba(17,20,30,.28);
}
.kb-help-h{flex:none;display:flex;align-items:baseline;gap:10px;padding:15px 18px;border-bottom:1px solid var(--border)}
.kb-help-h b{font-size:15px;font-weight:700}
.kb-help-h span{font-size:12px;color:var(--text-3)}
.kb-help-h .csh-dw-x{margin-left:auto;align-self:center}
.kb-help-b{
  flex:1;min-height:0;overflow:auto;padding:14px 18px;
  display:grid;grid-template-columns:repeat(auto-fill,minmax(232px,1fr));gap:16px 22px;
}
.kb-help-gt{font-size:12px;font-weight:600;color:var(--text-3);margin-bottom:6px}
.kb-help-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:3px 0}
.kb-help-row span{font-size:12.5px;color:var(--text-2)}
.kb-help-row kbd{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;
  padding:2px 6px;border-radius:4px;border:1px solid var(--border);
  background:rgba(17,20,30,.04);color:var(--text-2);white-space:nowrap;
}
body.theme-dark .kb-help-row kbd{background:rgba(255,255,255,.08);border-color:#3A3F4C;color:#C3C9D6}
.kb-help-f{flex:none;padding:10px 18px;border-top:1px solid var(--border);font-size:11.5px;color:var(--text-3)}

/* ---- 设置 → 收银台设置 ---- */
.cstg-intro{
  font-size:12.5px;line-height:1.8;color:var(--text-2);
  background:var(--primary-soft);border-radius:10px;padding:10px 14px;margin-bottom:14px;
}
.cstg-switches{display:flex;flex-direction:column;gap:2px;padding:6px 0}
.cstg-sw{display:flex;align-items:flex-start;gap:10px;padding:9px 4px;cursor:pointer;border-radius:8px}
.cstg-sw:hover{background:rgba(17,20,30,.03)}
body.theme-dark .cstg-sw:hover{background:rgba(255,255,255,.04)}
.cstg-sw input{margin-top:2px;flex:none;width:16px;height:16px}
.cstg-sw span{display:flex;flex-direction:column;gap:2px}
.cstg-sw b{font-size:13px;font-weight:500;color:var(--text)}
.cstg-sw i{font-style:normal;font-size:11.5px;color:var(--text-3);line-height:1.6}
/* 「浏览器功能键」那一行：左侧标题 + 下拉，说明文字另起一行铺满 */
.cstg-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 4px 8px;margin-top:2px;border-top:1px dashed var(--border)}
.cstg-row-lb{font-size:13px;color:var(--text);flex:none}
.cstg-row-hint{flex-basis:100%;font-size:11.5px;color:var(--text-3);line-height:1.7;margin-top:2px}
.cstg-tip{font-size:11.5px;color:var(--text-3);padding:0 18px 10px}
.cstg-warn{color:var(--danger)}
.cstg-keys{padding:4px 18px 16px;display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:18px 26px}
.cstg-group-t{font-size:12px;font-weight:600;color:var(--text-3);margin-bottom:6px}
.cstg-row{
  display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px dashed var(--border);
}
.cstg-row.is-dup{background:rgba(220,38,38,.06);border-radius:6px;padding-left:6px;padding-right:6px}
.cstg-n{flex:1;min-width:0;font-size:12.5px;color:var(--text-2);display:flex;align-items:center;gap:6px}
.cstg-mod{font-style:normal;font-size:10.5px;color:var(--primary);background:var(--primary-soft);border-radius:4px;padding:1px 5px}
.cstg-kb.is-shift{border-style:dashed;border-color:#e0a83a;color:#8a5a00;cursor:help}
body.theme-dark .cstg-kb.is-shift{border-color:#c9922e;color:#ffcf70}
.cstg-kb{
  flex:none;min-width:56px;text-align:center;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;
  padding:3px 7px;border-radius:5px;border:1px solid var(--border);
  background:rgba(17,20,30,.04);color:var(--text);
}
body.theme-dark .cstg-kb{background:rgba(255,255,255,.08);border-color:#3A3F4C;color:#E6E8EE}
.cstg-kb.is-empty{color:var(--text-3);font-family:inherit}
.cstg-rec{flex:none;height:26px;padding:0 10px;font-size:12px}
.cstg-rec.rec{background:var(--primary);border-color:var(--primary);color:#fff}
.cstg-clear{
  flex:none;width:22px;height:22px;border:none;background:transparent;border-radius:5px;
  color:var(--text-3);cursor:pointer;font-size:12px;line-height:1;
}
.cstg-clear:hover{background:rgba(220,38,38,.1);color:var(--danger)}

/* ================= 小票（屏幕预览与打印共用同一套样式） =================
   票面由 receipt.js 按模板渲染，宽度取 --rcp-w（58mm 纸 48mm、80mm 纸 72mm）。
   字号 / 对齐由内联 style 决定，这里只管底色、行距和各种行的骨架。 */
.rcp{
  width:var(--rcp-w,48mm);box-sizing:border-box;
  color:#000;background:#fff;
  font-family:"PingFang SC","Microsoft YaHei",system-ui,sans-serif;
  font-size:12px;line-height:1.55;
}
.rcp-b{margin:0}
.rcp-store{font-weight:700;margin-bottom:2px}
.rcp-row{display:flex;justify-content:space-between;gap:6px}
.rcp-row>span{flex:0 0 auto;max-width:54%;color:#222}
.rcp-row>b{flex:1 1 auto;min-width:0;font-weight:400;text-align:right;word-break:break-all}
.rcp-hr{border-top:1px dashed #000;margin:5px 0}
/* 「合计金额」和「扫码支付」之间那道浅线：热敏纸上会打成浅灰点阵，比虚线轻 */
.rcp-hr.rcp-hr-lt{border-top:1px solid #BFBFBF;margin:4px 0}
.rcp-items{margin:2px 0}
.rcp-item{margin:3px 0}
.rcp-item-n{word-break:break-all}
.rcp-item-m{display:flex;justify-content:space-between;gap:6px;color:#222}

/* ---- 三列商品表（品名/售价 · 数量 · 小计）2026-11-05 按样张改版 ----
   左栏竖着放「品名 / 单位 / 单价」，数量和金额跟单价那一行贴底对齐，
   所以整行 align-items:end；数字列用固定宽度（22/44px），
   否则长商品名会把数量和小计挤成两三行。 */
.rcp-items.is-cols{margin:1px 0}
.rcp-items.is-cols .rcp-tr{
  display:grid;grid-template-columns:minmax(0,1fr) 22px 44px;
  column-gap:4px;align-items:end;
}
.rcp-items.is-cols .rcp-tr + .rcp-tr{margin-top:4px}
.rcp-items.is-cols .rcp-th{font-size:10px;font-weight:700;line-height:1.4;padding-bottom:1px}
.rcp-c1{min-width:0;word-break:normal;overflow-wrap:anywhere}
.rcp-c2{text-align:center;white-space:nowrap}
.rcp-c3{text-align:right;white-space:nowrap}
.rcp-in{display:block;font-weight:inherit;line-height:1.45}
.rcp-iu,.rcp-ip{display:block;font-style:normal;font-size:11px;line-height:1.4}
.rcp[data-paper="80"] .rcp-items.is-cols .rcp-tr{grid-template-columns:minmax(0,1fr) 34px 66px}
.rcp[data-paper="80"] .rcp-items.is-cols .rcp-th{font-size:11px}

/* ---- 顾客大字 + 门店/客服双列 ---- */
.rcp-person{display:flex;flex-wrap:wrap;align-items:baseline;gap:0 8px;margin:4px 0 2px;line-height:1.3}
.rcp-person b,.rcp-person span{font-weight:inherit}
.rcp-person span{letter-spacing:.2px}
.rcp-duo{display:flex;flex-wrap:wrap;gap:0 14px;margin:2px 0}
.rcp-duo>span{flex:0 0 auto}
.rcp-tline{word-break:break-all}
.rcp-pays{margin:2px 0}
/* 小计不折行：明细里加了「单位」之后左侧变长，金额被挤到第二行会让人以为多收了一笔 */
.rcp-item-m b{white-space:nowrap}
/* 加粗交给模板的 bold 属性：样张上的「合计金额」是常规字重，只比明细大一号 */
.rcp-total{display:flex;justify-content:space-between;align-items:baseline;font-size:14px;margin:5px 0}
.rcp-total b{font-weight:inherit}
.rcp-foot{color:#222}
.rcp-space{width:100%}
.rcp-img img{max-width:100%;height:auto;display:inline-block;vertical-align:middle}
.rcp-qr{margin:4px 0 2px}
.rcp-qr img{display:inline-block;max-width:100%}
/* 普通二维码是内联 SVG：矢量，热敏打印边缘锐利；这里只保证它按块居中、不变形 */
.rcp-qr-svg{display:inline-block;vertical-align:middle;max-width:100%;height:auto}
.rcp-qr-t{font-size:9px;line-height:1.5;margin-top:2px;color:#000}
.rcp-qr-ph{
  display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  border:1px dashed #9AA3B2;border-radius:4px;color:#8A93A3;font-size:10px;
}
.rcp-qr-ph b{font-weight:600;font-size:10px}
.rcp-qr-ph i{font-style:normal;font-size:9px}

/* 真正的打印容器：屏上不占位，打印时才出现 */
#cshReceipt{display:none}

@media print{
  @page{margin:5mm}
  html,body{background:#fff !important}
  body > :not(#cshReceipt){display:none !important}
  #cshReceipt{display:block !important;color:#000;background:#fff}
  /* 别把票拉满整张纸：58mm 的票在 A4 打印机上也要保持 48mm 宽，居中 */
  #cshReceipt .rcp{width:var(--rcp-w);max-width:100%;margin:0 auto}
}

/* ================= 设置 → 收银台设置 ================= */
.cstg-tabs{display:flex;gap:4px;margin-bottom:14px;border-bottom:1px solid var(--border)}
.cstg-tab{
  position:relative;height:36px;padding:0 16px;border:none;background:transparent;
  font-family:inherit;font-size:13px;color:var(--text-2);cursor:pointer;border-radius:8px 8px 0 0;
}
.cstg-tab:hover{color:var(--text)}
.cstg-tab.on{color:var(--primary);font-weight:600}
.cstg-tab.on::after{
  content:"";position:absolute;left:12px;right:12px;bottom:-1px;height:2px;
  background:var(--primary);border-radius:2px;
}
.cstg-pane[hidden]{display:none}

.cstg-intro{
  font-size:12.5px;line-height:1.8;color:var(--text-2);
  background:var(--primary-soft);border-radius:10px;padding:10px 14px;margin-bottom:14px;
}
.cstg-intro b{font-weight:600;color:var(--text)}
.cstg-intro code{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;
  background:rgba(17,20,30,.06);border-radius:4px;padding:1px 5px;
}
.cstg-switches{display:flex;flex-direction:column;gap:2px;padding:6px 0}
.cstg-sw{display:flex;align-items:flex-start;gap:10px;padding:9px 4px;cursor:pointer;border-radius:8px}
.cstg-sw:hover{background:rgba(17,20,30,.03)}
body.theme-dark .cstg-sw:hover{background:rgba(255,255,255,.04)}
.cstg-sw input{margin-top:2px;flex:none;width:16px;height:16px}
.cstg-sw span{display:flex;flex-direction:column;gap:2px}
.cstg-sw b{font-size:13px;font-weight:500;color:var(--text)}
.cstg-sw i{font-style:normal;font-size:11.5px;color:var(--text-3);line-height:1.6}
/* 「浏览器功能键」那一行：左侧标题 + 下拉，说明文字另起一行铺满 */
.cstg-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 4px 8px;margin-top:2px;border-top:1px dashed var(--border)}
.cstg-row-lb{font-size:13px;color:var(--text);flex:none}
.cstg-row-hint{flex-basis:100%;font-size:11.5px;color:var(--text-3);line-height:1.7;margin-top:2px}
.cstg-tip{font-size:11.5px;color:var(--text-3);padding:0 18px 10px}
.cstg-warn{color:var(--danger)}
.cstg-keys{padding:4px 18px 16px;display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:18px 26px}
.cstg-group-t{font-size:12px;font-weight:600;color:var(--text-3);margin-bottom:6px}
.cstg-row{
  display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px dashed var(--border);
}
.cstg-row.is-dup{background:rgba(220,38,38,.06);border-radius:6px;padding-left:6px;padding-right:6px}
.cstg-n{flex:1;min-width:0;font-size:12.5px;color:var(--text-2);display:flex;align-items:center;gap:6px}
.cstg-mod{font-style:normal;font-size:10.5px;color:var(--primary);background:var(--primary-soft);border-radius:4px;padding:1px 5px}
.cstg-kb.is-shift{border-style:dashed;border-color:#e0a83a;color:#8a5a00;cursor:help}
body.theme-dark .cstg-kb.is-shift{border-color:#c9922e;color:#ffcf70}
.cstg-kb{
  flex:none;min-width:56px;text-align:center;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;
  padding:3px 7px;border-radius:5px;border:1px solid var(--border);
  background:rgba(17,20,30,.04);color:var(--text);
}
body.theme-dark .cstg-kb{background:rgba(255,255,255,.08);border-color:#3A3F4C;color:#E6E8EE}
.cstg-kb.is-empty{color:var(--text-3);font-family:inherit}
.cstg-rec{flex:none;height:26px;padding:0 10px;font-size:12px}
.cstg-rec.rec{background:var(--primary);border-color:var(--primary);color:#fff}
.cstg-clear{
  flex:none;width:22px;height:22px;border:none;background:transparent;border-radius:5px;
  color:var(--text-3);cursor:pointer;font-size:12px;line-height:1;
}
.cstg-clear:hover{background:rgba(220,38,38,.1);color:var(--danger)}

/* ---- 小票设计器 ---- */
/* 两张票的切换：配送 / 进店各自一套版式，顶上一眼看清现在改的是哪张 */
.rcp-tabs{display:flex;gap:10px;margin:2px 0 12px;flex-wrap:wrap}
.rcp-tab{
  flex:1 1 260px;max-width:420px;text-align:left;cursor:pointer;
  display:flex;flex-direction:column;gap:3px;
  padding:10px 14px;border:1px solid var(--border);border-radius:11px;background:var(--surface);
  color:var(--text);transition:border-color .15s,box-shadow .15s,background .15s;
}
.rcp-tab b{font-size:13.5px;font-weight:700}
.rcp-tab i{font-style:normal;font-size:11.5px;color:var(--text-3);line-height:1.45}
.rcp-tab:hover{border-color:rgb(var(--primary-rgb) / .45)}
.rcp-tab.on{
  border-color:var(--primary);background:rgb(var(--primary-rgb) / .06);
  box-shadow:0 0 0 2px rgb(var(--primary-rgb) / .10);
}
.rcp-tab.on b{color:var(--primary)}
.rcp-card .acct-head{gap:10px;flex-wrap:wrap}
.rcp-paper{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-3)}
.rcp-paper select{height:30px;font-size:12.5px;padding:0 8px;width:auto;min-width:132px}
.rcp-layout{
  display:grid;grid-template-columns:190px minmax(0,1fr) 300px;gap:14px;
  padding:14px 18px 16px;align-items:start;
}
@media(max-width:1180px){
  .rcp-layout{grid-template-columns:170px minmax(0,1fr)}
  .rcp-prev{grid-column:1 / -1}
}
.rcp-lib{
  border:1px solid var(--border);border-radius:10px;padding:8px 6px 10px;
  max-height:640px;overflow:auto;background:rgba(17,20,30,.015);
}
body.theme-dark .rcp-lib{background:rgba(255,255,255,.03)}
.rcp-lib-g{margin-bottom:10px}
.rcp-lib-t{font-size:11px;font-weight:600;color:var(--text-3);padding:2px 6px 5px}
.rcp-lib-items{display:flex;flex-direction:column;gap:3px}
.rcp-chip{
  display:block;width:100%;text-align:left;padding:5px 8px;border-radius:6px;
  border:1px dashed transparent;background:transparent;color:var(--text-2);
  font-family:inherit;font-size:12px;cursor:pointer;
}
.rcp-chip:hover{border-color:var(--primary);color:var(--primary);background:var(--primary-soft)}
.rcp-mid{min-width:0;display:flex;flex-direction:column;gap:10px}
.rcp-list{
  border:1px solid var(--border);border-radius:10px;padding:6px;
  max-height:420px;overflow:auto;
}
.rcp-line{
  display:flex;align-items:center;gap:7px;padding:6px 6px;border-radius:7px;
  cursor:pointer;border:1px solid transparent;
}
.rcp-line:hover{background:rgba(17,20,30,.03)}
body.theme-dark .rcp-line:hover{background:rgba(255,255,255,.04)}
.rcp-line.on{border-color:var(--primary);background:var(--primary-soft)}
.rcp-line.is-drag{opacity:.45}
.rcp-line.is-over{border-color:var(--primary);border-style:dashed}
.rcp-drag{flex:none;color:var(--text-3);font-size:12px;cursor:grab;letter-spacing:-1px}
.rcp-badge{
  flex:none;width:20px;height:20px;border-radius:5px;display:grid;place-items:center;
  background:rgba(17,20,30,.05);font-size:11px;color:var(--text-2);
}
body.theme-dark .rcp-badge{background:rgba(255,255,255,.08)}
.rcp-name{flex:1;min-width:0;font-size:12.5px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rcp-name i{font-style:normal;font-size:10.5px;color:var(--text-3);margin-left:6px}
.rcp-ops{flex:none;display:flex;gap:2px}
.rcp-ops button{
  width:22px;height:22px;border:1px solid transparent;background:transparent;border-radius:5px;
  color:var(--text-3);cursor:pointer;font-size:11px;line-height:1;
}
.rcp-ops button:hover:not(:disabled){border-color:var(--border);color:var(--text);background:#fff}
body.theme-dark .rcp-ops button:hover:not(:disabled){background:#2A2E38}
.rcp-ops button:disabled{opacity:.3;cursor:default}
.rcp-ops button[data-op="del"]:hover{color:var(--danger);border-color:rgba(220,38,38,.3)}
.rcp-addend{
  width:100%;height:30px;margin-top:4px;border:1px dashed var(--border);border-radius:7px;
  background:transparent;color:var(--text-3);font-family:inherit;font-size:12px;cursor:pointer;
}
.rcp-addend:hover{border-color:var(--primary);color:var(--primary)}

.rcp-props{border:1px solid var(--border);border-radius:10px;padding:12px 14px}
.rcp-empty{font-size:12px;color:var(--text-3);line-height:1.8;padding:6px 2px}
.rcp-props-h{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.rcp-props-h b{font-size:13px;font-weight:600}
.rcp-props-id{font-size:11px;color:var(--text-3)}
.rcp-props-del{
  margin-left:auto;height:24px;padding:0 8px;border-radius:6px;border:1px solid var(--border);
  background:#fff;color:var(--text-3);font-family:inherit;font-size:11.5px;cursor:pointer;
}
.rcp-props-del:hover{color:var(--danger);border-color:rgba(220,38,38,.3)}
body.theme-dark .rcp-props-del{background:#262932;border-color:#3A3F4C}
.rcp-fld{display:flex;flex-direction:column;gap:4px;margin-bottom:10px;min-width:0}
.rcp-fld>span{font-size:11.5px;color:var(--text-3)}
.rcp-fld .po-in{height:32px;font-size:12.5px;width:100%}
.rcp-props-2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px}
.rcp-props-2 .rcp-fld{margin-bottom:6px}
.rcp-props-grid{display:grid;grid-template-columns:auto auto auto;justify-content:start;gap:22px}
.rcp-seg{display:flex;gap:3px;flex-wrap:wrap}
.rcp-sb{
  height:28px;min-width:34px;padding:0 8px;border-radius:6px;cursor:pointer;
  border:1px solid var(--border);background:#fff;color:var(--text-2);
  font-family:inherit;font-size:12px;
}
body.theme-dark .rcp-sb{background:#262932;border-color:#3A3F4C;color:#C3C9D6}
.rcp-sb:hover{border-color:var(--primary);color:var(--primary)}
.rcp-sb.on{background:var(--primary);border-color:var(--primary);color:#fff}

.rcp-imgrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.rcp-imgprev{
  width:96px;height:56px;flex:none;display:grid;place-items:center;overflow:hidden;
  border:1px dashed var(--border);border-radius:7px;background:#fff;
}
body.theme-dark .rcp-imgprev{background:#21242C;border-color:#3A3F4C}
.rcp-imgprev img{max-width:100%;max-height:100%;object-fit:contain}
.rcp-imgprev i{font-style:normal;font-size:11px;color:var(--text-3)}
.rcp-imgtip{display:block;font-style:normal;font-size:11px;line-height:1.6;color:var(--text-3);margin-top:6px}
.rcp-ck{display:flex;align-items:flex-start;gap:7px;font-size:12px;color:var(--text-2);margin:2px 0 8px;cursor:pointer;line-height:1.6}
.rcp-ck input{margin-top:2px;flex:none;width:15px;height:15px}
.rcp-note{font-size:11.5px;line-height:1.7;color:var(--text-3);background:rgba(17,20,30,.03);border-radius:7px;padding:7px 9px}
body.theme-dark .rcp-note{background:rgba(255,255,255,.04)}

.rcp-prev{min-width:0}
.rcp-prev-h{
  display:flex;align-items:baseline;gap:8px;font-size:11.5px;color:var(--text-3);
  padding:0 2px 8px;
}
.rcp-prev-h span{font-size:10.5px;color:var(--text-3);opacity:.8}
.rcp-prev-paper{
  background:#fff;border-radius:6px;padding:10px 8px 14px;
  box-shadow:0 6px 20px rgba(17,20,30,.12);border:1px solid var(--border);
  display:flex;justify-content:center;max-height:560px;overflow:auto;
}
/* 纸宽要真实：80mm 的 72mm 比预览列还宽，宁可横向滚动也不许把票压窄
   （压窄后换行位置跟真打出来不一样，预览就骗人了） */
.rcp-prev-paper .rcp{flex:0 0 auto}
body.theme-dark .rcp-prev-paper{border-color:#3A3F4C;box-shadow:0 6px 20px rgba(0,0,0,.35)}

/* ============================================================
   设置 · 配送小程序（模拟器 + 发版）
   ------------------------------------------------------------
   手机壳宽度按 375 设计稿做，里面渲染的是小程序源码（rpx 换算成 0.5px），
   所以这里看到的间距/字号跟真机 1:1，不是示意图。
   ============================================================ */
/* 手机壳外面那一圈金属边是 box-shadow 画的，不占布局尺寸 ——
   容器必须自己留出 12px 余量，否则顶部和左缘会被滚动区直接裁掉。
   顶部再多给一点，让手机从标题下面「落」下来，不要贴着页头。 */
.mpv{display:flex;gap:28px;align-items:flex-start;padding:30px 8px 28px 20px}
/* 手机框钉在原地：右边一堆配置卡往下滚时，手机不能跟着跑掉 ——
   改一个颜色就得回头找一眼效果，滚走了等于没法对照。
   sticky 靠 .content 这个滚动容器生效（祖先不能有 overflow:hidden）。 */
.mpv-phone{flex:0 0 auto;position:sticky;top:10px;align-self:flex-start;z-index:2}
.mpv-shell{
  /* 高度跟着窗口走，但要**比可视区明显矮一截**：
     手机框是 sticky 的，元素自身高度必须小于「滚动容器可视高 - 容器上下内边距」，
     否则滑到底时会被容器下沿顶上去（表现为「还是会跟着滚一点」）。
     经验值：留 280px（顶栏 + 上下留白 + 底栏），900 高的屏上机身 620。 */
  width:375px;height:clamp(440px, calc(100vh - 280px), 700px);
  background:#f4f5f7;border-radius:34px;overflow:hidden;
  box-shadow:0 0 0 10px #1f2430, 0 0 0 12px #323847, 0 18px 40px rgba(15,23,42,.28);
  display:flex;flex-direction:column;position:relative;
}
.mpv-bar{
  height:30px;flex:0 0 30px;display:flex;align-items:center;justify-content:space-between;
  padding:0 20px;font-size:12px;font-weight:600;color:#111827;background:#fff;
}
.mpv-bar-r{letter-spacing:1px;font-size:11px;font-weight:500}
/* 登录页在小程序里是 navigationStyle:custom：渐变要顶到状态栏。
   预览时把模拟状态栏也染成同一个青，才和真机一致。 */
.mpv-shell.custom .mpv-bar{background:#0AA3C7;color:#fff}
.mpv-shell.custom .mpv-bar-r{color:rgba(255,255,255,.92)}
.mpv-nav{
  height:44px;flex:0 0 44px;background:#fff;display:flex;align-items:center;justify-content:center;
  position:relative;font-size:17px;font-weight:600;color:#111827;border-bottom:1px solid #f0f1f4;
}
.mpv-cap{position:absolute;right:14px;font-size:13px;color:#111827;letter-spacing:2px}
.mpv-stage{flex:1 1 auto;overflow:hidden;position:relative;background:#f4f5f7}
/* 宿主单独一层：滚动发生在它内部的 #mp-root 里，fixed 底栏才固定得住 */
.mpv-host{height:100%;overflow:hidden}
.mpv-note{margin-top:14px;font-size:12px;color:#8a92a3;text-align:center;line-height:1.6}

.mpv-side{flex:1 1 auto;min-width:280px;max-width:420px;display:flex;flex-direction:column;gap:16px}
.mpv-card{background:#fff;border:1px solid #eef0f4;border-radius:12px;padding:16px 18px}
.mpv-card h4{margin:0 0 12px;font-size:14px;color:#1f2937;font-weight:600}
.mpv-tabs{display:flex;gap:8px;margin-bottom:12px}
.mpv-tab{
  flex:1;height:34px;border:1px solid #e5e7eb;background:#fff;border-radius:8px;
  font-size:13px;color:#4b5563;cursor:pointer;font-family:inherit;
}
.mpv-tab.on{background:#eef6ff;border-color:#bcd9f5;color:#0369a1;font-weight:600}
.mpv-hint{font-size:12px;color:#8a92a3;line-height:1.7;margin:10px 0}
  .mpv-build{font-size:11.5px;color:#94a3b8;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin:-2px 0 10px}
.mpv-btn{
  width:100%;height:38px;border-radius:9px;border:1px solid #e5e7eb;background:#fff;
  font-size:13px;color:#374151;cursor:pointer;font-family:inherit;
}
.mpv-btn:hover{background:#f9fafb}
.mpv-bank{margin-top:10px}
.mpv-bank[hidden]{display:none}
.mpv-btn.primary{background:#0ea5e9;border-color:#0ea5e9;color:#fff;font-weight:600}
.mpv-btn.primary:hover{background:#0284c7;border-color:#0284c7}
.mpv-btn.primary[disabled]{opacity:.6;cursor:not-allowed}
.mpv-field{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.mpv-field label{flex:0 0 62px;font-size:13px;color:#6b7280}
.mpv-in{
  flex:1;height:36px;border:1px solid #e5e7eb;border-radius:8px;padding:0 10px;
  font-size:13px;font-family:inherit;outline:none;color:#111827;background:#fff;
}
.mpv-in:focus{border-color:#0ea5e9}

/* 演示入口开关：一个原生 checkbox 就够（别上开关组件，脏一屏样式）。
   注意选择器要带 .mpv-field 前缀：`.mpv-field label`（0,1,1）会把 label 一律
   压成 flex:0 0 62px，勾选项那层也是 label，不压回去就只剩 62px 宽。 */
.mpv-field-sw{align-items:flex-start}
.mpv-field-sw > label:first-child{padding-top:2px}
.mpv-field .mpv-sw{display:inline-flex;align-items:center;gap:8px;cursor:pointer;flex:1 1 auto;min-width:0}
.mpv-field .mpv-sw input{
  width:15px;height:15px;margin:0;flex:none;cursor:pointer;
  accent-color:#0ea5e9;
}
.mpv-field .mpv-sw-t{font-size:13px;color:#374151;line-height:1.5;flex:1 1 auto}
.mpv-field-sw + .mpv-hint{margin-top:-2px}

  /* 登录页外观：头像圆预览 + 背景条预览 */
  .mpv-ava-row,.mpv-bg-row{display:flex;align-items:center;gap:12px;margin-bottom:12px}
  .mpv-ava{
    width:56px;height:56px;border-radius:50%;flex:none;
    display:flex;align-items:center;justify-content:center;
    background-image:linear-gradient(135deg,#22D3EE,#0891B2);
    background-size:cover;background-position:center;
    color:#fff;font-weight:700;font-size:20px;
    box-shadow:0 4px 12px rgba(2,20,28,.18);
  }
  .mpv-bgprev{
    flex:1;min-width:0;height:56px;border-radius:10px;overflow:hidden;
    border:1px solid #E6E9EF;background-image:linear-gradient(160deg,#062430,#0E7490);
    background-size:cover;background-position:center;
    display:flex;align-items:center;justify-content:center;
    font-size:11px;color:rgba(255,255,255,.62);
  }
  .mpv-bgprev.has{border-color:transparent}
  .mpv-bgprev.has span{display:none}
  /* 两个按钮横排：竖排会让头像行变成一个突兀的「按钮塔」，
     横排后「预览 + 两个动作」是一条线上的东西 */
  .mpv-ops{display:flex;flex-direction:row;flex-wrap:wrap;gap:6px;flex:none}
  /* width:auto 必须有：.mpv-btn 基础是 width:100%（卡片里整行按钮），
     小号按钮继承它就会各自占满一行，横排变成竖排 */
  .mpv-btn.sm{width:auto;height:26px;padding:0 10px;font-size:12px;display:inline-flex;align-items:center;justify-content:center}
  body.dark .mpv-ava{box-shadow:none}
.mpv-log{
  margin:12px 0 0;padding:10px;background:#0f172a;color:#cbd5e1;border-radius:8px;
  font-size:11px;line-height:1.6;max-height:160px;overflow:auto;white-space:pre-wrap;
  font-family:ui-monospace,Menlo,Consolas,monospace;
}
.mpv-log:empty{display:none}
.mpv-h4s{margin-top:16px !important;margin-bottom:8px !important;font-size:13px !important;color:#6b7280 !important;font-weight:500 !important}
/* 状态胶囊：一行装得下就一行，装不下换行；比上面的页面 tab 小一号，形成层级 */
.mpv-states{display:flex;flex-wrap:wrap;gap:6px}
.mpv-chip{
  height:28px;padding:0 11px;border-radius:14px;border:1px solid #e5e7eb;background:#fff;
  font-size:12px;color:#4b5563;cursor:pointer;font-family:inherit;
}
.mpv-chip:hover{border-color:#c8d2de}
.mpv-chip.on{background:#eef6ff;border-color:#bcd9f5;color:#0369a1;font-weight:600}
body.dark .mpv-chip{background:#2b2f3a;border-color:#3b4150;color:#cbd5e1}
body.dark .mpv-chip.on{background:#1e3a5f;border-color:#2b5c8a;color:#7dd3fc}
body.dark .mpv-h4s{color:#94a3b8 !important}

body.dark .mpv-card{background:#23262F;border-color:#333846}
body.dark .mpv-card h4{color:#e5e7eb}
body.dark .mpv-tab{background:#2b2f3a;border-color:#3b4150;color:#cbd5e1}
body.dark .mpv-tab.on{background:#1e3a5f;border-color:#2b5c8a;color:#7dd3fc}
body.dark .mpv-btn{background:#2b2f3a;border-color:#3b4150;color:#e5e7eb}
body.dark .mpv-in{background:#2b2f3a;border-color:#3b4150;color:#e5e7eb}
body.dark .mpv-sw-t{color:#cbd5e1}

@media (max-width:1080px){
  .mpv{flex-direction:column}
  .mpv-side{max-width:none;width:100%}
}

/* ===== 收银台设置 · 消息与提醒（2026-11-05） =====
   缺货规则是「类型标签 + 商品名 + 两个阈值 + 删除」，窄屏会换行但不挤在一起。
   阈值用 b 标出来：这一行最常被扫的就是两个数字。 */
.cstg-row-unit{font-size:12.5px;color:var(--text-3)}
/* 数字输入：.po-in 自带 flex:1，会把 width 吃掉拉满整行；数字框固定窄宽更像数字框 */
.cstg-row>.cstg-num{flex:0 0 auto;width:110px;max-width:110px;text-align:center}
.cstg-alert-add{
  display:flex;gap:10px;flex-wrap:wrap;align-items:center;
  padding:14px 4px 6px;border-top:1px dashed var(--border);margin-top:10px;
}
.cstg-alert-num{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2);white-space:nowrap}
.cstg-alert-num .po-in{width:88px}
.cstg-alert-list{display:flex;flex-direction:column;gap:8px;padding:10px 4px 4px}
.cstg-alert-row{
  display:flex;align-items:center;gap:10px;padding:9px 12px;
  border:1px solid var(--border);border-radius:9px;background:var(--bg-soft,#F7F8FA);
}
.cstg-alert-tag{
  flex:none;font-size:11px;line-height:18px;padding:0 7px;border-radius:9px;
  background:var(--primary-soft,#EDE9FE);color:var(--primary,#7C3AED);font-weight:600;
}
.cstg-alert-name{flex:1;min-width:0;font-size:13px;color:var(--text);font-weight:500;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cstg-alert-cond{flex:none;font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
.cstg-alert-cond b{color:var(--text);font-weight:600}
.cstg-alert-del{
  flex:none;width:24px;height:24px;border:none;border-radius:6px;background:transparent;
  color:var(--text-3);cursor:pointer;font-size:12px;line-height:1;
}
.cstg-alert-del:hover{background:rgba(220,38,38,.1);color:#DC2626}
.cstg-alert-empty{font-size:12px;color:var(--text-3);padding:10px 4px}
body.theme-dark .cstg-alert-row{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.1)}

/* 收款方式排序（设置 → 收银台设置 → 收款方式）：一行一个，▲▼ 调序 */
.cstg-paylist{display:flex;flex-direction:column;gap:6px;padding:10px 4px 4px}
.cstg-pay-row{
  display:flex;align-items:center;gap:10px;padding:7px 10px;
  border:1px solid var(--border);border-radius:9px;background:var(--bg-soft,#F7F8FA);
}
.cstg-pay-no{
  flex:none;width:20px;text-align:center;font-size:11px;color:var(--text-3);
  font-variant-numeric:tabular-nums;
}
/* 前 9 个的序号画成键帽：它同时就是「数字键几」的提示，不用再单独标一个 */
.cstg-pay-no.is-key{
  width:18px;line-height:18px;border-radius:4px;
  background:rgba(120,130,150,.14);color:var(--text-2);font-weight:600;
}
.cstg-pay-name{
  flex:1;min-width:0;font-size:13px;font-weight:500;color:var(--text);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.cstg-pay-mv{
  flex:none;width:26px;height:26px;border-radius:6px;cursor:pointer;
  border:1px solid var(--border);background:var(--panel,#fff);color:var(--text-2);
  font-size:10px;line-height:1;font-family:inherit;
}
.cstg-pay-mv:hover:not(:disabled){border-color:var(--primary);color:var(--primary)}
.cstg-pay-mv:disabled{opacity:.35;cursor:not-allowed}
body.theme-dark .cstg-pay-row{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.1)}
body.theme-dark .cstg-pay-mv{background:#262932}

/* 站内通知：目标门店 + 级别一行，标题/正文各一行，底部「发送」贴右。
   最近发过的通知列在下面，一行一条（时间 · 门店 · 标题），是「到底发成功没有」的凭据。 */
.cstg-notice{display:flex;flex-direction:column;gap:10px;padding:12px 4px 4px}
.cstg-notice-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.cstg-notice-row .cstg-row-lb{flex:none;font-size:12.5px;font-weight:600;color:var(--text-2)}
.cstg-notice-row .po-in{flex:1;min-width:150px;max-width:260px}
#cstgNoticeTitle{width:100%;max-width:none}
#cstgNoticeBody{width:100%;max-width:none;resize:vertical;min-height:68px;line-height:1.55;padding:9px 11px}
.cstg-notice-f{display:flex;align-items:center;gap:12px}
.cstg-notice-hint{flex:1;min-width:0;font-size:11.5px;color:var(--text-3)}
.cstg-notice-list{display:flex;flex-direction:column;gap:6px;padding-top:8px;border-top:1px dashed var(--border)}
.cstg-notice-item{
  display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:8px;
  border:1px solid var(--border);background:var(--bg-soft,#F7F8FA);font-size:12px;
}
.cstg-notice-item.lv-warn{border-color:rgba(217,119,6,.35);background:rgba(217,119,6,.07)}
.cstg-notice-item.lv-danger{border-color:rgba(220,38,38,.35);background:rgba(220,38,38,.07)}
.cstg-ni-at{flex:none;color:var(--text-3);font-variant-numeric:tabular-nums}
.cstg-ni-shop{flex:none;max-width:130px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-2)}
.cstg-ni-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
/* 级别文字标签：只靠整行底色，翻列表时「这条是重要还是普通」还得眯眼看颜色 */
.cstg-ni-lv{
  flex:none;font-style:normal;font-size:10px;font-weight:700;line-height:1;padding:3px 6px;border-radius:5px;
}
.cstg-notice-item.lv-warn .cstg-ni-lv{background:rgba(217,119,6,.18);color:#B45309}
.cstg-notice-item.lv-danger .cstg-ni-lv{background:#DC2626;color:#fff}
body.theme-dark .cstg-notice-item.lv-warn .cstg-ni-lv{background:rgba(245,158,11,.22);color:#FBBF24}
.cstg-notice-empty{font-size:12px;color:var(--text-3);padding:6px 4px}
body.theme-dark .cstg-notice-item{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.1)}

/* ===== 收银台 · 消息通知（2026-11-05） =====
   侧栏按钮与「快捷键」同款（竖排两行 + 虚线描边），只是多了右上角的未读气泡。
   抽屉从**左侧**滑出（快捷键面板在右侧，两个入口不要长得一样，否则会点错）。 */
.csh-side-msg{
  position:relative;
  display:flex;flex-direction:column;align-items:center;gap:3px;
  padding:7px 4px 6px;border-radius:10px;
  border:1px dashed var(--border);background:transparent;
  color:var(--text-2);font-family:inherit;font-size:11.5px;line-height:1.2;cursor:pointer;
  transition:background .12s,color .12s,border-color .12s;
}
.csh-side-msg:hover{
  background:rgb(var(--primary-rgb) / .07);color:var(--text);
  border-color:rgb(var(--primary-rgb) / .38);
}
.csh-side-msg-l{display:inline-flex;align-items:center;gap:3px;white-space:nowrap}
.csh-side-msg-i{font-size:11.5px;line-height:1;opacity:.9}
.csh-side-msg .kb{margin-left:0;height:16px;font-size:10px;opacity:.85}
.csh-msg-badge{
  position:absolute;top:-6px;right:-6px;min-width:18px;height:18px;padding:0 5px;
  display:inline-flex;align-items:center;justify-content:center;
  border-radius:9px;background:#DC2626;color:#fff;font-size:10.5px;font-weight:700;
  line-height:1;box-shadow:0 2px 6px rgba(220,38,38,.4);
  font-variant-numeric:tabular-nums;
}
.csh-msg-badge.is-hot{animation:cshBadgePop .28s cubic-bezier(.22,1.4,.4,1)}
/* 有未读的「紧急」公告：角标持续呼吸 + 红圈扩散（收银员没开抽屉也要察觉）。
   两种动画同时挂：弹入（transform）与呼吸（box-shadow）互不冲突。 */
.csh-msg-badge.is-urgent{animation:cshBadgePulse 1.6s ease-out infinite}
.csh-msg-badge.is-hot.is-urgent{
  animation:cshBadgePop .28s cubic-bezier(.22,1.4,.4,1),cshBadgePulse 1.6s ease-out infinite;
}
@keyframes cshBadgePulse{
  0%{box-shadow:0 2px 6px rgba(220,38,38,.4),0 0 0 0 rgba(220,38,38,.5)}
  70%{box-shadow:0 2px 6px rgba(220,38,38,.4),0 0 0 8px rgba(220,38,38,0)}
  100%{box-shadow:0 2px 6px rgba(220,38,38,.4),0 0 0 0 rgba(220,38,38,0)}
}
@keyframes cshBadgePop{from{transform:scale(.6)}to{transform:scale(1)}}

/* 遮罩与抽屉 */
.csh-msg-mask{
  position:fixed;inset:0;z-index:2700;background:rgba(20,24,35,.38);
  opacity:0;transition:opacity .2s;backdrop-filter:blur(2px);
}
.csh-msg-mask.open{opacity:1}
.csh-msg-dw{
  position:absolute;top:12px;left:12px;bottom:12px;width:min(430px,92vw);
  display:flex;flex-direction:column;background:var(--panel);
  border:1px solid var(--border);border-radius:16px;overflow:hidden;
  box-shadow:0 24px 70px rgba(17,20,30,.26);
  transform:translateX(-28px) scale(.994);opacity:0;
  transition:transform .26s cubic-bezier(.22,1,.36,1),opacity .18s ease;
}
.csh-msg-mask.open .csh-msg-dw{transform:none;opacity:1}
.csh-msg-h{
  flex:none;display:flex;align-items:center;gap:10px;
  padding:15px 18px;border-bottom:1px solid var(--border);
}
.csh-msg-h b{font-size:15px;font-weight:700}
.csh-msg-n{font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
.csh-msg-n .csh-msg-nhot{
  font-style:normal;font-weight:700;color:#DC2626;margin-left:2px;
  font-variant-numeric:tabular-nums;
}
.csh-msg-h .csh-link{font-size:12px}
.csh-msg-x{
  border:none;background:transparent;color:var(--text-3);font-size:15px;line-height:1;
  padding:5px;border-radius:6px;cursor:pointer;font-family:inherit;
}
.csh-msg-x:hover{background:rgba(17,20,30,.06);color:var(--text)}
.csh-msg-b{flex:1;min-height:0;overflow:auto;padding:6px 12px 12px}
.csh-msg-b::-webkit-scrollbar{width:8px}
.csh-msg-b::-webkit-scrollbar-thumb{background:rgba(130,140,160,.35);border-radius:4px}
.csh-msg-item{
  position:relative;
  display:flex;gap:10px;padding:12px 10px;border-bottom:1px dashed var(--border);
  align-items:flex-start;
}
.csh-msg-item:last-child{border-bottom:none}
.csh-msg-item.is-read{opacity:.62}
/* 订单消息整行可点（标已读 + 跳到那一单）：给个手型和悬停底，
   不然收银员不知道这行能点 —— 公告/缺货那两行是纯展示，不加。 */
.csh-msg-item.is-order{cursor:pointer;border-radius:10px}
.csh-msg-item.is-order:hover{background:rgb(var(--primary-rgb) / .06)}
.csh-msg-item.is-order:active{background:rgb(var(--primary-rgb) / .12)}
/* 重要 / 紧急：左边色条（inset 阴影，不占宽度）+ 整行底色 + 图标底色，三处一起用。
   只靠颜色不够 —— 收银机屏幕偏暗，也有人色弱，所以标题前还有文字标签（.csh-msg-lv）。 */
.csh-msg-item.is-warn,.csh-msg-item.is-danger{
  border-bottom-color:transparent;border-radius:10px;margin:2px 0 4px;
}
.csh-msg-item.is-warn{background:rgba(217,119,6,.07);box-shadow:inset 3px 0 0 #D97706}
.csh-msg-item.is-danger{background:rgba(220,38,38,.08);box-shadow:inset 3px 0 0 #DC2626}
.csh-msg-item.is-warn .csh-msg-ico{background:rgba(217,119,6,.16)}
.csh-msg-item.is-danger .csh-msg-ico{background:rgba(220,38,38,.16)}
.csh-msg-lv{
  flex:none;font-style:normal;font-size:10px;font-weight:700;line-height:1;
  padding:3px 6px;border-radius:5px;letter-spacing:.02em;
}
.csh-msg-lv.is-warn{background:rgba(217,119,6,.16);color:#B45309}
.csh-msg-lv.is-danger{background:#DC2626;color:#fff}
.csh-msg-ico{
  flex:none;width:30px;height:30px;border-radius:9px;background:var(--bg-soft,#F3F4F7);
  display:flex;align-items:center;justify-content:center;font-size:15px;
}
.csh-msg-main{flex:1;min-width:0}
.csh-msg-top{display:flex;align-items:baseline;gap:8px}
.csh-msg-top b{flex:1;min-width:0;font-size:13px;font-weight:600;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.csh-msg-top i{flex:none;font-style:normal;font-size:11px;color:var(--text-3);
  font-variant-numeric:tabular-nums}
.csh-msg-body{font-size:12px;line-height:1.6;color:var(--text-2);margin-top:3px;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.csh-msg-read{
  flex:none;align-self:center;border:1px solid var(--border);background:transparent;
  color:var(--text-2);font-family:inherit;font-size:11.5px;padding:4px 9px;border-radius:7px;cursor:pointer;
}
.csh-msg-read:hover{border-color:rgb(var(--primary-rgb) / .45);color:var(--primary)}
.csh-msg-done{flex:none;align-self:center;font-size:11px;color:var(--text-3)}
.csh-msg-foot{
  flex:none;padding:10px 16px 12px;border-top:1px solid var(--border);
  font-size:11px;color:var(--text-3);line-height:1.6;
}
body.theme-dark .csh-msg-ico{background:rgba(255,255,255,.07)}
body.theme-dark .csh-msg-item.is-warn{background:rgba(245,158,11,.14)}
body.theme-dark .csh-msg-item.is-danger{background:rgba(248,113,113,.16)}
body.theme-dark .csh-msg-lv.is-warn{background:rgba(245,158,11,.22);color:#FBBF24}
body.theme-dark .csh-msg-item.is-warn .csh-msg-ico{background:rgba(245,158,11,.22)}
body.theme-dark .csh-msg-item.is-danger .csh-msg-ico{background:rgba(248,113,113,.24)}
body.theme-dark .csh-msg-nhot{color:#FF7A7F !important}

/* ===== 收银台 · 新消息气泡（2026-11-05） =====
   顶部居中、5 秒后自己消失。宽度跟 toast 同档；
   z-index 故意低于 toast（9500）—— 结算提示这种「我刚点的动作」的回执要压在气泡上面。
   容器 pointer-events:none，只有气泡本身可点（点一下进消息抽屉），不会挡住底下的商品。 */
.csh-msg-pops{
  position:fixed;top:16px;left:50%;transform:translateX(-50%);
  z-index:9450;width:min(520px,92vw);
  display:flex;flex-direction:column;gap:8px;pointer-events:none;
}
.csh-msg-pop{
  pointer-events:none;display:flex;gap:10px;align-items:flex-start;
  padding:10px 12px 10px 14px;border-radius:12px;
  background:var(--panel);border:1px solid var(--border);
  box-shadow:0 12px 30px rgba(17,20,30,.18);
  opacity:0;transform:translateY(-10px) scale(.98);
  transition:opacity .24s ease,transform .24s cubic-bezier(.22,1,.36,1);
}
.csh-msg-pop.in{opacity:1;transform:none}
.csh-msg-pop.out{opacity:0;transform:translateY(-8px) scale(.98)}
.csh-msg-pop.is-warn{border-left:3px solid #D97706;background:rgba(217,119,6,.05)}
.csh-msg-pop.is-danger{border-left:3px solid #DC2626;background:rgba(220,38,38,.06)}
/* 只有「查看」可点：气泡盖在商品搜索框上，整块可点会把正在打字的点击吃掉 */
.csh-msg-pop-view{
  pointer-events:auto;flex:none;align-self:center;
  border:1px solid var(--border);background:transparent;border-radius:7px;
  padding:4px 9px;font-family:inherit;font-size:11.5px;color:var(--text-2);cursor:pointer;
  transition:border-color .12s,color .12s,background .12s;
}
.csh-msg-pop-view:hover{border-color:rgb(var(--primary-rgb) / .45);color:var(--primary);background:rgb(var(--primary-rgb) / .06)}
.csh-msg-pop-ico{
  flex:none;width:26px;height:26px;border-radius:8px;background:var(--bg-soft,#F3F4F7);
  display:flex;align-items:center;justify-content:center;font-size:14px;
}
.csh-msg-pop-main{flex:1;min-width:0}
.csh-msg-pop-top{display:flex;align-items:center;gap:6px}
.csh-msg-pop-top b{
  flex:1;min-width:0;font-size:13px;font-weight:600;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.csh-msg-pop-top i{flex:none;font-style:normal;font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums}
.csh-msg-pop-body{
  margin-top:3px;font-size:12px;line-height:1.55;color:var(--text-2);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
body.theme-dark .csh-msg-pop-ico{background:rgba(255,255,255,.08)}
body.theme-dark .csh-msg-pop.is-warn{background:rgba(245,158,11,.16)}
body.theme-dark .csh-msg-pop.is-danger{background:rgba(248,113,113,.18)}
body.theme-dark .csh-msg-dw{box-shadow:0 24px 70px rgba(0,0,0,.5)}

/* ===== 收银台 · 会员充值（2026-11-05） =====
   尺寸写死（480 × 640，视口不够时按 86vh 收）：收银机是触屏，
   弹窗跟着内容长度变高变矮会让「确认充值」在手指下面乱跳，很容易连点两笔。 */
.csh-mem-rcg{
  flex:none;margin-left:8px;padding:0 14px;height:34px;border-radius:9px;
  border:1px solid rgb(var(--primary-rgb) / .45);
  background:rgb(var(--primary-rgb) / .08);color:var(--primary);
  font-family:inherit;font-size:12.5px;font-weight:600;cursor:pointer;
  transition:background .12s;
}
.csh-mem-rcg:hover{background:rgb(var(--primary-rgb) / .16)}
.csh-mem-rcg[hidden]{display:none}

.csh-rcg-mask{
  position:fixed;inset:0;z-index:2750;background:rgba(20,24,35,.42);
  display:flex;align-items:center;justify-content:center;
  opacity:0;transition:opacity .18s;backdrop-filter:blur(2px);
}
.csh-rcg-mask.open{opacity:1}
.csh-rcg{
  width:480px;height:640px;max-width:calc(100vw - 32px);max-height:86vh;
  display:flex;flex-direction:column;background:var(--panel);
  border:1px solid var(--border);border-radius:16px;overflow:hidden;
  box-shadow:0 24px 70px rgba(17,20,30,.3);
  transform:translateY(12px) scale(.99);opacity:0;
  transition:transform .22s cubic-bezier(.22,1,.36,1),opacity .16s;
}
.csh-rcg-mask.open .csh-rcg{transform:none;opacity:1}
.csh-rcg-h{
  flex:none;display:flex;align-items:center;gap:10px;padding:15px 20px;
  border-bottom:1px solid var(--border);
}
.csh-rcg-h b{font-size:15px;font-weight:700}
.csh-rcg-sub{font-size:11.5px;color:var(--text-3)}
.csh-rcg-b{flex:1;min-height:0;overflow:auto;padding:14px 20px 6px}
.csh-rcg-b::-webkit-scrollbar{width:8px}
.csh-rcg-b::-webkit-scrollbar-thumb{background:rgba(130,140,160,.35);border-radius:4px}

.csh-rcg-who{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:12px 14px;border-radius:11px;background:var(--bg-soft,#F5F6F8);
  border:1px solid var(--border);margin-bottom:14px;
}
.csh-rcg-who-l{display:flex;flex-direction:column;gap:3px;min-width:0}
.csh-rcg-who-l b{font-size:14px;color:var(--text)}
.csh-rcg-who-l i{font-style:normal;font-size:11.5px;color:var(--text-3);letter-spacing:.02em}
.csh-rcg-bal{flex:none;font-size:11.5px;color:var(--text-3)}
.csh-rcg-bal span{font-size:11px}
.csh-rcg-bal b{font-size:17px;color:var(--text);font-variant-numeric:tabular-nums;margin-left:2px}

.csh-rcg-f{margin-bottom:14px}
.csh-rcg-f>label{display:flex;align-items:baseline;gap:8px;font-size:12.5px;font-weight:600;color:var(--text);margin-bottom:7px}
.csh-rcg-f>label em{font-style:normal;font-weight:400;font-size:11px;color:var(--text-3)}
.csh-rcg-f--row{display:flex;align-items:center;justify-content:space-between;gap:12px}
.csh-rcg-f--row>label{margin-bottom:0}
.csh-rcg-quick{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:8px}
.csh-rcg-quick button{
  flex:1;min-width:70px;height:38px;border-radius:9px;border:1px solid var(--border);
  background:#fff;color:var(--text);font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;
  font-variant-numeric:tabular-nums;transition:all .12s;
}
.csh-rcg-quick button:hover{border-color:rgb(var(--primary-rgb) / .45);color:var(--primary)}
.csh-rcg-quick button.on{
  background:rgb(var(--primary-rgb) / .1);border-color:var(--primary);color:var(--primary);
}
.csh-rcg-amt{
  display:flex;align-items:center;gap:6px;height:52px;padding:0 14px;
  border:1.5px solid var(--input-border);border-radius:11px;background:#fff;
  transition:border-color .12s,box-shadow .12s;
}
.csh-rcg-amt:focus-within{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft)}
.csh-rcg-amt span{font-size:18px;color:var(--text-3)}
.csh-rcg-amt input{
  flex:1;min-width:0;border:none;outline:none;background:transparent;
  font-family:inherit;font-size:24px;font-weight:700;color:var(--text);
  font-variant-numeric:tabular-nums;letter-spacing:.01em;
}
.csh-rcg-amt.is-sm{height:38px;width:130px;flex:none}
.csh-rcg-amt.is-sm span{font-size:14px}
.csh-rcg-amt.is-sm input{font-size:16px;font-weight:600}

.csh-rcg-pays{display:flex;gap:7px;flex-wrap:wrap}
.csh-rcg-pay{
  padding:7px 13px;border-radius:9px;border:1px solid var(--border);background:#fff;
  color:var(--text-2);font-family:inherit;font-size:12.5px;cursor:pointer;
}
.csh-rcg-pay:hover{border-color:rgb(var(--primary-rgb) / .4)}
.csh-rcg-pay.on{
  background:rgb(var(--primary-rgb) / .1);border-color:var(--primary);
  color:var(--primary);font-weight:600;
}
.csh-rcg-note{width:100%;height:38px;padding:0 12px;border-radius:9px}

.csh-rcg-foot{
  flex:none;display:flex;align-items:center;gap:10px;padding:14px 20px;
  border-top:1px solid var(--border);background:var(--bg-soft,#FAFBFC);
}
.csh-rcg-sum{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;font-size:11.5px;color:var(--text-3)}
.csh-rcg-sum span{display:flex;align-items:baseline;gap:6px}
.csh-rcg-sum b{font-size:16px;color:var(--text);font-variant-numeric:tabular-nums}
.csh-rcg-sum span:last-child b{font-size:13px;color:var(--primary)}
.csh-rcg-foot .csh-btn{min-width:86px;height:38px}

/* 成功回执：只留结果，表单整体消失，想再充一笔再点 */
.csh-rcg-ok{display:flex;flex-direction:column;align-items:center;padding:26px 6px 10px}
.csh-rcg-ok-ico{
  width:56px;height:56px;border-radius:50%;background:rgba(16,185,129,.14);color:#10B981;
  display:flex;align-items:center;justify-content:center;font-size:28px;font-weight:700;margin-bottom:12px;
}
.csh-rcg-ok-t{font-size:17px;font-weight:700;color:var(--text);margin-bottom:18px}
.csh-rcg-ok-l{
  width:100%;max-width:320px;display:flex;align-items:baseline;justify-content:space-between;
  padding:9px 0;border-bottom:1px dashed var(--border);font-size:12.5px;color:var(--text-3);
}
.csh-rcg-ok-l b{font-size:14px;color:var(--text);font-variant-numeric:tabular-nums}
.csh-rcg-ok-l.is-strong{border-bottom:none;margin-top:4px}
.csh-rcg-ok-l.is-strong b{font-size:20px;color:var(--primary)}
.csh-rcg-ok-warn{
  width:100%;max-width:320px;margin-top:14px;padding:9px 12px;border-radius:9px;
  background:#FEF3C7;color:#B45309;font-size:11.5px;line-height:1.6;
}
body.theme-dark .csh-rcg-quick button,
body.theme-dark .csh-rcg-amt,
body.theme-dark .csh-rcg-pay{background:#23252E;border-color:#333748}
body.theme-dark .csh-rcg-who{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.1)}
body.theme-dark .csh-rcg-foot{background:rgba(255,255,255,.02)}

/* ===== 收银台 · 销售任务完成率（2026-11-05） =====
   用户要求：「进度条右边末尾向左缩短一些，腾出的位置放百分比」。
   做法是外面套一层 flex：进度条 flex:1 自动让出 44px，百分比固定贴在右边。
   不用给 .tk-bar 加 padding-right —— 那样 .tk-fill 的百分比宽度会按含 padding 的
   盒子算，100% 时反而溢出到百分比文字底下。 */
.tk-prow{display:flex;align-items:center;gap:8px}
.tk-prow .tk-bar{flex:1;min-width:0}
/* 任务销售单位：商品名后面的小字胶囊（瓶/箱/份…），收银台与电话接单两处任务卡共用。
   放 .tk-top 里跟在 .tk-name（flex:1）后面，自然贴到行右端，与「超额」徽标互斥不挤。 */
.tk-unit{
  flex:none;margin-top:1px;padding:1px 6px;border-radius:6px;
  background:#F1F2F6;color:var(--text-3);
  font-size:10.5px;font-weight:600;line-height:1.5;white-space:nowrap;
}
body.theme-dark .tk-unit{background:rgba(255,255,255,.08);color:#A7ADBD}
.tk-pct{
  flex:none;width:44px;text-align:right;
  font-size:12px;font-weight:700;color:var(--text-2);
  font-variant-numeric:tabular-nums;letter-spacing:.1px;
}
.tk-pct.is-full{color:#EA580C}
body.theme-dark .tk-pct{color:#E8EAF0}

/* ===== 收银台 · 储值卡支付验证（2026-11-05） =====
   小方框（380 × 300）：验证码只有 4/6 位，弹得跟充值一样大反而挡住顾客。
   固定高度是为了「验证并结算」永远在同一位置，收银员能盲按。 */
.csh-sv{
  width:380px;height:300px;max-width:calc(100vw - 32px);
  display:flex;flex-direction:column;background:var(--panel);
  border:1px solid var(--border);border-radius:16px;overflow:hidden;
  box-shadow:0 24px 70px rgba(17,20,30,.3);
  transform:translateY(12px) scale(.99);opacity:0;
  transition:transform .22s cubic-bezier(.22,1,.36,1),opacity .16s;
}
.csh-rcg-mask.open .csh-sv{transform:none;opacity:1}
.csh-sv-h{
  flex:none;display:flex;align-items:baseline;gap:9px;padding:16px 20px 12px;
  border-bottom:1px solid var(--border);
}
.csh-sv-h b{font-size:15px;font-weight:700}
.csh-sv-b{flex:1;min-height:0;overflow:auto;padding:16px 20px 8px;display:flex;flex-direction:column;align-items:center}
.csh-sv-phone{font-size:13px;color:var(--text-2);letter-spacing:.06em;margin-bottom:12px}
.csh-sv-in{width:100%}
.csh-sv-in input{
  width:100%;height:50px;text-align:center;letter-spacing:.35em;text-indent:.35em;
  border:1.5px solid var(--input-border);border-radius:11px;background:#fff;
  font-family:inherit;font-size:22px;font-weight:700;color:var(--text);outline:none;
  font-variant-numeric:tabular-nums;
}
.csh-sv-in input:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft)}
.csh-sv-send{
  margin-top:10px;width:100%;height:34px;border-radius:9px;border:1px solid var(--border);
  background:transparent;color:var(--text-2);font-family:inherit;font-size:12px;cursor:pointer;
}
.csh-sv-send:disabled{opacity:.6;cursor:default}
.csh-sv-hint{margin-top:9px;font-size:11px;color:var(--text-3);text-align:center;line-height:1.6}
.csh-sv-err{margin-top:9px;min-height:16px;font-size:11.5px;color:#DC2626;text-align:center;line-height:1.5}
.csh-sv-err.is-ok{color:#059669}
.csh-sv-f{
  flex:none;display:flex;gap:10px;justify-content:flex-end;padding:12px 20px;
  border-top:1px solid var(--border);background:var(--bg-soft,#FAFBFC);
}
.csh-sv-f .csh-btn{min-width:92px;height:36px}
body.theme-dark .csh-sv-in input{background:#23252E;border-color:#333748}
body.theme-dark .csh-sv-f{background:rgba(255,255,255,.02)}

/* ============================================================
   自动打单工位（#/cashier/autoprint）
   ------------------------------------------------------------
   门店把一台旧电脑挂在墙上，店员不操作它，只从两米外瞟一眼
   「还在不在跑」。所以这套样式的取舍和收银台反过来：
     · 字号大、留白多，宁可一屏只放 20 行，也不要密；
     · 状态点要大，异常条要红得刺眼 —— 静默失败才是最大的敌人；
     · 不做悬浮岛（半透明白底在强光下糊成一片），用实底卡片。
   ============================================================ */
.csh-root.is-autoprint{display:block;padding:0;overflow:auto}
.ap-wrap{
  max-width:1180px;margin:0 auto;padding:22px 24px 16px;min-height:100%;
  display:flex;flex-direction:column;gap:14px;
}
.ap-loading{padding:80px 0;text-align:center;color:var(--text-3);font-size:15px}

/* ---- 顶栏 ---- */
.ap-head{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}
.ap-brand{display:flex;align-items:center;gap:10px;font-size:19px;color:var(--text)}
.ap-brand b{font-weight:500}
.ap-dot{width:11px;height:11px;border-radius:50%;background:var(--text-3);flex:none}
.ap-dot.is-on{background:var(--ok,#047857);box-shadow:0 0 0 4px rgb(4 120 87 / .14)}
.ap-dot.is-pause{background:var(--text-3)}
.ap-dot.is-warn{background:var(--danger,#DC2626);box-shadow:0 0 0 4px rgb(220 38 38 / .14)}
.ap-shop{
  font-size:14px;padding:3px 10px;border-radius:999px;
  background:var(--primary-soft,#F3EEFF);color:var(--primary,#7C3AED);
}
.ap-lock{font-size:12px;color:var(--text-3)}
.ap-tools{display:flex;gap:8px}

.ap-btn{
  height:36px;padding:0 16px;border-radius:9px;border:1px solid var(--input-border,#D8DCE6);
  background:var(--panel,#fff);color:var(--text);font-size:14px;cursor:pointer;font-family:inherit;
}
.ap-btn:hover{border-color:var(--primary,#7C3AED);color:var(--primary,#7C3AED)}
.ap-btn.is-on{background:var(--primary,#7C3AED);border-color:var(--primary,#7C3AED);color:#fff}
.ap-btn.ghost{color:var(--text-2)}

/* ---- 异常条：一次只出一条，堆三条等于没提示 ---- */
.ap-banner{
  padding:12px 16px;border-radius:10px;font-size:14px;line-height:1.55;
  background:#FEF2F2;border:1px solid #FCA5A5;color:#991B1B;
}
.ap-banner[hidden]{display:none}

/* ---- 计数 ---- */
/* 5 格：加了「库存跳过」之后不能再写死 4 列 —— 挤成两行会把下面两栏顶下去 */
.ap-stat{display:grid;grid-template-columns:repeat(5,1fr);gap:12px}
.ap-stat-i{
  background:var(--panel,#fff);border:1px solid var(--border,#EBEDF3);border-radius:12px;
  padding:12px 16px;display:flex;flex-direction:column;gap:4px;
}
.ap-stat-i i{font-style:normal;font-size:12px;color:var(--text-3)}
.ap-stat-i b{font-size:25px;font-weight:500;font-variant-numeric:tabular-nums;color:var(--text)}
/* 有单被跳过时这个数字要能一眼看见，不然和 0 长得一样 */
.ap-stat-i.is-warn{border-color:#FCA5A5;background:#FEF2F2}
.ap-stat-i.is-warn i{color:#B91C1C}
.ap-stat-i.is-warn b{color:#DC2626}

/* ---- 三栏清单 ---- */
.ap-cols{display:grid;grid-template-columns:1.1fr 1fr .9fr;gap:12px;flex:1;min-height:0}
.ap-col{
  background:var(--panel,#fff);border:1px solid var(--border,#EBEDF3);border-radius:12px;
  padding:14px 16px;display:flex;flex-direction:column;gap:8px;min-height:220px;
}
.ap-col h3{font-size:13px;font-weight:500;color:var(--text-2);padding-bottom:6px;border-bottom:1px solid var(--border,#EBEDF3)}
.ap-list{list-style:none;display:flex;flex-direction:column;gap:2px;overflow:auto}
.ap-empty{color:var(--text-3);font-size:13px;padding:18px 0;text-align:center}

.ap-row{
  display:flex;align-items:center;gap:10px;padding:7px 8px;border-radius:7px;font-size:13px;
}
.ap-row:nth-child(odd){background:var(--bg-2,#F8FAFC)}
.ap-t{color:var(--text-3);font-variant-numeric:tabular-nums;flex:none;width:62px}
.ap-no{font-family:ui-monospace,Consolas,monospace;font-size:12px;color:var(--text-2);flex:none}
.ap-mem{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.ap-amt{font-variant-numeric:tabular-nums;color:var(--text);flex:none}
.ap-tag{font-size:11px;padding:2px 7px;border-radius:999px;background:#ECFDF5;color:#047857;flex:none}
.ap-msg{flex:1;min-width:0;color:#991B1B;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ap-row.is-skip .ap-tag{background:var(--bg,#F5F6FA);color:var(--text-3)}
.ap-row.is-bad{background:#FEF2F2}
.ap-row.is-bad .ap-tag{background:#FEE2E2;color:#991B1B}
.ap-row.is-bad .ap-no{color:#991B1B}
/* 库存不足被跳过：琥珀色，和「接口失败」的红区分开 —— 这不是程序出错，
   是要人去改单 / 补货的业务动作，用红会让人以为是系统坏了。 */
.ap-row.is-hold{background:#FFFBEB}
.ap-row.is-hold .ap-no{color:#92400E}
.ap-row.is-hold .ap-msg{color:#92400E}
.ap-row.is-hold .ap-tag{background:#FEF3C7;color:#92400E}

.ap-foot{display:flex;gap:18px;flex-wrap:wrap;font-size:12px;color:var(--text-3);padding-top:2px}

body.theme-dark .ap-banner{background:#3A1B1B;border-color:#6B2A2A;color:#FCA5A5}
body.theme-dark .ap-row.is-bad{background:#3A1B1B}
body.theme-dark .ap-msg,body.theme-dark .ap-row.is-bad .ap-no{color:#FCA5A5}
body.theme-dark .ap-tag{background:#123A2B;color:#6EE7B7}
body.theme-dark .ap-row.is-bad .ap-tag{background:#4A1F1F;color:#FCA5A5}
body.theme-dark .ap-row.is-skip .ap-tag{background:#262933;color:var(--text-3)}
body.theme-dark .ap-stat-i.is-warn{background:#3A1B1B;border-color:#6B2A2A}
body.theme-dark .ap-stat-i.is-warn i,body.theme-dark .ap-stat-i.is-warn b{color:#FCA5A5}
body.theme-dark .ap-row.is-hold{background:#3A2E13}
body.theme-dark .ap-row.is-hold .ap-msg,body.theme-dark .ap-row.is-hold .ap-no{color:#FCD34D}
body.theme-dark .ap-row.is-hold .ap-tag{background:#4A3A15;color:#FCD34D}

@media (max-width:900px){
  .ap-cols{grid-template-columns:1fr}
  .ap-stat{grid-template-columns:repeat(2,1fr)}
}

  /* ============================================================
     2026-11-06 批次：改价规则 / 自动标签 / 收银台待绑定气泡 / 配送中按钮
     ============================================================ */
  .accent-red{ --accent:#DC2626; }
  .accent-red .stg-group-ico{ background:#FEF2F2; }
  body.theme-dark .accent-red .stg-group-ico{ background:rgba(220,38,38,.18); }

  /* 改价规则：添加行 + 已生效规则胶囊 */
  .stg-floor-add{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-top:12px; }
  .stg-floor-add .po-in{ max-width:210px; }
  .stg-floor-add .stg-floor-goods{ position:relative; display:flex; flex-direction:column; }
  .stg-floor-add .stg-floor-goods .po-in{ width:260px; }
  .stg-floor-add .stg-uhits{ position:absolute; top:100%; left:0; right:0; z-index:20; margin:4px 0 0; }
  .stg-floor-row{ display:flex; flex-wrap:wrap; gap:8px; padding:2px 0; }
  /* 「全部商品」兜底规则的例外商品：待添加行内列表 + 规则行内的「除了：…」 */
  .stg-floor-exlist{ display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin-top:8px; width:100%; }
  .stg-floor-ext{ font-size:12.5px; color:var(--tx-3,#64748B); }
  .stg-floor-ex{ display:inline-flex; flex-wrap:wrap; align-items:center; gap:6px; margin-left:8px; }
  .stg-floor-ex .stg-uchip .x{ margin-left:4px; }

  /* 自动标签：规则卡片 */
  .stg-tag-card{
    border:1px solid var(--border); border-radius:12px; padding:14px 16px; margin-bottom:12px;
    background:rgba(120,130,150,.035);
  }
  .stg-tag-head{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:10px; }
  .stg-tag-head .name{ width:200px; font-weight:600; }
  .stg-tag-head select{ width:120px; }
  .stg-tag-match{ display:inline-flex; align-items:center; gap:5px; font-size:12.5px; color:var(--text-2); cursor:pointer; }
  .gr-sw.sm{ width:34px; height:20px; }
  .gr-sw.sm::after{ width:16px; height:16px; }
  .stg-tag-runinfo{ font-size:12.5px; color:var(--text-3); }
  .stg-tag-conds{ display:flex; flex-direction:column; gap:8px; }
  .stg-tag-cond{
    display:flex; align-items:center; gap:8px; flex-wrap:wrap;
    font-size:12.5px; color:var(--text-2);
  }
  .stg-tag-cond > .k{ min-width:150px; color:var(--text); font-weight:600; }
  .stg-tag-cond input[type="checkbox"]{ width:15px; height:15px; accent-color:var(--primary); }
  .stg-tag-cond .po-in.num{ width:86px; }
  .stg-tag-cond .po-in.dt{ width:140px; }
  .stg-tag-cond select[data-k="lastMode"]{ width:96px; }
  .stg-tag-cond .u{ font-size:12px; color:var(--text-3); }
  .stg-tag-cond .sep{ color:var(--text-3); }
  .stg-tag-cond.is-goods{ align-items:flex-start; }
  .stg-tag-cond.is-goods .po-in.grow{ flex:1; min-width:220px; max-width:420px; }
  .stg-tag-cond.is-goods{ position:relative; flex-wrap:wrap; }
  .stg-tag-cond.is-goods .stg-uhits{ width:100%; max-width:420px; margin:4px 0 0; }
  .stg-tag-gids{ display:flex; flex-wrap:wrap; gap:6px; width:100%; }
  body.theme-dark .stg-tag-card{ background:rgba(255,255,255,.03); }
  body.theme-dark .stg-tag-head .name{ background:#1D2029; }

  /* 收银台侧栏「订单」页签的待绑定气泡（与消息徽标同族但色不同：
     消息是品牌红，这里是催办橙，一眼分清「有人给我留言」和「有单没人送」） */
  .csh-nav{ position:relative; }
  .csh-nav-badge{
    position:absolute; top:6px; right:10px; min-width:18px; height:18px; padding:0 5px;
    border-radius:9px; background:#F59E0B; color:#fff; font-size:11px; font-weight:700;
    display:flex; align-items:center; justify-content:center; line-height:1;
    box-shadow:0 0 0 2px rgba(245,158,11,.22);
    animation:cshBadgePulse 2s ease-in-out infinite;
  }
  .csh-nav-badge[hidden]{ display:none; }
  @keyframes cshBadgePulse{ 0%,100%{ transform:scale(1);} 50%{ transform:scale(1.12);} }

  /* 订单查询区按钮里的数量小气泡（配送中） */
  .btn .q-btn-n{
    display:inline-flex; align-items:center; justify-content:center;
    min-width:18px; height:18px; padding:0 5px; margin-left:6px;
    border-radius:9px; background:rgba(255,255,255,.25); color:#fff;
    font-size:11px; font-weight:700; font-style:normal; line-height:1;
  }
  .btn .q-btn-n[hidden]{ display:none; }
  .btn.teal{ background:#0E9488; border-color:#0E9488; color:#fff; }
  .btn.teal:hover{ background:#0B7C72; border-color:#0B7C72; }
  body.theme-dark .btn.teal{ background:rgba(14,148,136,.22); border-color:rgba(14,148,136,.5); color:#5EEAD4; }

  /* 改价弹窗输入：被拦的一下红边 */
  .csh-px-in input.is-bad{ border-color:#E5484D !important; box-shadow:0 0 0 3px rgba(229,72,77,.15); }

/* ============================================================
   选品器：行内数量 / 单位切换 / 冷藏（2026-11-07）
   勾选行才可操作；确定或数量框回车时随商品一起落入清单。
   ============================================================ */
.gsel-table td.gs-qtyc{width:96px;text-align:center}
/* 表头拖动换位：拖起 / 悬停目标列的高亮（同收银流水表头的观感） */
.gsel-table th[data-col]{user-select:none}
.gsel-table th.is-drag{opacity:.45}
.gsel-table th.is-over{box-shadow:inset 2px 0 0 rgb(var(--primary-rgb) / .75)}
/* 数量步进：− 输入框 ＋，勾选行才能点 */
.gsel-table .gs-step{display:inline-flex;align-items:stretch;vertical-align:middle}
.gsel-table .gs-stp{
  width:20px;min-width:20px;height:26px;padding:0;border:1px solid var(--border);
  background:#F5F6FA;color:#334155;font-size:14px;line-height:1;cursor:pointer;
  font-family:inherit;user-select:none;-webkit-user-select:none;
}
.gsel-table .gs-stp:first-child{border-radius:5px 0 0 5px}
.gsel-table .gs-stp:last-child{border-radius:0 5px 5px 0}
.gsel-table .gs-stp:hover{background:#E8EDF8;color:rgb(var(--primary-rgb) / 1);border-color:rgb(var(--primary-rgb) / .45)}
.gsel-table .gs-stp:active{background:#DCE5F6}
.gsel-table .gs-stp:disabled{background:var(--bg-2, #F2F3F7);color:#C7CCD8;cursor:not-allowed;border-color:var(--border)}
body.theme-dark .gsel-table .gs-stp{background:#33363F;color:#C9CFDB;border-color:#44485A}
body.theme-dark .gsel-table .gs-stp:hover{background:#3C404E;color:#fff}
.gsel-table .gs-qty{
  width:44px;min-width:40px;height:26px;padding:0 4px;text-align:center;
  border-left:none;border-right:none;border-top:1px solid var(--border);border-bottom:1px solid var(--border);
  border-radius:0;
  font-size:12.5px;color:var(--text);background:#fff;font-family:inherit;
}
.gsel-table .gs-qty:focus{outline:none;border-color:rgb(var(--primary-rgb) / .55);box-shadow:0 0 0 2.5px rgb(var(--primary-rgb) / .14)}
.gsel-table .gs-qty:disabled{background:var(--bg-2, #F2F3F7);color:var(--text-3);cursor:not-allowed;box-shadow:none}
.gsel-table select.gs-unit{
  max-width:62px;height:26px;padding:0 2px;
  border:1px solid var(--border);border-radius:5px;
  font-size:12px;color:var(--text);background:#fff;font-family:inherit;cursor:pointer;
}
.gsel-table select.gs-unit:focus{outline:none;border-color:rgb(var(--primary-rgb) / .55)}
.gsel-table select.gs-unit:disabled{background:var(--bg-2, #F2F3F7);color:var(--text-3);cursor:not-allowed}
/* 冷藏开关：未勾选行整枚半透明（复用清单页 .cold-sw / .cold-sl 的外观） */
.gsel-table .gs-cold-sw.is-off{opacity:.45}
.gsel-table .gs-cold-sw input:disabled{cursor:not-allowed}
/* 被订单设置锁死（必须 / 禁止冷藏）的行：锁标跟在开关右边，未勾选时也别淡到看不见 */
.gsel-table .gs-cold-lock{
  margin-left:2px;font-size:11px;line-height:1;vertical-align:middle;
  font-style:normal;cursor:help;opacity:.85;
}
.gsel-table .gs-cold-sw.locked ~ .gs-cold-lock,
.gsel-table .gs-cold-sw.banned ~ .gs-cold-lock{opacity:1}
/* 已选条上的「×数量单位」小标 */
.gsp-qty{  font-style:normal;font-size:11px;line-height:16px;padding:0 6px;border-radius:8px;
  color:#0E7490;background:rgba(14,165,233,.14);white-space:nowrap;
}

/* 门店冷藏缺货（2026-11-08）
   门店在收银台把某商品标成「冷藏缺货」后，客服在这页点冷藏开关会被弹回。
   与「必须/禁止冷藏」的锁要区分开：锁是配置规则（🔒/🚫），这是门店当天的临时状态，
   所以用红色 + 「缺」字，而不是再发明一个锁图标。 */
.gsel-table .cold-sw.is-coldout{opacity:1}
.gsel-table .cold-sw.is-coldout .cold-sl{border-color:#D9433F;box-shadow:inset 0 0 0 2px rgba(217,67,63,.12)}
.gsel-table .gs-cold-out{
  margin-left:2px;padding:0 3px;border-radius:4px;
  font-size:10px;line-height:14px;font-style:normal;cursor:help;
  color:#fff;background:#D9433F;vertical-align:middle;
}
/* 清单行：开关描边变红 + 徽标换成红底的「冷藏缺货」，扫一眼就知道这行为什么开不了。
   徽标要常显 —— 这行的开关是被缺货压成关闭的，光看开关只会以为「顾客不要冷藏」。 */
#poTbody .cold-sw.is-coldout .cold-sl{border-color:#D9433F}
#poTbody tr.has-coldout .cold-tag{color:#B3302C;background:rgba(217,67,63,.13)}
/* 缺货期间「必须冷藏」的 🔒 也收起：锁还在，但这时候压住它的是缺货，不是规则 */
#poTbody tr.has-coldout .cold-lock{display:none}
/* 暗色下红底要压深一档，不然红字贴在深蓝行底上发灰 */
body.theme-dark #poTbody tr.has-coldout .cold-tag{color:#FCA5A5;background:rgba(217,67,63,.24)}

/* ============================================================
   收银流水 7 项改造（2026-11-07）
   · KPI 主次布局 + 商品售数量 + 收款构成横幅
   · 表头拖动换位 / 显隐管理弹层
   · 单元格内容完整显示（允许折行，数字仍不折）
   ============================================================ */
.csh-flow .csh-board-h{position:relative}
/* KPI：营业额主卡占两格、字号更大 */
.csh-flow-kpis .csh-kpi.major{grid-column:span 2;background:linear-gradient(135deg, rgba(var(--primary-rgb, 37 99 235) / .10), rgba(var(--primary-rgb, 37 99 235) / .03))}
.csh-flow-kpis .csh-kpi.major b{font-size:28px;letter-spacing:-.5px}
/* 收款构成：横幅一行，金额大的方式更醒目 */
.csh-paymix{
  grid-column:1 / -1;display:flex;flex-wrap:wrap;align-items:center;gap:8px;
  padding:8px 12px;border:1px solid var(--border);border-radius:10px;
  background:var(--bg-2, #F7F8FB);
}
body.theme-dark .csh-paymix{background:#23252E}
.csh-paymix .pm-t{font-size:12px;color:var(--text-3);margin-right:2px}
.csh-paymix .pm-item{
  display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;
  background:#fff;border:1px solid var(--border);font-size:12px;
}
body.theme-dark .csh-paymix .pm-item{background:#2C2F38}
.csh-paymix .pm-item i{font-style:normal;color:var(--text-3)}
.csh-paymix .pm-item b{font-variant-numeric:tabular-nums;font-weight:600}
.csh-paymix .pm-item.big{padding:5px 14px;font-size:14px}
.csh-paymix .pm-item.big b{font-size:17px;color:var(--primary)}
.csh-paymix .pm-item.neg b{color:var(--danger)}
/* 表头：可拖拽的列给出暗示；拖动中 / 悬停目标高亮 */
.csh-flow-table th[draggable]{cursor:grab}
.csh-flow-table th[draggable]:active{cursor:grabbing}
.csh-flow-table th.is-drag{opacity:.45}
.csh-flow-table th.is-over{box-shadow:inset 2px 0 0 var(--primary)}
/* 单元格完整显示：文本列允许折行换行（数字/序号仍单行），不再靠省略号截断 */
.csh-flow-table td{white-space:normal;overflow-wrap:anywhere}
.csh-flow-table td.num,
.csh-flow-table td.idx,
.csh-flow-table td.r{white-space:nowrap}
.csh-flow-table td.grp{background:rgba(var(--primary-rgb, 37 99 235) / .025)}
.csh-flow-table td.is-dim{color:var(--text-3)}
/* 表头管理弹层 */
.csh-col-pop{
  position:absolute;top:calc(100% + 4px);right:0;z-index:60;width:230px;
  background:#fff;border:1px solid var(--border);border-radius:10px;
  box-shadow:0 10px 30px rgba(15,23,42,.16);padding:8px;
}
body.theme-dark .csh-col-pop{background:#23252E;box-shadow:0 10px 30px rgba(0,0,0,.5)}
.csh-col-pop-h{padding:4px 6px 8px;font-size:12.5px;border-bottom:1px solid var(--border);margin-bottom:6px}
.csh-col-pop-list{max-height:320px;overflow:auto;display:grid;grid-template-columns:1fr 1fr;gap:2px 8px}
.csh-col-item{display:flex;align-items:center;gap:6px;font-size:12.5px;padding:3px 4px;border-radius:6px;cursor:pointer}
.csh-col-item:hover{background:var(--bg-2, #F2F3F7)}
body.theme-dark .csh-col-item:hover{background:#2C2F38}
.csh-col-pop-f{display:flex;justify-content:space-between;gap:8px;border-top:1px solid var(--border);margin-top:8px;padding-top:8px}
.csh-btn.sm{font-size:12px;padding:4px 10px;border-radius:7px}

/* ============================================================
   emojix — 图标向下兼容（Win7 无彩色 emoji 字体环境，2026-11-07）
   引擎把 emoji 文本节点替换为 <span class="emojix"><svg/></span>；
   尺寸锚定 1em、颜色继承文字色，与原生 emoji 占位一致。
   ============================================================ */
.emojix{
  display:inline-block;width:1em;height:1em;line-height:1;
  vertical-align:-0.125em;flex:none;
}
.emojix>svg{
  display:block;width:100%;height:100%;
  fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
  overflow:visible;
}

/* ============================================================
   采购（商品流转并入本站，2026-11-07）
   四个页面共用一套控件：工具条 / KPI / 表格 / 左右分栏 / 状态片
   ============================================================ */
.buy-tool{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.buy-inp{
  height:36px;min-width:200px;padding:0 10px;border:1px solid var(--input-border);border-radius:var(--input-radius);
  background:var(--panel);color:var(--text);font-size:13px;outline:none;
}
.buy-inp:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .12)}
.buy-sel{
  height:36px;padding:0 8px;border:1px solid var(--input-border);border-radius:var(--input-radius);
  background:var(--panel);color:var(--text);font-size:13px;
}
.buy-check{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--text-2);cursor:pointer}
.buy-hint{font-size:12px;color:var(--text-3);margin-left:auto}

.buy-kpis{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.buy-kpi{
  flex:1 1 150px;background:var(--panel);border:1px solid var(--border);border-radius:12px;
  padding:12px 14px;box-shadow:0 4px 14px rgba(20,28,45,.04);
}
.buy-kpi-v{font-size:19px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}
.buy-kpi-t{font-size:12px;color:var(--text-3);margin-top:2px}

.buy-table-wrap{background:var(--panel);border:1px solid var(--border);border-radius:12px;overflow:auto;max-height:calc(100vh - 260px)}
.buy-table{width:100%;border-collapse:collapse;font-size:13px}
.buy-table th{
  position:sticky;top:0;z-index:1;background:var(--bg-2);color:var(--text-2);font-weight:600;
  text-align:left;padding:9px 10px;border-bottom:1px solid var(--border);white-space:nowrap;
}
.buy-table td{padding:9px 10px;border-bottom:1px solid var(--border);color:var(--text-2);vertical-align:middle}
.buy-table tbody tr:hover{background:rgba(120,130,150,.06)}
.buy-table tbody tr:last-child td{border-bottom:0}
.buy-table .r{text-align:right;font-variant-numeric:tabular-nums}
.buy-table .b{color:var(--text);font-weight:600}
.buy-table.compact td,.buy-table.compact th{padding:7px 8px}
.buy-table tr.need td{background:rgba(220,38,38,.05)}
.buy-table tr.give td{background:rgba(4,120,87,.05)}
.buy-table tr.wh td{background:rgba(124,58,237,.05);font-weight:600}
.buy-name{color:var(--text);font-weight:600}
.buy-sub{display:block;font-size:11.5px;color:var(--text-3);font-weight:400;margin-top:2px}
.buy-unit{display:inline;font-size:11px;color:var(--text-3);font-weight:400;white-space:nowrap}
.buy-mono{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px}
.buy-reason{font-size:12px;color:var(--text-3);line-height:1.5;max-width:360px}
.buy-table .warn{color:var(--danger)}
.buy-table .ok{color:var(--ok)}

.buy-pager{display:flex;align-items:center;gap:10px;justify-content:flex-end;padding:10px 4px;font-size:12px;color:var(--text-3)}
.buy-pager .btn{height:30px}

.buy-empty{padding:36px 16px;text-align:center;color:var(--text-3);font-size:13px}

.buy-tabs{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.buy-tab{
  height:34px;padding:0 14px;border:1px solid var(--border);background:var(--panel);border-radius:9px;
  font-size:13px;color:var(--text-2);cursor:pointer;display:inline-flex;align-items:center;gap:6px;
}
.buy-tab b{font-size:11.5px;color:var(--text-3);font-weight:600}
.buy-tab.on{background:rgb(var(--primary-rgb) / .1);border-color:rgb(var(--primary-rgb) / .35);color:var(--primary);font-weight:600}
.buy-tab.on b{color:var(--primary)}

.buy-split{display:flex;gap:14px;align-items:flex-start}
.buy-side{width:280px;flex:none;background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:10px}
.buy-side .buy-inp{width:100%;min-width:0}
.buy-side-meta{font-size:11.5px;color:var(--text-3);margin:8px 2px}
.buy-side-list{max-height:calc(100vh - 240px);overflow:auto}
.buy-item{padding:8px 10px;border-radius:8px;cursor:pointer}
.buy-item:hover{background:var(--bg-2)}
.buy-item.on{background:rgb(var(--primary-rgb) / .1)}
.buy-item-n{font-size:13px;color:var(--text);font-weight:600;line-height:1.35}
.buy-item-m{font-size:11.5px;color:var(--text-3);margin-top:2px}
.buy-main{flex:1;min-width:0;background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:14px}

.buy-head2{display:flex;align-items:flex-start;gap:12px;margin-bottom:12px}
.buy-h-name{font-size:15px;font-weight:700;color:var(--text)}
.buy-head-acts{margin-left:auto;display:flex;gap:8px;flex-wrap:wrap}
.buy-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
.buy-f{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--text-2)}
.buy-f .buy-inp{min-width:0;width:100%}
.buy-note{margin:10px 0;font-size:12px;color:var(--text-3);line-height:1.6;background:var(--bg-2);border-radius:8px;padding:8px 10px}
.buy-store-pick{margin:10px 0;border-top:1px dashed var(--border);padding-top:10px}
.buy-pick-head{display:flex;align-items:baseline;gap:8px;margin-bottom:6px}
.buy-pick-head .buy-sub{display:inline;margin:0}
.buy-pick-list{display:flex;flex-wrap:wrap;gap:8px 16px;margin-bottom:8px}
.buy-result{margin-top:12px}
.buy-h3{font-size:13px;font-weight:700;color:var(--text);margin:12px 0 8px}
.buy-preview-cols{display:grid;grid-template-columns:1fr 300px;gap:14px;align-items:start}
.buy-buy-card{background:rgba(124,58,237,.06);border:1px solid rgb(var(--primary-rgb) / .2);border-radius:10px;padding:12px}
.buy-buy-qty{font-size:22px;font-weight:700;color:var(--primary)}
.buy-buy-qty span{font-size:12px;font-weight:500;color:var(--text-3)}
.buy-buy-meta{font-size:12px;color:var(--text-2);margin-top:4px}
.buy-dlg-head{margin-bottom:10px;font-size:14px}

.buy-chip{display:inline-block;padding:2px 8px;border-radius:999px;font-size:11.5px;background:var(--bg-2);color:var(--text-2)}
.buy-chip.wait{background:rgba(217,119,6,.12);color:#B45309}
.buy-chip.ok{background:rgba(4,120,87,.12);color:var(--ok)}
.buy-chip.err{background:rgba(220,38,38,.12);color:var(--danger)}

body.theme-dark .buy-kpi,body.theme-dark .buy-table-wrap,body.theme-dark .buy-side,body.theme-dark .buy-main{box-shadow:none}
body.theme-dark .buy-table tr.need td{background:rgba(220,38,38,.10)}
body.theme-dark .buy-table tr.give td{background:rgba(4,120,87,.14)}
body.theme-dark .buy-table tr.wh td{background:rgba(124,58,237,.16)}
body.theme-dark .buy-chip.wait{color:#FBBF24}
body.theme-dark .buy-buy-card{background:rgba(124,58,237,.14)}

  /* ============================================================
     数据中心 · 订单数据（一行一个商品的明细分析表）
     · 表格自身滚动：表头 sticky 在顶、合计行 sticky 在底，
       竖向翻页时两边都不跟着跑掉；
     · 列宽由 JS 写进 <col>，table-layout:fixed 才不会因为内容长短抖动；
     · 一律用变量取色，暗色主题下自动跟着变，不用再写一份 body.theme-dark。
     ============================================================ */
  .dor{display:flex;flex-direction:column;gap:10px;min-height:0}

  /* 明细表页「整页拉满」（用户 2026-11-08：表格卡片下面空一大块，底沿没和左侧一级菜单齐平）。
     做法：内容区改成 flex 列并去掉底部那 88px 留白，表格卡片 flex:1 吃掉剩余高度。
     · 只作用于加了 .fill-h 的页面（router.js 里按页面 key 打），别的页面照旧滚动；
     · 顶部三条（标题 / 筛选 / 工具）必须 flex:none，窗口矮时被压扁的就是它们；
     · max-height 要清掉，否则 calc(100vh-318px) 会把卡片重新拉回去。 */
  .content.fill-h{display:flex;flex-direction:column;padding-bottom:0}
  .content.fill-h>.dor{flex:1 1 auto;min-height:0}
  .content.fill-h .dor-top,
  .content.fill-h .dor-bar,
  .content.fill-h .dor-tools{flex:none}
  .content.fill-h .dor-gridwrap{flex:1 1 auto;min-height:220px;max-height:none}

  /* 地址档案 / 会员档案走的是另一套骨架（整页就一张 .lp-card），规则不同：
     · 卡片本身 flex:1 吃掉剩余高度，底沿才和左侧一级菜单齐平；
     · 卡片内部改成列布局，翻页栏用 margin-top:auto 贴到底 —— 留白落在表格与翻页之间，
       而不是卡片外面露出一条灰底（用户 2026-11-08 指出的对齐问题）。 */
  .content.fill-h>.lp-card{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
  /* 表格区吃掉剩余高度（2026-11-09 用户报障：会员 / 地址档案表格下面空一大块）。
     行数由 archive.js#fitRowCount 按这块高度算，铺满就到齐；
     万一行高跟估算有出入，多出来的部分由这里内部滚动，既不会把表格裁掉，也不会顶出卡片。 */
  .content.fill-h>.lp-card>.lp-table-wrap{flex:1 1 auto;min-height:0;overflow:auto}
  /* 表头钉在滚动区顶上：内部滚动时列名不会跟着跑掉（跟数据中心 .dor 表一个套路） */
  .content.fill-h>.lp-card>.lp-table-wrap>.lp-table>thead>th{position:sticky;top:0;z-index:2}
  .content.fill-h>.lp-card>.lp-page{margin-top:auto;padding-top:14px}

  .dor-top{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap}
  .dor-h{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
  .dor-h h2{font-size:19px;font-weight:600;color:var(--text);letter-spacing:.2px}
  .dor-hint{font-size:12px;color:var(--text-3)}
  .dor-kpi{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
  .dor-mk{display:flex;flex-direction:column;gap:2px;min-width:74px}
  .dor-mk i{font-style:normal;font-size:11.5px;color:var(--text-3)}
  .dor-mk b{font-size:16px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums}
  .dor-mk.dim b{font-size:12.5px;font-weight:500;color:var(--text-2)}

  .dor-bar,.dor-tools{
    display:flex;align-items:center;gap:8px;flex-wrap:wrap;
    background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:8px 10px;
  }
  .dor-tools{justify-content:space-between;position:relative;z-index:6}
  .dor-tools-l,.dor-tools-r{display:flex;align-items:center;gap:8px;flex-wrap:wrap}

  .dor-quick{display:flex;align-items:center;gap:4px;background:var(--bg-2);border-radius:9px;padding:3px}
  .dor-q{
    border:0;background:transparent;color:var(--text-2);font-size:12.5px;
    padding:5px 10px;border-radius:7px;cursor:pointer;transition:.15s;font-family:inherit;
  }
  .dor-q:hover{color:var(--text)}
  .dor-q.on{background:var(--panel);color:var(--primary);font-weight:600;box-shadow:0 1px 3px rgba(20,24,35,.10)}

  .dor-range{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text-3)}
  .dor-range input{
    height:30px;border:1px solid var(--input-border);border-radius:8px;background:var(--panel);
    color:var(--text);padding:0 8px;font-size:12.5px;font-family:inherit;
  }

  .dor-filters{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  .dor-multi{position:relative}
  .dor-mbtn{
    height:30px;display:inline-flex;align-items:center;gap:6px;
    border:1px solid var(--input-border);border-radius:8px;background:var(--panel);
    color:var(--text-2);font-size:12.5px;padding:0 9px;cursor:pointer;font-family:inherit;transition:.15s;
  }
  .dor-mbtn:hover{border-color:rgb(var(--primary-rgb) / .5);color:var(--text)}
  .dor-mbtn.on{border-color:rgb(var(--primary-rgb) / .60);color:var(--primary);background:rgb(var(--primary-rgb) / .07)}
  .dor-mbtn b{font-weight:600;color:inherit}
  /* 多选下拉：宽度跟着最长选项走（min/max 兜住），否则「啤酒陈列费（1234）」会被截 */
  .dor-mpop{
    position:fixed;z-index:120;width:max-content;min-width:212px;max-width:340px;
    max-height:min(320px,calc(100vh - 100px));display:flex;flex-direction:column;
    background:var(--panel);border:1px solid var(--border);border-radius:12px;
    box-shadow:0 16px 40px rgba(20,24,35,.18);overflow:hidden;
  }
  .dor-mpop[hidden]{display:none}
  /* 搜索：选项多的下拉才出现（JS 里按条数决定） */
  .dor-msearch{padding:7px 7px 0}
  .dor-msearch input{
    width:100%;height:28px;box-sizing:border-box;border:1px solid var(--input-border);border-radius:7px;
    background:var(--panel);color:var(--text);padding:0 9px;font-size:12.5px;font-family:inherit;
  }
  .dor-msearch input::placeholder{color:var(--text-3)}
  .dor-msearch input:focus{outline:none;border-color:rgb(var(--primary-rgb) / .55)}

  .dor-mlist{flex:1;min-height:0;overflow-y:auto;padding:6px 7px}
  /* 滚动条统一：Windows 默认那条灰色方块和右侧整体风格冲突，收成细圆角 */
  .dor-mlist::-webkit-scrollbar{width:8px}
  .dor-mlist::-webkit-scrollbar-track{background:transparent}
  .dor-mlist::-webkit-scrollbar-thumb{
    background:rgba(20,24,35,.16);border-radius:8px;border:2px solid transparent;background-clip:content-box;
  }
  .dor-mlist::-webkit-scrollbar-thumb:hover{background:rgba(20,24,35,.3);background-clip:content-box}
  .dor-mlist label{
    display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:8px;
    font-size:13px;color:var(--text-2);cursor:pointer;white-space:nowrap;
  }
  /* label 是 flex，[hidden] 自带 display:none 会被盖掉 —— 搜索过滤全靠这条 */
  .dor-mlist label[hidden]{display:none}
  .dor-mlist label:hover{background:var(--bg-2);color:var(--text)}
  .dor-mlist label.is-on{background:rgb(var(--primary-rgb) / .07);color:var(--text)}
  .dor-mlist label.is-on em{color:var(--primary)}
  .dor-mlist input{accent-color:var(--primary);width:14px;height:14px;flex:none}
  /* 条数：右对齐、等宽数字，扫列时不会跳 */
  .dor-mlist em{
    margin-left:auto;padding-left:14px;font-style:normal;font-size:11.5px;
    color:var(--text-3);font-variant-numeric:tabular-nums;
  }
  .dor-mempty{padding:14px;font-size:12.5px;color:var(--text-3);text-align:center}
  .dor-mnodata{padding:14px;font-size:12.5px;color:var(--text-3);text-align:center}
  .dor-mfoot{display:flex;gap:6px;padding:7px;border-top:1px solid var(--border);background:var(--bg-2)}
  .dor-mfoot button{
    flex:1;height:28px;border:1px solid var(--border);border-radius:7px;background:var(--panel);
    color:var(--text-2);font-size:12.5px;cursor:pointer;font-family:inherit;
  }
  .dor-mfoot button.is-main{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}

  .dor-kw input{
    height:30px;width:240px;border:1px solid var(--input-border);border-radius:8px;background:var(--panel);
    color:var(--text);padding:0 10px;font-size:12.5px;font-family:inherit;
  }
  .dor-kw input::placeholder{color:var(--text-3)}

  .dor-btn{
    height:30px;display:inline-flex;align-items:center;gap:5px;
    border:1px solid var(--input-border);border-radius:8px;background:var(--panel);
    color:var(--text);font-size:12.5px;padding:0 11px;cursor:pointer;font-family:inherit;transition:.15s;
  }
  .dor-btn:hover{border-color:rgb(var(--primary-rgb) / .55);color:var(--primary)}
  .dor-btn[disabled]{opacity:.55;cursor:default}
  .dor-btn.is-ghost{background:transparent;color:var(--text-2)}
  .dor-caret{font-style:normal;font-size:10px;color:var(--text-3)}

  .dor-warn{font-size:12px;color:#B45309;background:rgba(217,119,6,.10);padding:4px 9px;border-radius:7px}
  .dor-warn[hidden]{display:none}
  /* 提示条里的「查看是哪几单」：做成链接样，不与正文抢眼 */
  .dor-tlink{
    border:0;background:transparent;padding:0;font:inherit;color:inherit;
    text-decoration:underline;text-underline-offset:2px;cursor:pointer;
  }
  .dor-tlink:hover{color:#92400E}

  .dor-colset{
    position:absolute;right:0;top:calc(100% + 6px);z-index:120;width:300px;
    background:var(--panel);border:1px solid var(--border);border-radius:12px;
    box-shadow:0 16px 40px rgba(20,24,35,.18);padding:10px;
  }
  .dor-colset[hidden]{display:none}
  .dor-csh{display:flex;align-items:baseline;justify-content:space-between;font-size:12.5px;color:var(--text-2);margin-bottom:8px}
  .dor-csh em{font-style:normal;font-size:11.5px;color:var(--text-3)}
  .dor-clist{max-height:300px;overflow-y:auto;display:grid;grid-template-columns:1fr 1fr;gap:2px}
  .dor-clist label{display:flex;align-items:center;gap:6px;padding:5px 6px;border-radius:7px;font-size:12.5px;color:var(--text-2);cursor:pointer}
  .dor-clist label:hover{background:var(--bg-2)}
  .dor-clist label.is-lock{opacity:.55;cursor:default}
  .dor-clist input{accent-color:var(--primary);width:13px;height:13px}
  .dor-cfoot{display:flex;gap:6px;margin-top:8px;padding-top:8px;border-top:1px solid var(--border)}

  .dor-gridwrap{
    position:relative;overflow:auto;background:var(--panel);
    border:1px solid var(--border);border-radius:12px;
    max-height:calc(100vh - 318px);min-height:220px;
  }
  .dor-gridwrap::-webkit-scrollbar{height:9px;width:9px}
  .dor-gridwrap::-webkit-scrollbar-thumb{background:rgba(120,130,150,.28);border-radius:6px}

  .dor-table{width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed;font-size:12.5px}
  .dor-table.is-busy{opacity:.45;transition:opacity .15s}

  .dor-th{
    position:sticky;top:0;z-index:3;text-align:left;font-weight:600;white-space:nowrap;
    background:var(--bg-2);color:var(--text-2);border-bottom:1px solid var(--border);
    padding:9px 8px;cursor:pointer;user-select:none;
  }
  .dor-th.num{text-align:right}
  .dor-th:hover{color:var(--primary)}
  .dor-th.on{color:var(--primary);background:rgb(var(--primary-rgb) / .08)}
  .dor-th.fixed{cursor:default}
  .dor-tht{display:inline-flex;align-items:center;gap:4px;overflow:hidden;text-overflow:ellipsis;max-width:100%}
  .dor-arr{font-style:normal;font-size:9px;color:var(--primary)}
  .dor-grip{
    display:inline-block;margin-right:3px;color:var(--text-3);font-size:10px;line-height:1;
    letter-spacing:-2px;cursor:grab;
  }
  .dor-th:hover .dor-grip{color:var(--primary)}
  .dor-th.is-drag{opacity:.45;background:rgb(var(--primary-rgb) / .14)}
  .dor-th.is-over{box-shadow:inset 3px 0 0 var(--primary)}
  .dor-table.is-sorting .dor-td{pointer-events:none}

  .dor-td{
    padding:8px;border-bottom:1px solid var(--border);
    color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;
  }
  .dor-td.num{text-align:right;font-variant-numeric:tabular-nums}
  .dor-td.is-ord{background:rgb(var(--primary-rgb) / .02)}
  .dor-td.ops{white-space:nowrap}
  .dor-body-row:hover .dor-td,.dor-table tbody tr:hover .dor-td{background:var(--bg-2)}
  .dor-table tbody tr:hover .dor-td.is-ord{background:rgb(var(--primary-rgb) / .07)}
  .dor-td.dor-fail{text-align:center;color:var(--danger);padding:36px 12px;white-space:normal}

  .dor-nm{display:block;overflow:hidden;text-overflow:ellipsis;max-width:100%}
  .dor-no{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;color:var(--text-2)}
  .dor-two{display:flex;flex-direction:column;line-height:1.35}
  .dor-two b{font-weight:600}
  .dor-two i{font-style:normal;font-size:11px;color:var(--text-3)}
  .dor-mut{color:var(--text-3)}
  .dor-amount{font-variant-numeric:tabular-nums}
  .dor-neg{color:var(--danger)}

  .dor-tag{display:inline-block;padding:1px 7px;border-radius:999px;font-size:11.5px;background:var(--bg-2);color:var(--text-2)}
  .dor-tag.is-back{background:rgba(220,38,38,.10);color:var(--danger)}
  .dor-tag.is-gift{background:rgba(4,120,87,.12);color:var(--ok)}
  .dor-tag.is-part{background:rgba(217,119,6,.14);color:#B45309}
  /* 「待同步」：本站单还没进中仑，灰底虚框，别跟退货的红色抢眼 */
  .dor-tag.is-mut{background:transparent;border:1px dashed var(--border);color:var(--text-2);font-style:normal}

  /* 库存流水（数据中心 → 库存流水）：入库绿、出库红，正负一眼分清。
     中国账务习惯「红涨绿跌」只用于行情；这里标的是业务方向（进 / 出），
     用「入=绿、出=红」与仓库系统一致，不与涨跌混用。 */
  .dor-amount.dor-in,.dor-in{color:var(--ok)}
  .dor-amount.dor-out,.dor-out{color:var(--danger)}
  .dor-amount.dor-in,.dor-amount.dor-out{font-weight:600}
  .dor-tag.is-in{background:rgba(4,120,87,.12);color:var(--ok)}
  .dor-tag.is-out{background:rgba(220,38,38,.10);color:var(--danger)}
  .dor-sum-sep{color:var(--text-3);margin:0 4px;font-weight:400}

  .dor-op{
    height:24px;padding:0 8px;border-radius:6px;border:1px solid var(--border);background:var(--panel);
    color:var(--text-2);font-size:11.5px;cursor:pointer;font-family:inherit;margin-right:4px;
  }
  .dor-op:hover{border-color:rgb(var(--primary-rgb) / .55);color:var(--primary)}
  .dor-op.is-rf:hover{border-color:rgba(220,38,38,.5);color:var(--danger)}

  .dor-table tfoot td{
    position:sticky;bottom:0;z-index:2;background:var(--bg-2);
    border-top:1px solid var(--border);border-bottom:0;font-weight:600;color:var(--text);
  }
  .dor-sum-h{font-size:12px;font-weight:600;color:var(--text-2)}
  .dor-sum-h b{color:var(--primary)}

  .dor-empty{
    position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
    background:var(--panel);color:var(--text-3);font-size:13px;
  }
  .dor-empty[hidden]{display:none}

  .dor-pg{
    height:28px;padding:0 10px;border-radius:7px;border:1px solid var(--input-border);
    background:var(--panel);color:var(--text-2);font-size:12.5px;cursor:pointer;font-family:inherit;
  }
  .dor-pg:hover:not([disabled]){border-color:rgb(var(--primary-rgb) / .55);color:var(--primary)}
  .dor-pg[disabled]{opacity:.45;cursor:default}
  .dor-pgn{font-size:12.5px;color:var(--text-2);padding:0 2px}
  .dor-size{
    height:28px;border:1px solid var(--input-border);border-radius:7px;background:var(--panel);
    color:var(--text-2);font-size:12.5px;padding:0 6px;font-family:inherit;
  }

  /* 单票详情弹层 */
  .dor-mask{position:fixed;inset:0;z-index:200;background:rgba(15,18,26,.42);display:flex;align-items:center;justify-content:center;padding:24px}
  .dor-dlg{width:min(880px,96vw);max-height:86vh;overflow:auto;background:var(--panel);border-radius:14px;box-shadow:0 24px 60px rgba(10,14,22,.32)}
  .dor-dh{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--border)}
  .dor-dh b{font-size:14.5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
  .dor-x{border:0;background:transparent;font-size:20px;line-height:1;color:var(--text-3);cursor:pointer}
  .dor-dmeta{display:flex;flex-wrap:wrap;gap:10px 22px;padding:12px 16px;background:var(--bg-2)}
  .dor-dmeta span{font-size:12.5px;color:var(--text)}
  .dor-dmeta i{font-style:normal;color:var(--text-3);margin-right:6px}
  .dor-dtable{width:100%;border-collapse:collapse;font-size:12.5px}
  .dor-dtable th{text-align:left;padding:8px 12px;background:var(--panel);color:var(--text-2);border-bottom:1px solid var(--border);font-weight:600}
  .dor-dtable th.num,.dor-dtable td.num{text-align:right}
  .dor-dtable td{padding:9px 12px;border-bottom:1px solid var(--border);color:var(--text)}
  .dor-dtable tfoot td{border-bottom:0;background:var(--bg-2);font-weight:600}
  .dor-dfoot{display:flex;align-items:center;justify-content:space-between;padding:12px 16px}
  /* 无成本弹层：先讲清原因，再列单号 */
  .dor-dlg.is-wide{width:min(1060px,96vw)}
  /* 无成本弹层：单号/门店/时间不折行，商品列占剩下的宽度 */
  .dor-nw{white-space:nowrap}
  .dor-ntable th{white-space:nowrap}
  .dor-ntable td:last-child,.dor-ntable th:last-child{width:56px;text-align:right;padding-left:0}
  .dor-ntable th:nth-child(1){width:190px}
  .dor-ntable th:nth-child(2){width:74px}
  .dor-ntable th:nth-child(3){width:150px}
  .dor-ntable th:nth-child(5){width:96px}
  .dor-ntable th:nth-child(6){width:54px}
  .dor-dnote{padding:12px 16px;font-size:12.5px;line-height:1.7;color:var(--text-2);background:rgba(217,119,6,.07);border-bottom:1px solid var(--border)}
  .dor-dnote b{color:var(--text)}
  .dor-lnk{border:0;background:transparent;padding:0;font:inherit;font-size:12.5px;color:var(--primary);cursor:pointer}
  .dor-lnk:hover{text-decoration:underline}

/* 采购子应用：加载 / 失败占位（原系统样式只作用于 .lf-buy 内部） */
.lf-buy-boot{padding:60px 20px;text-align:center;color:var(--text-3);font-size:13px}
.lf-buy-boot.err{color:var(--danger)}

/* ============================================================
   滚动条统一规范（与采购子应用同一套）
   ------------------------------------------------------------
   页面级（.content）和导航（.nav）本来就是隐藏的，这里不重新开启；
   其余真需要滚动的区域统一成：8px 细槽 + 透明轨道 + 圆角半透明滑块（视觉 4px），hover 加深。
   ============================================================ */
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{
  background:rgba(120,130,150,.36);border-radius:4px;
  border:2px solid transparent;background-clip:content-box;
}
::-webkit-scrollbar-thumb:hover{background:rgba(120,130,150,.6);background-clip:content-box}
::-webkit-scrollbar-thumb:active{background:rgba(120,130,150,.72);background-clip:content-box}
::-webkit-scrollbar-corner{background:transparent}
/* 这四个是「整页 / 导航」的滚动条，必须继续隐藏，别被上面的通用规则又画出来 */
.content::-webkit-scrollbar,
.nav::-webkit-scrollbar,
.subbar-island::-webkit-scrollbar,
.side-panel::-webkit-scrollbar{width:0;height:0;display:none}
/* Firefox：限定「不支持 webkit 伪元素」才用标准属性，否则 Chrome 121+ 会忽略上面的自定义样式 */
@supports not selector(::-webkit-scrollbar){
  html,body,*{scrollbar-width:thin;scrollbar-color:rgba(120,130,150,.45) transparent}
}

/* ============================================================
   数据中心 → 配送数据（.dlv-*）
   ------------------------------------------------------------
   上半屏是自绘的深色地图（canvas），下半屏是统计卡。
   地图固定深色、不跟主题走：它是「一块屏幕」，浅色页面上用深色
   才能把流光的层次压出来；暗色主题下它比页面更深一档，反而更像显示屏。
   ============================================================ */
.dlv{display:flex;flex-direction:column;gap:14px;padding-bottom:18px}

/* ---------- 筛选条 ---------- */
.dlv-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.dlv-seg{display:inline-flex;background:var(--panel);border:1px solid var(--border);border-radius:9px;padding:3px}
.dlv-seg button{border:0;background:transparent;padding:6px 12px;border-radius:6px;font:inherit;
  font-size:12.5px;color:var(--text-2);cursor:pointer;transition:background .15s,color .15s}
.dlv-seg button:hover{color:var(--text)}
.dlv-seg button.on{background:var(--primary-soft);color:var(--primary);font-weight:600}
.dlv-date{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text-3)}
.dlv-date input{border:1px solid var(--border);border-radius:7px;padding:6px 9px;font:inherit;
  font-size:12.5px;color:var(--text);background:var(--panel)}
.dlv-date i{font-style:normal;color:var(--text-3)}
.dlv-bar-rt{margin-left:auto;display:flex;align-items:center;gap:10px}
.dlv-meta{font-size:12.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
.dlv-refresh{border:1px solid var(--border);background:var(--panel);border-radius:7px;
  padding:6px 12px;font:inherit;font-size:12.5px;cursor:pointer;color:var(--text-2)}
.dlv-refresh:hover{border-color:var(--primary);color:var(--primary)}

/* ---------- 地图卡 ---------- */
.dlv-mapcard{position:relative;height:clamp(440px,52vh,620px);border-radius:16px;overflow:hidden;
  background:radial-gradient(ellipse at 46% 42%, #0E3A5C 0%, #072338 44%, #03101E 100%);
  box-shadow:0 22px 48px -26px rgba(3,16,30,.75), 0 0 0 1px rgba(56,189,248,.10)}

/* Leaflet 底图容器：铺满卡片，z-index 1；弧线 canvas 叠在上面（3），
   标题/图例/标记再往上（5），所以不影响拖动手势（canvas pointer-events:none） */
.dlv-mapbox{position:absolute;inset:0;z-index:1;background:transparent}
.dlv-mapbox[hidden]{display:none}
.dlv-mapbox.leaflet-container{background:transparent;font:inherit}

/* 网格 + 暗角：垫在弧线之下，压住瓦片的细节、把视线收到中间 */
.dlv-mapveil{position:absolute;inset:0;z-index:2;pointer-events:none;
  background:
    radial-gradient(ellipse 46% 52% at 44% 48%, rgba(56,189,248,.16), transparent 70%),
    radial-gradient(ellipse 30% 34% at 62% 58%, rgba(45,212,191,.10), transparent 72%),
    radial-gradient(ellipse 26% 30% at 30% 40%, rgba(96,165,250,.10), transparent 72%),
    linear-gradient(180deg, rgba(4,22,40,.42) 0%, rgba(4,22,40,.03) 24%,
                    rgba(4,22,40,.02) 62%, rgba(4,22,40,.46) 100%),
    repeating-linear-gradient(0deg, rgba(56,189,248,.038) 0 1px, transparent 1px 46px),
    repeating-linear-gradient(90deg, rgba(56,189,248,.038) 0 1px, transparent 1px 46px)}
.dlv-mapcard canvas{position:absolute;inset:0;z-index:3;display:block;
  width:100%;height:100%;pointer-events:none}
/* 降级成纯自绘时要能接悬停，否则门店点没法交互 */
.dlv-mapcard canvas.is-static{pointer-events:auto;z-index:2}

/* 高德瓦片压暗：style=8 本身是浅色标准图，直接铺在大屏上太亮。
   先反色再灰阶，得到「深灰底 + 浅灰路网」，和暗色卡片不打架。
   brightness 只管压整体，真正让地名退后的是图层透明度（在 tileLayer 的 opacity 里给，
   约 .72）——让深蓝底从瓦片下面透上来，文字就从「白字」变成「灰字」。
   filter 再压会让路网一起糊掉，所以只给到 1.10 / contrast .88 收亮部。 */
.dlv-tiles{filter:grayscale(1) invert(1) sepia(1) saturate(4.6) hue-rotate(182deg) brightness(1.10) contrast(.88)}

/* Leaflet 默认控件是浅色圆角块，压在深色地图上很跳，统一改成暗色 */
.dlv-mapbox .leaflet-control-zoom{border:0;box-shadow:0 2px 10px rgba(0,0,0,.35)}
.dlv-mapbox .leaflet-control-zoom a{background:rgba(23,29,42,.92);color:#C7D2E4;
  border-color:rgba(255,255,255,.08);width:26px;height:26px;line-height:25px;font-size:15px}
.dlv-mapbox .leaflet-control-zoom a:hover{background:rgba(38,46,64,.95);color:#fff}
.dlv-mapbox .leaflet-control-attribution{display:none}

/* 门店标记：上方光柱 + 中心光点 + 右侧青色胶囊标签。
   光柱高度按单量分级（见 dlvStreetMap），主力站点一眼能挑出来。 */
.dpin{width:0;height:0;position:absolute;pointer-events:none}
.dpin-beam{position:absolute;left:-1px;width:2px;border-radius:1px;
  background:linear-gradient(to top, rgba(190,242,100,.95), rgba(190,242,100,.42) 45%, rgba(190,242,100,0));
  box-shadow:0 0 7px rgba(190,242,100,.5)}
.dpin-halo{position:absolute;left:-9px;top:-9px;width:18px;height:18px;border-radius:50%;
  background:radial-gradient(circle, rgba(56,189,248,.6), rgba(56,189,248,0) 70%);
  animation:dpin-pulse 2.6s ease-in-out infinite}
@keyframes dpin-pulse{0%,100%{transform:scale(.8);opacity:.5}50%{transform:scale(1.2);opacity:.95}}
.dpin-dot{position:absolute;left:-3.5px;top:-3.5px;width:7px;height:7px;border-radius:50%;
  background:#BAE6FD;box-shadow:0 0 0 1.5px rgba(3,24,40,.85), 0 0 10px 2px rgba(56,189,248,.9)}
/* 店名标签：要读得清，但不能和底图地名一起「喊」。
   去掉外发光和青蓝渐变底（那是最抢眼的部分），改成半透明深底 + 细边框，
   字色从纯白收到 86% 的青白，靠深色描边保住暗底上的可读性。 */
.dpin-lb{position:absolute;left:9px;top:-10px;white-space:nowrap;
  padding:1px 6px;border-radius:2px;
  background:rgba(4,32,48,.82);
  border:1px solid rgba(103,232,249,.30);
  color:rgba(200,238,252,.86);font-size:10px;font-weight:500;letter-spacing:.2px;
  text-shadow:0 1px 2px rgba(0,0,0,.62)}

/* 左上标题：左侧一条青亮竖线 + 渐隐底，科技大屏的常规写法 */
.dlv-map-hd{position:absolute;left:14px;top:12px;display:flex;flex-direction:column;gap:2px;
  pointer-events:none;z-index:5;padding:8px 13px;border-radius:3px;
  background:linear-gradient(90deg, rgba(6,45,64,.88), rgba(6,45,64,.26));
  border:1px solid rgba(56,189,248,.20);border-left:2px solid rgba(125,211,252,.9);
  backdrop-filter:blur(8px)}
.dlv-map-hd b{color:#E0F2FE;font-size:14.5px;letter-spacing:.6px;
  text-shadow:0 0 12px rgba(56,189,248,.55)}
.dlv-map-hd span{color:rgba(125,211,252,.82);font-size:11.5px;font-variant-numeric:tabular-nums}

/* 右上角「演示动线」标记 */
.dlv-map-tag{position:absolute;right:16px;top:15px;z-index:5;padding:4px 11px;border-radius:3px;
  background:rgba(6,78,100,.72);border:1px solid rgba(56,189,248,.42);
  color:#A5F3FC;font-size:10.5px;letter-spacing:.5px;pointer-events:none;
  box-shadow:0 0 12px rgba(56,189,248,.2)}

/* 图例 */
.dlv-legend{position:absolute;left:14px;bottom:12px;z-index:5;display:flex;align-items:center;gap:15px;
  font-size:11px;color:rgba(186,230,253,.76);pointer-events:none;
  background:rgba(3,16,30,.66);padding:5px 11px;border-radius:3px;
  border:1px solid rgba(56,189,248,.18);backdrop-filter:blur(6px)}
.dlv-legend i{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:5px;
  vertical-align:-1px}
.dlv-legend .lg-store{background:#BAE6FD;box-shadow:0 0 0 3px rgba(56,189,248,.22), 0 0 8px rgba(56,189,248,.6)}
.dlv-legend .lg-flow{background:#7DD3FC;box-shadow:0 0 6px rgba(56,189,248,.7)}
.dlv-legend .lg-dest{background:rgba(125,211,252,.6)}
.dlv-legend-hint{color:rgba(125,211,252,.45)}

.dlv-map-empty{position:absolute;inset:0;z-index:6;display:flex;align-items:center;justify-content:center;
  color:rgba(186,230,253,.6);font-size:13px}
/* display:flex 会盖掉 [hidden] 的 display:none —— 不写这条，空态那行字会一直浮在地图上 */
.dlv-map-empty[hidden]{display:none}

/* ---------- KPI ---------- */
.dlv-kpis{display:flex;flex-direction:column;gap:12px}
.dlv-kpi-main{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
.dlv-kpi{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:14px 16px}
.dlv-kpi-l{font-size:12.5px;color:var(--text-3)}
.dlv-kpi-v{font-size:26px;font-weight:700;color:var(--text);margin:6px 0 4px;
  font-variant-numeric:tabular-nums;letter-spacing:-.2px}
.dlv-kpi-v small{font-size:12px;font-weight:500;color:var(--text-3);margin-left:3px;letter-spacing:0}
.dlv-kpi-f{font-size:11.5px;color:var(--text-3)}
.dlv-kpi.is-ok .dlv-kpi-v{color:var(--ok)}
.dlv-kpi.is-warn .dlv-kpi-v{color:#D97706}
.dlv-kpi.is-demo .dlv-kpi-v{color:var(--text-2)}
.dlv-kpi.is-demo .dlv-kpi-f{color:#B45309}

/* 渠道 7 格 */
.dlv-chans{display:grid;grid-template-columns:repeat(7,1fr);gap:10px}
.dlv-chan{position:relative;background:var(--panel);border:1px solid var(--border);
  border-radius:10px;padding:10px 12px 10px}
.dlv-chan-n{display:flex;align-items:center;gap:5px;font-size:11.5px;color:var(--text-3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dlv-chan-n i{width:6px;height:6px;border-radius:50%;flex:0 0 auto}
.dlv-chan b{display:block;font-size:19px;color:var(--text);margin-top:3px;
  font-variant-numeric:tabular-nums;letter-spacing:-.2px}
.dlv-chan-p{position:absolute;right:12px;bottom:11px;font-size:11px;color:var(--text-3);
  font-variant-numeric:tabular-nums}

/* ---------- 两列卡 ---------- */
.dlv-row-2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.dlv-card{display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--border);
  border-radius:12px;padding:14px 16px}
.dlv-card-hd{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:12px}
.dlv-card-hd b{font-size:13.5px;color:var(--text)}
.dlv-card-hd span{font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}

/* 横条排行 */
.dlv-bars{display:flex;flex-direction:column;gap:8px}
.dlv-bar-row{display:grid;grid-template-columns:66px 1fr 48px;gap:10px;align-items:center}
.dlv-bar-n{font-size:12px;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dlv-bar-track{height:8px;background:var(--bg-2);border-radius:5px;overflow:hidden}
.dlv-bar-track i{display:block;height:100%;border-radius:5px;
  background:linear-gradient(90deg,rgb(var(--primary-rgb) / .45),var(--primary));
  transition:width .45s cubic-bezier(.2,.8,.3,1)}
.dlv-bar-v{font-size:12px;color:var(--text-2);text-align:right;font-variant-numeric:tabular-nums}

/* 24 小时柱 */
/* 柱状图吃掉卡片剩余高度：两列 grid 会把左右卡片拉到一样高，
   写死 118px 的话时段卡下方会空一大块 */
.dlv-hours{flex:1;display:flex;flex-direction:column;padding-bottom:16px}
.dlv-hour-chart{flex:1;min-height:118px;display:grid;grid-template-columns:repeat(24,1fr);
  gap:3px;align-items:end}
.dlv-hour{position:relative;display:flex;flex-direction:column;justify-content:flex-end;height:100%}
.dlv-hour i{display:block;background:rgb(var(--primary-rgb) / .26);border-radius:3px 3px 0 0;
  transition:height .45s cubic-bezier(.2,.8,.3,1)}
.dlv-hour:hover i{background:rgb(var(--primary-rgb) / .45)}
.dlv-hour.is-peak i{background:var(--primary)}
.dlv-hour span{position:absolute;bottom:-15px;left:50%;transform:translateX(-50%);
  font-size:10px;color:var(--text-3);font-variant-numeric:tabular-nums}

/* 配送半径 */
.dlv-dist-hd{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:10px;
  font-size:12px;color:var(--text-3)}
.dlv-dist-hd b{font-size:17px;color:var(--text);margin:0 2px;font-variant-numeric:tabular-nums}
.dlv-dist-hd b small{font-size:10.5px;font-weight:500;color:var(--text-3);margin-left:1px}
.dlv-dist-total{font-size:11.5px}
.dlv-dist-bars{display:flex;flex-direction:column;gap:8px}
.dlv-types{display:flex;gap:8px;margin-top:14px;flex-wrap:wrap;
  padding-top:12px;border-top:1px dashed var(--border)}
.dlv-type{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:7px;
  background:var(--bg-2);font-size:11.5px}
.dlv-type i{font-style:normal;color:var(--text-3)}
.dlv-type b{color:var(--text);font-variant-numeric:tabular-nums}

/* 商品 TOP */
.dlv-goods{display:flex;flex-direction:column}
.dlv-good{display:grid;grid-template-columns:22px 1fr auto;gap:9px;align-items:center;
  padding:6px 0;border-bottom:1px dashed var(--border)}
.dlv-good:last-child{border-bottom:0}
.dlv-good-i{width:20px;height:20px;border-radius:6px;background:var(--bg-2);color:var(--text-3);
  font-size:11px;display:flex;align-items:center;justify-content:center;font-variant-numeric:tabular-nums}
.dlv-good-i.is-top{background:var(--primary-soft);color:var(--primary);font-weight:700}
.dlv-good-n{font-size:12.5px;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dlv-good-q{font-size:12.5px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums}
.dlv-good-q small{font-size:10px;color:var(--text-3);margin-left:1px;font-weight:400}

/* 空态 */
.dlv-ph{padding:26px 0;text-align:center;color:var(--text-3);font-size:12.5px}

/* ---------- 同环比 ---------- */
.dlv-compare{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:14px 16px}
.dlv-cmp-hd{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:12px}
.dlv-cmp-hd b{font-size:13.5px;color:var(--text)}
.dlv-cmp-hd span{font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
.dlv-cmp-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
.dlv-cmp{background:var(--bg-2);border-radius:9px;padding:10px 12px}
.dlv-cmp.is-na{opacity:.72}
.dlv-cmp-l{font-size:11.5px;color:var(--text-3);margin-bottom:5px}
.dlv-cmp-v{font-size:22px;font-weight:700;line-height:1.15;font-variant-numeric:tabular-nums}
.dlv-cmp-v .dlv-dlt{font-size:22px}
.dlv-cmp-f{font-size:11px;color:var(--text-3);margin-top:4px;font-variant-numeric:tabular-nums;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 「无去年同期」这类说明比数字长，允许折两行，不然关键原因被省略号吃掉 */
.dlv-cmp.is-na .dlv-cmp-f{white-space:normal;line-height:1.45;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.dlv-cmp-s{font-size:10.5px;color:var(--text-3);margin-top:2px;opacity:.7;font-variant-numeric:tabular-nums}
.dlv-dlt.is-up{color:#15803D}
.dlv-dlt.is-down{color:#DC2626}
.dlv-dlt.is-flat{color:var(--text-3)}
.dlv-dlt.is-na{color:var(--text-3);font-weight:500}
.dlv-cmp-note{font-size:11px;color:var(--text-3);margin-top:10px;padding-top:9px;
  border-top:1px dashed var(--border);line-height:1.5}

/* ---------- 超时预警榜 ---------- */
.dlv-alert-head,.dlv-alert{display:grid;grid-template-columns:minmax(84px,1.15fr) 1fr 1fr 1fr;
  gap:10px;align-items:center}
.dlv-alert-head{padding:0 0 7px;border-bottom:1px solid var(--border);margin-bottom:2px}
.dlv-alert-head span{font-size:10.5px;color:var(--text-3);font-weight:500}
.dlv-alert-head span:nth-child(2),.dlv-alert-head span:nth-child(3),
.dlv-alert-head span:nth-child(4){text-align:right}
.dlv-alert{padding:7px 0;border-bottom:1px dashed var(--border)}
.dlv-alert:last-of-type{border-bottom:0}
.dlv-alert-n{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--text);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dlv-alert-n .dot{width:6px;height:6px;border-radius:50%;flex:0 0 auto}
.dlv-alert-n .dot.high{background:#EF4444;box-shadow:0 0 0 3px rgba(239,68,68,.16)}
.dlv-alert-n .dot.mid{background:#F59E0B;box-shadow:0 0 0 3px rgba(245,158,11,.16)}
.dlv-alert-n .dot.low{background:#94A3B8}
.dlv-alert-n7{font-size:12px;color:var(--text-2);text-align:right;font-variant-numeric:tabular-nums}
.dlv-alert-over{display:flex;flex-direction:column;align-items:flex-end;line-height:1.25}
.dlv-alert-over b{font-size:13px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums}
.dlv-alert-over i{font-style:normal;font-size:10px;color:var(--text-3);font-variant-numeric:tabular-nums}
.dlv-alert-peak{font-size:11.5px;color:var(--text-3);text-align:right;font-variant-numeric:tabular-nums}
.dlv-alert-note,.dlv-heat-note,.dlv-area-note,.dlv-rider-note{font-size:11px;color:var(--text-3);
  margin-top:10px;padding-top:9px;border-top:1px dashed var(--border);line-height:1.55}

/* ---------- 时段 × 门店热力 ---------- */
/* #dlvHeat 本身也要撑开：.dlv-heat 的 flex:1 只对父级生效，
   而父级默认是块级、高度由内容决定，所以之前行均分了、卡片下方还是空一大块 */
#dlvHeat{display:flex;flex-direction:column;flex:1}
.dlv-heat{display:flex;flex-direction:column;gap:3px;flex:1}
.dlv-heat-x,.dlv-heat-row{display:grid;grid-template-columns:58px repeat(24,1fr) 38px;
  gap:2px;align-items:center}
/* 每一行均分剩余高度：10 行写死 22px 时，右侧榜单更高会把这张卡撑出大片空白 */
.dlv-heat-row{flex:1;min-height:20px;align-items:stretch}
.dlv-heat-row .hx-name,.dlv-heat-row .hx-peak{align-self:center}
.dlv-heat-x span{font-size:9.5px;color:var(--text-3);text-align:center;
  font-variant-numeric:tabular-nums;line-height:1}
.dlv-heat-row .hx-name{font-size:11.5px;color:var(--text-2);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;padding-right:5px}
.dlv-heat-row i{display:block;height:100%;min-height:16px;border-radius:3px;background:var(--bg-2);
  transition:filter .12s}
.dlv-heat-row i:hover{filter:brightness(1.14)}
/* 5 档离散色阶：连续渐变在白卡片上分不出深浅，档位跳变才看得出「这格更热」 */
.dlv-heat-row i.hl-1{background:rgba(124,92,255,.13)}
.dlv-heat-row i.hl-2{background:rgba(124,92,255,.30)}
.dlv-heat-row i.hl-3{background:rgba(124,92,255,.50)}
.dlv-heat-row i.hl-4{background:rgba(124,92,255,.72)}
.dlv-heat-row i.hl-5{background:rgba(109,76,242,.96)}
.dlv-heat-row .hx-peak{font-size:10px;color:var(--text-3);text-align:right;
  font-variant-numeric:tabular-nums}

/* ---------- 区域需求密度 ---------- */
.dlv-areas{display:flex;flex-direction:column;gap:6px}
.dlv-area{display:grid;grid-template-columns:20px 96px 1fr 46px;gap:9px;align-items:center}
.dlv-area-i{width:18px;height:18px;border-radius:5px;background:var(--bg-2);color:var(--text-3);
  font-size:10.5px;display:flex;align-items:center;justify-content:center;
  font-variant-numeric:tabular-nums}
.dlv-area-i.is-top{background:var(--primary-soft);color:var(--primary);font-weight:700}
.dlv-area-n{font-size:12px;color:var(--text-2);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.dlv-area-n i{font-style:normal;font-size:10px;color:var(--text-3);margin-left:5px}
.dlv-area-track{height:7px;background:var(--bg-2);border-radius:5px;overflow:hidden}
.dlv-area-track i{display:block;height:100%;border-radius:5px;
  background:linear-gradient(90deg,rgb(var(--primary-rgb) / .42),var(--primary))}
.dlv-area-v{font-size:12px;color:var(--text-2);text-align:right;font-variant-numeric:tabular-nums}
.dlv-area-foot{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;
  margin-top:11px;font-size:11px;color:var(--text-3)}

/* ---------- 配送员看板 ---------- */
.dlv-rider-head,.dlv-rider{display:grid;grid-template-columns:minmax(110px,1.35fr) 1fr 1fr 1fr 1fr;
  gap:8px;align-items:center}
.dlv-rider-head{padding:0 0 7px;border-bottom:1px solid var(--border);margin-bottom:2px}
.dlv-rider-head span{font-size:10.5px;color:var(--text-3);font-weight:500}
.dlv-rider-head span:not(:first-child){text-align:right}
.dlv-rider{padding:7px 0;border-bottom:1px dashed var(--border)}
.dlv-rider:last-of-type{border-bottom:0}
.dlv-rider-n{display:flex;align-items:center;gap:6px;min-width:0}
.dlv-rider-n i{font-style:normal;width:16px;height:16px;flex:0 0 auto;border-radius:4px;
  background:var(--bg-2);color:var(--text-3);font-size:10px;display:flex;
  align-items:center;justify-content:center}
.dlv-rider-n b{font-size:12.5px;color:var(--text);font-weight:600;white-space:nowrap}
.dlv-rider-n em{font-style:normal;font-size:10.5px;color:var(--text-3);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.dlv-rider-v{font-size:12px;color:var(--text-2);text-align:right;font-variant-numeric:tabular-nums}
.dlv-rider-v small{font-size:9.5px;color:var(--text-3);margin-left:1px}
.dlv-rider-v.is-good{color:#15803D;font-weight:600}


/* 窄屏：两列并一列，渠道 7 格换 4 格 */
@media (max-width:1320px){
  .dlv-kpi-main{grid-template-columns:repeat(2,1fr)}
  .dlv-chans{grid-template-columns:repeat(4,1fr)}
  .dlv-row-2{grid-template-columns:1fr}
  /* 24 列热力图在窄卡片里会挤成一条线，把门店名列收窄、格子高度调低 */
  .dlv-heat-x,.dlv-heat-row{grid-template-columns:50px repeat(24,1fr) 34px}
  .dlv-heat-row i{height:13px}
}

  /* ================= 库存对比（商品 → 库存对比，2026-11-08） =================
     这一页跟商品中心其它页不一样，三处必须覆盖：
     1) .lp-card 有 max-width:1000px —— 九列表格装不下，放开；
     2) 表头把「本站库存」「商城库存」分别染色，否则两列数字长得一样，
        看三行以后就分不清哪个数是哪边了；
     3) 一个商品可能同时「库存不足 + 价格不对」，差异标签要能并排不换行。 */
  .ck-card{max-width:none;padding:18px 20px 14px;display:flex;flex-direction:column;gap:14px}
  .ck-head{display:flex;align-items:center;justify-content:space-between;gap:16px;flex:none}
  .ck-title{font-size:20px;font-weight:700;color:var(--text);letter-spacing:.2px}
  .ck-sub{font-size:12.5px;color:var(--text-3);margin-top:5px}
  .ck-head-r{display:flex;gap:8px;flex:none}

  .ck-btn{
    height:32px;padding:0 14px;border-radius:8px;font-size:13px;font-family:inherit;cursor:pointer;
    display:inline-flex;align-items:center;justify-content:center;gap:6px;
    border:1px solid transparent;transition:.15s;white-space:nowrap;
  }
  .ck-btn.sm{height:30px;padding:0 11px;font-size:12.5px}
  .ck-btn.ghost{background:#fff;border-color:#D8DCE6;color:var(--text-2)}
  .ck-btn.ghost:hover{border-color:rgb(var(--primary-rgb) / .45);color:var(--primary)}
  .ck-btn.primary{background:var(--primary);color:#fff;font-weight:700}
  .ck-btn.primary:hover{background:var(--primary-hover)}
  .ck-btn.soft{background:var(--primary-soft);color:var(--primary);font-weight:700}
  .ck-btn.soft:hover{background:rgb(var(--primary-rgb) / .16)}
  .ck-btn[disabled]{opacity:.5;cursor:not-allowed}

  /* 核对状态条：数据从哪来、什么时候来的，比差异本身更要紧 */
  .ck-status{
    display:flex;align-items:center;justify-content:space-between;gap:16px;
    background:#F8F9FC;border-radius:10px;height:42px;padding:0 14px;font-size:12.5px;flex:none;
  }
  .ck-status-l{display:flex;align-items:center;gap:10px;min-width:0;overflow:hidden}
  .ck-status-r{display:flex;align-items:center;gap:7px;color:var(--text-3);font-size:12px;white-space:nowrap;flex:none}
  .ck-pill{height:21px;padding:0 7px;border-radius:5px;font-size:11px;font-weight:700;display:inline-flex;align-items:center;flex:none}
  .ck-pill.local{background:var(--primary-soft);color:var(--primary)}
  .ck-pill.mall{background:#EEF2FF;color:#4F5BC4}
  .ck-status-v{color:var(--text);font-weight:600;white-space:nowrap}
  .ck-sep{width:1px;height:12px;background:#E3E6EE;display:block;flex:none}
  .ck-status-mut{color:var(--text-2);white-space:nowrap}
  .ck-dot{width:6px;height:6px;border-radius:50%;background:#0E9F6E;flex:none}
  .ck-dot.off{background:#C6CBD4}

  /* 9 张卡（待处理 / 库存 / 价高 / 价低 / 口径存疑 / 未在售 / 商城无 / 本站无 / 已淘汰）。
     写死 repeat(9) 在 1280 屏上每张只剩 120px，「商城在售·本站已淘汰」会折成两行把行高顶起来。
     auto-fit 让它按可用宽度自己排，窄屏折行也不会挤出横向滚动条。 */
  .ck-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:10px;flex:none}
  .ck-kpi{
    background:#FAFAFC;border:1px solid var(--border);border-radius:10px;padding:11px 14px;
    display:flex;flex-direction:column;gap:5px;text-align:left;cursor:pointer;
    font-family:inherit;transition:.15s;
  }
  .ck-kpi:hover{border-color:rgb(var(--primary-rgb) / .35)}
  .ck-kpi.on{border-color:var(--primary);background:var(--primary-soft)}
  .ck-kpi .k{font-size:12px;color:var(--text-3)}
  .ck-kpi .v{font-size:24px;font-weight:800;color:var(--text);font-variant-numeric:tabular-nums;line-height:1.1}
  .ck-kpi .v.warn{color:#D97706}
  .ck-kpi .v.danger{color:#DC2626}
  .ck-kpi .v.info{color:#4F5BC4}
  .ck-kpi .v.accent{color:var(--primary)}
  .ck-kpi .v.muted{color:#8A909E}
  /* 口径存疑不是「差评」也不是「正常」，用中性灰，别抢红黄色 */
  .ck-kpi .v.unit{color:#64748B}

  .ck-notice{
    display:block;background:#FFF7E6;border:1px solid #F7E3BC;border-radius:10px;
    padding:10px 14px;font-size:12.5px;color:#8A5A00;line-height:1.65;flex:none;
  }
  /* display:block 会盖掉 [hidden] 的 display:none，不清掉就留一条空黄条 */
  .ck-notice[hidden]{display:none}
  .ck-notice b{color:#B45309}

  .ck-tools{display:flex;align-items:center;justify-content:space-between;gap:12px;flex:none}
  .ck-chips{display:flex;gap:8px;flex-wrap:wrap;min-width:0}
  .ck-chip{
    height:30px;padding:0 13px;border-radius:15px;border:1px solid #E3E6EE;background:#fff;
    font-size:12.5px;color:var(--text-2);cursor:pointer;font-family:inherit;transition:.15s;white-space:nowrap;
  }
  .ck-chip:hover{border-color:rgb(var(--primary-rgb) / .4);color:var(--primary)}
  .ck-chip.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:700}
  .ck-tools-r{display:flex;gap:8px;align-items:center;position:relative;flex:none}
  .ck-search{
    height:32px;width:216px;border-radius:8px;border:1px solid transparent;background:#F5F6FA;
    padding:0 10px;font-size:12.5px;font-family:inherit;color:var(--text);outline:none;
  }
  .ck-search:focus{background:#fff;border-color:rgb(var(--primary-rgb) / .45)}

  .ck-menu{
    position:absolute;right:0;top:38px;z-index:30;background:#fff;border:1px solid var(--border);
    border-radius:10px;box-shadow:0 12px 28px rgba(20,24,35,.14);padding:6px;min-width:158px;
  }
  .ck-menu-t{font-size:11px;color:var(--text-3);padding:5px 9px 7px}
  .ck-menu-i{
    display:block;width:100%;text-align:left;padding:8px 10px;border-radius:7px;border:0;background:none;
    font-size:12.5px;color:var(--text);cursor:pointer;font-family:inherit;
  }
  .ck-menu-i:hover{background:var(--primary-soft);color:var(--primary)}

  .ck-table-wrap{flex:1;min-height:220px;overflow:auto;border:1px solid var(--border);border-radius:10px}
  /* 固定列宽：auto 布局下「商品名 + 商城名」会把表格撑到 1184，1280 屏上
     最后一列操作按钮被切掉一半 —— 那是整页唯一能点的地方，不能被切 */
  .ck-table{min-width:1120px;table-layout:fixed}
  .ck-table th{padding:0 12px;height:38px;font-size:12px;vertical-align:middle}
  .ck-table td{padding:7px 12px;height:58px;vertical-align:middle;white-space:nowrap}
  .ck-table .ck-c-num{text-align:right}
  .ck-th-local{color:var(--primary);font-weight:600}
  .ck-th-mall{color:#4F5BC4;font-weight:600}
  .ck-th-sep{color:var(--text-3);font-weight:400}
  .ck-c-cb{width:34px;text-align:center;padding:0}
  .ck-c-cb input{cursor:pointer}
  .ck-sn{font-family:Inter,"SF Mono",Menlo,Consolas,monospace;font-size:12px;color:var(--text-2);letter-spacing:.2px;overflow:hidden;text-overflow:ellipsis}
  /* 这两列要允许折行，但 .ck-table td 的 white-space:nowrap 比单类选择器权重高，
     必须带上 td 才盖得住 —— 否则一行挂三个标签时第三个直接被切掉 */
  .ck-table td.ck-g{white-space:normal;word-break:break-word}
  .ck-table td.ck-c-kinds{white-space:normal}
  .ck-gname{display:block;font-size:13px;font-weight:600;color:var(--text);line-height:1.35}
  .ck-gsub{display:block;font-size:11px;color:var(--text-3);margin-top:3px;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .ck-gsub.accent{color:var(--primary);opacity:.85}
  .ck-c-num{font-family:Inter;font-size:14px;color:var(--text);font-variant-numeric:tabular-nums}
  .ck-c-price{font-family:Inter;font-variant-numeric:tabular-nums;line-height:1.4}
  /* 会员价两档并排：`默认 105 / 108`  前=本站会员价 后=商城会员价
     档位用灰字小标，价格用等宽数字 —— 两行数字对齐才能一眼看出哪一档差。
     选择器要带 .ck-c-price 前缀（两个类），否则被上面通用的 span 规则覆盖成 block。 */
  .ck-c-price .ck-pv{display:flex;align-items:baseline;font-size:12.5px;color:var(--text)}
  .ck-c-price .ck-pv + .ck-pv{margin-top:2px;font-size:12.5px}
  .ck-pv i{font-style:normal;font-size:10.5px;color:var(--text-3);width:26px;flex:none}
  .ck-pv b{font-weight:600;font-variant-numeric:tabular-nums}
  .ck-pv em{font-style:normal;color:#D5D9E2;margin:0 5px;font-size:11px}
  .ck-th-sort{cursor:pointer;user-select:none;white-space:nowrap}
  .ck-th-sort:hover{color:var(--primary)}
  .ck-th-sort.on{color:var(--primary)}
  .ck-sort-i{font-style:normal;font-size:11px;margin-left:4px;color:#C6CBD4}
  .ck-th-sort.on .ck-sort-i{color:var(--primary)}
  .ck-c-ops{text-align:right}
  .ck-table tbody tr.is-handled{opacity:.55}

  .ck-badge{
    display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;
    font-size:11.5px;font-weight:600;border:1px solid transparent;white-space:nowrap;
  }
  .ck-badge.ok{background:#EBF9F1;color:#0E9F6E;border-color:#C7EFDD}
  .ck-badge.danger{background:#FDECEC;color:#C0392B;border-color:#F6D2D2}
  .ck-badge.accent{background:var(--primary-soft);color:var(--primary);border-color:#E0D3FB}
  .ck-tag{
    display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;
    font-size:11.5px;font-weight:600;border:1px solid transparent;white-space:nowrap;margin-right:6px;
  }
  .ck-tag:last-child{margin-right:0}
  .ck-tag.warn{background:#FEF3E2;color:#B45309;border-color:#F7DCB0}
  .ck-tag.danger{background:#FDECEC;color:#C0392B;border-color:#F6D2D2}
  .ck-tag.accent{background:var(--primary-soft);color:var(--primary);border-color:#E0D3FB}
  .ck-tag.muted{background:#F1F5F9;color:#64748B;border-color:#DDE3EC}
  /* 虚线边＝「这条还没定论」，跟实线的确定性问题区分开 */
  .ck-tag.unit{background:#F8FAFC;color:#5B6675;border-color:#C3CCD9;border-style:dashed}

  .ck-mut{color:#C6CBD4}
  .ck-warn-v{color:#D97706;font-weight:700}
  .ck-danger-v{color:#DC2626;font-weight:600}
  /* 「商城价低」用蓝：红色留给「多收顾客钱」，蓝色表示「少收了」。
     两边都用红的话，一屏红字里分不出哪边该涨价、哪边该降价。 */
  .ck-info-v{color:#2F6FEB;font-weight:600}
  .ck-empty{text-align:center;color:var(--text-3);font-size:13px;line-height:1.8;padding:56px 40px;white-space:normal}

  .ck-page{display:flex;align-items:center;justify-content:space-between;gap:12px;flex:none}
  .ck-page .info{font-size:12px;color:var(--text-3)}
  /* 分页按钮复用全局 .pager，这里只压小尺寸：表格行高 58，30px 的页码块会显得笨重 */
  .ck-pager{gap:4px}
  .ck-pager button{min-width:26px;height:26px;padding:0 7px;border-radius:6px;font-size:12px}
  .ck-pager .pg-dots{min-width:22px;height:26px}

  /* 规则抽屉 / 导入弹层：都挂在 body 下，见 goods.js 里 ckDrawerRoot 的注释 */
  .ck-mask{position:fixed;inset:0;background:rgba(17,20,28,.32);z-index:900;animation:ckFade .16s ease-out}
  .ck-drawer{
    position:fixed;top:0;right:0;bottom:0;width:480px;max-width:94vw;background:#fff;z-index:901;
    display:flex;flex-direction:column;box-shadow:-16px 0 48px rgba(20,24,35,.18);
    animation:ckSlide .2s ease-out;
  }
  @keyframes ckSlide{from{transform:translateX(26px);opacity:.5}to{transform:none;opacity:1}}
  @keyframes ckFade{from{opacity:0}to{opacity:1}}
  .ck-dh{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:18px 20px 14px;border-bottom:1px solid var(--border);flex:none}
  .ck-dh-t{font-size:19px;font-weight:700;color:var(--text)}
  .ck-dh-s{font-size:11.5px;color:var(--text-3);margin-top:5px;line-height:1.55}
  .ck-dh-x{
    width:28px;height:28px;border-radius:14px;border:0;background:#F4F5F9;color:var(--text-2);
    cursor:pointer;font-size:13px;flex:none;line-height:1;
  }
  .ck-dh-x:hover{background:#EBEDF3}
  .ck-db{flex:1;overflow-y:auto;padding:16px 20px;display:flex;flex-direction:column;gap:10px}
  .ck-grp{display:flex;flex-direction:column;gap:6px;padding-bottom:6px}
  .ck-grp + .ck-grp{border-top:1px solid var(--border);padding-top:12px}
  .ck-grp-t{font-size:13.5px;font-weight:700;color:var(--text)}
  .ck-grp-d{font-size:11.5px;color:var(--text-3);line-height:1.6}
  /* 抽屉底部的「接口没开通」说明：写在规则旁边，用户调「自动同步」前一定看得到 */
  .ck-tip{
    font-size:11.5px;color:#8A5A00;line-height:1.65;background:#FFF7E6;border:1px solid #F7E3BC;
    border-radius:8px;padding:9px 11px;margin-top:4px;
  }
  .ck-row{display:flex;align-items:center;justify-content:space-between;gap:14px;min-height:36px;font-size:12.5px;color:var(--text)}
  /* 左标签吃掉剩余宽度并允许收缩：标签最长的那行（同一货号对多个商城商品）
     在 480 的抽屉里会和右侧下拉贴死 */
  .ck-row > span:first-child{flex:1;min-width:0}
  .ck-sel{
    height:32px;border-radius:8px;border:1px solid #D8DCE6;background:#fff;color:var(--text);
    font-size:12.5px;font-family:inherit;padding:0 8px;min-width:148px;cursor:pointer;outline:none;
  }
  .ck-in{
    height:32px;width:62px;border-radius:7px;border:1px solid #D8DCE6;background:#fff;
    font-size:12.5px;font-family:Inter;text-align:center;color:var(--text);outline:none;
  }
  .ck-in.wide{width:132px;text-align:left;padding:0 8px;font-family:inherit}
  .ck-in:focus,.ck-sel:focus{border-color:rgb(var(--primary-rgb) / .5)}
  .ck-unit{display:inline-flex;align-items:center;gap:6px;color:var(--text-3);font-size:12px;white-space:nowrap}
  .ck-sw{display:flex;align-items:center;gap:9px;min-height:36px;cursor:pointer;font-size:12.5px;color:var(--text)}
  .ck-sw input{display:none}
  .ck-sw i{width:38px;height:22px;border-radius:11px;background:#D8DCE6;position:relative;flex:none;transition:.18s}
  .ck-sw i::after{
    content:'';position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;
    background:#fff;transition:.18s;box-shadow:0 1px 3px rgba(0,0,0,.2);
  }
  .ck-sw input:checked + i{background:var(--primary)}
  .ck-sw input:checked + i::after{left:18px}
  .ck-df{display:flex;justify-content:flex-end;gap:10px;padding:14px 20px;border-top:1px solid var(--border);flex:none}
  .ck-df .ck-btn{height:36px;padding:0 18px}

  /* ---- 比对范围抽屉 ----
     带表格和标签输入，比规则抽屉宽一号；窄屏退回全屏宽，不要出现横向滚动 */
  .ck-drawer.wide{width:760px}
  @media (max-width:820px){.ck-drawer.wide{width:100vw;max-width:100vw}}

  .ck-sc-hero{
    display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:12px;
    background:linear-gradient(135deg,rgba(var(--primary-rgb)/.07),rgba(var(--primary-rgb)/.02));
    border:1px solid rgba(var(--primary-rgb)/.14);flex:none;
  }
  .ck-sc-hero > div{display:flex;flex-direction:column;gap:2px;min-width:0}
  .ck-sc-hero b{font-size:26px;font-weight:800;line-height:1.05;color:var(--text);font-variant-numeric:tabular-nums}
  .ck-sc-hero span{font-size:11.5px;color:var(--text-3)}
  .ck-sc-hero em{font-style:normal;color:var(--text-3);font-size:14px}
  .ck-sc-hero .on b{color:var(--primary)}
  .ck-sc-hero .off{margin-left:auto;text-align:right}
  .ck-sc-hero .off b{color:#8A909E}

  .ck-sc-by{display:flex;flex-wrap:wrap;gap:6px;flex:none}
  .ck-sc-chip{
    display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 10px;border-radius:13px;
    border:1px solid var(--border);background:#fff;color:var(--text-2);font-size:12px;cursor:pointer;
    font-family:inherit;transition:.15s;
  }
  .ck-sc-chip:hover{border-color:rgb(var(--primary-rgb) / .4);color:var(--text)}
  .ck-sc-chip b{font-variant-numeric:tabular-nums;color:var(--text)}
  .ck-sc-chip.on{background:var(--primary);border-color:var(--primary);color:#fff}
  .ck-sc-chip.on b{color:#fff}
  .ck-sc-none{font-size:12px;color:var(--text-3);padding:10px 2px}

  .ck-field{display:flex;flex-direction:column;gap:6px;margin-top:8px}
  .ck-field-l{font-size:12.5px;color:var(--text)}
  .ck-tagbox{
    display:flex;flex-wrap:wrap;gap:6px;min-height:34px;padding:6px 8px;border-radius:9px;
    border:1px dashed #D8DCE6;background:#FAFBFD;
  }
  .ck-tt{
    display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 4px 0 9px;border-radius:12px;
    background:var(--primary-soft);color:var(--primary);font-size:12px;font-weight:600;
  }
  .ck-tt i{
    font-style:normal;width:16px;height:16px;border-radius:8px;display:inline-flex;
    align-items:center;justify-content:center;cursor:pointer;font-size:10px;color:var(--primary);
    opacity:.6;
  }
  .ck-tt i:hover{opacity:1;background:rgba(var(--primary-rgb)/.14)}
  .ck-tt-empty{font-size:11.5px;color:var(--text-3);font-style:normal;line-height:22px}
  .ck-in.wide.full{width:100%;text-align:left;padding:0 10px}

  .ck-grp-t{display:flex;align-items:center;gap:8px}
  .ck-grp-t > span:first-child{flex:1;min-width:0}
  .ck-grp-n{font-size:11.5px;font-weight:600;color:var(--text-3);font-variant-numeric:tabular-nums}
  .ck-mini{
    height:24px;padding:0 10px;border-radius:12px;border:1px solid rgb(var(--primary-rgb) / .3);
    background:var(--primary-soft);color:var(--primary);font-size:11.5px;font-weight:600;
    cursor:pointer;font-family:inherit;flex:none;
  }
  .ck-mini:hover{background:rgb(var(--primary-rgb) / .14)}

  /* 自动规则默认折叠：配一次就不动了，把抽屉高度让给天天要看的排除列表 */
  .ck-sc-rule{border:1px solid var(--border);border-radius:11px;background:#fff;flex:none;overflow:hidden}
  .ck-sc-rule > summary{
    display:flex;align-items:center;gap:8px;padding:11px 13px;cursor:pointer;
    list-style:none;font-size:13px;font-weight:700;color:var(--text);
  }
  .ck-sc-rule > summary::-webkit-details-marker{display:none}
  .ck-sc-rule > summary::after{margin-left:auto;font-size:11.5px;font-weight:600;color:var(--primary);content:'调整'}
  .ck-sc-rule[open] > summary::after{content:'收起'}
  .ck-sc-rule[open] > summary{border-bottom:1px dashed var(--border)}
  .ck-sc-sum-t{flex:none}
  .ck-sc-sum-s{flex:1;min-width:0;font-style:normal;font-weight:400;font-size:11px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .ck-sc-rule-b{padding:10px 13px 13px;display:flex;flex-direction:column;gap:6px}
  .ck-sc-preset-row{display:flex;justify-content:flex-end}

  .ck-sc-tools{display:flex;gap:8px;margin:4px 0 2px}
  .ck-sc-tools .ck-search{flex:1;min-width:0}
  .ck-sc-tools .ck-sel{width:150px;flex:none}
  /* 列表吃掉抽屉剩下的高度：固定 300px 时抽屉下半截是一片空白，
     而 307 条记录要翻 11 页 —— 空间给列表才是对的 */
  .ck-sc-sec{flex:1;min-height:0}
  .ck-sc-list{
    flex:1;min-height:110px;overflow-y:auto;border:1px solid var(--border);border-radius:10px;background:#fff;
  }
  .ck-sc-row{
    display:flex;align-items:center;gap:10px;padding:8px 10px;border-bottom:1px solid #F1F3F8;
    cursor:pointer;
  }
  .ck-sc-row:last-child{border-bottom:0}
  .ck-sc-row:hover{background:#FAFBFD}
  .ck-sc-row input{flex:none;width:15px;height:15px;cursor:pointer;accent-color:var(--primary)}
  .ck-sc-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
  .ck-sc-t{font-size:12.5px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .ck-sc-s{font-size:11px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums}
  /* 这一条钉在抽屉底部：列表 300px 高，「恢复参与」在被挤到滚动区外时
     等于藏起来了 —— 它是这个面板仅次于保存的操作，不能靠用户自己滚出来 */
  .ck-sc-foot{
    display:flex;align-items:center;gap:8px;padding:8px 0 6px;
    position:sticky;bottom:-16px;background:#fff;z-index:2;
  }
  .ck-sc-all{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2);cursor:pointer;flex:none}
  .ck-sc-all input{width:15px;height:15px;cursor:pointer;accent-color:var(--primary)}
  .ck-sc-pg{display:inline-flex;align-items:center;gap:6px;margin-left:auto}
  .ck-sc-pg .ck-btn{height:26px;padding:0 10px;font-size:11.5px}
  .ck-sc-pg .ck-btn:disabled{opacity:.45;cursor:default}
  .ck-sc-page{font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums;min-width:74px;text-align:center}
  .ck-sc-foot > .ck-btn{height:26px;padding:0 12px;font-size:11.5px;flex:none}

  /* 状态条上那个可点的「比对 N · 排除 M」 */
  .ck-status-scope{
    height:22px;padding:0 9px;border-radius:11px;border:1px solid rgba(var(--primary-rgb)/.22);
    background:rgba(var(--primary-rgb)/.07);color:var(--primary);font-size:11.5px;font-weight:600;
    cursor:pointer;font-family:inherit;font-variant-numeric:tabular-nums;flex:none;
  }
  .ck-status-scope:hover{background:rgba(var(--primary-rgb)/.14)}
  /* 状态条里的行内文字按钮：不抢视觉，但点得到（「商城数据 11-08 21:32 · 重拉」） */
  .ck-linkbtn{
    height:20px;padding:0 6px;border:0;border-radius:5px;background:transparent;
    color:var(--primary);font-size:11.5px;font-weight:600;cursor:pointer;font-family:inherit;flex:none;
  }
  .ck-linkbtn:hover{background:rgba(var(--primary-rgb)/.1)}
  .ck-linkbtn:disabled{color:var(--text-3);cursor:default;background:transparent}
  .ck-menu-i.sep{border-top:1px solid var(--border);margin-top:4px;padding-top:9px;color:#8A909E}

  body.theme-dark .ck-sc-hero{background:rgba(var(--primary-rgb)/.12);border-color:rgba(var(--primary-rgb)/.24)}
  body.theme-dark .ck-sc-chip{background:#23252E;border-color:#3A3F4F;color:var(--text-2)}
  body.theme-dark .ck-sc-chip.on{background:var(--primary);border-color:var(--primary);color:#fff}
  body.theme-dark .ck-tagbox{background:#1B1D25;border-color:#3A3F4F}
  body.theme-dark .ck-sc-list{background:#1E2029;border-color:#3A3F4F}
  body.theme-dark .ck-sc-row{border-bottom-color:#2A2D38}
  body.theme-dark .ck-sc-row:hover{background:#23252E}
  body.theme-dark .ck-sc-foot{background:#1E2029}
  body.theme-dark .ck-sc-rule{background:#23252E;border-color:#3A3F4F}
  body.theme-dark .ck-sc-rule[open] > summary{border-bottom-color:#3A3F4F}
  body.theme-dark .ck-status-scope{background:rgba(var(--primary-rgb)/.16);color:#B9A6F5}
  body.theme-dark .ck-menu-i.sep{color:#7A8192}

  .ck-modal{
    position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);width:620px;max-width:94vw;
    background:#fff;border-radius:14px;z-index:901;padding:20px 22px;
    display:flex;flex-direction:column;gap:12px;box-shadow:0 24px 64px rgba(20,24,35,.24);
  }
  .ck-ta{
    width:100%;height:210px;border-radius:10px;border:1px solid #D8DCE6;padding:10px 12px;
    font-family:"SF Mono",Menlo,Consolas,monospace;font-size:12px;line-height:1.6;
    resize:vertical;outline:none;color:var(--text);
  }
  .ck-ta:focus{border-color:rgb(var(--primary-rgb) / .5)}
  .ck-modal-tip{font-size:11.5px;color:var(--text-3);line-height:1.6}
  .ck-modal .ck-df{padding:0;border:0}

  body.theme-dark .ck-status,body.theme-dark .ck-kpi{background:#23252E}
  body.theme-dark .ck-kpi.on{background:rgb(var(--primary-rgb) / .14)}
  body.theme-dark .ck-btn.ghost{background:#23252E;border-color:#3A3F4F;color:var(--text-2)}
  body.theme-dark .ck-search{background:#23252E;color:var(--text)}
  body.theme-dark .ck-chip{background:#23252E;border-color:#3A3F4F;color:var(--text-2)}
  body.theme-dark .ck-chip.on{background:var(--primary);color:#fff}
  body.theme-dark .ck-drawer,body.theme-dark .ck-modal,body.theme-dark .ck-menu{background:#1E2029}
  body.theme-dark .ck-in,body.theme-dark .ck-sel,body.theme-dark .ck-ta{background:#23252E;border-color:#3A3F4F;color:var(--text)}
  body.theme-dark .ck-notice{background:rgba(180,83,9,.14);border-color:rgba(180,83,9,.35);color:#E8C777}
  body.theme-dark .ck-notice b{color:#F5D08A}
  body.theme-dark .ck-tip{background:rgba(180,83,9,.14);border-color:rgba(180,83,9,.35);color:#E8C777}
  body.theme-dark .ck-sep{background:#3A3F4F}
  body.theme-dark .ck-mut{color:#5A6070}
  body.theme-dark .ck-dh-x{background:#23252E;color:var(--text-2)}
  body.theme-dark .ck-dh-x:hover{background:#2C2F3A}
  body.theme-dark .ck-badge.ok{background:rgba(14,159,110,.14);color:#3DDCA0;border-color:rgba(14,159,110,.3)}
  body.theme-dark .ck-badge.danger,body.theme-dark .ck-tag.danger{background:rgba(229,72,77,.14);color:#FF8A80;border-color:rgba(229,72,77,.32)}
  body.theme-dark .ck-tag.warn{background:rgba(217,119,6,.16);color:#F0C674;border-color:rgba(217,119,6,.32)}
  body.theme-dark .ck-tag.muted{background:rgba(148,163,184,.12);color:#B6C2D2;border-color:rgba(148,163,184,.28)}
  body.theme-dark .ck-tag.unit{background:rgba(148,163,184,.10);color:#CBD5E1;border-color:rgba(148,163,184,.5);border-style:dashed}
  /* 暗色下 #64748B 的「口径存疑」数字几乎看不见，单独提亮 */
  body.theme-dark .ck-kpi .v.unit{color:#94A3B8}
  body.theme-dark .ck-badge.accent,body.theme-dark .ck-tag.accent{background:rgb(var(--primary-rgb) / .16);color:#C4B5FD;border-color:rgb(var(--primary-rgb) / .34)}
  /* 商城那一列的表头在亮色下是深靛蓝，暗色底上几乎看不见，单独提亮 */
  body.theme-dark .ck-th-mall{color:#9AA6F5}

  /* 原来这里有一条 @media(max-width:1440px){.ck-kpis{repeat(4,1fr)}} —— 那是 7 张卡时代
     为了窄屏排两行写的。现在 9 张卡，4 列会变成 4+4+1 的三行（最后一行孤零零一张），
     而且 auto-fit 本来就会按可用宽度自己算列数，这条写死的规则只会帮倒忙，删掉。 */

/* ============================================================
   财务中心 · 卡片管理（商品提货卡）
   ------------------------------------------------------------
   只用主题变量（--panel / --border / --text*），深浅色一起过；
   状态徽标是浅底深字的小胶囊，落在深色页面上也读得清。
   ============================================================ */
.pk{display:flex;flex-direction:column;gap:12px}
.pk-top{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between;
  background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:10px 14px}
.pk-seg{display:flex;gap:4px;flex-wrap:wrap}
.pk-tab{border:0;background:transparent;color:var(--text-2);padding:7px 11px;border-radius:8px;
  font-size:13px;font-family:inherit;cursor:pointer;transition:.15s}
.pk-tab:hover{background:rgb(var(--primary-rgb) / .07);color:var(--text)}
.pk-tab.on{background:rgb(var(--primary-rgb) / .12);color:var(--primary);font-weight:600}
.pk-tab i{font-style:normal;font-size:11px;margin-left:5px;opacity:.75}
.pk-tools{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.pk-body{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:2px 8px 6px;overflow:auto}
.pk-foot{display:flex;gap:10px;align-items:center;justify-content:flex-end;padding:0 4px}
.pk-dim{color:var(--text-3)}
.pk-no{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.6px;font-weight:600}
.pk-no.is-lg{font-size:17px}
.pk-tbl tbody tr{cursor:pointer}
.pk-tbl tbody tr:hover{background:rgb(var(--primary-rgb) / .04)}
.pk-empty{padding:38px 0;text-align:center;color:var(--text-3);font-size:13px}
.pk-empty.is-err{color:#A32D2D}
.pk-st{display:inline-block;padding:2px 8px;border-radius:20px;font-size:11.5px;font-weight:500;white-space:nowrap}
.pk-st.is-gray{background:#F1EFE8;color:#5F5E5A}
.pk-st.is-blue{background:#E6F1FB;color:#185FA5}
.pk-st.is-amber{background:#FAEEDA;color:#854F0B}
.pk-st.is-green{background:#EAF3DE;color:#3B6D11}
.pk-st.is-red{background:#FCEBEB;color:#A32D2D}
.pk-left{color:#3B6D11;font-weight:600}

/* 单卡详情 */
.pk-detail{display:flex;flex-direction:column;gap:10px}
.pk-dhead{display:flex;flex-direction:column;gap:6px}
.pk-dhead>div:first-child{display:flex;align-items:center;gap:10px}
.pk-dmeta{font-size:12.5px;color:var(--text-3)}
.pk-log-h{font-size:13px;font-weight:600;margin-top:6px}
.pk-logs{display:flex;flex-direction:column;gap:6px;max-height:220px;overflow:auto}
.pk-log{display:flex;flex-wrap:wrap;gap:10px;font-size:12.5px;color:var(--text-2);
  padding:6px 8px;border:1px solid var(--border);border-radius:8px}
.pk-log-act{padding:1px 7px;border-radius:20px;font-size:11px;background:#F1EFE8;color:#5F5E5A}
.pk-log-act.is-open{background:#E6F1FB;color:#185FA5}
.pk-log-act.is-verify{background:#EAF3DE;color:#3B6D11}
.pk-log-act.is-void{background:#FCEBEB;color:#A32D2D}

/* 开卡 / 核销 / 导入 弹窗内部 */
.pk-open,.pk-verify,.pk-import{display:flex;flex-direction:column;gap:14px}
.pk-sec{display:flex;flex-direction:column;gap:8px}
.pk-sec-h{font-size:13px;font-weight:600;color:var(--text)}
.pk-row{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap}
.pk-fl{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--text-3);min-width:0;flex:1}
.pk-in{height:38px;padding:0 10px;border:1px solid var(--border);border-radius:8px;
  background:var(--panel);color:var(--text);font-size:13px;font-family:inherit;outline:none;min-width:0}
.pk-in:focus{border-color:rgb(var(--primary-rgb) / .55)}
.pk-in.is-lg{height:44px;font-size:15px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.6px}
.pk-ta{height:auto;padding:8px 10px;line-height:1.5;resize:vertical;width:100%;box-sizing:border-box}
.pk-hint{font-size:12.5px;color:var(--text-3);align-self:center}
.pk-hint.is-ok{color:#3B6D11}
.pk-hint.is-err{color:#A32D2D}
.pk-note{font-size:12px;color:var(--text-3);line-height:1.65;background:rgb(var(--primary-rgb) / .05);
  border-radius:8px;padding:8px 10px}
.pk-sum{margin-left:auto;font-size:13px;color:var(--text-2);align-self:center}
.pk-sum b{font-size:18px;color:var(--text);margin-left:6px}

/* 商品搜索结果 */
.pk-pick{display:flex;flex-direction:column;gap:4px;max-height:170px;overflow:auto}
.pk-g{display:flex;justify-content:space-between;gap:12px;align-items:center;
  padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:transparent;
  cursor:pointer;font-family:inherit;text-align:left;transition:.14s}
.pk-g:hover{border-color:rgb(var(--primary-rgb) / .45);background:rgb(var(--primary-rgb) / .05)}
.pk-g-n{font-size:13px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pk-g-m{font-size:11.5px;color:var(--text-3);white-space:nowrap;flex:none}

/* 卡内清单 */
.pk-cart-t td{padding:6px 8px}
.pk-cart-t .pk-in{height:32px;font-size:12.5px;width:100%}
.pk-del{border:0;background:transparent;color:var(--text-3);cursor:pointer;font-size:14px;padding:2px 6px;border-radius:6px}
.pk-del:hover{background:#FCEBEB;color:#A32D2D}
.pk-sub{font-weight:600;color:var(--text)}

/* 核销 */
.pk-vbox{min-height:120px;display:flex;flex-direction:column;gap:10px}
.pk-vhead{display:flex;flex-direction:column;gap:5px}
.pk-vhead>div:first-child{display:flex;align-items:center;gap:10px}
.pk-verify .pk-in{width:100%}

body.theme-dark .pk-note{background:rgba(255,255,255,.05)}
body.theme-dark .pk-st.is-gray{background:#33353D;color:#C9C8C2}
body.theme-dark .pk-empty.is-err,body.theme-dark .pk-hint.is-err{color:#F09595}
body.theme-dark .pk-hint.is-ok,body.theme-dark .pk-left{color:#97C459}
body.theme-dark .pk-del:hover{background:rgba(240,149,149,.15);color:#F09595}
/* 工具条搜索框：不加宽度会被 flex 压成一个「卡号 / 订单号 / (」的窄条 */
.pk-tools .pk-in{width:240px}
@media (max-width:1200px){ .pk-tools .pk-in{width:180px} }

/* ============================================================
   「功能」二级菜单 + 卡片统计抽屉（2026-11-10）
   ------------------------------------------------------------
   提货卡的三个动作（核销 / 开卡 / 统计）从会员横条收进左侧「功能」，
   横条腾出来只放结账要用的东西；统计是一个从右侧滑出的只读抽屉。
   ============================================================ */

/* 「功能」入口：和三个页签同一套外观，但它不是页签 ——
   展开时不用主色填充（那会让人以为「当前在这一页」），只做浅底 + 箭头转向。 */
.csh-nav-fn{position:relative}
.csh-nav-caret{
  position:absolute;right:8px;top:50%;width:0;height:0;margin-top:-2px;
  border-left:4px solid currentColor;
  border-top:3.5px solid transparent;border-bottom:3.5px solid transparent;
  opacity:.45;transition:transform .16s ease,opacity .16s;
}
.csh-nav-fn.on{background:rgb(var(--primary-rgb) / .10);color:var(--primary)}
.csh-nav-fn.on .csh-nav-caret{transform:rotate(90deg);opacity:.9}
.csh-nav-fn:focus-visible{outline:2px solid var(--primary);outline-offset:2px}

/* 二级菜单：比个人中心那个宽一点（要留位置给右侧键帽） */
.csh-fnmenu{min-width:178px;padding:6px}
.csh-fnmenu .side-menu-item{height:38px;gap:12px;justify-content:space-between;padding:0 10px}
.csh-fnmenu .side-menu-item .kb{flex:none;opacity:.85}
.csh-fnmenu .side-menu-item.is-off{color:var(--text-3);cursor:not-allowed}
.csh-fnmenu .side-menu-item.is-off:hover{background:transparent;color:var(--text-3)}
.csh-fn-n{font-size:13.5px;font-weight:500;white-space:nowrap}
.csh-fn-tip{
  margin:4px 4px 2px;padding-top:7px;border-top:1px dashed var(--border);
  font-size:11px;line-height:1.5;color:var(--text-3);
}

/* ---------- 卡片统计抽屉（右侧） ---------- */
.csh-cs-mask{
  position:fixed;inset:0;z-index:2700;background:rgba(20,24,35,.38);
  opacity:0;transition:opacity .2s;backdrop-filter:blur(2px);
}
.csh-cs-mask.open{opacity:1}
.csh-cs-dw{
  position:absolute;top:12px;right:12px;bottom:12px;width:min(430px,92vw);
  display:flex;flex-direction:column;background:var(--panel);
  border:1px solid var(--border);border-radius:16px;overflow:hidden;
  box-shadow:0 24px 70px rgba(17,20,30,.26);
  transform:translateX(28px) scale(.994);opacity:0;
  transition:transform .26s cubic-bezier(.22,1,.36,1),opacity .18s ease;
}
.csh-cs-mask.open .csh-cs-dw{transform:none;opacity:1}
.csh-cs-h{
  flex:none;display:flex;align-items:center;gap:10px;
  padding:15px 16px;border-bottom:1px solid var(--border);
}
.csh-cs-h .spacer{flex:1}
.csh-cs-hl{display:flex;align-items:baseline;gap:8px;min-width:0}
.csh-cs-hl b{font-size:15px;font-weight:700;color:var(--text)}
.csh-cs-shop{
  font-size:12px;color:var(--text-3);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;max-width:150px;
}
.csh-cs-b{flex:1;min-height:0;overflow:auto;padding:10px 12px 14px}
.csh-cs-sec{margin-bottom:16px}
.csh-cs-sec:last-child{margin-bottom:0}
.csh-cs-st{
  display:flex;align-items:center;gap:7px;padding:2px 4px 7px;
  position:sticky;top:-10px;z-index:1;background:var(--panel);
}
.csh-cs-st b{font-size:12.5px;font-weight:700;color:var(--text)}
.csh-cs-st em{
  font-style:normal;font-size:11.5px;color:var(--text-3);
  font-variant-numeric:tabular-nums;margin-left:auto;
}
.csh-cs-dot{width:7px;height:7px;border-radius:50%;flex:none}
.csh-cs-dot.is-gray{background:#94A3B8}
.csh-cs-dot.is-blue{background:#3B82F6}
.csh-cs-dot.is-green{background:#16A34A}
.csh-cs-row{
  padding:9px 11px;border:1px solid var(--border);border-radius:10px;
  margin-bottom:6px;background:var(--panel);transition:border-color .12s;
}
.csh-cs-row:hover{border-color:rgb(var(--primary-rgb) / .35)}
.csh-cs-r1{display:flex;align-items:center;gap:8px}
.csh-cs-no{
  font-size:13px;font-weight:600;letter-spacing:.03em;color:var(--text);
  font-variant-numeric:tabular-nums;
}
.csh-cs-tag{font-size:10.5px;line-height:1;padding:3px 6px;border-radius:6px;font-weight:600;flex:none}
.csh-cs-tag.is-gray{background:#EEF1F5;color:#64748B}
.csh-cs-tag.is-blue{background:#E8F1FF;color:#2563EB}
.csh-cs-tag.is-amber{background:#FFF4DF;color:#B45309}
.csh-cs-tag.is-green{background:#E9F8EE;color:#15803D}
.csh-cs-amt{
  margin-left:auto;font-size:13px;font-weight:700;color:var(--text);
  font-variant-numeric:tabular-nums;
}
.csh-cs-r2{
  margin-top:3px;font-size:12px;color:var(--text-2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.csh-cs-r3{margin-top:2px;font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
.csh-cs-empty{
  padding:10px 12px;font-size:12px;color:var(--text-3);
  background:rgba(17,20,30,.03);border-radius:9px;
}
.csh-cs-foot{
  flex:none;display:flex;flex-direction:column;gap:5px;
  padding:10px 16px 12px;border-top:1px solid var(--border);
  font-size:11.5px;line-height:1.5;color:var(--text-3);
}
.csh-cs-warn{color:#B45309}
.csh-cs-at{font-variant-numeric:tabular-nums}

body.theme-dark .csh-fnmenu .side-menu-item.is-off{color:rgba(255,255,255,.34)}
body.theme-dark .csh-fn-tip{color:rgba(255,255,255,.42)}
body.theme-dark .csh-cs-tag.is-gray{background:#2E313C;color:#A7AEC0}
body.theme-dark .csh-cs-tag.is-blue{background:rgba(59,130,246,.18);color:#93C5FD}
body.theme-dark .csh-cs-tag.is-amber{background:rgba(245,158,11,.18);color:#FCD34D}
body.theme-dark .csh-cs-tag.is-green{background:rgba(22,163,74,.20);color:#86EFAC}
body.theme-dark .csh-cs-empty{background:rgba(255,255,255,.05)}
body.theme-dark .csh-cs-warn{color:#FCD34D}

/* ============================================================
   团购单标记（2026-11-10）
   ------------------------------------------------------------
   流水行上的「团购单」是一个标记按钮：标了这笔销售不进本店销售任务。
   配色用紫：既别跟退货的红（钱退回去了）混，也别跟赠品的绿（白送的）混 ——
   它是一笔正常成交，只是不占门店的任务指标。
   ============================================================ */
.dor-tag.is-grp{background:rgba(109,40,217,.12);color:#6D28D9}
.dor-op.is-grp:hover{border-color:rgba(109,40,217,.5);color:#6D28D9}
.dor-op.is-grp.on{
  border-color:rgba(109,40,217,.45);background:rgba(109,40,217,.10);
  color:#6D28D9;font-weight:600;
}
body.theme-dark .dor-tag.is-grp{background:rgba(139,92,246,.22);color:#C4B5FD}
body.theme-dark .dor-op.is-grp.on{
  background:rgba(139,92,246,.18);border-color:rgba(139,92,246,.5);color:#C4B5FD;
}
body.theme-dark .dor-op.is-grp:hover{border-color:rgba(139,92,246,.5);color:#C4B5FD}
