: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:10px;
 --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:13.5px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",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}
.brand{display:flex;align-items:center;gap:11px;padding:16px 20px 13px}
.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}
.brand b{font-size:16px;color:#eef3fa}
.brand span{display:block;font-size:12px;color:var(--muted);font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.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}
.main{margin-left:264px;height:100%;display:flex;flex-direction:column}
.topbar{height:50px;flex:none;display:flex;align-items:center;gap:10px;padding:0 20px;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)}
.content{flex:1;overflow-y:auto;padding:18px 22px 30px}
.page{display:none;max-width:1240px;margin:0 auto}
.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:8px;background:var(--panel3,#232d3c);color:var(--txt);font-size:13px;border:1px solid var(--border2)}
.btn:hover{filter:brightness(1.15)}
.btn.primary{background:linear-gradient(135deg,#07c160,#059a4e);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:7px}
input,select,textarea{background:var(--panel2);border:1px solid var(--border2);color:var(--txt);border-radius:8px;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:14.5px;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 8px;border-radius:20px;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;border-bottom:1px solid var(--border);font-size:12px}
table.list td{padding:8px 10px;border-bottom:1px solid #1e2733;vertical-align:top}
/* ===== 工资表（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:13.5px;font-weight:600;padding:2px 0}
.fold-head:hover{color:var(--accent)}
.fold-head .fold-ar{color:var(--faint);font-size:12px;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:30px 10px;font-size:13px}
.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:linear-gradient(160deg,var(--panel),var(--panel2));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:linear-gradient(135deg,#07c160,#059a4e);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 dashed #222b39}
.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}
/* 高度上限与右侧聊天窗（.chatwin 的 min(70vh,760px)）对齐：数据多时滚动，数据少时按内容自然高 */
.wxlist{max-height:min(70vh,760px);overflow-y:auto}
.wx-item{padding:9px 12px;cursor:pointer;border-bottom:1px solid #1e2733}
.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}
.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)}
.cw-head{display:flex;align-items:center;gap:10px;padding:12px 18px;border-bottom:1px solid var(--border);flex:none;background:var(--panel2)}
.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:8px;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;flex-direction:column;max-width:82%;align-self:flex-start}
.cw-row.me{align-self:flex-end;align-items:flex-end}
.cw-row .who{font-size:11.5px;color:var(--cw-who);margin:0 0 2px 4px}
.cw-row .tx{background:var(--cw-other);border:1px solid var(--cw-line);border-radius:6px 14px 14px 14px;padding:7px 11px;word-break:break-word;white-space:pre-wrap;font-size:13.5px;line-height:1.6;color:var(--cw-txt);box-shadow:0 1px 1px rgba(0,0,0,.06)}
.cw-row.me .tx{background:var(--cw-me);border-color:var(--cw-meline);border-radius:14px 6px 14px 14px}
.cw-row .tm{font-size:10.5px;color:var(--cw-tm);margin:2px 4px 0}
.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}
.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:10px 14px;border-top:1px solid var(--border);background:var(--panel);flex:none}
.cw-input textarea{flex:1;resize:none;min-height:64px;max-height:200px;line-height:1.5;overflow-y:auto}
.cw-input .cw-act{display:flex;gap:6px;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;min-height:22px}
.cw-input .cw-tool .btn{font-size:11.5px;padding:1px 9px;height:auto;color:var(--muted);border-color:var(--border2)}
.cw-input .cw-tool .btn:disabled{opacity:.6;cursor:wait}
.cw-input .cw-wrap textarea{width:100%}
.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:14px;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 .pa-card{width:100%;max-width:400px;background:#fff;border:1px solid rgba(22,24,29,.1);
  border-radius:16px;padding:32px 28px;box-shadow:0 12px 40px rgba(16,24,40,.08);color:#16181D;
  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:12px;display:flex;align-items:center;justify-content:center;
  font-size:20px;font-weight:700;color:#04381F;background:linear-gradient(135deg,#0FDC78,#0BB863)}
#gate .pa-title{font-size:18px;font-weight:600}
#gate .pa-sub{font-size:13px;color:#6B7280}
#gate .pa-seg{display:grid;grid-template-columns:1fr 1fr;gap:4px;background:#F1F2F4;border-radius:10px;padding:4px;margin-bottom:18px}
#gate .pa-seg button{height:34px;border:0;border-radius:8px;background:transparent;color:#6B7280;font:inherit;font-size:13.5px;cursor:pointer}
#gate .pa-seg button[aria-selected=true]{background:#fff;color:#16181D;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:#6B7280;margin-bottom:6px}
#gate .pa-field input{width:100%;height:44px;padding:0 13px;border:1px solid rgba(22,24,29,.1);border-radius:10px;
  background:#fff;color:#16181D;font:inherit}
#gate .pa-field input:focus{outline:none;border-color:#0FDC78;box-shadow:0 0 0 3px rgba(15,220,120,.18)}
#gate .pa-btn{display:flex;align-items:center;justify-content:center;width:100%;height:44px;border:0;border-radius:10px;
  background:#0FDC78;color:#04381F;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-legal{margin-top:12px;text-align:center;font-size:11.5px;line-height:1.7;color:#6B7280}
#gate .pa-err{color:#E5484D;font-size:12.5px;min-height:16px;margin-bottom:8px}
#gate .hide{display:none !important}
/* 主体底色跟随主题变量 */
.main{background:var(--bg)}
.main .content{background:var(--bg)}
/* ===== 浅色主题（html.light，配色参考微信浅色） =====
 * class 挂在 <html> 上（见 main.js applyTheme）：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:#f7f7f7;
  --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 .brand b{color:#191919}
html.light .side-foot{color:#9a9a9a}
html.light .nav .grp{color:#9a9a9a;border-bottom-color:#e2e2e2}
html.light .nav a{color:#333333}
html.light .nav a:hover{background:rgba(0,0,0,.045);color:#191919}
html.light .nav a.on{background:linear-gradient(90deg,rgba(7,193,96,.14),rgba(7,193,96,.02));color:#07c160}
/* 顶栏 / 控件 */
html.light .topbar{background:rgba(255,255,255,.92);border-bottom-color:#e7e7e7}
html.light .topbar h2{color:#191919}
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:hover{filter:brightness(1.06)}
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;border-bottom-color:#e7e7e7}
html.light table.list td{border-bottom-color:#f0f0f0}
html.light .card{background:linear-gradient(160deg,#fff,#fafafa);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:#f0f0f0}
html.light .wx-item.on{background:rgba(7,193,96,.10)}
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}

/* 角色管理页 */
.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{transform:translateX(-100%);transition:transform .25s ease}
  body.side-open .sidebar{transform:translateX(0)}
  #sideMask{display:none;position:fixed;inset:0;background:rgba(5,7,10,.55);z-index:30} /* 低于侧栏(40)：遮背景不遮菜单 */
  body.side-open #sideMask{display:block}
  .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:12px 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}     /* 手机：宽度不够，隐藏面包屑的父级分组 */
}

/* ---- 销售轨迹（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}
}

/* ---- 服务配置「模型列表」的「适用功能」列：下拉勾选式多选（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}
}

/* =====================================================================
 * 微信风格外壳（一级 Tab 图标轨 + 二级菜单列 + 内容区）
 *   .rail   60px 一级 Tab（微信 PC 左侧竖条；「设置」固定在底部）
 *   .sidebar 240px 二级菜单（原侧栏，只显示当前 Tab 的页面；通讯录下含二级分组）
 *   .main   右侧内容区
 * 手机(≤900px)：.rail 隐藏 → 底部 .tabbar；.sidebar 仍走原有抽屉（body.side-open）
 * 只换外壳：p_*.js 页面模块、PAGES 页面 id 与端点一律不动。
 * ===================================================================== */
:root{--rail-w:60px;--navcol-w:240px;--rail-bg:#080b10;--rail-fg:#7b8798}
.rail{position:fixed;left:0;top:0;bottom:0;width:var(--rail-w);z-index:42;
  background:var(--rail-bg);border-right:1px solid var(--border);
  display:flex;flex-direction:column;align-items:center;gap:2px;padding:10px 0 8px;user-select:none}
.rail .ravatar{width:34px;height:34px;border-radius:9px;flex:none;margin-bottom:8px;
  background:url('/web/img/logo.jpg') no-repeat center/cover;box-shadow:0 0 0 1px rgba(255,255,255,.08)}
.rail .rsp{flex:1}
.rail .rtab{position:relative;width:44px;height:44px;border-radius:10px;display:flex;
  align-items:center;justify-content:center;font-size:19px;line-height:1;color:var(--rail-fg);
  cursor:pointer;transition:background .15s,color .15s}
.rail .rtab:hover{background:rgba(255,255,255,.06);color:#dbe4f0}
.rail .rtab.on{color:var(--accent);background:rgba(7,193,96,.12)}
.rail .rtab.on::before{content:'';position:absolute;left:-8px;top:9px;width:3px;height:26px;
  border-radius:0 3px 3px 0;background:var(--accent)}
.rail .rtab .rtip{position:absolute;left:50px;top:50%;transform:translateY(-50%);
  background:var(--panel3);border:1px solid var(--border2);color:var(--txt);font-size:12.5px;
  padding:4px 9px;border-radius:7px;white-space:nowrap;opacity:0;pointer-events:none;
  transition:opacity .12s;z-index:60}
.rail .rtab:hover .rtip{opacity:1}
.rail .rtab .rb{position:absolute;top:5px;right:5px;min-width:8px;height:8px;border-radius:8px;
  background:var(--err);box-shadow:0 0 0 2px var(--rail-bg)}

.sidebar{left:var(--rail-w);width:var(--navcol-w)}
.brand{padding:14px 16px 11px}
.brand b{font-size:15px;min-width:0}
.brand b>span:first-child{display:block;font-size:15px;font-weight:700;color:#eef3fa;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.brand b>span+span{font-size:11.5px}
.nav{padding:2px 10px 16px}
.nav .grp{font-size:12px;font-weight:600;letter-spacing:.08em;margin:13px 8px 5px;
  color:var(--faint);border-bottom:0;padding-bottom:2px}
.nav a{padding:8px 11px;font-size:13.5px;gap:9px}
.nav a .ic{width:20px;font-size:14.5px}
.main{margin-left:calc(var(--rail-w) + var(--navcol-w))}

.tabbar{display:none}

@media (max-width:900px){
  .rail{display:none}
  .sidebar{left:0;width:min(80vw,292px)}
  .main{margin-left:0}
  .brand b>span:first-child{font-size:14.5px}
  .tabbar{display:flex;position:fixed;left:0;right:0;bottom:0;height:54px;z-index:44;
    background:rgba(10,13,18,.97);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:var(--rail-fg);font-size:10.5px;cursor:pointer}
  .tabbar .tb .ic{font-size:19px;line-height:1}
  .tabbar .tb.on{color:var(--accent)}
  .content{padding-bottom:76px}
}
html.light .rail{--rail-bg:#f2f2f2;--rail-fg:#6b6b6b}
html.light .rail .rtab:hover{background:rgba(0,0,0,.05);color:#191919}
html.light .tabbar{background:rgba(247,247,247,.98)}

/* =====================================================================
 * 云朵备份风格报表组件（.rp-*）
 * 参考 CloudBak Pro「聊天报表」的观感：纯白卡片 + 1px 浅描边（**不用阴影**）
 *   · 顶部「大数字 + 标签」概览卡（一行 3 个，数字 31px/600，不做环比/趋势）
 *   · 细分指标块（数字 + 标签）
 *   · 横向进度条（轨道 8px / 填充绿）
 *   · 紧凑排行表（行分隔用浅边框，不用斑马纹）
 *   · <details>「查看数据表」折叠原始数据
 * CloudBak 只有浅色；这里按同一语义给深色主题也配一份 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:#e2e9e4;
  --rp-num:#203c2b;--rp-num2:#385341;--rp-mut:#7a887f;
  --rp-track:#edf3ef;--rp-bar:#079b5a;--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:10px;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:10px;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:10px;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}
@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}
}


