/* ============================================================
   Nova AI · 一站式企业管理系统 — 高保真设计系统 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;

  /* 间距 */
  --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);}

/* ---------- 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;}
.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;}

/* 开关 */
.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;}
.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 栏里会撑出横向滚动 */
#bgListWrap td:nth-child(3){white-space:normal;min-width:120px;line-height:1.5;}
#bgListWrap td:last-child{white-space:normal;}
#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;}
#bgListWrap td:first-child{white-space:normal;min-width:160px;}
.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);}
.check-card .cc-d{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;}

/* 聊天气泡 */
.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;}
.chat-composer-bar-left select{max-width:118px;}
.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;}

/* 「业务系统」区块标题右侧的智能体汇总条：首页唯一一处横切视角，
   点进去就是智能体中心 / 交接队列，把原来「顶栏→中心页」的两跳压成一跳。 */
.portal-agent-sum{
  display:flex;align-items:center;flex-wrap:wrap;gap:6px 12px;
  font-size:11.5px;color:var(--text-soft);
}
.portal-agent-sum b{color:var(--text-dark);font-weight:700;font-variant-numeric:tabular-nums;}
.portal-agent-sum .pas-link{
  display:inline-flex;align-items:center;gap:3px;min-height:24px;
  color:var(--brand);font-weight:600;text-decoration:none;
}
.portal-agent-sum .pas-link:hover{text-decoration:underline;}
.portal-agent-sum .pas-link .material-symbols-outlined{font-size:14px;}
.portal-agent-sum .pas-warn{color:var(--warn);font-weight:700;}

@media (max-width:900px){
  .portal-agent-sum{width:100%;}
}

/* 入口页六张系统卡的窄屏降列。
   全站 .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;}
.sys-card-agents .agent-badge .ab-lv{flex-shrink: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;}

/* ---------- 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-mask，不另起一套。 */
.modal.chat{max-width:760px;height:min(680px,82vh);
  display:flex;flex-direction:column;overflow:hidden;}
.modal.chat .modal-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;}
.modal.chat .modal-foot{justify-content:stretch;flex-shrink:0;}
.dash-ask-foot{width:100%;}
.dash-ask-chat{display:flex;flex-direction:column;gap:12px;}
.dash-ask-chat:empty{display:none;}
.dash-ask-chat .bubble{max-width:88%;}
.dash-ask-chat table{font-size:12px;}
@media (max-width:700px){.modal.chat{height:88vh;}}
.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);}
.agent-badge .ab-lv{
  padding:0 6px;border-radius:999px;font-size:11px;font-weight:700;line-height:16px;
}
.agent-badge .ab-lv.lv-gray{background:var(--bg-soft2);color:var(--text-faint);}
.agent-badge .ab-lv.lv-info{background:var(--info-bg);color:var(--brand);}
.agent-badge .ab-lv.lv-warn{background:var(--warn-bg);color:var(--warn);}
.agent-badge .ab-lv.lv-success{background:var(--success-bg);color:var(--success);}
/* 侧边栏「本系统智能体」那一组的授权档位标记，与署名徽章同一套配色 */
/* 侧边栏的授权档位标记 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%;} }

/* ---------- 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;}
}

/* 分级规则弹窗里的阈值输入框 */
.tier-th{
  width:62px;padding:4px 8px;text-align:center;
  border:1px solid var(--border);border-radius:7px;background:var(--bg-card);
  font-size:12.5px;font-weight:700;color:var(--text-dark);font-variant-numeric:tabular-nums;
}
.tier-th:focus{outline:none;border-color:var(--brand);box-shadow:var(--sh-brand);}
.tier-th:focus-visible{outline:2px solid var(--brand);outline-offset:1px;}

/* 跟进计划列表 / 分级看板未分档说明：都是 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;} }

/* 执行配置页「话术切入」：2026-08-23 动作与主题合并后由 JS 填。
   两种形态（只有切入点 / 附带「更贴合的动作」提示）实测都是 104px，
   刚好可以拿同一个下限占住位，否则加载时会顶掉下方整块联络方式。 */
#csActionFit{min-height:104px;}
@media (max-width:900px){ #csActionFit{min-height:0;} }

/* 从协助事项跳进会话时顶部的卡点提示 */
.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;}

/* ---------- 工作台：业务经理对话框（模态） ----------
   .modal 默认 max-height:88vh + overflow-y:auto，整块一起滚。
   会话框不能那样：头部得一直看得见是谁在跟你说话，输入框得一直够得着。
   竖向 flex 由 .wb-mgr-box 提供（和它在页面流里时是同一套），
   这里只补弹框特有的那部分：固定高度，以及让会话区吃掉剩下的空间。 */
.wb-mgr-modal{
  height:calc(100vh - 48px);max-height:820px;
}
.wb-mgr-modal .wb-mgr-head{border-radius:var(--radius-lg) var(--radius-lg) 0 0;}
.wb-mgr-modal .wb-mgr-input{border-radius:0 0 var(--radius-lg) var(--radius-lg);}
/* html 与 body 都要锁：这一页实际滚动的是根元素，只锁 body 拦不住滚轮 */
html.wb-mgr-open, body.wb-mgr-open{overflow:hidden;}
@media(max-width:900px){ .wb-mgr-modal{height:calc(100vh - 24px);} }

/* 从客群管理点「编辑」进分级规则弹框时，把对应那一行点亮一下下——
   三行长得一样，不点亮人得回头想自己刚点的是哪一档 */
.tier-row-hl{box-shadow:0 0 0 2px var(--brand);transition:box-shadow .2s;}

/* 对话框内嵌在页面里时，会话区回到 600px 封顶（.wb-mgr-thread 的默认值），
   页面跟着一起滚；进弹框时由 .wb-mgr-modal 改成撑满剩余高度。
   停靠位空着的时候（对话框正在弹框里）不要占那一截 section 间距。 */
#wbMgrDock:empty{display:none;}

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

/* 内嵌状态下没有「关闭」可言——那个 × 只在弹框里有意义 */
.wb-mgr-box:not(.wb-mgr-modal) [data-wb-mgr-dock]{display:none;}

/* 业务经理档案的抽屉比通用 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);}
/* 从别的页面带参数跳回来时定位到的那一行（如交接队列「去审核」→ 智能学堂那门待审课） */
tr.row-hit{background: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);}
