/* ============================================================
   VEX 客服工作台（H5）
   移动端优先 · 浅色卡片风 · 按钮 ≥44px / 列表点击区 ≥48px
   主色 #2F6BFF  成功 #36B37E  警告 #FF8A00  危险 #E5484D
   ============================================================ */
:root{
  --brand:#2F6BFF;
  --brand-soft:#EAF1FF;
  --ok:#36B37E;
  --warn:#FF8A00;
  --bad:#E5484D;
  --bg:#F5F7FA;
  --card:#FFFFFF;
  --txt:#1B2333;
  --txt2:#5A6580;
  --txt3:#97A0B5;
  --line:#EEF1F6;
  --surface:#FFFFFF;      /* 卡片/输入/弹层/底部Tab 的面色 */
  --soft:#F2F5FA;         /* 标签/状态徽标的浅底 */
  --soft2:#F7F9FC;        /* 备注条浅底 */
  --bar-bg:#F0F3F8;
  --danger-bg:#FFF1F1;
  --overdue-bg:#FFF7F7;
  --skel-a:#F0F3F8; --skel-b:#E6EBF2;
  --login-a:#F7F9FC; --login-b:#EEF2FA;
  --tb-a:#2F6BFF; --tb-b:#5B8DFF;   /* 顶部渐变 */
  --radius:14px;
  --shadow:0 2px 12px rgba(27,35,51,.06);
  --safe-b:env(safe-area-inset-bottom, 0px);
  --safe-t:env(safe-area-inset-top, 0px);
}
/* ---------------- H5 深色主题（与 PC 后台「暗夜」配套） ---------------- */
[data-theme="dark"]{
  --brand:#5B8DFF;
  --brand-soft:rgba(91,141,255,.16);
  --ok:#3ecf8e;
  --warn:#ffa940;
  --bad:#ff6b70;
  --bg:#0e1320;
  --card:#161d2e;
  --txt:#e6ebf5;
  --txt2:#9aa6bd;
  --txt3:#66738a;
  --line:#232c42;
  --surface:#161d2e;
  --soft:#1e2740;
  --soft2:#1a2236;
  --bar-bg:#1e2740;
  --danger-bg:rgba(229,72,77,.10);
  --overdue-bg:rgba(229,72,77,.08);
  --skel-a:#1a2236; --skel-b:#232c42;
  --login-a:#0e1320; --login-b:#131a2c;
  --tb-a:#1b2b5e; --tb-b:#2f4aa8;
  --shadow:0 2px 14px rgba(0,0,0,.35);
  color-scheme:dark;
}
/* ---------------- H5 粉色主题（樱花粉 · 浅色系） ---------------- */
[data-theme="pink"]{
  --brand:#E84393;
  --brand-soft:#FCE9F1;
  --ok:#36B37E;
  --warn:#FF8A00;
  --bad:#E5484D;
  --bg:#FDF3F7;
  --card:#FFFFFF;
  --txt:#33202B;
  --txt2:#7A5E6C;
  --txt3:#B296A3;
  --line:#F5E2EA;
  --surface:#FFFFFF;
  --soft:#FAEBF2;
  --soft2:#FDF4F8;
  --bar-bg:#F8EBF2;
  --danger-bg:#FFF1F1;
  --overdue-bg:#FFF7F7;
  --skel-a:#F8EBF2; --skel-b:#F1DCE6;
  --login-a:#FDF6F9; --login-b:#F8EBF2;
  --tb-a:#E84393; --tb-b:#F07EB0;   /* 顶部渐变 */
  --shadow:0 2px 12px rgba(122,42,74,.08);
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;padding:0;min-height:100%}
body{
  background:var(--bg);
  color:var(--txt);
  font:14px/1.6 -apple-system,"PingFang SC","Microsoft YaHei","Helvetica Neue",Arial,sans-serif;
  -webkit-font-smoothing:antialiased;
}
/* 底部留白只给工作台主区：挂在 body 上会让登录页（本身已是 100vh）
   多出 58px 空白条，页面能上下微滚 */
#main{padding-bottom:calc(58px + var(--safe-b))}
.hidden{display:none !important}
h1,h2,h3,h4{margin:0;font-weight:600}
p{margin:0}
button,input,select,textarea{font-family:inherit;font-size:14px;color:var(--txt)}
input,select,textarea{
  width:100%;background:var(--surface);border:1px solid var(--line);border-radius:10px;
  padding:11px 12px;outline:none;
}
input:focus,select:focus,textarea:focus{border-color:var(--brand)}
textarea{min-height:84px;resize:vertical}
.muted{color:var(--txt2)}
.mini{font-size:12px}

/* ---------------- 按钮 ---------------- */
.btn{
  min-height:44px;border:1px solid var(--line);background:var(--surface);color:var(--txt);
  padding:0 16px;border-radius:10px;cursor:pointer;font-size:14px;
}
.btn:active{opacity:.86}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
.btn.ghost{background:transparent}
.btn.sm{min-height:34px;padding:0 12px;font-size:13px;border-radius:8px}
.btn.block{width:100%;margin-top:8px}
.btn[disabled]{opacity:.55}
.btn.danger{color:var(--bad);border-color:rgba(229,72,77,.35);background:rgba(229,72,77,.06)}

/* ---------------- 登录 ---------------- */
.login{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;background:linear-gradient(180deg,var(--login-a),var(--login-b))}
.login-card{width:100%;max-width:400px}
/* 品牌主标：H5 登录页（手机首次打开就看得到） */
.login-logo{width:88px;height:88px;border-radius:22px;object-fit:cover;display:block;
  margin:0 auto 14px;box-shadow:0 10px 26px rgba(47,107,255,.3)}
.login-title{font-size:22px;font-weight:700;text-align:center;margin-bottom:6px}
.login-sub{text-align:center;color:var(--txt3);font-size:13px;margin-bottom:26px}
.panel{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:20px 18px}
.field{margin-bottom:14px}
.field label{display:block;font-size:14px;font-weight:600;color:var(--txt);margin-bottom:6px}
.field label .req{color:var(--bad);font-weight:800;margin-left:1px}
.field.req label{font-size:15px;font-weight:700}
.field.req label .req{color:var(--bad)}
.check{display:flex;align-items:center;gap:8px;min-height:44px;font-size:13px;color:var(--txt2)}
.check input{width:18px;height:18px;min-height:0}
.tip{min-height:20px;margin-top:10px;font-size:13px;color:var(--bad);text-align:center}
.login-foot{margin-top:14px;text-align:center;font-size:12px;color:var(--txt3)}

/* ---------------- 顶部 ---------------- */
.topbar{
  position:sticky;top:0;z-index:30;background:linear-gradient(135deg,var(--tb-a),var(--tb-b));
  color:#fff;padding:calc(12px + var(--safe-t)) 16px 16px;
}
.topbar .row{display:flex;justify-content:space-between;align-items:center;gap:10px}
/* 顶栏品牌标：手机端常显（PC 端侧栏已有 logo，藏掉避免一处两显） */
.tb-logo{width:34px;height:34px;flex:0 0 34px;border-radius:9px;object-fit:cover;display:block;
  border:1px solid rgba(255,255,255,.4);background:rgba(255,255,255,.14);box-shadow:0 3px 10px rgba(0,0,0,.16)}
.tb-title{flex:1;min-width:0}
.topbar h2{font-size:19px;font-weight:600}
.topbar .sub{font-size:12.5px;opacity:.9;margin-top:2px}
.avatar{
  width:38px;height:38px;border-radius:50%;background:rgba(255,255,255,.22);
  border:1px solid rgba(255,255,255,.45);display:flex;align-items:center;justify-content:center;
  font-size:14px;font-weight:600;flex:0 0 38px;cursor:pointer;
}
.avatar-box{display:flex;align-items:center;gap:4px}
.linkout{background:transparent;border:none;color:#fff;font-size:12px;opacity:.92;padding:6px 2px;cursor:pointer;min-height:44px}
.theme-btn{background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.35);color:#fff;font-size:13px;border-radius:999px;width:34px;height:34px;cursor:pointer;flex:0 0 34px}
.theme-btn.login-float{position:fixed;top:calc(12px + var(--safe-t));right:14px;z-index:20;background:var(--surface);color:var(--txt2);border-color:var(--line);box-shadow:var(--shadow)}

/* ---------------- 内容 ---------------- */
.wrap{padding:12px 12px 20px;display:flex;flex-direction:column;gap:12px}
.card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px}
.card-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;gap:8px}
.card-head h3{font-size:16px}
.card-head .more{font-size:12px;color:var(--txt3)}

/* 「我负责的店铺」胶囊（第三十四轮）：老板在后台分配店铺后，客服端要看得见 */
.shop-chips{display:flex;flex-wrap:wrap;gap:8px}
.shop-chip{display:inline-flex;align-items:center;background:var(--soft);border:1px solid var(--line);
  border-radius:999px;padding:6px 12px;font-size:13px;color:var(--txt2);line-height:18px}
.shop-chip i{font-style:normal;opacity:.55;margin:0 2px}
.shop-chip.main{background:var(--brand-soft);border-color:transparent;color:var(--brand);font-weight:600}
.shop-chip em{font-style:normal;font-size:11px;background:var(--brand);color:#fff;
  border-radius:999px;padding:0 6px;margin-left:5px;line-height:16px}
/* 客户详情弹层里的章节标题：此前 JS 用了 .sec-title 但 CSS 没定义，
   只能靠内联 style 撑着，与其余章节标题的间距字重不一致 */
.sec-title{display:flex;justify-content:space-between;align-items:center;gap:8px}
.sec-title h3{font-size:14px;font-weight:600;color:var(--txt)}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.grid4{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}

/* 数据小卡 */
.metric{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px}
.metric .lb{font-size:12px;color:var(--txt3);display:flex;align-items:center;gap:6px}
.metric .vl{font-size:24px;font-weight:700;line-height:1.25;margin-top:4px;letter-spacing:-.5px}
.metric .ex{font-size:12px;color:var(--txt2);margin-top:2px}
.metric.alert .vl{color:var(--bad)}
.metric.warn .vl{color:var(--warn)}
.metric.ok .vl{color:var(--ok)}
.metric.money .vl{font-size:26px;color:var(--brand)}
.badge-red{
  background:var(--bad);color:#fff;font-size:11px;border-radius:999px;padding:1px 7px;font-weight:600;
}

/* 进度条 */
.prog{margin-bottom:12px}
.prog:last-child{margin-bottom:0}
.prog-top{display:flex;justify-content:space-between;font-size:13px;margin-bottom:6px;gap:8px}
.prog-top .r{color:var(--txt2)}
.prog-top .r b{color:var(--txt)}
.bar{height:8px;background:var(--bar-bg);border-radius:999px;overflow:hidden}
.bar i{display:block;height:100%;border-radius:999px;background:var(--brand);transition:width .3s}
.bar.ok i{background:var(--ok)}
.bar.warn i{background:var(--warn)}
.bar.bad i{background:var(--bad)}

/* 评级 */
.grade{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:12px;font-size:20px;font-weight:700;color:#fff}
.grade.S{background:linear-gradient(135deg,var(--brand),var(--tb-b))}
.grade.A{background:var(--ok)}
.grade.B{background:var(--warn)}
.grade.C{background:var(--bad)}
.grade.D{background:var(--txt3)}

/* 预警条 */
.alert-bar{
  background:var(--danger-bg);border:1px solid rgba(229,72,77,.28);border-left:4px solid var(--bad);
  border-radius:12px;padding:12px 14px;
}
.alert-bar .t{font-size:14px;font-weight:600;color:var(--bad);margin-bottom:6px}
.alert-row{display:flex;justify-content:space-between;align-items:center;min-height:44px;font-size:13.5px;border-top:1px dashed rgba(229,72,77,.22);cursor:pointer}
.alert-row:first-of-type{border-top:none}
.alert-row b{color:var(--bad)}
.alert-row .go{color:var(--txt3);font-size:12px}

/* 快捷操作 */
.quick{display:grid;grid-template-columns:1fr 1fr;gap:10px}
/* 首页「快捷操作 + 今日千牛」分组：手机上下堆叠（与原来完全一致），
   PC 段里改成一左一右并排 —— 同一个 DOM，只换排版 */
.h-row2{display:flex;flex-direction:column;gap:12px}
.qbtn{
  min-height:56px;background:var(--surface);border:1px solid var(--line);border-radius:12px;
  display:flex;align-items:center;gap:10px;padding:0 12px;cursor:pointer;box-shadow:var(--shadow);
}
.qbtn i{font-style:normal;font-size:18px;color:var(--brand)}
.qbtn span{font-size:14px}

/* 横向筛选标签 */
.chips{display:flex;gap:8px;overflow-x:auto;padding:2px 0 6px;-webkit-overflow-scrolling:touch}
.chips::-webkit-scrollbar{display:none}
.chip{
  flex:0 0 auto;min-height:34px;padding:0 14px;border-radius:999px;border:1px solid var(--line);
  background:var(--surface);color:var(--txt2);font-size:13px;cursor:pointer;
}
.chip.active{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
/* 「归属客服」筛选：只在管理角色（老板/管理员）进客户页时出现。
   与上面那排客户状态筛选用一条细线隔开，否则两排同款胶囊会被当成同一组。 */
.owner-chips{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line);align-items:center}
.chips-lb{flex:0 0 auto;font-size:12px;color:var(--txt3);padding-right:2px}
.search{display:flex;gap:8px;margin-bottom:10px}
.search input{flex:1;min-height:44px}

/* 列表项 */
.item{
  display:flex;justify-content:space-between;align-items:center;gap:10px;
  min-height:56px;padding:12px 0;border-bottom:1px solid var(--line);cursor:pointer;
}
.item:last-child{border-bottom:none}
.item .l{min-width:0;flex:1}
.item .l b{display:block;font-size:14.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.item .l span{font-size:12px;color:var(--txt3);display:block;margin-top:2px}
.item .r{text-align:right;flex:0 0 auto}
.item .r b{font-size:14px}
.item .r span{display:block;font-size:12px;color:var(--txt3);margin-top:2px}
.item.overdue{border:1px solid rgba(229,72,77,.4);border-radius:12px;padding:12px 10px;margin-bottom:8px;background:var(--overdue-bg)}
.item.overdue:last-child{margin-bottom:0}

.tag{display:inline-block;font-size:11px;padding:2px 8px;border-radius:6px;background:var(--soft);color:var(--txt2);margin-right:4px}
.tag.blue{background:var(--brand-soft);color:var(--brand)}
.tag.green{background:rgba(54,179,126,.12);color:var(--ok)}
.tag.orange{background:rgba(255,138,0,.12);color:var(--warn)}
.tag.red{background:rgba(229,72,77,.10);color:var(--bad)}
.st{font-size:11.5px;padding:3px 9px;border-radius:999px;background:var(--soft);color:var(--txt2)}
.st.待完成{background:var(--brand-soft);color:var(--brand)}
.st.处理中{background:rgba(255,138,0,.12);color:var(--warn)}
.st.已完成{background:rgba(54,179,126,.12);color:var(--ok)}
.st.超时{background:rgba(229,72,77,.12);color:var(--bad)}
.st.待派单{background:rgba(255,138,0,.12);color:var(--warn)}
.st.服务中,.st.派单中{background:var(--brand-soft);color:var(--brand)}
.st.售后处理{background:rgba(229,72,77,.12);color:var(--bad)}
/* 订单状态枚举里有「关闭」，此前漏了样式，会落回默认灰底与「售后处理」区分不开 */
.st.关闭{background:var(--soft);color:var(--txt3)}

/* KV 行 */
.kv{display:flex;justify-content:space-between;align-items:center;min-height:44px;padding:8px 0;border-bottom:1px solid var(--line);font-size:14px}
.kv:last-child{border-bottom:none}
.kv b{font-weight:600}
.kv .bad{color:var(--bad)}
.kv .ok{color:var(--ok)}

/* 折叠面板 */
.fold{border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--surface);box-shadow:var(--shadow)}
.fold-head{display:flex;justify-content:space-between;align-items:center;min-height:48px;padding:0 14px;cursor:pointer;font-size:14px;font-weight:600}
.fold-body{padding:0 14px 14px;font-size:13px;color:var(--txt2);line-height:1.9}
.fold-body b{color:var(--txt)}

/* 空状态 / 加载 */
.empty{text-align:center;color:var(--txt3);font-size:13px;padding:26px 10px}
.empty .btn{margin-top:12px}
.empty b{color:var(--txt2);font-weight:600}
/* 加载态：H5 网络更慢，先给反馈再出内容 */
.loading-box{display:flex;align-items:center;justify-content:center;gap:8px;padding:40px 12px;color:var(--txt3);font-size:13px}
.spinner{width:15px;height:15px;flex:0 0 auto;border:2px solid var(--line2);border-top-color:var(--brand);border-radius:50%;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.spinner.sm{width:12px;height:12px}
.skel{background:linear-gradient(90deg,var(--skel-a) 25%,var(--skel-b) 37%,var(--skel-a) 63%);background-size:400% 100%;animation:sk 1.3s ease infinite;border-radius:10px}
@keyframes sk{0%{background-position:100% 50%}100%{background-position:0 50%}}
.skel-card{height:96px;margin-bottom:12px}
.skel-line{height:16px;margin-bottom:10px}
.pull{text-align:center;font-size:12px;color:var(--txt3);padding:10px 0}
.load-more{text-align:center;padding:14px 0}

/* 底部 Tab */
.tabbar{
  position:fixed;left:0;right:0;bottom:0;z-index:40;display:grid;grid-template-columns:repeat(auto-fit,minmax(64px,1fr));
  background:var(--surface);border-top:1px solid var(--line);padding-bottom:var(--safe-b);
}
.tab{min-height:56px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;color:var(--txt3);cursor:pointer;font-size:11px}
.tab i{font-style:normal;font-size:18px;line-height:1}
.tab.active{color:var(--brand);font-weight:600}

/* 弹层 */
.mask{position:fixed;inset:0;background:rgba(15,22,36,.45);z-index:50}
.sheet{
  position:fixed;left:0;right:0;z-index:51;background:var(--surface);border-radius:18px 18px 0 0;
  padding:16px 16px calc(16px + var(--safe-b));overflow:auto;
  /* --kb：软键盘占掉的高度（由 JS 从 visualViewport 实时写入，默认 0）。
     底部弹层是 position:fixed，键盘弹起时它**不会自己上移** ——
     不减掉这块，键盘就正好盖住弹层下半部的输入框，
     用户「打了一屏字却什么都看不见」。 */
  bottom:var(--kb, 0px);
  max-height:min(88vh, calc(100vh - var(--kb, 0px) - 12px));
}
.sheet-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
.sheet-head h3{font-size:17px}
.sheet-foot{display:flex;gap:10px;margin-top:8px}
.sheet-foot .btn{flex:1}
.note{background:var(--soft2);border-radius:10px;padding:10px 12px;margin-bottom:8px;font-size:13.5px}
.note .at{font-size:11.5px;color:var(--txt3);margin-top:4px}

/* toast */
.toast{
  position:fixed;left:50%;transform:translateX(-50%);bottom:calc(80px + var(--safe-b));
  background:rgba(27,35,51,.94);color:#fff;padding:11px 18px;border-radius:999px;font-size:13.5px;z-index:60;
  box-shadow:0 6px 20px rgba(0,0,0,.2);
}
.toast.err{background:var(--bad)}
.toast.ok{background:var(--ok)}

/* ---------------- Tab5 短视频投产助手 ---------------- */
.sv-card{border:1px solid var(--line);border-radius:12px;padding:12px;margin-bottom:10px;background:var(--surface)}
.sv-card:last-of-type{margin-bottom:0}
.sv-head{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:6px}
.sv-title{font-size:14.5px;font-weight:600;line-height:1.5;margin-bottom:4px}
.sv-stats{display:flex;gap:12px;flex-wrap:wrap;font-size:12px;color:var(--txt2);margin:8px 0;font-variant-numeric:tabular-nums}
.sv-actions{display:flex;gap:8px}
.sv-actions .btn{flex:1}
.pkg-text{white-space:pre-wrap;word-break:break-word;line-height:1.8;font-size:13px}
.st.已生成{background:var(--brand-soft);color:var(--brand)}
.st.已采用{background:rgba(54,179,126,.12);color:var(--ok)}
.st.已废弃{background:var(--soft);color:var(--txt3)}

/* 中屏（窄窗口 / 平板竖屏）：保留手机版观感，居中一列。
   注意上限必须封到 PC 断点下方，否则会和下面的 PC 布局同时命中，
   两边都生效（PC 的 grid 与这里的 max-width 互相打架）。 */
@media (min-width:721px) and (max-width:999px){
  body{max-width:480px;margin:0 auto;background:var(--login-b)}
  .tabbar{max-width:480px;left:50%;right:auto;transform:translateX(-50%);width:100%}
  .topbar{max-width:480px;left:50%;right:auto;transform:translateX(-50%);width:100%}
}

/* ============================================================
   PC 端布局（≥1000px）—— 「客服在电脑前也要好用」
   ------------------------------------------------------------
   修订前这里是一条 `body{max-width:480px}`：电脑上打开客服工作台，
   只是把手机页居中摆着，两边留一大片空白，横向空间全浪费。
   现在宽屏改为「侧栏 + 内容区」的桌面布局，并把各 Tab 换成多栏：
     首页 → KPI 四列 + 快捷操作/千牛并排
     绩效 → 左 KPI / 右千牛+趋势
     客户 → 左列表 / 右详情（不再用底部弹层）
     任务 → 宽表格
     短视频 → 素材卡双列
   断点以下的 DOM 完全一致，只是 CSS 不再拉伸它。
   ============================================================ */
/* 两处仅 PC 可见的容器：默认关掉，PC 段里再打开。
   必须写在媒体查询**之前** —— 同权重下后写的会赢，
   写在后面会把 PC 的 display 覆盖掉（「代码里有、界面上没有」）。 */
.sidenav{display:none}
.tb-tools{display:none}

@media (min-width:1000px){
  html{background:var(--bg)}
  body{background:var(--bg)}

  /* ---------- 骨架：左固定侧栏 + 右内容 ---------- */
  #main{display:grid;grid-template-columns:216px minmax(0,1fr);align-items:start;
        min-height:100vh;padding-bottom:0}
  .main-col{min-width:0;display:flex;flex-direction:column;min-height:100vh}
  .tabbar{display:none}
  .pull{display:none}          /* 桌面没有下拉手势，改用工具区的「刷新」 */

  /* ---------- 侧栏 ---------- */
  .sidenav{
    display:flex;flex-direction:column;gap:4px;
    position:sticky;top:0;height:100vh;box-sizing:border-box;
    padding:16px 12px 14px;background:var(--card);border-right:1px solid var(--line);
  }
  .sn-logo{display:flex;align-items:center;gap:8px;padding:4px 8px 16px}
  .sn-logo-img{width:26px;height:26px;flex:0 0 26px;border-radius:7px;object-fit:cover;display:block}
  .sn-mark{font-size:19px;font-weight:800;letter-spacing:.5px;color:var(--brand)}
  .sn-sub{font-size:12px;color:var(--txt3)}
  .sn-nav{display:flex;flex-direction:column;gap:2px}
  .sn-item{display:flex;align-items:center;gap:10px;min-height:42px;padding:0 10px;
           border-radius:10px;cursor:pointer;color:var(--txt2);font-size:14px}
  .sn-item:hover{background:var(--soft);color:var(--txt)}
  .sn-item.active{background:var(--brand-soft);color:var(--brand);font-weight:600}
  .sn-ic{font-style:normal;font-size:15px;width:18px;text-align:center;flex:0 0 18px}
  .sn-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .sn-badge{flex:0 0 auto;background:var(--bad);color:#fff;font-size:11px;font-weight:600;
            border-radius:999px;padding:1px 7px}
  .sn-foot{margin-top:auto;border-top:1px solid var(--line);padding-top:12px}
  .sn-me{display:flex;align-items:center;gap:9px;padding:0 6px 10px;min-width:0}
  .sn-ava{width:34px;height:34px;flex:0 0 34px;border-radius:50%;background:var(--brand-soft);
          color:var(--brand);display:flex;align-items:center;justify-content:center;
          font-size:13px;font-weight:700}
  .sn-me b{display:block;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .sn-me span{display:block;font-size:11.5px;color:var(--txt3)}
  .sn-btns{display:flex;gap:6px}
  .sn-btn{flex:1;min-height:34px;border:1px solid var(--line);background:var(--surface);
          color:var(--txt2);border-radius:8px;font-size:12.5px;cursor:pointer}
  .sn-btn:hover{border-color:var(--brand);color:var(--brand)}

  /* ---------- 顶栏改为浅色应用条（宽屏下蓝色渐变太重） ---------- */
  .topbar{position:sticky;top:0;z-index:30;background:var(--card);color:var(--txt);
          border-bottom:1px solid var(--line);padding:14px 24px}
  .topbar h2{font-size:19px;color:var(--txt)}
  .topbar .sub{font-size:12.5px;color:var(--txt3);opacity:1;margin-top:2px}
  .tb-logo{display:none}             /* PC 侧栏已有 logo，顶栏不再重复 */
  .avatar-box{display:none}          /* 用户信息移到侧栏底部，避免一处两显 */
  .tb-tools{display:flex;align-items:center;gap:10px;margin-left:auto;padding-right:4px}
  .tb-tools .btn{min-height:34px}
  .tb-kbd{font-size:11.5px;color:var(--txt3)}
  .tb-kbd kbd{border:1px solid var(--line);border-bottom-width:2px;border-radius:5px;
              padding:0 5px;font-size:11px;background:var(--soft)}

  /* ---------- 内容区：统一限宽，避免 4K 屏上横向拉成一条 ---------- */
  .wrap{max-width:1560px;width:100%;padding:20px 24px 32px;gap:14px}

  /* ---------- 首页：KPI 四列，快捷操作与千牛并排 ---------- */
  #body.page-home .grid2{grid-template-columns:repeat(4,minmax(0,1fr));gap:14px}
  #body.page-home .metric{padding:16px 18px}
  #body.page-home .metric .vl{font-size:28px}
  .h-row2{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:14px;align-items:start}
  #body.page-home .quick{grid-template-columns:1fr 1fr}
  .alert-row{min-height:40px}

  /* ---------- 绩效：左 KPI / 右 千牛+趋势 ---------- */
  /* 用显式 grid-row/column 而不是 :nth-child 定位：
     卡片顺序以后调整时不会误伤，且视觉顺序（按行读）与 DOM 顺序一致 */
  #body.page-perf{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);
                  gap:14px;align-items:start}
  #body.page-perf .p-kpi{grid-column:1;grid-row:1}
  #body.page-perf .p-qn{grid-column:2;grid-row:1}
  #body.page-perf .p-chart{grid-column:1;grid-row:2}
  #body.page-perf .p-fold{grid-column:2;grid-row:2}

  /* ---------- 客户：左列表 + 右详情（不再弹层遮住列表） ---------- */
  #body.page-crm{display:grid;grid-template-columns:minmax(0,1fr);gap:14px}
  .crm-body{display:grid;grid-template-columns:380px minmax(0,1fr);gap:14px;align-items:start}
  .crm-list .item{padding:11px 4px}
  .crm-list .item.active{background:var(--brand-soft);border-radius:10px;
                         border-bottom-color:transparent;padding-left:10px;padding-right:10px}
  .crm-detail{max-height:calc(100vh - 172px);overflow:auto}
  .crm-detail .item{cursor:default}

  /* ---------- 任务：宽表格 ---------- */
  .tbl-wrap{border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--surface)}
  .dtbl{width:100%;border-collapse:collapse;font-size:13.5px}
  .dtbl th{text-align:left;font-weight:600;font-size:12.5px;color:var(--txt3);
           background:var(--soft);padding:10px 12px;white-space:nowrap}
  .dtbl td{padding:11px 12px;border-top:1px solid var(--line);vertical-align:middle}
  .dtbl tr:hover td{background:var(--soft2)}
  .dtbl td.ops{white-space:nowrap;text-align:right}
  .dtbl td.ops .btn{margin-left:6px}
  .dtbl .t-title{font-weight:600;min-width:200px}
  .dtbl .t-dim{color:var(--txt3);font-size:12.5px}
  .dtbl tr.overdue td{background:var(--overdue-bg)}

  /* ---------- 短视频：素材卡双列 ---------- */
  .sv-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .sv-list .sv-card{margin-bottom:0}
  .sv-card .sv-actions .btn{flex:0 0 auto}
  .chips{flex-wrap:wrap;overflow:visible}

  /* ---------- 弹层在宽屏收敛成居中对话框（底部抽屉是手机形态） ---------- */
  .sheet{left:50%;right:auto;bottom:auto;top:50%;transform:translate(-50%,-50%);
         width:640px;max-width:92vw;max-height:86vh;border-radius:16px}
  .sheet-foot .btn{flex:0 0 auto;min-width:120px;margin-left:auto}
  .sheet-foot{justify-content:flex-end}
  .toast{bottom:32px}
}

/* ============================================================
   「使用手册」入口（第十八轮）
   手册入口是 <a href="./guide.html">，复用了 .qbtn / .sn-btn / .linkout 三套
   按钮样式。这三个类原本只服务 <button>，直接给 <a> 用会带上下划线，
   且 .sn-btn 没写 display（inline 元素上 flex:1 不生效）—— 这里补齐。
   ============================================================ */
a.qbtn,a.sn-btn,a.linkout{text-decoration:none}
a.sn-btn{display:flex;align-items:center;justify-content:center}
a.linkout{display:inline-flex;align-items:center;justify-content:center}

/* ============================================================
   自助录入表单（第十九轮）
   客服在手机上录单 / 建客户用。两个数字（收入、成本）并排一行，
   手机上竖着排会多出一次滚动，"报价多少"这种高频字段要够近。
   ============================================================ */
.field-row{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.field-row .field{margin-bottom:14px;min-width:0}
.field .hint,.hint{font-size:11.5px;color:var(--txt3);line-height:1.6;margin:4px 0 0}
@media (max-width:420px){
  /* 极窄屏（iPhone SE 一类）两个数字框并排会挤到看不清，退回上下排 */
  .field-row{grid-template-columns:1fr;gap:0}
}

/* ---------- 手机上的「智能标签」行必须换行（第四十一轮补） ----------
   `.chips` 是 `overflow-x:auto` + `::-webkit-scrollbar{display:none}` ——
   隐藏滚动条的横向滚动**没有任何视觉线索**。标签只有 3 类时已经微微溢出，
   客户不会觉得少了什么；扩到 5 类后，右半屏整片消失的恰好是老板新要的
   「优质客户 / 高复购客户」，客服滑不动（也不知道能滑）就只能得出
   「手机上根本没有这两个标签」的结论 —— 这正是「改了却看不见」。
   ★ 只动 `.tag-chips` 这一行：录单 / 打手的 chips 行条目少，换行反而更占地方。
     PC 宽屏（≥1000px）本来就 flex-wrap:wrap，不受这条影响。 */
@media (max-width:999px){
  .chips.tag-chips{flex-wrap:wrap;overflow:visible}
}

/* ============================================================
   手机端输入体验（第五轮 · 老板手动测试反馈）
   老板原话：「用手机在前端打字（拼音出来不显示字体）」
   —— 拆开来看是三个各自独立的缺陷，全都要修。
   ============================================================ */

/* ① 输入框字号必须 ≥16px（只在窄屏提，PC 保持紧凑排版）
   iOS Safari 对 font-size < 16px 的输入框，聚焦时会**自动放大整个页面**
   （这是系统行为，viewport 里的 maximum-scale 拦不住）。放大后输入框
   连同正在打的字一起跑出视口 —— 用户看到的就是「打了字却不显示」。
   桌面浏览器没有这个机制，不必为它牺牲 PC 的紧凑排版。 */
@media (max-width:999px){
  input,select,textarea{font-size:16px}
}

/* ② 页面留白也要给键盘让位
   --kb 由 JS（bindKeyboardInset）从 visualViewport 实时写入，默认 0。
   不然键盘弹起后，贴着底部的那个输入框永远滚不上来。 */
#main{padding-bottom:calc(58px + var(--safe-b) + var(--kb,0px))}

/* ③ 弹层内的错误条（「订单号已录过」这类需要用户做决定的错误）
   不用 toast：toast 两三秒就飘走，用户还没想明白该改号还是该去查那一单，
   提示就没了 —— 那正是老板觉得「一重复就卡死」的原因。 */
.form-err{
  background:var(--danger-bg);border:1px solid rgba(229,72,77,.3);
  border-radius:10px;padding:11px 12px;margin-bottom:14px;
}
.form-err b{display:block;font-weight:600;color:var(--bad);line-height:1.6;margin-bottom:9px}
.form-err-acts{display:flex;gap:8px;flex-wrap:wrap}
.form-err-acts .btn{flex:0 0 auto}

/* ---------- 客户详情的动作按钮 + 可点的订单行（第五轮） ---------- */
.cust-acts{display:flex;gap:8px;margin-top:8px}
.cust-acts .btn{flex:1;min-width:0}
/* 删除按钮不参与拉伸：它是低频且危险的动作，
   占掉一半宽度会显得跟「编辑资料」一样日常，反而误导 */
.cust-acts .btn.danger{flex:0 0 auto}
/* 可点的订单行：给箭头 + 按下反馈，否则用户根本不知道这一行能点进详情 */
.cust-order{cursor:pointer;border-radius:10px}
.cust-order:active{background:var(--soft)}
.cust-order i{color:var(--txt3);font-style:normal;margin-left:2px}

/* ============================================================
   客户智能标签 · 打手智能分级（第三十六轮）
   ------------------------------------------------------------
   配色类名说明：PC 端 style.css 用的是 gold/ok/warn/bad，
   而 cs.css 早期只定义了 blue/green/orange/red。
   两套名字并存的结果是「电脑上是金色的金牌徽章、手机上是块灰砖」——
   同一个概念两种观感。这里把 PC 那套名字在 H5 补齐，以 PC 为准。
   ============================================================ */
.tag.gold{background:rgba(214,158,0,.15);color:#a97c00}
.tag.ok{background:rgba(54,179,126,.12);color:var(--ok)}
.tag.warn{background:rgba(255,138,0,.12);color:var(--warn)}
.tag.bad{background:rgba(229,72,77,.10);color:var(--bad)}
[data-theme="dark"] .tag.gold{background:rgba(255,213,79,.16);color:#ffd54f}
.tag.bad,.st.bad{font-weight:600}

/* ---------- 卡片上的标签行 ----------
   ★ `.item .l span` 是给「描述行」用的（块级 + 12px 灰字），
     它的选择器优先级(2类1元素) 高于 `.tag`(1类) ——
     直接把徽章 span 扔进 .l，会变成一块一行、颜色也被冲成灰的。
     下面这几条把优先级顶上去(4类+)，专治这个问题。
     ⚠️ 改这里之前先看 cshome.js 的 custItem / playerCard 注释。 */
.item .l .item-tags{display:block;margin-top:5px}
.item .l .item-tags .tag{
  display:inline-block;font-size:11px;line-height:16px;padding:2px 7px;border-radius:6px;
  margin:0 4px 4px 0;background:var(--soft);color:var(--txt2)
}
.item .l .item-tags .tag.gold{background:rgba(214,158,0,.15);color:#a97c00}
.item .l .item-tags .tag.ok{background:rgba(54,179,126,.12);color:var(--ok)}
.item .l .item-tags .tag.warn{background:rgba(255,138,0,.12);color:var(--warn)}
.item .l .item-tags .tag.bad{background:rgba(229,72,77,.10);color:var(--bad);font-weight:600}
[data-theme="dark"] .item .l .item-tags .tag.gold{background:rgba(255,213,79,.16);color:#ffd54f}

/* 打手卡片上的数字行 / 分店铺行 —— 同样要压过 .item .l b 的块级规则 */
.item .l .player-nums b{display:inline;font-size:12.5px;font-weight:700;color:var(--txt2)}
.item .l .player-nums b.bad{color:var(--bad)}
.item .l .shop-lines{display:flex;flex-wrap:wrap;gap:6px;margin-top:5px}
.item .l .shop-lines em{
  font-style:normal;font-size:11.5px;background:var(--soft);border-radius:6px;
  padding:2px 7px;color:var(--txt2)
}
.item .l .shop-lines em b{display:inline;font-weight:700;color:var(--txt)}
.item.player-item .l > b{white-space:normal;overflow:visible;text-overflow:clip}

/* 右侧档位结论：颜色必须跟着档位走，不能靠 .item .r b 的默认字号 */
.item .r b.tone-bad{color:var(--bad)}
.item .r b.tone-gold{color:#a97c00}
.item .r b.tone-ok{color:var(--ok)}
.item .r b.tone-warn{color:var(--warn)}
.item .r b.tone-c{color:var(--txt3)}
[data-theme="dark"] .item .r b.tone-gold{color:#ffd54f}
.item .r b{font-size:12.5px}

/* ---------- 打手页顶部的小统计条 ---------- */
.kpi-mini{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}
.mini-stat{
  background:var(--soft2);border:1px solid var(--line);border-radius:12px;
  padding:10px 8px;text-align:center;min-width:0
}
.mini-stat > span{display:block;font-size:11.5px;color:var(--txt3)}
.mini-stat > b{display:block;font-size:19px;font-weight:700;margin:2px 0 1px;line-height:1.2}
.mini-stat > b.bad{color:var(--bad)}
.mini-stat > em{display:block;font-style:normal;font-size:10.5px;color:var(--txt3);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media (max-width:380px){ .mini-stat > em{display:none} }

/* 芯片上的计数 */
.chip-n{font-weight:700;font-size:11.5px;margin-left:4px;opacity:.85}
.chip.active .chip-n{opacity:1}

/* ---------- 说明盒（判定理由 / 口径说明） ---------- */
.notes-box{background:var(--soft2);border:1px solid var(--line);border-radius:12px;
  padding:11px 13px;font-size:12.5px;color:var(--txt2);line-height:1.85}
.notes-box b{color:var(--txt);display:block;margin-bottom:4px;font-size:13px}
.notes-box ul{margin:0;padding-left:18px}
.notes-box li{margin-bottom:3px}
.notes-box li:last-child{margin-bottom:0}
/* 详情里的标签理由条 */
.note.tag-note{display:flex;gap:8px;align-items:flex-start}
.note.tag-note > div > span:last-child{color:var(--txt2);font-size:12.5px;line-height:1.7}

/* 标签筛选那排与固定芯片隔开，否则两排同款胶囊会被当成同一组 */
.tag-chips{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line);align-items:center}
/* 打手页搜索行里的「添加打手」按钮不参与伸缩（input 已经是 flex:1） */
.search .btn{flex:0 0 auto}

/* ============================================================
 * 第三十七轮：录单挂打手 + 客服评分
 * ============================================================ */

/* 录单/建档时选打手：输入即搜，搜不到就地建档 */
.pk-wrap{position:relative}
/* 第四十九轮：候选列表必须**有上限**。此前 overflow:hidden 但没有 max-height，
   打手/客户一多，下拉就跟着内容无限拉长，把整个表单撑破 —— 老板原话「无限拉升」。
   现在：最高 40vh（300px 封顶），超出滚动。 */
.pk-list{margin-top:6px;border:1px solid var(--line);border-radius:10px;overflow-y:auto;max-height:min(40vh,300px);background:var(--surface);-webkit-overflow-scrolling:touch}
.pk-item{display:flex;justify-content:space-between;gap:10px;align-items:center;
  padding:10px 12px;font-size:13.5px;border-bottom:1px solid var(--line);cursor:pointer}
.pk-item:last-child{border-bottom:none}
.pk-item:active{background:var(--soft)}
.pk-item > span > b{font-weight:600}
.pk-item em{font-style:normal;color:var(--txt3);font-size:11.5px;display:block;margin-top:2px}
.pk-item .tag{flex:0 0 auto;margin:0}
/* 「现场建档」那条要一眼看出来是**动作**而不是候选，否则客服会以为已经存在这个人了 */
.pk-item.is-new{color:var(--brand);font-weight:600}
.pk-item.is-new em{color:var(--txt3);font-weight:400}
/* 选中态回执：选完把名字写进输入框，下面这行小字负责「我到底选上没有」 */
.pk-picked{font-size:12px;color:var(--ok);margin-top:6px}
.pk-picked.warn{color:var(--warn)}
/* 客户选择器的空态与「还有多少没列出」（第四十轮）。
   空态必须给一句话：留白会让客服以为「系统里没这个客户」，
   于是转头去别处手打一个名字，错别字从那一刻开始污染统计。 */
.pk-empty{padding:10px 12px;font-size:12.5px;color:var(--txt3);line-height:1.55;
  border:1px dashed var(--line);border-radius:10px;background:var(--soft);margin-top:6px}
.pk-more{padding:9px 12px;font-size:12px;color:var(--txt3);background:var(--soft)}
/* 第四十一轮：候选行里的「微信名字 / 淘宝ID名字」。
   名字跟在微信号后面、用弱化色 —— 微信号是身份锚点（用来核对），
   名字是给人一眼认人的辅助信息，两者不能长得一样重。 */
.pk-item > span > i{font-style:normal;color:var(--txt2);font-weight:400;margin-left:6px}
.pk-item .pk-sub{display:block;font-size:11.5px;color:var(--txt3);margin-top:2px}

/* 星级：用字符而不是图标字体，零依赖且任何分辨率都清晰 */
.stars{display:flex;gap:6px;align-items:center}
.stars .star{font-size:27px;line-height:1;color:#D9DEE7;cursor:pointer;user-select:none;
  transition:transform .08s, color .12s;background:none;border:none;padding:0 1px}
.stars .star:active{transform:scale(.88)}
.stars .star.on{color:#F5A623}
.stars .star-lb{margin-left:8px;font-size:13px;color:var(--txt2);font-weight:600}

/* 评价卡片（打手详情 / 待评价清单共用一套观感） */
.rate-row{padding:10px 0;border-bottom:1px dashed var(--line)}
.rate-row:last-child{border-bottom:none}
.rate-head{display:flex;justify-content:space-between;align-items:baseline;gap:8px}
.rate-head b{font-size:13px}
.rate-stars{color:#F5A623;font-size:13px;letter-spacing:1px;flex:0 0 auto}
.rate-stars .off{color:#D9DEE7}
.rate-meta{display:block;color:var(--txt3);font-size:11.5px;margin-top:3px}
.rate-cmt{margin-top:5px;font-size:13px;color:var(--txt2);line-height:1.65}
/* 打手卡片上那一行评分摘要 */
.player-rate{display:block;margin-top:3px;font-size:12px;color:var(--txt2)}
.player-rate b{color:var(--txt)}
.player-rate.low b{color:var(--bad)}

/* ------------------------------------------------------------
 * 录单「系统建议的打手」（第三十八轮）
 * ------------------------------------------------------------
 * 全部走主题变量，暗色主题自动跟着变（本文件 33 行起的 [data-theme="dark"]）。
 * 一条建议 = 名字 + 档位徽章 + **为什么是他**；理由行是这套东西能被信任的前提，
 * 只给名字等于让客服凭感觉点。
 */
.pk-sug:empty{display:none}          /* 没有建议时不留空档（表单里的空白会让人以为没加载出来） */
.pk-sug{margin-bottom:8px}
.pk-sug-hd{font-size:11.5px;color:var(--txt2);margin-bottom:6px;line-height:1.5}
.pk-sug-hd em{font-style:normal;color:var(--txt3)}
.pk-sug-list{display:flex;flex-direction:column;gap:6px;max-height:min(36vh,240px);overflow-y:auto;-webkit-overflow-scrolling:touch}
.pk-sug-item{display:flex;align-items:center;gap:10px;padding:9px 10px;
  border:1px solid var(--line);border-radius:10px;background:var(--surface)}
.pk-sug-item:active{background:var(--soft)}
.pk-sug-item.is-on{border-color:var(--brand);background:var(--brand-soft)}
.pk-sug-main{min-width:0;flex:1}
.pk-sug-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.pk-sug-top b{font-weight:600}
.pk-sug-top .tag{margin:0}
.pk-sug-why{font-size:11.5px;color:var(--txt2);margin-top:3px;line-height:1.45}
.pk-sug-warn{font-size:11.5px;color:var(--warn);margin-top:3px;line-height:1.45}
.pk-sug-pick{flex:0 0 auto;font-size:12px;color:var(--brand);font-weight:600;
  padding:4px 10px;border-radius:999px;background:var(--brand-soft)}

/* ------------------------------------------------------------
 * 接待子账户业绩（第三十九轮）
 * ------------------------------------------------------------
 * 老板原话：「我是同一个店铺多个子账户，能否能够帮我解决这个问题」——
 * 追问后确认要的是「一个店几个号，分开看每个号接了多少单、让了多少钱」。
 *
 * 手机屏只有 390，所以这一块刻意做成**按店铺分组的竖列**而不是横向表格：
 * 一家店的几个号上下排在一起，小计放在组头上方，让价额用危险色单独一行。
 * 全部走主题变量，暗色主题自动跟随。
 */
.ap-card{display:block}
.ap-range{display:flex;align-items:center;gap:6px;margin:8px 0 10px;flex-wrap:wrap}
.ap-chip{font-size:12px;padding:4px 11px;border-radius:999px;background:var(--soft);
  color:var(--txt2);border:1px solid transparent;cursor:pointer}
.ap-chip.on{background:var(--brand-soft);color:var(--brand);border-color:var(--brand);font-weight:600}
.ap-scope{font-size:11.5px;color:var(--txt3);margin-left:auto}

.ap-shop{border:1px solid var(--line);border-radius:12px;padding:10px;margin-bottom:10px;background:var(--surface)}
.ap-shop-hd{display:flex;flex-direction:column;gap:2px;padding-bottom:8px;
  border-bottom:1px dashed var(--line);margin-bottom:8px}
.ap-shop-hd b{font-size:14px}
.ap-shop-hd .muted{font-size:11.5px;line-height:1.5}
.ap-note{font-size:11.5px;color:var(--warn)}

.ap-acc{padding:7px 0;border-bottom:1px solid var(--line)}
.ap-acc:last-child{border-bottom:0;padding-bottom:0}
.ap-acc-hd{display:flex;align-items:baseline;gap:8px}
.ap-acc-hd b{font-size:13.5px}
.ap-acc-hd .muted{font-size:11.5px}
.ap-acc-metrics{font-size:12.5px;color:var(--txt2);margin-top:3px;display:flex;
  align-items:baseline;gap:4px;flex-wrap:wrap}
.ap-acc-metrics b{color:var(--txt);font-size:13.5px}
.ap-sep{color:var(--txt3)}
.ap-acc-gap{font-size:12px;color:var(--txt2);margin-top:3px;display:flex;
  align-items:baseline;gap:8px;flex-wrap:wrap}
.ap-bad{color:var(--bad)}
.ap-ok{color:var(--ok)}
.ap-share{font-size:11px;color:var(--bad);background:var(--danger-bg);
  padding:1px 7px;border-radius:999px}

.ap-un{font-size:12px;color:var(--txt2);line-height:1.6;background:var(--soft2);
  border-radius:10px;padding:8px 10px;margin-top:2px}
.ap-foot{font-size:11px;line-height:1.6;margin-top:10px;color:var(--txt3)}
