/* ============================================================
   TBwork · 一站式企业管理系统 — 高保真设计系统 v2.0
   配色基准：社媒矩阵 (sns) 靛蓝体系 #3b30e8
   ============================================================ */

/* ---------- 1. 设计令牌 ---------- */
:root{
  /* 品牌色 */
  --brand:#3b30e8;
  --brand-hover:#4d43ea;
  --brand-deep:#2f26c4;
  --brand-shadow:rgba(59,48,232,.22);
  /* 渐变的亮端原来是 #7b6bf5，白字压上去只有 3.99:1，不达 AA——
     而 hero 上的 KPI 数字正好落在这一端。把亮端从 #7b6bf5 收到 #6459e8：
     还是同一条紫色轴，渐变的方向感一点没丢，但整条带上白字最低也有 5.08:1。
     顺带 hero 里那个 opacity:.86 的副标签也跟着安全了。 */
  --brand-gradient:linear-gradient(135deg,#3b30e8 0%,#5347ec 55%,#6459e8 100%);

  /* 中性灰阶 */
  --text-dark:#0f172a;
  --text-mid:#334155;
  --sidebar-text:#475569;
  --text-soft:#4d5b70;   /* 6.89:1 -- 原 #64748b 只有 4.76，与 faint 挤在一起 */
  --text-faint:#64748b;  /* 4.76:1 -- 原 #94a3b8 是 2.56:1，全站 1054 条对比度失败的唯一来源 */
  --border:#e4e8ee;          /* 比 slate-200 少一点蓝，不那么「冷白」 */
  --border-soft:#eef1f5;     /* 静置卡片用的克制发丝线；定义感交给阴影的贴地层 */
  --border-strong:#d7dde6;   /* 需要明确边界时（输入框、分隔）才升到这一级 */
  --bg-page:#f8fafc;
  --bg-soft:#f8fafc;
  --bg-soft2:#f1f5f9;
  --sidebar-bg:#f1f3f9;
  --surface:#ffffff;

  /* 语义色 */
  /* 语义色的文字值全部压深：淡底 + 深字，而不是高饱和底 + 中饱和字。
     原来三档标签在自己的底色上分别只有 3.58 / 3.07 / 4.41 : 1，全部不达 AA，
     而且六张卡一字排开时像一排霓虹灯。底色不动，只把字压深。 */
  --success:#047857; --success-bg:#ecfdf5; --success-border:#a7f3d0;
  --warn:#b45309;    --warn-bg:#fffbeb;    --warn-border:#fde68a;
  --danger:#b91c1c;  --danger-bg:#fef2f2;  --danger-border:#fecaca;
  --info-bg:#eef2ff; --info-border:#e0e7ff;

  /* 系统识别色 */
  --sys-wa:#3b30e8; --sys-sns:#7b6bf5; --sys-geo:#0891b2;
  --sys-biz:#059669; --sys-bg:#db2777; --sys-kb:#d97706;
  /* 2026-10-29：LBS 获客用自己的青绿。跟 geo 的 #0891b2 是同一条冷色轴，
     但更深一档（#0d9488）——两个系统在入口页并排出现时得一眼分得开。 */
  --sys-lbs:#0d9488;

  /* 间距 */
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px;
  --sp-5:20px; --sp-6:24px; --sp-8:32px;

  /* 圆角 */
  --radius-sm:8px; --radius-md:12px; --radius-lg:16px;
  --radius-xl:20px; --radius-pill:999px;

  /* 阴影 */
  /* 双层阴影：贴地层（1-2px、偏实）+ 环境层（大扩散、偏虚）。
     原来每级都是单层大模糊，渲染出来是一团均匀的灰雾——这正是「生硬无光泽」的成因：
     没有贴地层，卡片不像放在纸面上，像浮在一张灰纸上方。 */
  --sh-sm:0 1px 2px rgba(16,24,40,.05), 0 1px 3px rgba(16,24,40,.05);
  --sh-md:0 2px 4px -1px rgba(16,24,40,.05), 0 4px 12px -2px rgba(16,24,40,.08);
  --sh-lg:0 4px 8px -2px rgba(16,24,40,.06), 0 12px 24px -6px rgba(16,24,40,.10);
  --sh-brand:0 1px 2px rgba(16,24,40,.06), 0 3px 8px rgba(16,24,40,.10);
  /* 运动：曲线与时长收敛成令牌，不再每处手写。
     .16,1,.3,1 是指数级 ease-out（起步最快、末端长尾收住），
     与 Emil 标准里的 .23,1,.32,1 同族。UI 动效一律 <300ms。 */
  --ease-out-expo:cubic-bezier(.16,1,.3,1);
  --dur-fast:120ms; --dur-base:180ms; --dur-slow:240ms;

  /* 布局 */
  --topbar-h:60px;
  --sidebar-w:224px;
  --sidebar-w-collapsed:64px;
}

/* ---------- 2. 基础 ---------- */
*{box-sizing:border-box;}
html,body{margin:0;padding:0;}
body{
  font-family:"PingFang SC","Microsoft YaHei","Helvetica Neue",Arial,sans-serif;
  background:var(--bg-page);
  color:var(--text-mid);
  font-size:14px;
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
}
a{color:inherit;text-decoration:none;}
ul,ol{list-style:none;margin:0;padding:0;}
button{font-family:inherit;border:none;background:none;cursor:pointer;}
input,select,textarea{font-family:inherit;}
::-webkit-scrollbar{width:8px;height:8px;}
::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:999px;}
::-webkit-scrollbar-thumb:hover{background:#94a3b8;}
::-webkit-scrollbar-track{background:transparent;}
.material-symbols-outlined{
  font-variation-settings:'FILL' 0,'wght' 400,'GRAD' 0,'opsz' 22;
  vertical-align:middle;line-height:1;user-select:none;
}

/* ---------- 3. Topbar ---------- */
.topbar{
  position:fixed;top:0;left:0;right:0;height:var(--topbar-h);
  background:#fff;border-bottom:1px solid var(--border-soft);
  display:flex;align-items:center;justify-content:space-between;
  padding:0 18px;z-index:200;
}
.topbar-left{display:flex;align-items:center;gap:22px;min-width:0;}
.topbar-logo{display:flex;align-items:center;gap:10px;flex-shrink:0;}
.topbar-logo .mark{
  width:34px;height:34px;border-radius:10px;background:var(--brand);
  display:flex;align-items:center;justify-content:center;color:#fff;
  box-shadow:0 4px 10px var(--brand-shadow);transition:transform .15s;
}
.topbar-logo:hover .mark{transform:scale(1.05);}
.topbar-logo .name{font-weight:700;font-size:15px;color:var(--text-dark);white-space:nowrap;letter-spacing:-.01em;}
.topbar-logo .slogan{font-size:11px;color:var(--text-faint);font-weight:500;white-space:nowrap;}
.system-switcher{display:flex;align-items:center;gap:2px;overflow-x:auto;}
.system-switcher::-webkit-scrollbar{display:none;}
.system-switcher a{
  display:flex;align-items:center;gap:6px;padding:8px 11px;border-radius:10px;
  font-size:13px;font-weight:500;color:var(--sidebar-text);transition:all .15s;white-space:nowrap;
}
.system-switcher a .material-symbols-outlined{font-size:18px;}
.system-switcher a:hover{background:var(--bg-soft2);color:var(--text-dark);}
.system-switcher a.active{background:var(--brand);color:#fff;font-weight:600;box-shadow:var(--sh-brand);}
.topbar-right{display:flex;align-items:center;gap:2px;flex-shrink:0;}
.icon-btn{
  width:36px;height:36px;border-radius:10px;display:flex;align-items:center;justify-content:center;
  color:var(--text-soft);transition:all .15s;position:relative;
}
.icon-btn:hover{background:var(--bg-soft2);color:var(--text-dark);}
.icon-btn.active{background:var(--info-bg);color:var(--brand);}
.icon-btn .material-symbols-outlined{font-size:20px;}
.icon-btn-bal{width:auto;padding:0 10px 0 8px;gap:4px;}
.icon-btn-bal .bal{font-size:12.5px;font-weight:700;color:var(--text-dark);letter-spacing:-.01em;}
.icon-btn .badge{
  position:absolute;top:5px;right:5px;min-width:15px;height:15px;padding:0 4px;
  background:var(--danger);color:#fff;font-size:9px;font-weight:700;border-radius:999px;
  display:flex;align-items:center;justify-content:center;border:2px solid #fff;
}
.icon-btn-bal .badge{position:static;margin-left:2px;border:none;}
/* 通知中心下拉（依 9.6 Q-01）。挂在顶栏铃铛下面，不占页面正文——
   它只是提醒，不是第二个交接队列。 */
.notif-wrap{position:relative;display:flex;align-items:center;}
.notif-panel{
  position:absolute;top:44px;right:0;width:384px;max-width:calc(100vw - 24px);
  background:#fff;border:1px solid var(--border);border-radius:12px;
  box-shadow:0 12px 32px rgba(15,23,42,.14);z-index:60;overflow:hidden;
}
.notif-head{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:11px 14px;border-bottom:1px solid var(--border-soft);
}
.notif-head b{font-size:13px;color:var(--text-dark);}
.notif-list{max-height:min(62vh,430px);overflow-y:auto;}
.notif-item{
  display:block;padding:10px 14px 11px 26px;position:relative;
  border-bottom:1px solid var(--border-soft);transition:background .15s;
}
.notif-item:hover{background:var(--bg-soft);}
.notif-item .ni-top{display:flex;align-items:center;justify-content:space-between;gap:8px;}
.notif-item .ni-ev{font-size:12px;font-weight:700;color:var(--text-dark);}
.notif-item .ni-tm{font-size:11px;color:var(--text-faint);flex-shrink:0;}
.notif-item .ni-tx{font-size:12px;color:var(--text-soft);line-height:1.6;margin-top:3px;}
.notif-item .ni-sys{font-size:11px;color:var(--text-faint);margin-top:3px;}
.notif-item.is-unread::before{
  content:'';position:absolute;left:12px;top:16px;width:6px;height:6px;border-radius:50%;
  background:var(--danger);
}
.notif-item.is-unread .ni-ev{color:var(--brand);}
.notif-foot{
  padding:9px 14px;background:var(--bg-soft);font-size:11px;color:var(--text-faint);line-height:1.6;
}
.notif-empty{padding:26px 14px;text-align:center;font-size:12px;color:var(--text-faint);}

/* 权限矩阵里带补充说明的那一行（依 v4 9.4：GEO 本期外采、平台内仅占位页）。
   说明走 ::after，不进单元格文本——别处拿 td:first-child 的文本当系统名用。 */
td[data-perm-note]::after{
  content:attr(data-perm-note);margin-left:7px;padding:1px 6px;border-radius:999px;
  background:var(--bg-soft);color:var(--text-faint);font-size:10px;font-weight:600;
}

/* 成员表：可排序的表头、已禁用成员的折叠分组行（依 9.4 Q-05） */
.tbl-sort{cursor:pointer;border-bottom:1px dashed var(--border);}
.tbl-sort:hover{color:var(--brand);}
.tbl-sort.is-sorted{color:var(--brand);border-bottom-color:var(--brand);}
td.member-group-cell{background:var(--bg-soft);font-size:12px;}
.icon-btn-sm{
  width:24px;height:24px;border-radius:7px;display:inline-flex;align-items:center;justify-content:center;
  color:var(--text-faint);cursor:pointer;transition:all .15s;flex-shrink:0;
}
.icon-btn-sm:hover{background:var(--bg-soft2);color:var(--text-dark);}
.icon-btn-sm .material-symbols-outlined{font-size:16px;}
.topbar-divider{width:1px;height:24px;background:var(--border);margin:0 8px;}
.user-chip{display:flex;align-items:center;gap:8px;padding:5px 8px 5px 5px;border-radius:999px;cursor:pointer;transition:background .15s;}
.user-chip:hover{background:var(--bg-soft2);}
.user-avatar{width:28px;height:28px;border-radius:50%;background:var(--brand);color:#fff;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0;}
.user-chip .uname{font-size:13px;font-weight:600;color:var(--text-dark);}
.user-chip .material-symbols-outlined{font-size:18px;color:var(--text-faint);}

/* ---------- 顶栏用户块的下拉（设置 / 退出登录） ----------
   悬停即出；触屏没有 hover，键盘 Tab 进来要能开，所以另给 .open 与 :focus-within 两条。
   面板顶上写清「我是谁」——原来这套信息是一句 data-toast，点完就没了。 */
.user-menu{position:relative;display:flex;align-items:center;}
.user-menu:focus-within{outline:none;}
.user-menu-panel{
  display:none;position:absolute;top:calc(100% + 8px);right:0;width:238px;
  background:#fff;border:1px solid var(--border);border-radius:12px;
  box-shadow:0 12px 32px rgba(15,23,42,.14);z-index:70;padding:6px;
}
/* 鼠标从姓名走到面板中间会经过 8px 空白，那一段也得算在 hover 里，
   否则面板先消失，手指还没到「设置」上 */
.user-menu-panel::before{content:'';position:absolute;left:0;right:0;top:-10px;height:10px;}
.user-menu:hover .user-menu-panel,
.user-menu:focus-within .user-menu-panel,
.user-menu.open .user-menu-panel{display:block;animation:umIn .14s ease;}
@keyframes umIn{from{opacity:0;transform:translateY(-4px);}to{opacity:1;transform:none;}}
.um-head{
  display:flex;align-items:center;gap:10px;padding:9px 10px 10px;margin-bottom:5px;
  border-bottom:1px solid var(--border-soft);
}
.um-head .user-avatar{width:34px;height:34px;font-size:12px;}
.um-meta{display:flex;flex-direction:column;min-width:0;}
.um-meta b{font-size:13.5px;font-weight:700;color:var(--text-dark);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.um-meta span{font-size:11.5px;color:var(--text-faint);margin-top:2px;}
.um-list{display:flex;flex-direction:column;gap:1px;}
.um-item{
  display:flex;align-items:center;gap:9px;width:100%;padding:9px 10px;border-radius:9px;
  font-size:13px;color:var(--text-mid);text-align:left;transition:background .15s,color .15s;
}
.um-item .material-symbols-outlined{font-size:19px;color:var(--text-faint);transition:color .15s;}
.um-item em{margin-left:auto;font-style:normal;font-size:11px;color:var(--text-faint);}
.um-item:hover{background:var(--bg-soft2);color:var(--text-dark);}
.um-item:hover .material-symbols-outlined{color:var(--brand);}
.um-item.is-danger:hover{background:var(--danger-bg);color:var(--danger);}
.um-item.is-danger:hover .material-symbols-outlined{color:var(--danger);}

/* ---------- 账号设置抽屉（右侧滑出，内容由 app.js 的 userSetRender 画） ---------- */
.us-hero{
  display:flex;align-items:center;gap:12px;padding:12px 13px;margin-bottom:16px;
  background:var(--bg-soft);border-radius:11px;
}
.us-hero .us-av{width:44px;height:44px;font-size:14px;}
.us-hero-t{display:flex;align-items:center;flex-wrap:wrap;gap:0 8px;min-width:0;}
.us-hero-t b{font-size:15px;font-weight:700;color:var(--text-dark);}
.us-hero-t .us-role{font-weight:600;}
.us-hero-d{flex:0 0 100%;font-size:11.5px;color:var(--text-faint);margin-top:4px;}
.us-sect{
  display:flex;align-items:center;gap:6px;margin:0 0 12px;
  font-size:12.5px;font-weight:700;color:var(--text-dark);
}
.us-sect .material-symbols-outlined{font-size:17px;color:var(--text-faint);}
.us-sect:not(:first-of-type){margin-top:6px;padding-top:14px;border-top:1px solid var(--border-soft);}
.us-sw-row{border-bottom:none;padding:0 0 12px;}
.us-note{
  padding:9px 11px;background:var(--bg-soft);border-radius:9px;
  font-size:11.5px;color:var(--text-faint);line-height:1.6;
}

/* ---------- 4. Shell / Sidebar ---------- */
.app-shell{display:flex;padding-top:var(--topbar-h);min-height:100vh;}
.sidebar{
  position:fixed;top:var(--topbar-h);left:0;bottom:0;width:var(--sidebar-w);
  background:var(--sidebar-bg);border-right:1px solid var(--border-soft);
  padding:12px 10px;overflow-y:auto;display:flex;flex-direction:column;
  transition:width .2s ease;z-index:150;
}
body.sidebar-collapsed .sidebar{width:var(--sidebar-w-collapsed);padding:12px 8px;}
body.sidebar-collapsed .main{margin-left:var(--sidebar-w-collapsed);}
body.sidebar-collapsed .sidebar-item span:not(.material-symbols-outlined),
body.sidebar-collapsed .sidebar-group-title,
body.sidebar-collapsed .sidebar-note{display:none;}
body.sidebar-collapsed .sidebar-item{justify-content:center;padding:9px 0;}
.sidebar-group-title{
  padding:14px 10px 6px;font-size:11px;font-weight:700;color:var(--text-faint);
  text-transform:uppercase;letter-spacing:.06em;
}
.sidebar-group-title:first-child{padding-top:4px;}
.sidebar-item{
  display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:10px;
  font-size:13.5px;font-weight:500;color:var(--sidebar-text);margin-bottom:2px;transition:all .15s;
}
.sidebar-item .material-symbols-outlined{font-size:19px;color:var(--text-faint);flex-shrink:0;}
.sidebar-item:hover{background:rgba(148,163,184,.16);color:var(--text-dark);}
.sidebar-item:hover .material-symbols-outlined{color:var(--text-soft);}
.sidebar-item.active{background:var(--brand);color:#fff;font-weight:600;box-shadow:var(--sh-brand);}
.sidebar-item.active .material-symbols-outlined{color:#fff;}
.sidebar-item .count{margin-left:auto;font-size:11px;font-weight:700;background:rgba(148,163,184,.2);padding:1px 6px;border-radius:999px;color:var(--text-soft);}
.sidebar-item.active .count{background:rgba(255,255,255,.25);color:#fff;}
.sidebar-spacer{flex:1;}
.sidebar-note{
  margin:12px 6px 4px;padding:11px;background:#fff;border:1px solid var(--border-soft);
  border-radius:10px;font-size:11.5px;color:var(--text-soft);line-height:1.65;
}
.sidebar-note .material-symbols-outlined{font-size:14px;color:var(--brand);}
.sidebar-toggle{
  display:flex;align-items:center;justify-content:center;gap:8px;padding:8px;margin-top:4px;
  border-radius:9px;color:var(--text-faint);font-size:12px;transition:all .15s;
}
.sidebar-toggle:hover{background:rgba(148,163,184,.16);color:var(--text-dark);}
.sidebar-toggle .material-symbols-outlined{font-size:18px;transition:transform .2s;}
body.sidebar-collapsed .sidebar-toggle .material-symbols-outlined{transform:rotate(180deg);}
body.sidebar-collapsed .sidebar-toggle span:not(.material-symbols-outlined){display:none;}

/* ---------- 5. Main ---------- */
.main{
  flex:1;margin-left:var(--sidebar-w);padding:20px 26px 60px;min-width:0;
  transition:margin-left .2s ease,opacity .12s ease;
}
.main.full{margin-left:0;}
.main.wide{max-width:1560px;}
/* 无侧边栏时内容整体居中 */
.main.full.wide{margin-left:auto;margin-right:auto;}
.main.flush{padding:0;}
.main.is-swapping{opacity:0;}

/* SPA 导航顶部进度条 */
#novaProgress{
  position:fixed;top:0;left:0;height:2.5px;width:0;background:var(--brand);
  z-index:1000;opacity:0;box-shadow:0 0 8px var(--brand-shadow);pointer-events:none;
}

.breadcrumb{font-size:12px;color:var(--text-faint);margin-bottom:8px;display:flex;align-items:center;gap:4px;}
.breadcrumb .material-symbols-outlined{font-size:14px;}
.breadcrumb a:hover{color:var(--brand);}

.page-head{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:20px;flex-wrap:wrap;gap:16px;}
.page-head.sticky{
  position:sticky;top:var(--topbar-h);z-index:120;
  background:var(--bg-page);margin:0 -26px 20px;padding:20px 26px 16px;
  border-bottom:1px solid var(--border-soft);
}
.spin-steps-sticky{
  /* 96 → 76：页头说明收进 ⓘ 之后，粘性页头矮了 20px（2026-09-03） */
  position:sticky;z-index:110;top:calc(var(--topbar-h) + 76px);
  background:var(--bg-page);margin:0 -26px;padding:16px 26px 4px;
}
.page-title{font-size:24px;line-height:32px;font-weight:700;color:var(--text-dark);margin:0;letter-spacing:-.02em;}
/* 页面说明：不再常驻，收进标题旁的 ⓘ，悬停或点击展开（2026-09-03）。
   ⓘ 放在 h1 外面：h1 的文本就是页面标题本身，不掺图标字。 */
.page-title-wrap{position:relative;min-width:0;}
.page-title-row{display:flex;align-items:center;gap:6px;}
.page-info{
  width:22px;height:22px;border:none;background:transparent;border-radius:6px;padding:0;cursor:pointer;
  color:var(--text-faint);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;
}
.page-info .material-symbols-outlined{font-size:18px;}
.page-info:hover,.page-title-wrap.open .page-info{color:var(--brand);background:var(--info-bg);}
.page-desc{
  display:none;position:absolute;left:0;top:calc(100% + 6px);z-index:130;
  width:max-content;max-width:min(560px,calc(100vw - 80px));
  font-size:13px;line-height:20px;color:var(--text-mid);margin:0;padding:10px 12px;
  background:#fff;border:1px solid var(--border);border-radius:10px;box-shadow:var(--sh-md);
}
.page-title-wrap:hover .page-desc,.page-title-wrap.open .page-desc{display:block;}
.page-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
/* 页头右侧的账户余额（2026-09-22，账单记录开始用）：一个只读的读数，不是按钮，
   但高度、圆角、描边都跟着旁边的 .btn 走，两者并排才不像两套东西。
   点了去充值中心——跟顶栏那一格的去处一致。 */
.page-bal{
  display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 14px;
  border:1px solid var(--border);border-radius:10px;background:#fff;
  font-size:12.5px;color:var(--text-soft);text-decoration:none;white-space:nowrap;
  transition:all .15s;
}
.page-bal .material-symbols-outlined{font-size:17px;color:var(--text-faint);}
.page-bal b{font-size:14px;font-weight:800;color:var(--text-dark);letter-spacing:-.01em;}
.page-bal:hover{border-color:var(--brand);color:var(--brand);}
.page-bal:hover b,.page-bal:hover .material-symbols-outlined{color:var(--brand);}

/* ---------- 6. 按钮 ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:9px 16px;
  border-radius:10px;font-size:13px;font-weight:600;cursor:pointer;
  border:1px solid transparent;transition:all .15s;white-space:nowrap;
}
.btn .material-symbols-outlined{font-size:17px;}
.btn-primary{background:var(--brand);color:#fff;box-shadow:var(--sh-brand);}
.btn-primary:hover{background:var(--brand-hover);transform:translateY(-1px);}
.btn-primary:active{transform:translateY(0);}
.btn-ghost{background:#fff;color:var(--text-mid);border-color:var(--border);}
.btn-ghost:hover{background:var(--bg-soft2);color:var(--text-dark);}
.btn-soft{background:var(--info-bg);color:var(--brand);}
.btn-soft:hover{background:var(--info-border);}
.btn-danger{background:var(--danger);color:#fff;}
.btn-danger:hover{filter:brightness(1.08);}
.btn-sm{padding:6px 12px;font-size:12px;border-radius:8px;}
.btn-sm .material-symbols-outlined{font-size:15px;}
.btn-lg{padding:11px 22px;font-size:14px;}
.btn-block{width:100%;}
.btn-link{color:var(--brand);font-weight:600;padding:0;background:none;}
.btn-link:hover{text-decoration:underline;}
.btn:disabled,.btn.disabled{opacity:.5;cursor:not-allowed;pointer-events:none;}

/* ---------- 7. 卡片 / 栅格 ---------- */
.card{background:#fff;border:1px solid var(--border-soft);border-radius:var(--radius-lg);padding:20px;box-shadow:0 1px 2px rgba(15,23,42,.05);}
.card.pad-sm{padding:16px;}
.card.pad-sm .table-wrap{margin:0 -16px;padding:0 16px;}
.card.pad-0{padding:0;overflow:hidden;}
.card-title{font-size:15px;line-height:22px;font-weight:600;color:var(--text-dark);margin:0;display:flex;align-items:center;gap:8px;}
.card-title .material-symbols-outlined{font-size:19px;color:var(--brand);}
.card-sub{font-size:12px;line-height:18px;color:var(--text-faint);margin:4px 0 0;}
.card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:16px;}
.card-head-actions{display:flex;gap:6px;align-items:center;flex-shrink:0;}
.card-body{}
.card-foot{margin-top:14px;padding-top:12px;border-top:1px solid var(--border-soft);display:flex;justify-content:space-between;align-items:center;}

.grid{display:grid;gap:14px;}
.grid-2{grid-template-columns:repeat(2,minmax(0,1fr));}
.grid-3{grid-template-columns:repeat(3,minmax(0,1fr));}
.grid-4{grid-template-columns:repeat(4,minmax(0,1fr));}
.grid-5{grid-template-columns:repeat(5,minmax(0,1fr));}
.grid-6{grid-template-columns:repeat(6,minmax(0,1fr));}
.span-2{grid-column:span 2;}
.span-3{grid-column:span 3;}
.span-4{grid-column:span 4;}
.row{display:flex;gap:14px;flex-wrap:wrap;}
.row-between{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;}
.row-center{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.section{margin-bottom:20px;}
/* 数据看板的筛选条：它控制这一页所有内容，滚动时该一直在。
   原来是一张整卡（113px），压成一条之后省下 ~57px 给下面的数据表。
   sticky 顶到顶栏下沿，不盖住它。 */
.dash-filterbar{position:sticky;top:calc(var(--topbar-h) + 8px);z-index:20;
  display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
  background:var(--bg-soft);border:1px solid var(--border-soft);
  border-radius:var(--radius-md);padding:8px 12px;}
.dash-filterbar .chip-group{margin:0;}
/* 漏斗 + ROI 对比这一排与上面的维度明细表之间留出距离：
   页签面板没有下外边距，紧贴着会让人以为这两张图还属于那张表。
   它们是看完明细之后的下一层问题（人在哪一步流失 / 钱花在哪儿划算），
   拉开一档间距把这个层次说出来。 */
.dash-charts{margin-top:32px;}
.dash-filterbar select{height:30px;padding:0 26px 0 8px;font-size:12px;}
@media (max-width:900px){.dash-filterbar{position:static;}}
/* 栅格分栏内部的最后一个区块不再拖尾边距，避免列底部多出一截空白 */
.split > div > .section:last-child,
.grid > div > .section:last-child{margin-bottom:0;}
.flex-1{flex:1;min-width:0;}
@media(max-width:1280px){
  .grid-5,.grid-6{grid-template-columns:repeat(3,minmax(0,1fr));}
}
@media(max-width:1100px){
  .grid-3,.grid-4,.grid-5,.grid-6{grid-template-columns:repeat(2,minmax(0,1fr));}
  .span-2,.span-3,.span-4{grid-column:span 2;}
}

/* ---------- 8. KPI ---------- */
.kpi{background:#fff;border:1px solid var(--border-soft);border-radius:var(--radius-md);padding:18px 20px;box-shadow:0 1px 2px rgba(15,23,42,.05);transition:all .15s;display:flex;flex-direction:column;}
.kpi:hover{box-shadow:var(--sh-md);transform:translateY(-1px);}
.kpi-label{font-size:12px;line-height:18px;color:var(--text-soft);font-weight:500;display:flex;align-items:center;gap:6px;margin-bottom:6px;}
.kpi-label .material-symbols-outlined{font-size:16px;color:var(--text-faint);}
.kpi-value{font-size:30px;line-height:38px;font-weight:700;color:var(--text-dark);letter-spacing:-.025em;font-variant-numeric:tabular-nums;}
.kpi-value .unit{font-size:13px;font-weight:600;color:var(--text-soft);margin-left:2px;}
.kpi-trend{font-size:12px;line-height:18px;font-weight:600;margin-top:6px;display:flex;align-items:center;gap:3px;}
.kpi-trend.up{color:var(--success);}
.kpi-trend.down{color:var(--danger);}
.kpi-trend.flat{color:var(--text-faint);}
.kpi-trend .material-symbols-outlined{font-size:14px;}
.kpi-trend .cmp{color:var(--text-faint);font-weight:500;margin-left:2px;}
.kpi-hint{font-size:11.5px;line-height:16px;color:var(--text-faint);margin-top:8px;padding-top:8px;border-top:1px dashed var(--border-soft);}
/* KPI 副说明：一行短说明，让同一行的几张卡内容等量、底部对齐（对齐参考站 workbench） */
.kpi-sub{font-size:12px;line-height:18px;color:var(--text-soft);margin-top:4px;}
/* KPI 迷你趋势图 */
.kpi-spark{margin-top:auto;padding-top:12px;height:52px;}
.kpi-spark svg{display:block;width:100%;height:40px;}
/* 工作台「今日业务汇报」正文：段落之间统一 12px，最后一段不留底边 */
.wb-report{font-size:14px;line-height:1.9;color:var(--text-mid);}
.wb-report p{margin:0 0 12px;}
.wb-report p:last-child{margin-bottom:0;}
.kpi.accent{border-left:3px solid var(--brand);}
.kpi-clickable{cursor:pointer;}
.kpi-clickable.active{border-color:var(--brand);background:var(--info-bg);box-shadow:0 0 0 1px var(--brand) inset;}
.kpi-clickable.active .kpi-label,.kpi-clickable.active .kpi-value{color:var(--brand);}
.kpi-clickable.active .kpi-label .material-symbols-outlined{color:var(--brand);}

/* 迷你统计行 */
.stat-row{display:flex;justify-content:space-between;align-items:center;padding:9px 0;border-bottom:1px solid var(--border-soft);}
.stat-row:last-child{border-bottom:none;}
.stat-row .l{font-size:12.5px;color:var(--text-soft);display:flex;align-items:center;gap:6px;}
.stat-row .l .material-symbols-outlined{font-size:16px;color:var(--text-faint);}
.stat-row .v{font-size:15px;font-weight:700;color:var(--text-dark);}
.stat-row.clickable{cursor:pointer;border-radius:8px;padding:9px 8px;margin:0 -8px;}
.stat-row.clickable:hover{background:var(--bg-soft);}
/* stat-row 也可以是一个链接（智能体配置项、WA 待办事项都用到）：
   去掉 a 的默认下划线与颜色，其余样式与普通 stat-row 一致。 */
a.stat-row{text-decoration:none;color:inherit;}

/* ---------- 9. 表格 ---------- */
.wa-total-row td{background:var(--bg-soft);font-weight:700;border-top:1px solid var(--border);}
.table-wrap{overflow-x:auto;margin:0 -20px;padding:0 20px;}
.card.pad-0 .table-wrap{margin:0;padding:0;}
table{width:100%;border-collapse:collapse;font-size:13px;}
th{
  text-align:left;padding:10px 12px;color:var(--text-faint);font-weight:600;font-size:11.5px;
  text-transform:uppercase;letter-spacing:.03em;border-bottom:1px solid var(--border);white-space:nowrap;
  background:transparent;
}
td{padding:11px 12px;border-bottom:1px solid var(--border-soft);color:var(--text-mid);white-space:nowrap;vertical-align:middle;}
tr:last-child td{border-bottom:none;}
tbody tr{transition:background .12s;}
tbody tr:hover{background:var(--bg-soft);}
tbody tr.selected{background:var(--info-bg);}
td.strong{font-weight:600;color:var(--text-dark);}
td.num{font-variant-numeric:tabular-nums;font-weight:600;color:var(--text-dark);}
td.wrap{white-space:normal;min-width:200px;}
.table-actions{display:flex;gap:6px;}
/* 表格勾选列 + 批量操作条（2026-09-03）。
   起因：公海客户那三个「批量…」按钮要求先选客户，而表里根本没有勾选框。
   操作条做成浮在底部的一条，不放表头——选中发生在你滚到的那一行，
   动作却在表头的话，选第 400 行要滚回第 1 行才点得到。 */
th.pick-col,td.pick-col{width:38px;padding-left:16px;padding-right:0;}
.pick{display:inline-flex;align-items:center;cursor:pointer;position:relative;}
.pick input{position:absolute;opacity:0;width:0;height:0;}
.pick span{
  width:16px;height:16px;border:1.5px solid var(--border);border-radius:4px;background:#fff;
  display:inline-block;position:relative;transition:all .12s;
}
.pick input:checked + span{background:var(--brand);border-color:var(--brand);}
.pick input:checked + span::after{
  content:'';position:absolute;left:4.5px;top:1px;width:4px;height:8px;
  border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg);
}
.pick input:indeterminate + span{background:var(--brand);border-color:var(--brand);}
.pick input:indeterminate + span::after{
  content:'';position:absolute;left:3px;top:6px;width:8px;height:2px;background:#fff;
}
.pick input:focus-visible + span{outline:2px solid var(--brand);outline-offset:2px;}
.bulk-dock{
  position:fixed;left:50%;transform:translateX(-50%);bottom:20px;z-index:150;
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  background:var(--text-dark);color:#fff;border-radius:12px;padding:10px 14px;
  box-shadow:0 8px 28px rgba(15,23,42,.28);font-size:12.5px;
}
.bulk-dock .bd-n{font-weight:700;}
.bulk-dock .bd-scope{opacity:.7;font-size:11.5px;}
.bulk-dock .btn{height:30px;padding:0 12px;font-size:12px;}
.bulk-dock .bd-clear{color:#fff;opacity:.75;cursor:pointer;text-decoration:underline;}
.bulk-dock .bd-clear:hover{opacity:1;}
body.has-bulk-dock .main{padding-bottom:70px;}
.tbl-link{color:var(--brand);font-weight:600;cursor:pointer;}
.tbl-link:hover{text-decoration:underline;}

/* ---------- 10. 标签 / 徽章 ---------- */
/* quieter：标签的三条改动。
   1) 字重 600 -> 550 等效（用 590 会掉回 600，直接写 600 保留，改的是字号与内距）；
      真正让它安静下来的是颜色，不是字重。
   2) 内距 3/9 -> 3/8，圆角保持药丸形——这是品类惯例，不动。
   3) 加一圈同色系的 1px 内描边（8% 混色）：底色可以更淡，
      定义感由描边接管。原来靠「够深的底色」来站住，那正是霓虹感的来源。
   文字颜色已在令牌层压深（见 --success / --warn / --danger），三档现在都过 AA。 */
.tag{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;border-radius:999px;
  font-size:11.5px;font-weight:600;line-height:1.45;white-space:nowrap;
  box-shadow:inset 0 0 0 1px color-mix(in oklab, currentColor 12%, transparent);}
.tag .material-symbols-outlined{font-size:13px;}
.tag-brand{background:var(--info-bg);color:var(--brand);}
.tag-success{background:var(--success-bg);color:var(--success);}
.tag-warn{background:var(--warn-bg);color:var(--warn);}
.tag-danger{background:var(--danger-bg);color:var(--danger);}
.tag-gray{background:var(--bg-soft2);color:var(--text-soft);}

/* ---------- 意向等级 / 背调评级 / 客户标签：三套互不共用的样式 ----------
   2026-09-16：三者原来共用通用 tag 色板，于是「L4 绿」与「优质客户 绿」
   在同一行里长得一模一样，看的人分不出哪个是「想不想买」、哪个是「靠不靠谱」。
   现在各自一套：
     · 意向等级 —— 冷暖渐进（L1 灰 → L2 蓝 → L3 橙浅 → L4 橙）。它是一根有序的轴，
       颜色本身要能读出高低，所以不能用语义色（绿=好、红=坏）。
     · 背调评级 —— 语义色（优质绿 / 合格蓝 / 待核实黄 / 高风险红）。它是分类不是排序，
       每一档各自有好坏含义。
     · 客户标签 —— 描述性、可多值，一律低饱和；AI 打的虚线框、人确认或补打的实线框。 */
.tag-intent-1{background:var(--bg-soft2);color:var(--text-soft);box-shadow:none;}
.tag-intent-2{background:#eef2ff;color:#3730a3;
  box-shadow:inset 0 0 0 1px color-mix(in oklab, #3730a3 14%, transparent);}
.tag-intent-3{background:#fff7ed;color:#c2410c;
  box-shadow:inset 0 0 0 1px color-mix(in oklab, #c2410c 14%, transparent);}
.tag-intent-4{background:#ffedd5;color:#9a3412;font-weight:700;
  box-shadow:inset 0 0 0 1px color-mix(in oklab, #9a3412 26%, transparent);}

.tag-bgg-premium{background:var(--success-bg);color:var(--success);
  box-shadow:inset 0 0 0 1px var(--success-border);}
.tag-bgg-qualified{background:var(--info-bg);color:var(--brand);
  box-shadow:inset 0 0 0 1px color-mix(in oklab, var(--brand) 22%, transparent);}
.tag-bgg-unverified{background:var(--warn-bg);color:var(--warn);
  box-shadow:inset 0 0 0 1px var(--warn-border);}
.tag-bgg-risky{background:var(--danger-bg);color:var(--danger);
  box-shadow:inset 0 0 0 1px var(--danger-border);}
.tag-bgg-custom{background:var(--bg-soft2);color:var(--text-soft);box-shadow:none;}

/* 客户标签：实线框 = 人确认过或人补打的，虚线框 = AI 打的还没人看过。
   两者的差别必须一眼看得出来——「AI 说他是经销商」和「我确认他是经销商」
   在决定发什么内容的时候完全不是一回事。 */
.cust-tag{display:inline-flex;align-items:center;gap:3px;padding:2px 8px;border-radius:999px;
  font-size:11.5px;font-weight:600;line-height:1.45;white-space:nowrap;
  background:var(--bg-soft);color:var(--text-soft);border:1px solid var(--border);box-shadow:none;}
.cust-tag.ct-ai{border:1px dashed var(--brand);color:var(--brand);background:var(--info-bg);}
.cust-tag .ct-dim{font-size:10px;color:var(--text-faint);font-weight:500;}
.cust-tag-row{display:inline-flex;gap:4px;flex-wrap:wrap;align-items:center;}
/* 标签维护面板里每一行标签后面的三个动作 */
.ct-act{font-size:11px;margin-left:6px;cursor:pointer;color:var(--brand);}
.ct-act.ct-del{color:var(--danger);}
.ct-dim-group{margin-bottom:10px;}
.ct-dim-title{font-size:12px;font-weight:700;color:var(--text-dark);margin-bottom:6px;}

/* 中性标签不需要描边：灰底本身已经足够安静，再加一圈反而变脏 */

.tag-gray,.tag-outline{box-shadow:none;}
.tag-outline{background:#fff;border:1px solid var(--border);color:var(--text-soft);}
.dot{width:6px;height:6px;border-radius:50%;display:inline-block;flex-shrink:0;}
.dot-success{background:var(--success);}
.dot-warn{background:var(--warn);}
.dot-danger{background:var(--danger);}
.dot-brand{background:var(--brand);}
.dot-gray{background:var(--text-faint);}
.pulse{animation:pulse 1.8s infinite;}
@keyframes pulse{0%,100%{opacity:1;}50%{opacity:.35;}}

/* ---------- 11. Tabs ---------- */
.tabs{display:flex;border-bottom:1px solid var(--border);margin-bottom:16px;gap:0;overflow-x:auto;}
.tabs::-webkit-scrollbar{display:none;}
.tab{
  padding:10px 2px;margin-right:24px;font-size:13.5px;font-weight:600;color:var(--text-faint);
  border-bottom:2px solid transparent;cursor:pointer;transition:all .15s;white-space:nowrap;
}
.tab:hover{color:var(--text-mid);}
.tab.active{color:var(--brand);border-color:var(--brand);}
.tab .cnt{font-size:11px;background:var(--bg-soft2);padding:1px 6px;border-radius:999px;margin-left:5px;}
.tab.active .cnt{background:var(--info-bg);color:var(--brand);}
.tab-pane{display:none;}
.tab-pane.active{display:block;}

/* 胶囊分段控件 */
.segment{display:inline-flex;background:var(--bg-soft2);border:1px solid var(--border);border-radius:999px;padding:3px;gap:2px;}
.segment button{padding:5px 14px;border-radius:999px;font-size:12px;font-weight:600;color:var(--text-soft);transition:all .15s;}
.segment button.active{background:var(--brand);color:#fff;box-shadow:0 1px 4px var(--brand-shadow);}
.segment button:not(.active):hover{color:var(--text-dark);}

/* ---------- 12. 表单 ---------- */
.field{margin-bottom:14px;}
.field:last-child{margin-bottom:0;}
.field label{display:block;font-size:12.5px;font-weight:600;color:var(--text-mid);margin-bottom:6px;}
.field label .req{color:var(--danger);margin-left:2px;}

/* 全局 select 基础样式：保证不论出现在 .field / .toolbar 还是任意容器（如 .cal-toolbar、
   .row-center 里的裸 select）都有一致外观，不回退到浏览器原生样式 */
select{
  appearance:none;-webkit-appearance:none;-moz-appearance:none;
  padding:8px 30px 8px 12px;border:1px solid var(--border);border-radius:9px;
  font-size:12.5px;font-family:inherit;color:var(--text-mid);background:#fff;
  cursor:pointer;transition:all .15s;
  background-image:url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
  background-repeat:no-repeat;background-position:right 8px center;background-size:16px;
}
select:hover{border-color:#cbd5e1;}
select:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(59,48,232,.1);}

/* 全局 input / textarea 基础样式：同上，避免只在 .field 里才生效，
   裸放在卡片、div 里的输入框/文本域也要有一致外观 */
input[type=text],input[type=number],input[type=date],input[type=time],
input[type=email],input[type=password]{
  padding:9px 12px;border:1px solid var(--border);border-radius:9px;font-size:13px;
  color:var(--text-dark);background:#fff;font-family:inherit;transition:all .15s;
}
input[type=text]:focus,input[type=number]:focus,input[type=date]:focus,input[type=time]:focus,
input[type=email]:focus,input[type=password]:focus{
  outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(59,48,232,.12);
}
textarea{
  display:block;width:100%;padding:9px 12px;border:1px solid var(--border);border-radius:9px;font-size:13px;
  color:var(--text-dark);background:#fff;font-family:inherit;line-height:1.6;
  resize:vertical;min-height:78px;transition:all .15s;
}
textarea:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(59,48,232,.12);}
textarea::placeholder,input::placeholder{color:var(--text-faint);}

.field input[type=text],.field input[type=number],.field input[type=date],.field input[type=time],
.field input[type=email],.field input[type=password],.field select,.field textarea{
  width:100%;padding:9px 12px;border:1px solid var(--border);border-radius:9px;font-size:13px;
  color:var(--text-dark);background:#fff;transition:all .15s;
}
.field select{padding-right:32px;}
.field input:focus,.field select:focus,.field textarea:focus{
  outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(59,48,232,.12);
}
.field input:disabled,.field textarea:disabled{background:var(--bg-soft2);color:var(--text-soft);cursor:not-allowed;}
.field textarea{resize:vertical;min-height:78px;line-height:1.6;}
.field-hint{font-size:11px;color:var(--text-faint);margin-top:5px;line-height:1.5;}
.field-row{display:flex;gap:10px;align-items:flex-end;}
.field-row>.field{flex:1;margin-bottom:0;}
/* 「选择客群」那一行（向导页 / 新建运营动作 / 触发设置共用一份 HTML，见 csSegFieldHtml）。
   压成一行是因为「触发设置」弹窗有一条硬要求：不滚动就能看到最下面的 AI 文案指令
   （_shot_actiontrigger.js 量的是弹窗 scrollHeight == clientHeight），
   多占一整块 field（label+下拉+说明 ≈83px）就把那句挤到折叠线下面去了。 */
.seg-pick label{font-weight:600;color:var(--text-mid);white-space:nowrap;}
.seg-pick select{width:auto;max-width:230px;flex:1;min-width:120px;padding-top:6px;padding-bottom:6px;}
.seg-pick .text-faint{flex:1 1 100%;}
.input-group{display:flex;gap:8px;}
.input-group input{flex:1;}
.search-box{position:relative;}
.search-box .material-symbols-outlined{position:absolute;left:11px;top:50%;transform:translateY(-50%);font-size:18px;color:var(--text-faint);pointer-events:none;}
.search-box input{padding-left:36px !important;}

/* 下拉多选（.msel）：外观跟着 select，点开后选项就地往下展开、把后面的内容顶下去，
   不用绝对定位盖住——.modal 自己是 overflow-y:auto，悬浮面板在弹框底部会被裁一半。
   2026-10-20 起「新建运营动作」与「触发设置」里的五维圈选条件都用它（多选 + 「全部」互斥）。 */
.msel-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 14px;align-items:start;}
@media(max-width:820px){.msel-grid{grid-template-columns:1fr;}}
.msel-grid .field{margin-bottom:12px;}
.msel-box{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;
  padding:8px 10px;border:1px solid var(--border);border-radius:9px;background:#fff;
  font-size:12.5px;font-family:inherit;color:var(--text-mid);cursor:pointer;text-align:left;transition:all .15s;}
.msel-box:hover{border-color:#cbd5e1;}
.msel.open .msel-box{border-color:var(--brand);box-shadow:0 0 0 3px rgba(59,48,232,.1);}
.msel-box .msel-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.msel-box .material-symbols-outlined{font-size:18px;color:#94a3b8;flex:none;transition:transform .15s;}
.msel.open .msel-box .material-symbols-outlined{transform:rotate(180deg);}
.msel-pop{display:none;margin-top:6px;padding:5px;border:1px solid var(--border);
  border-radius:9px;background:#fff;box-shadow:0 8px 20px rgba(15,23,42,.08);
  max-height:186px;overflow-y:auto;}
.msel.open .msel-pop{display:block;}
.msel-opt{display:flex;align-items:center;gap:7px;padding:5px 7px;border-radius:7px;
  font-size:12.5px;font-weight:400;color:var(--text-mid);cursor:pointer;}
.msel-opt:hover{background:var(--bg-soft);}
.msel-opt input{width:14px;height:14px;margin:0;accent-color:var(--brand);cursor:pointer;}
.msel-opt.on{color:var(--brand);font-weight:600;}

/* 开关 */
.switch{width:38px;height:22px;border-radius:999px;background:var(--border);position:relative;cursor:pointer;display:inline-block;flex-shrink:0;transition:background .18s;}
.switch.on{background:var(--brand);}
.switch::after{content:'';position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:#fff;transition:left .18s;box-shadow:0 1px 3px rgba(0,0,0,.2);}
.switch.on::after{left:18px;}
/* 摆在那儿但拨不动的开关（会话级 AI 接待：拉黑 / 表单 / 授权异常 / 渠道未启用）：
   仍占同一格，点它给一句为什么，不是藏起来让人以为没有这颗控件。 */
.switch[data-off]{opacity:.45;cursor:not-allowed;}
.switch-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:12px 0;border-bottom:1px solid var(--border-soft);}
.switch-row:last-child{border-bottom:none;}
.switch-row .sr-t{font-size:13px;font-weight:600;color:var(--text-dark);}
.switch-row .sr-d{font-size:11.5px;color:var(--text-faint);margin-top:3px;line-height:1.55;}

/* 芯片 */
.chip{
  display:inline-flex;align-items:center;gap:5px;padding:6px 12px;border-radius:9px;
  background:var(--bg-soft2);color:var(--text-mid);font-size:12.5px;font-weight:500;
  border:1px solid var(--border);cursor:pointer;transition:all .15s;user-select:none;
}
.chip .material-symbols-outlined{font-size:15px;}
.chip:hover{border-color:#cbd5e1;}
.chip.active{background:var(--info-bg);color:var(--brand);border-color:var(--info-border);font-weight:600;}
/* 历史记录：跟它右边那排快捷提示词区分开——一个是打开面板，一组是填充输入框 */
.chip.chip-outline{background:transparent;color:var(--brand);border-color:var(--info-border);font-weight:600;margin-right:4px;}
.chip.chip-outline:hover{background:var(--info-bg);border-color:var(--brand);}
.chip-group{display:flex;gap:8px;flex-wrap:wrap;}

/* 业务工作台：协助事项图标磁贴网格（对齐参考站点 assistGrid 布局） */
/* align-content:start 是必须的：容器有 min-height（防布局位移）时，
   grid 默认会把多余高度平摊给各行，磁贴被拉成一格 120px。
   两者一起用的时候这个循环很隐蔽——先量到被拉高的值、再把它设成下限，越设越高。 */
.wb-assist-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:9px;align-content:start;}
.wb-assist-tile{text-align:left;padding:11px 12px;border:1px solid var(--border-soft);border-radius:10px;
  background:#fff;cursor:pointer;transition:all .15s;font:inherit;appearance:none;}
.wb-assist-tile:hover:not(.disabled){border-color:var(--brand);box-shadow:var(--sh-sm);transform:translateY(-1px);}
.wb-assist-tile.disabled{opacity:.5;cursor:not-allowed;}
/* 选中的类型：作为下方清单的筛选器高亮 */
.wb-assist-tile.active{border-color:var(--brand);background:var(--info-bg);box-shadow:0 0 0 1px var(--brand) inset;}
/* 背调清单：关键结论曾允许换行，否则 7 列在 1fr 栏里会撑出横向滚动。
   2026-09-24 删掉这三条按列序写的规则——它们已经全错了：
   ① 2026-09-03 这张表最左边加了勾选列，所有列整体右移一格，
      td:nth-child(3) 从「关键结论」变成了「国家」；
   ② td:first-child{min-width:160px} 于是落到勾选列上，把一个 38px 的
      勾选框撑成 160px；
   ③ td:last-child{white-space:normal} 让「操作」列（查看报告 / 建档）
      被挤到 29.7px，四个字竖着排一行一个，整行因此高 103px；
      表宽还比容器多 32px，「操作」列干脆被推到横向滚动之外。
   清单页 2026-08-27 已拆成独立整页（不再是 1fr 窄栏），这几条窄栏时代的
   补丁没有存在的理由：列宽交给浏览器按内容分，需要换行的单元格自己在
   生成侧挂 .wrap（见 p_portal_wa 的 BG_ROW_CELL_WRAP）。 */
#bgListWrap th,#bgListWrap td{padding-left:6px;padding-right:6px;}
#bgListWrap th:first-child,#bgListWrap td:first-child{padding-left:0;}
#bgListWrap th:last-child,#bgListWrap td:last-child{padding-right:0;}
/* 录入表单与右侧清单等高时，提交按钮吸到卡片底部 */
.bg-form-card{display:flex;flex-direction:column;}
.bg-form-card .bg-form-submit{margin-top:auto;padding-top:10px;}
.wb-assist-tile .row{display:flex;align-items:center;gap:7px;}
.wb-assist-tile .row .material-symbols-outlined{font-size:18px;color:var(--brand);flex-shrink:0;}
.wb-assist-tile.disabled .row .material-symbols-outlined{color:var(--text-faint);}
/* 标签允许换成两行，不省略。2026-08-23 今日成交并到协助事项右侧后，
   这张卡窄了 300px，nowrap+ellipsis 会把「待确认规格 / 待确认报价 / 待确认认证」
   一律截成「待确认…」——六个磁贴长得一模一样，等于没有标签。
   宁可占两行，也不能让人分不清点的是哪一类。 */
.wb-assist-tile .name{font-size:12.5px;font-weight:500;color:var(--text-dark);flex:1;min-width:0;
  white-space:normal;line-height:1.35;word-break:break-word;}
.wb-assist-tile .num{font-size:16px;font-weight:800;flex-shrink:0;}
/* 磁贴等高，两行的和一行的对齐 */
.wb-assist-tile{min-height:52px;display:flex;align-items:center;}
.wb-assist-tile .row{width:100%;align-items:center;}
@media(max-width:1280px){ .wb-assist-grid{grid-template-columns:repeat(2,minmax(0,1fr));} }
@media(max-width:680px){ .wb-assist-grid{grid-template-columns:minmax(0,1fr);} }
button.chip{font:inherit;appearance:none;-webkit-appearance:none;}
.chip[disabled]{opacity:.55;cursor:not-allowed;}

/* 业务工作台：AI 汇报正文里可点击下钻的高亮数字 */
.hl{color:var(--brand);font-weight:600;cursor:pointer;border-bottom:1px dashed var(--brand);}
.hl:hover{opacity:.75;}
.hl-success{color:var(--success);font-weight:600;cursor:pointer;border-bottom:1px dashed var(--success);}
.hl-success:hover{opacity:.75;}
.hl-danger{color:var(--danger);font-weight:600;cursor:pointer;border-bottom:1px dashed var(--danger);}
.hl-danger:hover{opacity:.75;}

/* 复选/单选卡 */
.check-card{
  display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:1px solid var(--border);
  border-radius:11px;cursor:pointer;transition:all .15s;background:#fff;
}
.check-card:hover{border-color:#cbd5e1;background:var(--bg-soft);}
.check-card.active{border-color:var(--brand);background:var(--info-bg);}
.check-card .cbox{
  width:18px;height:18px;border:1.5px solid var(--border);border-radius:5px;flex-shrink:0;margin-top:1px;
  display:flex;align-items:center;justify-content:center;transition:all .15s;background:#fff;
}
.check-card.active .cbox{background:var(--brand);border-color:var(--brand);}
.check-card .cbox .material-symbols-outlined{font-size:14px;color:#fff;opacity:0;}
.check-card.active .cbox .material-symbols-outlined{opacity:1;}
.check-card .cc-t{font-size:13px;font-weight:600;color:var(--text-dark);}
.check-card.active .cc-t{color:var(--brand);}
/* 岗位/说明单独一行：cc-t 与 cc-d 都是 span，不 block 的话连成一句
   「我自己管理员 · 全员汇总视角」，看着像打错字。与 mode-card 的 mc-t/mc-d 对齐。 */
.check-card .cc-d{display:block;font-size:11.5px;color:var(--text-faint);margin-top:2px;line-height:1.5;}
/* 人格卡底部的编辑/删除：单独一行，不要跟描述文字连成一句 */
.persona-actions{display:block;margin-top:8px;font-size:11px;}
.persona-actions .tbl-link+.tbl-link{margin-left:10px;}

/* 模式选择卡（sns 文生图风格） */
.mode-card{
  padding:16px 12px;border-radius:14px;border:1px solid var(--border-soft);background:#fff;
  cursor:pointer;transition:all .15s;display:flex;flex-direction:column;align-items:center;
  justify-content:center;text-align:center;gap:7px;
}
.mode-card:hover{border-color:#cbd5e1;background:var(--bg-soft);}
.mode-card.active{background:var(--info-bg);border-color:var(--brand);box-shadow:var(--sh-sm);}
.mode-card .material-symbols-outlined{font-size:28px;color:var(--text-faint);}
.mode-card.active .material-symbols-outlined{color:var(--brand);}
.mode-card .mc-t{font-size:13px;font-weight:700;color:var(--text-dark);}
.mode-card.active .mc-t{color:var(--brand);}
.mode-card .mc-d{font-size:11px;color:var(--text-faint);line-height:1.4;}

/* WA 自动分配设置：3 种模式各自的强调色（0=固定客服 品牌紫，1=轮流分配组 蓝，2=关键词分配 绿） */
.mode-card.active[data-alloc-mode="1"]{border-color:#2563eb;background:#eff6ff;}
.mode-card.active[data-alloc-mode="1"] .mc-t{color:#2563eb;}
.mode-card.active[data-alloc-mode="1"] .material-symbols-outlined{color:#2563eb;}
.mode-card.active[data-alloc-mode="2"]{border-color:var(--success);background:var(--success-bg);}
.mode-card.active[data-alloc-mode="2"] .mc-t{color:var(--success);}
.mode-card.active[data-alloc-mode="2"] .material-symbols-outlined{color:var(--success);}
.mode-tip{background:var(--bg-soft);border-radius:8px;padding:9px 14px;font-size:12px;color:var(--text-mid);margin-top:12px;line-height:1.7;}
.mode-tip b{color:var(--text-dark);}
.dot-mode0{background:var(--brand);}
.dot-mode1{background:#2563eb;}
.dot-mode2{background:var(--success);}

/* WA 自动分配设置：规则表格自定义单元格 */
.alloc-drag-handle{cursor:grab;color:var(--text-faint);font-size:16px;user-select:none;vertical-align:middle;}
.alloc-order-no{display:inline-block;width:20px;height:20px;line-height:20px;text-align:center;background:var(--bg-soft);border-radius:50%;font-size:11px;color:var(--text-mid);margin-left:4px;}
.alloc-assignee-cell{display:flex;flex-wrap:wrap;align-items:center;gap:4px;max-width:280px;}
.alloc-chip{display:inline-flex;align-items:center;background:var(--bg-soft);border-radius:999px;padding:2px 10px 2px 4px;font-size:11.5px;color:var(--text-mid);}
.alloc-chip .n{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;background:#2563eb;color:#fff;font-size:11px;margin-right:5px;flex-shrink:0;}
.alloc-kw-tag{background:var(--success-bg);color:var(--success);border-radius:4px;padding:3px 8px;font-size:11.5px;display:inline-flex;align-items:center;gap:5px;}
tr.alloc-row-off td{color:var(--text-faint);}
tr.alloc-dragging{opacity:.4;}
.alloc-empty-row{text-align:center;color:var(--text-faint);padding:28px 0;}

/* WA 自动分配设置：匹配模拟器 */
.alloc-sim-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:10px;}
.alloc-sim-result{border:1px dashed var(--border);border-radius:8px;padding:14px;font-size:13px;color:var(--text-mid);min-height:60px;}
.alloc-sim-result .hit{color:var(--success);font-weight:600;}
.alloc-sim-result .miss{color:var(--text-faint);}
.alloc-sim-trace{margin-top:8px;font-size:11.5px;color:var(--text-faint);line-height:1.8;}
.alloc-sim-trace .step-hit{color:var(--success);}
.alloc-sim-trace .step-skip{color:var(--text-faint);}

/* WA 自动分配设置：兜底行 / 依赖提示 */
.alloc-fallback-row{display:flex;align-items:center;gap:10px;margin-top:14px;padding-top:14px;border-top:1px dashed var(--border-soft);}
.alloc-fallback-row label{font-size:12.5px;color:var(--text-mid);white-space:nowrap;}
.alloc-fallback-row select{width:220px;}
.alloc-dep-tip{background:var(--warn-bg);color:var(--warn);border-radius:8px;padding:10px 14px;font-size:12px;line-height:1.7;margin-top:10px;}

/* WA 自动分配设置：弹窗内成员选择 / 关键词输入 / 星期选择器 */
.alloc-member-pool{display:flex;flex-wrap:wrap;gap:8px;}
.alloc-member-opt{border:1px solid var(--border);border-radius:999px;padding:5px 12px;font-size:13px;cursor:pointer;user-select:none;}
.alloc-member-opt.picked{background:#eff6ff;border-color:#93c5fd;color:#2563eb;}
.alloc-member-opt .n{display:inline-block;margin-right:5px;font-weight:600;}
.alloc-load-badge{margin-left:6px;font-size:11px;font-weight:600;}
.alloc-rr-preview{background:var(--bg-soft);border-radius:8px;padding:10px 12px;font-size:13px;color:var(--text-mid);margin-top:8px;}
.alloc-rr-preview b{color:#2563eb;}
.alloc-kw-box{border:1px solid var(--border);border-radius:8px;padding:8px;min-height:42px;display:flex;flex-wrap:wrap;align-items:center;gap:6px;}
.alloc-kw-box input{border:none;flex:1;min-width:100px;padding:2px;outline:none;font-size:13px;}
.alloc-kw-tag .rm{cursor:pointer;font-weight:700;margin-left:2px;}
.alloc-week-picker{display:flex;gap:6px;flex-wrap:wrap;}
.alloc-week-opt{border:1px solid var(--border);border-radius:6px;padding:5px 10px;font-size:11.5px;cursor:pointer;}
.alloc-week-opt.on{background:var(--brand);border-color:var(--brand);color:#fff;}
.alloc-time-range{display:flex;align-items:center;gap:8px;margin-top:8px;}

/* ---------- 13. 上传区 ---------- */
.dropzone{
  border:2px dashed var(--border);border-radius:var(--radius-md);padding:28px 16px;text-align:center;
  color:var(--text-faint);background:var(--bg-soft);cursor:pointer;transition:all .15s;
}
.dropzone:hover{border-color:var(--brand);background:var(--info-bg);}
.dropzone .material-symbols-outlined{font-size:30px;color:var(--text-faint);margin-bottom:6px;display:block;}
.dropzone:hover .material-symbols-outlined{color:var(--brand);}
.dropzone .dz-title{font-size:13px;font-weight:600;color:var(--text-soft);}
.dropzone .dz-sub{font-size:11.5px;margin-top:4px;}
.dropzone.sm{padding:18px 12px;}

/* ---------- 14. 图表 ---------- */
.bars{display:flex;align-items:flex-end;gap:8px;height:150px;padding-top:8px;}
.bars .bar-col{flex:1;display:flex;flex-direction:column;align-items:center;gap:7px;height:100%;justify-content:flex-end;}
.bars .bar{width:100%;max-width:38px;background:linear-gradient(180deg,#5b4ff0,var(--brand));border-radius:6px 6px 0 0;transition:opacity .15s;position:relative;}
.bars .bar-col:hover .bar{opacity:.82;}
.bars .bar.alt{background:linear-gradient(180deg,#a5b4fc,#818cf8);}
.bars .bar-label{font-size:11px;color:var(--text-faint);white-space:nowrap;}
.bars .bar-val{font-size:11px;font-weight:700;color:var(--text-soft);}

.hbar-row{display:flex;align-items:center;gap:10px;margin-bottom:11px;}
.hbar-row:last-child{margin-bottom:0;}
.hbar-label{width:104px;font-size:12px;color:var(--text-soft);flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.hbar-track{flex:1;height:9px;background:var(--bg-soft2);border-radius:999px;overflow:hidden;}
.hbar-fill{height:100%;background:var(--brand);border-radius:999px;transition:width .4s ease;}
.hbar-fill.c2{background:#7b6bf5;}
.hbar-fill.c3{background:#0891b2;}
.hbar-fill.c4{background:var(--success);}
.hbar-fill.c5{background:var(--warn);}
/* 受众覆盖现在是七个已授权平台（补了 LinkedIn 与 X），c6/c7 不补的话
   最后两条会落回默认品牌色，与第一条同色，看上去像同一个平台被画了两遍 */
.hbar-fill.c6{background:#be185d;}
.hbar-fill.c7{background:#475569;}
.hbar-value{width:66px;text-align:right;font-size:12px;font-weight:700;color:var(--text-dark);font-variant-numeric:tabular-nums;}

.donut-wrap{display:flex;align-items:center;gap:20px;}
.donut{width:132px;height:132px;border-radius:50%;flex-shrink:0;position:relative;}
.donut::after{content:'';position:absolute;inset:26px;background:#fff;border-radius:50%;}
.donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:1;}
.donut-center .dv{font-size:19px;font-weight:800;color:var(--text-dark);}
.donut-center .dl{font-size:11px;color:var(--text-faint);}
.legend{flex:1;display:flex;flex-direction:column;gap:9px;}
.legend-item{display:flex;align-items:center;gap:8px;font-size:12px;}
.legend-item .sw{width:9px;height:9px;border-radius:3px;flex-shrink:0;}
.legend-item .lb{flex:1;color:var(--text-soft);}
.legend-item .vl{font-weight:700;color:var(--text-dark);}

.sparkline{display:flex;align-items:flex-end;gap:3px;height:38px;}
.sparkline i{flex:1;background:var(--info-border);border-radius:2px 2px 0 0;}
.sparkline i.hi{background:var(--brand);}

/* 折线图（纯 CSS/SVG 容器） */
.linechart{width:100%;height:170px;}
.linechart svg{width:100%;height:100%;overflow:visible;}

/* ---------- 15. 日历 ---------- */
.cal-toolbar{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-bottom:14px;flex-wrap:wrap;}
.cal-month{font-size:19px;font-weight:800;color:var(--text-dark);letter-spacing:-.02em;}
.cal-nav{display:flex;align-items:center;gap:2px;background:var(--bg-soft2);border:1px solid var(--border);border-radius:10px;padding:3px;}
.cal-nav button{padding:4px 8px;border-radius:7px;color:var(--text-soft);display:flex;align-items:center;transition:all .15s;font-size:12px;font-weight:700;}
.cal-nav button:hover{background:#fff;color:var(--text-dark);}
.cal-nav .material-symbols-outlined{font-size:18px;}

.cal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:1px;background:var(--border);border:1px solid var(--border);border-radius:14px;overflow:hidden;}
.cal-dow{font-size:11px;font-weight:700;color:var(--text-faint);text-transform:uppercase;letter-spacing:.05em;padding:9px 10px;background:#fff;text-align:right;}
.cal-cell{min-height:106px;padding:7px;background:#fff;position:relative;display:flex;flex-direction:column;gap:4px;transition:background .12s;}
.cal-cell:hover{background:var(--bg-soft);}
.cal-cell.muted{background:var(--bg-soft);opacity:.5;}
.cal-cell.today{background:rgba(59,48,232,.04);box-shadow:inset 0 0 0 2px rgba(59,48,232,.28);}
.cal-cell.dragover{background:var(--info-bg);box-shadow:inset 0 0 0 2px var(--brand);}
.cal-date{position:absolute;top:6px;right:8px;font-size:11.5px;font-weight:700;color:var(--text-mid);}
.cal-cell.today .cal-date{color:var(--brand);background:rgba(59,48,232,.12);width:20px;height:20px;border-radius:50%;display:flex;align-items:center;justify-content:center;top:5px;right:5px;}
.cal-posts{margin-top:22px;display:flex;flex-direction:column;gap:4px;}
.cal-post{
  background:#fff;border:1px solid var(--border);border-radius:8px;padding:4px 6px 4px 8px;
  display:flex;align-items:center;gap:6px;cursor:pointer;position:relative;overflow:hidden;
  transition:all .15s;box-shadow:0 1px 2px rgba(15,23,42,.04);
  /* 2026-09-03 起是 <button>：重置按钮自带的字体与宽度，让它跟原来的 div 长得一样 */
  width:100%;text-align:left;font:inherit;
}
.cal-post:focus-visible{outline:2px solid var(--brand);outline-offset:1px;}
.cal-post:hover{box-shadow:var(--sh-md);border-color:rgba(59,48,232,.4);}
.cal-post::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--brand);}
.cal-post.st-published::before{background:var(--success);}
.cal-post.st-review::before{background:var(--warn);}
.cal-post.st-failed::before{background:var(--danger);}
.cal-post .thumb{width:18px;height:18px;border-radius:4px;background:var(--info-bg);color:var(--brand);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.cal-post .thumb .material-symbols-outlined{font-size:12px;}
.cal-post .ttl{font-size:11px;font-weight:600;color:var(--text-dark);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;}
.cal-post .plat{font-size:9.5px;font-weight:700;color:var(--text-faint);flex-shrink:0;}
.cal-drop-hint{
  border:2px dashed rgba(59,48,232,.3);background:rgba(59,48,232,.05);border-radius:8px;
  padding:6px;text-align:center;font-size:11px;font-weight:600;color:var(--brand);
}

/* 周视图与月视图共用 .cal-grid，只是一周七列、每列要装得下这一天的全部帖子
   （依 6.8 Q-07）——沿用月视图那个 106px 的格子高度的话，周视图上一列只放得下两张卡。 */
.cal-week .cal-cell{min-height:216px;}
.cal-week .cal-cell .cal-posts{overflow-y:auto;}

/* 资料库选择器 / 回收站弹框的工具栏：搜索 + 几个下拉一行排开，窄了就换行 */
.mp-toolbar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;}
.mp-toolbar .search-box{flex:1;min-width:180px;}
#mpGrid{max-height:52vh;overflow-y:auto;}

/* 草稿箱 */
.draft-card{
  background:#fff;border:1px solid var(--border);border-radius:11px;padding:11px;cursor:grab;
  transition:all .15s;box-shadow:var(--sh-sm);
}
.draft-card:hover{box-shadow:var(--sh-md);border-color:rgba(59,48,232,.35);}
.draft-card:active{cursor:grabbing;}
.draft-card.dragging{opacity:.45;}
.draft-head{display:flex;gap:10px;margin-bottom:8px;}
/* 草稿卡上的勾选框（批量排期要先选，依 6.8 Q-06）：与卡内文字顶对齐，
   别把它压在缩略图上——勾选和拖拽是两个动作，落点不能重叠。 */
.draft-pick{align-self:flex-start;margin-top:2px;flex-shrink:0;}
.draft-thumb{width:42px;height:42px;border-radius:9px;flex-shrink:0;background:linear-gradient(135deg,#e0e7ff,#c7d2fe);display:flex;align-items:center;justify-content:center;color:var(--brand);}
.draft-thumb .material-symbols-outlined{font-size:20px;}
.draft-meta{flex:1;min-width:0;}
.draft-badges{display:flex;align-items:center;gap:5px;margin-bottom:3px;}
.draft-badge{padding:1px 6px;border-radius:5px;background:var(--info-bg);font-size:9.5px;font-weight:700;color:var(--brand);text-transform:uppercase;letter-spacing:.03em;}
.draft-plat{font-size:11px;color:var(--text-faint);}
.draft-title{font-size:12px;font-weight:700;color:var(--text-dark);line-height:1.35;}
.draft-foot{display:flex;justify-content:space-between;align-items:center;padding-top:8px;border-top:1px solid var(--bg-soft2);}
.draft-foot .hint{font-size:11px;color:var(--text-faint);}

/* ---------- 16. 会话 / 消息 ---------- */
.msg-list{display:flex;flex-direction:column;gap:1px;}
.msg-item{display:flex;gap:11px;padding:11px;border-radius:10px;cursor:pointer;transition:background .12s;position:relative;}
.msg-item:hover{background:var(--bg-soft);}
.msg-item.active{background:var(--info-bg);}
.msg-item.active::before{content:'';position:absolute;left:0;top:9px;bottom:9px;width:3px;background:var(--brand);border-radius:0 3px 3px 0;}
.msg-avatar{width:38px;height:38px;border-radius:50%;background:var(--bg-soft2);color:var(--text-soft);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:12.5px;flex-shrink:0;}
.msg-avatar.brand{background:var(--info-bg);color:var(--brand);}
.msg-body{flex:1;min-width:0;}
.msg-top{display:flex;justify-content:space-between;gap:8px;align-items:center;}
.msg-name{font-size:13px;font-weight:700;color:var(--text-dark);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.msg-time{font-size:11px;color:var(--text-faint);flex-shrink:0;}
.msg-preview{font-size:11.5px;color:var(--text-soft);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:3px;}
.msg-tags{display:flex;gap:4px;margin-top:5px;flex-wrap:wrap;}
.msg-unread{width:16px;height:16px;border-radius:999px;background:var(--brand);color:#fff;font-size:9.5px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0;}

/* ================= 全渠道会话左栏重构（2026-09-24） ================= */
.msg-search-row{margin-bottom:10px;}
/* 渠道：横滑一行 → 竖向折叠列表；仅作用于消息中心的 .msg-ch-list，不波及 WA 仪表盘 */
.dyn-channel-row.msg-ch-list{display:flex;flex-direction:column;gap:2px;overflow:visible;padding-bottom:0;margin-bottom:8px;max-height:212px;overflow-y:auto;}
.dyn-channel-row.msg-ch-list .dyn-channel{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:8px;border:1px solid var(--border-soft);background:#fff;cursor:pointer;width:100%;flex-shrink:0;transition:border-color .15s,background .15s;}
.dyn-channel-row.msg-ch-list .dyn-channel:hover{border-color:rgba(59,48,232,.35);background:var(--bg-soft);}
.dyn-channel-row.msg-ch-list .dyn-channel.active{border-color:var(--brand);background:var(--info-bg);box-shadow:inset 3px 0 0 var(--brand);}
.dyn-channel-row.msg-ch-list .dyn-channel .dyn-channel-name{margin-right:auto;font-weight:500;}
.dyn-channel-row.msg-ch-list .dyn-channel.active .dyn-channel-name{color:var(--brand);font-weight:600;}
.dyn-channel-row.msg-ch-list .dyn-channel-badge{margin-left:0;}
.dyn-channel-row.msg-ch-list .dyn-channel .plat-badge{width:22px;height:22px;font-size:11px;}
.msg-ch-group-label{font-size:11px;color:var(--text-faint);font-weight:600;padding:8px 2px 3px;letter-spacing:.02em;}
/* 2026-09-26：渠道列从消息列表左栏拆成独立信源列。列里列表不再受 212px
   内部滚动限制，而是撑满整列高度，由 pane-body 的 scroll-y 统一滚动。 */
.msg-ch-col .dyn-channel-row.msg-ch-list{max-height:none;overflow:visible;margin-bottom:0;}
.msg-ch-box{margin-bottom:4px;}
.msg-ch-head{font-size:12px;color:var(--text-soft);font-weight:600;margin-bottom:4px;}
/* 快捷筛选 tab：全部 / 未读 / 我的 常驻，未建档 / AI 已暂停 收进「更多筛选」 */
.msg-quicktabs{display:flex;align-items:center;gap:6px;margin-bottom:8px;flex-wrap:wrap;}
.msg-qtab{border:1px solid var(--border-soft);background:#fff;color:var(--text-soft);font-size:12.5px;padding:5px 12px;border-radius:999px;cursor:pointer;transition:border-color .15s,background .15s,color .15s;}
.msg-qtab.active{background:var(--info-bg);border-color:var(--brand);color:var(--brand);font-weight:600;}
.msg-qtab-chip{padding:5px 12px;border-radius:999px;font-size:12.5px;}
.msg-qtab-chip.active{background:var(--info-bg);color:var(--brand);border-color:var(--info-border);font-weight:600;}
.msg-adv-toggle{margin-left:auto;border:1px solid var(--border-soft);background:#fff;color:var(--text-soft);font-size:12px;padding:5px 10px;border-radius:999px;cursor:pointer;display:inline-flex;align-items:center;gap:3px;transition:border-color .15s,background .15s;}
.msg-adv-toggle:hover{border-color:rgba(59,48,232,.35);}
.msg-adv-toggle .caret{display:inline-block;transition:transform .15s;}
.msg-adv-toggle.open .caret{transform:rotate(180deg);}
.msg-adv-wrap{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:8px;}
/* 未读强化 / 已读降权：仅限消息中心列表（.msg-list），不影响 WA 仪表盘的会话卡 */
.msg-list .msg-item.unread{background:var(--info-bg);opacity:1;}
.msg-list .msg-item.unread::before{content:'';position:absolute;left:0;top:8px;bottom:8px;width:3px;background:var(--brand);border-radius:0 3px 3px 0;}
.msg-list .msg-item.unread .msg-name{font-weight:700;}
.msg-list .msg-item.active{opacity:1;}
.msg-list .msg-item:not(.unread):not(.active){opacity:.58;}
.msg-list .msg-item:not(.unread):not(.active) .msg-name{font-weight:500;color:var(--text-soft);}

/* 聊天气泡 */
.chat-scroll{display:flex;flex-direction:column;gap:14px;padding:4px 2px;max-height:340px;overflow-y:auto;}
.chat-thread{display:flex;flex-direction:column;gap:14px;padding:4px 2px;}
.dyn-chat-card{display:flex;flex-direction:column;}
.dyn-chat-scroll{flex:1;min-height:220px;max-height:none;overflow-y:auto;}
.chat-composer{display:flex;flex-direction:column;gap:8px;}
.chat-composer-input{width:100%;padding:9px 12px;border:1px solid var(--border);border-radius:9px;font-size:12.5px;font-family:inherit;color:var(--text-dark);resize:vertical;min-height:38px;line-height:1.5;}
.chat-composer-input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(59,48,232,.1);}
.chat-composer-bar{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;}
.chat-composer-bar-left{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.chat-composer-bar-right{display:flex;align-items:center;gap:6px;flex-wrap:wrap;flex-shrink:0;}
.bubble-row{display:flex;gap:9px;}
.bubble-row.out{flex-direction:row-reverse;}
.bubble-row > div{max-width:78%;}
/* 从客户详情「定位到会话」跳过来时，被定位的那条消息高亮一下，让人看清落在哪 */
.bubble-row.hl > div > .bubble{box-shadow:0 0 0 2px var(--brand);}
.bubble-row.hl > div > .bubble-meta{color:var(--brand);font-weight:700;}
/* 上一版把整行撑满的写法已由下面 .wb-msg 接管——那条 `.bubble-row > div{width:100%}`
   会连头像一起撑满，把气泡挤成 0 宽，务必别加回来。 */
.wb-mgr-thread .bubble .wb-assist-grid{margin-top:2px;}
/* 学习路径：一行三个的课表卡。已完成描边成功色、进行中描边品牌色，未开始保持默认 */
.lp-card{transition:box-shadow .18s ease,border-color .18s ease;}
.lp-card.is-done{border-color:var(--success-border);background:var(--success-bg);}
.lp-card.is-cur{border-color:var(--brand);box-shadow:var(--sh-brand);}

/* ---------- 工作台：业务经理对话框 ---------- */
.wb-mgr-box{display:flex;flex-direction:column;overflow:hidden;}
.wb-mgr-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 18px;border-bottom:1px solid var(--border-soft);background:var(--bg-soft);}
/* 会话区给一层浅底，白气泡才浮得出来——同色背景上的白卡片读起来像表单不像对话 */
/* 两种形态（内嵌 / 弹框）现在都给了对话框一个确定的高度，所以会话区一律
   flex:1 吃掉剩余空间、自己滚。min-height:0 少不了——flex 子项默认
   min-height:auto，会被内容撑开，overflow-y 就永远不触发。 */
.wb-mgr-thread{padding:18px;display:flex;flex-direction:column;gap:16px;
  flex:1;min-height:0;overflow-y:auto;background:var(--bg-page);}
.wb-mgr-thread .bubble-row{align-items:flex-start;gap:10px;}
.wb-mgr-thread .wb-msg{max-width:86%;min-width:0;}
.wb-mgr-thread .wb-msg.wide{max-width:100%;width:100%;}
.wb-mgr-thread .bubble{border-radius:14px;padding:14px 16px;font-size:13px;position:relative;}
.wb-mgr-thread .bubble-row.in .bubble{background:#fff;border:1px solid var(--border-soft);
  border-top-left-radius:4px;box-shadow:var(--sh-sm);color:var(--text-mid);}
.wb-mgr-thread .bubble-row.out .bubble{background:var(--brand);color:#fff;
  border:1px solid var(--brand);border-top-right-radius:4px;box-shadow:var(--sh-brand);}
.wb-mgr-thread .bubble-row.out .bubble b,
.wb-mgr-thread .bubble-row.out .bubble .text-dark{color:#fff;}
.wb-mgr-thread .bubble-meta{margin-top:6px;font-size:11px;color:var(--text-faint);}
.wb-mgr-thread .bubble-row.out .bubble-meta{text-align:right;}
/* 头像：智能体用品牌色圆角方块，你自己用姓名缩写 */
.wb-av{width:32px;height:32px;border-radius:10px;flex-shrink:0;display:flex;
  align-items:center;justify-content:center;font-size:12px;font-weight:700;}
.wb-av-ag{background:var(--brand);color:#fff;}
.wb-av-ag .material-symbols-outlined{font-size:18px;}
.wb-av-me{background:var(--bg-soft2);color:var(--text-soft);border:1px solid var(--border);}
/* 逐句出现：每句淡入并轻微上移，读起来像在说话而不是在刷新 */
.wb-sent{display:inline;animation:wbSent .28s ease both;}
@keyframes wbSent{from{opacity:0;transform:translateY(3px);}to{opacity:1;transform:none;}}
/* 「正在输入」三点 */
.wb-typing{display:flex;gap:4px;align-items:center;height:14px;margin-top:8px;}
.wb-typing span{width:5px;height:5px;border-radius:50%;background:var(--text-faint);animation:wbDot 1s infinite ease-in-out;}
.wb-typing span:nth-child(2){animation-delay:.15s;}
.wb-typing span:nth-child(3){animation-delay:.3s;}
@keyframes wbDot{0%,60%,100%{opacity:.25;transform:translateY(0);}30%{opacity:1;transform:translateY(-3px);}}
/* 快捷键：白底描边小药丸，压在输入框上方，像输入法候选条 */
.wb-mgr-quick{display:flex;gap:8px;flex-wrap:wrap;padding:12px 18px 0;background:#fff;}
.wb-mgr-quick .chip{cursor:pointer;background:#fff;border:1px solid var(--border);
  color:var(--text-soft);font-weight:600;transition:all .15s;}
.wb-mgr-quick .chip:hover{border-color:var(--brand);color:var(--brand);
  background:var(--info-bg);}
.wb-mgr-quick .chip .material-symbols-outlined{font-size:15px;margin-right:4px;}
.wb-mgr-input{display:flex;gap:10px;align-items:flex-end;padding:12px 18px 16px;background:#fff;}
.wb-mgr-input textarea{flex:1;resize:none;border-radius:var(--radius-md);
  padding:11px 14px;line-height:1.5;}
.wb-mgr-input .btn{flex-shrink:0;border-radius:var(--radius-md);padding:11px 18px;}
/* 四个智能体卡：整卡可点，hover 微抬 */
/* 2026-08-27：卡片本身不再是链接（里面有四个），所以整卡不再整体上浮——
   悬停反馈下放到真正点得动的那几块，免得「哪儿都亮」但只有一处能点。 */
.wb-agent-card{display:block;}
.wb-agent-head{display:flex;align-items:center;gap:8px;margin:-4px -4px 10px;padding:4px;
  border-radius:var(--radius-sm);transition:background .15s;}
.wb-agent-head:hover{background:var(--bg-soft);}
.wb-agent-head .wb-agent-go{font-size:16px;color:var(--text-faint);margin-left:auto;}
.wb-agent-head:hover .wb-agent-go{color:var(--brand);}
.wb-agent-cells{display:flex;gap:8px;align-items:flex-start;}
/* 三个数各自是一个链接：给它们独立的点击热区与悬停反馈，
   否则「点得动」这件事只有把鼠标放上去才发现 */
/* 三个数各自是一个链接或一个抽屉入口——button 也用同一套外观，
   否则「点得动」这件事在同一张卡里长得不一样。 */
.wb-agent-cell{display:block;flex:1;min-width:0;padding:6px 8px;margin:-6px -2px;
  border-radius:var(--radius-sm);transition:background .15s,box-shadow .15s;
  text-align:left;background:none;border:0;font:inherit;color:inherit;cursor:pointer;}
.wb-agent-cell:hover{background:var(--bg-soft);box-shadow:inset 0 0 0 1px var(--border);}
.wb-agent-cell:hover .fs-11{color:var(--brand);}
.bubble{padding:10px 13px;font-size:12.5px;line-height:1.65;border-radius:13px;}
.bubble-row.in .bubble{background:#fff;border:1px solid var(--border);color:var(--text-mid);border-bottom-left-radius:4px;}
.bubble-row.out .bubble{background:var(--brand);color:#fff;border-bottom-right-radius:4px;box-shadow:var(--sh-brand);}
.bubble-meta{font-size:11px;color:var(--text-faint);margin-top:5px;}
.bubble-row.out .bubble-meta{text-align:right;}
.bubble .trans{margin-top:7px;padding-top:7px;border-top:1px dashed rgba(148,163,184,.4);font-size:11.5px;opacity:.85;}

/* ---------- 17. AI 提示区 ---------- */
.ai-box{background:var(--info-bg);border:1px solid var(--info-border);border-radius:var(--radius-md);padding:14px 16px;}
.ai-box-title{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:700;color:var(--brand);margin-bottom:8px;}
.ai-box-title .material-symbols-outlined{font-size:18px;}
.ai-box p{font-size:12.5px;line-height:1.85;color:var(--text-mid);margin:0;}
.ai-box p b{color:var(--text-dark);font-weight:700;}
.ai-disclaimer{
  display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--warn);
  background:var(--warn-bg);border:1px solid var(--warn-border);border-radius:9px;padding:8px 11px;
}
.ai-disclaimer .material-symbols-outlined{font-size:15px;}
.upload-box{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  border:1.5px dashed var(--border);border-radius:var(--radius-md);padding:26px 16px;text-align:center;
  color:var(--text-soft);background:var(--bg-soft);cursor:pointer;transition:border-color .15s,background .15s;
}
.upload-box:hover{border-color:var(--brand);background:var(--info-bg);}
.upload-box .material-symbols-outlined{font-size:30px;color:var(--brand);}
.upload-box .fs-12{font-size:12px;color:var(--text-faint);}
.ai-prompt-bar{display:flex;gap:8px;margin-top:12px;}
.ai-prompt-bar input{
  flex:1;padding:10px 14px;border:1px solid var(--info-border);border-radius:10px;font-size:13px;background:#fff;
}
.ai-prompt-bar input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(59,48,232,.1);}

/* ---------- 18. 空状态 ---------- */
.empty-state{min-height:calc(100vh - 200px);display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:40px 20px;}
.empty-state .icon-wrap{width:88px;height:88px;border-radius:24px;background:var(--info-bg);display:flex;align-items:center;justify-content:center;margin-bottom:22px;}
.empty-state .icon-wrap .material-symbols-outlined{font-size:44px;color:var(--brand);}
.empty-state .icon-wrap.gray{background:var(--bg-soft2);}
.empty-state .icon-wrap.gray .material-symbols-outlined{color:var(--text-faint);}
.empty-state h2{font-size:19px;color:var(--text-dark);margin:0 0 8px;font-weight:700;}
.empty-state p{font-size:13.5px;color:var(--text-soft);max-width:460px;line-height:1.75;margin:0 0 22px;}
.empty-inline{padding:32px 16px;text-align:center;color:var(--text-faint);}
.empty-inline .material-symbols-outlined{font-size:34px;display:block;margin-bottom:8px;}
.empty-inline .ei-t{font-size:12.5px;}

/* ---------- 19. 入口页 ---------- */
.hero{
  background:var(--brand-gradient);border-radius:var(--radius-xl);padding:28px 32px;color:#fff;
  margin-bottom:20px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:22px;
  position:relative;overflow:hidden;
}
.hero::after{
  content:'';position:absolute;right:-60px;top:-60px;width:240px;height:240px;
  background:rgba(255,255,255,.08);border-radius:50%;
}
.hero-text{position:relative;z-index:1;}
.hero h1{font-size:24px;margin:0;font-weight:800;letter-spacing:-.02em;}
.hero p{font-size:13px;opacity:.88;margin:0;max-width:560px;line-height:1.7;}
.hero-kpis{display:flex;gap:30px;position:relative;z-index:1;}
.hero-kpi .v{font-size:24px;font-weight:600;letter-spacing:-.022em;
  line-height:1.15;font-variant-numeric:tabular-nums;}
.hero-kpi .l{font-size:11.5px;line-height:1.35;opacity:.86;margin-top:4px;}

/* 系统卡从 <a> 改成 <div>：卡里要放智能体署名徽章（本身也是链接），
   <a> 套 <a> 是非法结构，浏览器会把内层链接甩出容器。
   改法是「拉伸链接」——标题上的 .sys-card-link 用 ::after 铺满整张卡负责整卡点击，
   徽章用 z-index 浮在它上面各自可点。整卡仍然可点、可中键新开、可键盘聚焦。 */
.sys-card{
  position:relative;
  background:#fff;border:1px solid var(--border-soft);border-radius:var(--radius-lg);
  /* 留白 18 -> 20px：Operate 模式允许密度，但密度靠紧凑的网格实现，
     不靠把内容顶到边框上。卡内呼吸感与卡间距是两件事。 */
  /* 静置态不给阴影。这些卡嵌在一张 section 里，加了阴影就成「卡中卡」
     （nested-cards，是我这一轮自己加出来的）。而且「克制的单像素边框」
     本来就意味着静置靠边框站住，阴影只在抬起时出现——
     静置就带阴影，是又回到了那种到处都在发光的做法。 */
  padding:20px;
  display:flex;flex-direction:column;gap:14px;
  /* 逐属性写，不用 transition:all。all 会把 border-color、padding
     以及将来新加的任何属性一起动画化，其中一部分会触发重排。 */
  transition:transform var(--dur-base) var(--ease-out-expo),
             box-shadow var(--dur-base) var(--ease-out-expo),
             border-color var(--dur-fast) linear;
}
/* 微抬 + 极轻缩放：位移从 3px 收到 2px。这是工作台不是落地页，
   卡片要被反复扫视，抬太高会在视线里「跳」。
   缩放 1.006 在 380px 宽的卡上只有 2px 膨胀，读作「浮起来」而不是「变大」。 */
.sys-card:hover{box-shadow:var(--sh-lg);transform:translateY(-2px) scale(1.006);
  border-color:#d9d6f7;}
.sys-card.disabled{opacity:.72;}
.sys-card.disabled:hover{transform:none;box-shadow:var(--sh-sm);}
.sys-card-link{text-decoration:none;display:block;}
.sys-card-link::after{content:"";position:absolute;inset:0;border-radius:inherit;z-index:1;}
/* 键盘聚焦落在拉伸链接上时，把焦点环画在整张卡上，而不是标题那几个字上 */
.sys-card:focus-within{outline:2px solid var(--brand);outline-offset:2px;}
.sys-card-link:focus-visible{outline:none;}
.sys-card-head{display:flex;align-items:center;gap:12px;}
/* 原来是 42px 实心高饱和色块 + 白色图标，六个并排像一排糖果；
   检测器也报了 cramped-padding（图标直接顶到色块边缘，没有内缩）。
   改成同一个系统色，但以「淡染底 + 同色图标」出现：
   识别性一点没丢（还是那个颜色），饱和度掉下来了。
   色值由标记上的 --sys 传入，见 port-back/ 里对 p_portal_wa.py 的改动。 */
.sys-card-icon{width:40px;height:40px;border-radius:11px;padding:9px;
  display:flex;align-items:center;justify-content:center;flex-shrink:0;box-sizing:border-box;
  background:color-mix(in oklab, var(--sys,var(--brand)) 11%, #fff);
  color:var(--sys,var(--brand));
  box-shadow:inset 0 0 0 1px color-mix(in oklab, var(--sys,var(--brand)) 18%, transparent);}
.sys-card-icon .material-symbols-outlined{font-size:21px;}
.sys-card-title{font-size:14.5px;font-weight:700;color:var(--text-dark);}
.sys-card-desc{font-size:11.5px;color:var(--text-faint);margin-top:1px;}
/* 原来指标区上下各一条虚线，下面 sys-card-agents 又有一条——
   一张卡三条虚线，全是分隔符，没有一条在表达层级。
   收成一条实发丝线：分隔一次就够，剩下的交给间距。 */
.sys-card-metrics{display:flex;gap:16px;padding:14px 0 0;border-top:1px solid var(--border-soft);}
.sys-card-metrics .m{flex:1;min-width:0;}
/* 字阶 16px/800 -> 19px/600：层级交给字号，不交给字重。
   800 是钝器，把数字压成一坨黑块，这是「塑料感」里最重的一笔。
   tabular-nums 让 1,246 与 18,370 的数位对齐，三个指标并排时不互相错位。
   line-height 写死 1.15：不写的话数字与标签的间距会随字体回退而漂移。 */
.sys-card-metrics .m .v{font-size:19px;font-weight:600;color:var(--text-dark);
  line-height:1.15;letter-spacing:-.021em;font-variant-numeric:tabular-nums;}
/* 10.5px 低于 11px 功能性文字下限（检测器 undersized-ui-text）。
   提到 11px 并给足行高，让它稳稳作为「数字的注脚」待在下面。 */
.sys-card-metrics .m .l{font-size:11px;line-height:1.35;color:var(--text-faint);
  margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sys-card-footer{display:flex;justify-content:space-between;align-items:center;}

/* ---- 「进入系统 →」的箭头微位移 ----
   这是整张卡唯一一处带暗示性的动作：鼠标还没点，箭头已经先往前挪了 3px，
   把「这里可以进去」这句话用动作说出来，而不是靠再加一行字。

   三个决定：
   1) 只动 transform。改 margin/padding 会触发重排，一排六张卡同时 hover 会掉帧。
   2) 进出都用 ease-out（指数级），不用 ease-in。ease-in 起步慢，
      而起步那一刻正是人眼盯着的地方——同样 180ms，ease-out 会显著「更快」。
   3) 出场比入场再快一档（180 -> 120ms）：手已经移走了，
      动画还在慢慢收，会让人觉得界面粘手。
   位移只给 3px：箭头本身才 16px 宽，再多就从「暗示」变成「跳」了。 */
.sys-card-footer .btn .material-symbols-outlined{
  transition:transform var(--dur-fast) var(--ease-out-expo);
  will-change:transform;
}
.sys-card:hover .sys-card-footer .btn .material-symbols-outlined{
  transform:translateX(3px);
  transition-duration:var(--dur-base);
}

/* 系统卡里的智能体署名区：回答「这个系统由谁在干、干到什么程度、有多少等我」。
   数据全部由 app.js 的 portalAgentsRender() 从 AGENT_REG / AGENT_WORK / HANDOFF_ITEMS
   算出来，与智能体中心同源，写死必然对不上。 */
.sys-card-agents{
  margin-top:-2px;padding-top:12px;border-top:1px solid var(--border-soft);
  display:flex;flex-direction:column;gap:8px;
}
.sys-card-agents .sca-label{
  font-size:11px;font-weight:700;letter-spacing:.04em;color:var(--text-faint);
  display:flex;align-items:center;gap:4px;
}
.sys-card-agents .sca-label .material-symbols-outlined{font-size:13px;}
.sys-card-agents .sca-badges{display:flex;flex-wrap:wrap;gap:6px;}
/* 徽章要浮在拉伸链接之上才点得到 */
.sys-card-agents .agent-badge{position:relative;z-index:2;}
.sys-card-agents .sca-stat{
  font-size:11px;color:var(--text-faint);
  display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px;
}
.sys-card-agents .sca-stat b{color:var(--text-dark);font-weight:700;font-variant-numeric:tabular-nums;}
.sys-card-agents .sca-todo{
  position:relative;z-index:2;
  display:inline-flex;align-items:center;gap:3px;
  color:var(--warn);font-weight:700;text-decoration:none;
  padding:2px 7px;border-radius:999px;background:var(--warn-bg);
  min-height:22px;
}
.sys-card-agents .sca-todo:hover{text-decoration:underline;}
.sys-card-agents .sca-todo .material-symbols-outlined{font-size:13px;}
.sys-card-agents .sca-none{font-size:11px;color:var(--text-faint);line-height:1.55;}


/* 入口页六张系统卡的窄屏降列。
   全站 .grid-3 目前没有任何断点（这套原型按 1500px 桌面视口做的），
   窄屏下会硬挤成两列 155px。这里只给入口页这一处收窄，
   不动全站 .grid-* —— 那是另一件事，影响 44 个页面，不该顺手夹带。 */
@media (max-width:1080px){
  .portal-sys-grid{grid-template-columns:repeat(2,minmax(0,1fr));}
}
@media (max-width:680px){
  .portal-sys-grid{grid-template-columns:minmax(0,1fr);}
}
/* 兜底：任何宽度下徽章都不许顶破卡片，名字过长就省略 */
.sys-card-agents .agent-badge{max-width:100%;min-width:0;}
.sys-card-agents .agent-badge .ab-name{overflow:hidden;text-overflow:ellipsis;min-width:0;}

.common-strip{display:flex;gap:12px;flex-wrap:wrap;}
.common-strip a{
  flex:1;min-width:170px;background:#fff;border:1px solid var(--border-soft);border-radius:var(--radius-md);
  /* 对齐是这一格最明显的「死板」：图标块 38px、右侧是标题 + 副标题两行，
     align-items:center 把图标对到「两行文字整体」的几何中心，
     于是图标看起来永远比标题低半格。人眼读的是标题那一行，
     图标该跟标题的视觉重心对齐，而不是跟文本块的盒子中心对齐。
     改法：整行改为顶对齐，再把图标下压 1px 落到标题的光学中线上。 */
  /* 静置态不给阴影：这一排卡片本身就嵌在一张 section 卡里，
     再加一层阴影就成了「卡中卡」（检测器 nested-cards 当场报了出来，
     是我这一轮自己造成的回归）。静置靠发丝边框，抬升只在 hover 时发生。 */
  padding:16px;display:flex;align-items:flex-start;gap:12px;
  transition:transform var(--dur-base) var(--ease-out-expo),
             box-shadow var(--dur-base) var(--ease-out-expo),
             border-color var(--dur-fast) linear;
}
/* 原来 hover 是「满饱和品牌色边框 + 品牌色光晕」——彩色光晕正是
   检测器 dark-glow 那条规则针对的东西，也是「AI 塑料感」最典型的一笔。
   换成中性阴影升一级 + 边框只淡淡染上品牌色。 */
.common-strip a:hover{border-color:#d9d6f7;box-shadow:var(--sh-md);transform:translateY(-2px);}
.common-strip .ic{width:38px;height:38px;border-radius:10px;padding:9px;box-sizing:border-box;
  background:var(--info-bg);
  color:var(--brand);display:flex;align-items:center;justify-content:center;flex-shrink:0;
  margin-top:1px;}
/* Material Symbols 的字形在自己的 em 盒里高度不一（payments 比 receipt_long 矮），
   纯靠 flex 居中，一排图标会看着高低不齐。锁死行高并让字形按 em 盒居中，
   四个图标的光学基线才真正对齐。 */
.common-strip .ic .material-symbols-outlined{font-size:20px;line-height:1;display:block;}
.common-strip .t{font-size:13px;font-weight:600;line-height:1.35;color:var(--text-dark);}
.common-strip .s{font-size:11px;line-height:1.35;color:var(--text-faint);margin-top:2px;}

/* 待办聚合 */
.todo-item{display:flex;align-items:center;gap:11px;padding:11px 0;border-bottom:1px solid var(--border-soft);}
.todo-item:last-child{border-bottom:none;}
.todo-ic{width:32px;height:32px;border-radius:9px;padding:7px;box-sizing:border-box;

  display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.todo-ic .material-symbols-outlined{font-size:17px;}
.todo-ic.danger{background:var(--danger-bg);color:var(--danger);}
.todo-ic.warn{background:var(--warn-bg);color:var(--warn);}
.todo-ic.info{background:var(--info-bg);color:var(--brand);}
.todo-body{flex:1;min-width:0;}
.todo-t{font-size:12.5px;font-weight:600;color:var(--text-dark);}
.todo-d{font-size:11px;color:var(--text-faint);margin-top:2px;}

/* ---------- 20. 素材 / 结果网格 ---------- */
.asset-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(158px,1fr));gap:13px;}
.asset{border:1px solid var(--border-soft);border-radius:12px;overflow:hidden;background:#fff;cursor:pointer;transition:all .15s;position:relative;}
.asset:hover{box-shadow:var(--sh-md);border-color:rgba(59,48,232,.3);transform:translateY(-2px);}
.asset.selected{border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-shadow);}
.asset-thumb{height:104px;display:flex;align-items:center;justify-content:center;position:relative;}
.asset-thumb .material-symbols-outlined{font-size:30px;opacity:.75;}
.asset-thumb .dur{position:absolute;right:6px;bottom:6px;background:rgba(15,23,42,.72);color:#fff;font-size:11px;font-weight:600;padding:2px 6px;border-radius:5px;}
.asset-thumb .ratio{position:absolute;left:6px;top:6px;background:rgba(15,23,42,.6);color:#fff;font-size:9.5px;font-weight:700;padding:2px 6px;border-radius:5px;}
.asset-info{padding:9px 10px;}
.asset-name{font-size:11.5px;font-weight:600;color:var(--text-dark);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.asset-meta{font-size:11px;color:var(--text-faint);margin-top:2px;display:flex;justify-content:space-between;gap:6px;}
.asset-check{position:absolute;top:7px;right:7px;width:19px;height:19px;border-radius:6px;background:rgba(255,255,255,.92);border:1.5px solid var(--border);display:flex;align-items:center;justify-content:center;}
.asset.selected .asset-check{background:var(--brand);border-color:var(--brand);}
.asset-check .material-symbols-outlined{font-size:14px;color:#fff;opacity:0;}
.asset.selected .asset-check .material-symbols-outlined{opacity:1;}

/* ---- 素材列表行（批量处理左栏：紧凑列表而非网格卡片） ---- */
.asset.list{display:flex;align-items:center;gap:10px;padding:8px;border-radius:10px;}
.asset.list:hover{transform:none;box-shadow:none;border-color:rgba(59,48,232,.3);}
.asset.list .asset-thumb{width:42px;height:42px;border-radius:9px;flex-shrink:0;}
.asset.list .asset-thumb .material-symbols-outlined{font-size:19px;}
.asset.list .asset-info{padding:0;flex:1;min-width:0;}
.asset.list .asset-name{white-space:normal;line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.asset.list .asset-meta{margin-top:3px;justify-content:flex-start;}
.asset.list .asset-check{top:3px;right:3px;}
.asset-list-scroll{max-height:420px;overflow-y:auto;display:flex;flex-direction:column;gap:4px;}

/* ---- 数量步进器（批量处理：生成视频个数）---- */
.qty-stepper{display:flex;align-items:center;border:1px solid var(--border-soft);border-radius:8px;overflow:hidden;}
.qty-btn{width:30px;height:30px;border:none;background:var(--bg-soft);color:var(--text-soft);font-size:16px;font-weight:700;cursor:pointer;display:flex;align-items:center;justify-content:center;line-height:1;}
.qty-btn:hover{background:var(--bg-soft2);color:var(--text-dark);}
.qty-val{width:38px;text-align:center;font-size:13px;font-weight:700;color:var(--text-dark);}

/* ---- 智能混剪：步骤向导 ---- */
.remix-stepbar{display:flex;align-items:center;flex-wrap:wrap;gap:2px;background:#fff;border:1px solid var(--border-soft);border-radius:var(--radius-lg);padding:12px 16px;margin-bottom:16px;}
.remix-step{display:flex;align-items:center;gap:6px;padding:8px 14px;border-radius:999px;font-size:12.5px;font-weight:600;color:var(--text-faint);background:none;border:none;cursor:pointer;white-space:nowrap;transition:all .15s;}
.remix-step .material-symbols-outlined{font-size:16px;}
.remix-step-ic-done{display:none;}
.remix-step:hover{background:var(--bg-soft);color:var(--text-soft);}
.remix-step.active{background:linear-gradient(135deg,var(--brand),#7b6bf5);color:#fff;}
.remix-step.active:hover{color:#fff;}
.remix-step.done{color:var(--brand);}
.remix-step.done .remix-step-ic-normal{display:none;}
.remix-step.done .remix-step-ic-done{display:inline-block;}
.remix-step-arrow{color:var(--text-faint);font-size:16px;flex-shrink:0;}

.remix-stage{min-height:340px;}
.remix-pane{display:none;}
.remix-pane.active{display:block;}

.remix-empty{padding:52px 20px;text-align:center;}
.remix-empty-icon{width:52px;height:52px;border-radius:14px;background:var(--info-bg);color:var(--brand);display:flex;align-items:center;justify-content:center;margin:0 auto 14px;}
.remix-empty-icon .material-symbols-outlined{font-size:24px;}
.remix-empty-title{font-size:14px;font-weight:700;color:var(--text-dark);margin-bottom:6px;}
.remix-empty-desc{font-size:12px;color:var(--text-faint);line-height:1.7;max-width:460px;margin:0 auto;}
.remix-empty-box{border:1px solid var(--border-soft);border-radius:12px;background:var(--bg-soft);margin-top:14px;}

.remix-nav{display:flex;align-items:center;justify-content:space-between;margin-top:16px;}
.remix-nav-final{display:flex;align-items:center;justify-content:space-between;flex:1;gap:14px;}

/* ---- CRM：更多筛选行 / 公海记录动态列表 / 标签颜色选择器 ---- */
.crm-more-filters{display:none;flex-wrap:wrap;gap:9px;margin:2px 0 14px;padding-top:12px;border-top:1px dashed var(--border-soft);}
.crm-more-filters.open{display:flex;}
.crm-record-item{padding:12px 0;border-bottom:1px solid var(--border-soft);}
.crm-record-item:last-child{border-bottom:none;}
.crm-record-item.active{background:var(--brand-shadow);margin:0 -14px;padding:12px 14px;border-radius:9px;border-bottom-color:transparent;}
.crm-record-item[data-mb-account]:hover:not(.active){background:var(--bg-soft);margin:0 -14px;padding:12px 14px;border-radius:9px;}
/* ---- 客户详情页：展开更多资料面板 / 联系人卡片行内编辑 ---- */
.ccd-more{display:none;}
.ccd-more.open{display:block;}
.ccd-row{display:flex;padding:10px 0;border-bottom:1px solid var(--border-soft);gap:12px;}
.ccd-row:last-child{border-bottom:none;}
.ccd-row .ccd-label{width:100px;flex-shrink:0;font-size:12px;color:var(--text-soft);padding-top:2px;}
.ccd-row .ccd-val{flex:1;font-size:12.5px;color:var(--text-dark);}
.color-swatch-row{display:flex;gap:8px;}
.color-swatch{width:22px;height:22px;border-radius:50%;cursor:pointer;border:2px solid transparent;box-shadow:0 0 0 1px var(--border-soft) inset;}
.color-swatch.active{border-color:var(--text-dark);}

/* ---- 批量处理：底部固定汇总条 ---- */
.batch-footer{
  position:sticky;bottom:0;z-index:60;margin:20px -26px -60px;padding:14px 26px;
  background:#fff;border-top:1px solid var(--border-soft);
  display:flex;align-items:center;justify-content:space-between;
  box-shadow:0 -4px 14px rgba(15,23,42,.06);
}

/* 渐变缩略图色板 */
.g1{background:linear-gradient(135deg,#e0e7ff,#c7d2fe);color:#4338ca;}
.g2{background:linear-gradient(135deg,#fce7f3,#fbcfe8);color:#be185d;}
.g3{background:linear-gradient(135deg,#d1fae5,#a7f3d0);color:#047857;}
.g4{background:linear-gradient(135deg,#fef3c7,#fde68a);color:#b45309;}
.g5{background:linear-gradient(135deg,#cffafe,#a5f3fc);color:#0e7490;}
.g6{background:linear-gradient(135deg,#ede9fe,#ddd6fe);color:#6d28d9;}
.g7{background:linear-gradient(135deg,#ffe4e6,#fecdd3);color:#be123c;}
.g8{background:linear-gradient(135deg,#f1f5f9,#e2e8f0);color:#475569;}
/* 2026-10-29：LBS获客智能体的配色，跟着 --sys-lbs 走 */
.g9{background:linear-gradient(135deg,#ccfbf1,#99f6e4);color:#0f766e;}

/* ---------- 21. 平台图标 ---------- */
.plat-badge{
  width:32px;height:32px;border-radius:9px;display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:800;color:#fff;flex-shrink:0;letter-spacing:-.02em;
}
.p-ig{background:linear-gradient(135deg,#f58529,#dd2a7b,#8134af);}
.p-fb{background:#1877f2;}
.p-tk{background:#010101;}
.p-yt{background:#ff0000;}
.p-tw{background:#0f172a;}
.p-li{background:#0a66c2;}
.p-pt{background:#e60023;}
.p-th{background:#0f172a;}
.p-wa{background:#25d366;}
.p-ms{background:#0084ff;}
.p-em{background:#64748b;}
.p-ali{background:#ff6a00;}
.p-mic{background:#c9962c;}
.p-line{background:#06c755;}

.dyn-channel-row{display:flex;gap:8px;overflow-x:auto;padding-bottom:6px;margin-bottom:14px;}
.dyn-channel{display:flex;align-items:center;gap:6px;padding:5px 10px 5px 5px;border-radius:999px;border:1px solid var(--border-soft);background:#fff;cursor:pointer;flex-shrink:0;transition:border-color .15s,background .15s;}
.dyn-channel:hover{border-color:rgba(59,48,232,.35);}
.dyn-channel.active{border-color:var(--brand);background:var(--info-bg);}
.dyn-channel .plat-badge{width:22px;height:22px;font-size:11px;}
.dyn-channel-name{font-size:12px;font-weight:600;color:var(--text-soft);white-space:nowrap;}
.dyn-channel.active .dyn-channel-name{color:var(--brand);}
.dyn-channel-badge{background:var(--danger);color:#fff;font-size:11px;font-weight:700;line-height:1;border-radius:999px;padding:2px 6px;}
.dyn-channel-badge.issue{background:var(--warn);}
.btn-badge{background:var(--danger);color:#fff;font-size:11px;font-weight:700;line-height:1;border-radius:999px;padding:2px 6px;margin-left:2px;}

.ai-emp-head{display:flex;align-items:center;gap:16px;flex-wrap:wrap;}
.ai-emp-avatar{width:56px;height:56px;border-radius:16px;background:linear-gradient(135deg,var(--brand),#7b6bf5);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:var(--sh-brand);}
.ai-emp-avatar .material-symbols-outlined{font-size:30px;}
.ai-emp-info{flex:1;min-width:200px;}
.ai-emp-name{font-size:16px;font-weight:700;color:var(--text-dark);display:flex;align-items:center;gap:8px;}
.ai-emp-name .dot{width:8px;height:8px;}
.ai-emp-name .status-text{font-size:11.5px;font-weight:600;color:var(--success);}
.ai-emp-role{font-size:12.5px;color:var(--text-soft);margin-top:3px;}
.ai-emp-meta{font-size:11.5px;color:var(--text-faint);margin-top:6px;}
.ai-emp-today{display:flex;gap:22px;flex-shrink:0;}
.ai-emp-today-item{text-align:center;}
.ai-emp-today-item b{display:block;font-size:19px;font-weight:700;color:var(--text-dark);}
.ai-emp-today-item span{font-size:11px;color:var(--text-faint);}
.ai-emp-today-item.clickable{cursor:pointer;border-radius:10px;padding:4px 8px;transition:background .15s;}
.ai-emp-today-item.clickable:hover{background:var(--bg-soft2);}
.ai-emp-today-item.clickable b{color:var(--danger);}
.msg-tags .plat-badge{width:16px;height:16px;font-size:8px;border-radius:4px;}

/* ---------- 22. 弹窗 ---------- */
.modal-mask{
  position:fixed;inset:0;background:rgba(15,23,42,.45);z-index:500;
  display:none;align-items:center;justify-content:center;padding:24px;backdrop-filter:blur(2px);
}
.modal-mask.open{display:flex;}
.modal{
  background:#fff;border-radius:var(--radius-lg);width:100%;max-height:88vh;overflow-y:auto;
  box-shadow:0 24px 60px rgba(15,23,42,.24);animation:modalIn .18s ease;
}
@keyframes modalIn{from{opacity:0;transform:translateY(12px) scale(.98);}to{opacity:1;transform:none;}}
.modal.s{max-width:480px;}
.modal.m{max-width:680px;}
.modal.l{max-width:980px;}
/* 对话型弹框（.modal.chat）与 .dash-ask-* 在 2026-10-17 随数据看板那张
   「数据分析智能体 · 指令式分析」对话框一起删除：全站再没有 size="chat" 的弹窗。 */
.modal-head{display:flex;align-items:center;justify-content:space-between;padding:18px 22px;border-bottom:1px solid var(--border-soft);position:sticky;top:0;background:#fff;z-index:2;border-radius:var(--radius-lg) var(--radius-lg) 0 0;}
.modal-head h3{margin:0;font-size:16px;font-weight:700;color:var(--text-dark);}
.modal-body{padding:20px 22px;}
.modal-foot{padding:14px 22px;border-top:1px solid var(--border-soft);display:flex;justify-content:flex-end;gap:9px;position:sticky;bottom:0;background:#fff;}

/* ---------- 23. Toast ---------- */
.toast-wrap{position:fixed;top:74px;right:20px;z-index:900;display:flex;flex-direction:column;gap:9px;}
.toast{
  background:var(--text-dark);color:#fff;padding:11px 16px;border-radius:11px;font-size:12.5px;font-weight:500;
  box-shadow:0 8px 26px rgba(15,23,42,.28);display:flex;align-items:center;gap:8px;
  animation:toastIn .2s ease;max-width:360px;
}
@keyframes toastIn{from{opacity:0;transform:translateX(24px);}to{opacity:1;transform:none;}}
.toast.success{background:var(--success);}
.toast.error{background:var(--danger);}
.toast.info{background:var(--brand);}
.toast .material-symbols-outlined{font-size:17px;}
/* 带动作的 toast（依 7.3 Q-08 / BR-16：移入公海后给「去公海查看 / 撤销」）。
   动作要留得住手——所以带动作的那一条不自动消失，由动作或关掉它来收尾。 */
.toast.has-act{align-items:flex-start;flex-wrap:wrap;}
.toast-act{display:flex;gap:12px;align-items:center;width:100%;margin-top:6px;padding-left:25px;}
.toast-act a,.toast-act span{color:#fff;font-size:12px;font-weight:700;text-decoration:underline;cursor:pointer;}
.toast-act .ta-close{font-weight:500;text-decoration:none;opacity:.8;margin-left:auto;}

/* ---------- 24. 两栏 / 三栏工作区 ---------- */
.split{display:grid;gap:14px;}
.split-340{grid-template-columns:340px minmax(0,1fr);}
.split-300{grid-template-columns:300px minmax(0,1fr);}
.split-3{grid-template-columns:300px minmax(0,1fr) 320px;}
.split-r220{grid-template-columns:minmax(0,1fr) 220px;}
.split-r320{grid-template-columns:minmax(0,1fr) 320px;}
.split-r360{grid-template-columns:minmax(0,1fr) 360px;}
.split-r400{grid-template-columns:minmax(0,1fr) 400px;}
@media(max-width:1280px){
  .split-3{grid-template-columns:280px minmax(0,1fr);}
  .split-3 > :last-child{grid-column:1/-1;}
  .split-r400{grid-template-columns:minmax(0,1fr) 340px;}
}
/* 批量处理页：加宽左侧"选择素材"与右侧"生成结果"两栏 */
.split-3.batch-cols{grid-template-columns:360px minmax(0,1fr) 400px;}
@media(max-width:1400px){
  .split-3.batch-cols{grid-template-columns:320px minmax(0,1fr) 340px;}
}
@media(max-width:1100px){
  .split-340,.split-300,.split-r220,.split-r320,.split-r360,.split-r400,.split-3{grid-template-columns:minmax(0,1fr);}
}
.pane{background:#fff;border:1px solid var(--border-soft);border-radius:var(--radius-lg);display:flex;flex-direction:column;overflow:hidden;}
.pane-head{padding:14px 16px;border-bottom:1px solid var(--border-soft);display:flex;align-items:center;justify-content:space-between;gap:10px;flex-shrink:0;}
.pane-head h3{margin:0;font-size:14px;font-weight:700;color:var(--text-dark);}
.pane-head .ph-sub{font-size:11px;color:var(--text-faint);margin-top:2px;}
.pane-body{padding:12px;overflow-y:auto;flex:1;}
.pane-body.flush{padding:0;}
.pane-foot{padding:12px 16px;border-top:1px solid var(--border-soft);flex-shrink:0;}
.pane-scroll{max-height:600px;}

/* ---------- 25. 详情字段 ---------- */
.detail-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px 18px;}
@media(max-width:900px){.detail-grid{grid-template-columns:repeat(2,minmax(0,1fr));}}
.detail-item .dl{font-size:11px;color:var(--text-faint);margin-bottom:3px;}
.detail-item .dv{font-size:13px;font-weight:600;color:var(--text-dark);}
.detail-section{border-top:1px solid var(--border-soft);margin-top:16px;padding-top:14px;}
.detail-section-title{font-size:12.5px;font-weight:700;color:var(--text-dark);margin-bottom:10px;display:flex;align-items:center;gap:6px;}
.detail-section-title .material-symbols-outlined{font-size:16px;color:var(--brand);}

/* 时间线 */
.timeline{position:relative;padding-left:20px;}
.timeline::before{content:'';position:absolute;left:5px;top:6px;bottom:6px;width:1.5px;background:var(--border);}
.tl-item{position:relative;padding-bottom:15px;}
.tl-item:last-child{padding-bottom:0;}
.tl-item::before{content:'';position:absolute;left:-18px;top:4px;width:9px;height:9px;border-radius:50%;background:#fff;border:2px solid var(--brand);}
.tl-item.done::before{background:var(--success);border-color:var(--success);}
.tl-item.pending::before{border-color:var(--text-faint);}
.tl-t{font-size:12.5px;font-weight:600;color:var(--text-dark);}
.tl-d{font-size:11.5px;color:var(--text-soft);margin-top:3px;line-height:1.6;}
.tl-time{font-size:11px;color:var(--text-faint);margin-top:3px;}

/* 步骤条 */
.steps{display:flex;align-items:center;gap:0;margin-bottom:20px;}
.step{display:flex;align-items:center;gap:9px;flex:1;}
.step-num{
  width:26px;height:26px;border-radius:50%;background:var(--bg-soft2);color:var(--text-faint);
  display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex-shrink:0;
}
.step.active .step-num{background:var(--brand);color:#fff;box-shadow:var(--sh-brand);}
.step.done .step-num{background:var(--success);color:#fff;}
.step-label{font-size:12.5px;font-weight:600;color:var(--text-faint);white-space:nowrap;}
.step.active .step-label{color:var(--brand);}
.step.done .step-label{color:var(--text-mid);}
.step-line{flex:1;height:1.5px;background:var(--border);margin:0 12px;}
.step.done + .step .step-line,.step.done .step-line{background:var(--success);}

/* 进度条 */
.progress{height:7px;background:var(--bg-soft2);border-radius:999px;overflow:hidden;}
.progress-fill{height:100%;background:var(--brand);border-radius:999px;transition:width .4s;}
.progress-fill.success{background:var(--success);}
.progress-fill.warn{background:var(--warn);}
.progress-fill.danger{background:var(--danger);}
.progress-fill.paused{background:var(--text-faint);}

/* 知识库文档预览：按文件类型着色的图标 */
.doc-icon{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.doc-icon .material-symbols-outlined{font-size:20px;}
.doc-icon.pdf{background:#fdeee8;color:#d9622b;}
.doc-icon.xlsx{background:#ecfdf5;color:#059669;}
.doc-icon.docx{background:#eef2ff;color:#3b30e8;}
.doc-icon.pptx{background:#fef3c7;color:#b45309;}
.doc-preview-body{background:var(--bg-soft);border:1px solid var(--border-soft);border-radius:10px;padding:12px 14px;font-size:12px;color:var(--text-mid);line-height:1.75;white-space:pre-line;}

/* 学习路径：AI 生成文章的图文配图（用 Material Symbols + 渐变色块模拟示意图/照片占位） */
.article-figure{border-radius:11px;overflow:hidden;border:1px solid var(--border-soft);background:#fff;}
.article-figure .fig-thumb{height:110px;display:flex;align-items:center;justify-content:center;}
.article-figure .fig-thumb .material-symbols-outlined{font-size:34px;opacity:.85;}
.article-figure .fig-caption{padding:7px 10px;font-size:11px;color:var(--text-faint);line-height:1.4;border-top:1px solid var(--border-soft);}

/* 上传知识向导：紧凑型点状步骤条 */
.kb-steps{display:flex;align-items:flex-start;margin-bottom:22px;}
.kb-steps .ks-item{display:flex;flex-direction:column;align-items:center;gap:7px;flex-shrink:0;width:64px;}
.kb-steps .ks-dot{width:8px;height:8px;border-radius:50%;background:var(--border);margin-top:4px;flex-shrink:0;}
.kb-steps .ks-item.done .ks-dot,.kb-steps .ks-item.active .ks-dot{background:var(--success);}
.kb-steps .ks-label{font-size:11px;color:var(--text-faint);white-space:nowrap;font-weight:600;}
.kb-steps .ks-item.done .ks-label{color:var(--text-soft);}
.kb-steps .ks-item.active .ks-label{color:var(--success);font-weight:700;}
.kb-steps .ks-line{flex:1;height:1px;background:var(--border);margin-top:8px;}
.kb-steps .ks-item.done + .ks-line{background:var(--success);}

/* 上传知识向导：白底浮起式来源切换（区别于品牌色填充的 .segment） */
.segment.light{background:var(--bg-soft2);border:none;padding:4px;}
.segment.light button{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;color:var(--text-soft);}
.segment.light button .material-symbols-outlined{font-size:16px;}
.segment.light button.active{background:#fff;color:var(--text-dark);box-shadow:0 1px 3px rgba(15,23,42,.12);}

/* 上传知识向导：查重结果 + 人工确认卡片（分类为人工选定，非 AI 判定） */
.confirm-card{display:flex;flex-direction:column;gap:10px;background:var(--bg-soft);border-radius:var(--radius-md);padding:14px 16px;}
.confirm-row{display:flex;align-items:flex-start;gap:8px;font-size:12.5px;color:var(--text-mid);line-height:1.6;}
.confirm-row .material-symbols-outlined{font-size:17px;flex-shrink:0;margin-top:1px;}
.confirm-row.ok .material-symbols-outlined{color:var(--success);}
.confirm-row.warn .material-symbols-outlined{color:var(--warn);}
.confirm-row.danger .material-symbols-outlined{color:var(--danger);}

/* 上传知识向导：居中状态屏（校验中/上传成功/索引中等） */
.kb-upload-center{text-align:center;padding:32px 16px;}
.kb-upload-status-icon{
  width:44px;height:44px;border-radius:50%;background:var(--info-bg);color:var(--brand);
  display:flex;align-items:center;justify-content:center;margin:0 auto 14px;
}
.kb-upload-status-icon .material-symbols-outlined{font-size:22px;}
.kb-upload-status-icon.success{background:var(--success-bg);color:var(--success);}
.kb-upload-status-icon.spin .material-symbols-outlined{animation:kbSpin 1s linear infinite;}
@keyframes kbSpin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}

/* 折叠面板 */
.accordion{border:1px solid var(--border-soft);border-radius:11px;overflow:hidden;margin-bottom:9px;}
.acc-head{padding:12px 14px;display:flex;align-items:center;justify-content:space-between;cursor:pointer;background:#fff;transition:background .12s;gap:10px;}
.acc-head:hover{background:var(--bg-soft);}
.acc-head .acc-t{font-size:12.5px;font-weight:600;color:var(--text-dark);display:flex;align-items:center;gap:8px;}
.acc-head .material-symbols-outlined.arrow{font-size:19px;color:var(--text-faint);transition:transform .18s;}
.accordion.open .acc-head .material-symbols-outlined.arrow{transform:rotate(180deg);}
.acc-body{display:none;padding:0 14px 14px;border-top:1px solid var(--border-soft);}
.accordion.open .acc-body{display:block;padding-top:12px;}

/* 工具条 */
.toolbar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:14px;}
.toolbar-left{display:flex;align-items:center;gap:9px;flex-wrap:wrap;flex:1;}
.toolbar-right{display:flex;gap:8px;flex-shrink:0;}
.toolbar select,.toolbar input[type=text],.toolbar input[type=date]{
  padding:8px 11px;border:1px solid var(--border);border-radius:9px;font-size:12.5px;color:var(--text-mid);background:#fff;
}
.toolbar select{padding-right:30px;}
.toolbar select:focus,.toolbar input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(59,48,232,.1);}

/* 分页 */
.pagination{display:flex;justify-content:space-between;align-items:center;margin-top:14px;font-size:12.5px;color:var(--text-soft);}
.pager{display:flex;gap:4px;}
.pager button{min-width:30px;height:30px;border-radius:8px;border:1px solid var(--border);background:#fff;font-size:12.5px;font-weight:600;color:var(--text-mid);display:flex;align-items:center;justify-content:center;transition:all .15s;}
.pager button:hover{border-color:var(--brand);color:var(--brand);}
.pager button.active{background:var(--brand);border-color:var(--brand);color:#fff;}
.pager button .material-symbols-outlined{font-size:16px;}
/* 页码截断时的省略号：后面还有多少页，末页那个按钮会给出来 */
.pager-gap{min-width:20px;height:30px;display:flex;align-items:center;justify-content:center;color:var(--text-faint);font-size:12.5px;}
.pager-pages{display:flex;align-items:center;color:var(--text-faint);font-size:12px;margin-right:6px;}

/* 通用工具类 */
.mt-0{margin-top:0;} .mt-2{margin-top:8px;} .mt-3{margin-top:12px;} .mt-4{margin-top:16px;}
.mb-0{margin-bottom:0;} .mb-2{margin-bottom:8px;} .mb-3{margin-bottom:12px;} .mb-4{margin-bottom:16px;}
.text-soft{color:var(--text-soft);} .text-faint{color:var(--text-faint);} .text-dark{color:var(--text-dark);}
.text-brand{color:var(--brand);} .text-success{color:var(--success);} .text-danger{color:var(--danger);} .text-warn{color:var(--warn);}
.fs-10{font-size:10px;} .fs-11{font-size:11px;} .fs-12{font-size:12px;}
.fs-12\.5{font-size:12.5px;} .fs-13{font-size:13px;} .fs-15{font-size:15px;} .fs-18{font-size:18px;}
.text-mid{color:var(--text-mid);}
.text-center{text-align:center;}
.mt-1{margin-top:4px;}
.fw-6{font-weight:600;} .fw-7{font-weight:700;} .fw-8{font-weight:800;}
.lh-17{line-height:1.7;}
.nowrap{white-space:nowrap;}
.divider{height:1px;background:var(--border-soft);margin:14px 0;}
.scroll-y{overflow-y:auto;}
.max-360{max-height:360px;} .max-460{max-height:460px;} .max-560{max-height:560px;}

/* ---- AI 背调详情面板（bd-*）---- */
.bd-header{padding:16px 18px 12px;border-bottom:1px solid var(--border-soft);}
.bd-header-top{display:flex;align-items:center;gap:12px;}
.bd-avatar{width:46px;height:46px;border-radius:50%;background:linear-gradient(135deg,#667eea,#764ba2);flex-shrink:0;display:flex;align-items:center;justify-content:center;color:#fff;font-size:15px;font-weight:700;}
.bd-name-area{flex:1;min-width:0;}
.bd-name{font-size:15px;font-weight:700;color:var(--text-dark);line-height:1.3;}
.bd-tags{display:flex;gap:6px;margin-top:7px;flex-wrap:wrap;}
.bd-tag{font-size:11px;padding:3px 9px;border-radius:10px;font-weight:600;white-space:nowrap;}
.bd-tag.role{background:var(--info-bg);color:var(--brand);}
.bd-tag.industry{background:#e8f3ff;color:#165dff;}
.bd-tag.intent{background:var(--success-bg);color:var(--success);}
.bd-tag.region{background:var(--bg-soft);color:var(--text-soft);}

.bd-labeling-card{margin:12px 16px;padding:14px 16px;background:var(--info-bg);border-radius:10px;border-left:3px solid var(--brand);}
.bd-label-row{display:flex;align-items:center;justify-content:space-between;}
.bd-label-level{display:flex;align-items:center;gap:6px;}
.bd-label-dot{width:8px;height:8px;border-radius:50%;background:var(--brand);flex-shrink:0;}
.bd-label-l{font-size:15px;font-weight:700;color:var(--brand);}
.bd-label-name{font-size:13px;color:var(--text-soft);font-weight:600;}
.bd-label-ai-tag{font-size:11px;color:#fff;background:var(--brand);padding:2px 8px;border-radius:8px;font-weight:600;}
.bd-cond-row{display:flex;gap:5px;margin-top:12px;flex-wrap:wrap;}
.bd-cond-pill{font-size:11px;padding:3px 9px;border-radius:10px;white-space:nowrap;font-weight:600;}
.bd-cond-pill.done{color:var(--success);background:var(--success-bg);}
.bd-cond-pill.pending{color:var(--text-faint);background:var(--bg-soft);}
.bd-label-reason{font-size:11.5px;color:var(--text-soft);line-height:1.65;margin-top:10px;}
.bd-label-tip{margin-top:8px;font-size:11px;color:var(--brand);display:flex;align-items:center;gap:4px;font-weight:600;}

.bd-section{padding:16px 18px;border-top:1px solid var(--border-soft);}
.bd-section-title{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:700;color:var(--text-dark);margin-bottom:12px;}
.bd-section-title::before{content:'';width:3px;height:15px;border-radius:2px;background:var(--brand);flex-shrink:0;}
.bd-source-tag{font-size:11px;color:var(--text-faint);font-weight:500;margin-left:auto;padding:2px 8px;background:var(--bg-soft);border-radius:8px;white-space:nowrap;}

.bd-summary-rows{display:flex;flex-direction:column;}
.bd-summary-row{display:flex;align-items:flex-start;padding:10px 12px;border-bottom:1px solid var(--border-soft);}
.bd-summary-row:last-child{border-bottom:none;}
.bd-row-label{width:64px;font-size:11px;font-weight:700;color:var(--text-faint);flex-shrink:0;line-height:1.6;padding-top:1px;}
.bd-row-body{flex:1;display:flex;flex-direction:column;gap:3px;}
.bd-row-verdict{font-size:12px;font-weight:700;line-height:1.5;}
.bd-row-verdict.good{color:var(--success);}
.bd-row-verdict.info{color:var(--brand);}
.bd-row-verdict.neutral{color:var(--text-soft);}
.bd-row-verdict.warn{color:var(--warn);}
.bd-row-evidence{font-size:12px;color:var(--text-faint);line-height:1.55;}

.bd-summary-footer{display:flex;align-items:center;justify-content:space-between;margin-top:14px;padding:12px 14px;border-radius:8px;background:var(--info-bg);border:1px solid var(--info-border);gap:16px;flex-wrap:wrap;}
.bd-footer-left,.bd-footer-right{display:flex;align-items:center;gap:8px;}
.bd-footer-label{font-size:11px;color:var(--text-faint);font-weight:600;}
.bd-verdict-grade{font-size:13px;font-weight:700;padding:2px 10px;border-radius:6px;}
.bd-verdict-grade.grade-a{color:var(--success);background:var(--success-bg);}
.bd-verdict-grade.grade-b{color:var(--warn);background:var(--warn-bg);}
.bd-verdict-grade.grade-c{color:var(--text-soft);background:var(--bg-soft);}
.bd-next-label{font-size:11px;font-weight:700;color:var(--brand);white-space:nowrap;}
.bd-next-text{font-size:11px;color:var(--text-soft);line-height:1.5;}

.bd-evidence-list{margin:0;padding-left:18px;font-size:11.5px;color:var(--text-soft);line-height:1.7;}
.bd-evidence-list li{margin-bottom:5px;}
.bd-infer{font-size:11px;color:var(--text-faint);font-style:italic;}
.bd-risk-tag{font-size:11px;color:#fff;background:var(--danger);padding:1px 5px;border-radius:3px;margin-left:4px;font-style:normal;}

.bd-verdict{font-size:11.5px;line-height:1.6;padding:10px 14px;border-radius:8px;margin-top:10px;font-weight:600;}
.bd-verdict.positive{background:var(--success-bg);border-left:3px solid var(--success);color:#166900;}
.bd-verdict.negative{background:var(--danger-bg);border-left:3px solid var(--danger);color:#b33928;}
.bd-verdict.neutral{background:var(--info-bg);border-left:3px solid var(--brand);color:#2a3a8f;}

.bd-collapsible{border:1px solid var(--border-soft);border-radius:10px;margin-bottom:10px;overflow:hidden;background:#fff;transition:box-shadow .2s;}
.bd-collapsible:hover{box-shadow:var(--sh-sm);}
.bd-mod-header{display:flex;align-items:center;gap:10px;padding:12px 16px;cursor:pointer;background:var(--bg-soft);border-bottom:1px solid transparent;transition:all .15s ease;user-select:none;}
.bd-mod-header:hover{background:#f1f5f9;}
.bd-mod-num{width:24px;height:24px;border-radius:6px;background:var(--brand);color:#fff;font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.bd-mod-title{font-size:13px;font-weight:700;color:var(--text-dark);}
.bd-mod-count{font-size:11px;color:var(--text-faint);margin-left:auto;}
.bd-mod-arrow{font-size:15px;color:var(--text-faint);transition:transform .25s ease;flex-shrink:0;display:flex;}
.bd-collapsible.open .bd-mod-arrow{transform:rotate(90deg);}
.bd-collapsible.open .bd-mod-header{border-bottom-color:var(--border-soft);background:#fff;}
.bd-mod-body{max-height:0;overflow:hidden;transition:max-height .35s ease-out;padding:0 16px;}
.bd-collapsible.open .bd-mod-body{max-height:4000px;padding:12px 16px 16px;transition:max-height .4s ease-in;}

.bd-sub-block{padding:14px 0;border-bottom:1px solid var(--border-soft);}
.bd-sub-block:last-child{border-bottom:none;}
.bd-sub-header{font-size:12.5px;font-weight:700;color:var(--text-dark);margin-bottom:10px;padding-left:10px;border-left:3px solid var(--brand);line-height:1.4;}

.bd-footer{margin-top:auto;padding:12px 18px;border-top:1px solid var(--border-soft);font-size:11px;color:var(--text-faint);display:flex;justify-content:space-between;align-items:center;flex-shrink:0;}
.bd-footer-refresh{cursor:pointer;color:var(--text-soft);display:flex;align-items:center;gap:4px;}
.bd-footer-refresh:hover{color:var(--brand);}

/* ---- 背调报告全页视图（bgr-*）---- */
.bgr-stepper{position:relative;display:flex;justify-content:space-between;align-items:center;background:linear-gradient(135deg,var(--brand),#7b6bf5);border-radius:14px;padding:20px 48px;margin-bottom:22px;}
.bgr-stepper-item{display:flex;align-items:center;gap:10px;color:#fff;position:relative;z-index:1;}
.bgr-stepper-num{width:30px;height:30px;border-radius:50%;background:rgba(255,255,255,.22);border:1.5px solid rgba(255,255,255,.6);color:#fff;font-size:14px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.bgr-stepper-item.done .bgr-stepper-num{background:#fff;color:var(--brand);border-color:#fff;}
.bgr-stepper-label{font-size:13px;font-weight:700;white-space:nowrap;}

.bgr-section-title{font-size:16px;font-weight:800;color:var(--text-dark);margin:0 0 14px;display:flex;align-items:center;gap:8px;}
.bgr-section-title .en{font-size:12px;font-weight:500;color:var(--text-faint);}

.bgr-summary-text{font-size:12.5px;color:var(--text-soft);line-height:1.8;background:var(--bg-soft);border-radius:10px;padding:14px 16px;margin-bottom:16px;}

.bgr-sum-card{background:#fff;border:1px solid var(--border-soft);border-radius:12px;padding:14px 16px;}
.bgr-sum-head{display:flex;align-items:center;gap:8px;margin-bottom:10px;}
.bgr-sum-icon{width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0;}
.bgr-sum-icon .material-symbols-outlined{font-size:15px;}
.bgr-sum-title{font-size:12.5px;font-weight:700;color:var(--text-dark);}
.bgr-sum-body{font-size:11.5px;color:var(--text-soft);line-height:1.7;}

.bgr-detail-card{background:var(--bg-soft);border-radius:12px;overflow:hidden;}
.bgr-detail-tab{position:relative;display:inline-flex;align-items:center;background:var(--brand);color:#fff;font-size:12.5px;font-weight:700;padding:8px 26px 8px 16px;margin:14px 0 0 14px;clip-path:polygon(0 0,100% 0,calc(100% - 14px) 50%,100% 100%,0 100%);}
.bgr-detail-body{padding:14px 20px 18px;font-size:11.5px;color:var(--text-soft);line-height:1.85;}

/* ---- 滑杆（生成强度 / 相似度）---- */
.sns-slider-label{display:flex;align-items:center;}
.sns-slider-val{color:var(--brand);font-weight:700;}
.sns-slider-range{display:flex;justify-content:space-between;font-size:11px;color:var(--text-faint);margin-top:6px;}
input[type=range].sns-slider{-webkit-appearance:none;appearance:none;width:100%;height:6px;border-radius:999px;background:var(--border);outline:none;margin-top:6px;cursor:pointer;}
input[type=range].sns-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;border-radius:50%;background:var(--brand);border:2px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.25);cursor:pointer;}
input[type=range].sns-slider::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:var(--brand);border:2px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.25);cursor:pointer;}
.sns-mode-pane{display:none;}
.sns-mode-pane.active{display:block;}

/* ---- 文生图：图片上传卡 ---- */
.sns-upload-body{margin-top:2px;}
.sns-upload-empty{padding:20px 0;text-align:center;color:var(--text-faint);font-size:12px;}
.sns-upload-grid{display:flex;flex-wrap:wrap;gap:8px;}
.sns-upload-chip{display:flex;align-items:center;gap:6px;background:var(--bg-soft);border:1px solid var(--border-soft);border-radius:8px;padding:6px 10px;font-size:11.5px;color:var(--text-soft);}
.sns-upload-chip .material-symbols-outlined:first-child{font-size:15px;color:var(--brand);}
.sns-upload-remove{font-size:14px;color:var(--text-faint);cursor:pointer;margin-left:2px;}
.sns-upload-remove:hover{color:var(--danger);}

/* ---- 文生图：AI 对话助手空状态 ---- */
.sns-chat-empty{text-align:center;padding:26px 10px 18px;}
.sns-chat-logo{font-size:13px;font-weight:700;color:var(--text-soft);margin-bottom:14px;display:flex;align-items:center;justify-content:center;gap:5px;}
.sns-chat-logo .material-symbols-outlined{color:var(--brand);font-size:18px;}
.sns-chat-empty-title{font-size:12.5px;color:var(--text-soft);margin-bottom:6px;}
.sns-chat-empty-hint{font-size:11px;color:var(--text-faint);}

/* ---- 文生图：开始生成大按钮 ---- */
.sns-generate-btn{display:block;width:100%;text-align:center;padding:14px;border-radius:12px;background:linear-gradient(135deg,var(--brand),#7b6bf5);color:#fff;font-size:14px;font-weight:700;border:none;cursor:pointer;transition:opacity .15s;}
.sns-generate-btn:hover{opacity:.92;}
.sns-generate-btn .material-symbols-outlined{vertical-align:-3px;margin-right:4px;}

/* ---- 文生图：右侧栏三张卡与左侧等高，均匀分布 ---- */
.sns-sidebar-col{display:flex;flex-direction:column;gap:14px;height:100%;}
.sns-sidebar-col .card{flex:1;display:flex;flex-direction:column;}
.sns-sidebar-col .card:last-child{flex:1;}

/* ============================================================
   通用详情抽屉 — 行/卡片点击 → 右侧滑出详情（跨页面复用）
   ============================================================ */
.detail-drawer-mask{
  position:fixed;inset:0;background:rgba(15,23,42,.40);z-index:480;
  display:none;backdrop-filter:blur(2px);
}
.detail-drawer-mask.open{display:block;animation:ddMaskIn .18s ease;}
/* 从弹框里点开的抽屉压在弹框之上（见 app.js novaOpenDetail）。
   默认低于 .modal-mask(500) 是为了抽屉里弹二次确认时确认框在上面。 */
.detail-drawer-mask.dd-over-modal{z-index:520;}
@keyframes ddMaskIn{from{opacity:0;}to{opacity:1;}}
.detail-drawer{
  position:absolute;top:0;right:0;height:100%;width:440px;max-width:92vw;
  background:#fff;box-shadow:-18px 0 50px rgba(15,23,42,.18);
  display:flex;flex-direction:column;animation:ddIn .24s cubic-bezier(.22,.61,.36,1);
}
@keyframes ddIn{from{transform:translateX(100%);}to{transform:none;}}

/* 宽变体：协助事项那张 6 列表格放不进 440px 的字段详情抽屉。
   位置仍从右侧推出——与全站其它抽屉一致，只改宽度不改方向。 */
.detail-drawer.dd-wide{width:920px;}
.detail-drawer.dd-wide .dd-body{padding:14px 20px 24px;}
/* 六列表格在抽屉里：操作列是主要动作，不能被边缘吃掉。
   诉求列给个下限就够，其余让内容自己定宽；真放不下时由 .table-wrap 自己横滚。 */
.detail-drawer.dd-wide .dd-body .table-wrap{margin:0;padding:0;}
.detail-drawer.dd-wide .dd-body td:last-child,
.detail-drawer.dd-wide .dd-body th:last-child{white-space:nowrap;}
@media (prefers-reduced-motion:reduce){
  .detail-drawer{animation:none;}
}
@media (max-width:900px){
  .detail-drawer.dd-wide{width:100%;max-width:100vw;}
}
.dd-head{
  display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  padding:18px 20px 14px;border-bottom:1px solid var(--border-soft);
  position:sticky;top:0;background:#fff;z-index:2;
}
.dd-head-main{min-width:0;}
.dd-title{font-size:17px;font-weight:800;color:var(--text-dark);line-height:1.3;word-break:break-word;}
.dd-sub{font-size:12px;color:var(--text-soft);margin-top:3px;}
.dd-body{padding:16px 20px 24px;overflow-y:auto;flex:1;}
.dd-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px;}
.dd-section{border-top:1px solid var(--border-soft);margin-top:16px;padding-top:14px;}
.dd-section:first-child{border-top:none;margin-top:0;padding-top:0;}
.dd-section-title{font-size:12.5px;font-weight:700;color:var(--text-dark);margin-bottom:10px;display:flex;align-items:center;gap:6px;}
.dd-section-title .material-symbols-outlined{font-size:16px;color:var(--brand);}
.dd-fields{display:flex;flex-direction:column;gap:12px;}
.dd-field{display:flex;flex-direction:column;gap:3px;}
.dd-label{font-size:11px;color:var(--text-faint);}
.dd-value{font-size:13px;font-weight:600;color:var(--text-dark);line-height:1.5;word-break:break-word;}
.dd-value .num{font-variant-numeric:tabular-nums;}
.dd-empty{font-size:12.5px;color:var(--text-faint);padding:8px 0;text-align:center;}
.dd-foot{padding:13px 20px;border-top:1px solid var(--border-soft);display:flex;justify-content:flex-end;gap:9px;position:sticky;bottom:0;background:#fff;}
.dd-foot .btn{flex:0 0 auto;}

/* 转化漏斗可视化（数据看板） */
.funnel-viz{padding:10px 0 2px;}
.funnel-stage{display:flex;flex-direction:column;align-items:center;cursor:pointer;}
.funnel-bar{height:40px;border-radius:9px;padding:0 12px;box-sizing:border-box;

  display:flex;align-items:center;justify-content:center;
  gap:8px;color:#fff;font-size:12.5px;font-weight:700;transition:opacity .15s,transform .15s;margin:0 auto;}
.funnel-stage:hover .funnel-bar{opacity:.85;transform:scale(1.01);}
.funnel-stage .fs-name{font-size:11px;color:var(--text-faint);margin-top:5px;font-weight:600;}
.funnel-drop{display:flex;align-items:center;justify-content:center;gap:4px;font-size:11px;
  color:var(--text-faint);padding:5px 0;}
.funnel-drop .material-symbols-outlined{font-size:13px;}
.funnel-drop b{color:var(--text-soft);font-weight:600;}

/* 表格行可点击提示（行点击会滑出详情抽屉） */
.table-wrap tbody tr[data-row],
tbody tr[data-row]{cursor:pointer;transition:background .12s;}
.table-wrap tbody tr[data-row]:hover,
tbody tr[data-row]:hover{background:var(--info-bg);}
tbody tr[data-row].selected{background:var(--info-bg);}

/* ---------- 20. 智能体（执行者署名 / 授权档位） ---------- */
.agent-badge{
  display:inline-flex;align-items:center;gap:6px;padding:3px 8px 3px 4px;
  border:1px solid var(--border);border-radius:999px;background:var(--bg-card);
  font-size:11.5px;font-weight:600;color:var(--text-soft);text-decoration:none;
  white-space:nowrap;transition:border-color .15s ease,box-shadow .15s ease;
}
.agent-badge:hover{border-color:var(--brand);box-shadow:var(--sh-brand);}
.agent-badge .ab-ic{
  width:18px;height:18px;border-radius:50%;display:inline-flex;
  align-items:center;justify-content:center;flex-shrink:0;
}
.agent-badge .ab-ic .material-symbols-outlined{font-size:12px;}
.agent-badge .ab-name{color:var(--text-dark);}
/* 侧边栏的授权档位标记 2026-08-27 去掉，样式一并删除。 */
.agent-badge.sm{padding:2px 6px 2px 3px;font-size:11px;}
.agent-badge.sm .ab-name{display:none;}

/* 智能体卡片墙 */
.agent-card{
  display:block;padding:18px;border:1px solid var(--border);border-radius:var(--radius-lg);
  background:var(--bg-card);box-shadow:0 1px 2px rgba(15,23,42,.05);
  text-decoration:none;transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease;
}
.agent-card:hover{border-color:var(--brand);box-shadow:var(--sh-brand);transform:translateY(-1px);}
.agent-avatar{
  width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center;
  flex-shrink:0;
}
.agent-avatar .material-symbols-outlined{font-size:22px;}
.agent-card .ac-name{font-size:14px;font-weight:700;color:var(--text-dark);}
.agent-card .ac-duty{font-size:11.5px;color:var(--text-faint);line-height:1.5;margin-top:2px;}

/* 侧边抽屉式弹窗：与通用详情抽屉同一套观感，用于「添加成员」这类右侧滑出的表单。
   复用 .modal-mask / .modal 的结构与开关逻辑，只改定位与动画。 */
.modal-mask.side{padding:0;align-items:stretch;justify-content:flex-end;}
.modal.side, .modal.side-l{
  max-width:480px;height:100%;max-height:100%;border-radius:0;
  box-shadow:-18px 0 50px rgba(15,23,42,.18);
  display:flex;flex-direction:column;
  animation:modalSideIn .24s cubic-bezier(.22,.61,.36,1);
}
@keyframes modalSideIn{from{transform:translateX(100%);}to{transform:none;}}
.modal.side-l{max-width:760px;}   /* 报告类内容用宽抽屉，表格与 KPI 才排得开 */
.modal.side .modal-head, .modal.side-l .modal-head{border-radius:0;}
.modal.side .modal-body, .modal.side-l .modal-body{overflow-y:auto;flex:1;}
@media(max-width:560px){ .modal.side, .modal.side-l{max-width:100%;} }

/* 左侧滑出的抽屉（2026-09-22）：结构与上面的右侧抽屉完全一样，只换对齐方向、
   投影方向与动画。mask 同时带 side 与 left 两个类，靠 .modal-mask.side.left
   覆盖 justify-content。（账号管理那三个成员抽屉起初用的它，当天就按用户要求
   改回右侧；这个变体留着备用，目前没有页面在用。） */
.modal-mask.side.left{justify-content:flex-start;}
.modal.side-left{
  max-width:480px;height:100%;max-height:100%;border-radius:0;
  box-shadow:18px 0 50px rgba(15,23,42,.18);
  display:flex;flex-direction:column;
  animation:modalSideLeftIn .24s cubic-bezier(.22,.61,.36,1);
}
@keyframes modalSideLeftIn{from{transform:translateX(-100%);}to{transform:none;}}
.modal.side-left .modal-head{border-radius:0;}
.modal.side-left .modal-body{overflow-y:auto;flex:1;}
@media(max-width:560px){ .modal.side-left{max-width:100%;} }

/* ---------- 21. 尊重系统「减少动态效果」设置 ----------
   卡片位移、弹窗滑入、进度条这类动效对前庭敏感的用户会引起不适。
   开了系统开关就把时长压到接近 0：交互仍然生效，只是不再有动画过程。 */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
  .sys-card:hover{transform:none;}
  /* 新增的箭头位移同样要在这里停下：它是装饰性的暗示，不是状态，
     关掉之后「进入系统」照样可点，只是不再动。 */
  .sys-card:hover .sys-card-footer .btn .material-symbols-outlined{transform:none;}
  .common-strip a:hover{transform:none;}
}

/* ---------- 22. 容器四态：骨架屏 / 两种空态 / 容器内错误 / 无权限 ----------
   2026-08-22 随客户维护拆页引入，目前只用在拆出来的三页上。
   要点全在「不制造新的布局位移」：骨架屏和它替换的内容等高，
   空态、错误、无权限共用一个外壳因而高度一致——切换状态时容器不跳。
   注意这里没有给容器写死高度：加载期用 min-height 占位，落地即释放，
   否则就是拿嵌套滚动条换 CLS。 */
.sk-line{
  height:14px;margin:9px 0;border-radius:6px;
  background:linear-gradient(90deg,var(--bg-soft2) 25%,var(--bg-soft) 37%,var(--bg-soft2) 63%);
  background-size:400% 100%;animation:sk-shimmer 1.4s ease infinite;
}
.sk-row{display:flex;gap:12px;align-items:center;padding:11px 0;border-bottom:1px solid var(--border-soft);}
.sk-row .sk-line{margin:0;flex:1;}
.sk-avatar{width:32px;height:32px;border-radius:9px;flex-shrink:0;
  background:var(--bg-soft2);animation:sk-shimmer 1.4s ease infinite;background-size:400% 100%;}
@keyframes sk-shimmer{0%{background-position:100% 50%}100%{background-position:0 50%}}
@media (prefers-reduced-motion:reduce){
  .sk-line,.sk-avatar{animation:none;}
}

/* 空态 / 错误 / 无权限共用外壳：同一套内边距与行高，状态切换不改变容器高度 */
.state-box{
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;padding:34px 20px;gap:7px;
}
.state-box .sb-ic{
  width:42px;height:42px;border-radius:12px;display:flex;align-items:center;justify-content:center;
  background:var(--bg-soft2);color:var(--text-faint);margin-bottom:3px;
}
.state-box .sb-ic .material-symbols-outlined{font-size:22px;}
.state-box .sb-title{font-size:13.5px;font-weight:700;color:var(--text-dark);}
.state-box .sb-desc{font-size:12px;color:var(--text-faint);line-height:1.6;max-width:46ch;}
.state-box .sb-desc b{color:var(--text-mid);}
.state-box .sb-act{margin-top:9px;display:flex;gap:8px;flex-wrap:wrap;justify-content:center;}
.state-box.is-error .sb-ic{background:var(--danger-bg);color:var(--danger);}
.state-box.is-forbidden .sb-ic{background:var(--warn-bg);color:var(--warn);}

/* 客群规模：分析型数字在操作型页面上只配一行，不配一整排 KPI 卡 */
.stat-strip{
  display:flex;flex-wrap:wrap;gap:8px 22px;align-items:baseline;
  padding:11px 16px;border:1px solid var(--border-soft);border-radius:var(--radius-lg);
  background:var(--bg-card);font-size:11.5px;color:var(--text-faint);
}
.stat-strip .ss-item b{
  font-size:15px;font-weight:800;color:var(--text-dark);margin-right:5px;
  font-variant-numeric:tabular-nums;letter-spacing:-.02em;
}
.stat-strip .ss-item i{font-style:normal;color:var(--success);margin-left:5px;}
.stat-strip .ss-item.warn b{color:var(--warn);}
/* 口径标签：统计条第一格，直接印着这批数字是谁的。
   「筛选态不说自己开着」是最容易让人拿错数去汇报的一种界面错误。 */
.stat-strip .ss-scope{
  display:inline-flex;align-items:center;gap:3px;
  padding:2px 9px;border-radius:999px;background:var(--info-bg);color:var(--brand);
  font-size:11px;font-weight:700;white-space:nowrap;
}
.stat-strip .ss-scope .material-symbols-outlined{font-size:13px;}
.stat-strip .ss-more{
  display:inline-flex;align-items:center;gap:3px;margin-left:auto;
  color:var(--text-faint);font-size:11px;text-decoration:none;min-height:22px;
}
.stat-strip .ss-more:hover{color:var(--brand);}
.stat-strip .ss-more .material-symbols-outlined{font-size:13px;}
/* 工作台侧栏窄，统计条竖排 */
.stat-strip-v{flex-direction:column;align-items:flex-start;gap:9px;}
.stat-strip-v .ss-more{margin-left:0;}

/* JS 渲染容器的高度下限：HTML 里它们是空的，内容由 app.js 填。
   不留位置就是每次加载都把下方内容顶一次——biz-customers 实测 CLS 0.137。
   用 min-height 而不是 height：内容更高照常生长，不会变成容器内滚动。
   数值取实际渲染高度（跟进表 5 行 414px、草稿 2 份 314px）。 */
#fuSuggestTable{min-height:414px;}
#csDraftList{min-height:314px;}
/* 2026-08-23：进行中的动作与历史记录也从静态 HTML 改成了 JS 渲染，
   同样得留位。3 张进行中卡片 359px、4 条历史 288px。 */
#csRunList{min-height:359px;}
#csHistList{min-height:288px;}
@media (max-width:900px){
  /* 窄屏下行会换行变高，下限反而多余，交给内容自己撑 */
  #fuSuggestTable,#csDraftList,#csRunList,#csHistList{min-height:0;}
}

/* 整卡可点的两块：光标、hover、焦点环都要有，否则「能点」这件事只有读代码才知道 */
.cs-run,.cs-hist{cursor:pointer;transition:border-color .15s,box-shadow .15s;}
.cs-run:hover{border-color:var(--brand);}
.cs-hist:hover .tl-t{color:var(--brand);}
.cs-run:focus-visible,.cs-hist:focus-visible{outline:2px solid var(--brand);outline-offset:2px;}

/* ---------- 23. 工作台 JS 渲染容器的高度下限 ----------
   这几个容器在 HTML 里是空的，内容由 app.js 填。不留位置就是每次加载都把
   下方内容顶一次——2026-08-23 汇报文案改成按数据生成后，实测 CLS 从 0.035 涨到 0.165。
   仍然用 min-height 不用 height：内容更高照常生长，不会退化成容器内滚动。
   数值取实际渲染高度。 */
#wbReportText{min-height:266px;}
/* 注意：量这些值必须让图标按 1em 渲染。沙盒里 Google 图标字体取不到时，
   连字名会以原文宽度（如 support_agent ≈115px）撑开布局，量到的是假高度——
   本节的 725px 就是这么来的，真实值是 357px。 */
#wbAssistChips{min-height:296px;}
#wbAssistMore{min-height:19px;}
#wbCustOverview{min-height:206px;}
/* 今日成交：与协助事项并排的窄卡，内容由 JS 渲染，留位防位移 */
#wbDealsBody{min-height:281px;}

/* 今日成交的紧凑列表：300px 宽只放「多少钱 + 谁签的」，
   客户 / 产品 / 时间点「详情」走右侧抽屉。金额用等宽数字，纵向能直接比大小。 */
.deal-mini{display:flex;flex-direction:column;}
.deal-mini .dm-row{
  display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  padding:9px 0;border-bottom:1px solid var(--border-soft);
}
.deal-mini .dm-row:last-child{border-bottom:none;}
.deal-mini .dm-amt{
  font-size:15px;font-weight:800;color:var(--text-dark);
  font-variant-numeric:tabular-nums;letter-spacing:-.02em;
}
.deal-mini .dm-owner{font-size:11.5px;color:var(--text-faint);white-space:nowrap;}
/* 同一个 id 在两页高度差很多：工作台截断成 8 条，协助队列页列全量 24 条。
   用 data-assist-limit 这个属性区分——它本来就是「这份是截断过的」的标记，
   不必再去 body 上加页面标识。 */
/* 协助队列页列全量 24 条；工作台那张常驻表 2026-08-23 已移除，
   容器空着不占位（明细走左侧抽屉），所以只给独立页留下限。 */
#wbAssistList{min-height:1569px;}
#wbAssistMore ~ *, .card:has(#wbAssistMore) #wbAssistList{min-height:0;}
@media (max-width:900px){
  /* 窄屏行会换行变高，下限反而多余 */
  #wbReportText,#wbAssistChips,#wbAssistList,#wbAssistMore,#wbCustOverview,
  #wbDealsBody,#wbAssistList[data-assist-limit]{min-height:0;}
}

/* ---------- 24. 销售目标表 ----------
   12 个月 + 对象 + 合计 = 14 列，桌面端也放不下，所以横向滚动交给
   .table-wrap（它本来就有 overflow-x:auto），页面 body 永远不横向滚。 */
.tg-table{min-width:1080px;}
.tg-table th.num,.tg-table td.num{text-align:right;white-space:nowrap;}
.tg-table th{font-size:11.5px;}
/* 当前月整列点亮——一张 12 列的表里，最该看的是这一列 */
.tg-table .tg-now{background:var(--info-bg);}
.tg-table thead th.tg-now{color:var(--brand);font-weight:800;}
.tg-cell{
  width:74px;padding:5px 8px;text-align:right;
  border:1px solid transparent;border-radius:7px;background:transparent;
  font-size:12.5px;color:var(--text-dark);font-variant-numeric:tabular-nums;
  transition:border-color .15s ease,background-color .15s ease;
}
.tg-cell:hover{border-color:var(--border);background:var(--bg-card);}
.tg-cell:focus{outline:none;border-color:var(--brand);background:var(--bg-card);
  box-shadow:var(--sh-brand);}
.tg-cell:focus-visible{outline:2px solid var(--brand);outline-offset:1px;}
.tg-table tr.tg-foot td{
  background:var(--bg-soft);font-weight:700;font-size:12.5px;
  border-top:1px solid var(--border);
}
.tg-table tr.tg-foot td:first-child{color:var(--text-soft);font-weight:600;}
/* 同样是 JS 渲染的空容器，不留位置就是每次加载顶一次（实测 CLS 0.22） */
#tgSummary{min-height:48px;}
#tgTable{min-height:413px;}
#tgAchieveBody{min-height:326px;}
@media (max-width:900px){
  #tgSummary,#tgTable,#tgAchieveBody{min-height:0;}
}

/* 跟进计划列表 / 分级看板未分档说明：都是 JS 渲染的容器，留位防位移 */
#fuPlanList{min-height:492px;}
/* 分级看板三列同样是 JS 填的空容器。2026-08-23 删掉上方「AI 跟进建议」后，
   它变成本页第一块，加载时顶一次的幅度直接把整页 CLS 推到 0.21。 */
/* 三列高度不同（培育档人少），各留各的；grid 会把同一行拉齐，
   所以给最高的那档定下限就够，其余跟着行高走。 */
[data-tier-list]{min-height:463px;}
@media (max-width:900px){ [data-tier-list]{min-height:0;} }
#tierUnbucketed{min-height:17px;}
@media (max-width:900px){ #fuPlanList,#tierUnbucketed{min-height:0;} }

/* 执行配置页的 #csActionFit 2026-10-20 起只在「更贴合的动作」那一档成立时才有内容
   （话术切入那张卡撤了，触发设定改成两个真下拉），平时是空的——
   原来那条 min-height:104px 会在页面上留一个洞，一并撤掉。 */

/* 从协助事项跳进会话时顶部的卡点提示 */
.msg-issue{
  display:flex;gap:10px;align-items:flex-start;
  padding:11px 14px;margin-bottom:12px;
  border:1px solid var(--warn-border,var(--border));border-radius:10px;
  background:var(--warn-bg);
}
.msg-issue > .material-symbols-outlined{font-size:18px;color:var(--warn);flex-shrink:0;margin-top:1px;}
.msg-issue > div{flex:1;min-width:0;font-size:13px;color:var(--text-dark);}
.msg-issue a{flex-shrink:0;white-space:nowrap;}

/* 停靠位空着时不要占那一截 section 间距（对话框被移走的异常态兜底）。 */
#wbMgrDock:empty{display:none;}

/* 给一个定高：头部和输入框贴住上下两边，中间会话区自己滚。
   不定高的话对话框会随着聊天越聊越长，把下面的智能体板块一路推走，
   最新一条永远在屏幕外——那正是当初把它单独拎出来要解决的问题。 */
.wb-mgr-box{height:580px;}

/* 业务经理档案的抽屉比通用 side-l（760px）再宽一点：
   「职责与边界」是三栏卡片，760px 下每栏只剩 230px，中文一句话要折三行。 */
#wbMgrProfileModal .modal{max-width:980px;}
@media(max-width:1040px){ #wbMgrProfileModal .modal{max-width:100%;} }

/* 侧边栏：挂在某个智能体名下的子页面。缩进 + 一条竖导引线，
   让「这一页归它管」一眼看得出来，又不至于看成另起一组。 */
.sidebar-item.is-sub{
  margin-left:18px;padding-left:12px;position:relative;
  font-size:12.5px;
}
.sidebar-item.is-sub::before{
  content:"";position:absolute;left:0;top:6px;bottom:6px;width:2px;
  border-radius:2px;background:var(--border);
}
.sidebar-item.is-sub.active::before{background:#fff;opacity:.6;}
.sidebar-item.is-sub .material-symbols-outlined{font-size:17px;}

/* 抽屉里的表：td 全站默认 white-space:nowrap（表格通常是短字段），
   但档案智能体的「依据」「AI 说不下去的原因」是整句话，不换行就被抽屉边缘切掉。
   给这一类整句话的列开个口子：用 .wrap 标出来，宽度到头就折行。 */
.detail-drawer td.wrap{white-space:normal;min-width:120px;max-width:280px;line-height:1.6;}

/* ---------- 智能体运行状态与启停 ---------- */
/* 「运行中」也显式写出来：不写的话人分不出「没有状态」和「在跑」，
   而 AI 是不是还在替我干活，是这几页最该一眼看见的事。 */
.ag-run-tag{
  display:inline-flex;align-items:center;gap:5px;border-radius:999px;
  font-weight:700;line-height:1.6;white-space:nowrap;
}
.ag-run-tag .ag-run-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0;}
.ag-run-tag.is-running{background:var(--success-bg);color:var(--success);}
.ag-run-tag.is-running .ag-run-dot{background:var(--success);}
.ag-run-tag.is-paused{background:var(--warn-bg);color:var(--warn);}
.ag-run-tag.is-paused .ag-run-dot{background:var(--warn);}

/* 工作台卡：标题行左边是链接、右边是状态与启停按钮（按钮不能套进 <a>） */
.wb-agent-top{display:flex;align-items:center;gap:8px;}
.wb-agent-top .wb-agent-head{flex:1;min-width:0;margin-bottom:0;}
/* 暂停的卡整体压暗：数字停在暂停那一刻，不该看着还在跳 */
.wb-agent-card.is-paused .wb-agent-cells{opacity:.55;}
.wb-agent-card.is-paused{border-color:var(--warn-border);}

/* 中心页：整卡是链接，启停只能放在卡外层的 wrapper 里 */
.agent-card-wrap{position:relative;display:flex;flex-direction:column;}
.agent-card-wrap .agent-card{flex:1;}
.agent-card-run{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:9px 16px;border:1px solid var(--border);border-top:0;
  border-radius:0 0 var(--radius-lg) var(--radius-lg);background:var(--bg-soft);
}
.agent-card-wrap .agent-card{border-radius:var(--radius-lg) var(--radius-lg) 0 0;}
.agent-card-wrap.is-paused .agent-card{opacity:.62;}

/* ============ 知识库初始搭建（空库入口页）============
   三张类别卡：展开的那张能操作，处理完的收起来只留结果。
   卡片本身不用圆角卡壳——它已经在一张 card 里了，再套一层会变成盒中盒。 */
.ob-lead{font-size:13.5px;color:var(--text-soft);line-height:1.8;max-width:68ch;margin-bottom:18px;}
.ob-cats{margin-top:20px;border-top:1px solid var(--border);}
.ob-cat{border-bottom:1px solid var(--border);padding:16px 0;}
.ob-cat-head{display:flex;align-items:flex-start;gap:12px;}
.ob-num{flex:none;width:24px;height:24px;border-radius:50%;background:var(--bg-soft2);
  color:var(--text-faint);font-size:12px;font-weight:700;display:flex;align-items:center;
  justify-content:center;margin-top:1px;}
.ob-cat.active .ob-num{background:var(--brand);color:#fff;}
.ob-cat.done .ob-num{background:var(--success-bg);color:var(--success);}
.ob-cat-t{flex:1;min-width:0;}
.ob-cat-title{font-size:14px;font-weight:700;color:var(--text-dark);}
.ob-cat-desc{font-size:12.5px;color:var(--text-faint);margin-top:3px;line-height:1.7;}
.ob-status{flex:none;font-size:11.5px;color:var(--text-faint);background:var(--bg-soft2);
  border-radius:20px;padding:2px 10px;white-space:nowrap;}
.ob-status.busy{background:var(--info-bg);color:var(--brand);}
.ob-status.partial{background:var(--info-bg);color:var(--brand);}
.ob-status.done{background:var(--success-bg);color:var(--success);}
.ob-status.skipped{background:var(--bg-soft2);color:var(--text-faint);}
.ob-cat.done,.ob-cat.skipped{opacity:.72;}
.ob-cat-body{padding-left:36px;}
.ob-cat-body:not(:empty){margin-top:0;}
.ob-src{margin-top:12px;align-self:flex-start;}
.ob-src{display:inline-flex;}
.ob-panel:not(:empty){margin-top:12px;max-width:520px;}
.ob-input{width:100%;font:inherit;font-size:13px;color:var(--text-dark);background:var(--surface);
  border:1px solid var(--border);border-radius:var(--radius);padding:8px 11px;outline:none;}
.ob-input:focus{border-color:var(--brand);}
textarea.ob-input{resize:vertical;line-height:1.7;}
.ob-hint{font-size:11.5px;color:var(--text-faint);margin-top:6px;}
.ob-check{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--text-soft);margin-top:9px;cursor:pointer;}
.ob-go{margin-top:11px;}
.ob-files:not(:empty){margin-top:12px;max-width:520px;display:flex;flex-direction:column;gap:6px;}
.ob-file{display:flex;align-items:center;justify-content:space-between;gap:12px;
  background:var(--bg-soft);border-radius:var(--radius);padding:7px 11px;}
.ob-file-l{display:flex;align-items:center;gap:8px;min-width:0;font-size:12.5px;color:var(--text-mid);}
.ob-file-l .material-symbols-outlined{font-size:16px;color:var(--text-faint);flex:none;}
.ob-file-n{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ob-file-s{flex:none;display:flex;align-items:center;gap:4px;font-size:11.5px;color:var(--text-faint);}
.ob-file-s .material-symbols-outlined{font-size:14px;}
.ob-file-s.done{color:var(--success);}
.ob-foot:not(:empty){margin-top:13px;}
.ob-skip{font:inherit;font-size:12.5px;color:var(--text-faint);background:none;border:0;padding:0;
  cursor:pointer;display:inline-flex;align-items:center;gap:3px;}
.ob-skip:hover{color:var(--text-soft);}
.ob-skip .material-symbols-outlined{font-size:15px;}
.ob-cta{margin-top:24px;text-align:center;}
.ob-cta-ok{display:none;align-items:flex-start;gap:9px;text-align:left;max-width:620px;
  margin:0 auto 18px;background:var(--success-bg);border-radius:var(--radius-lg);
  padding:12px 15px;font-size:12.5px;color:var(--success);line-height:1.75;}
.ob-cta-ok.show{display:flex;}
.ob-cta-ok .material-symbols-outlined{font-size:18px;flex:none;margin-top:1px;}
.ob-cta-hint{font-size:12px;color:var(--text-faint);margin-top:11px;}
/* 空库时锁住的导航项：看得见但进不去，并说明为什么 */
.sidebar-item.is-locked{opacity:.5;cursor:default;}
.sidebar-item.is-locked:hover{background:transparent;color:var(--text-soft);}
.sidebar-item.is-locked .material-symbols-outlined:last-child{margin-left:auto;font-size:15px;}

/* 转化诊断：被筛中的那条柱子 */
.hbar-row.is-picked{background:var(--info-bg);border-radius:var(--radius);}
.hbar-row.is-picked .hbar-label{color:var(--brand);font-weight:700;}

/* 预算暂停时各系统的 AI 动作按钮与智能体启动键（依 9.3 BR-15、BR-G12）：
   置灰但仍然可以悬停——不让点，但必须看得见为什么不让点、怎么恢复。
   所以这里不用 .btn.disabled（那条带 pointer-events:none，title 提示出不来）。 */
.ai-blocked{opacity:.55;cursor:not-allowed;filter:grayscale(1);}

/* ---------- 智能混剪的场景页签（批次 4，依 6.6 Q-03）----------
   页签上除了名字与片段数，还带一个「用于本次混剪」的勾选框：
   K = 勾上的场景数，可组合数 = 各勾上场景的片段数相乘。
   勾掉的场景要看得出来是「不参加」，选中却没片段的要看得出来是「拼不出来」——
   这两种状态不做区分的话，可组合数为什么是 0 就只能靠猜。 */
#remixSceneTabs .chip{display:inline-flex;align-items:center;gap:6px;}
#remixSceneTabs .chip .pick{margin:0;}
#remixSceneTabs .chip[data-remix-scene] b{font-weight:700;}
#remixSceneTabs .chip.sc-off{opacity:.5;}
#remixSceneTabs .chip.sc-empty{
  border-color:var(--danger);
  color:var(--danger);
  background:var(--danger-bg);
}
#remixSceneTabs .chip.sc-empty::after{content:'还没有片段';font-size:11px;margin-left:2px;}

/* 数据分析「回日历看这条」定位过来的那张卡片（依 6.9 BR-07）：
   抽屉打开的同时卡片本身也要标出来，否则关掉抽屉就不知道刚才看的是哪一条。 */
.cal-post.cal-locate{
  outline:2px solid var(--brand);
  outline-offset:1px;
  box-shadow:var(--sh-md);
}

/* 换渠道重发生成的新记录被链过来时的高亮（依 7.5 BR-21）：
   原失败记录上那句「已换渠道重发 → WhatsApp」点了要能落到具体哪一条上，
   不然「链到新记录」只是一句话。 */
tr.cs-hl{background:var(--warn-bg);}
/* 从别的页面带参数跳回来时定位到的那一行（如交接队列「去审核」→ 智能学堂那门待审课）。
   2026-09-30：审核动作搬进「课程管理」后高亮的是那张列表卡片，行与卡片都要闪得到。 */
tr.row-hit,.kba-cm-item.row-hit{background:var(--warn-bg);}
.kba-cm-item.row-hit{border-color:var(--warn-bg);}

/* 加入队列的三道校验没过时，高亮没过的那一步（依 7.5 Q-03 / BR-15）——
   只弹一句 toast 的话，人不知道要回到哪一步去改。 */
.steps .step.step-fail .step-num{background:var(--danger);border-color:var(--danger);color:#fff;}
.steps .step.step-fail .step-label{color:var(--danger);font-weight:700;}

/* 单据参数区里 AI 没从会话中抽到、等着人补填的输入框（依 7.2 Q-07 / BR-20）：
   留空不等于没事，它得看起来就像一个缺口。 */
input.is-todo{border-color:var(--warn);background:var(--warn-bg);}

/* ============================================================
   智能学堂「全部课程」：平铺一张表
   （2026-09-30 起不再有「未上架 / 已上架」分组，没上架的课只在「课程管理」里）
   ============================================================ */
/* 被板块 / 搜索筛掉的行不显示。`hidden` 在 <tr> 上本来靠 UA 默认生效，
   这里写死一条，免得哪条 display 规则把它盖回去 */
#coursesTableWrap tbody tr[hidden]{display:none;}

/* 空值统一（依 §三）：没有样本一律灰「—」，措辞的差别只写在 tooltip 里。
   原来是「—」「尚无人测验」「尚无人学完」三种长度不一的文案，把这一列挤得忽宽忽窄。 */
.cell-na{color:var(--text-faint);font-style:italic;cursor:help;}

/* 「不可自行审核」（依 §五）：本课创建人不能自审——是不可用，不是临时禁用。
   用 .disabled 而不是 .tbl-link 的常规样式，鼠标过去也不该给手型。 */
.tbl-link.disabled,.tbl-link[data-noop]{
  color:var(--text-faint);cursor:not-allowed;font-weight:500;
}
.tbl-link.disabled:hover,.tbl-link[data-noop]:hover{text-decoration:none;}

/* 两组都筛空时表下那句「没有符合条件的课程。」 */
#courseEmptyNote{padding:2px 0;}

/* ============================================================
   完整性槽位（学习智能体「完整性槽位设置」+ 知识库总览七张卡）
   ============================================================ */
/* chip 上挂着「改名 / 删除」两个链接，所以它可以换行、不能截断。
   is-on / is-off 只表达「这个槽位有没有内容」，不做成功色——
   绿色的勾留给「AI 已学完」那一类状态，一个颜色说两件事会串味。 */
.kb-slot-chips{display:flex;flex-wrap:wrap;gap:6px;}
.kb-slot-chip{
  display:inline-flex;align-items:center;gap:6px;
  padding:3px 8px;border-radius:6px;font-size:11px;line-height:1.5;
  border:1px solid var(--border);background:var(--bg-soft);color:var(--text-soft);
}
.kb-slot-chip.is-on{background:#fff;border-color:var(--info-border);}
.kb-slot-chip.is-off{border-style:dashed;color:var(--text-faint);}
.kb-slot-chip .tbl-link{margin-left:2px;}
.kb-slot-gap{color:var(--warn);font-weight:600;}
.kb-slot-gap:hover{text-decoration:underline;}
.kb-slot-chip.is-edit{background:#fff;border-color:var(--brand);}
.kb-slot-chip.is-edit input{
  border:1px solid var(--border);border-radius:4px;padding:2px 6px;font-size:11px;width:140px;
}
/* 抽屉里「加槽位」那一行的输入框跟着表格宽度走，别撑破 .table-wrap */
[data-kb-slot-new]{min-width:0;flex:1;font-size:12px;}

/* 「完整性槽位设置」这一张表加宽（2026-09-30 用户要求）：
   四列 + 每列十几个 chip，抽屉停在 480px 时 chip 全挤成一竖列，
   看不出「哪一类差哪几个槽位」。由 app.js 按项加 .ag-set-wide，
   只这一项变宽——其余智能体抽屉是单列表单，跟着变宽只会更空。
   半屏是目标，两个边是止损：窄屏不至于算出个 300px 的「50%」，
   带鱼屏也不至于摊成一条读不到尾的横带。 */
.modal.side.ag-set-wide{width:50%;min-width:min(640px,100%);max-width:min(1080px,100%);}
@media(max-width:700px){.modal.side.ag-set-wide{width:100%;min-width:0;max-width:100%;}}

/* 「翻译」收进一颗按钮的下拉菜单（2026-09-30）：语言表 + 双语对照开关都在这一张菜单里。
   菜单往输入框上方开——这一排在聊天区最底下，往下开会出屏。
   语言两列排，四格一屏看完，不用滚。 */
.chat-trans-wrap{position:relative;display:inline-flex;}
.chat-trans-menu{
  position:absolute;left:0;bottom:calc(100% + 8px);z-index:30;
  width:268px;padding:10px 12px;border:1px solid var(--border);border-radius:10px;
  background:#fff;box-shadow:0 10px 28px rgba(17,24,39,.14);text-align:left;
}
.chat-trans-langs{display:grid;grid-template-columns:1fr 1fr;gap:6px;}
.chat-trans-lang{
  display:inline-flex;align-items:center;justify-content:space-between;gap:4px;
  padding:6px 8px;border:1px solid var(--border);border-radius:7px;
  background:var(--bg-soft);font-size:11.5px;font-family:inherit;
  color:var(--text-soft);cursor:pointer;text-align:left;
}
.chat-trans-lang:hover{border-color:var(--brand);color:var(--text-dark);}

/* ============================================================
   智能体中心 · 左右分栏布局
   ============================================================ */
.ac-wrapper{display:flex;gap:18px;align-items:flex-start;}

/* 左侧智能体列表 */
.left-panel{
  width:320px;flex-shrink:0;background:var(--surface);
  border:1px solid var(--border);border-radius:12px;box-shadow:var(--sh-sm);
  overflow:hidden;position:sticky;top:16px;
}
.left-header{
  padding:15px 18px;border-bottom:1px solid var(--border);
  font-size:14px;font-weight:700;color:var(--text-dark);
  display:flex;align-items:center;justify-content:space-between;
}
.left-header .cnt{font-size:11px;color:var(--text-faint);font-weight:600;background:var(--bg-soft2);padding:2px 8px;border-radius:999px;}
.sys-group{padding:4px 0;}
.sys-group+.sys-group{border-top:1px solid var(--border-soft);}
.sys-label{
  padding:10px 18px 3px;font-size:11px;color:var(--text-faint);letter-spacing:.03em;
  display:flex;align-items:center;gap:6px;
}
.sys-label b{font-weight:700;color:var(--text-soft);font-size:11px;}
.agent-item{
  display:flex;align-items:center;gap:11px;padding:10px 18px 10px 15px;
  cursor:pointer;position:relative;border-left:3px solid transparent;
}
.agent-item:hover{background:var(--bg-soft);}
.agent-item.active{background:var(--info-bg);border-left-color:var(--brand);}
.ac-agent-avatar{
  width:38px;height:38px;border-radius:50%;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;
  color:#fff;font-size:12px;font-weight:700;letter-spacing:.02em;
}
.agent-main{flex:1;min-width:0;}
.agent-name{font-size:13.5px;font-weight:600;color:var(--text-dark);}
.agent-duty{font-size:11.5px;color:var(--text-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px;}

/* 闲/忙动态状态徽标 */
.live-pill{
  display:inline-flex;align-items:center;gap:5px;flex-shrink:0;
  font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;white-space:nowrap;
}
.live-pill .live-ic{display:block;}
.live-pill.busy{color:var(--brand);background:var(--info-bg);}
.live-pill.idle{color:var(--success);background:var(--success-bg);}
.live-pill.pause{color:var(--text-soft);background:var(--bg-soft2);}
.live-pill.busy .live-ic,.live-pill.idle .live-ic{filter:drop-shadow(0 0 3px currentColor);}

/* 右侧主面板 */
.ac-panel{
  flex:1;min-width:0;background:var(--surface);
  border:1px solid var(--border);border-radius:12px;box-shadow:var(--sh-sm);
  overflow:hidden;display:flex;flex-direction:column;max-height:860px;
}
.ac-header{padding:18px 22px 14px;border-bottom:1px solid var(--border-soft);}
.ac-header-top{display:flex;align-items:center;gap:13px;}
.ac-avatar{
  width:48px;height:48px;border-radius:14px;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;
  color:#fff;font-size:16px;font-weight:700;
}
.ac-name-area{flex:1;min-width:0;}
.ac-name{font-size:17px;font-weight:700;color:var(--text-dark);display:flex;align-items:center;gap:8px;}
.ac-code{font-size:11px;color:var(--text-soft);background:var(--bg-soft2);padding:2px 8px;border-radius:7px;font-weight:600;letter-spacing:.03em;}
.ac-tags{display:flex;gap:6px;margin-top:7px;flex-wrap:wrap;}
.ac-status{
  flex-shrink:0;display:flex;align-items:center;gap:6px;
  font-size:12px;font-weight:600;padding:6px 12px;border-radius:999px;border:1px solid transparent;
}
.ac-status.busy{color:var(--brand);background:var(--info-bg);border-color:var(--info-border);}
.ac-status.idle{color:var(--success);background:var(--success-bg);border-color:var(--success-border);}
.ac-status.pause{color:var(--text-soft);background:var(--bg-soft2);border-color:var(--border);}
.ac-reason{margin-top:11px;font-size:12.5px;color:var(--warn);background:var(--warn-bg);border:1px solid var(--warn-border);padding:8px 13px;border-radius:9px;}

.ac-stats{display:flex;align-items:center;gap:24px;margin-top:13px;padding-top:12px;border-top:1px dashed var(--border-soft);}
.ac-stat{display:flex;align-items:baseline;gap:5px;}
.ac-stat .v{font-size:16px;font-weight:800;font-variant-numeric:tabular-nums;line-height:1;letter-spacing:-.01em;}
.ac-stat .k{font-size:11px;color:var(--text-faint);}
.ac-stat.done .v{color:var(--success);}
.ac-stat.running .v{color:var(--brand);}
.ac-stat.pending .v{color:var(--warn);}
.ac-save{
  margin-left:auto;display:inline-flex;align-items:baseline;gap:5px;
  background:var(--brand-gradient);color:#fff;padding:5px 12px;border-radius:8px;
  box-shadow:0 1px 2px rgba(16,24,40,.06),0 3px 8px rgba(59,48,232,.22);white-space:nowrap;
  animation:ac-save-glow 2.6s ease-in-out infinite;
}
@keyframes ac-save-glow{
  0%,100%{box-shadow:0 2px 10px rgba(59,48,232,.22);}
  50%{box-shadow:0 0 20px rgba(59,48,232,.48);}
}
.ac-save .ac-save-label{font-size:10.5px;font-weight:600;opacity:.92;}
.ac-save .ac-save-v{font-size:16px;font-weight:800;letter-spacing:-.01em;font-variant-numeric:tabular-nums;line-height:1;}

/* 页签 */
.ac-tabs{display:flex;gap:2px;border-bottom:1px solid var(--border);padding:0 22px;}
.ac-tab{
  padding:13px 15px;font-size:13px;color:var(--text-faint);cursor:pointer;
  border-bottom:2px solid transparent;font-weight:500;user-select:none;margin-bottom:-1px;
  transition:color .15s;
}
.ac-tab:hover{color:var(--text-mid);}
.ac-tab.active{color:var(--brand);border-bottom-color:var(--brand);font-weight:600;}

/* 页签体 */
.ac-body{flex:1;overflow-y:auto;padding:18px 22px 22px;}
.ac-body::-webkit-scrollbar{width:6px;}
.ac-body::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:999px;}

.ac-section{margin-bottom:22px;}
.ac-section:last-child{margin-bottom:0;}
.ac-section-title{
  display:flex;align-items:center;gap:8px;
  font-size:13px;font-weight:700;color:var(--text-dark);margin-bottom:12px;
}
.ac-section-title .src{
  font-size:10px;color:var(--text-faint);font-weight:500;margin-left:auto;
  padding:2px 9px;background:var(--bg-soft2);border-radius:999px;
}

/* 智能体介绍 */
.intro-duty{font-size:13px;color:var(--text-mid);line-height:1.75;padding:13px 15px;background:var(--bg-soft);border:1px solid var(--border-soft);border-radius:10px;}
.perm-box{font-size:12.5px;line-height:1.7;padding:12px 15px;border-radius:10px;margin-top:10px;}
.perm-box.rule{background:var(--info-bg);border:1px solid var(--info-border);border-left:3px solid var(--brand);color:var(--text-mid);}
.perm-box.rule strong{color:var(--brand);}
.intro-card{padding:18px 20px;border:1px solid var(--border-soft);border-radius:12px;background:linear-gradient(135deg,var(--surface),var(--info-bg));}
.intro-headline{font-size:18px;font-weight:700;color:var(--text-dark);letter-spacing:-.01em;line-height:1.4;}
.intro-scope{font-size:12.5px;color:var(--text-soft);margin-top:9px;line-height:1.7;}

/* 内置技能 */
.skill-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;}
.skill-card{border:1px solid var(--border-soft);border-radius:10px;padding:12px 14px;background:var(--bg-soft);}
.skill-name{font-size:13px;font-weight:600;color:var(--text-dark);display:flex;align-items:center;gap:7px;}
.skill-name::before{content:'';width:7px;height:7px;border-radius:2px;background:var(--brand-gradient);flex-shrink:0;}
.skill-lock{margin-left:auto;font-size:9px;color:var(--text-faint);border:1px solid var(--border);padding:1px 7px;border-radius:6px;font-weight:500;background:var(--surface);}
.skill-desc{font-size:11.5px;color:var(--text-faint);margin-top:4px;line-height:1.6;}

/* 工具 */
.tool-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;}
.tool-card{display:flex;align-items:center;gap:11px;border:1px solid var(--border-soft);border-radius:10px;padding:11px 13px;background:var(--surface);}
.tool-ic{width:32px;height:32px;border-radius:9px;background:var(--bg-soft2);color:var(--text-soft);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.tool-ic .material-symbols-outlined{font-size:18px;}
.tool-main{min-width:0;}
.tool-name{font-size:12.5px;font-weight:600;color:var(--text-dark);display:block;}
.tool-desc{font-size:11px;color:var(--text-faint);}

/* 专家与知识库 */
.exp-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;}
.exp-card{display:flex;flex-direction:column;gap:7px;border:1px solid var(--border-soft);border-radius:10px;padding:12px 14px;background:var(--surface);}
.exp-top{display:flex;align-items:center;gap:9px;}
.exp-ava{width:32px;height:32px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;color:#fff;font-size:11px;font-weight:700;}
.exp-title{min-width:0;}
.exp-name{font-size:13px;font-weight:600;color:var(--text-dark);line-height:1.35;}
.exp-role{font-size:10.5px;color:var(--text-faint);}
.exp-desc{font-size:11.5px;color:var(--text-soft);line-height:1.65;flex:1;}
.exp-tags{display:flex;gap:5px;flex-wrap:wrap;}
.exp-tag{font-size:10px;color:var(--text-soft);background:var(--bg-soft2);padding:2px 8px;border-radius:6px;}
.kb-note{font-size:12px;color:var(--text-soft);background:var(--bg-soft);border:1px solid var(--border-soft);border-radius:10px;padding:10px 13px;margin-bottom:12px;line-height:1.6;}
.kb-item{display:flex;align-items:center;gap:12px;padding:11px 4px;border-bottom:1px solid var(--border-soft);}
.kb-item:last-child{border-bottom:none;}
.kb-ic{width:34px;height:34px;border-radius:9px;background:var(--info-bg);color:var(--brand);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.kb-ic .material-symbols-outlined{font-size:18px;}
.kb-main{flex:1;min-width:0;}
.kb-name{font-size:13px;font-weight:600;color:var(--text-dark);display:block;}
.kb-meta{font-size:11px;color:var(--text-faint);}

/* 能力授权档位阶梯 */
.cap-row{display:flex;align-items:center;gap:14px;padding:12px 0;border-bottom:1px solid var(--border-soft);}
.cap-row:last-child{border-bottom:none;}
.cap-name{flex:0 0 158px;font-size:13px;font-weight:600;color:var(--text-dark);}
.cap-name small{display:block;font-weight:400;font-size:10.5px;color:var(--text-faint);margin-top:2px;}
.stepper{flex:1;display:flex;gap:4px;}
.step{
  flex:1;border:1px solid var(--border);background:#fff;padding:7px 2px;border-radius:8px;
  text-align:center;cursor:pointer;transition:all .12s ease;
}
.step:hover{border-color:var(--brand);}
.step .lvl{font-size:12.5px;font-weight:700;display:block;}
.step .lbl{font-size:10px;color:var(--text-faint);}
.step.fixed{cursor:not-allowed;opacity:.55;}
.step.on{color:#fff;}
.step.on .lbl{color:rgba(255,255,255,.85);}
.t-L0{color:#475569;background:var(--bg-soft2);border-color:var(--border-soft);}
.t-L1{color:#0e7490;background:#ecfeff;border-color:#cffafe;}
.t-L2{color:var(--warn);background:var(--warn-bg);border-color:var(--warn-border);}
.t-L3{color:var(--brand);background:var(--info-bg);border-color:var(--info-border);}
.t-HUMAN{color:var(--text-faint);background:var(--bg-soft);border-color:var(--border-soft);}
.step.on.t-L0{background:#94a3b8;border-color:#94a3b8;}
.step.on.t-L1{background:#0891b2;border-color:#0891b2;}
.step.on.t-L2{background:#d97706;border-color:#d97706;}
.step.on.t-L3{background:var(--brand);border-color:var(--brand);}
.step.on.t-HUMAN{background:#94a3b8;border-color:#94a3b8;}

/* 业务配置 */
.cfg-mod{border:1px solid var(--border);border-radius:10px;margin-bottom:10px;overflow:hidden;background:#fff;}
.cfg-mod-head{display:flex;align-items:center;gap:10px;padding:11px 14px;cursor:pointer;background:var(--bg-soft);border-bottom:1px solid transparent;user-select:none;}
.cfg-mod-head:hover{background:var(--bg-soft2);}
.cfg-mod.open .cfg-mod-head{border-bottom-color:var(--border);background:#fff;}
.cfg-mod-num{width:22px;height:22px;border-radius:6px;flex-shrink:0;background:var(--brand-gradient);color:#fff;font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;}
.cfg-mod-title{font-size:13px;font-weight:600;color:var(--text-dark);}
.cfg-mod-desc{font-size:10px;color:var(--text-faint);margin-left:auto;}
.cfg-mod-arrow{width:16px;height:16px;color:var(--text-faint);transition:transform .25s;display:flex;align-items:center;}
.cfg-mod.open .cfg-mod-arrow{transform:rotate(90deg);}
.cfg-mod-body{max-height:0;overflow:hidden;transition:max-height .3s ease;padding:0 14px;}
.cfg-mod.open .cfg-mod-body{max-height:2000px;padding:12px 14px 14px;}
.cfg-kv{display:flex;justify-content:space-between;align-items:baseline;padding:7px 0;font-size:12px;border-bottom:1px dashed var(--border-soft);}
.cfg-kv:last-child{border-bottom:none;}
.cfg-kv .kk{color:var(--text-faint);flex-shrink:0;}
.cfg-kv .vv{color:var(--text-dark);text-align:right;}
.cfg-kv .vv.badge{color:var(--brand);font-weight:600;}
.cfg-jump{display:flex;align-items:center;gap:10px;padding:11px 14px;border:1px solid var(--border);border-radius:10px;margin-bottom:10px;background:#fff;}
.cfg-jump-name{font-size:13px;font-weight:600;color:var(--text-dark);}
.cfg-jump-val{font-size:12px;color:var(--text-soft);}
.cfg-jump-go{margin-left:auto;font-size:12px;color:var(--brand);font-weight:600;display:inline-flex;align-items:center;gap:3px;white-space:nowrap;cursor:pointer;}
.cfg-jump-go .material-symbols-outlined{font-size:14px;}

/* 成果输出 */
.output-row{display:flex;align-items:center;gap:12px;padding:10px 2px;border-bottom:1px dashed var(--border-soft);}
.output-row:last-child{border-bottom:none;}
.output-name{flex:0 0 110px;font-size:13px;font-weight:600;color:var(--text-dark);}
.output-arrow{flex:0 0 18px;color:var(--text-faint);display:flex;justify-content:center;}
.output-arrow .material-symbols-outlined{font-size:16px;}
.output-menu{font-size:12px;color:var(--brand);background:var(--info-bg);border:1px solid var(--info-border);padding:4px 11px;border-radius:8px;font-weight:500;cursor:pointer;display:inline-flex;align-items:center;gap:5px;}
.output-menu:hover{background:#e3e7ff;}
.output-menu .go{font-size:13px;}
.ac-note{margin-top:12px;padding-top:9px;border-top:1px solid var(--border-soft);font-size:11px;color:var(--text-faint);display:flex;justify-content:space-between;}

/* 运行处理记录 */
.record-head{display:flex;align-items:center;gap:12px;padding:4px 0 8px;border-bottom:1px solid var(--border);font-size:10px;color:var(--text-faint);}
.record-head .sp{flex:0 0 7px;}
.record-head .rh-time{flex:0 0 60px;}
.record-head .rh-obj{flex:0 0 190px;}
.record-head .rh-detail{flex:1;}
.record-head .rh-ms{flex:0 0 44px;text-align:right;}
.record-head .rh-tag{flex:0 0 56px;text-align:center;}
.record-row{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid var(--border-soft);}
.record-row:last-child{border-bottom:none;}
.record-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;}
.record-time{flex:0 0 60px;font-size:11px;color:var(--text-faint);font-variant-numeric:tabular-nums;font-family:"SF Mono",ui-monospace,Menlo,Consolas,monospace;}
.record-obj{flex:0 0 190px;font-size:12px;font-weight:600;color:var(--text-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.record-detail{flex:1;font-size:12px;color:var(--text-mid);}
.record-ms{flex:0 0 44px;font-size:10.5px;color:var(--text-faint);text-align:right;font-variant-numeric:tabular-nums;font-family:"SF Mono",ui-monospace,Menlo,Consolas,monospace;}
.record-tag{flex:0 0 56px;text-align:center;font-size:10px;padding:2px 0;border-radius:999px;font-weight:600;flex-shrink:0;}
.record-foot{margin-top:12px;padding-top:9px;border-top:1px solid var(--border-soft);font-size:11px;color:var(--text-faint);display:flex;justify-content:space-between;}

/* 暂停日志 */
.pl-head-row{display:flex;align-items:center;gap:10px;padding:6px 2px;font-size:10px;color:var(--text-faint);border-bottom:1px solid var(--border);}
.pl-head-row .c-t{flex:0 0 92px;}
.pl-head-row .c-a{flex:0 0 48px;text-align:center;}
.pl-head-row .c-w{flex:0 0 150px;}
.pl-head-row .c-r{flex:1;}
.pl-row{display:flex;align-items:center;gap:10px;padding:11px 2px;font-size:12px;border-bottom:1px dashed var(--border-soft);}
.pl-row:last-child{border-bottom:none;}
.pl-time{flex:0 0 92px;color:var(--text-faint);font-family:"SF Mono",ui-monospace,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums;}
.pl-act{flex:0 0 48px;font-size:10px;font-weight:600;padding:2px 0;border-radius:999px;text-align:center;}
.pl-act.pause{color:var(--warn);background:var(--warn-bg);}
.pl-act.resume{color:var(--success);background:var(--success-bg);}
.pl-who{flex:0 0 150px;color:var(--text-soft);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.pl-reason{flex:1;color:var(--text-mid);}
.pl-empty-big{padding:30px 0;text-align:center;font-size:13px;color:var(--text-faint);}
.pl-empty-big .sub{font-size:11px;color:var(--text-faint);margin-top:6px;}

/* Token 消耗折线图 */
.tok-head{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:14px;}
.tok-hero-v{font-size:30px;font-weight:800;color:var(--text-dark);line-height:1;letter-spacing:-.02em;font-variant-numeric:tabular-nums;}
.tok-hero-v .unit{font-size:14px;font-weight:600;color:var(--text-soft);margin-left:5px;}
.tok-hero-k{font-size:12px;color:var(--text-faint);margin-top:5px;}
.tok-delta{font-size:12px;font-weight:700;padding:5px 11px;border-radius:999px;}
.tok-delta.up{color:var(--warn);background:var(--warn-bg);}
.tok-delta.down{color:var(--success);background:var(--success-bg);}
.tok-chart{margin-top:4px;}
.tok-svg{width:100%;height:auto;display:block;}
.tok-svg .tok-grid{stroke:var(--border-soft);stroke-width:1;}
.tok-svg .tok-axis{fill:var(--text-faint);font-size:11px;}
.tok-svg .tok-x{text-anchor:middle;}
.tok-line{fill:none;stroke:var(--brand);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.tok-dot{fill:var(--brand);stroke:#fff;stroke-width:1.5;cursor:pointer;}
.tok-dot:hover{fill:var(--brand-deep);}

/* 系统配色（头像背景）。实色底，图标用白色——
   color 只能落在 .sys-* 上，不能落到 .agent-avatar 基类：
   基类在源码里晚于 .g1/.g2/.g3，同权重会盖掉那几套浅底深字的配色。 */
.sys-wa{background:var(--sys-wa);color:#fff;}
.sys-bg{background:var(--sys-bg);color:#fff;}
.sys-biz{background:var(--sys-biz);color:#fff;}
.sys-sns{background:var(--sys-sns);color:#fff;}
.sys-kb{background:var(--sys-kb);color:#fff;}
.sys-lbs{background:var(--sys-lbs);color:#fff;}

/* 智能体中心响应式 */
@media(max-width:860px){
  .ac-wrapper{flex-direction:column;}
  .left-panel{width:100%;position:static;}
  .skill-grid{grid-template-columns:1fr;}
  .tool-grid{grid-template-columns:1fr;}
  .exp-grid{grid-template-columns:1fr;}
}
@media(prefers-reduced-motion:reduce){
  .live-ic *{animation:none !important;}
  .ac-save{animation:none !important;}
}

/* ============================================================
   小W · 通用智能体悬浮助手
   ============================================================ */
.xy-fab{
  position:fixed;right:26px;bottom:26px;z-index:200;
  width:56px;height:56px;border-radius:50%;cursor:pointer;
  background:var(--brand-gradient);
  display:flex;align-items:center;justify-content:center;
  box-shadow:0 1px 2px rgba(16,24,40,.06),0 3px 8px rgba(59,48,232,.22);transition:transform .15s ease;user-select:none;
}
.xy-fab:hover{transform:translateY(-2px);}
.xy-fab .face{font-size:15px;font-weight:800;color:#fff;letter-spacing:.5px;}
.xy-fab .online{position:absolute;right:-1px;bottom:-1px;width:14px;height:14px;border-radius:50%;background:var(--success);border:2px solid #fff;}
.xy-mask{position:fixed;inset:0;background:rgba(15,23,42,.42);z-index:300;display:none;}
.xy-mask.on{display:block;}
.xy-panel{
  position:fixed;right:26px;bottom:94px;z-index:301;
  width:360px;max-height:500px;background:#fff;border-radius:16px;
  border:1px solid var(--border);box-shadow:0 4px 8px -2px rgba(16,24,40,.06),0 12px 24px -6px rgba(16,24,40,.10);
  display:none;flex-direction:column;overflow:hidden;
  transition:all .28s cubic-bezier(.16,1,.3,1);
}
.xy-panel.open{display:flex;}
.xy-panel.expanded{
  right:auto;bottom:auto;left:50%;top:50%;transform:translate(-50%,-50%);
  width:min(680px,calc(100vw - 40px));height:min(80vh,720px);max-height:none;
}
.xy-head{display:flex;align-items:center;gap:10px;padding:13px 15px;background:var(--brand-gradient);color:#fff;}
.xy-head .xy-ava{width:34px;height:34px;border-radius:50%;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:13px;}
.xy-head .xy-t{flex:1;min-width:0;}
.xy-head .xy-title{font-size:14px;font-weight:700;line-height:1.2;}
.xy-head .xy-sub{font-size:10.5px;opacity:.85;}
.xy-head .xy-hbtns{display:flex;gap:2px;}
.xy-head .xy-hbtn{width:30px;height:30px;border-radius:8px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#fff;opacity:.85;}
.xy-head .xy-hbtn:hover{background:rgba(255,255,255,.16);opacity:1;}
.xy-head .xy-hbtn .material-symbols-outlined{font-size:18px;}

.xy-nav{display:flex;gap:4px;padding:8px 12px;border-bottom:1px solid var(--border-soft);background:var(--bg-soft);}
.xy-nav-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:7px 4px;border-radius:8px;font-size:12px;font-weight:600;color:var(--text-faint);transition:all .15s;}
.xy-nav-btn .material-symbols-outlined{font-size:16px;}
.xy-nav-btn:hover{color:var(--text-dark);background:var(--bg-soft2);}
.xy-nav-btn.active{color:var(--brand);background:var(--surface);box-shadow:0 1px 2px rgba(16,24,40,.05),0 1px 3px rgba(16,24,40,.05);}

.xy-context{display:flex;align-items:center;gap:7px;padding:8px 15px;font-size:11px;color:var(--text-soft);background:var(--bg-soft);border-bottom:1px solid var(--border-soft);}
.xy-context .ctx-ico{display:inline-flex;align-items:center;color:var(--brand);flex-shrink:0;}
.xy-context .ctx-ico .material-symbols-outlined{font-size:15px;}
.xy-context .ctx-txt{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.xy-context .ctx-tag{font-size:9px;color:var(--brand);background:var(--info-bg);padding:1px 7px;border-radius:6px;font-weight:600;flex-shrink:0;}

.xy-msgs{flex:1;overflow-y:auto;padding:13px 15px;display:flex;flex-direction:column;gap:9px;}
.xy-msg{max-width:85%;font-size:12px;line-height:1.65;padding:8px 11px;border-radius:12px;}
.xy-msg.ai{align-self:flex-start;background:var(--bg-soft2);color:var(--text-dark);border-bottom-left-radius:4px;}
.xy-msg.user{align-self:flex-end;background:var(--brand);color:#fff;border-bottom-right-radius:4px;box-shadow:0 1px 2px rgba(16,24,40,.06),0 3px 8px rgba(59,48,232,.22);}
.xy-msg .who{font-size:9px;opacity:.6;display:block;margin-bottom:2px;}
.xy-chips{display:flex;flex-wrap:wrap;gap:6px;padding:2px 15px 11px;}
.xy-chip{font-size:11px;color:var(--text-soft);background:#fff;border:1px solid var(--border);padding:4px 10px;border-radius:999px;cursor:pointer;transition:all .15s;}
.xy-chip:hover{border-color:var(--brand);color:var(--brand);}
.xy-input{display:flex;gap:7px;padding:10px 15px 13px;border-top:1px solid var(--border-soft);align-items:center;}
.xy-input input{flex:1;border:1px solid var(--border);border-radius:9px;padding:8px 11px;font-size:12px;outline:none;font-family:inherit;color:var(--text-dark);min-width:0;}
.xy-input input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--info-bg);}
.xy-send{border:0;background:var(--brand);color:#fff;font-size:12px;font-weight:600;padding:0 13px;border-radius:9px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;height:34px;}
.xy-send:hover{background:var(--brand-hover);}
.xy-send .material-symbols-outlined{font-size:16px;}
.xy-ico{flex:0 0 auto;width:30px;height:30px;border-radius:8px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--text-faint);}
.xy-ico:hover{background:var(--bg-soft2);color:var(--text-dark);}
.xy-ico .material-symbols-outlined{font-size:19px;}
.xy-cap{padding:0 15px 11px;font-size:10px;color:var(--text-faint);}

/* 小W · 对话视图里的「待确认卡」（2026-10-27 由 biz-msg-center-xiao-w 沙盒移植）
   卡片结构由 assets/src/87-xiao-w.js 生成：署名徽章 + 一句结论 + 数据卡 + 动作。
   署名那颗复用全站 .agent-badge（15-agents.js 的 agBadgeHtml），只在这里收一下尺寸。 */
.xy-msg.ai:has(.xy-rich){max-width:96%;width:96%;}
.xy-rich{display:block;margin-top:2px;line-height:1.55;}
.xy-rich .xy-sign{margin-bottom:6px;}
.xy-rich .xy-sign .agent-badge{font-size:11px;padding:2px 8px 2px 3px;}
.xy-rich .xy-sign .agent-badge .ab-ic{width:16px;height:16px;}
.xy-rich .xy-sign .agent-badge .ab-ic .material-symbols-outlined{font-size:11px;}
.xy-lead{color:var(--text-dark);}
.xy-card{margin-top:8px;padding:10px 12px;border-radius:10px;background:#fff;
  border:1px solid var(--border);font-size:12px;color:var(--text-dark);}
.xy-card-t{font-weight:600;margin-bottom:6px;font-size:12px;}
.xy-draft{white-space:pre-wrap;background:var(--bg-soft2);border:1px dashed var(--border);
  border-radius:8px;padding:8px 10px;margin:6px 0;color:var(--text-soft);line-height:1.5;}
.xy-meta{font-size:11px;color:var(--text-faint);margin:4px 0 0;display:block;}
.xy-row{display:flex;justify-content:space-between;gap:8px;padding:3px 0;
  border-bottom:1px solid var(--border-soft);}
.xy-row:last-child{border-bottom:0;}
.xy-radio{display:flex;flex-direction:column;gap:4px;margin:6px 0;opacity:.55;pointer-events:none;}
.xy-radio label{display:flex;align-items:flex-start;gap:6px;font-size:11px;color:var(--text-soft);
  background:#fff;border:1px solid var(--border);border-radius:8px;padding:6px 8px;}
.xy-pill{display:inline-block;font-size:10px;font-weight:600;padding:1px 6px;border-radius:999px;
  background:var(--info-bg);color:var(--text-soft);margin-left:4px;}
.xy-pill.ok{background:var(--success-bg);color:var(--success);}
.xy-pill.warn{background:var(--danger-bg);color:var(--danger);}
.xy-cta{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;}
.xy-cbtn{border:0;border-radius:8px;padding:5px 10px;font-size:12px;cursor:pointer;
  background:var(--brand);color:#fff;display:inline-flex;align-items:center;gap:4px;
  text-decoration:none;line-height:1.4;}
.xy-cbtn:hover{background:var(--brand-hover);}
.xy-cbtn.ghost{background:var(--bg-soft2);color:var(--text-soft);}
.xy-cbtn.ghost:hover{background:var(--border-soft);color:var(--text-dark);}
.xy-cbtn .material-symbols-outlined{font-size:14px;}
.xy-note{font-size:11px;color:var(--text-faint);margin-top:6px;}

/* 小W · 技能 / 历史视图 */
.xy-view{flex:1;overflow-y:auto;display:none;flex-direction:column;}
.xy-view.on{display:flex;}
.xy-settings{position:absolute;inset:0;background:var(--surface);display:none;flex-direction:column;z-index:2;}
.xy-settings.on{display:flex;}
.xy-settings-head{display:flex;align-items:center;justify-content:space-between;padding:11px 15px;border-bottom:1px solid var(--border-soft);}
.xy-settings-title{font-size:13px;font-weight:700;color:var(--text-dark);}
.xy-settings-head .xy-hbtn{color:var(--text-soft);}
.xy-settings-head .xy-hbtn .material-symbols-outlined{font-size:18px;}
.xy-settings-head .xy-hbtn:hover{background:var(--bg-soft2);}
.xy-skill-list{padding:12px 15px;display:flex;flex-direction:column;gap:8px;}
.xy-skill-item{display:flex;align-items:center;gap:11px;padding:11px 13px;border:1px solid var(--border-soft);border-radius:10px;background:var(--surface);}
.xy-skill-ic{width:32px;height:32px;border-radius:9px;background:var(--info-bg);color:var(--brand);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.xy-skill-ic .material-symbols-outlined{font-size:18px;}
.xy-skill-main{flex:1;min-width:0;}
.xy-skill-name{font-size:12.5px;font-weight:600;color:var(--text-dark);display:flex;align-items:center;gap:6px;}
.xy-skill-desc{font-size:11px;color:var(--text-faint);margin-top:1px;}
.xy-tag-fixed{font-size:9px;color:var(--text-faint);border:1px solid var(--border);padding:0 6px;border-radius:5px;font-weight:500;}
.xy-switch{width:32px;height:18px;border-radius:999px;background:var(--border-strong);position:relative;cursor:pointer;transition:background .15s;flex-shrink:0;}
.xy-switch::after{content:'';position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:#fff;transition:left .15s;box-shadow:0 1px 2px rgba(0,0,0,.18);}
.xy-switch.on{background:var(--brand);}
.xy-switch.on::after{left:16px;}
.xy-switch.locked{opacity:.5;cursor:not-allowed;}
.xy-skill-add{display:flex;gap:8px;padding:4px 15px 14px;}
.xy-skill-add input{flex:1;border:1px dashed var(--border-strong);border-radius:9px;padding:8px 11px;font-size:12px;outline:none;font-family:inherit;color:var(--text-dark);}
.xy-skill-add input:focus{border-color:var(--brand);}
.xy-skill-foot{padding:0 15px 14px;font-size:10.5px;color:var(--text-faint);}

.xy-hist-list{padding:6px 12px 12px;display:flex;flex-direction:column;}
.xy-hist-item{display:flex;align-items:center;gap:11px;padding:11px 12px;border-radius:10px;cursor:pointer;transition:background .12s;}
.xy-hist-item:hover{background:var(--bg-soft);}
.xy-hist-item+.xy-hist-item{border-top:1px solid var(--border-soft);}
.xy-hist-ic{width:30px;height:30px;border-radius:9px;background:var(--bg-soft2);color:var(--text-faint);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.xy-hist-ic .material-symbols-outlined{font-size:17px;}
.xy-hist-main{flex:1;min-width:0;}
.xy-hist-title{font-size:12.5px;font-weight:600;color:var(--text-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.xy-hist-meta{font-size:10.5px;color:var(--text-faint);margin-top:1px;}
.xy-hist-arrow{color:var(--text-faint);}
.xy-hist-arrow .material-symbols-outlined{font-size:17px;}
.chat-trans-lang.is-on{background:#fff;border-color:var(--brand);color:var(--brand);font-weight:700;}

/* ---------- 单据起草抽屉（PI / PL / CI）：宽抽屉 · 左事实表 · 右预览 ----------
   2026-10-26 落 v3 稿。doc-wide 只加宽这一个抽屉，不动公共 .modal.side——
   全站十几个抽屉共用那条规则，改它等于改全站。 */
.modal.side.doc-wide{width:min(1180px,100%);max-width:min(1180px,100%);}
@media(max-width:1240px){.modal.side.doc-wide{width:min(920px,100%);}}
.doc-draft-grid{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(0,1fr);
  gap:18px;align-items:start;}
@media(max-width:900px){.doc-draft-grid{grid-template-columns:minmax(0,1fr);}}
.doc-pv-col{position:sticky;top:0;}

/* PI / PL / CI 三个 chip 各带一盏灯：切过去之前就该看得见那张是红的 */
.doc-tab{display:inline-flex;align-items:center;gap:6px;}
.doc-dot{width:8px;height:8px;border-radius:50%;background:var(--border-strong);flex-shrink:0;}
.doc-dot.red{background:var(--danger);}
.doc-dot.yellow{background:var(--warn);}
.doc-dot.green{background:var(--success);}

/* 闸门横幅。红黄绿三色都用既有的 *-bg / *-border 变量，不再新开一套色 */
.doc-gate{border:1px solid var(--border);border-radius:var(--radius-md);padding:9px 12px;
  font-size:12.5px;font-weight:600;color:var(--text-dark);}
.doc-gate>div{font-weight:400;color:var(--text-soft);}
.doc-gate.red{background:var(--danger-bg);border-color:var(--danger-border);color:var(--danger);}
.doc-gate.yellow{background:var(--warn-bg);border-color:var(--warn-border);color:var(--warn);}
.doc-gate.green{background:var(--success-bg);border-color:var(--success-border);color:var(--success);}

/* 事实表：一行三项（名称 / 值 / 来源+确认），窄屏折成两项 */
.doc-grp{margin-bottom:12px;}
.doc-grp-hd{font-size:11px;font-weight:700;color:var(--text-faint);letter-spacing:.4px;
  padding:0 0 4px;border-bottom:1px solid var(--border-soft);margin-bottom:6px;}
.doc-row{display:grid;grid-template-columns:minmax(96px,.72fr) minmax(0,1.5fr) auto;
  gap:8px;align-items:start;padding:5px 6px;border-radius:9px;}
.doc-row+.doc-row{border-top:1px solid var(--border-soft);}
.doc-row.is-todo{background:var(--warn-bg);}
.doc-row.is-ok{background:var(--success-bg);}
.doc-lab{font-size:12px;font-weight:600;color:var(--text-dark);line-height:1.5;}
.doc-main{min-width:0;}
.doc-meta{font-size:11px;color:var(--text-faint);text-align:right;white-space:nowrap;line-height:1.9;}
.doc-in{width:100%;border:1px solid var(--border-strong);border-radius:8px;padding:5px 8px;
  font:inherit;font-size:12.5px;color:var(--text-dark);background:#fff;outline:none;}
.doc-in:focus{border-color:var(--brand);}
.doc-in.is-todo{border-style:dashed;background:#fff;}
.doc-in.num{max-width:120px;}
textarea.doc-in{resize:vertical;line-height:1.5;}
.doc-val.lock{font-size:12.5px;color:var(--text-dark);padding:5px 0;}
.doc-from{margin-top:2px;line-height:1.5;}
.doc-flag{display:inline-block;margin-left:5px;padding:1px 6px;border-radius:var(--radius-pill);
  font-size:10.5px;font-weight:600;vertical-align:1px;}
.doc-flag.need{background:var(--danger-bg);color:var(--danger);}
.doc-flag.warn{background:var(--warn-bg);color:var(--warn);}
.doc-flag.post{background:var(--bg-soft2);color:var(--text-faint);}
.doc-flag.lock{background:var(--info-bg);color:var(--brand-deep);}
.doc-conf{display:block;margin-top:3px;font-size:11px;color:var(--text-soft);
  font-weight:400;white-space:nowrap;}
.doc-conf input{vertical-align:-2px;margin-right:3px;}

/* 单价冲突：两个价都在会话里，谁都不许替人选 */
.doc-conflict{border:1px solid var(--warn-border);background:var(--warn-bg);
  border-radius:var(--radius-md);padding:8px 10px;}
.doc-conf-opt{display:flex;gap:7px;align-items:flex-start;padding:5px 0;cursor:pointer;}
.doc-conf-opt+.doc-conf-opt{border-top:1px dashed var(--warn-border);}
.doc-conf-opt.rec>b{color:var(--brand-deep);}

/* ---------- 纸面单据（「生成草稿」之后的右列）2026-10-26 ----------
   抽屉右边原来是一条条「键：值」，逻辑看得清，但它不长得像一份要发出去的文件。
   这里按 A4 单据排：居中大标题、买卖双方两块、带边框的表格、页脚条款。
   我们的算式和提醒全写在纸下方的「内部批注」里，纸面上一个字都不出现——
   这张纸会被打印或截图发给客户。 */
#docDraftPreview{background:var(--bg-soft2);border-radius:var(--radius-md);padding:12px;}
.doc-paper{background:var(--surface);border:1px solid var(--border-strong);
  border-radius:var(--radius-sm);box-shadow:var(--sh-md);
  padding:18px 20px;min-height:300px;font-size:12px;color:var(--text-mid);}
.doc-paper.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:8px;text-align:center;color:var(--text-faint);min-height:240px;
  background:transparent;border-style:dashed;box-shadow:none;}
.doc-title{text-align:center;font-size:15px;font-weight:700;letter-spacing:.05em;
  color:var(--text-dark);margin-bottom:2px;}
.doc-subtitle{text-align:center;font-size:11px;color:var(--text-faint);margin-bottom:12px;}
/* 原来这份草稿的类名叫 .doc-meta，和上面事实表右侧那一列撞了（:2952），改名 .doc-parties */
.doc-parties{display:grid;grid-template-columns:1fr 1fr;gap:8px 14px;margin-bottom:12px;}
.doc-parties .block h4{font-size:10px;color:var(--text-faint);font-weight:700;
  letter-spacing:.3px;margin-bottom:2px;}
.doc-parties .block p{font-size:11.5px;line-height:1.5;color:var(--text-dark);}
.doc-table{width:100%;border-collapse:collapse;margin:10px 0;table-layout:fixed;}
/* 定宽 + 可断行：不定宽的话装箱单那六列会被表头撑破纸面，
   CBM 那一列整个挤出抽屉外（2026-10-26 真浏览器截图里抓到的）。
   white-space 必须在这里改回来：全局 td 是 nowrap（:499），
   于是「Outdoor Folding Chair · NV-OFC-2026」这一栏直接溢进 Qty 列，
   纸上两栏字叠在一起（真浏览器量到 scrollWidth 217 / clientWidth 159）。 */
.doc-table th.desc{width:34%;}
.doc-table th.hs{width:12%;}
.doc-table th,.doc-table td{overflow-wrap:anywhere;white-space:normal;}
.doc-table th{background:var(--bg-soft2);font-size:10px;font-weight:600;color:var(--text-soft);
  text-align:left;padding:5px 7px;border:1px solid var(--border);}
.doc-table td{padding:5px 7px;border:1px solid var(--border);font-size:11.5px;
  vertical-align:top;color:var(--text-dark);}
.doc-table .num{text-align:right;font-variant-numeric:tabular-nums;}
.doc-foot{margin-top:10px;display:grid;grid-template-columns:1fr 1fr;gap:8px;font-size:11.5px;
  color:var(--text-dark);}
.doc-foot .k{color:var(--text-faint);font-size:10px;font-weight:600;}
.doc-foot .full{grid-column:1/-1;}
.doc-totals{margin-top:8px;text-align:right;font-size:12.5px;font-weight:700;
  color:var(--text-dark);line-height:1.7;}
/* 缺的格子在纸上是一个虚线小块，一眼看出「这里还没填」；事实表那边沿用的是行底色 */
.doc-paper .pending{display:inline-block;background:var(--danger-bg);color:var(--danger);
  border:1px dashed var(--danger-border);padding:0 5px;border-radius:3px;
  font-size:11px;font-weight:500;}

/* ---------- 明细行（2026-10-26 一单多品项）----------
   事实表里每个品项一块，块头写「品项 N · 抽到的型号」并挂删一项；
   左边一条品牌色竖线是为了在滚动时一眼看出「这九项是一组的」，
   不然两张单据的项混在一起，改了第 2 项的箱规会看不出自哪一行。 */
.doc-line-block{border:1px solid var(--border);border-left:3px solid var(--brand);
  border-radius:var(--radius-sm);padding:8px 10px 10px;margin-bottom:10px;background:var(--bg-soft);}
.doc-line-hd{display:flex;align-items:center;gap:8px;margin-bottom:6px;font-size:12px;}
.doc-line-hd .btn{margin-left:auto;}
.doc-line-add{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap;}
/* 装箱单纸上那一行 Total：它是这张纸的合计，样式得比表格其它行重 */
.doc-table tr.doc-sum td{background:var(--bg-soft2);font-weight:700;color:var(--text-dark);}

/* ================= 22. LBS 获客（2026-10-29） ================= */
/* 这一套的视觉重音是「网格」：首页 hero 用极淡的方格纹理示意切片，
   搜索页把同一组方格放大成实际扫描进度。两处同一组颜色，
   看到首页就知道搜索页在干什么。 */
.lbs-hero{position:relative;overflow:hidden;border-radius:var(--radius-lg);
  background:linear-gradient(135deg,#f0fdfa 0%,#ecfeff 55%,#f8fafc 100%);
  border:1px solid #ccfbf1;padding:28px 30px 24px;}
.lbs-hero::before{content:"";position:absolute;inset:0;pointer-events:none;
  background-image:linear-gradient(rgba(13,148,136,.08) 1px,transparent 1px),
    linear-gradient(90deg,rgba(13,148,136,.08) 1px,transparent 1px);
  background-size:34px 34px;
  -webkit-mask-image:radial-gradient(circle at 84% 14%,#000 0%,transparent 62%);
  mask-image:radial-gradient(circle at 84% 14%,#000 0%,transparent 62%);}
.lbs-hero-copy{position:relative;max-width:760px;}
.lbs-eyebrow{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;
  color:#0f766e;background:#ccfbf1;border-radius:999px;padding:4px 10px;margin-bottom:12px;}
.lbs-eyebrow .material-symbols-outlined{font-size:15px;}
.lbs-hero h1{font-size:26px;line-height:34px;font-weight:700;color:var(--text-dark);
  letter-spacing:-.02em;margin:0 0 8px;}
.lbs-hero p{margin:0;font-size:13.5px;line-height:22px;color:var(--text-soft);}

/* 搜索框：一行三块（关键词 / 地区 / 按钮），窄屏自动换行 */
.lbs-searchbox{position:relative;margin-top:22px;background:#fff;border:1px solid var(--border);
  border-radius:var(--radius-md);box-shadow:0 10px 26px -16px rgba(13,148,136,.55);
  padding:12px 12px 12px 16px;display:flex;align-items:flex-end;gap:12px;flex-wrap:wrap;max-width:900px;}
.lbs-sb-field{display:flex;flex-direction:column;gap:4px;min-width:0;}
.lbs-sb-kw{flex:1 1 260px;}
.lbs-sb-region{flex:0 0 210px;}
.lbs-sb-label{font-size:11px;font-weight:600;color:var(--text-faint);letter-spacing:.02em;}
.lbs-sb-input,.lbs-sb-select{height:38px;border:1px solid var(--border-strong);border-radius:8px;
  padding:0 10px;font:inherit;font-size:13.5px;color:var(--text-dark);background:#fff;outline:none;
  transition:border-color .15s,box-shadow .15s;width:100%;}
.lbs-sb-input:focus,.lbs-sb-select:focus{border-color:var(--sys-lbs);
  box-shadow:0 0 0 3px rgba(13,148,136,.14);}
.lbs-sb-select{cursor:pointer;}
.lbs-sb-sep{width:1px;align-self:stretch;background:var(--border-soft);margin:14px 2px;}
.lbs-sb-go{height:38px;flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;
  background:var(--sys-lbs);border-color:var(--sys-lbs);}
.lbs-sb-go:hover{background:#0f766e;border-color:#0f766e;}
.lbs-sb-go .material-symbols-outlined{font-size:18px;}
.lbs-sb-hint{position:relative;font-size:11.5px;line-height:18px;color:var(--text-faint);margin-top:10px;}
.lbs-region-chips{position:relative;display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}
.lbs-rchip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);
  background:#fff;border-radius:999px;padding:5px 12px;font:inherit;font-size:12.5px;
  color:var(--text-mid);cursor:pointer;transition:all .15s;}
.lbs-rchip .material-symbols-outlined{font-size:15px;color:var(--sys-lbs);}
.lbs-rchip b{font-weight:600;}
.lbs-rchip em{font-style:normal;font-size:11px;color:var(--text-faint);}
.lbs-rchip:hover{border-color:#99f6e4;background:#f0fdfa;}
.lbs-rchip.active{border-color:var(--sys-lbs);background:#f0fdfa;color:#0f766e;
  box-shadow:0 0 0 1px var(--sys-lbs) inset;}

/* 首页右下：三道关 + 谁在干这件事 */
.lbs-home-side{display:flex;flex-direction:column;gap:20px;min-width:0;}
.lbs-home-bottom > .card{min-width:0;}
.lbs-how{display:flex;flex-direction:column;gap:10px;}
.lbs-how-row{display:flex;gap:12px;align-items:flex-start;}
.lbs-how-row + .lbs-how-row{border-top:1px dashed var(--border-soft);padding-top:10px;}
.lbs-how-ic{flex:0 0 30px;width:30px;height:30px;border-radius:8px;background:#f0fdfa;
  color:var(--sys-lbs);display:flex;align-items:center;justify-content:center;}
.lbs-how-ic .material-symbols-outlined{font-size:17px;}
.lbs-how-row b{display:block;font-size:13px;line-height:19px;color:var(--text-dark);margin-bottom:2px;}
.lbs-how-row > div > span{display:block;font-size:12px;line-height:18px;color:var(--text-soft);}
.lbs-agent{display:flex;align-items:center;gap:12px;padding:2px 0 10px;}
.lbs-agent-meta{min-width:0;flex:1;}
.lbs-agent-name{font-size:13.5px;font-weight:700;color:var(--text-dark);}
.lbs-agent-duty{font-size:11.5px;line-height:17px;color:var(--text-faint);margin-top:2px;}
.lbs-agent-note{display:flex;align-items:flex-start;gap:6px;font-size:11.5px;line-height:17px;
  color:var(--text-faint);border-top:1px dashed var(--border-soft);padding-top:10px;}
.lbs-agent-note .material-symbols-outlined{font-size:14px;color:var(--sys-lbs);flex:0 0 auto;margin-top:1px;}

/* 搜索中间态：左网格右日志 */
.lbs-search-layout{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);
  gap:20px;align-items:start;}
.lbs-search-layout > .card{min-width:0;}
.lbs-run-head{padding:18px 20px;border-radius:var(--radius-lg);border:1px solid #ccfbf1;
  background:linear-gradient(135deg,#f0fdfa,#ecfeff);}
.lbs-run-title{font-size:15px;color:var(--text-mid);}
.lbs-run-title b{font-size:16px;color:var(--text-dark);font-weight:700;}
.lbs-run-sub{font-size:12px;line-height:18px;color:var(--text-soft);margin-top:3px;
  font-variant-numeric:tabular-nums;}
.lbs-run-bar{height:6px;border-radius:999px;background:#ccfbf1;margin-top:12px;overflow:hidden;}
.lbs-run-bar i{display:block;height:100%;border-radius:999px;background:var(--sys-lbs);
  transition:width .2s ease;}
.lbs-run-nums{display:flex;justify-content:space-between;gap:12px;font-size:11.5px;
  color:var(--text-soft);margin-top:6px;font-variant-numeric:tabular-nums;}
.lbs-stat{font-size:11.5px;color:var(--text-soft);margin-left:12px;font-variant-numeric:tabular-nums;}
.lbs-stat b{color:var(--text-dark);font-size:13px;}

/* 网格本体：一格一个方块，四种状态一眼可辨 */
#lbsGrid{min-height:260px;}
.lbs-grid{display:grid;gap:5px;margin:4px 0 14px;}
.lbs-cell{position:relative;aspect-ratio:1;border-radius:5px;background:var(--bg-soft2);
  border:1px solid var(--border-soft);display:flex;align-items:center;justify-content:center;
  font-size:9.5px;line-height:1;color:#94a3b8;transition:background .18s,border-color .18s,color .18s;}
.lbs-cell b{position:absolute;top:2px;right:3px;font-size:9px;font-weight:700;line-height:1;}
.lbs-cell.done{background:var(--sys-lbs);border-color:var(--sys-lbs);color:rgba(255,255,255,.85);}
.lbs-cell.done b{color:#fff;}
.lbs-cell.empty{background:#f0fdfa;border-color:#ccfbf1;color:#0f766e;}
.lbs-cell.scanning{background:#fff;border-color:var(--sys-lbs);color:#0f766e;
  box-shadow:0 0 0 2px rgba(13,148,136,.22);animation:lbsPulse 1.2s ease-in-out infinite;}
.lbs-cell.pending{background:repeating-linear-gradient(135deg,#f1f5f9 0 6px,#eef2f7 6px 12px);}
@keyframes lbsPulse{0%,100%{box-shadow:0 0 0 2px rgba(13,148,136,.22);}
  50%{box-shadow:0 0 0 5px rgba(13,148,136,.10);}}
.lbs-grid-legend{display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--text-soft);}
.lbs-lg{display:inline-flex;align-items:center;gap:6px;}
.lbs-lg::before{content:"";width:12px;height:12px;border-radius:3px;border:1px solid transparent;}
.lbs-lg.done::before{background:var(--sys-lbs);}
.lbs-lg.scanning::before{background:#fff;border-color:var(--sys-lbs);box-shadow:0 0 0 2px rgba(13,148,136,.22);}
.lbs-lg.pending::before{background:var(--bg-soft2);border-color:var(--border-soft);}
.lbs-lg.empty::before{background:#f0fdfa;border-color:#ccfbf1;}

/* API 日志：等宽、深底，像终端，但不超过一屏 */
.lbs-log{min-height:300px;max-height:420px;overflow:auto;margin:12px -20px -20px;
  padding:14px 20px 18px;background:#0f172a;border-radius:0 0 var(--radius-lg) var(--radius-lg);
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:20px;}
.lbs-log-line{color:#cbd5e1;white-space:pre-wrap;word-break:break-all;}
.lbs-log-line:nth-child(2n){color:#94a3b8;}
.lbs-log-live{color:#5eead4;}
.lbs-log-live::after{content:"▍";animation:lbsBlink 1s steps(1) infinite;}
@keyframes lbsBlink{50%{opacity:0;}}

/* 跑完 / 没跑完的收尾卡 */
.lbs-done-card{display:flex;align-items:center;gap:16px;border-left:3px solid var(--sys-lbs);}
.lbs-done-card.is-running{border-left-color:var(--warn);}
.lbs-done-ic{flex:0 0 44px;width:44px;height:44px;border-radius:12px;background:#f0fdfa;
  color:var(--sys-lbs);display:flex;align-items:center;justify-content:center;}
.lbs-done-card.is-running .lbs-done-ic{background:var(--warn-bg);color:var(--warn);}
.lbs-done-ic .material-symbols-outlined{font-size:24px;}
.lbs-done-text{flex:1;min-width:0;}
.lbs-done-text b{display:block;font-size:14px;color:var(--text-dark);margin-bottom:2px;}
.lbs-done-text span{display:block;font-size:12px;line-height:18px;color:var(--text-soft);}
.lbs-done-act{display:flex;gap:8px;flex-wrap:wrap;flex:0 0 auto;}

/* 结果页 / 每日详情的页头 */
.lbs-page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding:18px 20px;border-radius:var(--radius-lg);border:1px solid var(--border-soft);background:#fff;}
.lbs-ph-title{font-size:18px;line-height:26px;font-weight:700;color:var(--text-dark);letter-spacing:-.01em;}
.lbs-ph-sub{font-size:12px;line-height:18px;color:var(--text-faint);margin-top:3px;
  font-variant-numeric:tabular-nums;}
.lbs-ph-task{display:flex;gap:8px;flex-wrap:wrap;}
.lbs-tchip{display:inline-flex;align-items:center;font-size:12px;color:var(--text-mid);
  background:var(--bg-soft2);border:1px solid transparent;border-radius:999px;padding:4px 11px;
  text-decoration:none;transition:all .15s;}
.lbs-tchip:hover{background:#f0fdfa;border-color:#ccfbf1;color:#0f766e;}
.lbs-tchip.active{background:#f0fdfa;border-color:var(--sys-lbs);color:#0f766e;font-weight:600;}

/* 结果页工具条：筛选 chips + 关键词 + 导出 */
.lbs-res-toolbar{border-bottom:1px solid var(--border-soft);margin:-4px -20px 14px;padding:0 20px 14px;}
.lbs-toolbar-row{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;}
.lbs-filters .chip{cursor:pointer;}
.lbs-toolbar-right{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.lbs-kw{height:32px;border:1px solid var(--border-strong);border-radius:8px;padding:0 10px;
  font:inherit;font-size:12.5px;color:var(--text-dark);outline:none;min-width:190px;
  transition:border-color .15s,box-shadow .15s;}
.lbs-kw:focus{border-color:var(--sys-lbs);box-shadow:0 0 0 3px rgba(13,148,136,.14);}
.lbs-cnt{font-style:normal;font-size:11px;font-weight:600;color:var(--text-faint);margin-left:2px;}
.chip.active .lbs-cnt{color:var(--brand);}

/* 商家行：地址是唯一允许换行的列（全局 td 是 nowrap），
   一条地址三四十个字符，不换行会把电话列挤出屏幕。 */
.lbs-name{display:flex;flex-direction:column;gap:1px;line-height:18px;}
.lbs-name b{font-size:13px;color:var(--text-dark);}
td.lbs-addr{white-space:normal !important;min-width:180px;max-width:280px;
  font-size:12px;line-height:17px;color:var(--text-soft);}
.lbs-phone{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;
  font-variant-numeric:tabular-nums;}
.lbs-phone .material-symbols-outlined{font-size:14px;color:var(--sys-lbs);}
.lbs-act{display:flex;align-items:center;gap:8px;}
.lbs-row:hover td{background:#fafcfd;}

/* 每日详情：日期 chips */
.lbs-day-head{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding:14px 20px;border-radius:var(--radius-lg);border:1px solid var(--border-soft);background:#fff;}
.lbs-day-chips{display:flex;gap:6px;flex-wrap:wrap;}
.lbs-day{border:1px solid var(--border);background:#fff;border-radius:8px;padding:5px 12px;
  font:inherit;font-size:12.5px;color:var(--text-mid);cursor:pointer;transition:all .15s;
  font-variant-numeric:tabular-nums;}
.lbs-day:hover{border-color:#99f6e4;color:#0f766e;}
.lbs-day.active{background:var(--sys-lbs);border-color:var(--sys-lbs);color:#fff;font-weight:600;}

/* 汇总页：横向条形、漏斗 */
.lbs-bars{display:flex;flex-direction:column;gap:9px;}
.lbs-bar{display:grid;grid-template-columns:118px minmax(0,1fr) auto;align-items:center;gap:10px;
  font-size:12px;}
.lbs-bar-l{color:var(--text-mid);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.lbs-bar-t{height:10px;border-radius:999px;background:var(--bg-soft2);overflow:hidden;}
.lbs-bar-t i{display:block;height:100%;border-radius:999px;
  background:linear-gradient(90deg,#14b8a6,#0d9488);transition:width .3s ease;}
.lbs-bar-v{color:var(--text-soft);font-size:11.5px;white-space:nowrap;
  font-variant-numeric:tabular-nums;}
.lbs-funnel{display:flex;flex-direction:column;gap:12px;}
.lbs-fn-row{display:grid;grid-template-columns:78px minmax(0,1fr) auto;align-items:center;gap:10px;
  font-size:12px;}
.lbs-fn-l{color:var(--text-mid);font-weight:500;}
.lbs-fn-t{height:22px;border-radius:6px;background:var(--bg-soft2);overflow:hidden;}
.lbs-fn-t i{display:block;height:100%;border-radius:6px;background:#94a3b8;transition:width .3s ease;}
.lbs-fn-t.info i{background:#38bdf8;}
.lbs-fn-t.ok i{background:var(--sys-lbs);}
.lbs-fn-v{color:var(--text-dark);font-size:12.5px;font-weight:600;white-space:nowrap;
  font-variant-numeric:tabular-nums;}
.lbs-fn-v em{font-style:normal;font-size:11px;font-weight:500;color:var(--text-faint);margin-left:4px;}

/* JS 填充的空容器：先占住高度，避免四态切换时页面跳一下 */
#lbsHomeKpis,#lbsDailyKpis,#lbsInsKpis{min-height:112px;}
#lbsRecentTasks{min-height:180px;}
#lbsDailyTasks{min-height:60px;}
#lbsDailyLeads{min-height:160px;}
#lbsResultsBody{min-height:220px;}
#lbsResultsPager{min-height:36px;}
#lbsSearchFoot{min-height:76px;}
#lbsInsRegion,#lbsInsCat,#lbsInsTrend,#lbsInsFunnel,#lbsInsRisk{min-height:120px;}

@media(max-width:1100px){
  .lbs-search-layout{grid-template-columns:1fr;}
  .lbs-log{min-height:220px;max-height:320px;}
  .lbs-home-bottom{grid-template-columns:1fr;}
  .lbs-done-card{flex-wrap:wrap;}
  .lbs-done-act{margin-left:60px;}
}
@media(max-width:900px){
  .lbs-hero{padding:22px 20px 20px;}
  .lbs-hero h1{font-size:21px;line-height:29px;}
  .lbs-sb-sep{display:none;}
  .lbs-sb-region{flex:1 1 160px;}
  .lbs-sb-go{width:100%;justify-content:center;}
  .lbs-bar{grid-template-columns:88px minmax(0,1fr) auto;}
  .lbs-page-head,.lbs-day-head{align-items:flex-start;}
}
@media(prefers-reduced-motion:reduce){
  .lbs-cell.scanning{animation:none;}
  .lbs-log-live::after{animation:none;}
}
