:root{--bg:#0e1116;--panel:#161c26;--panel2:#1d2531;--border:#293447;--border2:#33415a;
 --txt:#d9e0ec;--muted:#8a96a9;--faint:#5c6575;--accent:#07c160;--accent-hi:#21d974;
 --blue:#3b82f6;--warn:#f5a623;--err:#f5564a;--sb:#0c0f15;--radius:6px;
 --panel3:#232d3c;
 --cur-bg:rgba(124,176,255,.07);  /* 任务计划表：「当前时段」行的淡蓝底（一点点就够，别用近白） */
 --cur-fg:#8fb4ea;                /* 「当前」徽标文字（深色主题下比 --blue 柔一档） */
 /* 聊天窗配色（跟随主题） */
 --cw-bg:#0e1116;--cw-other:#1d2531;--cw-me:rgba(7,193,96,.16);--cw-line:#2a3444;
 --cw-meline:rgba(7,193,96,.34);--cw-txt:#dbe2ee;--cw-tm:#5f6b7c;--cw-who:#8a96a9}
*{box-sizing:border-box}
html,body{height:100%}
body{margin:0;background:var(--bg);color:var(--txt);font:14px/1.6 "PingFang SC","Microsoft YaHei UI","Microsoft YaHei",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;overflow:hidden}
a{color:var(--blue);text-decoration:none}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-thumb{background:#2c3648;border-radius:6px}
.sidebar{position:fixed;left:0;top:0;bottom:0;width:264px;z-index:40;background:var(--sb);border-right:1px solid var(--border);display:flex;flex-direction:column;user-select:none}
.logo{width:36px;height:36px;border-radius:9px;flex:none;background:linear-gradient(135deg,#07c160,#059a4e);display:flex;align-items:center;justify-content:center;color:#fff;font-weight:800}
.nav{flex:1;overflow-y:auto;padding:2px 12px 16px}
.nav .grp{color:#9fb0c8;font-size:15.5px;font-weight:700;letter-spacing:.06em;margin:18px 10px 7px;padding-bottom:5px;border-bottom:1px solid rgba(255,255,255,.07)}
.nav a{display:flex;align-items:center;gap:11px;padding:8px 12px;margin:2px 0;border-radius:8px;color:#aeb8c9;font-size:14.5px;cursor:pointer}
.nav a:hover{background:rgba(255,255,255,.045);color:#e6ecf5}
.nav a.on{background:linear-gradient(90deg,rgba(7,193,96,.16),rgba(7,193,96,.03));color:#fff;font-weight:600}
.nav a .ic{width:22px;text-align:center;font-size:15.5px;opacity:.9}
.nav a .ph{margin-left:auto;font-size:11px;color:var(--faint);border:1px solid var(--border);border-radius:10px;padding:0 7px;white-space:nowrap}
.nav a .lvbadge{margin-left:auto;background:#f5564a;color:#fff;border:none;border-radius:10px;padding:0 6px;min-width:18px;height:18px;line-height:18px;text-align:center;font-size:11px;font-weight:600;flex:none}
.side-foot{padding:13px 20px;border-top:1px solid var(--border);color:var(--faint);font-size:12px;line-height:1.7}
/* 合规版「升级到发行版」提示条（core.js::buildUpgradeNotice；只有合规版会渲染，正常发行版/自用机不出现）。
   挂在侧栏底部 —— 桌面在 .mfoot 之前、手机上两个都进抽屉底部；样式只做一层浅色卡片，不抢主内容。 */
.upnotice{margin:10px 12px;padding:10px 12px;border:1px solid var(--border);border-radius:var(--radius);
  background:rgba(7,193,96,.08);color:var(--txt);font-size:12px;line-height:1.7;flex:none}
.upnotice b{color:var(--accent)}
.upnotice .btn{margin-top:8px;display:flex;width:100%;justify-content:center}
.main{margin-left:264px;height:100%;display:flex;flex-direction:column}
.topbar{height:44px;flex:none;display:flex;align-items:center;gap:10px;padding:0 16px;background:rgba(14,17,22,.86);border-bottom:1px solid var(--border)}
.topbar h2{margin:0;font-size:16px;font-weight:600}
.topbar .grow{flex:1}
.chip{display:inline-flex;align-items:center;gap:6px;padding:3px 11px;border-radius:20px;background:var(--panel2);border:1px solid var(--border);font-size:12px;color:var(--muted)}
.chip.click{cursor:pointer}                                  /* 可点徽标（顶栏运行模式）：给出可点的手感与悬停反馈 */
.chip.click:hover{border-color:var(--accent);color:var(--txt)}
.dot{width:8px;height:8px;border-radius:50%;background:var(--faint);flex:none}
.dot.green{background:var(--accent);box-shadow:0 0 8px var(--accent)}
.dot.red{background:var(--err)}
/* ⚠️ 上/下 padding 别放回 .content：它是滚动容器（overflow-y:auto），顶部的 padding 会在
 * 顶部留出一条「滚动区」，`table.list thead th{top:0}` 吸附时停在 padding 之下 → 表头与
 * 顶栏之间露出 16px 的缝（内容从缝里透出来）。顶部这一档间距改挂在 .page 上（见下），
 * 吸附才真正贴住内容区顶。 */
.content{flex:1;overflow-y:auto;padding:0 22px 30px}
/* 内容区（第三段）左对齐贴住侧栏：原来 margin:0 auto 在大屏上把页面居中，
 * 第二段侧栏与内容之间会空出一大块（用户 2026-10-19：「间距过大」）。 */
.page{display:none;max-width:1240px;margin:0;padding-top:16px}
.page.on{display:block;animation:fade .18s ease}
@keyframes fade{from{opacity:0;transform:translateY(3px)}to{opacity:1}}
button{border:0;cursor:pointer;font-family:inherit}
.btn{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:6px;background:var(--panel3,#232d3c);color:var(--txt);font-size:13px;border:1px solid var(--border2)}
.btn:hover{filter:brightness(1.15)}
.btn.primary{background:#07c160;color:#fff;border-color:transparent}
.btn.danger{background:rgba(245,86,74,.12);color:#ff8a80;border-color:rgba(245,86,74,.35)}
.btn.sm{padding:4px 9px;font-size:12px;border-radius:5px}
input,select,textarea{background:var(--panel2);border:1px solid var(--border2);color:var(--txt);border-radius:4px;padding:7px 10px;font-size:13px;outline:none;font-family:inherit}
input:focus,select:focus,textarea:focus{border-color:var(--accent)}
select option{background:var(--panel2)}
.sec-title{display:flex;align-items:center;gap:10px;margin:20px 0 12px;font-size:14px;font-weight:600}
.sec-title:first-child{margin-top:2px}
.sec-title .line{flex:1;height:1px;background:var(--border)}
.badge{display:inline-block;padding:2px 7px;border-radius:4px;font-size:11.5px}
.badge.green{background:rgba(7,193,96,.14);color:#3ce489}
.badge.gray{background:#263042;color:var(--muted)}
.badge.blue{background:rgba(59,130,246,.16);color:#7cb0ff}
.badge.bad{background:rgba(245,86,74,.16);color:#ff8b80}
table.list{width:100%;border-collapse:collapse;font-size:13px}
table.list th{color:var(--muted);font-weight:500;text-align:left;padding:8px 10px;background:var(--panel2);border-bottom:1px solid var(--border);font-size:12px;white-space:nowrap}
table.list td{padding:8px 10px;border-bottom:1px solid var(--border);vertical-align:top}
table.list tbody tr:hover td{background:rgba(127,127,127,.06)}
/* 表头吸附：页面滚动时表头贴住内容区**顶部**（payroll 的 #pgTable 自带列冻结，按 id 优先级不受影响）。
 * top:0 之所以能贴顶，是因为滚动容器 .content 的顶部 padding 已挪到 .page（见文件上方那条注释）；
 * 一旦 .content 又出现 padding-top，这里就会在顶栏与吸附表头之间露出缝。 */
@media (min-width:901px){table.list thead th{position:sticky;top:0;z-index:2}}
/* ===== 工资表（p_payroll）：列宽可拖 + 「编号」列冻结 + 表头下的筛选行 =====
 * 冻结用 sticky（表格在 `overflow:auto` 容器里横向滚动时不动），背景必须给
 * `var(--panel)`——面板背景色，浅深主题各一份；写死白/黑会在另一套主题下透字。
 * 拖拽手柄贴 th 右边缘（th 需 position:relative；冻结那个 th 用 sticky 同样成立）。*/
#pgTable{table-layout:fixed}
#pgTable th{position:relative;overflow:hidden;white-space:nowrap}
#pgTable th.pgfreeze,#pgTable td.pgfreeze{position:sticky;left:0;z-index:3;background:var(--panel)}
#pgTable th .pgrz{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize}
#pgTable th .pgrz:hover{background:var(--blue);opacity:.35}
#pgTable tr#pgFilterRow th{padding:3px 6px}
#pgTable tr#pgFilterRow input{width:100%;box-sizing:border-box;font-size:12px;padding:2px 4px}
/* ===== 任务计划表（拟人节奏页）：「当前时段」那一行的一点点淡底 =====
 * 用户 2026-09-16 点名「当前任务颜色太亮」——底色的原来是写死的 `#f1f8ff`（近白），
 * 已改为主题变量 `--cur-bg`（深浅主题各一份）。**别再写死近白色**。
 * 「自动/手动」的来源区分已按用户要求撤掉（有歧义），数据里仍留 src，只是不展示。 */
.panel{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:16px;margin-bottom:14px}
.panel.pad0{padding:0}
/* ===== 折叠区（设置/配置类区块的统一形态，见 core.js::foldHtml） =====
 * 用户 2026-09-21：「设置 / 编辑 / 新建内容」能用弹窗的用弹窗，不能弹窗的**默认折叠收起**，
 * 否则页面一进来全是表单，看起来太复杂。标题行可点，`.on`＝展开态（JS 切）。
 * `.fold-body` 用 !important 压掉块内元素自带的 display（如 flex），保证默认真的看不见。 */
.fold{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:10px 16px;margin-bottom:14px}
.fold-head{display:flex;align-items:center;gap:8px;cursor:pointer;user-select:none;font-size:14px;font-weight:600;padding:5px 0}
.fold-head:hover{color:var(--accent)}
.fold-head .fold-ar{color:#b2b2b2;font-size:11px;width:12px;flex:none}
.fold-head .fold-sum{font-weight:400;color:var(--faint);font-size:12px}
.fold-body{display:none!important;padding-top:8px}
.fold.on .fold-body{display:block!important}
.empty{color:var(--faint);text-align:center;padding:40px 12px;font-size:13px}
/* 桌面端不需要「☰ 菜单」（那是窄屏唤出侧栏抽屉用的） */
@media (min-width:901px){#btnMenu{display:none}}
.hint{color:var(--faint);font-size:12px}
.muted{color:var(--muted)}.small{font-size:12px}
.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:12px}
.card{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:13px 15px}
.card .k{color:var(--muted);font-size:12px}
.card .v{font-size:20px;font-weight:700;margin-top:5px}
.card .s{color:var(--faint);font-size:11.5px;margin-top:3px}
.toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}
.toolbar .grow{flex:1}   /* 工具栏里的占位符：把后面的徽标/按钮推到行尾（原先只对 .topbar/.fu-head 生效） */
/* ===== 传统分页条（线索池 / 收支表）=====
 * 每页固定条数、手动翻页，见 core.js::pagerHtml。行数上万时比"滚到底自动加载"好用：
 * 页面高度恒定、能直接跳到第 N 页。 */
.pager{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:6px;padding:10px 4px 2px}
.pager .pg-num,.pager .pg-nav,.pager .pg-go{padding:5px 10px;border-radius:7px;font-size:12.5px;line-height:1.35;background:var(--panel3);color:var(--txt);border:1px solid var(--border2)}
.pager .pg-nav{font-weight:600}
.pager .pg-num.on{background:#07c160;color:#fff;border-color:transparent;font-weight:700}
.pager .pg-nav:disabled{opacity:.4;cursor:default}
.pager .pg-nav:disabled:hover{filter:none}
.pager .pg-dot{color:var(--faint);padding:0 2px;font-size:12.5px}
.pager .pg-jump{display:inline-flex;align-items:center;gap:4px;margin-left:6px;color:var(--muted);font-size:12.5px}
.pager .pg-inp{width:58px;padding:4px 6px;text-align:center;font-size:12.5px}
.pager .pg-total{color:var(--faint);font-size:12.5px;margin-left:6px}
html.light .pager .pg-num,html.light .pager .pg-nav,html.light .pager .pg-go{background:#ececec;border-color:#dcdcdc;color:#191919}
.swrow{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid var(--border)}
.swrow:last-child{border-bottom:0}
.swrow .tt{flex:1}.swrow .tt b{font-size:13.5px}.swrow .tt span{display:block;color:var(--faint);font-size:12px}
/* 左列表 + 右明细的两栏布局（实时消息/聊天记录/联系人档案/备份…）：
 * 左栏＝可用宽度的 32%，但**不小于 340px**（原来是写死 340px；纯按百分比会在中等窗口下比原来更窄，
 * 列表里的名字被挤得折行、行变高 —— 2026-09-18 用户："宽度变窄 挤高"）。
 * 宽屏上跟着变宽（最多 32%），右栏 minmax(0,1fr) 保证长内容不会撑破列。 */
.wx-grid{display:grid;grid-template-columns:minmax(340px,32%) minmax(0,1fr);gap:14px;align-items:start}
.wx-grid.ma-stack{grid-template-columns:1fr}
/* 微信式：左列表/右详情都是「平铺」的（不套悬浮卡片），中间一条细分隔线 */
html.light .wx-grid>.panel{border:0;border-radius:0;background:transparent;margin-bottom:0}
@media (min-width:901px){html.light .wx-grid>.panel:first-child{border-right:1px solid #e7e7e7}}
html.light .chatwin{background:#f5f5f5}
html.light .cw-head,html.light .cw-old{background:#f5f5f5;border-bottom-color:#e7e7e7}
/* 列表**不再卡高度上限**（用户 2026-10-09：「列表也没满，底部也有空白」——PC 与手机同一个毛病）。
 * 原来卡 `min(70vh,760px)`：窗口一高，列表到 760px 就停，下面留一大片空白。
 * 现在数据多就整页滚动（滚到底由各页的 autoList / bindAutoMore 自动续加载），数据少则按内容自然高。 */
.wxlist{max-height:none;overflow-y:auto}
/* PC：右栏聊天窗（对话框）**吸附在视口内**（用户 2026-10-09：「pc端 消息 对话框 没固定 底部」）——
 * 列表去掉高度上限后 `.content` 会变得很长，右栏若原样留在顶部，一滚就跟着跑没了。
 * sticky 的滚动容器＝`.content`（PC 只 >900px 生效，手机另有 `.chatwin{position:fixed}` 的一套）。 */
@media (min-width:901px){
  .wx-grid>.panel:last-child:not(:first-child){position:sticky;top:0;align-self:start}
}
.wx-item{padding:9px 12px;cursor:pointer;border-bottom:0}
.wx-item.on{background:rgba(7,193,96,.1)}
.wx-item b{display:block;font-size:13.5px;overflow-wrap:break-word;word-break:break-word;min-width:0}
.wx-sub{display:flex;gap:8px;color:var(--faint);font-size:11.5px;overflow-wrap:break-word;word-break:break-word;min-width:0}
.wx-sum{color:var(--faint);font-size:12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.wx-item{position:relative}
/* 实时消息/联系人的行：微信通讯录样式（头像 40 + 名称 14 + 浅灰副行 12，行间无分隔线） */
.wx-li{display:flex;gap:10px;align-items:flex-start;padding:12px;min-height:64px}
.wx-li .wx-main{flex:1;min-width:0}
.wx-li .wx-av{width:40px;height:40px;font-size:16px}
.wx-li .wx-main{min-width:0}
/* 微信版式：名称左 / 时间右 / 预览在下 */
.wx-li .wx-r1{display:flex;align-items:baseline;gap:8px}
.wx-li .wx-r1 b{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:400;color:#191919}
.wx-li .wx-tm{flex:none;font-size:11.5px;color:#b2b2b2}
.wx-li .wx-sum{font-size:12px;color:#afaeae;margin-top:3px}
/* 联系人列表里的勾选框：平时隐藏（微信列表没有勾选框），悬停/已选才出现 */
.wx-li input[data-wxchk]{opacity:0;transition:opacity .12s}
.wx-li:hover input[data-wxchk],.wx-li.on input[data-wxchk],.wx-li input[data-wxchk]:checked{opacity:1}
/* 联系人资料卡（微信「联系人详情」观感）：大头像 + 名称 + 微信号 → 字段行 */
.pf-hd{display:flex;align-items:center;gap:14px;padding:2px 0 16px;border-bottom:1px solid #e7e7e7}
.pf-av{width:64px;height:64px;border-radius:6px;flex:none;overflow:hidden;background:#dcdcdc;
  display:flex;align-items:center;justify-content:center;color:#fff;font-size:26px;font-weight:500}
.pf-av img{width:100%;height:100%;object-fit:cover;border-radius:6px}
.pf-nm{flex:1;min-width:0}
.pf-nm b{display:block;font-size:18px;font-weight:600;color:#191919;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pf-nm span{display:block;font-size:13px;color:#7f7f7f;margin-top:3px}
.pf-rows{margin-top:2px}
.pf-row{display:flex;gap:14px;padding:9px 2px;border-bottom:1px solid #f0f0f0;font-size:14px}
.pf-row:last-child{border-bottom:0}
.pf-row .k{width:88px;flex:none;color:#7f7f7f}
.pf-row .v{flex:1;min-width:0;color:#191919;word-break:break-word}
.unread{position:absolute;right:12px;top:12px;min-width:18px;height:18px;padding:0 5px;border-radius:10px;background:#f5564a;color:#fff;font-size:10.5px;line-height:18px;text-align:center;flex:none;font-weight:600}
.chatbox{display:flex;flex-direction:column;gap:10px;max-height:56vh;overflow-y:auto}
/* 聊天窗高：跟着视口走（70vh，上限 760px）；下限同样按视口夹一下，
 * 否则矮屏（如横屏 400px 高）里写死的 430px 会把页面顶出滚动条。 */
.chatwin{display:flex;flex-direction:column;height:min(70vh,760px);min-height:min(430px,66vh);background:var(--panel)}
/* 「返回」按钮只在**手机进详情**后出现：桌面也要显式藏掉——原来只在 ≤900px 的媒体块里
 * 写了 `display:none`，桌面那行没被覆盖 → PC 上会多出一个「‹ 返回」（2026-10-09 修）。 */
.m-back,.m-backbar{display:none}
.cw-head{display:flex;align-items:center;gap:10px;padding:10px 16px;border-bottom:1px solid #e7e7e7;flex:none;background:#f5f5f5}
.cw-head b{font-size:15px;color:var(--txt)}
.cw-head .hint{color:var(--faint)}
.cw-old{flex:none;text-align:center;padding:6px 0 2px;border-bottom:1px solid var(--border);background:var(--panel)}
.cw-body{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:12px;padding:16px 20px;background:var(--cw-bg)}
.cw-empty{color:var(--faint);text-align:center;padding:60px 10px;font-size:12.5px}
.cw-row{display:flex;gap:9px;align-items:flex-start;max-width:86%;align-self:flex-start}
.cw-row.me{flex-direction:row-reverse;align-self:flex-end}
.cw-row.cw-sys{align-self:center;max-width:86%}
.cw-row .cw-col{display:flex;flex-direction:column;align-items:flex-start;min-width:0;max-width:100%}
.cw-row.me .cw-col{align-items:flex-end}
.cw-row.cw-sys .cw-col{align-items:center}
.cw-row .who{font-size:11.5px;color:var(--cw-who);margin:0 0 2px 2px}
.cw-row .tx{position:relative;max-width:100%;background:var(--cw-other);border:0;border-radius:4px;
  padding:8px 12px;word-break:break-word;white-space:pre-wrap;font-size:13.5px;line-height:1.6;color:var(--cw-txt)}
/* 微信式小尾巴 */
.cw-row .tx::before{content:'';position:absolute;left:-5px;top:11px;width:0;height:0;
  border:5px solid transparent;border-right-color:var(--cw-other);border-left-width:0}
.cw-row.me .tx{background:var(--cw-me)}
.cw-row.me .tx::before{left:auto;right:-5px;border-right-color:transparent;
  border-left-color:var(--cw-me);border-left-width:5px;border-right-width:0}
.cw-row.cw-sys .tx::before{display:none}
.cw-row .tm{font-size:10.5px;color:var(--cw-tm);margin:3px 4px 0}
/* 微信式占位头像（无头像图时用） */
.wx-av{position:relative;width:36px;height:36px;border-radius:4px;flex:none;display:flex;align-items:center;
  justify-content:center;color:#fff;font-size:15px;font-weight:500;overflow:hidden;user-select:none}
/* 真头像（core.js::msgAva 的 <img>）**必须绝对定位**：
 * `.wx-av` 是 flex 行，若让 img 参与布局，它会跟"名称首字"并排、被挤窄后再被 overflow 裁掉
 * ——用户 2026-10-09 报的「微信列表头像显示不全」就是这个。
 * 铺满 + object-fit:cover ＝ 微信那种方角裁切；图挂了/加载失败 onerror 隐掉 img，
 * 底下的首字色块自然露出来兜底（所以离线、URL 过期也不开天窗）。 */
.wx-av img{position:absolute;left:0;top:0;right:0;bottom:0;width:100%;height:100%;
  object-fit:cover;border-radius:inherit}
/* 聊天气泡旁的小一档头像（比列表行紧凑；只加修饰类，不动 .wx-av 默认尺寸） */
.wx-av.av-s{width:30px;height:30px;font-size:12px}
.cw-vtag{display:inline-block;font-size:10.5px;line-height:1;color:var(--cw-tm);background:rgba(127,127,127,.13);border-radius:3px;padding:2.5px 5px;margin:0 7px 2px 0;vertical-align:1px;white-space:nowrap}
/* 聊天窗底部有**两条**，按页面二选一（分派唯一在 p_data.js::cwOpen / cwLivePage）：
 * ① `.cw-exp`   ＝聊天记录等页的「时间范围 + 导出当前会话」；
 * ② `.cw-input` ＝实时消息页的「对话框」（人工回复 + 统一发送闸 + 标为已读）。
 * ⚠️ 2026-09-25 曾把 ② 整块删掉只留 ①；2026-09-28 用户口径恢复：
 * 「实时消息 肯定是要对话 回复互动的啊 不是聊天记录里面的导出」。 */
.cw-exp{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:10px 14px;border-top:1px solid var(--border);background:var(--panel);flex:none}
/* 聊天记录页：导出入住右上角「导出聊天记录」弹层（.acc-dd-panel）——去掉底部条的顶边线、
 * 改成竖排紧凑排布；联系人档案页仍走上面的底部条形态（分派在 p_data.js::cwExportBar）。 */
.cw-exp.cw-exp-dd{border-top:0;padding:0;background:transparent;flex-direction:column;align-items:stretch;gap:7px}
.cw-exp.cw-exp-dd .cw-exp-row{display:flex;gap:6px;align-items:center}
.cw-exp.cw-exp-dd input[type=date]{flex:1;min-width:0}
.cw-exp.cw-exp-dd #cwExpGo{justify-content:center}
.cw-exp input[type=date]{background:var(--panel2);border:1px solid var(--border2);border-radius:6px;color:var(--txt);padding:4px 6px;font-size:13px}
.cw-exp .btn.ghost{font-size:11.5px;padding:1px 9px;height:auto;color:var(--muted);border-color:var(--border2)}
.cw-exp .btn.ghost:disabled{opacity:.6;cursor:wait}
/* 实时消息页底部输入栏：微信观感（白底、无边框输入区、蓝字工具、绿「发送」） */
.cw-input{display:flex;gap:8px;align-items:flex-end;padding:8px 12px 10px;
  border-top:1px solid #e7e7e7;background:#fff;flex:none}
.cw-input textarea{flex:1;resize:none;min-height:56px;max-height:180px;line-height:1.6;
  overflow-y:auto;border:0;background:transparent;color:#191919;padding:2px;font-size:14px}
.cw-input textarea:focus{border:0;outline:0}
.cw-input .cw-act{display:flex;gap:8px;flex:none}
.cw-input .cw-wrap{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}
.cw-input .cw-tool{display:flex;align-items:center;gap:2px;min-height:22px}
.cw-input .cw-tool .btn{font-size:12px;padding:1px 7px;height:auto;color:#576b95;
  background:transparent;border-color:transparent}
.cw-input .cw-tool .btn:hover{background:#efefef;filter:none}
.cw-input .cw-tool .btn:disabled{opacity:.5}
.cw-input .cw-act .btn{font-size:13px;padding:5px 16px;border-radius:4px}
.cw-input .cw-wrap textarea{width:100%}
/* 压掉全局 input/textarea 的浅色底：输入区要「无框、与白底融为一体」 */
html.light .cw-input textarea{background:transparent}
.bub{max-width:80%;align-self:flex-start}
.bub .who{font-size:11.5px;color:var(--faint)}
.bub .tx{background:var(--panel2);border:1px solid var(--border);border-radius:10px;padding:8px 11px}
.bub .tm{font-size:10.5px;color:var(--faint)}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.row2>*{min-width:0}   /* 同 .wx-grid>*：grid 子项默认 min-width:auto，长内容（select/表格）会撑破列宽 */
.fld{margin-bottom:11px}.fld label{display:block;color:var(--muted);font-size:12px;margin-bottom:5px}
.fld input,.fld select,.fld textarea{width:100%}
/* 跟进记录时间线（手工记录可编辑/删除；AI 分析留痕不可删） */
.fu-list{display:flex;flex-direction:column;gap:8px;margin-top:6px}
.fu-row{border:1px solid var(--border);border-radius:8px;padding:8px 10px;background:var(--panel2)}
.fu-row.ai{border-style:dashed;background:transparent}
.fu-head{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--faint)}
.fu-head a{color:var(--muted);text-decoration:none}
.fu-head a:hover{color:var(--txt)}
.fu-head .grow{flex:1}
.fu-txt{margin-top:3px;font-size:13px;white-space:pre-wrap;word-break:break-word}
.fu-row.ai .fu-txt{color:var(--muted);font-size:12.5px;margin-top:0}
.fu-input{width:100%;min-height:72px;resize:vertical}   /* 添加/编辑跟进共用同一输入框样式 */
.fu-row.editing{padding:0;border:0;background:transparent}   /* 编辑态去掉卡片内边距/边框，输入框与「添加跟进」等宽 */
/* 提示（保存/提交后的「已保存」等）：z-index 必须高于弹框遮罩(.ma-mask 120)与快速跳转(.qk 130)，
 * 否则弹框里保存时提示被压在遮罩下面、看着像没反应（2026-09-16 用户反馈"右下角不明显"）。
 * 默认落点仍是右下角；带 .anchored 时由 core.js::toastAnchor() 定位到刚点的按钮下面。 */
.toast{position:fixed;right:20px;bottom:18px;background:var(--panel3,#232d3c);color:var(--txt);border:1px solid var(--border2);border-radius:10px;padding:9px 14px;z-index:140;box-shadow:0 8px 30px rgba(0,0,0,.4)}
.toast.anchored{right:auto;bottom:auto;max-width:min(420px,86vw)}
.toast.err{border-color:rgba(245,86,74,.5);color:#ff8a80}
.toast.warn{border-color:rgba(255,209,128,.5);color:#ffd180}   /* 提醒档：比普通提示醒目、比错误轻 */
/* 登录遮罩 */
.mask{position:fixed;inset:0;background:rgba(5,7,10,.66);z-index:80;display:none;align-items:center;justify-content:center}
.mask.on{display:flex}
.login{width:min(360px,92vw);background:var(--panel);border:1px solid var(--border2);border-radius:8px;padding:26px 28px}
.login h2{margin:0 0 16px;font-size:18px}
.login .fld{margin-bottom:12px}
/* ===== 用户中心登录页（与 C7 用户中心同款） =====
 * 登录页**固定浅色**（不跟主题走），保证各端视觉一致；黑底遮罩改为浅灰底。 */
#gate.mask{background:#F5F6F8}
html.light #gate.mask{background:#F5F6F8}
/* 登录卡连同注册/找回视图可能比屏幕高：整层可滚，卡片在空间足够时仍居中 */
#gate.mask{align-items:flex-start;overflow:auto;padding:24px 12px}
#gate .pa-card{margin:auto}
#gate .pa-card{width:100%;max-width:400px;background:#fff;border:1px solid #e7e7e7;
  border-radius:8px;padding:32px 28px;box-shadow:0 12px 40px rgba(16,24,40,.08);color:#191919;
  font:400 14px/20px "SF Pro Text","PingFang SC",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}
#gate .pa-card *{box-sizing:border-box}
#gate .pa-brand{display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;margin-bottom:20px}
#gate .pa-logo{width:44px;height:44px;border-radius:8px;display:flex;align-items:center;justify-content:center;
  font-size:20px;font-weight:700;color:#fff;background:#07c160}
#gate .pa-title{font-size:18px;font-weight:600}
#gate .pa-sub{font-size:13px;color:#7f7f7f}
#gate .pa-seg{display:grid;grid-template-columns:1fr 1fr;gap:4px;background:#f1f2f4;border-radius:6px;padding:4px;margin-bottom:18px}
#gate .pa-seg button{height:34px;border:0;border-radius:4px;background:transparent;color:#7f7f7f;font:inherit;font-size:13.5px;cursor:pointer}
#gate .pa-seg button[aria-selected=true]{background:#fff;color:#191919;font-weight:600;box-shadow:0 1px 2px rgba(16,24,40,.08)}
#gate .pa-field{display:block;margin-bottom:14px}
#gate .pa-field>span{display:block;font-size:12.5px;color:#7f7f7f;margin-bottom:6px}
#gate .pa-field input{width:100%;height:44px;padding:0 13px;border:1px solid #dcdcdc;border-radius:6px;
  background:#fff;color:#191919;font:inherit}
#gate .pa-field input:focus{outline:none;border-color:#07c160;box-shadow:0 0 0 3px rgba(7,193,96,.16)}
#gate .pa-btn{display:flex;align-items:center;justify-content:center;width:100%;height:44px;border:0;border-radius:6px;
  background:#07c160;color:#fff;font:inherit;font-weight:600;cursor:pointer}
#gate .pa-btn:disabled{opacity:.6;cursor:not-allowed}
/* 图形验证码（登录失败 ≥3 次才出现）：点一下换一张 */
#gate .cap-row{display:flex;gap:8px}
#gate .cap-row input{flex:1;min-width:0}
#gate .cap-img{flex:none;height:44px;width:auto;border:1px solid rgba(22,24,29,.1);border-radius:10px;
  background:#fff;cursor:pointer;user-select:none}
/* 「获取验证码」：与输入框同高的次要按钮（验证码登录那条路） */
#gate .pa-smsbtn{flex:none;height:44px;padding:0 14px;border:1px solid rgba(22,24,29,.1);border-radius:10px;
  background:#F1F2F4;color:#16181D;font:inherit;font-size:13px;white-space:nowrap;cursor:pointer}
#gate .pa-smsbtn:disabled{opacity:.6;cursor:not-allowed}
#gate .pa-row{display:flex;justify-content:flex-end;margin:-4px 0 14px}
#gate .pa-link{background:none;border:0;padding:0;color:#04381F;font:inherit;font-size:13px;cursor:pointer;text-decoration:none}
#gate .pa-link:hover{text-decoration:underline}
#gate .pa-alt{margin-top:16px;text-align:center;font-size:13px;color:#6B7280}
#gate .pa-hint{font-size:12px;line-height:1.6;color:#7f7f7f;margin:-2px 0 10px}
#gate .pa-legal{margin-top:12px;text-align:center;font-size:11.5px;line-height:1.7;color:#6B7280}
#gate .pa-agree{margin-top:12px;display:flex;align-items:center;justify-content:center;gap:6px;font-size:11.5px;line-height:1.7;color:#6B7280;cursor:pointer}
#gate .pa-agree input{margin:0;flex:0 0 auto;cursor:pointer}
#gate .pa-err{color:#E5484D;font-size:12.5px;min-height:16px;margin-bottom:8px}
#gate .hide{display:none !important}
/* 主体底色跟随主题变量；微信 PC 里「列表栏 #ededed / 内容区 #f5f5f5」两栏有色差 */
.main{background:#f5f5f5}
.main .content{background:#f5f5f5}
/* ===== 浅色主题（html.light，配色参考微信浅色） =====
 * class 挂在 <html> 上（单一主题，见 main.js）：CSS 变量因此能穿透到
 * .main 之外的节点（侧栏 / 登录遮罩 / Toast），不会出现"主区浅色、侧栏还是黑的"。
 * 色板对齐微信：主底 #ededed、面板 #fff、分隔 #e7e7e7、文字 #191919/#7f7f7f/#b2b2b2、
 * 品牌绿 #07c160、链接蓝 #576b95、警示 #fa5151 / #fa9d3b，气泡浅色下自带绿 #95ec69。 */
html.light{
  --bg:#ededed; --panel:#ffffff; --panel2:#f7f7f7; --panel3:#ececec;
  --border:#e7e7e7; --border2:#dcdcdc; --txt:#191919; --muted:#7f7f7f; --faint:#b2b2b2;
  --accent:#07c160; --accent-hi:#06ad56; --blue:#576b95; --warn:#fa9d3b; --err:#fa5151;
  --sb:#ededed;
  --cur-bg:rgba(87,107,149,.06);   /* 任务计划表：「当前时段」行的淡蓝底（浅色主题同样只一点点） */
  --cur-fg:#576b95;                /* 「当前」徽标文字（对齐微信链接蓝，不刺眼） */
  --cw-bg:#f5f5f5; --cw-other:#ffffff; --cw-me:#95ec69; --cw-line:#e7e7e7;
  --cw-meline:#7fdd57; --cw-txt:#191919; --cw-tm:#b2b2b2; --cw-who:#7f7f7f;
  color:var(--txt);background:var(--bg)
}
html.light ::-webkit-scrollbar-thumb{background:#cfcfcf}
/* 侧栏 */
html.light .side-foot{color:#9a9a9a}
html.light .nav .grp{color:#7f7f7f;border-bottom-color:transparent}
html.light .nav a{color:#191919}
html.light .nav a:hover{background:#e3e3e3;color:#191919}
html.light .nav a.on{background:#d9d9d9;color:#191919;font-weight:500}
/* 顶栏 / 控件 */
html.light .topbar{background:#f5f5f5;border-bottom-color:#e7e7e7}
html.light .topbar h2{color:#191919;font-size:15px;font-weight:600}
html.light .chip{background:#fff;border-color:#e7e7e7;color:#7f7f7f}
html.light .btn{background:#ececec;color:#191919;border-color:#dcdcdc}
html.light .btn:hover{filter:none;background:#e0e0e0}
html.light .btn.primary{background:#07c160;color:#fff;border-color:transparent}
html.light .btn.primary:hover{filter:none;background:#06ad56}
/* 顶栏上的按钮/徽标走微信式「无边框」：像微信顶栏那样干净 */
html.light .topbar .btn{background:transparent;border-color:transparent;color:#4c4c4c}
html.light .topbar .btn:hover{filter:none;background:#e3e3e3;color:#191919}
html.light .topbar .chip{background:transparent;border-color:transparent}
html.light .btn.danger{background:rgba(250,81,81,.08);color:#d93a3a;border-color:rgba(250,81,81,.35)}
html.light input,html.light select,html.light textarea{background:#fff;border-color:#dcdcdc;color:#191919}
html.light select option{background:#fff;color:#191919}
html.light input::placeholder,html.light textarea::placeholder{color:#b2b2b2}
/* 列表 / 卡片 / 徽标 */
html.light table.list th{color:#7f7f7f;background:#f7f7f7;border-bottom-color:#e7e7e7}
html.light table.list td{border-bottom-color:#f0f0f0}
html.light .card{background:#fff;border-color:#e7e7e7}
html.light .badge.gray{background:#ececec;color:#7f7f7f}
html.light .badge.green{background:rgba(7,193,96,.12);color:#059a4e}
html.light .badge.blue{background:rgba(87,107,149,.12);color:#4a6180}
html.light .badge.bad{background:rgba(245,86,74,.12);color:#d9453a}
html.light .wx-item{border-bottom-color:#e0e0e0}
html.light .wx-item.on{background:#d9d9d9}
html.light .swrow{border-bottom-color:#efefef}
html.light .sec-title .line{background:#e7e7e7}
html.light .fa-fix b{color:#b26a00}
/* 遮罩 / 弹层（登录门、Toast 在 .main 之外，靠变量 + 这几条一起生效） */
html.light .mask{background:rgba(0,0,0,.32)}
html.light .toast{background:#fff;border-color:#e0e0e0;color:#191919;box-shadow:0 8px 30px rgba(0,0,0,.14)}
html.light .toast.err{color:#d93a3a;border-color:rgba(250,81,81,.45)}
html.light .toast.warn{color:#b26a00;border-color:rgba(255,178,0,.5)}
html.light .gate-msg{color:#d93a3a}
html.light .mom-pop,html.light .ma-dlg{box-shadow:0 12px 44px rgba(0,0,0,.18)}
/* 页面内联样式里写死的深色值：浅色下统一纠偏（避免逐个页面改 JS）。
 * !important 可压过 style 属性里的同名声明（页面里没有内联 !important）。 */
html.light [style*="#ff8a80"]{color:#d93a3a!important}
html.light [style*="rgba(245,86,74,.16)"]{background:rgba(250,81,81,.10)!important}
html.light [style*="#ffd180"]{color:#b26a00!important}
html.light [style*="rgba(255,209,128,.15)"]{background:rgba(250,157,59,.16)!important}
html.light [style*="#38d399"]{color:#059a4e!important}
html.light [style*="rgba(56,211,153,.16)"]{background:rgba(7,193,96,.12)!important}
html.light [style*="#f76707"]{color:#d9660a!important}
html.light [style*="#4dabf7"]{color:#1971c2!important}
html.light [style*="#69db7c"]{color:#2f9e44!important}
html.light [style*="#ff6b6b"]{color:#e03131!important}
html.light [style*="#d7dce6"]{color:#191919!important}
html.light [style*="background:#1b2230"]{background:#fff!important;border-color:#dcdcdc!important}
/* ===== 朋友圈归档/相册（mom-*） ===== */
.mom-feed{max-width:820px;margin:0 auto}
.mom-card{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:13px 16px 14px;margin-bottom:11px;cursor:pointer;transition:border-color .15s}
.mom-card:hover{border-color:var(--border2)}
.mom-hd{display:flex;align-items:center;gap:8px;color:var(--muted);font-size:12px;margin-bottom:5px}
.mom-hd .mom-src{margin-left:auto;color:var(--faint);font-size:11px}
.mom-hd-t{font-weight:600;color:var(--txt)}
.mom-txt{white-space:pre-wrap;word-break:break-word;font-size:13.5px;line-height:1.75;margin:2px 0 9px;color:var(--txt)}
.mom-txt.nomedia{margin-bottom:0}
.mom-note{color:var(--faint);font-size:12.5px;padding:4px 0 2px}
.mom-imgs{display:grid;gap:5px;margin:2px 0}
.mom-imgs.s1{grid-template-columns:minmax(0,480px);justify-content:start}
.mom-imgs.g2{grid-template-columns:repeat(2,minmax(0,1fr));max-width:560px}
.mom-imgs.g3{grid-template-columns:repeat(3,minmax(0,1fr));max-width:560px}
.mom-imgs.g2 .mom-cell,.mom-imgs.g3 .mom-cell{aspect-ratio:1/1}
.mom-cell{overflow:hidden;border-radius:8px;background:var(--panel2);min-height:56px}
.mom-cell img,.mom-tile img{width:100%;height:100%;object-fit:cover;display:block}
.mom-imgs.s1 .mom-cell{aspect-ratio:auto;min-height:0;background:#000}
.mom-imgs.s1 .mom-cell img{height:auto;max-height:620px;object-fit:contain}
.mom-miss{display:flex;align-items:center;justify-content:center;min-height:70px;color:var(--faint);font-size:12px;background:var(--panel2);border:1px dashed var(--border2);border-radius:8px;text-align:center;padding:10px}
.mom-video{width:100%;max-width:620px;border-radius:10px;background:#000;margin:2px 0 6px;display:block}
.mom-video.big{max-width:100%}
.mom-album{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px;padding:8px 14px 14px}
.mom-tile{position:relative;aspect-ratio:1/1;overflow:hidden;border-radius:10px;cursor:pointer;background:var(--panel2);border:1px solid var(--border)}
.mom-tile:hover{border-color:var(--accent)}
.mom-tile-ov{position:absolute;right:4px;bottom:4px;background:rgba(10,12,16,.55);color:#fff;font-size:10.5px;padding:0 6px;border-radius:8px}
.mom-mask{position:fixed;inset:0;background:rgba(4,6,10,.72);z-index:80;display:none;align-items:center;justify-content:center;padding:22px}
.mom-mask.on{display:flex}
.mom-pop{width:min(860px,96vw);max-height:90vh;overflow:auto;background:var(--panel);border:1px solid var(--border2);border-radius:14px;padding:16px 20px 20px;box-shadow:0 12px 48px rgba(0,0,0,.5)}
.mom-big{margin:6px 0;text-align:center}
.mom-big img{width:auto;max-width:100%;max-height:70vh;object-fit:contain;display:block;margin:0 auto;border-radius:10px;background:#000}
.mom-hd .growx{flex:1}

/* ---------- 聊天文件分类：分组图板 + 拖拽 ---------- */
.ma-groups{display:flex;flex-direction:column;gap:12px;padding:6px 14px 14px}
.ma-group{border:1px solid var(--border);border-radius:10px;background:var(--panel2);padding:8px 10px}
.ma-group.drop-over{outline:2px dashed var(--accent);background:rgba(7,193,96,.05)}
.ma-gh{display:flex;align-items:center;gap:8px;margin-bottom:7px}
.ma-gh b{font-size:13.5px}
.ma-gh .growx{flex:1}
.ma-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:8px}
.ma-cell{position:relative;aspect-ratio:1/1;border-radius:8px;overflow:hidden;background:#000;
  border:1px solid var(--border2);cursor:grab;user-select:none}
.ma-cell img,.ma-cell video{width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}
.ma-cell.badimg{background:var(--panel3,#232d3c)}
.ma-cell.dragging{opacity:.35;border-color:var(--accent)}
.ma-ov{position:absolute;left:0;right:0;bottom:0;padding:2px 6px;font-size:10.5px;color:#fff;
  background:linear-gradient(transparent,rgba(0,0,0,.72));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ma-cell.ma-fcell{background:var(--panel3,#232d3c);display:flex;align-items:center;justify-content:center;
  aspect-ratio:auto;min-height:64px;padding:6px;font-size:11.5px;color:var(--muted);text-align:center}
.ma-cell.ma-fcell span{word-break:break-all}
.ma-empty{color:var(--faint);font-size:12px;padding:8px 2px}
.ma-group .badge.gray{background:#2a3547}
.ma-gh b[data-rn]{cursor:pointer;border-bottom:1px dashed transparent}
.ma-gh b[data-rn]:hover{border-bottom-color:var(--accent);color:var(--accent)}
/* 员工分组：组名是"进权限子页"的入口（可点 + 悬停变色，与 .ma-gh b[data-rn] 同一手感）
 * 用 <button class="lnk"> 而不是 <b>：按钮可聚焦、能进无障碍树，自动化/键盘都点得中
 * （2026-09-21 实测：窄单元格里的行内 <b> 按坐标点击会落到 <td> 上）。 */
.lnk{cursor:pointer;border-bottom:1px dashed transparent;background:none;padding:0;
  font:inherit;color:inherit;text-align:left;border-radius:0}
.lnk:hover{border-bottom-color:var(--accent);color:var(--accent)}
/* 行内点入口的「整块命中区」：给 `<a>` 加上它，**只改命中区、颜色不变**
 * （与 `.lnk` 的区别就在这里：`.lnk` 是换成 button、颜色变 `inherit`，
 *  只适合"颜色本身没承载语义"的场合）。
 * 为什么需要：行内元素的包围盒含折行后的两端与**两行之间的空隙**，按坐标点几何中心会落到
 * 父级 `<td>` 上（2026-09-26 实测：折成两行的台账标题点中心打不开详情）；`inline-block`
 * 的盒子是整块矩形 → 命中自身（同年 09-26 在真页面复验：中心点从命中 TD 变成命中该 `<a>`）。
 * ⚠️ 唯一的副作用：`border-bottom` 从"每个行盒各画一条"变成"盒子底部一条"，折行时看得出
 *    差别（所以自带虚线样式的入口用它以后，下划线会变成整块一条）。 */
.lnk-blk{display:inline-block}

/* 会话抽取区：底部拖拽调整高度 */
.ma-resize{height:9px;display:flex;align-items:center;justify-content:center;cursor:ns-resize;
  color:var(--faint);user-select:none;border-top:1px dashed var(--border)}
.ma-resize:hover{color:var(--accent);border-top-color:var(--accent);background:rgba(7,193,96,.05)}
.ma-resize::after{content:'⋮⋮';font-size:11px;line-height:1;letter-spacing:2px}
body.ma-drag,body.ma-drag *{cursor:ns-resize!important;user-select:none!important}


/* 自绘对话框（分组名添加/修改/删除） */
.ma-mask{position:fixed;inset:0;background:rgba(4,6,10,.62);z-index:120;display:flex;align-items:center;justify-content:center;padding:20px}
.ma-dlg{width:min(420px,92vw);background:var(--panel);border:1px solid var(--border2);border-radius:12px;padding:16px 18px;box-shadow:0 12px 44px rgba(0,0,0,.5)}
.ma-dlg h4{margin:0 0 12px;font-size:14px;font-weight:600}
.ma-dlg input{width:100%;box-sizing:border-box}
/* 弹框里可能整段搬进多选清单（如角色绑定的群/私聊勾选）：勾选框不能跟着拉满宽 */
.ma-dlg input[type=checkbox],.ma-dlg input[type=radio]{width:auto;box-sizing:content-box}
.ma-dlg-ft{display:flex;justify-content:flex-end;gap:8px;margin-top:14px;flex-wrap:wrap}
/* 表单弹框（dlgForm）正文：内容多时只滚正文，标题与底部按钮始终可见 */
.dlg-body{max-height:min(64vh,560px);overflow:auto;padding-right:2px}
.dlg-body .fld:last-child{margin-bottom:0}

/* ============ 右侧抽屉（从右往左滑出） ============
 * 用途：**就地展开**看一个人的「联系人档案」（线索列表点「线索资料」列昵称）——
 * 用户 2026-10-08：「从右往左展开感觉更丝滑，来客客资中心 那样」。
 * 与 `.ma-dlg`（居中弹窗）并列：这里是**侧滑面板**，宽度更大、更适合看整份档案。
 * 打开/关闭：`p_people.js::ppSideOpen()` / 返回的 close()（Esc、点遮罩、点「关闭」都能关）。 */
.sp-mask{position:fixed;inset:0;background:rgba(4,6,10,.42);z-index:118;opacity:0;transition:opacity .2s ease}
.sp-mask.on{opacity:1}
.sp-pane{position:fixed;top:0;right:0;bottom:0;width:min(760px,94vw);background:var(--panel);
  border-left:1px solid var(--border2);box-shadow:-14px 0 44px rgba(0,0,0,.45);
  transform:translateX(100%);transition:transform .26s cubic-bezier(.22,.61,.36,1);
  display:flex;flex-direction:column;z-index:119}
.sp-pane.on{transform:translateX(0)}
.sp-head{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--border)}
.sp-head b{font-size:14px;font-weight:600}
.sp-body{flex:1;overflow:auto;padding:12px 16px 18px}
@media (max-width:900px){.sp-pane{width:100vw}}

/* 角色管理页 */
.rol-card{border:1px solid var(--border);background:var(--panel);border-radius:10px;margin-bottom:8px}
.rol-card.editing{outline:1px solid rgba(7,193,96,.55)}
.rol-card-hd{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;flex-wrap:wrap}
.rol-t{min-width:0;flex:1}
.rol-t b{cursor:pointer;font-size:13.5px;color:var(--txt)}
.rol-t b:hover{color:var(--accent)}
.rol-chips{display:flex;gap:6px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.rol-binds{border-top:1px solid var(--border);padding:6px 12px 10px;background:var(--panel2,#1a2130)}
.rol-line{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:4px 0}
.rol-line select{flex:1;min-width:130px}
.rol-bitem{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:5px 0;border-top:1px dashed var(--border)}
.rol-bitem .ellip{flex:1}
.rol-bitem b{min-width:0;flex:1}
.ellip{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 话术库（角色绑定 + 分组） */
.ph-roles-cell{display:flex;flex-wrap:wrap;gap:4px;align-items:center}
.ph-roles-cell .badge{cursor:pointer;user-select:none}
.ph-roles-cell .badge:hover{filter:brightness(1.15)}
.ph-roles-cell select{flex:none}

/* 朋友圈归档：失效图片补齐指引（fa-fix） */
.fa-fix{margin:0 0 12px;padding:10px 13px 11px;border:1px dashed var(--border2);border-left:3px solid #f59e0b;background:var(--panel2);border-radius:10px;font-size:12.5px;line-height:1.85;color:var(--txt)}
.fa-fix b{color:#f0b45a}
.fa-fix-st{font-weight:600;margin-top:7px}
.fa-fix-ol{margin:2px 0 0 20px;padding:0}
.fa-fix-ol li{margin:2px 0}
.fa-fix-n{color:var(--muted);font-size:12px;margin-top:6px}

/* 登录遮罩（登录门：局域网/会话失效） */
.gate-msg{color:#ff8a80;font-size:12.5px;line-height:1.6;min-height:0;margin:2px 0 10px;display:none}
.gate-msg.on{display:block}
.mask .login h2{margin:0 0 14px}
body.gated{overflow:hidden}
body.gated .sidebar,body.gated .main{display:none}
#gate #gateGo:disabled{opacity:.55;cursor:default}

/* ===== Ctrl+K 快速跳转（弹层；配色跟随深浅主题变量） ===== */
.qk{position:fixed;inset:0;z-index:130;background:rgba(5,7,10,.5);display:none;
  align-items:flex-start;justify-content:center;padding:12vh 18px 18px}
.qk.on{display:flex}
.qk-box{width:min(560px,96vw);background:var(--panel);border:1px solid var(--border2);
  border-radius:12px;box-shadow:0 18px 60px rgba(0,0,0,.45);overflow:hidden}
.qk-inp{width:100%;border:0;border-bottom:1px solid var(--border);border-radius:0;
  background:var(--panel);color:var(--txt);font-size:15px;padding:14px 16px}
.qk-inp:focus{border-color:var(--accent);outline:none}
.qk-list{max-height:52vh;overflow-y:auto;padding:6px}
.qk-row{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:8px;
  cursor:pointer;font-size:13.5px;color:var(--txt)}
.qk-row.on{background:rgba(7,193,96,.14)}
.qk-row .ic{width:20px;text-align:center;opacity:.85;flex:none}
/* 面包屑：分组 › 页面名（分组是父级，弱化+可省略；页面名是当前项，加粗） */
.qk-row .path{display:inline-flex;align-items:center;gap:6px;flex:none;max-width:46%;min-width:0}
.qk-row .grp{color:var(--faint);font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qk-row .sep{color:var(--faint);font-size:11px;flex:none}
.qk-row b{flex:1;min-width:0;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qk-row .rc{color:#07c160;border:1px solid rgba(7,193,96,.38);border-radius:8px;
  padding:0 6px;font-size:11px;line-height:16px;flex:none}
/* 行尾 ★：固定/取消固定常用页（点它只切换收藏，不跳页） */
.qk-row .pin{flex:none;color:var(--faint);font-size:14px;line-height:1;padding:2px 5px;border-radius:6px;cursor:pointer}
.qk-row .pin:hover{color:#07c160;background:rgba(7,193,96,.12)}
.qk-row .pin.on{color:#07c160}
.qk-none{color:var(--faint);font-size:12.5px;text-align:center;padding:22px 10px}
.qk-ft{border-top:1px solid var(--border);color:var(--faint);font-size:11.5px;padding:7px 12px;text-align:right}

/* ===== 移动端自适应（≤900px） ===== */
#btnMenu{display:none}
#sideMask{display:none}
@media (max-width:900px){
  #btnMenu{display:inline-flex}
  #btnJump{display:none}          /* 手机没有 Ctrl+K，入口按钮也没必要占位 */
  /* ⚠ 抽屉/遮罩层级：本文件后面还有一条 `.sidebar{…;z-index:1}`（微信化统一层，行 784），
   * 同特异性、位置在后 ⇒ 会把这里的 40 盖掉，结果遮罩反倒压在抽屉上面（菜单灰掉、点不动），
   * 就是用户 2026-10-09 报的「手机菜单展开有个遮盖层」。
   * 所以这里**用 id 提特异性**（#side 必胜 .sidebar）：遮罩 50（顺手盖住底部 Tab 栏 44，
   * 展开菜单时不露出 Tab）、抽屉 60（在遮罩之上，可点）。 */
  #side{z-index:60;transform:translateX(-100%);transition:transform .25s ease}
  body.side-open #side{transform:translateX(0)}
  #sideMask{display:none;position:fixed;inset:0;background:rgba(5,7,10,.55);z-index:50}
  body.side-open #sideMask{display:block}
  /* 抽屉开着时把整框抬到底部 Tab 栏(44)之上——遮罩才能连 Tab 栏一起压暗
   * （遮罩已在 .shell 内，见 index.html 顶部那段注释；关着时 .shell 仍回 z-index:30） */
  body.side-open .shell{z-index:46}
  .main{margin-left:0}
  .topbar{padding:0 10px;gap:6px}
  .topbar h2{font-size:14.5px}
  .topbar .chip{display:none}               /* 手机上隐藏状态chip/用户chip */
  .topbar .chip:first-of-type{display:inline-flex}  /* 保留服务状态点 */
  .content{padding:0 12px 26px}
  .wx-grid,.row2{grid-template-columns:1fr}
  .wx-grid>*{min-width:0}                    /* grid 子项默认 min-width:auto，长内容会撑破列宽 */
  .cards{grid-template-columns:repeat(auto-fill,minmax(140px,1fr))}
  .wx-grid .panel{margin-bottom:10px}
  .wx-grid .wxlist{max-height:min(38vh,360px)}  /* 手机：列表矮一点给聊天窗让位，但也别矮到只看得见 4 行 */
  .chatwin{width:100%;min-width:0;height:min(56vh,560px);min-height:min(320px,48vh)}  /* 手机：高度按视口夹，矮屏不撑出滚动 */
  .cw-head{flex-wrap:wrap}
  .cw-head b{flex:1;min-width:0;overflow-wrap:break-word;word-break:break-word}  /* 长标题不撑宽 */
  .cw-head .hint{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:45%}
  #content input,#content select,#content textarea{max-width:100%;box-sizing:border-box}
  /* 手机：表格默认「一行一格 + 横向滚动」——列多的表（线索/报表等 7~10 列）在窄屏硬挤
   * 会把每列压到 30~50px、一个字一行（实测行高能到 1000px），比横向滚动更难用。
   * 真正适配窄屏的表（列少、需要贴屏宽）由各页自己覆盖，见下方 .sy-meta/.sy-acc。 */
  table.list{display:block;overflow-x:auto;white-space:nowrap;-webkit-overflow-scrolling:touch}
  table.list th,table.list td{border-bottom:1px solid var(--border)}
  /* 数据同步页的两张表：手机上不横滚——改成真正的表格 + 固定表宽，
   * 微信号列自适应剩余宽度、三个计数列等宽窄列（与桌面同一套比例）。 */
  table.list.sy-meta,table.list.sy-acc{display:table;width:100%;table-layout:fixed}
  table.list.sy-meta td,table.list.sy-acc td,table.list.sy-acc th{white-space:normal;word-break:break-word}
  .toolbar{gap:6px}
  /* 聊天窗底部两条（导出 / 对话框）在手机上：导出按钮独占一行、回复框竖排 */
  .cw-exp #cwExpGo{flex:1 0 100%;justify-content:center}
  .cw-input{flex-direction:column;align-items:stretch}
  .cw-input .cw-act{align-self:flex-end}
  .mom-pop{padding:12px}
  .qk{padding:8vh 12px 12px}      /* 手机：弹层往上收，别被软键盘顶掉 */
  .qk-row .path{display:none}     /* 手机：宽度不够，隐藏面包屑的父级分组 */
  /* 手机：汉堡菜单移到**左上角**（手机惯例、单手可及；原先排在标题右侧约屏宽 55% 处，
   * 2026-10-09 真机视角实测点名）。flex 的 order 只在窄屏生效，桌面排布不动。
   * 标题同时给省略号：长标题（如「朋友圈归档」）不会把右侧按钮挤出屏幕。 */
  #btnMenu{order:-2}
  .topbar h2{order:-1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
}

/* ---- 销售轨迹（p_track）：动作流水时间线 ---- */
.tk-row{display:grid;grid-template-columns:50px 96px 150px minmax(88px,1fr) minmax(0,2.2fr) auto;
  gap:10px;align-items:baseline;padding:7px 0;border-bottom:1px dashed var(--border);font-size:13px}
.tk-row:last-child{border-bottom:0}
.tk-t{color:var(--muted);font-variant-numeric:tabular-nums}
.tk-o,.tk-g,.tk-d{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tk-o{color:var(--muted)}
.tk-sum{display:flex;flex-wrap:wrap;gap:8px 10px;align-items:center}
.tk-c.on{outline:1px solid var(--border2)}
.tk-zero{opacity:.45}                                    /* 该类在当前筛选下没有记录 */
.tk-warn{background:rgba(245,86,74,.16);color:#ff8a80}    /* 异常徽标（可点击＝仅看异常） */
.tk-warn.on{outline:1px solid #ff8a80}
.tk-pick{display:flex;flex-wrap:wrap;gap:8px 14px;font-size:13px;margin-top:12px}
.tk-pick label{display:inline-flex;align-items:center;gap:6px;cursor:pointer}
.tk-day{margin:14px 0 2px;font-size:12.5px;color:var(--muted)}
@media (max-width:760px){
  .tk-row{grid-template-columns:52px minmax(0,1fr);row-gap:2px}   /* 手机：时间+动作一行，其余各占一行 */
  .tk-o,.tk-g,.tk-d{grid-column:1/-1}
}

/* ---- 数据看板「微信数据 → 在线时长」：实线＝在线 / 虚线＝离线（连接处＝当时的上下线时间） ----
 * 跟着上方账号 tab 走：一次只画当前那个微信；轨道＝一天 00:00~24:00 的百分比定位，
 * 底是虚线（离线），上面叠实线段（在线），切换点画竖线并标出时刻。
 * 手机太窄放不下竖线文字 → 换成一行「09:08–12:30 · …」文字。 */
.onl-row{display:flex;align-items:center;gap:10px;padding:2px 0}
.onl-tk{position:relative;flex:1;min-width:150px;height:30px}
.onl-base{position:absolute;left:0;right:0;top:14px;border-top:1px dashed var(--border2)}
.onl-seg{position:absolute;top:11px;height:7px;border-radius:4px;background:var(--accent)}
.onl-seg:hover{background:var(--accent-hi)}
.onl-cut{position:absolute;top:5px;height:16px;width:0;border-left:1px solid var(--border2)}
.onl-cut b{position:absolute;top:-9px;left:50%;transform:translateX(-50%);font-size:10px;
  font-weight:500;color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}
.onl-times{display:none;flex:1 1 100%;font-size:11.5px;color:var(--muted);
  font-variant-numeric:tabular-nums;word-break:break-all}
.onl-ax{height:14px;color:var(--faint);font-size:10.5px;font-variant-numeric:tabular-nums}
.onl-ax span{position:absolute;top:0;transform:translateX(-50%);white-space:nowrap}
.onl-ax span:first-child{transform:none}                 /* 0:00 贴左，不越出轨道 */
.onl-ax span:last-child{transform:translateX(-100%)}     /* 24:00 贴右 */
@media (max-width:760px){
  .onl-row{flex-wrap:wrap;row-gap:2px}
  .onl-tk{flex:1 1 100%}
  .onl-cut b{display:none}                                /* 太窄不叠字，时刻改由下一行文字给 */
  .onl-times{display:block}
}

/* ---- 联系人档案「匹配业务」：下拉勾选式多选 ----
 * 用户 2026-09-17：「做下拉式 勾选 选上的显示出来，隔开 这样不占多大位置」「宽度也不需要这么宽 居左对齐」。
 * 收起只显示已选小块（.mdd-tags 里用 .badge.blue），点开才是勾选清单；颜色全走主题变量，深/浅色都不违和。 */
.mdd{position:relative;display:inline-block;width:200px;max-width:100%;vertical-align:top}
.mdd-box{display:flex;align-items:center;gap:6px;min-height:33px;padding:4px 9px;
  border:1px solid var(--border2);border-radius:8px;background:var(--panel2);cursor:pointer}
.mdd-box:hover{border-color:var(--accent)}
.mdd-tags{flex:1;display:flex;flex-wrap:wrap;align-items:center;min-width:0;line-height:1.9}
.mdd-caret{flex:none;color:var(--muted);font-size:10px}
.mdd-panel{display:none;position:absolute;z-index:60;left:0;top:calc(100% + 4px);min-width:100%;
  width:max-content;max-width:260px;max-height:264px;overflow:auto;padding:5px 6px;  /* 9 条业务线一屏放得下，不用滚 */
  border:1px solid var(--border2);border-radius:8px;background:var(--panel2);
  box-shadow:0 10px 30px rgba(0,0,0,.45)}
.mdd-item{display:flex;align-items:center;gap:7px;padding:4px 7px;border-radius:6px;
  cursor:pointer;color:var(--txt)}
.mdd-item:hover{background:var(--panel3,#232d3c)}
/* 覆盖 .fld input{width:100%}：勾选框必须是原始大小，否则每行被撑成整行宽 */
.mdd-item input[type=checkbox]{flex:none;width:auto;margin:0;padding:0;background:none;
  border:0;accent-color:var(--accent);cursor:pointer}

/* ---- 微信号多选：收起态一行的下拉多选（core.js::accMulti） ----
 * 2026-09-18 用户：「出现多个微信号 可以做成下拉 多选或者单选」——原来把每个号平铺成
 * 一行 checkbox，号一多或窗口一窄就折成好几行，把页面挤高。现在收起态只一行
 * （「全部微信号」或已选标签），点开才是勾选清单；点空白处收起。 */
.acc-dd{position:relative;display:inline-block;min-width:150px;max-width:100%;vertical-align:top}
.acc-dd-box{display:flex;align-items:center;gap:6px;min-height:33px;padding:4px 9px;
  border:1px solid var(--border2);border-radius:8px;background:var(--panel2);cursor:pointer}
.acc-dd-box:hover{border-color:var(--accent)}
.acc-tags{flex:1;display:flex;flex-wrap:wrap;align-items:center;gap:4px;min-width:0;line-height:1.9}
.acc-dd-panel{display:none;position:absolute;z-index:60;left:0;top:calc(100% + 4px);
  min-width:100%;width:max-content;max-width:min(340px,88vw);max-height:min(52vh,320px);overflow:auto;
  padding:5px 6px;border:1px solid var(--border2);border-radius:8px;background:var(--panel2);
  box-shadow:0 10px 30px rgba(0,0,0,.45)}
.acc-dd.on .acc-dd-panel{display:block}
.acc-item{display:flex;align-items:center;gap:7px;padding:5px 7px;border-radius:6px;
  cursor:pointer;color:var(--txt);white-space:nowrap}
.acc-item:hover{background:var(--panel3,#232d3c)}
/* 同 .mdd-item：勾选框要原始大小（会被 .fld input{width:100%} 撑成整行宽） */
.acc-item input[type=checkbox]{flex:none;width:auto;margin:0;padding:0;background:none;
  border:0;accent-color:var(--accent);cursor:pointer}
@media (max-width:900px){
  .acc-dd{width:100%}                      /* 手机：下拉占满一行，长标签不撑破 */
  .acc-dd-panel{max-width:100%}
  .acc-item{white-space:normal}
}
/* 多选收进另一个下拉弹层里时**就地展开**（不再套一层下拉：内层 absolute 会被外层
 * `.acc-dd-panel{overflow:auto}` 裁掉）。用法见「聊天记录」页右上角「筛选」弹层里放的
 * `#wxAccBox`（core.js::accMulti 渲的仍是标准 acc-dd 结构，这里只把它摊平）。 */
.acc-dd-panel .acc-dd{display:block;position:static;min-width:0}
.acc-dd-panel .acc-dd>.acc-dd-box{display:none}
.acc-dd-panel .acc-dd>.acc-dd-panel{display:block;position:static;left:auto;top:auto;max-height:none;
  width:auto;min-width:0;padding:0;border:0;background:transparent;box-shadow:none;overflow:visible}
.acc-dd-panel .acc-dd .acc-item{white-space:normal}   /* 弹层窄：长账号名换行，别撑出横向滚动 */

/* ---- 服务配置「模型列表」的「适用功能」列：下拉勾选式多选（p_ai.js::aiDdCell） ----
 * 每行模型勾给哪些 AI 功能用，收起态只显示已选小块（.badge.blue）。
 * 菜单必须 position:fixed —— 表格外层是 overflow-x:auto，absolute 会被那个滚动容器裁掉；
 * 打开时由 JS 按输入框位置摆（下面放不下就朝上弹）。勾选行沿用全站 .acc-item。 */
.ai-dd{position:relative;display:block;max-width:100%}
.ai-dd-box{display:flex;align-items:center;gap:6px;min-height:33px;padding:4px 9px;
  border:1px solid var(--border2);border-radius:8px;background:var(--panel2);cursor:pointer}
.ai-dd-box:hover{border-color:var(--accent)}
.ai-dd-tags{flex:1;display:flex;flex-wrap:wrap;align-items:center;gap:4px;min-width:0;line-height:1.9}
.ai-dd-panel{display:none;position:fixed;z-index:60;min-width:190px;max-width:min(360px,88vw);
  max-height:min(70vh,470px);overflow:auto;padding:5px 6px;border:1px solid var(--border2);  /* 16 个功能项一屏放得下 */
  border-radius:8px;background:var(--panel2);box-shadow:0 10px 30px rgba(0,0,0,.45)}
.ai-dd.on .ai-dd-panel{display:block}
.ai-dd .acc-item{white-space:nowrap}

/* ---- 数据同步页：概况表 +「微信号列表」（sy-*） ----
 * 2026-09-18 用户：「数据同步 微信列表 分配的宽度比例不协调，特别是小屏」。
 * 根因：概况行（周期/上次同步/本地缓存/微信密钥）与微信号明细共用一张表 → 概况里那句很长的
 * 「本地缓存」值落在第 2 列，把「会话」列撑到 700px，三个计数列只剩几十像素；且表头写在
 * tbody 里。现改为两张表：概况一张（两列），微信号明细一张（微信号列自适应剩余宽度，
 * 三个计数列等宽、固定窄列）。 */
.sy-meta td.k{width:150px;color:var(--muted)}
.sy-kinds{white-space:normal;word-break:break-all;line-height:1.5}   /* 缓存内容清单（accounts/contacts/…）另起一行、可断行 */
.sy-acc{width:100%;table-layout:fixed}            /* 计数列定宽、微信号列吃掉剩余，宽度比例稳定 */
.sy-acc th.num,.sy-acc td.num{width:96px;text-align:center}
@media (max-width:900px){
  .sy-meta td.k{width:96px}
  .sy-acc th.num,.sy-acc td.num{width:64px}
  .sy-acc th,.sy-acc td{padding-left:6px;padding-right:6px}
}

/* =====================================================================
 * 微信 PC 经典三段框架（单一微信浅色主题）：
 *   ①.rail   深色竖条（**宽随内容自适应**）：logo（下方常显项目名）+ 一级图标（图标**右侧并列**常显栏目名）+ 底部「设置」
 *   ②.sidebar 240px 浅灰分区列表：顶部搜索 + 分区标题(.grp) + 行(色块头像 + 名称)
 *   ③.main    右侧内容区（页面自带列表/详情，如会话列表 / 聊天窗）
 * 手机(≤900px)：①隐藏；②改为抽屉（body.side-open）+ 底部 .tabbar
 * 只换外壳：p_*.js 页面模块、PAGES 页面 id 与端点一律不动。
 * ===================================================================== */
/* 外壳＝浮层卡片（对齐 ui-kit.uk-app.uk-float / 微信 PC）：四周留白 + 14px 大圆角 + 柔和阴影。
 * 三段改为**底座 flex 结构**：rail / sidebar 定宽、main 吃掉剩余宽度（不再用 absolute 拼 left）。 */
.shell{position:fixed;inset:14px 18px;z-index:30;display:flex;overflow:hidden;
  background:#fff;border-radius:14px;box-shadow:0 16px 36px rgba(15,23,42,.08)}
:root{--rail-w:64px;--navcol-w:240px;--rail-bg:var(--uk-rail-bg,#2e2e2e);--rail-fg:var(--uk-rail-fg,#9a9a9a)}
/* ① 最左深色竖条（宽度自适应内容：图标右侧并列栏目名，3 个字也不截断；buildRail 实测后回填 --rail-w） */
.rail{position:relative;left:auto;top:auto;bottom:auto;flex:0 0 auto;width:max-content;min-width:var(--rail-w);z-index:2;
  background:var(--rail-bg);
  display:flex;flex-direction:column;align-items:stretch;gap:3px;padding:9px 10px 12px;user-select:none}
.rail .ravatar{align-self:center;width:34px;height:34px;border-radius:9px;flex:none;margin-bottom:4px;
  background:url('/web/img/logo.jpg') no-repeat center/cover}
/* logo 下方常显项目名 */
.rail .rname{align-self:center;color:#d8d8d8;font-size:12.5px;font-weight:600;letter-spacing:.02em;
  margin-bottom:10px;white-space:nowrap}
.rail .rsp{flex:1}
.rail .rtab{position:relative;width:auto;padding:9px 10px;border-radius:6px;
  display:flex;flex-direction:row;align-items:center;gap:9px;
  color:var(--rail-fg);cursor:pointer;font-size:14px;line-height:1;
  transition:background .15s,color .15s}
.rail .rtab:hover{background:rgba(255,255,255,.08);color:#e6e6e6}
.rail .rtab.on{color:var(--accent);background:rgba(255,255,255,.06)}
.rail .rtab .ic{display:flex;align-items:center;justify-content:center;flex:none;width:24px;height:24px}
.rail .rtab .ic svg{width:24px;height:24px}
.rail .rtab .rlb{flex:none;white-space:nowrap}
/* rail 未读角标（微信聊天图标上的红点/数字） */
.rail .rtab .rb{position:absolute;top:3px;right:4px;min-width:16px;height:16px;border-radius:8px;
  background:#f5564a;color:#fff;font-size:10px;line-height:16px;text-align:center;padding:0 4px;
  font-weight:600;box-shadow:0 0 0 2px var(--rail-bg)}
/* ② 浅灰分区列表 */
.sidebar{position:relative;left:auto;top:auto;bottom:auto;flex:0 0 var(--navcol-w);width:var(--navcol-w);height:100%;z-index:1}
/* 左下「☰ 设置」弹层（微信 PC / CloudBak 左下三条横线那种：点开一个设置菜单） */
.setmenu{position:fixed;left:calc(var(--rail-w) + 22px);bottom:22px;width:212px;max-height:60vh;overflow:auto;
  background:#fff;border:1px solid #e7e7e7;border-radius:8px;
  box-shadow:0 10px 30px rgba(15,23,42,.16);padding:6px;z-index:75;display:none}
.setmenu.on{display:block}
.setmenu .sm-hd{font-size:12px;color:#7f7f7f;padding:6px 10px 4px}
.setmenu .grp{font-size:12px;color:#7f7f7f;margin:6px 8px 2px}
.setmenu a{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:4px;
  color:#191919;font-size:14px;cursor:pointer}
.setmenu a:hover{background:#e3e3e3}
.setmenu a .av{width:26px;height:26px;border-radius:4px;display:flex;align-items:center;
  justify-content:center;color:#fff;font-size:13px;flex:none}
.setmenu a .t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.setmenu a .ic{display:none}
.nsearch{display:flex;align-items:center;gap:6px;margin:10px 10px 6px;padding:0 8px;height:28px;
  background:#e3e3e3;border-radius:4px;flex:none}
.nsearch svg{flex:none;opacity:.5}
.nsearch input{flex:1;min-width:0;border:0;background:transparent;outline:0;font-size:13px;color:#191919;padding:0}
.nsearch input::placeholder{color:#9a9a9a}
.nav{padding:2px 6px 16px}
.nav .grp{font-size:12px;font-weight:400;letter-spacing:0;margin:8px 0 2px;padding:4px 10px;
  color:#7f7f7f;background:#e6e6e6;border-radius:0}
.nav a{display:flex;align-items:center;gap:10px;padding:7px 10px;font-size:14px;border-radius:4px;color:#191919}
.nav a:hover{background:#e3e3e3}
.nav a.on{background:#d9d9d9;font-weight:500}
.nav a .av{width:34px;height:34px;border-radius:5px;flex:none;display:flex;align-items:center;
  justify-content:center;color:#fff;font-size:15px;font-weight:500;overflow:hidden;user-select:none}
.nav a .t{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nav a .ic{display:none}
.nav a .ph,.nav a .lvbadge{border-radius:4px}
.main{position:relative;left:auto;top:auto;right:auto;bottom:auto;flex:1;min-width:0;
  display:flex;flex-direction:column;margin:0;height:auto;background:var(--uk-main-bg,#f5f5f5)}

.tabbar{display:none}

@media (max-width:900px){
  .shell{inset:0;border-radius:0;box-shadow:none}
  .rail{display:none}
  .sidebar{position:absolute;left:0;top:0;bottom:0;flex:none;height:auto;width:min(80vw,292px)}
  .main{position:relative;left:auto;flex:1;margin:0}
  /* 手机端二级菜单顶部的「‹ 返回一级菜单」（core.js::navBackRow）：回到一级 Tab 列表。
   * ‹ 用 ::before 画——`.nav a .ic` 被全站 display:none，别用 .ic。 */
  .nav .nav-back{color:#576b95;font-size:13.5px;padding:8px 10px}
  .nav .nav-back::before{content:'‹';font-size:17px;line-height:1;margin-right:2px;font-weight:700}
  .tabbar{display:flex;position:fixed;left:0;right:0;bottom:0;height:54px;z-index:44;
    background:rgba(247,247,247,.98);border-top:1px solid var(--border);
    padding-bottom:env(safe-area-inset-bottom)}
  .tabbar .tb{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
    gap:2px;color:#7f7f7f;font-size:10.5px;cursor:pointer}
  .tabbar .tb .ic{font-size:19px;line-height:1}
  .tabbar .tb.on{color:var(--accent)}
  /* 底部留白跟着 Tab 栏走（含安全区）：列表滚到底时最后一行不会被 Tab 栏压住 */
  .content{padding-bottom:calc(76px + env(safe-area-inset-bottom))}

  /* ===== 手机端「像手机微信」：顶栏 + 列表↔详情全屏（2026-10-09 用户口径
   * 「手机版样式再完善一下，跟手机微信类似的布局、操作方式」）=====
   * 全部只在 ≤900px 生效，桌面（>900px）零影响；JS 侧见 core.js::mDetail/buildMobileFoot。 */
  /* ① 顶栏瘦身：只留「☰ + 居中标题 + 运行状态点」——刷新/退出搬进抽屉底部（.mfoot），
   *    与手机微信"功能入口都在抽屉里"一致（顶栏按钮挤成一排是手机上最丑的一处）。 */
  #btnRefresh,#btnLogout{display:none}
  .topbar{position:relative;justify-content:center}
  .topbar h2{position:absolute;left:50%;transform:translateX(-50%);max-width:62%;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;order:0}
  #btnMenu{position:absolute;left:4px;order:0}
  #chipMode{position:absolute;right:6px;order:0}
  /* 抽屉底部的「刷新 / 退出」（core.js::buildMobileFoot 注入） */
  .mfoot{display:flex;gap:8px;padding:10px 12px;border-top:1px solid var(--border);flex:none}
  .mfoot .btn{flex:1;justify-content:center}
  /* ② 列表 → 详情全屏（微信式）：点列表行进详情＝列表让位、详情占满，左上角「‹ 返回」退回。
   *    .m-back 默认不显示（桌面那行也在 DOM 里，但只有手机进详情后才露出来）。 */
  /* 手机**列表模式**：列表占满一屏（用户 2026-10-09：「列表显示太少了，还没显示完整就翻页，
   * 改成首屏显示满、其余自动加载」）。原来沿用桌面的 `.wx-grid .wxlist{max-height:min(38vh,360px)}`
   * ——那是"列表+聊天窗同屏"时代给聊天窗让位用的，现在手机默认只显示列表，再卡 38vh 就只剩
   * 5~6 行、下面一大片空白。放开后列表随 .content 滚动，滚到底由各页的 autoList
   * （core.js，默认 50 条/批）自动续加载，不用翻页。 */
  .wx-grid>.panel:first-child .wxlist{max-height:none}
  .m-back,.m-backbar{display:none}
  body.m-detail .m-back{display:inline-flex;flex:none}
  body.m-detail .m-backbar{display:block;padding:0 0 8px}
  /* 手机默认**只看列表**（用户口径 2026-10-09：消息列表不要一并显示对话框，点了会话再进）。
   * `:not(:first-child)` 兜住只有一栏的页（那种页不该被隐藏）。 */
  .wx-grid>.panel:last-child:not(:first-child){display:none}
  body.m-detail .wx-grid>.panel:first-child:not(:last-child){display:none}
  body.m-detail .wx-grid>.panel:last-child{display:block;margin-bottom:0}
  body.m-detail .wx-grid .wxlist{max-height:none}
  /* 详情里的聊天窗：**钉在顶栏与底部 Tab 栏之间**（用户 2026-10-09：「对话框一部分被底部
   * 菜单遮盖」「有时不浮动固定、会跟着下滑」）。原来只写 `height:calc(100vh-98px)`：
   *   ① 高度是"算"出来的，页面一滚它就跟着走（不是固定的）；
   *   ② 98px 没算安全区，带小黑的手机/Tab 栏更高 ⇒ 底部输入条被 Tab 栏盖住。
   * 改成 fixed + top/bottom 定位：容器高度＝可视区实测值（手机地址栏伸缩也不会算错），
   * 底部留出 Tab 栏 + 安全区；输入条在容器内 flex 收尾，永远贴着 Tab 栏上沿。 */
  /* ⚠ 关键：`.page.on` 带入场动画 fade（keyframes 里有 transform:translateY(3px)）——
   * **祖先只要带 transform，后代 position:fixed 就会改以该祖先为包含块**，
   * 于是聊天窗不相对屏幕固定：高度按 .page 算（实测只有 97px）→ 底部输入条被 Tab 栏盖住、
   * 页面一滚它跟着走。用户 2026-10-09 报的两条症状都是这个。
   * 手机进详情时把入场动画停掉（桌面不动，保留原来的淡入）。 */
  body.m-detail .page.on{animation:none;transform:none}
  body.m-detail .chatwin{position:fixed;left:0;right:0;top:44px;
    bottom:calc(54px + env(safe-area-inset-bottom));
    height:auto;min-height:0;margin:0;border-radius:0;z-index:20}
}

/* =====================================================================
 * 微信化「整体统一」层：把各组件各写各的圆角/间距拉成一套尺度
 *   行/药丸类（列表行、翻页、跳转行、账号下拉项）＝4px
 *   卡片/气泡/浮层小件（面板内卡片、toast、群组块）＝6px
 *   浮层大件（弹窗、快速跳转框）＝8px
 * 另补：分段控件 .seg（此前全站无样式，标签是裸的）、浅色下的选中态与阴影。
 * ===================================================================== */
/* 分段控件：微信观感——灰底轨道 + 选中项白色药丸（深字），未选中蓝字无底。
 * ⚠️ 必须带 html.light 前缀：否则被 `html.light .btn`/`.btn.primary` 按特异性盖掉。 */
html.light .seg{display:inline-flex;align-items:center;gap:4px;flex-wrap:wrap;padding:3px;background:#ececec;border-radius:6px}
html.light .seg .btn{background:transparent;border-color:transparent;color:#576b95;border-radius:4px;padding:4px 12px}
html.light .seg .btn:hover{background:rgba(0,0,0,.04);filter:none}
html.light .seg .btn.primary{background:#fff;color:#191919;font-weight:600;box-shadow:0 1px 2px rgba(0,0,0,.10)}
.nav a{border-radius:4px}
.pager .pg-num,.pager .pg-nav,.pager .pg-go{border-radius:4px}
.qk-row,.qk-row .rc,.qk-box .qk-inp{border-radius:4px}
.acc-item,.acc-dd-box{border-radius:4px}
.mdd-item,.acc-dd-panel,.fu-row,.bub .tx,.toast,.ma-group,.rol-card,.fa-fix,.mom-card{border-radius:6px}
.ma-dlg,.qk-box{border-radius:8px}
.content{padding:0 20px 28px}   /* 顶部留白挂在 .page（见 .content 那条注释），别加回这里 */
/* 浅色下的选中/悬停一律走微信灰（不再用绿色底） */
html.light .qk-row.on{background:#d9d9d9}
html.light .ma-group .badge.gray{background:#ececec}
html.light .qk-box,html.light .ma-dlg{box-shadow:0 12px 44px rgba(0,0,0,.16)}
/* 工具栏里控件等高：按钮/输入/下拉同一行不再参差（这是"不精致"最显眼的一处） */
.toolbar{align-items:center}
.toolbar .btn{height:28px;padding:0 12px}
.toolbar .btn.sm{height:26px;padding:0 10px}
.toolbar input:not([type=checkbox]):not([type=radio]),.toolbar select{height:28px;padding-top:0;padding-bottom:0}
.toolbar textarea{min-height:28px}
/* 选中文字走微信绿；禁用态统一 */
::selection{background:rgba(7,193,96,.22)}
.btn:disabled,.btn.disabled{opacity:.55;cursor:not-allowed;filter:none}

/* =====================================================================
 * 报表组件（.rp-*）：观感对齐微信 —— 纯白卡片 + 1px 浅描边（不用阴影）、
 *   黑字主数值 + 灰字标签 + 微信绿进度条（不再用 CloudBak 的绿调卡片）。
 *   · 顶部「大数字 + 标签」概览卡（一行 3 个，数字 31px/600，不做环比/趋势）
 *   · 细分指标块（数字 + 标签）
 *   · 横向进度条（轨道 8px / 填充绿）
 *   · 紧凑排行表（行分隔用浅边框，不用斑马纹）
 *   · <details>「查看数据表」折叠原始数据
 * 两套主题各配一份 token，互不串色（深色仍按现有深色主题）。
 * 用法见 p_search.js::stFetch / stHoursHtml。
 * ===================================================================== */
:root{
  --rp-card:var(--panel);--rp-line:var(--border);
  --rp-num:#e8eef7;--rp-num2:#c6d2e2;--rp-mut:#8a96a9;
  --rp-track:rgba(255,255,255,.07);--rp-bar:#07c160;--rp-bar2:#21d974;
}
html.light{
  --rp-card:#ffffff;--rp-line:#e7e7e7;
  --rp-num:#191919;--rp-num2:#191919;--rp-mut:#7f7f7f;
  --rp-track:#ededed;--rp-bar:#07c160;--rp-bar2:#07c160;
}
.rp-wrap{display:flex;flex-direction:column;gap:12px}
/* 大数字概览：一行 3 个 */
.rp-kpis{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.rp-kpi{background:var(--rp-card);border:1px solid var(--rp-line);border-radius:8px;padding:18px 20px}
.rp-kpi .v{font-size:31px;font-weight:600;line-height:1.15;color:var(--rp-num);font-variant-numeric:tabular-nums}
.rp-kpi .v small{font-size:14px;font-weight:500;margin-left:4px;color:var(--rp-num2)}
.rp-kpi .k{color:var(--rp-mut);font-size:12.5px;margin-top:6px}
/* 细分指标：一行 3 个 */
.rp-metrics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.rp-metric{background:var(--rp-card);border:1px solid var(--rp-line);border-radius:8px;padding:14px 16px}
.rp-metric .v{font-size:19px;font-weight:600;color:var(--rp-num2);font-variant-numeric:tabular-nums}
.rp-metric .k{color:var(--rp-mut);font-size:12px;margin-top:3px}
/* 通用报表卡片 */
.rp-card{background:var(--rp-card);border:1px solid var(--rp-line);border-radius:8px;padding:18px 20px}
.rp-card h4{margin:0 0 12px;font-size:14px;font-weight:700;color:var(--rp-num2)}
.rp-2col{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
/* 横向进度条：bar=三段（名称/轨道/数值），track+fill+vl 也可单独内联用 */
.rp-bars{display:flex;flex-direction:column;gap:9px}
.rp-bar{display:grid;grid-template-columns:minmax(96px,34%) minmax(0,1fr) auto;align-items:center;gap:10px}
.rp-bar .nm{font-size:12.5px;color:var(--rp-num2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rp-track{display:block;height:8px;border-radius:5px;background:var(--rp-track);overflow:hidden;min-width:40px}
.rp-fill{display:block;height:8px;border-radius:5px;
  background:linear-gradient(90deg,var(--rp-bar),var(--rp-bar2))}
.rp-vl{font-size:12px;color:var(--rp-mut);font-variant-numeric:tabular-nums;white-space:nowrap}
.rp-bar .rp-vl{text-align:right}
/* 紧凑排行表 */
table.rp-table{width:100%;border-collapse:collapse;font-size:13px}
table.rp-table th{color:var(--rp-mut);font-weight:500;font-size:12px;text-align:left;
  padding:8px 10px;border-bottom:1px solid var(--rp-line)}
table.rp-table td{padding:9px 10px;border-bottom:1px solid var(--rp-line);vertical-align:middle}
table.rp-table tr:last-child td{border-bottom:0}
table.rp-table td.num{text-align:right;font-variant-numeric:tabular-nums}
/* 「查看数据表」折叠 */
details.rp-det{margin-top:12px}
details.rp-det summary{cursor:pointer;color:var(--rp-mut);font-size:12px;user-select:none;list-style:none}
details.rp-det summary::-webkit-details-marker{display:none}
details.rp-det summary::before{content:'▸ ';font-size:11px}
details.rp-det[open] summary::before{content:'▾ '}
details.rp-det summary:hover{color:var(--accent)}
details.rp-det[open] summary{margin-bottom:8px}
/* 通话记录·转写折叠（p_phonecalls）：**箭头放摘要文字后面**（用户 2026-10-09），
 * 颜色与展开后的正文一致（不要 .hint 的浅灰——折叠标题与正文是同一块内容，不该两个色）。
 * 原生 <details> 的三角默认在行首，这里关掉、改成 summary::after 挂在末尾。*/
details.pc-asr{margin:0}
details.pc-asr>summary{cursor:pointer;list-style:none;color:inherit;user-select:none}
details.pc-asr>summary::-webkit-details-marker{display:none}
details.pc-asr>summary::after{content:'▸';margin-left:5px;padding:0 3px;font-size:11px;color:var(--muted)}
details.pc-asr[open]>summary::after{content:'▾'}
/* 展开后：预览+字数（.pc-asr-sum）收起不见了（用户 2026-10-09），只留末尾箭头可点收起。*/
details.pc-asr[open]>summary .pc-asr-sum{display:none}
@media (max-width:900px){
  .rp-kpis,.rp-metrics,.rp-2col{grid-template-columns:repeat(2,minmax(0,1fr))}
  .rp-kpi .v{font-size:23px}
}
@media (max-width:560px){
  .rp-kpis,.rp-metrics,.rp-2col{grid-template-columns:1fr}
  .rp-bar{grid-template-columns:minmax(80px,40%) minmax(0,1fr) auto}
}

/* =====================================================================
 * ui-kit 对齐层（2026-10-17）
 * 底座 ui-kit.css 先加载；这里把微客助手的历史类名映射到底座的令牌与尺度，
 * 页面 JS / markup 不动 —— 避免 60+ 个 p_*.js 逐页改类名的回归。
 * 只写「与底座有差异」的部分：外壳结构已在上一节切到 flex，这里补组件尺度。
 * 换肤仍只改 ui-kit 的语义层（--uk-accent / --uk-rail-* / --uk-radius*）。
 * ===================================================================== */
/* 侧栏：底座 uk-navcol 的底色（#f7f7f7）与右侧细边 */
html.light .sidebar{background:var(--uk-side-bg,#f7f7f7);border-right:1px solid var(--uk-border,#e7e7e7)}
/* 顶栏：底座 uk-top = 52px 白底（比旧 44px 灰底更接近微信 PC） */
.topbar{height:var(--uk-top-h,52px);padding:0 18px;background:var(--uk-card,#fff);
  border-bottom:1px solid var(--uk-border,#e7e7e7)}
html.light .topbar{background:var(--uk-card,#fff)}
.topbar h2{font-size:16px;font-weight:600}
html.light .topbar .chip{background:transparent;border-color:transparent}
/* 侧栏搜索 / 分区 / 行：底座 uk-navcol 的尺度 */
.nsearch{background:var(--uk-field-bg,#e3e3e3);border-radius:var(--uk-radius,6px)}
.nav .grp{background:var(--uk-group-bg,#e6e6e6);color:var(--uk-muted,#7f7f7f)}
.nav a{border-radius:var(--uk-radius,6px);padding:8px 10px;font-size:13.5px}
.nav a.on{background:var(--uk-item-active,#d9d9d9);font-weight:500}
.side-foot{padding:12px 14px;font-size:12px;color:var(--uk-faint,#9a9a9a)}
/* 按钮 / 输入：底座 uk-btn / uk-input */
html.light .btn{background:var(--uk-surface,#fff);border-color:var(--uk-border,#e7e7e7);
  border-radius:var(--uk-radius,6px)}
html.light .btn:hover{background:var(--uk-surface-hover,#f2f2f2);filter:none}
html.light .btn.primary{background:var(--uk-accent);border-color:var(--uk-accent);color:#fff}
html.light .btn.primary:hover{background:var(--uk-accent-hover)}
html.light .topbar .btn{background:transparent;border-color:transparent}
html.light .topbar .btn:hover{background:var(--uk-surface-hover,#f2f2f2)}
html.light input,html.light select,html.light textarea{border-radius:var(--uk-radius,6px);
  border-color:var(--uk-border,#e7e7e7)}
/* 卡片 / 面板：底座 uk-card radius 10 */
html.light .panel,html.light .fold,html.light .card{border-radius:var(--uk-radius-lg,10px)}
/* 标签：底座 uk-tag 的色阶 */
.badge{padding:2px 8px;font-size:11px;font-weight:500}
html.light .badge.gray{background:rgba(120,120,120,.14);color:#5a5a5a}
html.light .badge.green{background:rgba(22,163,74,.12);color:#15803d}
html.light .badge.blue{background:rgba(37,99,235,.12);color:#1d4ed8}
html.light .badge.bad{background:rgba(239,68,68,.12);color:#dc2626}
/* 表格：底座 uk-table 的表头底色与分隔线 */
html.light table.list th{background:var(--uk-surface-hover,#f2f2f2);color:var(--uk-muted,#7f7f7f);font-weight:600}
html.light table.list td{border-bottom-color:var(--uk-border-weak,#f0f0f0)}
/* 登录卡：底座 uk-login 的圆角/阴影/输入尺度 */
#gate .pa-card{border-radius:16px;padding:30px 28px;box-shadow:var(--uk-shadow-login,0 12px 40px rgba(16,24,40,.1))}
#gate .pa-field input{height:44px;border-radius:9px}
#gate .pa-btn{border-radius:9px}
#gate .pa-seg{border-radius:8px}
#gate .pa-seg button{border-radius:6px}
#forcePwd .login{border-radius:16px;box-shadow:var(--uk-shadow-login)}
/* 弹层：底座 uk-modal radius 12 */
.ma-dlg,.qk-box{border-radius:12px}
/* Toast：底座阴影/描边 */
html.light .toast{border-color:var(--uk-border,#e7e7e7);box-shadow:var(--uk-shadow,0 8px 24px rgba(15,23,42,.1))}
/* 手机：顶栏 52 → 详情页聊天窗 top 对齐 */
@media (max-width:900px){
  .topbar{height:var(--uk-top-h,52px);padding:0 10px}
  body.m-detail .chatwin{top:var(--uk-top-h,52px)}
}


