/* 百思特 CRM — 响应式设计系统（手机 / 平板 / 桌面自适应） */
:root{
  --bg:#eef1f6; --surface:#ffffff; --surface-2:#f4f6fa;
  --text:#1f2a37; --muted:#6b7280; --border:#e3e8ef;
  --primary:#2E5A8C; --primary-600:#24476F; --primary-50:#EDF2F8; --primary-soft:#3C76B7;
  --accent:#ef7d22; --accent-50:#fdf1e6;
  --green:#1f9d6b; --green-50:#e7f6ef; --red:#d64550; --red-50:#fdeceb;
  --amber:#b9821a; --amber-50:#fbf3e2;
  --ink:#1a1d24; --ink-2:#22262f; --ink-3:#2c313b; --ink-4:#16243c; --ink-warm:#3a2a18;
  --ink-text:#9aa3af; --ink-link:#4c9fff; --ink-link-2:#6fb0ff;
  --radius:10px; --radius-sm:6px; --radius-lg:14px; --radius-full:999px; --shadow:0 1px 3px rgba(16,24,40,.06),0 1px 2px rgba(16,24,40,.04);
  --shadow-lg:0 10px 30px rgba(16,24,40,.12); --nav-w:236px;
  /* 别名 token（2026-09-17）：代码里用了这些名字，:root 却从未定义 → 整条声明被丢弃、样式静默失效。
     最典型的是「🙋 认领」按钮：background:var(--brand) 失效后只剩 color:#fff → 白字白底，按钮文字看不见。
     值取代码里原本写的 fallback（--blue/#3b82f6、--orange/--accent 等），或语义等价的现有 token。 */
  --brand:var(--primary); --info:var(--primary-soft); --danger:var(--red);
  --blue:#3b82f6; --blue-50:#eff6ff; --orange:var(--accent);
  --navy:var(--primary-600); --surface-1:var(--surface); --primary-60:#c9d7ec; --text-2:#4b5563;
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",Roboto,"Helvetica Neue",Arial,sans-serif;
}
*{box-sizing:border-box} html,body{margin:0;height:100%}
body{background:var(--bg);color:var(--text);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}
button,input,select,textarea{font-family:inherit;font-size:inherit}
a{color:var(--primary);text-decoration:none}
.hidden{display:none!important}

/* ---------- 登录 ---------- */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;
  background:linear-gradient(135deg,#e8edf5 0%,#dce3ee 100%)}
/* 登录卡片固定外框（1080×656，即本轮调整前的实际高度）：内容再多也不改变版式 */
.login-card{background:var(--surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);width:100%;display:flex;overflow:hidden;
  max-width:min(1080px,calc((100vh - 40px)*1080/656));aspect-ratio:1080/656}
.login-features{flex:1;display:flex;flex-direction:column;justify-content:center;padding:40px 36px;color:#fff;
  background:linear-gradient(135deg,var(--primary) 0%,var(--primary-600) 100%);min-width:0}
.login-features .lf-logo{margin-bottom:24px}
.login-features .lf-logo img{width:100%;max-width:260px;height:auto;object-fit:contain;filter:brightness(0) invert(1)}
.login-features .lf-title{font-size:24px;font-weight:800;letter-spacing:1px;margin:0 0 8px;line-height:1.3}
.login-features .lf-subtitle{font-size:14px;opacity:.85;margin:0 0 28px;line-height:1.6}
.login-features .lf-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:18px}
.login-features .lf-item{display:flex;align-items:flex-start;gap:12px}
.login-features .lf-icon{font-size:20px;line-height:1;flex-shrink:0;width:40px;height:40px;border-radius:10px;background:rgba(255,255,255,.15);display:flex;align-items:center;justify-content:center}
.login-features .lf-text h3{margin:0 0 2px;font-size:14px;font-weight:700}
.login-features .lf-text p{margin:0;font-size:12px;opacity:.78;line-height:1.5}
.login-features .lf-footer{margin-top:auto;padding-top:28px;font-size:11px;opacity:.6}
.login-form{width:480px;flex-shrink:0;min-height:0;display:flex;flex-direction:column;overflow-y:auto;scrollbar-width:thin}
.login-form::-webkit-scrollbar{width:7px} .login-form::-webkit-scrollbar-thumb{background:rgba(0,0,0,.16);border-radius:var(--radius-sm)} .login-form::-webkit-scrollbar-track{background:transparent}
.login-form-inner{flex:1 0 auto;display:flex;flex-direction:column;justify-content:center;padding:30px 32px}
/* 登录页右栏紧凑化：让账号密码 + 企业统一登录 + 演示角色在 16:9 框内完整显示，无需滚动 */
.login-form-inner .field{display:block;margin-bottom:12px}   /* 登录页退回「标签在上」：窄栏两列会挤压输入框 */
.login-form-inner .field label{margin-bottom:5px}
.login-form-inner .err{margin:2px 0 0;min-height:12px}
.login-form h1{font-size:20px;margin:0 0 4px} .login-form .sub{color:var(--muted);margin:0 0 24px;font-size:13px}
.login-form .btn-primary{display:block;width:100%;text-align:center;padding:12px 16px;font-size:15px;font-weight:600;border-radius:var(--radius);background:var(--primary);border:1px solid var(--primary);color:#fff;cursor:pointer;line-height:1.5}
.login-form .btn-primary:hover{background:var(--primary-600);border-color:var(--primary-600)}
.brand-badge{display:inline-flex;align-items:center;gap:8px;font-weight:700;color:var(--primary);font-size:14px;margin-bottom:18px}
.brand-logo{text-align:center;margin-bottom:8px}
.brand-logo img{width:100%;max-width:300px;height:auto;display:inline-block;object-fit:contain}
.brand-title{text-align:center;font-weight:800;color:var(--primary);font-size:18px;letter-spacing:2px;margin:2px 0 20px}
.brand-badge .dot{width:22px;height:22px;border-radius:var(--radius-sm);background:var(--primary);position:relative}
.brand-badge .dot::after{content:"";position:absolute;right:-3px;bottom:-3px;width:9px;height:9px;border-radius:var(--radius-sm);background:var(--accent)}
/* ---------- 表单字段：字段名左 / 控件右（同一行） ----------
   2026-09-17（用户要求）：全站录入类表单统一「字段名与字段值同一行」，取代「标签独占一行」的旧版式
   （旧版每个字段占两行，表单长度翻倍）。字段名列宽按字段宽度取 34%（夹在 72–116px）：同一表单内
   同列字段等宽 → 控件左边缘自然对齐；窄列（如线索表单 6 列约 215px）不会被字段名挤扁控件。
   控件自适应剩余宽度。放不下两列的窄格（登录页、固定宽度筛选字段）加 .field-vert 退回「标签在上」。 */
.field,.fld{display:grid;grid-template-columns:clamp(72px,34%,116px) minmax(0,1fr);gap:4px 10px;align-items:center;margin-bottom:10px}
.field label,.fld label{display:block;font-size:12px;color:var(--muted);margin-bottom:6px}
.field>label,.fld>label{display:block;margin:0;font-size:12px;color:var(--muted);line-height:1.35;word-break:break-word}
.field>:not(label):first-child,.fld>:not(label):first-child{grid-column:1/-1}   /* 裸控件字段（无字段名）整行铺满 */
.field>label:only-child,.fld>label:only-child{grid-column:1/-1}                 /* 字段名内嵌勾选框，整行 */
.field>label:first-child~*,.fld>label:first-child~*{grid-column:2}              /* 字段名之后的控件/说明文字一律落右列 */
.field.field-vert,.fld.fld-vert{display:block}
.field.field-vert>label,.fld.fld-vert>label{display:block;margin:0 0 6px}
.field input,.field select,.field textarea{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);outline:none}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-50)}
/* 提交被拦的字段行（如售前单据缺附件）：标红但保留用户输入——表单不关，就地补齐再提交（2026-09-22） */
.field.field-err>label,.fld.fld-err>label{color:var(--red)}
.field.field-err input,.field.field-err select,.field.field-err textarea,
.fld.fld-err input,.fld.fld-err select,.fld.fld-err textarea{border-color:var(--red);box-shadow:0 0 0 3px var(--red-50)}
.field.field-err .muted{color:var(--red)}
/* 只读 / 禁用一律致灰（线上 disabled 底色 rgb(242,243,245)、cursor:not-allowed；此处用本系统 token）。
   全站约定：只要 readonly / disabled 就不该看起来和可填字段一样白——.field input 的 background 优先级
   会压过裸类，所以这条要写成属性选择器（用户反馈「crm 只读的位置没有致灰」）。 */
input[readonly]:not([type=checkbox]):not([type=radio]):not([type=file]),
select[readonly],textarea[readonly],
input[disabled]:not([type=checkbox]):not([type=radio]):not([type=file]),
select[disabled],textarea[disabled]{background:var(--surface-2);color:var(--muted);cursor:not-allowed}
.login-hint{margin-top:16px;font-size:12px;color:var(--muted);background:var(--surface-2);border-radius:var(--radius);padding:10px 12px;line-height:1.7}
/* 企业账号统一登录入口（后端能给出跳转地址时才可用，未配置时点击给提示） */
.login-or{display:flex;align-items:center;gap:10px;margin:2px 0 8px;color:var(--muted);font-size:12px}
.login-or::before,.login-or::after{content:"";flex:1;height:1px;background:var(--border)}
.login-sso{display:block;width:100%;text-align:center;padding:9px 16px;font-size:14px;font-weight:600;border-radius:var(--radius);background:var(--surface);border:1px solid var(--border);color:var(--text);cursor:pointer;line-height:1.5}
.login-sso:hover{border-color:var(--primary);color:var(--primary);background:var(--primary-50)}
.login-sso:disabled{opacity:.6;cursor:progress}
.login-sso-hint{margin:4px 0 0;font-size:11px;color:var(--muted);text-align:center}
/* 演示模式角色快捷登录（仅演示模式渲染） */
.login-demo-roles{margin-top:10px;border-top:1px dashed var(--border);padding-top:10px}
.login-demo-roles .ldr-tip{font-size:11px;color:var(--muted);margin-bottom:6px}
.login-demo-roles .ldr-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:5px}
.login-demo-roles .btn{padding:4px 6px!important;font-size:11px!important;line-height:1.5}
.err{color:var(--red);font-size:13px;margin:8px 0 0;min-height:18px}
/* 窄屏笔记本（1024/1152 等）：右栏再收紧一档，尽量在 16:9 框内完整显示 */
@media(max-width:1150px) and (min-width:769px){
  .login-form-inner{padding:20px 24px}
  .login-form-inner h1{font-size:18px}
  .login-form-inner .sub{margin-bottom:10px}
  .login-form-inner .field{margin-bottom:10px}
  .login-form-inner .login-or{margin:2px 0 6px}
  .login-demo-roles .btn{padding:3px 5px!important;font-size:10px!important}
}
@media(max-width:768px){
  .login-card{max-width:460px;flex-direction:column;aspect-ratio:auto}
  .login-features{display:none}
  .login-form{width:100%;flex-shrink:1;overflow-y:visible}
  .login-form-inner{padding:36px 32px}
}

/* ---------- 主框架 ---------- */
.shell{display:flex;height:100vh;height:100dvh;overflow:hidden}
.sidebar{width:var(--nav-w);height:100vh;height:100dvh;background:rgba(248,249,251,.86);backdrop-filter:saturate(180%) blur(22px);-webkit-backdrop-filter:saturate(180%) blur(22px);color:var(--text);flex-shrink:0;display:flex;flex-direction:column;position:fixed;top:0;bottom:0;left:0;z-index:20;border-right:1px solid rgba(0,0,0,.06)}
.sidebar .logo{display:flex;flex-direction:column;align-items:flex-start;gap:8px;font-weight:700;color:var(--text);padding:16px 14px 12px;font-size:14px;flex-shrink:0}
.sidebar .logo .chip{background:#fff;border:1px solid rgba(0,0,0,.06);border-radius:var(--radius);padding:8px 10px;display:block;width:100%;box-sizing:border-box;text-align:center;box-shadow:0 1px 2px rgba(0,0,0,.04)}
.sidebar .logo .chip img{width:100%;max-width:184px;height:auto;display:inline-block;object-fit:contain}
.sidebar .logo .sys{font-size:13px;letter-spacing:.2px;color:var(--muted);padding-left:2px;font-weight:600}
.nav{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:4px 10px 18px;scrollbar-width:thin;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.nav::-webkit-scrollbar{width:7px} .nav::-webkit-scrollbar-thumb{background:rgba(0,0,0,.16);border-radius:var(--radius-sm)} .nav::-webkit-scrollbar-track{background:transparent}
.nav-group{margin-bottom:4px}
/* 只有一项的组 → 直接是一级菜单：外观与一级组头（.nav-grp-h）完全一致，但没有折叠箭头、点了就进页面。
   注意选择器用 .nav > .nav-flat：否则会被 .nav a（24px 缩进 / 14px / weight450）盖成"没有父级的二级项"。
   字号契约：一级 15px/700 > 二级 14px/450（原来一级写 13px，比二级还小，层级倒挂）。 */
.nav > .nav-flat{display:flex;align-items:center;gap:8px;padding:10px 10px 6px;margin-top:8px;
  font-size:15px;font-weight:700;letter-spacing:.02em;color:var(--text);border-radius:var(--radius);cursor:pointer}
.nav > .nav-flat:hover{color:var(--primary);background:rgba(0,0,0,.04)}
.nav > .nav-flat.active{color:var(--primary)}
.nav > .nav-flat .grp-ic-wrap{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.nav > .nav-flat .grp-ic-wrap svg{width:17px;height:17px}
.nav-grp-h{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 10px 6px;margin-top:8px;font-size:15px;font-weight:700;letter-spacing:.02em;color:var(--text);cursor:pointer;user-select:none;border-radius:var(--radius);transition:color .12s,background .12s}   /* 一级菜单：15px/700（章节标题档，同 .opp-feed-hd-ttl），必须 > 二级 .nav a 的 14px/450 */
.nav-grp-h .grp-ic-wrap{width:20px;height:20px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.nav-grp-h .grp-ic-wrap svg{width:17px;height:17px}
.nav-grp-h .chev{margin-left:auto}
.nav-group:first-child .nav-grp-h{margin-top:4px}
.nav-grp-h:hover{color:var(--primary);background:rgba(0,0,0,.04)}
.nav-grp-h .chev{font-size:14px;line-height:1;color:var(--muted);transition:transform .18s ease}
.nav-group.collapsed .nav-grp-h .chev{transform:rotate(-90deg)}
.nav-grp-items{display:grid;grid-template-rows:1fr;transition:grid-template-rows .22s cubic-bezier(.4,0,.2,1)}
.nav-grp-inner{overflow:hidden;min-height:0}
.nav-group.collapsed .nav-grp-items{grid-template-rows:0fr}
.nav a{display:flex;align-items:center;gap:10px;color:var(--text);padding:8px 11px 8px 24px;border-radius:var(--radius);margin:2px 0;font-weight:450;font-size:14px;cursor:pointer;transition:background .12s,color .12s}
.nav a .ic{width:20px;text-align:center;font-size:14px;opacity:.85;flex-shrink:0}
.nav a .lbl{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nav a:hover{background:rgba(0,0,0,.045)}
.nav a.active{background:var(--primary-50);color:var(--primary);font-weight:600}
.nav a.active:hover{background:var(--primary-50)}
.nav a.active .lbl{font-weight:600}
.nav a.active .ic{opacity:1}
.sidebar .foot{position:relative;padding:8px 10px;border-top:1px solid rgba(0,0,0,.07);flex-shrink:0;background:transparent}
.user-chip{display:flex;align-items:center;gap:9px;width:100%;border:none;background:transparent;border-radius:var(--radius);padding:7px 8px;cursor:pointer;text-align:left;transition:background .12s}
.user-chip:hover,.user-chip.open{background:rgba(0,0,0,.05)}
.user-chip .avatar{width:30px;height:30px;border-radius:50%;background:var(--primary);color:#fff;font-weight:600;font-size:13px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.user-chip .uc-info{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.25}
.user-chip .uc-name{font-size:13px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.user-chip .uc-sub{font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.user-chip .uc-chev{color:var(--muted);font-size:13px;transition:transform .18s ease;flex-shrink:0}
.user-chip.open .uc-chev{transform:rotate(180deg)}
.user-menu{position:absolute;left:10px;right:10px;bottom:calc(100% - 2px);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);padding:10px;z-index:40}
.user-menu .um-row{margin-bottom:8px} .user-menu .um-row label{display:block;font-size:11px;color:var(--muted);margin-bottom:3px}
.user-menu select{width:100%;padding:7px 9px;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);color:var(--text);font-size:13px}
.user-menu .um-btn{width:100%;margin-top:6px;border:1px solid var(--border);background:var(--surface-2);color:var(--text);border-radius:var(--radius);padding:8px 10px;cursor:pointer;font-weight:500;font-size:13px;transition:background .12s}
.user-menu .um-btn:hover{background:var(--surface-2)}
.user-menu .um-danger{color:var(--red);border-color:var(--red-50)} .user-menu .um-danger:hover{background:var(--red-50)}
.user-menu .um-ver{font-size:11px;color:var(--muted);text-align:center;margin-top:8px}
.main{flex:1;margin-left:var(--nav-w);min-width:0;display:flex;flex-direction:column;overflow-y:auto;height:100vh;height:100dvh}
/* v2.3.20 顶栏抗溢出：文字一律不折行（标题/描述省略号），操作区放不下时整块换到第二行；
   旧规则下「我的线索」等按钮多的页面会把标题挤成两行（1440 宽 @100% 缩放即触发），用户需缩到 90% 才正常 */
.topbar{background:var(--surface);border-bottom:1px solid var(--border);padding:8px 18px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10;flex-shrink:0;flex-wrap:wrap;gap:8px 14px;min-height:61px}   /* min-height：各页顶栏等高，页签/内容不会因某页副标题短而上下漂移 */
.topbar>*{min-width:0}
.topbar h2{margin:0;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.topbar .sub{color:var(--muted);font-size:12px;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.topbar>div:last-child{justify-content:flex-end;flex-wrap:wrap}
/* 顶栏控件与下方工具条同高：原来顶栏按钮 30–33px（emoji 撑行盒）、筛选/搜索框 32px，比下一行 28px 高出一截 */
.topbar .btn, .topbar .tb-ctl, .topbar .gs-wrap{height:28px;padding-top:0;padding-bottom:0;line-height:26px}
.topbar #ta{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.topbar #ta>*{white-space:nowrap;flex:0 0 auto}
.topbar .tb-icons{display:flex;align-items:center;gap:6px;flex:0 0 auto}
/* 顶栏筛选区：输入框（含框内麦克风）+「筛选」按钮同高 32 / 同圆角 8 / 同边框底色。
   麦克风是「同一条输入通道的另一种输入方式」——说一句就填进同一个框、走同一条分组检索，
   所以放进输入框内部（不再是与「筛选」并排的第二颗按钮，那种排法两种输入看起来像两个功能）。 */
.gs-row{position:relative;display:flex;align-items:center;gap:4px}
.gs-wrap{display:inline-flex;align-items:center;gap:2px;height:32px;padding:0 6px 0 12px;
  border:1px solid var(--border);border-radius:8px;background:var(--surface);box-sizing:border-box}
.topbar #gSearch{width:160px;height:26px;padding:0;border:none;outline:none;background:transparent;color:var(--text);font-size:13px}   /* 高度跟着 .gs-wrap 的 28px 走（原来 30px 会顶出输入框） */
.gs-mic{width:24px;height:24px;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  padding:0;border:none;border-radius:6px;background:transparent;color:inherit;cursor:pointer;font-size:13px;line-height:1}
.gs-mic:hover{background:var(--surface-2)}
.gs-mic.rec{background:var(--red-50);box-shadow:inset 0 0 0 1px var(--red)}
.tb-ctl{height:32px;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 10px;
  border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--text);
  font-size:13px;line-height:1;white-space:nowrap;flex:0 0 auto;cursor:pointer;box-sizing:border-box}
.tb-ctl:hover{border-color:var(--primary);color:var(--primary)}
.tb-ctl.rec{border-color:var(--red);color:var(--red)}
/* v2.3.24：全站右侧主内容区边距与首页（工作台 8px 12px）统一，此前其它页面 22px 28px 显得过大 */
.content{padding:8px 12px;max-width:none;width:100%}

/* ---------- 通用组件 ---------- */
.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px}
.card h3{margin:0 0 14px;font-size:14px}
.row{display:flex;gap:16px;flex-wrap:wrap} .grow{flex:1;min-width:0}
.btn{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:var(--radius);border:1px solid var(--border);background:var(--surface);color:var(--text);cursor:pointer;font-weight:500}
.btn:hover{background:var(--surface-2)} .btn:disabled{opacity:.5;cursor:not-allowed}
.btn-primary{background:var(--primary);border-color:var(--primary);color:#fff} .btn-primary:hover{background:var(--primary-600)}
.btn-sm{padding:5px 10px;font-size:13px} .btn-danger{color:var(--red);border-color:var(--red-50)} .btn-danger:hover{background:var(--red-50)}
.toolbar{display:flex;gap:10px;align-items:center;margin-bottom:16px;flex-wrap:wrap}
.toolbar .spacer{flex:1}
/* 工具条一行内控件等高：状态标签（.btn-sm，带 emoji 时行盒被撑到 33px）、筛选下拉、搜索框原来并排 33 / 27 / 28px。
   统一到 28px 并让文字垂直居中，整行不再参差（用户 2026-09-17：我的线索左侧按钮比右侧卡片高）。 */
.toolbar > .btn, .toolbar > select, .toolbar > input{height:28px;padding-top:0;padding-bottom:0;line-height:26px}
.toolbar > .btn{gap:5px}
.toolbar > select{padding-left:8px;padding-right:6px}
.toolbar > input{padding-left:10px;padding-right:10px}
/* 页内页签（区域视角|客户点位|经营指标、经营分析|仪表盘|老板看板 等）：渲染进内容区第一行。
   页面自带工具条 → 并入其首行（与页面筛选按钮并排）；没有 → 插 .mm-tabbar（空工具条）承载。
   两情形同高同位，切页签不跳。 */
.subnav-inline{display:inline-flex;gap:10px;align-items:center}
/* 我的看板工具条：模式/视角/动作 + 页内页签全部挤在一行（用户 2026-09-18 要求）；
   不折行、页签不被压缩，宽度不够时整行横向滚动而不是换行。 */
.wb-oneline{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;gap:5px}
.wb-oneline > .subnav-inline{flex:0 0 auto;white-space:nowrap}
.wb-oneline .btn{white-space:nowrap;flex:0 0 auto;padding-left:8px;padding-right:8px}
.wb-oneline .seg{flex:0 0 auto}
.subnav-inline .btn{border-radius:9px}
/* 页签条右端附加区（合同页的「合同/保密协议（NDA）」等）：与左侧页签同一行、不参与压缩 */
.subnav-right{display:inline-flex;gap:10px;align-items:center;flex:0 0 auto;margin-left:auto}
.subnav-right .btn{border-radius:9px}
.subnav-sep{width:1px;height:18px;background:var(--border);margin:0 2px;flex:0 0 auto}
/* 宽屏下限制标题/副标题占宽：避免副标题过长把顶栏挤成两行 —— 顶栏一换行，页签与内容整体下移，看起来就是"点标签跳来跳去"。
   副标题超出部分省略，完整文案保留在 title 提示里（见 setSub）。 */
@media (min-width:901px){ .topbar>div:first-child{max-width:min(46vw,620px)} }

/* ---------- v2.3.21 报表中心（我的报表）：角色报表首页 / 全部报表 / 报表详情 / 要素自定义 ---------- */
.rpt-bar{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.rpt-bar-l{display:flex;align-items:center;gap:10px;min-width:0}
.rpt-bar-r{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.rpt-home{display:grid;grid-template-columns:repeat(12,1fr);gap:12px;align-content:start;grid-auto-flow:dense}
.rpt-blk{background:var(--surface);border:1px solid var(--border);border-radius:12px;box-shadow:var(--shadow);padding:11px 13px;min-width:0}
.rpt-blk.kpi{grid-column:span 3;min-height:84px;display:flex;flex-direction:column;justify-content:center}
/* 多指标卡（stats）：一卡 5–6 个「标签 · 值 · 副标」，对标工作台首页概览卡的信息密度 */
.rpt-blk.stats{grid-column:span 6;min-height:132px}
.rpt-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:9px 14px;margin-top:2px}
.rpt-metric{min-width:0;border-left:2px solid var(--border);padding-left:8px}
.rpt-m-lb{font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rpt-m-v{font-size:17px;font-weight:700;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rpt-m-v small{font-size:11px;font-weight:600;margin-left:2px}
.rpt-m-sub{font-size:10.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
@media (max-width:1500px){ .rpt-metrics{grid-template-columns:repeat(2,1fr)} }
.rpt-blk.chart{grid-column:span 4;min-height:168px}
.rpt-blk.list{grid-column:span 4;min-height:168px}
.rpt-blk.note{grid-column:span 12;display:flex;gap:8px;align-items:flex-start;font-size:13px;background:var(--surface-2)}
.rpt-lb{font-size:12px;color:var(--muted);font-weight:600}
.rpt-kv{font-size:22px;font-weight:700;line-height:1.25;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rpt-kv small{font-size:12px;font-weight:600;margin-left:3px}
.rpt-sub{font-size:11px;color:var(--muted);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rpt-hd{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:6px}
.rpt-ec{height:132px;width:100%}
.rpt-bar-row{display:flex;align-items:center;gap:8px;margin-bottom:5px;font-size:11.5px}
.rpt-bar-row .n{flex:0 0 78px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rpt-bar-row .t{flex:1;height:8px;background:var(--surface-2);border-radius:4px;overflow:hidden}
.rpt-bar-row .t i{display:block;height:100%;border-radius:4px}
.rpt-bar-row .v{flex:0 0 96px;text-align:right;color:var(--muted)}
.rpt-tbl{width:100%;border-collapse:collapse;font-size:12px}
.rpt-tbl th{text-align:left;color:var(--muted);font-weight:500;padding:2px 4px;border-bottom:1px solid var(--border)}
.rpt-tbl td{padding:3px 4px;border-bottom:1px dashed var(--border);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:170px}
.rpt-empty{color:var(--muted);font-size:12px;padding:18px 0;text-align:center}
.rpt-hint{font-size:11px;color:var(--muted);margin-top:6px}
.rpt-note-ic{font-size:14px;line-height:1.2}
.rpt-domain{margin-bottom:18px}
.rpt-domain-h{font-size:13px;font-weight:700;margin:0 0 8px;padding-left:8px;border-left:3px solid var(--primary)}
.rpt-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(258px,1fr));gap:10px}
.rpt-card{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:11px 13px;cursor:pointer;transition:box-shadow .15s,transform .15s}
.rpt-card:hover{box-shadow:var(--shadow);transform:translateY(-1px);border-color:var(--primary)}
.rpt-card-h{display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:13.5px}
.rpt-card-go{font-size:11px;color:var(--primary)}
.rpt-card-d{font-size:11.5px;color:var(--muted);margin-top:4px;min-height:15px}
.rpt-card-k{font-size:12px;margin-top:6px;background:var(--surface-2);border-radius:6px;padding:4px 7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rpt-pick{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.rpt-pick-col{min-width:0}
.rpt-pick-cap{font-size:12px;color:var(--muted);margin-bottom:6px}
.rpt-pick-body{max-height:min(52vh,460px);overflow:auto;border:1px solid var(--border);border-radius:9px;padding:6px}
.rpt-pick-grp{font-size:11px;color:var(--muted);font-weight:700;margin:6px 4px 3px}
.rpt-pick-row{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:4px 5px;border-radius:7px;font-size:12.5px}
.rpt-pick-row:hover{background:var(--surface-2)}
.rpt-pick-row .t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rpt-tag{font-size:10px;color:var(--primary);background:var(--primary-50);border-radius:5px;padding:0 5px}
.btn-xs{padding:1px 6px;font-size:11px;border-radius:6px}
@media (max-width:1500px){ .rpt-blk.kpi{grid-column:span 4} .rpt-blk.chart,.rpt-blk.list{grid-column:span 6} }
@media (max-width:1100px){ .rpt-blk.kpi{grid-column:span 6} .rpt-blk.chart,.rpt-blk.list{grid-column:span 12} .rpt-pick{grid-template-columns:1fr} }
.badge{display:inline-block;padding:2px 9px;border-radius:var(--radius-lg);font-size:12px;font-weight:600;line-height:1.6;white-space:nowrap}
.b-grade-V{background:var(--accent-50);color:var(--accent)} .b-grade-A{background:var(--primary-50);color:var(--primary)}
.b-grade-B{background:var(--surface-2);color:var(--muted)} .b-grade-C{background:var(--border);color:var(--muted)}
.b-open{background:var(--primary-50);color:var(--primary)} .b-won{background:var(--green-50);color:var(--green)} .b-lost{background:var(--red-50);color:var(--red)}
.b-new{background:var(--amber-50);color:var(--amber)} .b-assigned{background:var(--primary-50);color:var(--primary)}
.b-converted{background:var(--green-50);color:var(--green)} .b-abandoned{background:var(--border);color:var(--muted)} .b-pooled{background:var(--accent-50);color:var(--accent)}
/* v1.5.2 UI 审计补齐：缺失的徽章色（amber/red/warn），与现有徽章风格一致 */
.b-amber{background:var(--amber-50);color:var(--amber)} .b-warn{background:var(--amber-50);color:var(--amber)} .b-red{background:var(--red-50);color:var(--red)}

table{width:100%;border-collapse:collapse} th,td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--border);vertical-align:middle}
th{font-size:12px;color:var(--muted);font-weight:600;background:var(--surface-2);white-space:nowrap} tbody tr:hover{background:var(--surface-2)}
td{word-break:break-word}
.t-compact th,.t-compact td{padding:3px 8px;font-size:12.5px}
.t-compact .btn-sm{padding:1px 8px;font-size:11.5px}
.table-wrap{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow-x:auto;box-shadow:var(--shadow)}
.muted{color:var(--muted)} .nowrap{white-space:nowrap} .right{text-align:right}

/* KPI */
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px;margin-bottom:18px}
.kpi{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px}
.kpi .label{font-size:12px;color:var(--muted)} .kpi .val{font-size:26px;font-weight:700;margin-top:6px} .kpi .val small{font-size:13px;color:var(--muted);font-weight:500}

/* 漏斗 */
.funnel{display:flex;flex-direction:column;gap:8px}
.funnel-row{display:flex;align-items:center;gap:12px}
.funnel-row .name{width:130px;font-size:13px;flex-shrink:0} .funnel-row .name .s{color:var(--muted);font-size:11px}
.funnel-row .bar-wrap{flex:1;background:var(--surface-2);border-radius:var(--radius-sm);overflow:hidden;height:26px;position:relative}
.funnel-row .bar{height:100%;background:linear-gradient(90deg,var(--primary),var(--primary));border-radius:var(--radius-sm);min-width:2px}
.funnel-row .meta{width:150px;text-align:right;font-size:12px;color:var(--muted);flex-shrink:0}
/* 仪表盘「管道漏斗 + 分级/来源分布」同行三卡：
   >1150px 三卡同行（漏斗列更宽，列内收紧名称/数值列给进度条留宽度）；
   ≤1150px 漏斗独占一行、两个分布两列，与原布局一致，避免 2+1 参差换行 */
.row > .card.dash-funnel{flex:1.2 1 320px}
@media(min-width:1151px){ .row > .card.dash-funnel .funnel-row .name{width:104px} .row > .card.dash-funnel .funnel-row .meta{width:118px} }
@media(max-width:1150px){ .row > .card.dash-funnel{flex:1 1 100%} }

/* 分布条 */
.dist .d-row{display:flex;align-items:center;gap:10px;margin-bottom:9px} .dist .d-row .dl{width:84px;font-size:13px}
.dist .d-bar{flex:1;height:10px;background:var(--surface-2);border-radius:var(--radius-sm);overflow:hidden}
.dist .d-bar span{display:block;height:100%;background:var(--accent);border-radius:var(--radius-sm)} .dist .d-row .dv{width:34px;text-align:right;color:var(--muted);font-size:12px}

/* 看板 */
/* 商机页头一行：视图切换 ｜ 销售流程 ｜ 阶段页签 ｜ 健康度图例（2026-09-17 用户要求：原来四行堆叠合并为一行；
   窄屏放不下时整块折行，分隔线随行分组） */
.opp-head-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:-4px 0 10px}
.opp-head-row .oh-sep{width:1px;height:18px;background:var(--border);flex:none;margin:0 2px}
.opp-head-row .oh-spacer{flex:1 1 auto;min-width:8px}
.opp-head-row .btn-sm{padding:3px 9px;font-size:12px}   /* 头行里按钮压到与页签同高，一行装得下 */
.kanban{display:flex;gap:8px;overflow-x:auto;padding-bottom:8px;align-items:stretch}
.kanban-col{flex:1 1 0;min-width:150px;background:var(--surface-2);border-radius:10px;padding:6px;display:flex;flex-direction:column;max-height:calc(100vh - 220px)}
.kanban-col .col-head{display:flex;justify-content:space-between;align-items:center;gap:6px;background:var(--act,var(--surface));border-radius:8px;padding:5px 8px;font-size:12px;font-weight:600;color:var(--acd,inherit)}
.kanban-col .col-head .hd{display:flex;align-items:center;gap:6px;min-width:0;white-space:nowrap}
.kanban-col .col-head .dot{width:8px;height:8px;border-radius:50%;background:var(--ac,#cfd6e0);flex:none}
.kanban-col .col-head .cnt{background:var(--surface);border-radius:999px;padding:0 7px;font-size:10.5px;font-weight:600;color:var(--acd,var(--muted));flex:none}
.kanban-col .win{font-size:10.5px;color:var(--muted);font-weight:500;padding:5px 4px 0}
.kanban-col .kanban-list{flex:1;overflow-y:auto;min-height:40px;padding:6px 2px 2px}
.opp-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:9px;margin-bottom:7px;cursor:pointer;box-shadow:var(--shadow);transition:border-color .15s}
.opp-card:hover{border-color:var(--primary)} .opp-card .t{font-weight:600;font-size:12.5px;margin-bottom:4px}
.opp-card .amt{color:var(--primary);font-weight:700;font-size:13px} .opp-card .meta{display:flex;justify-content:space-between;align-items:center;margin-top:5px;font-size:10.5px;color:var(--muted)}
/* 单阶段卡片网格(阶段筛选时使用) */
.opp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px}
.opp-grid .opp-card{margin-bottom:0}
.modal.wide{max-width:1100px}
/* ---------- 商机详情（2026-09-16 对齐纷享销客：中栏＝流程/该阶段任务/信息条/页签，右栏＝相关团队/动态） ---------- */
.opp-detail-grid{display:grid;grid-template-columns:minmax(0,1fr) 336px;gap:12px;align-items:start}
.opp-detail-main,.opp-detail-rail{display:flex;flex-direction:column;gap:12px;min-width:0}
.opp-panel{background:var(--surface);border-radius:var(--radius);padding:12px 14px;box-shadow:var(--shadow)}
.opp-panel-hd{display:flex;align-items:center;gap:8px;margin-bottom:9px}
.opp-panel-hd .ttl{font-size:13.5px;font-weight:600}
.opp-panel-hd .sp{flex:1}
.opp-block{border-top:1px solid var(--border);margin-top:10px;padding-top:10px}
.opp-flow-card .stage-track{border:none;background:none;border-radius:0;padding:0;margin:0;overflow:visible}
.opp-guide{background:var(--primary-50);border-left:3px solid var(--primary);border-radius:0 var(--radius-sm) var(--radius-sm) 0;padding:8px 10px}
/* 卡片收起/展开箭头（线上流程卡与阶段任务卡右上角各一个） */
.opp-fold{border:none;background:none;cursor:pointer;color:var(--muted);font-size:13px;line-height:1;padding:2px 6px;border-radius:4px}
.opp-fold:hover{background:var(--surface-2,#f1f5f9);color:var(--primary)}
.opp-info-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 24px}
.opp-info-it{display:flex;gap:8px;min-width:0;font-size:13px;line-height:18px}
.opp-info-it .k{flex:0 0 112px;color:var(--muted)}
.opp-info-it .v{flex:1;min-width:0;word-break:break-word}
.opp-rail-add{width:24px;height:24px;line-height:1;font-size:15px;border:1px dashed var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--muted);cursor:pointer}
.opp-rail-add:hover{border-color:var(--primary);color:var(--primary);background:var(--primary-50)}
.opp-team{display:flex;flex-wrap:wrap;gap:8px}
.opp-team-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 9px 4px 4px;border:1px solid var(--border);border-radius:var(--radius-full);font-size:12.5px;background:var(--surface);cursor:pointer}
.opp-team-chip:hover{border-color:var(--primary);background:var(--primary-50)}
.opp-team-chip .ava{width:22px;height:22px;border-radius:50%;background:var(--primary-50);color:var(--primary);display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:700}
.opp-team-chip .rl{font-size:10.5px;color:var(--muted)}
.opp-rail-empty{font-size:12px;margin:0}
/* ---------- 右栏「动态」面板（2026-09-17 对照纷享销客线上实页逐元素复刻） ----------
   线上量到（344 卡片/内 320）：标题行＝4×16 橙条 + 15px/700 标题 + 13px 问号；
   发布框＝1px 边框 + 圆角 8 + 内边距 17/16 + 13px 灰字；筛选行高 28、右端两个 28×28 图标钮；
   动态项＝40 圆头像 + 14px 链接色姓名 + 12px 部门 + 12px 灰「时间 - 范围」+ 右上角 12px 记录类型；
   正文＝短内容「标签 90px + 值」/ 长内容「标签在上、正文在下」；附件卡＝CRM(n) 标题 + 对象行；
   底栏＝左「修改记录」右动作（12px 灰、行高 22）；列表尾「没有更多了」。
   字号取本系统既有档位（值 13px / 标签与元信息 12px），比线上（14px）小一档，与本页其它卡片同高。 */
.opp-feed-hd{display:flex;align-items:center;gap:6px;margin:0 0 10px}
.opp-feed-hd-bar{flex:0 0 4px;width:4px;height:16px;border-radius:2px;background:var(--accent)}
.opp-feed-hd-ttl{font-size:15px;font-weight:700;line-height:1.5;color:var(--text)}
.opp-feed-hd-help{flex:0 0 13px;width:13px;height:13px;border:1px solid var(--border);border-radius:50%;color:var(--muted);font-size:10px;line-height:11px;text-align:center;cursor:help}
.opp-feed-pub{border:none;border-radius:0;background:transparent;margin:0 0 8px}
.opp-feed-pub-mini{display:flex;align-items:center;gap:8px;padding:4px 0 10px}
/* [hidden] 会被上面那条 display:flex 压掉（UA 的 [hidden]{display:none} 优先级更低）——
   展开态必须真的收起「发布跟进详情」那一行，否则表单上方残留一条。 */
.opp-feed-pub-mini[hidden],.opp-feed-cmp[hidden],.opp-feed-find[hidden],.opp-feed-hist[hidden]{display:none}
.opp-feed-pub-btn{display:inline-flex;align-items:center;gap:4px;flex:1;min-width:0;border:none;background:none;padding:0;font-size:14px;color:#91959e;cursor:pointer;text-align:left}
.opp-feed-pub-mini:hover .opp-feed-pub-btn{color:var(--primary)}
.opp-feed-pub-btn svg{width:13px;height:13px;flex:0 0 13px}
.opp-feed-cmp-x{border:none;background:none;padding:2px 4px;border-radius:4px;color:var(--muted);font-size:13px;line-height:1;cursor:pointer}
.opp-feed-cmp-x:hover{background:var(--surface-2);color:var(--red)}
.opp-feed-bar{display:flex;align-items:center;gap:2px;height:28px;margin-bottom:10px}
.opp-feed-bar .sp{flex:1}
.opp-feed-all{display:inline-flex;align-items:center;gap:2px;border:none;background:none;padding:0;font-size:13px;color:var(--text);cursor:pointer}
.opp-feed-all:hover{color:var(--primary)}
.opp-feed-all .arw{font-size:10px;color:var(--muted)}
.opp-feed-ic{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:0;background:transparent;color:var(--muted);cursor:pointer}
.opp-feed-ic:hover{color:var(--primary)}
.opp-feed-ic.on{background:transparent;color:var(--primary)}
.opp-feed-ic.on{background:transparent;color:var(--primary)}
.opp-feed-ic svg{width:15px;height:15px}
.opp-feed-find{padding:0 0 10px}
.opp-feed-find input{width:100%;padding:5px 8px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);font-size:13px}
.opp-feed-it{padding:12px 0;border-bottom:1px solid var(--border)}
.opp-feed-it:last-child{border-bottom:none;padding-bottom:4px}
.opp-feed-it-hd{position:relative;display:flex;gap:8px;margin-bottom:8px}
.opp-feed-ava{display:inline-flex;align-items:center;justify-content:center;flex:0 0 40px;width:40px;height:40px;border-radius:50%;background:var(--primary-50);color:var(--primary);font-size:15px;font-weight:700;overflow:hidden}
.opp-feed-who{flex:1;min-width:0;padding-right:92px}
.opp-feed-nm{font-size:13px;font-weight:600;color:var(--primary)}
.opp-feed-dp{margin-left:6px;font-size:12px;color:var(--muted)}
.opp-feed-meta{margin-top:2px;font-size:12px;color:var(--muted)}
.opp-feed-kind{position:absolute;right:0;top:2px;max-width:92px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--muted)}
.opp-feed-bd{font-size:13px}
.opp-feed-r{display:flex;gap:8px;padding:4px 0;min-width:0}
.opp-feed-r .k{flex:0 0 90px;font-size:12px;line-height:19px;color:var(--muted);word-break:break-word}
.opp-feed-r .v{flex:1;min-width:0;font-size:13px;line-height:19px;color:var(--text);white-space:pre-wrap;word-break:break-word}
.opp-feed-r.long{display:block}
.opp-feed-r.long .k{display:block;margin-bottom:2px}
/* 长内容右侧「复制」（线上：沟通内容/客户方参与者 行尾一个「复制」） */
.opp-feed-r .opp-feed-cp{position:absolute;right:0;top:4px;border:1px solid var(--border);border-radius:4px;background:var(--surface);padding:1px 6px;font-size:11px;color:var(--muted);cursor:pointer}
.opp-feed-r .opp-feed-cp:hover{border-color:var(--accent);color:var(--accent)}
.opp-feed-r.long.copy{position:relative;padding-right:44px}
/* 帖子「相关附件」＝线上附件卡：标题「附件:N个」+ 逐行 文件名（大小）+ 下载 */
.opp-feed-att{margin-top:2px;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}
.opp-feed-att-hd{display:flex;align-items:center;gap:6px;padding:5px 8px;background:var(--surface-2);font-size:12px;color:var(--text)}
.opp-feed-att-hd svg{width:13px;height:13px;color:var(--muted)}
.opp-feed-att-row{display:flex;align-items:center;gap:6px;padding:6px 8px;border-top:1px solid var(--border);font-size:12.5px}
.opp-feed-att-row .ft{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;flex:0 0 16px;border-radius:3px;background:var(--accent);color:#fff;font-size:9px;font-style:normal}
.opp-feed-att-row .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.opp-feed-att-row a{color:var(--primary);text-decoration:none;cursor:pointer}
.opp-feed-att-row a:hover{text-decoration:underline}
.opp-feed-it.fold .opp-feed-r.long .v{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.opp-feed-it.fold .opp-feed-r.extra{display:none}
.opp-feed-fold{display:inline-flex;align-items:center;gap:2px;margin-top:6px;border:none;background:none;padding:0;font-size:12.5px;color:var(--primary);cursor:pointer}
.opp-feed-fold .arw{font-size:10px}
.opp-feed-rel{margin-top:8px;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}
.opp-feed-rel-hd{display:flex;align-items:center;gap:6px;height:34px;padding:0 10px;background:var(--surface-2);font-size:12.5px;color:var(--text)}
.opp-feed-rel-hd svg{width:14px;height:14px;color:var(--muted)}
.opp-feed-rel-row{display:flex;align-items:center;gap:8px;height:34px;padding:0 10px;border-top:1px solid var(--border);font-size:12.5px}
.opp-feed-rel-row .k{flex:0 0 76px;color:var(--muted)}
.opp-feed-rel-row .v{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.opp-feed-rel-row a{color:var(--primary);cursor:pointer;text-decoration:none}
.opp-feed-rel-row a:hover{text-decoration:underline}
.opp-feed-ft{display:flex;align-items:center;gap:8px;min-height:22px;margin-top:8px}
.opp-feed-ft .sp{flex:1}
.opp-feed-act{display:inline-flex;align-items:center;gap:2px;border:none;background:none;padding:0;font-size:12px;line-height:22px;color:var(--muted);white-space:nowrap;cursor:pointer}
.opp-feed-act:hover{color:var(--primary)}
.opp-feed-act svg{width:14px;height:14px}
.opp-feed-hist{margin-top:8px;padding-top:8px;border-top:1px dashed var(--border)}
.opp-feed-hist-hd{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:6px}
.opp-feed-hist-hd .t{font-size:12.5px;font-weight:600}
.opp-feed-hist-note{padding:2px 6px;border-radius:var(--radius-sm);background:var(--surface-2);font-size:11px;color:var(--muted)}
.opp-feed-hist-row{display:flex;gap:8px;padding:5px 0}
.opp-feed-hist-at{flex:0 0 78px;font-size:11.5px;line-height:17px;color:var(--muted);font-variant-numeric:tabular-nums}
.opp-feed-hist-line{flex:0 0 1px;background:var(--border)}
.opp-feed-hist-bd{flex:1;min-width:0;font-size:12.5px;line-height:17px;word-break:break-word}
.opp-feed-hist-bd .sys{color:var(--muted)}
.opp-feed-end{padding:10px 0 2px;text-align:center;font-size:12px;color:var(--muted)}
.opp-feed-empty{font-size:12px;margin:0}
/* ---------- 发布框展开态＝线上整表单（2026-09-17 照纷享「发布跟进详情」实测量到的**尺寸**逐项对齐）----------
   线上量到（getBoundingClientRect，逐字段）：面板内容宽 310；标题行 21；页签行 40 + 下距 15；
   分节标题 16px/16（高 16）+ 下距 8；**每个字段＝标签 12px/行高18 + 4px + 控件**，
   控件高：单行 32 / 长文本 82（右下角 0/2000 计数）/ 富文本 244 / 关联业务数据 71；
   **字段之间 16px**；页脚＝上距 16、三钮高 32 / 圆角 6 / 字号 14 / 间距 8、**右对齐**到内容右缘。 */
/* 展开态（.opp-feed-pub.open）＝线上同形：**外框消失**（线上 .d-salelog_publish.open 的 border 实测 0），
   表单直接落在动态卡片里；收起态才保留 1px 边框那个「发布跟进详情」输入位。 */
.opp-feed-pub.open{border:none;border-radius:0}
.opp-feed-pub.open .opp-feed-cmp{padding:0}
.opp-feed-cmp-hd{display:flex;align-items:center;gap:6px;height:21px;margin:0}
.opp-feed-cmp-hd>span:first-child{font-size:14px;line-height:21px;font-weight:500}
.opp-feed-cmp-tabs{display:flex;height:40px;margin:0 0 15px;border-bottom:1px solid var(--border)}
.opp-feed-cmp-tabs button{height:40px;box-sizing:border-box;padding:0 16px 0 8px;border:none;background:none;border-bottom:2px solid transparent;font-size:14px;color:var(--muted);cursor:pointer}
.opp-feed-cmp-tabs button.on{color:var(--accent);font-weight:700;border-bottom-color:var(--accent)}
.opp-feed-cmp-sec{margin:0 0 8px;font-size:16px;line-height:16px;font-weight:700;color:var(--text)}
.opp-feed-fld{margin:0 0 16px}
.opp-feed-fld>label{display:block;margin:0 0 4px;font-size:12px;line-height:18px;color:var(--text)}
.opp-feed-fld .req{font-style:normal;margin-right:2px;color:var(--red)}
.opp-feed-fld .ctl{display:block}
.opp-feed-fld input,.opp-feed-fld select,.opp-feed-fld textarea{width:100%;box-sizing:border-box;padding:0 8px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);font-size:13px;font-family:inherit}
.opp-feed-fld input,.opp-feed-fld select{height:32px}
.opp-feed-fld textarea{display:block;min-height:82px;padding:6px 8px 20px;line-height:1.6;resize:vertical}
.opp-feed-fld textarea.opp-feed-cmp-editor{min-height:244px;padding:10px}
.opp-feed-fld input.ro{background:var(--surface-2);color:var(--text)}
/* 多人字段（参与沟通顾问/抄送范围）：线上 employee 型控件＝32 高边框盒，标签行内换行 */
.opp-feed-fld [data-umulti="1"]{min-height:32px;max-height:32px;box-sizing:border-box;padding:2px 6px;border:1px solid var(--border);border-radius:var(--radius-sm);align-items:center;overflow:hidden}
.opp-feed-fld [data-umulti="1"] .badge{font-size:11px;line-height:1.4;padding:1px 7px}
.opp-feed-fld .um-add{width:auto !important;min-width:104px;height:24px !important;font-size:12px}
.opp-feed-add{display:flex;align-items:center;height:32px;border:none;background:none;padding:0;font-size:12px;color:var(--accent);cursor:pointer}
.opp-feed-add:hover{text-decoration:underline}
.opp-feed-files{display:flex;flex-direction:column;gap:4px;margin-top:6px}
.opp-feed-files:empty{display:none}
.opp-feed-file{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
.opp-feed-file b{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;color:var(--text)}
.opp-feed-file .x{cursor:pointer;font-weight:400}
.opp-feed-cnt-wrap{position:relative;display:block}
.opp-feed-cnt-wrap textarea{padding-bottom:20px}
.opp-feed-cnt{position:absolute;right:8px;bottom:4px;font-size:11px;color:var(--muted)}
/* 「关联业务数据」格＝线上实测的那一圈框：`.xv_async_cmpt_rcoi` 1px 边框 / 圆角 8 / 内边距 `1px 28px 1px 1px`
   （右侧 28px 留给「＋」列）。框内两行：上行＝已关联的业务数据标签（26 高 / 1px 边框 / 圆角 4 / 浅灰底，
   `[客户]` 灰 + 名称深色），下行＝「搜索」输入（无边框，**搜的是框里已关联的数据**）。
   「＋」是框右侧一条 32px 宽的竖条（无边框），**只有点它才弹选择窗口**。 */
.opp-feed-rel-box{position:relative;min-height:71px;padding:1px 30px 1px 1px;border:1px solid var(--border);border-radius:var(--radius-sm);box-sizing:border-box;cursor:default}
.opp-feed-rel-pick{display:flex;flex-wrap:wrap;gap:4px;align-items:center;min-height:29px;padding:1px 2px}
.opp-feed-rel-pick .tag{display:inline-flex;align-items:center;height:26px;padding:0 8px;border:1px solid var(--border);border-radius:4px;background:var(--surface-2);font-size:12px;color:var(--text)}
.opp-feed-rel-pick .tag i{font-style:normal;color:var(--muted)}
.opp-feed-rel-pick .tag.empty{border:none;background:none;color:var(--muted);padding:0 4px}
.opp-feed-rel-add{position:absolute;top:1px;right:1px;bottom:1px;width:28px;padding:0;border:none;background:none;color:var(--muted);font-size:16px;line-height:1;cursor:pointer}
.opp-feed-rel-add:hover{color:var(--accent)}
/* 框内第二行「搜索」（无边框；点它＝框变橙边 + 框下弹「最近跟进」面板，输入过滤框里已关联的数据） */
.opp-feed-rel-find{margin:0}
.opp-feed-rel-find input{height:29px;padding:0 5px;border:none;background:none;font-size:12px}
.opp-feed-rel-find input:focus{outline:none}
.opp-feed-rel-find input::placeholder{color:var(--muted)}
.opp-feed-rel-box.focus{border-color:var(--accent)}
.opp-feed-rel-panel{position:absolute;left:0;right:0;top:100%;z-index:30;min-height:120px;max-height:200px;overflow:auto;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:0 8px 24px rgba(16,24,40,.14)}
.opp-feed-rel-panel-hd{padding:5px 10px;background:var(--surface-2);font-size:12px;color:var(--muted)}
.opp-feed-rel-panel-row{padding:8px 10px;border-bottom:1px solid var(--border);font-size:13px;color:var(--text);cursor:pointer}
.opp-feed-rel-panel-row:last-child{border-bottom:none}
.opp-feed-rel-panel-row:hover{background:var(--surface-2)}
.opp-feed-rel-panel-row i{font-style:normal;color:var(--muted)}
.opp-feed-rel-panel-empty{padding:10px;font-size:12px;color:var(--muted)}
/* 人员控件（参与沟通顾问/抄送范围）：线上 employee/cc 型＝32 高边框盒，未选显示橙色「+ 请选择」 */
.opp-feed-pick{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-height:32px;max-height:32px;box-sizing:border-box;padding:2px 6px;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;overflow:hidden}
.opp-feed-pick:hover{border-color:var(--primary)}
.opp-feed-pick .badge{font-size:11px;line-height:1.4;padding:1px 7px}
.opp-feed-pick .ph{font-size:12px;color:var(--accent)}
/* 人员选择器（线上点「+ 请选择」弹出的那个）：搜索 + 按组织架构查看 + 勾选名单 + 已选 N */
.opp-mem-bar{display:flex;gap:8px;margin-bottom:8px}
.opp-mem-bar .input{flex:1}
.opp-mem-list{max-height:340px;overflow:auto;border:1px solid var(--border);border-radius:var(--radius-sm)}
.opp-mem-grp{padding:4px 10px;background:var(--surface-2);font-size:12px;color:var(--muted)}
.opp-mem-row{display:flex;align-items:center;gap:8px;padding:6px 10px;border-bottom:1px solid var(--border);font-size:13px;font-weight:400;cursor:pointer}
.opp-mem-row:last-child{border-bottom:none}
.opp-mem-row:hover{background:var(--surface-2)}
.opp-mem-row .ava{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:var(--primary-50);color:var(--primary);font-size:11px;font-weight:700;font-style:normal}
.opp-mem-row .dp{margin-left:auto;font-size:11.5px;color:var(--muted)}
.modal-foot #oppMemN{margin-right:auto}
/* 「关联业务数据」格内第二行「搜索」（线上同形：无边框幽灵输入，点它/回车打开选择窗口并把关键词带过去） */
.opp-feed-rel-find{margin-top:7px}
.opp-feed-rel-find input{height:32px;padding:0 5px;border:none;background:none;font-size:12px}
.opp-feed-rel-find input:focus{outline:none}
.opp-feed-rel-find input::placeholder{color:var(--muted)}
/* 「关联业务数据」窗口（线上：左对象清单 + 右可筛列表 + 底部 确定/取消） */
.opp-rel-pick{display:grid;grid-template-columns:150px minmax(0,1fr);gap:12px;min-height:320px}
.opp-rel-objs{display:flex;flex-direction:column;gap:2px;border-right:1px solid var(--border);padding-right:10px;max-height:420px;overflow:auto}
.opp-rel-objs button{display:flex;align-items:center;gap:6px;padding:7px 10px;border:none;border-radius:var(--radius-sm);background:none;font-size:13px;color:var(--text);text-align:left;cursor:pointer}
.opp-rel-objs button:hover{background:var(--surface-2)}
.opp-rel-objs button.on{background:var(--primary-50);color:var(--primary);font-weight:600}
.opp-rel-objs .dot{width:6px;height:6px;border-radius:50%;background:var(--accent);margin-left:auto}
.opp-rel-main{min-width:0}
.opp-feed-cmp-ft{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:14px 0 0}
.opp-feed-cmp-ft .btn,.opp-feed-btn-pub{height:32px;box-sizing:border-box;padding:0 16px;border-radius:6px;font-size:14px;line-height:30px;border:1px solid rgb(193,197,206);background:#fff;color:rgb(24,28,37)}
.opp-feed-btn-pub{border:1px solid var(--accent);background:var(--accent);color:#fff;cursor:pointer}
.opp-feed-btn-pub:hover{filter:brightness(.95)}
.opp-feed-btn-pub:disabled{opacity:.6;cursor:not-allowed}
/* 草稿区（仅本人草稿；草稿不算跟进记录，不进时间线） */
.opp-feed-drafts{margin:0 0 10px;padding:8px 10px;border:1px dashed var(--border);border-radius:var(--radius-sm)}
.opp-feed-drafts .hd{margin-bottom:4px;font-size:12px;color:var(--muted)}
.opp-feed-draft{display:flex;align-items:center;gap:6px;padding:3px 0}
.opp-feed-draft .tx{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px}
.opp-detail-tabs{display:flex;gap:0;border-bottom:1px solid var(--border);margin-bottom:10px;flex-wrap:wrap}
.opp-detail-tabs button{padding:7px 12px;border:none;background:none;font-size:13px;line-height:18px;color:var(--muted);cursor:pointer;border-bottom:2px solid transparent}
.opp-detail-tabs button.on{color:var(--primary);border-bottom-color:var(--primary);font-weight:600}
.opp-detail-tabs button:hover{color:var(--primary)}
/* 商机详情 9 个页签的相关列表：字号/行高照线上（th 13px/700、td 13px、行高 ~36px） */
.opp-rel-table table th{padding:6px 10px;font-size:13px;line-height:19px;font-weight:700;color:var(--muted);white-space:nowrap}
/* 单元格单行 + 超长省略（线上表格同形；整表横向滚动）——避免长文本把行撑成多行、列被挤到只剩表头宽 */
.opp-rel-table table td{padding:7px 10px;font-size:13px;line-height:19px;color:var(--text);white-space:nowrap;max-width:300px;overflow:hidden;text-overflow:ellipsis}
/* 线索列表（我的线索／全量线索的 23 列宽表，2026-09-19 用户：一条要一行、不要一条分两行）
   单元格单行 + 超长省略 + 整表横向滚动（与商机关系表同形）：公司名/需求内容这类长文本不再把行撑成 2~4 行；
   被截断的值挂 title（bindLeadRowClicks 里加），点行进详情弹窗看全文。 */
.table-wrap.lead-tb table{table-layout:auto;width:max-content;min-width:100%}
/* 2026-09-21 纷享列表列对齐：合同台账 32 列 / 项目交付 24 列 —— 与线索表同口径：
   一律不换行（一行一条记录）、超长省略、表格自身横向滚动；表头也不换行。 */
.table-wrap.fx-tb table{table-layout:auto;width:max-content;min-width:100%}
.table-wrap.fx-tb th{white-space:nowrap}
.table-wrap.fx-tb td{white-space:nowrap;max-width:260px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}
.table-wrap.fx-tb .ct-chain{max-width:220px;overflow:hidden;text-overflow:ellipsis}
.table-wrap.lead-tb td{white-space:nowrap;max-width:300px;overflow:hidden;text-overflow:ellipsis;padding-top:6px;padding-bottom:6px}
.table-wrap.lead-tb td:first-child{max-width:320px}
/* 2026-09-21 列表对齐纷享「销售线索」：复选列 / 表头每列筛选图标（悬浮显形）/ 行内「标记为…」/ 负责人头像 */
.table-wrap.lead-tb th .fx-th-f{opacity:0;transition:opacity .12s}
.table-wrap.lead-tb th:hover .fx-th-f{opacity:1}
/* 表头「筛选/冻结」图标：平时隐藏，悬浮该列才显形；已冻结的列 🔒 常驻（2026-09-21 对齐线上） */
.table-wrap.lead-tb th .fx-th-lock{opacity:0;transition:opacity .12s}
.table-wrap.lead-tb th:hover .fx-th-lock{opacity:1}
.table-wrap.lead-tb th .fx-th-lock.on{opacity:1}
.table-wrap.lead-tb td.fx-sel,.table-wrap.lead-tb th.fx-sel{width:28px;max-width:28px;padding-left:6px;padding-right:2px}
.fx-owner{display:inline-flex;align-items:center;gap:6px}
.fx-av{width:20px;height:20px;border-radius:50%;background:var(--surface-2);color:var(--muted);display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;flex:0 0 20px}
/* 操作列＝真·表格单元（2026-09-21 报障修复）：原先 td.fx-op 设 display:flex，td 就不再是 table-cell，
   单元格不随行高拉伸（实测行 35.8px、操作格只有 13px），冻结列（fx-lock-r）的背景与左边框只盖住内容高度，
   横向滚动时被滚走的数据从缺口里透出来 —— 看着就是「操作列卡在行中间、和旁边列叠在一起」。
   改回表格单元：单元格满行高、冻结列整格不透明覆盖；列内链接间距用相邻兄弟外边距（不依赖 flex gap）。 */
.table-wrap.lead-tb td.fx-op{white-space:nowrap;text-align:left}
a.fx-op-mark{color:var(--brand);font-size:12px;text-decoration:none;white-space:nowrap}
a.fx-op-mark+a.fx-op-mark{margin-left:10px}
a.fx-op-mark.on{color:var(--muted);font-weight:600}
/* 行悬浮/选中态画在单元格上：tbody td 是不透明底色（冻结列必须遮住滚过去的内容），
   画在 tr 上会被单元格整片盖住、悬浮与选中都看不见。 */
.table-wrap.lead-tb tbody tr:hover td{background:var(--surface-2)}
.table-wrap.lead-tb tbody tr.sel td{background:rgba(59,130,246,.08)}
/* 冻结列（2026-09-21 对齐纷享）：复选框/自选列粘左、操作列粘右，横向滚动时不动 */
.table-wrap.lead-tb th.fx-sel,.table-wrap.lead-tb td.fx-sel{position:sticky;left:0}
.table-wrap.lead-tb th.fx-lock-l,.table-wrap.lead-tb td.fx-lock-l{position:sticky}
.table-wrap.lead-tb th.fx-lock-r,.table-wrap.lead-tb td.fx-lock-r{position:sticky;right:0;border-left:1px solid var(--border)}
.table-wrap.lead-tb th{background:var(--surface-2);z-index:4}
.table-wrap.lead-tb tbody td{background:var(--surface);z-index:3}
.table-wrap.lead-tb td.fx-lock-l,.table-wrap.lead-tb td.fx-sel{box-shadow:6px 0 8px -8px rgba(0,0,0,.25)}
.table-wrap.lead-tb td.fx-lock-r{box-shadow:-6px 0 8px -8px rgba(0,0,0,.25)}
/* 线索详情：记录头 ⋯ 菜单 / 字段布局切换（两列↔一列）/ 摘要区两列（2026-09-21 对齐纷享详情） */
.ld-lay{display:inline-flex;align-items:center;justify-content:center;width:24px;height:20px;border:1px solid var(--border);border-radius:4px;color:var(--muted);text-decoration:none;font-size:12px}
.ld-lay.on{background:var(--surface-2);color:var(--primary);border-color:var(--primary)}
.ld-panel.ld-one-col .opp-field-row{display:block}
.ld-panel.ld-one-col .opp-field-row .k{flex:none;padding-bottom:2px}
.ld-sum>div{display:flex;gap:10px;align-items:baseline;padding:3px 0;font-size:13px}
.ld-sum>div>span{flex:0 0 92px;color:var(--muted)}
.ld-sum>div>b{font-weight:500}
/* 页签条（2026-09-21 对齐纷享「销售线索」）：文字页签+计数、激活态下划线；右端橙色「新建」+「⋯」；工具条右侧视图图标组 */
.fx-tabs{display:flex;align-items:center;gap:18px;flex-wrap:wrap;padding-bottom:0}
a.fx-tab{position:relative;font-size:13px;color:var(--text);text-decoration:none;white-space:nowrap;padding:2px 0 8px}
a.fx-tab .n{font-size:11px;color:var(--muted);margin-left:3px}
a.fx-tab.on{color:var(--primary);font-weight:600}
a.fx-tab.on .n{color:var(--primary)}
a.fx-tab.on::after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--primary);border-radius:2px}
.btn.fx-new{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
.btn.fx-new:hover{background:var(--primary-600);border-color:var(--primary-600);color:#fff}
a.fx-mi{display:block;padding:6px 10px;font-size:12.5px;color:var(--text);text-decoration:none;border-radius:6px}
a.fx-mi:hover{background:var(--surface-2)}
.fx-view-icons{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--border);border-radius:6px;padding:1px}
.fx-view-icons a{width:26px;height:24px;display:inline-flex;align-items:center;justify-content:center;color:var(--muted);text-decoration:none;border-radius:4px;font-size:13px}
/* 激活视图：线上是浅橙底圆角块（截图实测），不是浅灰底 */
.fx-view-icons a.on{background:var(--primary-50);color:var(--primary);border-radius:6px}
.fx-view-icons a:hover{background:var(--surface-2)}
/* 看板视图：按跟进状态分列，卡片可点开详情 */
.fx-board{display:flex;gap:10px;overflow:auto;padding:4px 0 10px;align-items:flex-start}
.fx-bcol{flex:0 0 220px;background:var(--surface-2);border-radius:10px;padding:8px}
.fx-bhead{font-size:12.5px;font-weight:600;margin-bottom:6px;display:flex;gap:6px;align-items:center}
.fx-bbody{display:flex;flex-direction:column;gap:6px;max-height:60vh;overflow:auto}
.fx-kcard{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:8px 9px;cursor:pointer}
.fx-kcard:hover{border-color:var(--primary)}
.fx-kcard[draggable="true"]{cursor:grab}
.fx-bcol.over{outline:2px dashed var(--primary);outline-offset:-2px;background:#eef4ff}
.fx-bcol.ro{opacity:.7}
/* 沟通内容富文本编辑器（2026-09-21 对齐线上工具栏）：工具条 + 可编辑区，落库前白名单清洗 */
.fx-rich{border:none;border-top:1px solid var(--border);border-bottom:1px solid var(--border);background:transparent}
.fx-rich-bar{display:flex;align-items:center;gap:4px;flex-wrap:wrap;padding:3px 6px;border-bottom:1px solid var(--border)}
.fx-rich-bar a{color:var(--text);text-decoration:none;padding:2px 6px;border-radius:4px;font-size:12.5px}
.fx-rich-bar a:hover{background:#fff}
.fx-rich-bar .sep{width:1px;height:14px;background:var(--border);margin:0 4px}
.fx-rich-bar select,.fx-rich-bar input[type=color]{font-size:11.5px;padding:1px 4px;border:1px solid var(--border);border-radius:4px;background:var(--surface)}
.fx-rich-body{min-height:96px;max-height:260px;overflow:auto;padding:8px 10px;font-size:13px;line-height:1.55;outline:none}
.fx-rich-body:empty:before{content:attr(data-ph);color:var(--muted)}
.fx-rich-view ul,.fx-rich-view ol{padding-left:20px;margin:4px 0}
.fx-rich-view blockquote{border-left:3px solid var(--border);margin:4px 0;padding:2px 8px;color:var(--muted)}
/* 「发布跟进详情」表单：完全照线上截图（分区标题 / 全宽描边控件 / 只读灰底 / 橙字选择 / 计数 / chip） */
.fx-form .fx-tabs{display:flex;gap:20px;border-bottom:1px solid var(--border);margin:2px 0 10px}
.fx-form a.fx-tab{font-size:14px;color:rgb(84,88,97);text-decoration:none;padding:0 0 6px}
.fx-form a.fx-tab.on{color:var(--primary);font-weight:600;box-shadow:inset 0 -2px 0 var(--primary)}
.fx-sec{font-size:13px;font-weight:700;color:rgb(24,28,37);padding:0;border-bottom:none;margin:0 0 8px}
.fx-lb{display:block;font-size:12px;color:rgb(84,88,97);margin:0 0 4px;line-height:18px}
.fx-lb i{color:var(--red);font-style:normal;margin-right:2px}
.fx-help{display:inline-flex;align-items:center;justify-content:center;width:13px;height:13px;border:1px solid var(--border);border-radius:50%;color:var(--muted);font-size:10px;cursor:help}
.fx-f,.fx-ta{width:100%;box-sizing:border-box;border:1px solid rgb(193,197,206);border-radius:8px;background:#fff;font-size:14px;color:rgb(24,28,37);padding:5px 8px}
.fx-f{height:32px;line-height:20px}
.fx-f.ro,.fx-ta.ro{background:#f5f6f7;color:rgb(24,28,37)}
.fx-ta{min-height:64px;resize:vertical;line-height:1.5}
.fx-cnt{text-align:right;font-size:12px;color:rgb(145,149,158);margin-top:2px}
.fx-link{display:inline-block;color:#1677ff;font-size:13px;text-decoration:none;padding:2px 0}
.fx-pick{display:flex;align-items:center;height:32px;box-sizing:border-box;padding:0 8px;border:1px solid rgb(193,197,206);border-radius:8px;background:#fff;color:var(--primary);font-size:13px;cursor:pointer}
.fx-pick:hover{border-color:var(--primary)}
.fx-form .fx-chip{display:inline-flex;align-items:center;font-size:12px;color:rgb(24,28,37);padding:0;border:none;background:transparent;border-radius:0}
.fx-plus{color:var(--muted);font-size:15px}
.fx-rbi{color:var(--text);text-decoration:none;padding:2px 6px;border-radius:4px;font-size:12.5px;line-height:1.2}
.fx-rbi:hover{background:var(--surface-2)}
.fx-rbsp{width:1px;height:14px;background:var(--border);margin:0 4px}
.fx-rich-bar2{display:flex;align-items:center;gap:2px;flex-wrap:wrap;padding:2px 6px;border-bottom:1px solid var(--border)}
.fx-rbsel{font-size:11.5px;padding:0 2px;border:none;background:transparent;height:22px;color:var(--text)}
.fx-rbcol{width:22px;height:18px;padding:0;border:none;background:transparent}
.fx-rich.full{position:fixed;inset:24px;z-index:120;box-shadow:var(--shadow-lg);background:var(--surface)}
.fx-rich.full .fx-rich-body{max-height:calc(100vh - 160px)}
.fx-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:40px 0 24px;color:var(--muted);font-size:12.5px}
/* 动态条目的行内操作：悬浮才显形（线上同形），全部在右栏完成 */
.fx-feed-ops{opacity:0;transition:opacity .12s;white-space:nowrap}
.fx-feed-ops a{text-decoration:none;margin-left:6px;font-size:12px}
div[data-act]:hover .fx-feed-ops{opacity:1}
/* 日历视图 */
.fx-calbar{display:flex;align-items:center;gap:10px;padding:4px 0 8px}
.fx-cal{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px}
.fx-cw{display:contents}
.fx-cc{font-size:11.5px;color:var(--muted);text-align:center;padding:2px 0}
.fx-ccal{min-height:84px;border:1px solid var(--border);border-radius:6px;padding:4px;font-size:11px;background:var(--surface)}
.fx-ccal.out{opacity:.45}
.fx-ccal .d{color:var(--muted);font-size:11px;margin-bottom:2px}
.fx-cev{background:var(--primary-50);color:var(--primary);border-radius:4px;padding:1px 4px;margin-bottom:2px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 表头拖列宽（2026-09-21 对齐纷享）：热区在 th 右缘（见 app.core.js bindTableEvents），无需额外元素 */

/* 商机「详细信息」页签（#oppExtraHost）：分组之间只有留白（线上无虚线），值为深色 */
#oppExtraHost .opp-form-group + .opp-form-group{border-top:none;padding-top:0}
#oppExtraHost .opp-form-group{margin-bottom:14px}
#oppExtraHost .opp-field-row .v{color:var(--text)}
/* 开关（显示全部信息）：线上是 28×16 圆角开关，不是复选框 */
.opp-switch{position:relative;display:inline-block;width:28px;height:16px;flex-shrink:0;vertical-align:middle}
.opp-switch input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer}
.opp-switch span{position:absolute;inset:0;background:#cbd5e1;border-radius:16px;transition:background .15s}
.opp-switch span::after{content:"";position:absolute;top:2px;left:2px;width:12px;height:12px;background:#fff;border-radius:50%;transition:transform .15s}
.opp-switch input:checked + span{background:var(--primary)}
.opp-switch input:checked + span::after{transform:translateX(12px)}
/* 视图切换（线上「列表 / 自适应」两个小图标）：单列 ⇄ 两列 */
.opp-viewseg{display:inline-flex;gap:2px;align-items:center}
.opp-viewseg button{border:none;background:none;cursor:pointer;color:var(--muted);font-size:14px;line-height:1;padding:2px 4px;border-radius:4px}
.opp-viewseg button.on{color:var(--primary);background:var(--surface-2)}
.opp-view-list .grid2{grid-template-columns:1fr}
.opp-tab-panel{display:none}
.opp-tab-panel.on{display:block}

/* 商机「修改记录」页签（2026-09-17 对齐纷享线上：时间/操作人/触发来源/操作/记录标题 + 字段旧→新） */
.opp-hist-bar{display:flex;align-items:center;gap:10px;margin:2px 0 8px}

/* ⋯ 溢出菜单（商机详情头部；线上同一位置的「⋯」） */
.opp-more-menu{background:var(--surface);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px rgba(16,24,40,.14);padding:4px;min-width:160px}
.opp-more-it{display:block;width:100%;text-align:left;padding:6px 10px;border:none;background:none;font-size:12.5px;color:var(--text);cursor:pointer;border-radius:6px}
.opp-more-it:hover{background:var(--surface-2,#f1f5f9);color:var(--primary)}
.opp-more-sep{height:1px;background:var(--border);margin:4px 2px}
.opp-hist-row{display:flex;gap:10px;padding:8px 0;border-bottom:1px dashed var(--border)}
.opp-hist-row:last-child{border-bottom:none}
.opp-hist-at{width:150px;flex-shrink:0;font-size:12.5px;line-height:19px;color:var(--muted);font-variant-numeric:tabular-nums}
.opp-hist-ava{flex:0 0 28px;width:28px;height:28px;border-radius:50%;background:#eef0f3;color:#c3c7d1;display:inline-flex;align-items:center;justify-content:center}
.opp-hist-ava svg{width:18px;height:18px}
.opp-hist-main{flex:1;min-width:0}
.opp-hist-top{font-size:13px;line-height:19px;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.opp-hist-act{display:inline-block;padding:0 6px;border-radius:4px;background:var(--surface-2,#f1f5f9);font-size:11px;color:var(--muted)}
.opp-hist-name{font-weight:600}
.opp-hist-chg{display:flex;gap:6px;flex-wrap:wrap;font-size:12.5px;margin-top:4px;line-height:19px}
.opp-hist-chg .k{color:var(--muted);min-width:96px}
.opp-hist-chg .old{color:var(--muted);text-decoration:line-through}
.opp-hist-chg .arw{color:var(--muted)}
.opp-hist-chg .new{color:var(--text);font-weight:600}
@media(max-width:1100px){.opp-detail-grid{grid-template-columns:minmax(0,1fr) 300px}}
@media(max-width:860px){.opp-detail-grid{grid-template-columns:1fr}.opp-info-grid{grid-template-columns:1fr}}

/* 模态 */
.modal-mask{position:fixed;inset:0;background:rgba(16,24,40,.5);display:flex;align-items:flex-start;justify-content:center;padding:30px 16px;z-index:50;overflow-y:auto}
.modal{background:var(--surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);width:100%;max-width:780px;margin:auto}
.modal.wide .modal-head{padding:8px 16px}
.modal.wide .modal-body{padding:12px 16px;max-height:calc(90vh - 90px);overflow-y:auto}
.modal.wide .modal-foot{padding:8px 12px}
.modal-head{padding:16px 20px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}
.modal-head h3{margin:0;font-size:16px;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .modal-head .x{cursor:pointer;color:var(--muted);font-size:22px;line-height:1;border:none;background:none;flex-shrink:0;margin-left:auto;order:99}   /* order:99＝关闭按钮永远排最后：弹窗内任何「往头部追加元素」的写法（appendChild）都不会再把它挤到中间（客户档案 2026-09-17） */
.modal-head-actions{flex-shrink:0}
.modal-head-actions .btn-sm{padding:4px 10px;font-size:12px}
@media(max-width:768px){.modal-head{flex-wrap:wrap}.modal-head h3{font-size:14px;flex:1 1 auto}.modal-head-actions{order:3;flex-basis:100%;margin-top:4px;margin-left:0;overflow-x:auto;-webkit-overflow-scrolling:touch}}
.modal-body{padding:18px 20px} .modal-foot{padding:12px 16px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;align-items:center;gap:8px;flex-wrap:wrap}   /* v2.2.8 何#3:允许优雅换行 */
.modal-foot .btn{white-space:nowrap}   /* 按钮文字永不内部断行 */

/* ---------- 记录详情「窗口」尺寸（2026-09-16 商机 / 2026-09-21 线索，对齐纷享销客实页） ----------
   线上：点开记录后详情不是居中小浮层，而是**停靠在「工作区」**——左导航右侧、顶栏下方，铺满余下区域整屏高；
   并从右侧滑入（transition 0.3s）、左缘带阴影（-2px 0 4px rgba(0,0,0,.15)）、背景列表不压暗（无遮罩底色）；
   右上角 刷新 / 放大 / 关闭 三个按钮，点「放大」把窗口撑到整屏（盖住左导航与顶栏），再点还原。
   本系统：外壳类 .dock-panel 供所有「记录详情」共用（线索详情再加 .lead-detail-mask、商机详情再加
   .opp-detail-mask 作各自的钩子）；遮罩层按工作区定位（导航宽 / 顶栏高由 JS 量取后写成内联 left/top，
   故窄屏导航隐藏时自动归 0）。窗口自身不滚动，滚动的是内容区。 */
.modal-mask.dock-panel{padding:0;background:transparent;overflow:hidden;align-items:stretch;justify-content:stretch}
.modal-mask.dock-panel .modal{max-width:none;width:100%;height:100%;margin:0;border-radius:0;display:flex;flex-direction:column;
  box-shadow:-2px 0 4px rgba(0,0,0,.15);animation:dockSlideIn .3s cubic-bezier(.4,0,.2,1)}   /* 线上：右滑入 + 左缘阴影 */
@keyframes dockSlideIn{from{transform:translateX(100%)}to{transform:translateX(0)}}
.modal-mask.dock-panel .modal-head{border-radius:0;padding:8px 16px;flex:0 0 auto}
.modal-mask.dock-panel .modal-body{flex:1 1 auto;min-height:0;max-height:none;padding:12px;background:var(--surface-2);overflow-y:auto}
.modal-mask.dock-panel .modal-foot{display:none}
.modal-mask.dock-panel.docked-max .modal-head{padding-right:16px}
@media (max-width:480px){ .modal-foot{gap:6px;padding:10px 12px} .modal-foot .btn{font-size:12px;padding:6px 10px} }
/* 动作跟踪已并入客户档案：「🎯 该做什么」tab 内两栏（该做什么+台账 ｜ 凭据+时间线）各自滚动，窄屏回落整页滚动 */
.ct-pane{display:flex;gap:14px;align-items:stretch;flex-wrap:wrap}
.ct-pane>section{flex:1 1 380px;min-width:300px;max-height:calc(92vh - 250px);display:flex;flex-direction:column;background:var(--surface-2);border:1px solid var(--border);border-radius:10px;padding:8px 10px;overflow:hidden}
.ct-pane .ct-scroll{flex:1 1 auto;min-height:0;overflow:auto}
@media (max-width:1000px){
  .ct-pane{display:block}
  .ct-pane>section{max-height:none;margin-bottom:10px}
  .ct-pane .ct-scroll{max-height:320px}
}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px}
.kv{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px dashed var(--border);font-size:13px} .kv .k{color:var(--muted)}
.score-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.gate-note{background:var(--amber-50);color:var(--amber);border-radius:var(--radius);padding:9px 12px;font-size:12px;margin-top:10px}
/* ---------- 商机流程条（v2.3.24，对齐纷享销客「销售流程阶段条」） ----------
   阶段做成**箭头块**：右端凸出指向下一阶段、左端内凹咬合上一阶段（同段内互锁，段首平口、段尾平尾）；
   已走过 ✓ / 当前实底 / 审批中斜纹 / 未开始灰；按 LTC 段（管理线索 · 管理机会点 · 管理合同执行）分组。
   注：用 clip-path 切形状，故不用 border/box-shadow（会被一起裁掉），状态一律靠底色区分。 */
.stage-track{margin:0 0 10px;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);padding:6px 10px;overflow-x:auto}
.stage-track .stt-seg{display:flex;align-items:center;gap:8px;padding:3px 0}
.stage-track .stt-seg + .stt-seg{border-top:1px dashed var(--border)}
.stage-track .stt-seg-h{flex:0 0 auto;min-width:74px;font-size:11px;font-weight:600;color:var(--muted);white-space:nowrap}
.stage-track .stt-row{display:flex;align-items:stretch;gap:2px;flex:1;min-width:0;overflow-x:auto;padding:2px 0}
.stage-track .stt{--tip:9px;display:inline-flex;align-items:center;gap:5px;padding:5px 17px 5px 18px;
  background:var(--surface-2);color:var(--muted);font-size:12px;line-height:1.35;white-space:nowrap;
  clip-path:polygon(0 0,calc(100% - var(--tip)) 0,100% 50%,calc(100% - var(--tip)) 100%,0 100%,var(--tip) 50%)}
.stage-track .stt.f{padding-left:12px;clip-path:polygon(0 0,calc(100% - var(--tip)) 0,100% 50%,calc(100% - var(--tip)) 100%,0 100%)}
.stage-track .stt.l{padding-right:12px;clip-path:polygon(0 0,100% 0,100% 100%,0 100%,var(--tip) 50%)}
.stage-track .stt.f.l{padding-left:12px;padding-right:12px;clip-path:none;border-radius:var(--radius-sm)}
.stage-track .stt b{font-weight:600}
.stage-track .stt u{text-decoration:none;font-size:10px;opacity:.65;border:1px solid currentColor;border-radius:3px;padding:0 3px}
.stage-track .stt .num,.stage-track .stt .tick,.stage-track .stt .mark{font-style:normal;font-size:11px;width:13px;text-align:center;flex-shrink:0}
.stage-track .stt .mark{border-radius:50%;background:currentColor;width:7px;height:7px;display:inline-block}
.stage-track .stt .cnt{font-size:11px;font-weight:700;background:rgba(15,39,71,.08);border-radius:var(--radius-full);padding:0 6px}

/* ---------- 该阶段任务（2026-09-17 对齐纷享线上任务面板） ----------
   每行＝一个任务：左「状态措辞」（已完成/进行中/未完成/未开始，同线上 task.state）、
   `*`＝必须完成（线上 .must-complete-task，只有它拦推进）、右动作按钮（填写/选择或创建/新建）。 */
.stage-task-row{padding:5px 0;border-bottom:1px dashed var(--border)}
.stage-task-row:last-child{border-bottom:none}
.stage-task-row .st-state{font-size:11px;padding:0 5px;border-radius:var(--radius-sm);white-space:nowrap;line-height:18px;height:18px}
.stage-task-row .st-state.ok{color:var(--green);background:rgba(22,163,74,.10)}
.stage-task-row .st-state.doing{color:var(--primary);background:rgba(37,99,235,.10)}
.stage-task-row .st-state.bad{color:var(--red);background:rgba(220,38,38,.10)}
.stage-task-row .st-state.todo{color:var(--muted);background:rgba(15,39,71,.06)}
.stage-task-row .must-star{color:var(--red);font-weight:700;margin-right:2px}
/* ---------- 该阶段任务·已关联对象（2026-09-17 对齐纷享线上 .obj-list / .task-related-obj） ----------
   线上两种形态：「选择」挂上来的＝一行一个操作人 + 逐条「编号 生命状态」+ 当前阶段可 ✕ 解除关联；
   「新建」出来的＝一行「操作人 新建 对象名」；都没有才显示提示行「新建 X」。 */
.st-objlist{display:flex;flex-direction:column;gap:2px;margin:3px 0 0 22px}
.st-objlist .obj-list{display:flex;align-items:baseline;flex-wrap:wrap;font-size:11.5px;line-height:18px}
.st-objlist .obj-list.st-obj-more{display:none}
.st-objlist.open .obj-list.st-obj-more{display:flex}
.st-objlist .user{color:var(--text)}
.st-objlist .new{color:var(--muted);margin:0 4px}
.st-objlist .obj{margin-right:8px}
.st-objlist .data{display:inline-flex;align-items:baseline;margin-right:10px}
.st-objlist .data-name{color:var(--primary)}
.st-objlist .data-lifestatus{color:var(--muted);margin-left:4px}
.st-objlist .more-mini{color:var(--muted);cursor:pointer;margin-left:4px;font-size:12px;line-height:1;text-decoration:none}
.st-objlist .more-mini:hover{color:var(--red)}
.st-objtog a{color:var(--primary);cursor:pointer;font-size:11.5px}
.st-objtog a:hover{text-decoration:underline}
.task-related-obj{display:flex;flex-wrap:wrap;align-items:baseline;margin:3px 0 0 22px;font-size:11.5px;color:var(--text)}
.task-related-obj .person{margin-right:4px;color:var(--text)}
.task-related-obj .gray{color:var(--muted);margin-right:4px}

.stage-track .stt .tag{font-style:normal;font-size:10px;font-weight:700;background:rgba(255,255,255,.26);border-radius:var(--radius-full);padding:0 5px}
.stage-track .stt.done{background:var(--green-50);color:var(--green)}
.stage-track .stt.done .tick{color:var(--green);font-weight:700}
.stage-track .stt.done u{border-color:rgba(31,157,107,.45)}
.stage-track .stt.cur{background:var(--primary);color:#fff}
.stage-track .stt.cur u{border-color:rgba(255,255,255,.6)}
 .stage-track .stt.act{box-shadow:inset 0 0 0 2px var(--accent)}   /* 线上 active：正在**查看**的阶段（与真实进度 cur/done/todo 分开） */
 .stage-track .stt.cur.act{box-shadow:inset 0 0 0 2px rgba(255,255,255,.8)}
.stage-track .stt.pending{background:repeating-linear-gradient(135deg,#fdf3e3,#fdf3e3 6px,#f6e6c9 6px,#f6e6c9 12px);color:var(--amber)}
.stage-track .stt.pending .tag{background:var(--amber);color:#fff}
.stage-track .stt.todo .num{color:var(--muted)}
.stage-track [data-stg]{cursor:pointer}
.stage-track [data-stg]:hover{background:var(--accent-50);color:var(--accent)}
.stage-track [data-stg].done:hover{background:#d6ede1;color:var(--green)}
.stage-track [data-stg].cur:hover{background:var(--primary-600);color:#fff}
.stage-track .stt .win{font-style:normal;font-size:11px;opacity:.75}
/* 「结束」节点（纷享线上 2026-09-17 实测 .process-item.end）：灰底 #e7eaf0 / 文字 #545861 / 12px、
   右端平口+4px 圆角、左端沿用上一阶段同款箭头缺口、2px 透明描边（选中态换成同色绿描边）；
   **整块**可点，点开下拉时整块变 #17b461 绿底白字（线上选中态，见 .open）。 */
.stage-track .stt.end{background:#e7eaf0;color:#545861;font-weight:400;padding:0 10px;gap:4px;
  border:2px solid transparent;border-radius:0 4px 4px 0;
  clip-path:polygon(0 0,100% 0,100% 100%,0 100%,var(--tip) 50%)}
.stage-track .stt.end.won{background:var(--green-50);color:var(--green)}
.stage-track .stt.end.lost{background:var(--red-50);color:var(--red)}   /* 丢单/放弃跟进：末端节点显示出口名并转红 */
/* 已结束（赢单/丢单/终止）：末端块＝流程终点，实心着色 + ✓（线上已赢单流程条的形态：各阶段均已完成，
   光标落在末端「赢单」块上） */
.stage-track .stt.end.final{font-weight:600;gap:6px}
.stage-track .stt.end.won.final{background:var(--green);color:#fff}
.stage-track .stt.end.lost.final{background:var(--red);color:#fff}
.stage-track .stt.end.final .tick{color:#fff;font-weight:700}
.stage-track .stt.end.pick{cursor:pointer}   /* 只有未结束的商机才可点开结束方式下拉 */
.stage-track .stt.end.pick:hover,.stage-track .stt.end.open{background:#17b461;border-color:#17b461;color:#fff}
.stage-track .stt.end .caret{width:0;height:0;margin-left:3px;display:inline-block;
  border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid currentColor}
/* 「设置列对应关系」（2026-09-16 截图：从本地Excel导入 → Excel字段 / 列对应关系(可拖动排序) / 从对象字段） */
.colmap{display:grid;grid-template-columns:1fr 1.2fr 1fr;gap:10px;align-items:start}
.colmap-col{border:1px solid var(--border);border-radius:9px;padding:8px 10px;min-height:150px;background:var(--surface)}
.colmap-col > b{display:block;font-size:12.5px;margin-bottom:6px}
.colmap .cm-item{display:flex;align-items:center;gap:6px;font-size:12.5px;font-weight:400;padding:4px 2px;cursor:pointer}
.colmap .maplist{list-style:none;margin:0;padding:0;min-height:120px}
.colmap .map-item{display:flex;align-items:center;gap:6px;font-size:12.5px;padding:5px 6px;margin-bottom:4px;
  border:1px dashed var(--border);border-radius:7px;background:var(--surface-2);cursor:grab}
.colmap .map-item.dragging{opacity:.5}
.colmap .map-item.over{border-color:var(--primary)}
.colmap .map-x{margin-left:auto}

/* 流程条浮层菜单：挂 body + fixed（挂在 .stage-track 内会被其 overflow-x:auto 裁掉 → "点了没反应"） */
.end-menu,.track-menu{position:fixed;right:auto;z-index:1200;min-width:196px;background:var(--surface);
  border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.12);padding:5px}
/* 「结束」下拉（纷享线上 2026-09-17 实测 .paas-rocket-hover-card）：白底 200px、圆角 5px、上下 8px；
   每项 40px 高 / 左右 17px（✓ 赢单 100% / ✗ 跟进失败 0% / ⊘ 放弃跟进 0%）；阴影照线上两段式。 */
.end-menu{width:200px;min-width:200px;padding:8px 0;border:0;border-radius:5px;
  box-shadow:0 6px 6px rgba(60,72,85,.24),0 0 2px rgba(60,72,85,.26)}
.end-item{display:flex;align-items:center;height:40px;padding:0 17px;cursor:pointer;font-size:14px;color:#333}
.end-item:hover{background:var(--surface-2)}
.end-item.on{background:var(--surface-2);font-weight:600}
.end-item .ic{width:16px;margin-right:8px;text-align:center;font-style:normal;font-size:13px}
.end-item .ic.ok{color:#17b461}
.end-item .ic.bad{color:#e34d59}
.end-item .ic.skip{color:#a8adb5}
.end-item .text{flex:1;min-width:0}
.end-item .rate{color:#333}
/* 「动态」面板内的浮层复用上面这套 .end-menu / .track-menu 壳（挂 body + fixed）：
   ⋯ 动作菜单收窄到 150px；筛选面板照线上 500px 宽（标签 + 时间分区 + 自定义区间 + 筛选/重置页脚）。 */
.opp-feed-menu{width:150px;min-width:150px}
.opp-feed-menu .end-item{height:34px;padding:0 12px;font-size:13px}
.opp-feed-flt{width:480px;min-width:480px;padding:0;border:1px solid var(--border);border-radius:var(--radius)}
.opp-feed-flt-hd{display:flex;align-items:center;gap:6px;padding:10px 14px;border-bottom:1px solid var(--border);font-size:14px;font-weight:600}
.opp-feed-flt-hd .sp{flex:1}
.opp-feed-flt-sec{padding:10px 14px;border-bottom:1px solid var(--border)}
.opp-feed-flt-sec>p{margin:0 0 6px;font-size:12px;color:var(--text)}
.opp-feed-flt-tags{display:flex;flex-wrap:wrap;gap:6px}
.opp-feed-flt-time{display:flex;gap:16px}
.opp-feed-flt-time .col{flex:0 0 210px}
.opp-feed-flt-time .col.sub{flex:1;min-width:0}
.opp-feed-flt-time .col .sub{margin:0 0 6px;font-size:12px;color:var(--text)}
.opp-feed-flt-range{display:flex;align-items:center;gap:6px}
.opp-feed-flt-range input{flex:1;min-width:0;padding:4px 6px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);font-size:12px}
.opp-feed-flt-ft{display:flex;justify-content:center;gap:8px;padding:10px 14px}
.opp-feed-tag{padding:1px 8px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);font-size:12px;line-height:18px;color:var(--muted);white-space:nowrap;cursor:pointer}
.opp-feed-tag:hover{border-color:var(--accent);color:var(--accent)}
.opp-feed-tag.on{border-color:var(--accent);background:var(--accent-50);color:var(--accent)}
.stage-track .stt-head{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:0 0 5px;border-bottom:1px dashed var(--border);margin-bottom:4px;font-size:12px}
.stage-track .stt-head .muted{font-size:12px}
.stage-track .stt-head .stt-head-t{font-size:13.5px;font-weight:600;color:var(--text)}
.stage-track .stt-head .stt-head-m{font-size:12px;color:var(--muted);margin-left:8px}
.stage-track .stt-warn{margin:4px 0 2px;padding:5px 8px;border-radius:var(--radius-sm);background:var(--amber-50);color:var(--amber);font-size:11.5px;line-height:1.5}
/* ---------- 商机表单（2026-09-16，按流程模板字段方案渲染） ---------- */
.opp-form-group{margin-bottom:10px}
.opp-form-group + .opp-form-group{border-top:1px dashed var(--border);padding-top:8px}
.opp-form-h{font-size:13px;line-height:18px;font-weight:700;color:var(--text);margin:2px 0 6px;padding:5px 0;display:flex;align-items:center;gap:4px}
.opp-form-ro{padding:6px 2px;font-size:13px;color:var(--muted);border-bottom:1px dashed var(--border);min-height:20px}
.opp-form-group .field{margin-bottom:8px}
.opp-form-group .field label{font-size:12px;color:var(--muted)}
.opp-form-group .field input,.opp-form-group .field select,.opp-form-group .field textarea{width:100%}

/* 2026-09-16（用户要求）：新建商机弹窗「宽屏铺满 + 左栏分组总览 + 字段左标签／右控件两列」（对齐纷享销客表单）。
   只作用于 .modal.opp-full，不动全站 .field 既有的「标签在上」布局，避免波及其它表单。 */
.modal.opp-full{max-width:none}
.modal.opp-full .modal-body{padding:0;max-height:none;overflow:hidden}
/* 左＝分组总览（客户情况/项目情况/地区定位/系统信息），右＝表单滚动区 */
.opp-form-shell{display:flex;height:calc(100vh - 160px);min-height:0}
/* 售前文档整页表单（商务方案 / 项目建议书）：右上动作条 + 行距设置（照纷享 2026-09-17） */
.od-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:2px 2px 8px;border-bottom:1px dashed var(--border);margin-bottom:8px}
.od-act-left{display:inline-flex;align-items:center;gap:4px;order:1}
.od-act-right{display:inline-flex;align-items:center;gap:8px;order:2}
.od-lh{display:inline-flex;gap:4px;margin-left:4px}
/* 线上底部条：迷你开关距「行距设置」24px。行距设置自带 JS 内联 margin-left:14px，需 !important 归位；20px + .od-act-left 的 4px gap = 24px */
.od-act-left>span.muted{margin-left:20px!important}
.od-lh .btn.on{background:var(--primary-50);border-color:var(--primary);color:var(--primary);font-weight:700}   /* 2026-09-22 用户口径：按钮不用橙色。当前行距＝本系统主色（浅底+主色描边/字），与 .chip-filter.on 同一套选中态 */
.opp-form-pane.lh-compact .field{margin-bottom:2px}
.opp-form-pane.lh-loose .field{margin-bottom:10px}
.opp-form-pane.lh-compact .field>label,.opp-form-pane.lh-compact .field .opp-form-ro{line-height:1.2}
.opp-form-pane.lh-standard .field>label,.opp-form-pane.lh-standard .field .opp-form-ro{line-height:1.5}
.opp-form-pane.lh-loose .field>label,.opp-form-pane.lh-loose .field .opp-form-ro{line-height:1.9}
.opp-form-pane.lh-loose textarea{line-height:1.9}
.opp-form-pane.lh-compact textarea{line-height:1.2}
/* 转换表单：页签头部「收起」折叠（照线上） */
.opp-form-pane.cvf-collapsed .opp-form-group,
.opp-form-pane.cvf-collapsed .opp-form-tools,
.opp-form-pane.cvf-collapsed .cvf-linkmode{display:none}

.opp-form-nav{flex:0 0 151px;padding:10px 0;border-right:1px solid var(--border);background:var(--surface-2);overflow-y:auto}   /* 线上左导航宽 151px；左右留白交给导航项自身 24px 内边距 */
.opp-form-nav .it{display:block;width:100%;text-align:right;padding:8px 24px;min-height:32px;margin-bottom:2px;border:none;background:none;border-radius:6px 0 0 6px;font:inherit;font-size:13px;line-height:16px;color:var(--text);cursor:pointer}   /* 线上：项高 32px（行高 16px；换行项自然长到 48px）、内边距 8px 24px、文字右对齐。注意 line-height 必须写在 font:inherit 之后，否则被简写重置 */
.opp-form-nav .it:hover{background:var(--surface)}
.opp-form-nav .it.on{background:var(--amber-50);color:var(--amber);font-weight:700;border-radius:6px 0 0 6px}   /* 选中态沿用本系统配色（--amber 系），不抄线上橙 */
.opp-form-pane{flex:1;min-width:0;overflow-y:auto;padding:14px 20px}
/* 列间距/列宽按纷享实测：字段名列 128px + 标签与控件间距 8px（控件起点 136px）、控件 454px；
   商机表单两列节距仍由下方 .grid2 的 clamp 控制（整片≤1400px）。
   窄屏用 clamp 收窄列间距，≤1024px 由既有媒体查询降为单列。 */
.modal.opp-full .grid2{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px clamp(24px,9vw,129px);max-width:1400px}   /* 铺满录入区、不留大片空白；超宽屏封顶 1400 */
.modal.opp-full .field{display:grid;grid-template-columns:168px minmax(0,1fr);gap:6px 8px;align-items:center;margin-bottom:4px}   /* 2026-09-23 用户口径：左列字段名不得换行、可稍宽 —— 128→168（168+8=176 控件起点） */
.modal.opp-full .field>label{display:block;margin:0;font-size:12px;color:var(--muted);line-height:1.35;word-break:break-word}
.modal.opp-full .field .opp-form-ro{padding:6px 0;min-height:auto}
.modal.opp-full .opp-form-group{margin-bottom:12px}
/* 2026-09-16（用户要求）：字号对齐纷享销客「新建机会点」表单——在 127.0.0.1 登录其租户实测：
   字段名 14px/400/深色、录入控件 14px/高 32px/圆角 8px、分组标题 16px/700、
   左栏分组导航 14px、表单标题 18px、行距 44px。此前我们是 12px 灰色标签 + 40px 高的控件。 */
.modal.opp-full .modal-head h3{font-size:18px;font-weight:700;color:var(--text)}
.modal.opp-full .opp-form-h{font-size:16px;font-weight:700;line-height:16px;color:var(--text);margin-bottom:8px}
.modal.opp-full .field>label{font-size:14px;color:var(--text);line-height:15.4px}
.modal.opp-full .field input:not([type=checkbox]):not([type=radio]),.modal.opp-full .field select,.modal.opp-full .field textarea{
  font-size:14px;color:var(--text);padding:5px 10px;height:32px;border-radius:8px}
.modal.opp-full .field textarea{height:auto;min-height:32px}
.modal.opp-full .field input:not([type=checkbox]):not([type=radio])::placeholder,.modal.opp-full .field textarea::placeholder{color:#c0c4cc}
.modal.opp-full .field .opp-form-ro{font-size:14px}
.modal.opp-full .opp-form-nav .it{font-size:14px;font-weight:400}
.modal.opp-full .opp-form-nav .it.on{font-weight:700}
@media(max-width:768px){ .opp-form-nav{display:none} .opp-form-shell{height:calc(100vh - 140px)} }
/* ---------- 新建商机表单工具条（2026-09-17 对齐纷享销客「新建机会点」线上实测） ----------
   线上：标题栏右侧＝列数切换（1/2/3/4 列四个图标）；标题栏下方一行＝「仅显示必填字段」开关 + 「行距设置 紧凑/舒适/宽敞」。
   行距实测：紧凑 40px、舒适 44px、宽敞 48px（＝控件 32 + 行距 8 + 字段下边距 0/4/8）。
   列数实测：1 列 1300 宽 / 2 列 590×2 / 3 列 531×3 / 4 列 369×4（整行字段始终占满）。 */
.opp-form-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:0 0 10px;margin-bottom:10px;
  border-bottom:1px dashed var(--border);font-size:14px;color:var(--text)}
.opp-form-tools>label{margin:0;font-size:14px;color:var(--text)}
.opp-view-switch{display:inline-flex;align-items:center;gap:2px;margin-right:12px}
.opp-view-switch .si{display:inline-flex;align-items:center;justify-content:center;gap:2px;width:26px;height:22px;
  border-radius:6px;cursor:pointer;color:#c8ccd4}
.opp-view-switch .si>span{display:block;width:3px;height:12px;background:currentColor;border-radius:1px}
.opp-view-switch .si:hover{background:var(--surface-2)}
.opp-view-switch .si.on{color:var(--primary)}
/* 行距：.od-lh 已在售前文档表单实现（第 545 行），这里补商机表单的字段行距（需压过 .modal.opp-full .field 的 4px） */
#m_pane.lh-compact .field{margin-bottom:0}
#m_pane.lh-loose .field{margin-bottom:8px}
/* 列数：默认 2 列（.modal.opp-full .grid2）；窄屏仍由 ≤1024px 媒体查询降为单列 */
@media(min-width:1025px){
  #m_pane.cols-1 .grid2{grid-template-columns:minmax(0,1fr)}
  #m_pane.cols-3 .grid2{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 24px;max-width:none}
  #m_pane.cols-4 .grid2{grid-template-columns:repeat(4,minmax(0,1fr));gap:8px 20px;max-width:none}
  /* 2026-09-23：共用外壳（新建合同 / 新建项目交付 / 售前文档）同一套列数切换 */
  #od_pane.cols-1 .grid2{grid-template-columns:minmax(0,1fr)}
  #od_pane.cols-3 .grid2{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px 24px;max-width:none}
  #od_pane.cols-4 .grid2{grid-template-columns:repeat(4,minmax(0,1fr));gap:8px 20px;max-width:none}
}
#od_pane.lh-compact .field{margin-bottom:0}
#od_pane.lh-loose .field{margin-bottom:8px}
/* 「仅显示必填字段」＝只留标 * 的字段行；整组一行不剩时该组（含左栏导航项）一并收起 */
#m_form.req-only .field.opt{display:none}
/* 文本字段的 0/100 计数（线上：数字贴输入框右内侧）*/
.opp-cnt-wrap{position:relative;display:block;min-width:0}
.opp-cnt-wrap input{padding-right:48px}
.opp-cnt{position:absolute;right:10px;top:50%;transform:translateY(-50%);font-size:12px;color:#c0c4cc;pointer-events:none}
/* 只读框（客户定级）：线上是一个灰底禁用输入框 */
.opp-form-ro.opp-disabled{background:#f5f7fa;border:1px solid var(--border);border-bottom:1px solid var(--border);
  border-radius:8px;height:32px;display:flex;align-items:center;padding:0 10px;color:#a8abb2;font-size:14px}
/* 字段名后的 ? 帮助图标（Sponsor）：悬停出线上原文 */
.opp-help{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;margin-left:4px;
  border-radius:50%;border:1px solid var(--muted);color:var(--muted);font-size:10px;line-height:1;cursor:help;vertical-align:middle}
/* 详细信息（只读）：左标签 / 右值（截图口径）*/
/* 商机「详细信息」字段行（2026-09-17 对齐纷享线上排版）：13px / 行高 18px、行距 38px 节奏、
   左标签右值、标签占 30%（线上 label 112px ÷ item 369px）、值走深色、标签走 muted。 */
.opp-field-row{display:flex;gap:10px;align-items:flex-start;padding:4px 0;font-size:13px;line-height:18px;min-width:0}
.opp-field-row .k{flex:0 0 112px;padding:4px 0 8px;color:var(--muted);min-width:0;word-break:break-word}
/* 值：下划线画在「值」下面（线上 `.faci-field-display_value.p-border-bottom` 1px #dee1e8），不是整行底线 */
.opp-field-row .v{flex:1;min-width:0;padding:4px 16px 4px 0;min-height:30px;border-bottom:1px solid var(--border);word-break:break-word}
.opp-form-h.opp-foldable{cursor:pointer;user-select:none}
@media(max-width:768px){ .stage-track{padding:5px 8px} .stage-track .stt{font-size:11px;padding:3px 14px 3px 15px} .stage-track .stt-seg-h{min-width:0} }
/* v2.2.14 沈#4/#16:勾选框被 .fld/.field input{width:100%} 拉满整行导致 □ 与文字错位分行——checkbox/radio 恢复自然宽度,与文字同行 */
.fld input[type=checkbox],.field input[type=checkbox],.fld input[type=radio],.field input[type=radio]{width:auto;margin-right:6px;vertical-align:middle}
.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:var(--primary-600);color:#fff;padding:11px 18px;border-radius:var(--radius);box-shadow:var(--shadow-lg);z-index:10050;font-size:13px;max-width:90%}
.toast.err{bottom:auto;top:18px;background:var(--red);font-weight:600}   /* v2.2.8 何#1:错误提示顶置,永浮于模态栈(1000+)之上 */
.toast.err{background:var(--red)}
.empty{text-align:center;color:var(--muted);padding:40px 20px}

/* 移动底部导航 */
.mobile-nav{display:none}

/* ---------- 响应式 ---------- */
@media (max-width:1024px){ .grid2{grid-template-columns:1fr} .grid3{grid-template-columns:1fr 1fr} }
@media (max-width:768px){
  .sidebar{display:none}
  .main{margin-left:0}
  .content{padding:8px 10px;padding-bottom:calc(78px + env(safe-area-inset-bottom))}
  .topbar{padding:12px 14px;flex-wrap:wrap;gap:8px}
  .topbar > div:last-child{flex-wrap:wrap;justify-content:flex-start;width:100%}
  .topbar .gs-row{flex:1 1 100%;width:100%}
  .topbar .gs-wrap{flex:1 1 auto;min-width:0}
  .topbar #gSearch{width:100%!important;min-width:0;box-sizing:border-box}
  .topbar #ta{display:flex;flex-wrap:wrap;gap:6px}
  .topbar #ta .btn{white-space:nowrap;flex:0 0 auto}
  .kpi-grid{grid-template-columns:repeat(2,1fr)}
  .funnel-row .name{width:96px} .funnel-row .meta{width:88px}
  .score-grid{grid-template-columns:1fr 1fr}
  .mobile-nav{display:flex;position:fixed;bottom:0;left:0;right:0;background:var(--surface);border-top:1px solid var(--border);z-index:30;box-shadow:0 -2px 8px rgba(16,24,40,.06);padding-bottom:env(safe-area-inset-bottom)}
  .mobile-nav a{flex:1;text-align:center;padding:9px 0 7px;color:var(--muted);font-size:11px;cursor:pointer}
  .mobile-nav a .ic{display:block;font-size:18px;margin-bottom:2px}
  .mobile-nav a.active{color:var(--primary)}
  .modal-mask{padding:0;align-items:flex-end} .modal{max-width:100%;border-radius:var(--radius-lg) 16px 0 0}
}
@media (max-width:768px){ .grid3{grid-template-columns:1fr} }
@media (max-width:420px){ .kpi-grid{grid-template-columns:1fr 1fr} .toolbar .full-sm{width:100%} }

/* 人员选择（飞书样式）：选中＝「姓名 ×」标签，候选只在聚焦/输入时弹出——不再把全部人员常驻成 <select size=6> */
.pick{position:relative;min-width:0}
.pick-inner{flex-wrap:wrap;min-height:0}
.pick-chip{display:inline-flex;align-items:center;gap:3px;max-width:100%;height:26px;padding:0 4px 0 8px;
  border:1px solid var(--border);border-radius:6px;background:var(--surface-2);font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pick-x{border:none;background:none;cursor:pointer;color:var(--muted);font-size:14px;line-height:1;padding:0 3px;border-radius:4px}
.pick-x:hover{color:var(--red);background:var(--red-50)}
.pick-input{width:100%;padding:6px 10px;border:1px solid var(--border);border-radius:8px;font-size:13px;font-family:inherit}
.pick-pop{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:30;max-height:200px;overflow:auto;padding:4px;
  background:var(--surface);border:1px solid var(--border);border-radius:8px;box-shadow:var(--shadow-lg)}
.pick-opt{padding:5px 8px;border-radius:6px;font-size:12.5px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pick-opt:hover{background:var(--surface-2)}
.pick-opt.on{background:var(--primary-soft);color:#fff}
.pick-empty{padding:6px 8px;color:var(--muted);font-size:12px}

/* 通知铃铛 */
.bell{position:relative;background:transparent;border:1px solid var(--border);border-radius:var(--radius);width:28px;height:28px;cursor:pointer;font-size:14px;line-height:1}   /* 主题 / 通知：与顶栏其它控件同高 28px（原 38px 高出一截） */
.bell:hover{background:var(--surface-2)}
.bell-badge{position:absolute;top:-5px;right:-5px;background:var(--red);color:#fff;border-radius:var(--radius-lg);font-size:11px;font-weight:700;min-width:16px;height:16px;line-height:16px;text-align:center;padding:0 4px}

/* 导航项红点徽章（待筛选新留言提醒） */
.nav .nav-grp-items a{position:relative}
.nav-red-dot{position:absolute;top:2px;right:6px;background:var(--red);color:#fff;border-radius:var(--radius-lg);font-size:10px;font-weight:700;min-width:16px;height:16px;line-height:16px;text-align:center;padding:0 4px;animation:navPulse 1.5s ease infinite}
.nav-red-dot.hidden{display:none!important}
@keyframes navPulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.15)}}
/* 移动端导航红点定位 */
.mobile-nav a{position:relative}
.mobile-nav .nav-red-dot{top:0;right:50%;transform:translateX(20px)}

/* 移动端：导航项较多时横向滚动 */
@media (max-width:768px){
  .mobile-nav{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .mobile-nav a{flex:0 0 auto;min-width:62px}
}
/* 移动端悬浮快速新建（FAB）+ 操作单 */
.mfab,.mfab-sheet,.mfab-mask{display:none}
@media (max-width:768px){
  .mfab{display:flex;align-items:center;justify-content:center;position:fixed;right:16px;bottom:70px;width:52px;height:52px;border-radius:50%;background:var(--primary);color:#fff;font-size:26px;line-height:1;border:none;box-shadow:0 6px 18px rgba(24,95,165,.4);z-index:35;cursor:pointer}
  .mfab:active{transform:scale(.94)}
  .mfab-mask{display:none;position:fixed;inset:0;background:rgba(0,0,0,.28);z-index:36}
  .mfab-mask.on{display:block}
  .mfab-sheet{display:none;position:fixed;left:0;right:0;bottom:0;background:var(--surface);border-radius:var(--radius-lg) 16px 0 0;z-index:37;padding:10px 14px calc(14px + env(safe-area-inset-bottom));box-shadow:0 -4px 20px rgba(16,24,40,.18)}
  .mfab-sheet.on{display:block;animation:sheetUp .18s ease}
  .mfab-sheet h4{margin:6px 0 8px;font-size:13px;color:var(--muted)}
  .mfab-sheet a{display:flex;align-items:center;gap:10px;padding:13px 8px;border-bottom:1px solid var(--border);font-size:14px;cursor:pointer}
  .mfab-sheet a:last-child{border-bottom:none}
}
@keyframes sheetUp{from{transform:translateY(100%)}to{transform:translateY(0)}}

/* ---------- 移动/iPad 适配增强 ---------- */
@media (max-width:768px){
  .table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
  table{min-width:520px}                 /* 宽表横向滚动而非压扁 */
  .btn-sm{padding:8px 12px}              /* 更易点按 */
  .modal-body{max-height:74vh;overflow-y:auto}
  .modal-foot{position:sticky;bottom:0;background:var(--surface);box-shadow:0 -2px 6px rgba(16,24,40,.05)}
  .kv{flex-wrap:wrap}
  .topbar h2{font-size:16px}
}
/* iPad 竖屏：保留侧栏但更紧凑 */
@media (min-width:768px) and (max-width:1024px){
  :root{--nav-w:200px}
  .sidebar .nav a{padding:9px 12px}
  .content{padding:8px 12px}
}

/* BI 透视穿透条形（通用，不限于 .dist） */
.d-row{display:flex;align-items:center;gap:10px;margin-bottom:9px}
.d-row .dl{font-size:13px;color:var(--text)}
.d-bar{flex:1;height:10px;background:var(--surface-2);border-radius:var(--radius-sm);overflow:hidden}
.d-bar > span{display:block;height:100%;background:var(--primary);border-radius:var(--radius-sm)}
.d-row .dv{min-width:84px;text-align:right;font-size:13px;font-weight:600}

/* 长表单向导（B3） */
.wiz-dots{display:flex;align-items:center;justify-content:center;gap:0;margin:4px 0 8px;flex-wrap:wrap}
.wiz-dot{width:26px;height:26px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:12px;background:var(--surface-2);color:var(--muted);border:2px solid var(--border);font-weight:600}
.wiz-dot.cur{background:var(--orange,var(--accent));color:#fff;border-color:var(--orange,var(--accent))}
.wiz-dot.done{background:var(--primary-50);color:var(--primary);border-color:var(--primary-50)}
.wiz-line{width:18px;height:2px;background:var(--border);display:inline-block}
.wiz-step{animation:wizfade .15s ease}
@keyframes wizfade{from{opacity:.4}to{opacity:1}}

/* 开关（功能板块/部署配置） */
.switch{position:relative;display:inline-block;width:40px;height:22px;vertical-align:middle}
.switch input{opacity:0;width:0;height:0}
.switch .slider{position:absolute;cursor:pointer;inset:0;background:var(--border);border-radius:var(--radius-lg);transition:.2s}
.switch .slider:before{content:"";position:absolute;height:16px;width:16px;left:3px;bottom:3px;background:#fff;border-radius:50%;transition:.2s;box-shadow:0 1px 2px rgba(0,0,0,.2)}
.switch input:checked + .slider{background:var(--primary,var(--primary))}
.switch input:checked + .slider:before{transform:translateX(18px)}

/* ===================== v57 国际化视觉优化 ===================== */
/* 线性图标（导航 / 通用 / 移动底栏） */
.lic{width:18px;height:18px;display:inline-block;vertical-align:middle;flex-shrink:0}
.nav a .ic{display:flex;align-items:center;justify-content:center;width:22px;height:22px;opacity:1}
.nav a .ic .lic{width:18px;height:18px;opacity:.82;transition:opacity .12s}
.nav a:hover .ic .lic,.nav a.active .ic .lic{opacity:1}
.ic-emoji{font-size:14px;line-height:1}
.mobile-nav .ic .lic{width:21px;height:21px}
.mobile-nav a.active .ic .lic{color:var(--primary)}

/* 等宽数字（金额 / KPI / 百分比 · 国际化财务对齐） */
.kpi .val,.kpi-val,.money,.num,.stat-val,.role-hero .rh-title{font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1,"lnum" 1}

/* 焦点可达性 ring（WCAG 无障碍） */
button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--primary);outline-offset:2px;border-radius:var(--radius-sm)}

/* 补齐新视图用到的 KPI 类（与现有 .kpi .val/.label 并存） */
.kpi-row{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.kpi-label{font-size:12px;color:var(--muted);font-weight:500;display:flex;align-items:center;gap:6px}
.kpi-val{font-size:26px;font-weight:700;margin-top:6px;letter-spacing:-.02em}
.kpi-sub{font-size:11px;color:var(--muted);margin-top:2px}
.kpi{position:relative;overflow:hidden}
.kpi-ic{position:absolute;right:13px;top:13px;color:var(--primary);opacity:.16}
.kpi-ic .lic{width:30px;height:30px}
.kpi.k-accent .kpi-ic{color:var(--accent)} .kpi.k-green .kpi-ic{color:var(--green)}
.kpi.k-red .kpi-ic{color:var(--red)} .kpi.k-amber .kpi-ic{color:var(--amber)} .kpi.k-primary .kpi-ic{color:var(--primary)}
.kpi{transition:box-shadow .15s,transform .15s} .kpi:hover{box-shadow:var(--shadow-lg);transform:translateY(-1px)}

/* 徽章内图标对齐（不改动徽章本体） */
.badge .lic{width:13px;height:13px;margin-right:-1px}
.badge{display:inline-flex;align-items:center;gap:4px}

/* 角色英雄区（工作台焦点头部） */
.role-hero{background:linear-gradient(135deg,var(--primary) 0%,var(--primary-600) 100%);color:#fff;border-radius:var(--radius);padding:18px 22px;margin-bottom:14px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;box-shadow:0 6px 20px rgba(0,98,204,.22)}
.role-hero .rh-greet{font-size:13px;opacity:.92}
.role-hero .rh-title{font-size:18px;font-weight:700;letter-spacing:-.01em;margin-top:1px}
.role-hero .rh-sub{font-size:12px;opacity:.85;margin-top:3px}
.role-hero .rh-actions{display:flex;gap:8px;flex-wrap:wrap}
.role-hero .rh-btn{background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.3);color:#fff;border-radius:var(--radius);padding:8px 13px;font-size:13px;font-weight:500;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:background .12s}
.role-hero .rh-btn:hover{background:rgba(255,255,255,.27)}
.role-hero .rh-btn .lic{width:16px;height:16px}

/* 表格 / 卡片 轻精修（增量） */
table tbody tr{transition:background .1s} table tbody tr:hover{background:var(--surface-2)}
.card h3 .lic{width:17px;height:17px;vertical-align:-3px;margin-right:5px;color:var(--primary)}

/* 焦点统计小卡（角色工作台用） */
/* v1.5.2 UI 审计补齐：focus-bar 横向 KPI 条（内含 stat-card，须 flex 否则竖向堆叠） */
.focus-bar{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.stat-card{flex:1 1 150px;min-width:140px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:13px 15px;box-shadow:var(--shadow);position:relative;overflow:hidden;transition:box-shadow .15s,transform .15s}
.stat-card:hover{box-shadow:var(--shadow-lg);transform:translateY(-1px)}
.stat-card .sc-label{font-size:12px;color:var(--muted);font-weight:500}
.stat-card .sc-val{font-size:22px;font-weight:700;margin-top:5px;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.stat-card .sc-sub{font-size:11px;color:var(--muted);margin-top:2px}
.stat-card .sc-ic{position:absolute;right:12px;top:12px;opacity:.16;color:var(--primary)} .stat-card .sc-ic .lic{width:28px;height:28px}
.stat-card.s-green .sc-ic{color:var(--green)} .stat-card.s-accent .sc-ic{color:var(--accent)} .stat-card.s-red .sc-ic{color:var(--red)} .stat-card.s-amber .sc-ic{color:var(--amber)}
.stat-card.clickable{cursor:pointer}

/* ===================== v58 体验组件 + 深色模式 + 无障碍 ===================== */
/* —— 深色主题变量:统一由文件尾 17-token 块定义 —— */
[data-theme="dark"] .sidebar{background:rgba(22,24,30,.9);border-right-color:rgba(255,255,255,.07);color:var(--ink-text)}
[data-theme="dark"] .sidebar .logo,[data-theme="dark"] .nav a,[data-theme="dark"] .user-chip .uc-name{color:var(--text)}   /* v2.2.11 欧#0:机器门禁揪出——原误用 --border 色致对比度1.39 */
[data-theme="dark"] .sidebar .logo .chip{background:#fff;border-color:rgba(255,255,255,.1)}
[data-theme="dark"] .sidebar .logo .sys,[data-theme="dark"] .nav-grp-h{color:var(--ink-text)}
[data-theme="dark"] .nav a:hover{background:rgba(255,255,255,.06)}
[data-theme="dark"] .nav a.active{background:var(--primary-50);color:var(--primary-600)}
[data-theme="dark"] .nav a.active:hover{background:var(--ink-4)}
[data-theme="dark"] .user-chip:hover,[data-theme="dark"] .user-chip.open{background:rgba(255,255,255,.07)}
[data-theme="dark"] .topbar{background:var(--surface);border-bottom-color:var(--border)}
[data-theme="dark"] .login-wrap{background:linear-gradient(135deg,#1a1d24 0%,#15171c 100%)}
[data-theme="dark"] .login-features{background:linear-gradient(135deg,#10213b 0%,#0a1426 100%)}
[data-theme="dark"] .field input,[data-theme="dark"] .field select,[data-theme="dark"] .field textarea{background:var(--surface);color:var(--text);border-color:var(--border)}
[data-theme="dark"] .mobile-nav{background:rgba(22,24,30,.92);border-top-color:var(--border)}
[data-theme="dark"] .btn{background:var(--surface-2);color:var(--text);border-color:var(--border)}
[data-theme="dark"] table thead th{color:var(--muted)}
[data-theme="dark"] .modal-mask{background:rgba(0,0,0,.6)}

/* —— 字号 / 对比度（无障碍） —— */
[data-fs="lg"] body{font-size:16px}
[data-fs="lg"] .kpi .val,[data-fs="lg"] .kpi-val,[data-fs="lg"] .stat-card .sc-val{font-size:26px}
[data-contrast="high"]{--border:#9aa4b2;--muted:#3f4855}
[data-contrast="high"][data-theme="dark"]{--border:#5b6573;--muted:#c2c9d3}
[data-contrast="high"] .nav a{font-weight:520}

/* —— 分段切换 seg —— */
.seg{display:inline-flex;background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius);padding:2px;gap:2px}
/* 经营分析卡片标题栏：窄屏（≤1366）收起卡片级「月/季/年」——工具条上同款且管全页，卡片改回跟随页面，
   换来「一行到底、标签不被卡片边缘裁掉」（用户 2026-09-17 要求紧凑不换行） */
/* 经营分析卡片标题栏的标签（口径/维度/指标/周期）：紧凑、不换行；窄屏再压一档，保证一行到底。
   选择器写成 .seg.exa-tag button：与 .seg button 同为按钮样式，靠更高特异性压过它（不依赖文件顺序） */
.seg.exa-tag button{font-size:10px;padding:1px 3px;white-space:nowrap}
@media (max-width:1366px){
  .exa-kind{display:none}
  .exa-range-sm [data-exarange="5y"]{display:none}   /* 经营趋势窗口：总表卡片窄，小屏只留 近1年 / 近3年 */
  .seg.exa-metric button{font-size:9.5px;padding:1px 2px}
}
.seg button{border:none;background:transparent;color:var(--muted);padding:5px 12px;border-radius:var(--radius);font-size:13px;font-weight:500;cursor:pointer;transition:all .12s;display:inline-flex;align-items:center;gap:5px}
.seg button:hover{color:var(--text)}
.seg button.on{background:var(--surface);color:var(--primary);box-shadow:var(--shadow);font-weight:600}
.seg button .lic{width:15px;height:15px}

/* —— 筛选 chip —— */
.chip-filter{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--border);background:var(--surface);color:var(--text);border-radius:var(--radius-full);padding:5px 12px;font-size:13px;cursor:pointer;transition:all .12s}
.chip-filter:hover{border-color:var(--primary);color:var(--primary)}
.chip-filter.on{background:var(--primary-50);border-color:var(--primary);color:var(--primary);font-weight:600}
.chip-filter .cf-x{opacity:.6;font-size:11px}

/* —— 骨架屏 —— */
@keyframes skel{0%{background-position:-200px 0}100%{background-position:calc(200px + 100%) 0}}
.skeleton{background:linear-gradient(90deg,var(--surface-2) 25%,rgba(127,127,127,.12) 37%,var(--surface-2) 63%);background-size:400px 100%;animation:skel 1.3s ease infinite;border-radius:var(--radius)}
.skel-wrap{display:flex;flex-direction:column;gap:10px;padding:4px}
.skel-row{height:46px}
.skel-row.sk-sm{height:20px;width:60%} .skel-row.sk-line{height:14px}

/* —— 空状态（插画风） —— */
.empty-state{text-align:center;padding:48px 24px;color:var(--muted)}
.empty-state .es-ic{width:64px;height:64px;margin:0 auto 14px;border-radius:var(--radius-lg);background:var(--primary-50);display:flex;align-items:center;justify-content:center;color:var(--primary)}
.empty-state .es-ic .lic{width:32px;height:32px;stroke-width:1.6}
.empty-state .es-title{font-size:14px;font-weight:600;color:var(--text)}
.empty-state .es-sub{font-size:13px;margin-top:5px;max-width:360px;margin-left:auto;margin-right:auto;line-height:1.6}
.empty-state .es-action{margin-top:16px}

/* —— 右侧抽屉 drawer —— */
.drawer-mask{position:fixed;inset:0;background:rgba(16,24,40,0);backdrop-filter:blur(0);z-index:60;display:flex;justify-content:flex-end;transition:background .22s}
.drawer-mask.open{background:rgba(16,24,40,.42);backdrop-filter:blur(2px)}
.drawer{width:min(560px,94vw);max-width:94vw;height:100%;background:var(--surface);box-shadow:-12px 0 40px rgba(16,24,40,.18);display:flex;flex-direction:column;transform:translateX(100%);transition:transform .26s cubic-bezier(.4,0,.2,1);overflow:hidden}
.drawer-mask.open .drawer{transform:translateX(0)}
.drawer-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border);flex-shrink:0}
.drawer-head h3{margin:0;font-size:16px}
.drawer-x{border:none;background:var(--surface-2);width:30px;height:30px;border-radius:var(--radius);cursor:pointer;color:var(--muted);font-size:14px}
.drawer-x:hover{background:var(--border);color:var(--text)}
.drawer-body{flex:1;overflow-y:auto;padding:18px 20px}
.drawer-foot{padding:12px 20px;border-top:1px solid var(--border);display:flex;gap:8px;justify-content:flex-end;flex-shrink:0;flex-wrap:wrap}

/* —— 面包屑 —— */
.breadcrumb{display:flex;align-items:center;gap:7px;font-size:13px;margin-bottom:12px;flex-wrap:wrap}
.breadcrumb .bc-link{color:var(--muted);cursor:pointer} .breadcrumb .bc-link:hover{color:var(--primary)}
.breadcrumb .bc-sep{color:var(--border)} .breadcrumb .bc-cur{color:var(--text);font-weight:600}

/* —— 健康度色阶条 —— */
.health-bar{height:4px;border-radius:var(--radius-sm);background:var(--border);overflow:hidden;margin-top:6px}
.health-bar i{display:block;height:100%;border-radius:var(--radius-sm)}
.health-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:5px;vertical-align:middle}

/* v60：超小按钮（团队总览审批用） */
.btn-xs{padding:2px 8px;font-size:11px;border-radius:var(--radius-sm);line-height:1.6}
.cal-team-col{min-width:240px;flex:1 1 240px}

/* 客户分类快捷筛选 chips */
.ccat-chip{padding:5px 11px;border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--surface);font-size:13px;cursor:pointer;color:var(--text);white-space:nowrap}
.ccat-chip:hover{border-color:var(--primary)}
.ccat-chip.on{background:var(--primary);color:#fff;border-color:var(--primary)}
.ccat-chip b{font-weight:700;margin-left:2px}

/* ==================== Agent 平台样式（v1.0.88+）==================== */
.agent-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px}
.agent-card{display:flex;gap:10px;align-items:flex-start;padding:10px;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface)}
.agent-icon{font-size:26px;flex-shrink:0;width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:var(--surface-2);border-radius:var(--radius)}
.agent-info{flex:1;min-width:0}
.agent-name{font-size:13px;font-weight:600;margin-bottom:2px}
.agent-desc{font-size:12px;color:var(--muted);line-height:1.4}
.agent-tags{margin-top:4px;display:flex;gap:4px;flex-wrap:wrap}
.agent-tag{font-size:11px;background:var(--surface-2);color:#555;padding:1px 6px;border-radius:var(--radius-sm)}
.switch-sm{font-size:12px;cursor:pointer;user-select:none}
.switch-sm input{margin-right:4px;vertical-align:middle}
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px}
.kpi{padding:12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);text-align:center}
.kpi .label{font-size:11px;color:var(--muted);margin-bottom:4px}
.kpi .val{font-size:22px;font-weight:700;color:var(--primary,var(--primary))}
.kv{display:flex;justify-content:space-between;align-items:center;padding:4px 0;border-bottom:1px solid var(--border);font-size:13px}
.kv:last-child{border-bottom:none}
.kv .k{color:var(--muted)}

/* 悬浮 AI 助手 */
#aiFab{position:fixed;right:20px;bottom:20px;z-index:900}
#aiFabBtn{width:52px;height:52px;border-radius:50%;border:none;background:linear-gradient(135deg,var(--primary),#2a7fd4);color:#fff;font-size:26px;cursor:pointer;box-shadow:0 4px 16px rgba(24,95,165,.35)}
#aiFabBtn:hover{transform:scale(1.05)}
#aiFabPanel{position:fixed;right:20px;bottom:84px;width:340px;max-width:calc(100vw - 40px);height:460px;max-height:calc(100vh - 120px);background:var(--surface,#fff);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:0 8px 32px rgba(0,0,0,.18);z-index:901;flex-direction:column;overflow:hidden}
/* ── 悬浮球停靠坞：三个球（🤖/🎤/⚔️）收进一个可拖动、可折叠的容器，避免固定遮挡正文 ── */
#fabDock{position:fixed;right:20px;bottom:20px;display:flex;align-items:center;gap:6px;z-index:900;touch-action:none;-webkit-user-select:none;user-select:none}
#fabDock.dragging{cursor:grabbing}
#fabStack{display:flex;flex-direction:column-reverse;align-items:center;gap:10px}
#fabDock.collapsed #fabStack{display:none}
#fabDock #aiFab{position:static;right:auto;bottom:auto;z-index:auto}   /* 覆盖原 fixed 定位（收纳后由坞统一摆放） */
#fabDockToggle{width:20px;height:44px;padding:0;border:1px solid rgba(16,24,40,.16);border-right:none;border-radius:8px 0 0 8px;background:linear-gradient(180deg,#fff,#eef2f7);color:#374151;font-size:16px;font-weight:700;line-height:1;cursor:grab;box-shadow:-2px 2px 8px rgba(16,24,40,.12)}
#fabDockToggle:hover{color:#fff;background:var(--primary);border-color:var(--primary)}
#fabDock.collapsed #fabDockToggle{width:24px;border-right:1px solid rgba(16,24,40,.16);border-radius:8px}
.aifab-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--border);background:var(--surface-2)}
.aifab-head b{flex:1;font-size:14px}
.aifab-head button{border:none;background:none;cursor:pointer;font-size:14px;color:var(--muted)}
.aifab-head .btn{background:var(--surface);border:1px solid var(--border);color:var(--primary,var(--primary));font-size:11px}
.aifab-body{flex:1;overflow-y:auto;padding:10px;display:flex;flex-direction:column;gap:8px}
.aifab-u{align-self:flex-end;background:var(--primary);color:#fff;padding:6px 10px;border-radius:var(--radius) 10px 2px 10px;font-size:12px;max-width:85%;white-space:pre-wrap}
.aifab-a{align-self:flex-start;background:var(--surface-2);padding:6px 10px;border-radius:var(--radius) 10px 10px 2px;font-size:12px;max-width:90%;white-space:pre-wrap;line-height:1.5}
.aifab-foot{display:flex;gap:6px;padding:8px;border-top:1px solid var(--border)}
.aifab-foot input{flex:1;padding:6px 9px;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:12px}

/* ===== AIChat 统一 Agent 对话组件（架构重构 Phase A：工作台内嵌/悬浮助手/模块内问 AI 同源复用）===== */
.aic-u{align-self:flex-end;background:var(--primary,var(--primary));color:#fff;border-radius:var(--radius) 10px 2px 10px;padding:9px 12px;font-size:13px;line-height:1.6;max-width:88%;white-space:pre-wrap;margin:2px 0}
.aic-a{align-self:flex-start;background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius) 10px 10px 2px;padding:9px 12px;font-size:13px;line-height:1.6;max-width:88%;white-space:pre-wrap;margin:2px 0}
.aic-starters{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.aic-actions{margin-top:8px;padding:8px;background:var(--accent-50);border:1px solid var(--accent-50);border-radius:var(--radius)}
.aic-actions-h{font-size:12px;font-weight:600;margin-bottom:6px}
.aic-act{display:block;font-size:12px;margin-bottom:3px;cursor:pointer}
.aic-act input{margin-right:5px}
.aic-act-btns{margin-top:6px}

/* ===== AI 工作台 Phase B：对话优先布局 + 注册驱动技能卡 ===== */
.ai-unified-banner{margin-bottom:12px;background:linear-gradient(135deg,var(--primary-50),#faf5ff);border:1px solid var(--border)}
.ai-chat-hero{display:flex;flex-direction:column;height:62vh;min-height:420px;padding:0;overflow:hidden}
.ai-chat-head{border-bottom:1px solid var(--border);padding:8px 14px;display:flex;align-items:center;gap:8px;font-size:13px}
.ai-chat-msgs{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}
.ai-chat-foot{border-top:1px solid var(--border);padding:10px;display:flex;gap:8px;align-items:center}
.ai-chat-foot input{flex:1;padding:9px 12px;border:1px solid var(--border);border-radius:var(--radius-lg);font-size:13px;outline:none}
.ai-chat-foot input:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-50)}
.ai-skill-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;margin-bottom:8px}
.ai-skill-card{display:flex;align-items:center;gap:10px;padding:11px 12px;border:1px solid var(--border);border-radius:var(--radius-sm,10px);background:var(--surface);cursor:pointer;transition:border-color .15s,box-shadow .15s,transform .15s}
.ai-skill-card:hover{border-color:var(--primary);box-shadow:0 2px 10px rgba(24,95,165,.08);transform:translateY(-1px)}
.ai-skill-ic{font-size:22px;line-height:1;flex:0 0 auto}
.ai-skill-meta{flex:1;min-width:0}
.ai-skill-name{font-size:13px;font-weight:600;color:var(--text)}
.ai-skill-desc{font-size:12px;color:var(--muted);margin-top:2px;line-height:1.4}
@media (max-width:560px){.ai-skill-grid{grid-template-columns:1fr}.ai-chat-hero{height:70vh}}

/* ===== v1.4.0 视图美观度补齐：统一表单/页头/表格/标签类，对齐 .field/.toolbar/.badge 设计令牌 ===== */
/* .input：独立输入类（v1.4.0 视图直接用于 input/select/textarea），样式对齐 .field input */
.input{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);outline:none;box-sizing:border-box}   /* v2.2.10 病根D:白底硬编码→变量,深色下18处.input恢复可读 */
.input:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-50)}
/* .fld：字段包裹类（部分视图用 .fld 替代 .field）；布局规则与 .field 共用，见上方「表单字段」段 */
.fld input,.fld select,.fld textarea{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);outline:none;box-sizing:border-box}
.fld input:focus,.fld select:focus,.fld textarea:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-50)}
/* .page-head：页头（标题 + 操作按钮），布局对齐 .toolbar */
.page-head{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:16px}
.page-head h2{margin:0;font-size:18px;font-weight:650;color:var(--text)}
.page-head h3{margin:0;font-size:14px;font-weight:600;color:var(--text)}
/* .tbl：表格标记类（table 元素本已有样式，此处显式声明以防覆盖、保证一致） */
.tbl{width:100%;border-collapse:collapse}
.tbl th{font-size:12px;color:var(--muted);font-weight:600;background:var(--surface-2);text-align:left;padding:11px 12px;border-bottom:1px solid var(--border)}
.tbl td{padding:11px 12px;border-bottom:1px solid var(--border);vertical-align:middle}
.tbl tbody tr:hover{background:var(--surface-2)}
/* .pill：小标签（闸门等），样式对齐 .badge */
.pill{display:inline-block;padding:2px 9px;border-radius:var(--radius-lg);font-size:12px;font-weight:600;line-height:1.6;white-space:nowrap;background:var(--surface-2);color:var(--text)}
/* 暗色主题适配 */
[data-theme="dark"] .input,[data-theme="dark"] .fld input,[data-theme="dark"] .fld select,[data-theme="dark"] .fld textarea{background:var(--surface);color:var(--text);border-color:var(--border)}
[data-theme="dark"] .tbl th{background:#1a1d23;color:var(--muted)}

/* ---------- 方案四:板块签名色(页题圆点,克制差异化) ---------- */
.page-head h2::before{content:"";display:inline-block;width:8px;height:8px;border-radius:var(--radius-full);
  background:var(--sig,var(--primary));margin-right:8px;vertical-align:2px}
#view[data-sig="sales"]{--sig:var(--primary)}
#view[data-sig="finance"]{--sig:var(--green)}
#view[data-sig="ai"]{--sig:var(--accent)}
#view[data-sig="ops"]{--sig:var(--amber)}
#view[data-sig="system"]{--sig:var(--muted)}

/* ---------- 方案六:暗色模式(跟随系统;html[data-theme] 手动三态覆盖) ---------- */
html[data-theme="dark"]{
  --bg:#0e1116; --surface:#161b22; --surface-2:#1b212b;
  --text:#e7eaf0; --muted:#98a2b3; --border:#2a3342;
  --primary:#6FA0D8; --primary-600:#8FB6E4; --primary-50:#1a2536;
  --accent:#F1954B; --accent-50:#2d2216;
  --green:#3FBF8F; --green-50:#122b20; --red:#E36A73; --red-50:#2d181b;
  --amber:#D9A441; --amber-50:#2a2211;
  --shadow:0 1px 3px rgba(0,0,0,.5),0 1px 2px rgba(0,0,0,.4);
  --shadow-lg:0 10px 30px rgba(0,0,0,.55);
}
html[data-theme="dark"] img.logo{filter:brightness(1.15)}

/* v2.2.2 P2-9:移动端触达增强——seg 分段与小按钮最小 36px 高 */
@media (max-width: 768px){
  .seg button{ min-height:36px; }
  .btn-sm{ min-height:36px; padding-top:7px; padding-bottom:7px; }
}

/* v2.2.14 冯⑥:字段级校验样式 */
.fe-bad{border-color:var(--red) !important; box-shadow:0 0 0 3px var(--red-50) !important}
.fe-msg{color:var(--red); font-size:12px; margin-top:4px}

/* 工作台页面：#view 变 flex 锁高，禁止整页滚动 */
#view:has(.wb-3col){display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden;padding:8px 12px}
.main:has(.wb-3col){overflow:hidden}
/* 组织管理页面：#view 变 flex 锁高，#sysBody 撑满剩余高度，消除底部空白 */
#view:has(.org-split-wrap){display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}
.main:has(.org-split-wrap){overflow:hidden}
#view:has(.org-split-wrap) > div:first-child{flex-shrink:0}
#view:has(.org-split-wrap) > #sysBody{flex:1;min-height:0;display:flex;flex-direction:column}
/* 组织树节点 */
.org-tree-node{display:flex;align-items:center;gap:4px;padding:6px 8px;border-radius:6px;cursor:default;transition:background .12s}
.org-tree-node:hover{background:var(--surface-2)}
.org-tree-node.active{background:rgba(91,141,239,.12);font-weight:600}
.org-tree-node .org-tree-menu:hover{color:var(--primary)}
/* 三点菜单弹窗 */
.org-menu-pop{position:fixed;z-index:99999;background:var(--surface);border:1px solid var(--border);border-radius:8px;box-shadow:0 4px 16px rgba(0,0,0,.15);padding:4px;min-width:110px}
.org-menu-item{padding:6px 14px;cursor:pointer;border-radius:6px;font-size:13px;transition:background .12s}
.org-menu-item:hover{background:var(--surface-2)}
.org-menu-item.org-menu-danger{color:var(--red)}
.org-menu-item.org-menu-danger:hover{background:rgba(239,68,68,.08)}
.org-menu-item.org-menu-disabled{color:var(--muted);cursor:not-allowed;background:var(--surface-2);opacity:.7}
.org-menu-item.org-menu-disabled:hover{background:var(--surface-2)}
.org-menu-item[data-tip]{position:relative}
.org-menu-item[data-tip]::after{content:attr(data-tip);position:absolute;left:calc(100% + 8px);top:50%;transform:translateY(-50%);background:#1a1a2e;color:#fff;padding:5px 10px;border-radius:6px;font-size:12px;font-weight:400;white-space:nowrap;z-index:100000;opacity:0;pointer-events:none;transition:opacity .05s;box-shadow:0 2px 8px rgba(0,0,0,.2)}
.org-menu-item[data-tip]:hover::after{opacity:1}
/* CRM 账号开关（toggle switch） */
.org-sw{position:relative;display:inline-flex;align-items:center;width:auto;height:18px;cursor:pointer}
.org-sw input{opacity:0;width:0;height:0;position:absolute}
.org-sw-slider{position:relative;width:34px;height:18px;background:var(--surface-2);border:1px solid var(--border);border-radius:12px;transition:.2s;flex-shrink:0}
.org-sw-slider:before{content:"";position:absolute;width:12px;height:12px;left:2px;top:2px;background:var(--muted);border-radius:50%;transition:.2s}
.org-sw input:checked + .org-sw-slider{background:var(--primary);border-color:var(--primary)}
.org-sw input:checked + .org-sw-slider:before{transform:translateX(16px);background:#fff}
.org-sw-txt{font-size:11px;color:var(--muted);margin-left:6px;white-space:nowrap}
.org-sw input:checked ~ .org-sw-txt{color:var(--primary);font-weight:600}
/* v2.2.16 工作台三栏布局（定高撑满可视区：三列等高、侧栏内部滚动、无底部空白） */
.wb-3col{display:flex;gap:14px;align-items:stretch;flex:1;min-height:0;overflow:hidden}
.wb-col{min-height:0}
.wb-left{flex:0 0 260px;max-width:380px;min-height:0;max-height:100%;overflow-y:auto;display:flex;flex-direction:column;gap:8px}
.wb-center{flex:1 1 0;min-width:0;display:flex;flex-direction:column}
.wb-right{flex:0 0 320px;max-width:340px;min-height:0;max-height:100%;overflow-y:auto;display:flex;flex-direction:column;gap:6px}
.wb-center .wb-chat-wrap{flex:1;min-height:0}
/* 工作台图表容器：flex 自适应，不写死高度 */
.wb-left .card > div[id]{flex:1 1 auto;min-height:0;overflow:hidden}
.wb-left .card{display:flex;flex-direction:column}
.wb-left > *{flex:1 1 auto;min-height:0}
.wb-left .card,.wb-right .card{margin-bottom:0!important}
.wb-left > *{display:flex;flex-direction:column;gap:8px}
.wb-left > * > .card:last-child{flex:1 1 auto;min-height:0}
.wb-left > *:empty{display:none}
/* 销售左栏（含排名看板等列表卡）：卡片保持自然高度、栏内滚动——不再按可视区等分压缩裁剪内容 */
.wb-left-scroll > *{flex:0 0 auto;min-height:0}
.wb-left-scroll > * > .card:last-child{flex:0 0 auto;min-height:0}
.wb-left-scroll .card{flex:0 0 auto}
.wb-left-scroll #tbCard > div[id]{flex:0 0 auto;min-height:0;overflow:visible}
.wb-right .card{flex:0 0 auto;padding:12px 14px}
.wb-right .card.wb-approval{flex:1 1 auto;min-height:120px;overflow-y:auto}
/* 右栏「📋 待办」卡（销售 / 销售主管）：卡高固定为约半屏、列表在卡内滚动——
   待办条数多时不再被内容顶高，把下方「今日日程」挤到屏幕底部 */
.wb-right .card.wb-todo-card{flex:0 0 auto;height:50vh;min-height:200px}
/* 工作台右栏卡片紧凑化 */
.wb-right .card h3{margin:0 0 8px;font-size:13px}
.wb-3col{gap:10px}
/* v2.2.17 工作台单行事项行：一件事一行、固定字号不缩放不截断；行内只放短标题+紧凑状态，完整信息点击弹窗查看 */
.wb1{display:flex;align-items:center;gap:8px;min-width:0;max-width:100%;padding:6px 4px;border-bottom:1px dashed var(--border);font-size:12.5px;line-height:1.4;cursor:pointer;border-radius:5px;overflow:hidden;white-space:nowrap}
.wb1:last-child{border-bottom:none}
.wb1:hover{background:var(--surface-2,#f6f9fc)}
.wb1 .t{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;font-weight:600;color:var(--text)}
.wb1 .m{flex:0 0 auto;white-space:nowrap;font-size:11px;color:var(--muted);text-align:right}
.wb1 .arr{flex:0 0 auto;color:var(--muted);font-size:13px;line-height:1}
/* 销售待办（LTC 行动项）：首行=对象+紧迫度徽标，次行=要我做的事 */
.wb1-todo{flex-wrap:wrap;white-space:normal;align-items:center}
.wb1-todo .act{flex:1 1 100%;font-size:11px;color:var(--muted);line-height:1.35;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wb1-over{background:var(--red-50,#fff0f0)}
.wb-left .card,.wb-right .card{min-width:0;max-width:100%;overflow:hidden}
.wb-starter-card:hover{border-color:var(--primary)!important;box-shadow:0 2px 10px rgba(24,95,165,.1);transform:translateY(-1px)}
/* 对话消息气泡 */
.wb-msg-user{text-align:right;margin:5px 0}
.wb-msg-ai{margin:5px 0;display:flex;align-items:flex-start;gap:4px}
.wb-bubble-user{display:inline-block;background:var(--primary);color:#fff;padding:6px 11px;border-radius:12px;font-size:13px;text-align:left;word-break:break-word}
.wb-bubble-ai{display:block;background:var(--surface-2,#f1f3f5);padding:7px 11px;border-radius:12px;font-size:13px;white-space:pre-wrap;line-height:1.55;word-break:break-word}
.wb-tts-btn{background:none;border:none;cursor:pointer;padding:2px 4px;color:var(--muted);flex-shrink:0;display:inline-flex;align-items:center;border-radius:4px}
.wb-tts-btn:hover{color:var(--primary);background:rgba(91,141,239,.10)}
/* 大屏(≥1280px):示例卡片加宽 */
@media(min-width:1280px){
  .wb-starter-grid{max-width:560px!important;gap:12px!important}
  .wb-starter-card{padding:16px 12px!important}
}
/* 超宽屏(≥1600px):示例卡片进一步加宽 */
@media(min-width:1600px){
  .wb-starter-grid{max-width:720px!important;gap:14px!important}
}
/* 多标签页 */
.wb-tab-btn:hover{color:var(--primary);background:rgba(91,141,239,.10)}
.wb-tab:hover{background:var(--surface,#fff)}
.wb-tab-close:hover{color:var(--red)!important;background:rgba(239,68,68,.10)}
.wb-tab-bar-expanded{max-height:none!important;overflow:visible!important;flex-wrap:wrap}
.wb-tab-bar-expanded .wb-tab{max-width:none!important}
/* 会话列表下拉面板 */
.wb-chatlist-item:hover{background:rgba(91,141,239,.06)!important}
.wb-chatlist-del:hover{color:var(--red)!important;background:rgba(239,68,68,.10)}
@media(max-width:800px){
  .wb-3col{flex-direction:column;height:auto;overflow:visible}
  /* 窄屏三栏纵向堆叠：侧栏按内容自然高度（原来 flex:1 1 auto + max-height:100% 会被压成可视区等分，内容溢出到相邻栏上） */
  .wb-left,.wb-right{flex:0 0 auto;max-width:none;max-height:none;overflow:visible}
  .wb-center{min-height:300px}
  .main:has(.wb-3col){overflow-y:auto}
  #view:has(.wb-3col){overflow:visible;padding:14px}
  .wb-left .card,.wb-right .card{flex:0 0 auto}
  .wb-left .card > div[id]{min-height:200px}
}
@media(max-width:800px){
  #view:has(.org-split-wrap){overflow:visible;padding:14px}
  .main:has(.org-split-wrap){overflow-y:auto}
  .org-split-wrap{flex:0 0 auto}
  .org-split-wrap > div:last-child{flex-direction:column;min-height:380px}
  .org-split-wrap > div:last-child > .card{width:auto;flex:1 1 auto;max-height:none}
}
/* 对话消息区滚动条 */
.wb-chat-wrap #wbAiHist::-webkit-scrollbar{width:5px}
.wb-chat-wrap #wbAiHist::-webkit-scrollbar-thumb{background:rgba(0,0,0,.14);border-radius:3px}
/* 深色模式对话区 */
[data-theme="dark"] .wb-chat-head{background:rgba(255,255,255,.04);border-bottom-color:rgba(255,255,255,.08)}
[data-theme="dark"] .wb-chat-quick{background:rgba(255,255,255,.04);border-top-color:rgba(255,255,255,.08)}
[data-theme="dark"] .wb-chat-input{border-top-color:rgba(255,255,255,.08)}
/* 语音输入按钮：竖直话筒图标 + 录音中绿色闪动波纹 */
.wb-mic-btn:hover{color:var(--primary);background:rgba(91,141,239,.10)}
.wb-mic-btn.wb-mic-rec{animation:wbMicRec 0.8s ease-in-out infinite}
@keyframes wbMicRec{0%,100%{box-shadow:0 0 0 0 rgba(34,197,94,.5);opacity:1}50%{box-shadow:0 0 0 7px rgba(34,197,94,0);opacity:.85}}
/* AI 富卡片：思考/工具调用/文档/技能沉淀 */
.wb-thinking-card{background:var(--surface-2,#f6f9fc);border:1px solid var(--border,#eee);border-radius:8px;padding:6px 10px;cursor:pointer;font-size:12px;color:var(--muted);transition:background .12s;max-width:100%;width:fit-content;min-width:0}
.wb-thinking-card:hover{background:rgba(91,141,239,.06)}
.wb-thinking-head{font-weight:600;color:var(--text);display:flex;align-items:center;gap:6px}
.wb-card-toggle-hint{font-weight:400;font-size:11px;color:var(--muted)}
.wb-thinking-body{margin-top:6px;padding-top:6px;border-top:1px dashed var(--border,#eee);font-size:12px;line-height:1.55;color:var(--text);white-space:pre-wrap;word-break:break-word;max-width:480px}
.wb-tool-card{background:rgba(91,141,239,.06);border:1px solid rgba(91,141,239,.18);border-radius:8px;padding:6px 10px;font-size:11px;cursor:pointer;max-width:100%;width:fit-content;min-width:0;transition:background .12s}
.wb-tool-card:hover{background:rgba(91,141,239,.10)}
.wb-tool-head{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;color:var(--text);white-space:nowrap}
.wb-tool-name{font-weight:600}
.wb-tool-status{font-size:11px;font-weight:600}
.wb-tool-args{color:var(--muted);font-size:10px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wb-tool-detail{margin-top:4px;padding-top:4px;border-top:1px dashed rgba(91,141,239,.15)}
.wb-tool-result{font-size:11px;color:var(--muted);white-space:pre-wrap;word-break:break-word;max-height:120px;overflow-y:auto;max-width:480px}
.wb-doc-icon{font-size:16px;flex-shrink:0}
.wb-doc-name{flex:1;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wb-doc-link{color:var(--primary);text-decoration:none;font-size:11px;flex-shrink:0;padding:2px 8px;border:1px solid var(--primary);border-radius:4px;transition:all .12s}
.wb-doc-link:hover{background:var(--primary);color:#fff}
.wb-skill-tip{display:flex;align-items:center;gap:8px;padding:6px 10px;background:rgba(245,166,35,.08);border:1px solid rgba(245,166,35,.25);border-radius:8px;font-size:12px}
.wb-skill-tip-text{flex:1;color:var(--text);line-height:1.4}
.wb-skill-save-btn{background:var(--primary);color:#fff;border:none;border-radius:4px;padding:3px 10px;font-size:11px;cursor:pointer;flex-shrink:0;transition:opacity .12s}
.wb-skill-save-btn:hover{opacity:.85}
/* v2.2.15 AI 流式：三点跳动"思考中"动画 */
.wb-typing{display:inline-flex;gap:4px;align-items:center;padding:4px 0}
.wb-typing span{width:8px;height:8px;border-radius:50%;background:var(--muted,#999);animation:wbTyping 1.2s infinite}
.wb-typing span:nth-child(2){animation-delay:.2s}
.wb-typing span:nth-child(3){animation-delay:.4s}
@keyframes wbTyping{0%,60%,100%{opacity:.3;transform:translateY(0)}30%{opacity:1;transform:translateY(-4px)}}
/* v2.2.15 AI Markdown 渲染：气泡内重置 white-space，让 <pre>/<p>/<ul>/<table> 正常排版 */
.wb-bubble-ai.wb-md{white-space:normal}
.wb-bubble-ai.wb-md p{margin:0 0 6px}
.wb-bubble-ai.wb-md p:last-child{margin-bottom:0}
.wb-bubble-ai.wb-md h3,.wb-bubble-ai.wb-md h4{margin:8px 0 4px;font-weight:600;line-height:1.3}
.wb-bubble-ai.wb-md h3{font-size:14px}
.wb-bubble-ai.wb-md h4{font-size:13px}
.wb-bubble-ai.wb-md ul,.wb-bubble-ai.wb-md ol{margin:4px 0;padding-left:20px}
.wb-bubble-ai.wb-md li{margin:2px 0}
.wb-bubble-ai.wb-md code{background:rgba(0,0,0,.06);padding:1px 4px;border-radius:3px;font-size:12px;font-family:ui-monospace,Menlo,Consolas,monospace}
.wb-bubble-ai.wb-md pre{background:rgba(0,0,0,.06);border-radius:6px;padding:8px 10px;margin:6px 0;overflow-x:auto;white-space:pre}
.wb-bubble-ai.wb-md pre code{background:none;padding:0;font-size:12px}
.wb-bubble-ai.wb-md table{border-collapse:collapse;margin:6px 0;width:auto;max-width:100%}
.wb-bubble-ai.wb-md td{border:1px solid var(--border,#ddd);padding:3px 8px;font-size:12px}
.wb-bubble-ai.wb-md strong{font-weight:600}
.wb-thinking-body.wb-md{white-space:normal}
/* 输入框工具栏按钮 */
.wb-tool-btn{background:var(--surface,#fff);border:1px solid var(--border,#ddd);border-radius:6px;padding:3px 8px;font-size:11px;color:var(--muted);cursor:pointer;transition:all .12s;white-space:nowrap}
.wb-tool-btn:hover{border-color:var(--primary);color:var(--primary);background:rgba(91,141,239,.04)}
.wb-input-chip{display:inline-flex;align-items:center;gap:4px;background:rgba(91,141,239,.10);border:1px solid rgba(91,141,239,.25);border-radius:12px;padding:2px 8px;font-size:11px;color:var(--primary)}
.wb-chip-x{cursor:pointer;font-size:14px;line-height:1;opacity:.6;transition:opacity .12s}
.wb-chip-x:hover{opacity:1}
.wb-opt-item:hover{background:rgba(91,141,239,.06)!important}
/* 深色模式富卡片 */
[data-theme="dark"] .wb-thinking-card{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.08)}
[data-theme="dark"] .wb-tool-card{background:rgba(91,141,239,.10);border-color:rgba(91,141,239,.20)}
[data-theme="dark"] .wb-doc-item{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.08)}
[data-theme="dark"] .wb-skill-tip{background:rgba(245,166,35,.10);border-color:rgba(245,166,35,.20)}
[data-theme="dark"] .wb-tool-btn{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.10);color:var(--muted)}
/* 权限请求卡片（ask_user 弹窗入口） */
.wb-perm-card{background:rgba(245,166,35,.08);border:1px solid rgba(245,166,35,.25);border-radius:8px;padding:8px 12px;font-size:12px;max-width:100%;width:fit-content}
.wb-perm-btn:hover{opacity:.85}
.wb-perm-cand:hover{background:var(--primary)!important;color:#fff!important}
[data-theme="dark"] .wb-perm-card{background:rgba(245,166,35,.10);border-color:rgba(245,166,35,.20)}
/* 紧凑表格：收紧行高 */
.tbl-compact th,.tbl-compact td{padding:6px 10px;font-size:12.5px}
.tbl-compact .btn-sm{padding:2px 8px;font-size:11.5px}
/* 组织管理：左侧部门树 */
.org-tree-node{padding:6px 8px;border-radius:6px;cursor:pointer;transition:background .12s;font-size:13px;color:var(--text);font-weight:500;display:flex;align-items:center;gap:4px}
.org-tree-node:hover{background:var(--surface-2)}
.org-tree-node.active{background:var(--primary-50);color:var(--primary);font-weight:600}
.org-tree-node .badge{font-size:9px}
.org-tree-menu:hover{color:var(--text)}
.org-menu-item{padding:7px 14px;font-size:13px;cursor:pointer;border-radius:4px;color:var(--text)}
.org-menu-item:hover{background:var(--surface-2)}
.org-menu-danger{color:var(--red)}
.org-menu-danger:hover{background:var(--red-50)}


/* ============ 市场地图 / 客户地图 / 客户画像（v2.3.21） ============ */
.mm-top{display:grid;grid-template-columns:1.05fr .8fr 1.15fr;gap:16px;margin-top:14px}
/* 市场地图：左侧看盘子 + 右侧「阶段客户」栏（阶段页签 → 该阶段客户清单） */
.mm-wrap{display:block}   /* 单列：阶段栏已移出本页（归「客户开发」），不再预留右栏 */
.mm-colmain{min-width:0}
.mm-rail{position:sticky;top:8px}
.mm-rail-h{font-size:13px;font-weight:600;margin-bottom:6px}
.mm-stages{display:flex;flex-direction:column;gap:4px}
.mm-stage{display:flex;align-items:center;justify-content:space-between;gap:6px;cursor:pointer;font-size:12px;
  padding:5px 8px;border-radius:8px;border:1px solid transparent;color:var(--muted)}
.mm-stage:hover{background:var(--surface-2)}
.mm-stage.on{border-color:color-mix(in srgb,var(--c) 45%,transparent);background:color-mix(in srgb,var(--c) 12%,transparent);color:var(--c);font-weight:600}
.mm-stage b{font-variant-numeric:tabular-nums}
.mm-stage-list{margin-top:8px;max-height:360px;overflow-y:auto;display:flex;flex-direction:column;gap:4px}
.mm-crow{cursor:pointer;border:1px solid var(--border);border-radius:8px;padding:5px 7px;transition:border-color .12s,box-shadow .12s}
.mm-crow:hover{border-color:var(--primary);box-shadow:0 2px 8px rgba(47,125,225,.12)}
.mm-cr-t{display:flex;align-items:center;gap:5px;font-size:12px}
.mm-cr-f{font-size:11px;margin-top:2px}
@media (max-width:1300px){ .mm-wrap{grid-template-columns:1fr} .mm-rail{position:static} }
/* 顶部 4 张规模/金额/风险卡（阶段计数在右栏，不在此重复） */
.mm-sum{display:grid;grid-template-columns:repeat(4,minmax(140px,1fr));gap:14px;margin-bottom:10px}
@media (max-width:1200px){ .mm-sum{grid-template-columns:1fr 1fr} }
@media (max-width:700px){ .mm-sum{grid-template-columns:1fr} }
.mm-rlist{display:flex;flex-direction:column;gap:6px;max-height:300px;overflow-y:auto;padding-right:2px}
.mm-rrow{cursor:pointer;border:1px solid var(--border);border-radius:8px;padding:6px 8px;transition:border-color .12s,box-shadow .12s}
.mm-rrow:hover{border-color:var(--primary);box-shadow:0 2px 10px rgba(47,125,225,.12)}
.mm-rr-t{display:flex;align-items:center;gap:6px;font-size:12px;margin-bottom:5px}
.mm-rr-t .muted{margin-left:auto;font-size:11px;white-space:nowrap}
.mm-rr-flag{color:var(--red);font-size:11px}
.mm-rc-bar{display:flex;height:6px;border-radius:3px;overflow:hidden;background:var(--surface-2);gap:1px}
.mm-rc-bar i{display:block;min-width:3px}
@media (max-width:1200px){ .mm-top{grid-template-columns:1fr} .mm-rlist{max-height:none} }
.mm-flag{display:inline-block;font-size:10px;padding:1px 6px;border-radius:4px;margin-right:4px;
  background:color-mix(in srgb,var(--amber,#c98a00) 14%,transparent);color:var(--amber,#c98a00);border:1px solid color-mix(in srgb,var(--amber,#c98a00) 35%,transparent)}
.mm-flag.red{background:rgba(208,2,27,.10);color:#d0021b;border-color:rgba(208,2,27,.32)}
.mm-flag.amber{background:rgba(201,138,0,.12);color:#a87200;border-color:rgba(201,138,0,.32)}
.cm-row:hover{background:var(--surface-2)}
[data-theme="dark"] .mm-flag.red{background:rgba(208,2,27,.22)}

/* 客户地图：图例与点位明细（v2.3.21） */
.cm-legend{display:flex;gap:10px;flex-wrap:wrap;align-items:center;padding:6px 8px;margin-top:6px;
  background:var(--surface-2);border:1px solid var(--border);border-radius:8px;font-size:12px}
.cm-lg{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
.cm-lg b{font-variant-numeric:tabular-nums}
.cm-lg i{display:inline-block;width:10px;height:10px;border-radius:50%}
.cm-lg i.ring{background:transparent;border:2.5px solid #d0021b}
.cm-dim{color:var(--muted)}
.cm-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px;vertical-align:middle}
tr.cm-row-on{background:color-mix(in srgb,var(--primary) 10%,transparent)!important;box-shadow:inset 3px 0 0 var(--primary)}
.cm-idx{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 4px;
  border-radius:9px;background:var(--primary);color:#fff;font-size:11px;font-weight:700;font-variant-numeric:tabular-nums}
/* 单客户状态图（五维雷达 + 阶段链 + 动作进度）（v2.3.21） */
.viz-wrap{display:flex;gap:10px;flex-wrap:wrap;background:var(--surface-2);border:1px solid var(--border);border-radius:10px;padding:8px}
.viz-radar-box{flex:0 1 420px;min-width:360px}
.viz-side{flex:1 1 300px;min-width:240px;display:flex;flex-direction:column;gap:5px;justify-content:center}
.viz-line{display:flex;align-items:center;gap:6px;font-size:12px;flex-wrap:wrap}
.viz-lb{color:var(--muted);min-width:52px}
.viz-stage{padding:2px 9px;border-radius:999px;background:var(--surface);border:1px solid var(--border);font-size:12px;color:var(--muted)}
.viz-stage.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
.viz-stage.warn{background:rgba(201,138,0,.14);border-color:rgba(201,138,0,.4);color:#a87200}
.viz-arrow{color:var(--muted);margin:0 2px}
.viz-bar{display:inline-block;width:120px;height:7px;border-radius:4px;background:var(--surface);border:1px solid var(--border);overflow:hidden;vertical-align:middle}
.viz-bar i{display:block;height:100%;background:var(--primary)}
.viz-dims{display:grid;grid-template-columns:1fr;gap:2px;margin-top:4px;padding-top:6px;border-top:1px dashed var(--border)}
.viz-dim{display:flex;align-items:baseline;gap:8px;font-size:11px}
.viz-dim .viz-dn{min-width:62px;color:var(--text-2,#4b5563)}
.viz-dim b{font-variant-numeric:tabular-nums;min-width:26px}
.viz-dim .muted{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.viz-dim.viz-zero .viz-dn,.viz-dim.viz-zero b{color:var(--muted);opacity:.75}

/* 客户画像：典型画像卡一行两张（窄屏自动一列） */
.pf-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-items:start}
@media (max-width:1100px){ .pf-grid{grid-template-columns:1fr} }

/* 沟通记录输入框内的语音按钮：右下角小方块 + 竖条声波图标（录音中变红） */
.inp-mic-wrap{position:relative;display:block;line-height:0}
.inp-mic-btn{position:absolute;right:10px;bottom:10px;width:46px;height:46px;padding:0;display:inline-flex;align-items:center;justify-content:center;
  font-size:20px;
  border:1px solid var(--primary);border-radius:9px;background-color:var(--primary);color:#fff;cursor:pointer;
  box-shadow:0 2px 6px rgba(16,24,40,.28);transition:transform .12s}
.inp-mic-btn:hover{background:var(--primary-600,var(--primary));transform:translateY(-1px)}
.inp-mic-btn:active{transform:none}
.inp-mic-btn.rec{background-color:#d64550;border-color:#d64550;color:#fff;box-shadow:0 0 0 4px rgba(233,80,80,.22);animation:micPulse 1.2s ease-in-out infinite}
@keyframes micPulse{0%,100%{box-shadow:0 0 0 3px rgba(233,80,80,.20)}50%{box-shadow:0 0 0 7px rgba(233,80,80,.10)}}

/* 客户地图/经营的计数卡：卡片间 10px 间距（原先是一整条连体条、无间距） */
.mm-counts{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:10px}
.mm-c{flex:1 1 0;min-width:132px;display:flex;flex-direction:column;gap:1px;padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);box-shadow:var(--shadow)}
.mm-c i{font-style:normal;font-size:11px;color:var(--muted);white-space:nowrap}
.mm-c b{font-size:17px;font-weight:700;font-variant-numeric:tabular-nums;color:color-mix(in srgb,var(--c,var(--text)) 82%,var(--text))}
.mm-c s{text-decoration:none;font-size:10.5px;color:var(--muted);white-space:nowrap}
.mm-c-warn b{color:var(--amber,#c98a00)}
/* 客户经营页 KPI 条（9 项）：固定列数网格，行行填满，杜绝末行只剩一项的落单
   —— 宽屏一行 9 个、中屏 3×3、窄屏 2 列；列数取 9 的约数，任何宽度都不会出现单项独占一行 */
/* v2.3.22 客户经营明细表：字号与页面其它文字一致（td 默认继承 14px 偏大）+ 紧凑行距 */
#opsCustList th{font-size:11.5px;padding:5px 8px}
#opsCustList td{font-size:12px;padding:5px 8px}
#opsCustList td .muted{font-size:11px}

.mm-two .table-wrap table{table-layout:auto;width:max-content;min-width:100%}
.mm-two .table-wrap th,.mm-two .table-wrap td{padding:4px 8px;font-size:12px;white-space:nowrap}
.mm-two .table-wrap th:first-child,.mm-two .table-wrap td:first-child{min-width:66px}
.mm-two .table-wrap .st-chip,.mm-two .table-wrap .mm-flag{font-size:11px;padding:1px 6px}

.ops-counts{display:grid;grid-template-columns:repeat(9,minmax(0,1fr));gap:8px 12px;align-items:stretch}
.ops-counts .mm-c{min-width:0;padding:7px 10px}
@media (max-width:1400px){ .ops-counts{grid-template-columns:repeat(3,minmax(0,1fr))} }
@media (max-width:820px){ .ops-counts{grid-template-columns:repeat(2,minmax(0,1fr))} }
/* 客户地图：省级明细 与 风险客户 并排（窄屏回落单列） */
/* 客户地图两栏：右列（风险客户）必须与左列等高——align-items:start 时右列仅按内容高，
   无数据时塌成一行、下方留大片空白（用户反馈"卡片高度没对齐/底部间距不一样"） */
.mm-two{display:grid;grid-template-columns:1.05fr 1fr;gap:16px;align-items:stretch;margin-top:14px}
.mm-two-col{min-width:0;display:flex;flex-direction:column}
.mm-two-col .table-wrap{flex:1 1 auto;min-height:180px}
.mm-two-col h3{margin:0 0 6px;font-size:13px}
@media (max-width:1200px){ .mm-two{grid-template-columns:1fr} }

/* ===== 客户阶段（事实驱动）与经营标签：阶段 chip / 标签 / 展开行 ===== */
.st-chip{display:inline-flex;align-items:center;gap:3px;padding:1px 7px;margin:1px 3px 1px 0;border-radius:999px;
  font-size:11px;line-height:17px;white-space:nowrap;border:1px solid var(--border);background:var(--surface-2);color:var(--text)}
.st-chip.st-prospect{border-color:#8a94a6;background:#8a94a61f}
.st-chip.st-developing{border-color:#2478c9;background:#2478c91f}
.st-chip.st-lead{border-color:#0ea5e9;background:#0ea5e91f}
.st-chip.st-opportunity{border-color:#e0892f;background:#e0892f1f}
.st-chip.st-contract{border-color:#9333ea;background:#9333ea1f}
.st-chip.st-receipt{border-color:#16a34a;background:#16a34a1f}
.st-chip.st-active{border-color:#0d9488;background:#0d94881f}
.st-tag{display:inline-flex;align-items:center;gap:2px;padding:1px 6px;margin-left:4px;border-radius:4px;
  font-size:10.5px;line-height:16px;background:var(--surface-2);border:1px dashed var(--border);color:var(--muted);white-space:nowrap}
.st-kind{font-size:11px;white-space:nowrap}
.st-live{font-size:10.5px;color:var(--primary);font-weight:600}
.dev-ext{display:inline-block;width:14px;color:var(--primary);font-weight:700;cursor:pointer;user-select:none}
tr.dev-items > td{border-top:1px dashed var(--border)}
tr.dev-items table{font-size:12px}
tr.dev-items table th{font-weight:600;color:var(--muted)}

/* ==================== 日历月视图（页内撑满）====================
   v2.3.24：月视图＝页内卡片，去掉下方「事项明细」卡后 #view 锁高（与工作台 .wb-3col、
   组织管理 .org-split-wrap 同一套做法），月格用 grid-auto-rows:minmax(0,1fr) 把留出的空隙填满，
   整月一屏看全、页面不滚动；格内事项多时单元格自身滚动。 */
#view:has(.cal-month){display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}
.main:has(.cal-month){overflow:hidden}
.cal-month{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
.cal-month-card{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
.cal-month-head{flex:0 0 auto;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px}
.cal-month-grid{flex:1 1 auto;min-height:0;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));grid-auto-rows:minmax(0,1fr);gap:6px}
.cal-month-cell{min-height:0;overflow:auto}
@media(max-width:800px){
  /* 窄屏：不锁高，月格保底 96px 由页面滚动（7 列在窄屏本就挤不进一屏） */
  .main:has(.cal-month){overflow-y:auto}
  #view:has(.cal-month){overflow:visible}
  .cal-month,.cal-month-card{flex:0 0 auto}
  .cal-month-grid{grid-auto-rows:minmax(96px,auto)}
  .cal-month-cell{min-height:96px}
}

/* ==================== 伙伴经营 360（独立页：#/channel/{id}）（v2.3.24） ====================
   设计：一屏四段（身份条 → 状态图与体检 → 三栏 关系/动作/风险 → 业绩凭据）；
   宽屏三栏并列（体现 关系→动作→风险 的因果链），窄屏降为页签。判据与颜色全部由服务端下发。 */
.flexgap{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.b-gray{background:var(--surface-2);color:var(--muted)}
.pi-head .spacer{flex:1}
.pi-head .badge{white-space:nowrap}
/* 体检四格：点格跳转对应栏 */
.census{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.cen{border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;background:var(--surface);cursor:pointer;transition:box-shadow .12s,transform .12s}
.cen:hover{box-shadow:var(--shadow);transform:translateY(-1px)}
.cen i{font-style:normal;font-size:11px;color:var(--muted);display:block}
.cen b{font-size:16px;font-weight:700;font-variant-numeric:tabular-nums}
.cen .bar{height:6px;border-radius:4px;background:var(--surface-2);overflow:hidden;margin:6px 0 3px}
.cen .bar>i{display:block;height:100%;background:var(--primary)}
.cen.ok b{color:var(--green)} .cen.ok .bar>i{background:var(--green)}
.cen.warn b{color:var(--amber)} .cen.warn .bar>i{background:var(--amber)}
.cen.bad b{color:var(--red)} .cen.bad .bar>i{background:var(--red)}
/* 三个页签（关系 / 动作 / 风险）：宽窄一致，每个页签就是一屏内容 */
.pi-tabs{display:flex;gap:6px;margin:0 0 10px;flex-wrap:wrap}
/* 页签按钮底色浅一档：未选中=浅灰面，选中=主色浅底 + 主色文字/描边（不用实心主色，整条页签更轻） */
.pi-tabs .btn{background:var(--surface-2);border-color:var(--border);color:var(--muted);font-weight:600}
.pi-tabs .btn:hover{background:var(--surface);color:var(--text);border-color:#cfd8e3}
.pi-tabs .btn.btn-primary{background:var(--primary-50);border-color:#cfe0f2;color:var(--primary-600)}
.pi-tabs .btn.btn-primary:hover{background:#e3ecf7;border-color:#bcd6ee;color:var(--primary-600)}
.pi-tabs .btn .muted{color:inherit;opacity:.72;font-weight:400}   /* 页签里的计数跟着底色走，避免灰字压不住 */
.pi-cols{display:grid;grid-template-columns:1fr;gap:12px;align-items:start}
.pi-cols>.pi-col{display:none}
.pi-cols[data-pi-tab="relations"]>.pi-col[data-col="relations"],
.pi-cols[data-pi-tab="actions"]>.pi-col[data-col="actions"],
.pi-cols[data-pi-tab="risks"]>.pi-col[data-col="risks"]{display:block}
.pi-col{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:10px 12px;min-width:0}
.col-h{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}
.col-h b{font-size:13px}
.pi-sub{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:12.5px;font-weight:600;margin:10px 0 4px}
.pi-cols .empty{padding:10px 0;font-size:12px}
@media(max-width:1120px){ .census{grid-template-columns:repeat(2,minmax(0,1fr))} }
/* 关系：决策链 */
.chain{position:relative;padding-left:12px}
.chain:before{content:"";position:absolute;left:3px;top:8px;bottom:8px;width:2px;background:linear-gradient(var(--primary),#cbd6e4);border-radius:2px}
.person{border:1px solid var(--border);border-radius:var(--radius-sm);padding:6px 8px;margin-bottom:6px;background:var(--surface-2)}
.person .nm{font-weight:700;font-size:12.5px}
.person .role{font-size:10.5px;border-radius:4px;padding:0 5px;margin-right:5px;background:var(--primary-50);color:var(--primary-600)}
.dots{letter-spacing:1px;font-size:11px}
.dot-on{color:var(--primary)} .dot-off{color:#cfd8e3}
.check{list-style:none;padding:0;margin:0}
.check li{font-size:12px;padding:2px 0}
.ok-i{color:var(--green);font-weight:700} .bad-i{color:var(--red);font-weight:700}
/* 动作：该做什么 + 节奏条 + 台账 */
.todo{display:flex;gap:6px;align-items:center;padding:3px 0;border-bottom:1px dashed var(--border);font-size:12.5px}
.pi-spark{display:flex;align-items:flex-end;gap:3px;height:46px;margin:4px 0 0;position:relative}
.pi-spark i{flex:1;background:var(--primary-50);border:1px solid #d7e3f1;border-bottom:2px solid var(--primary);border-radius:2px 2px 0 0;min-height:4px}
.pi-spark i.zero{background:var(--red-50);border-color:#f3d6d6;border-bottom-color:var(--red)}
.pi-base{position:absolute;left:0;right:0;border-top:1px dashed var(--red);height:0}
.pi-tl .row{display:flex;gap:8px;align-items:baseline;font-size:12px;padding:4px 0;border-bottom:1px solid var(--surface-2)}
.pi-tl .d{color:var(--muted);font-variant-numeric:tabular-nums;min-width:34px}
.pi-mm{font-size:11px;color:var(--muted);margin:6px 0 2px;border-bottom:1px solid var(--border);padding-bottom:2px}
/* 风险：未来 90 天期限轴 */
.pi-axis{position:relative;height:78px;border-bottom:1px solid var(--border);margin:6px 0 2px}
.pi-axis .tick{position:absolute;top:0;bottom:0;border-left:1px dashed #e6ebf2;font-size:10px;color:var(--muted);padding-left:3px;white-space:nowrap}
.pi-axis .mk{position:absolute;font-size:10.5px;white-space:nowrap;max-width:46%;
  overflow:hidden;text-overflow:ellipsis;padding-left:12px}
.pi-axis .mk b{position:absolute;left:0;top:4px;width:9px;height:9px;border-radius:50%}
.mk-red{color:var(--red)} .mk-red b{background:var(--red)}
.mk-amber{color:var(--amber)} .mk-amber b{background:var(--amber)}
.mk-gray{color:var(--muted)} .mk-gray b{background:#b9c3cf}

/* ===== 客户档案弹窗：左摘要栏 + 右页内 tab（重排自"10 区块纵向 4.4 屏"的旧版）===== */
.modal.cd-modal{max-width:min(1640px,95vw);height:90vh;display:flex;flex-direction:column}
/* 固定高度：内容多少、切到哪个 tab 都不改变弹窗高度（用户 2026-09-17：受不了高度跳来跳去）。
   body 占满剩余高度，内容区内部滚动。 */
.modal.cd-modal .modal-body{flex:1 1 auto;min-height:0;max-height:none;display:flex;flex-direction:column;overflow:hidden}
/* 顶部一排：左＝客户状态雷达与摘要，右＝经营洞察四张小卡（用户 2026-09-17 版式）；下方全宽＝页签 + 三栏动作面板 */
/* 标题栏一行放完：标题 + 徽标 + 编辑资料 + 更多（用户 2026-09-17：这些内容放顶栏） */
.modal.cd-modal .modal-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.modal.cd-modal .modal-head #cdHeadRow{margin-left:auto}
.modal.cd-modal .modal-head .cd-more{top:32px}
/* 高度按雷达图的真实尺寸给：288px 时 #cdViz 只有 208px，而雷达要 243px → 底部被裁掉（实测） */
/* 顶部那排：左右两张卡各占一半（用户 2026-09-17 定：一半一半）。左卡＝状态雷达＋明细，右卡＝经营洞察。 */
/* 顶部那排高度按"雷达填满 + 不抢三列高度"定：492 → 330（此前占到弹窗 61%，三列只剩 ~300px）。 */
/* 920 高的窗口里弹窗只有 828px：顶部再收到 272（雷达框 216 + 标题/指标），把高度让给下面三列 */
.cd-top{display:flex;gap:10px;align-items:stretch;margin-bottom:6px;height:302px}
.cd-topL{flex:1 1 50%;min-width:520px;background:var(--surface-2);border:1px solid var(--border);
  border-radius:10px;padding:5px 8px;display:flex;flex-direction:column;min-height:0;overflow:hidden}
.cd-topL #cdViz{flex:1 1 auto;min-height:0;overflow:hidden}
/* 雷达与明细并排（原来竖排 475px 会把顶部那排撑爆） */
/* 雷达给固定像素高度：让它与 ECharts 画布尺寸一一对应（百分比高度在 flex 链里算出来是 224，
   而画布 230 → 底部 6px 被裁；固定 240 后画布=容器）。顶部那排 322 = 标题 25 + 雷达 240 + 指标 29 + 内边距 16 + 间隙。 */
/* 雷达 420：与本仓其它页面的 .viz-radar-box 同档（那处是 flex:0 1 420px），左卡 1176px 装得下 */
.cd-topL .viz-wrap{display:flex;gap:10px;align-items:flex-start;height:250px}
.cd-topL .viz-radar-box{flex:0 0 240px;min-width:0;height:250px;overflow:hidden}
/* 雷达画布的高度：原来写死在 HTML 的 style="height:230px" 里 → 无论外层怎么加高，画布恒 230（就是"改了没变大"的真因）。
   这里按容器撑满（减去下方那行 11px 说明文字）。.viz-radar-box 之外的调用方仍走 230 兜底。 */
.viz-radar-box .viz-radar-chart{height:230px}
.cd-topL .viz-radar-box .viz-radar-chart{height:100%}
.cd-topL .viz-side{flex:1 1 0;min-width:0;height:250px;overflow:auto}
.cd-topR{flex:1 1 50%;min-width:420px;display:flex;flex-direction:column;min-height:0;overflow:hidden}
/* 经营洞察的内层卡片撑满右卡高度（否则内容 203px 就断、下面留白；靠 .cd-topR 的 flex 链给高度） */
.cd-topR #cdInsight{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
/* 中间列「现在什么状态」卡内的 tab 条：所有页内 tab 都收在这一张卡里（2026-09-17） */
.ct-tabs{display:flex;gap:2px;flex-wrap:wrap;border-bottom:1px solid var(--border);margin:6px 0 2px;flex:0 0 auto}
.ct-tab{appearance:none;border:none;background:none;padding:4px 8px;font-size:11.5px;color:var(--muted);
  cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap}
.ct-tab.on{color:var(--primary);border-bottom-color:var(--primary);font-weight:600}
.ct-tab:hover{color:var(--text)}
.cd-top{flex:0 0 auto}
.cd-grid{display:grid;grid-template-columns:1fr 1fr;gap:2px 22px}
@media (max-width:1180px){ .cd-grid{grid-template-columns:1fr} }
.cd-kv{padding:5px 0;border-bottom:1px dashed color-mix(in srgb,var(--border) 55%,transparent)}
.cd-kv .k{color:var(--muted);flex:0 0 96px}
.cd-kv-full{grid-column:1/-1}
.ct-pane>section .kv{padding:5px 0;border-bottom:1px dashed color-mix(in srgb,var(--border) 55%,transparent)}
.ct-pane>section .kv .k{color:var(--muted)}
.cd-more{position:absolute;right:0;top:34px;z-index:10;background:var(--surface);border:1px solid var(--border);
  border-radius:10px;box-shadow:var(--shadow-lg);padding:8px;display:flex;flex-direction:column;gap:4px;min-width:180px}
.cd-more .btn{justify-content:flex-start;white-space:nowrap}
/* 菜单分组线：跳转/去别处 ｜ 就地动作 ｜ 危险操作 */
.cd-more .cd-sep{height:1px;background:var(--border);margin:3px 2px}
.cd-metric{display:flex;align-items:baseline;gap:8px;padding:5px 0;border-bottom:1px dashed color-mix(in srgb,var(--border) 55%,transparent)}
.cd-metric span:first-child{color:var(--muted);flex:0 0 64px}
.cd-metric b{font-variant-numeric:tabular-nums}
.cd-metric span:last-child{margin-left:auto;color:var(--muted);font-size:11px}

/* 下方「该做什么 | 现在什么状态 | 做了什么」三栏：吃满弹窗剩余高度，三栏等高、各自内部滚动。
   链路：#ctTodoHost（弹窗体里的宿主）> .ct-pane > section——宿主必须显式 flex 撑满，
   否则 .ct-pane 的高度会解析到 auto 宿主上、三栏退回内容高度（实测过 274/188/71 不齐）。 */
.modal.cd-modal #ctTodoHost{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
.modal.cd-modal .ct-pane{flex:1 1 auto;height:auto;min-height:0;flex-wrap:nowrap}
.modal.cd-modal .ct-pane>section{max-height:none;height:auto;min-height:0}
/* 中间「现在什么状态·凭据」列加宽：它是给客户做判断时看凭据最多的一栏（用户 2026-09-17） */
.modal.cd-modal .ct-pane>section:nth-child(2){flex:1.5 1 480px}
.modal.cd-modal .ct-pane>section:nth-child(3){flex:1 1 340px}
@media (max-width:1180px){
  .cd-top{flex-direction:column}
  .cd-topL{flex:1 1 auto}
  .modal.cd-modal .ct-pane>section{max-height:none}
}

/* ---------- 知识与案例：左侧「知识库类型」列表 + 右侧详情（v2.3.24） ----------
   布局对齐百思特AI知识库「知识库管理」页：左栏 260px 类型树（分组可折叠 + 计数徽标 + 选中高亮），
   右栏＝面包屑 + 工具条 + 阶段筛选 + 详情表；色板/圆角/阴影沿用本系统 token。 */
#view:has(.kn-wrap){display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden;padding:8px 12px}
.main:has(.kn-wrap){overflow:hidden}
.kn-wrap{display:flex;gap:12px;flex:1;min-height:0;align-items:stretch}
.kn-side{flex:0 0 260px;max-width:300px;min-height:0;display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}
.kn-side-h{display:flex;gap:8px;align-items:center;padding:10px 12px;border-bottom:1px solid var(--border)}
.kn-side-h input{flex:1;min-width:0;padding:7px 10px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);outline:none;font-size:13px;font-family:inherit}
.kn-side-h input:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-50)}
.kn-tree{flex:1;min-height:0;overflow-y:auto;padding:6px 6px 10px}
.kn-grp{margin-bottom:2px}
.kn-grp-h{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:var(--radius);cursor:pointer;font-size:13px;font-weight:600;color:var(--text);user-select:none;transition:background .12s}
.kn-grp-h:hover{background:var(--surface-2)}
.kn-grp-h .chev{flex:none;width:12px;font-size:12px;line-height:1;color:var(--muted);transition:transform .18s ease}
.kn-grp-h.collapsed .chev{transform:rotate(-90deg)}
.kn-grp-h .ic{flex:none}
.kn-grp-h .t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.kn-leaf{display:flex;align-items:center;gap:8px;padding:7px 10px 7px 22px;border-radius:var(--radius);cursor:pointer;font-size:13px;color:var(--text);transition:background .12s}
.kn-leaf:hover{background:var(--surface-2)}
.kn-leaf.active{background:var(--primary-50);color:var(--primary);font-weight:600}
.kn-leaf .t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.kn-cnt{flex:none;min-width:22px;text-align:center;font-size:11px;font-weight:600;padding:1px 7px;border-radius:var(--radius-full);background:var(--surface-2);color:var(--muted)}
.kn-cnt.on{background:var(--green-50);color:var(--green)}
.kn-main{flex:1 1 0;min-width:0;min-height:0;display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}
.kn-crumb{padding:10px 16px;border-bottom:1px solid var(--border);font-size:12.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.kn-crumb .sep{margin:0 6px;color:var(--border)}
.kn-crumb b{color:var(--text);font-weight:600}
.kn-bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:10px 16px;border-bottom:1px solid var(--border)}
.kn-bar .sp{flex:1 1 auto}
.kn-fil{display:flex;gap:6px;align-items:center;flex-wrap:wrap;padding:8px 16px;border-bottom:1px solid var(--border);font-size:12px;color:var(--muted)}
.kn-fil .lb{flex:none;font-weight:600}
.kn-fil:empty{display:none}
.kn-body{flex:1;min-height:0;overflow:auto}
.kn-tb{min-width:100%}
.kn-tb th{position:sticky;top:0;z-index:1}
.kn-tb tr.kn-row{cursor:pointer}
.kn-tb .kn-title{font-weight:600}
.kn-tb .kn-sub{font-size:11.5px;color:var(--muted);margin-top:2px}
.kn-usage{padding:16px}
.kn-usage .card{margin-bottom:12px}
@media(max-width:800px){
  .main:has(.kn-wrap){overflow-y:auto}
  #view:has(.kn-wrap){overflow:visible}
  .kn-wrap{flex-direction:column}
  .kn-side{flex:0 0 auto;max-width:none;max-height:46vh}
  .kn-main{flex:1 1 auto;min-height:340px}
}

/* ---------- 知识文档库 / 知识加工（v2.3.24，右栏详情） ---------- */
.kn-tb tr.on{background:var(--primary-50)}
.kd-tb td.kd-name{cursor:pointer}
.kd-tb .kd-ico{margin-right:6px}
.kd-tb .kd-nm{font-weight:600}
.kd-err{color:var(--red);font-size:11.5px;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:420px}
.kd-acts{display:flex;gap:4px;flex-wrap:wrap}
.kd-acts .btn{padding:3px 8px;font-size:12px}
.kd-prog{height:3px;background:var(--border);border-radius:2px;margin-top:4px;overflow:hidden;max-width:120px}
.kd-prog i{display:block;height:100%;background:var(--amber)}
.kd-batch{display:inline-flex;align-items:center;gap:6px;margin-left:4px}
.kn-tb tr.kd-up td{cursor:pointer}
.kd-chunk{border:1px solid var(--border);border-radius:8px;padding:6px 8px;margin-bottom:6px}
.kd-hit{border-bottom:1px dashed var(--border);padding:6px 0;font-size:12.5px}
.kd-graph-wrap{display:flex;gap:12px;align-items:flex-start}
.kd-graph{flex:0 0 520px;max-width:58%;background:var(--surface-2);border:1px solid var(--border);border-radius:8px}
.kd-ents{flex:1;min-width:0;max-height:360px;overflow:auto}
.kd-ent{padding:4px 0;border-bottom:1px dashed var(--border);font-size:12.5px}
.kw-wrap{display:flex;height:100%;min-height:0}
.kw-list{flex:0 0 260px;border-right:1px solid var(--border);overflow:auto;padding:8px}
.kw-item{padding:8px 10px;border-radius:var(--radius);cursor:pointer;margin-bottom:4px}
.kw-item:hover{background:var(--surface-2)}
.kw-item.on{background:var(--primary-50)}
.kw-item .kw-t{font-weight:600;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.kw-item .kw-m{display:flex;gap:8px;align-items:center;margin-top:4px;font-size:11.5px}
.kw-main{flex:1;min-width:0;overflow:auto;padding:12px 14px}
.kw-head{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:8px}
.kw-pre{white-space:pre-wrap;word-break:break-word;background:var(--surface-2);border:1px solid var(--border);border-radius:8px;padding:10px 12px;font-size:12.5px;line-height:1.6;max-height:56vh;overflow:auto;font-family:ui-monospace,Menlo,monospace}
.kw-content{margin-top:6px}
.kw-agent{display:flex;gap:8px;margin-top:10px}
.kw-agent input{flex:1;min-width:0;padding:8px 10px;border:1px solid var(--border);border-radius:8px;font-family:inherit}
.kw-revs{margin-top:12px;font-size:12.5px}
.kw-rev{border-top:1px dashed var(--border);padding:6px 0}
.kw-sw{display:block;margin:6px 0;font-size:13px}
@media(max-width:800px){
  .kw-wrap{flex-direction:column}
  .kw-list{flex:0 0 auto;max-height:38vh;border-right:none;border-bottom:1px solid var(--border)}
  .kd-graph-wrap{flex-direction:column}
  .kd-graph{flex:0 0 auto;max-width:100%;width:100%}
}

/* ---------- 知识库详情：七页签（v2.3.24） ---------- */
.kn-bar.kt-tabs{gap:2px;padding:0 12px;flex-wrap:nowrap;overflow-x:auto}
.kt-tab{border:none;background:none;padding:11px 14px;font-size:13.5px;color:var(--muted);cursor:pointer;border-bottom:2px solid transparent;white-space:nowrap;font-family:inherit}
.kt-tab:hover{color:var(--primary)}
.kt-tab.on{color:var(--primary);border-bottom-color:var(--primary);font-weight:600}
.kt-tools{gap:8px}
.kt-subtabs{display:flex;gap:2px;border-bottom:1px solid var(--border);margin-bottom:10px;flex-wrap:wrap}
.kt-sub{border:none;background:none;padding:7px 12px;font-size:12.5px;color:var(--muted);cursor:pointer;border-bottom:2px solid transparent;font-family:inherit}
.kt-sub.on{color:var(--primary);border-bottom-color:var(--primary);font-weight:600}
.kt-pane{padding:12px 14px}
.kt-cards{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:12px}
.kt-card{flex:1 1 150px;min-width:140px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:11px 13px;box-shadow:var(--shadow)}
.kt-c-label{font-size:11.5px;color:var(--muted)}
.kt-c-val{font-size:20px;font-weight:700;margin-top:2px;font-variant-numeric:tabular-nums}
.kt-c-sub{font-size:11.5px;color:var(--muted);margin-top:2px}
.kt-block{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:12px 14px;box-shadow:var(--shadow)}
.kt-block > b{font-size:13px}
.kt-grid2{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap}
.kt-grid2 > *{flex:1 1 380px;min-width:0}
.kt-metric{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:5px 0;border-bottom:1px dashed var(--border);font-size:12.5px}
.kt-metric:last-child{border-bottom:none}
@media(max-width:800px){ .kt-grid2 > *{flex:1 1 100%} }


/* ============ 新建/编辑 合同 整页表单（照纷享线上 2026-09-17 relay 实测版式） ============
   ★ 只抄尺寸/间距/字号/控件形态，颜色一律用本系统原有配色（用户口径）。
   标题栏右上动作条 · 左导航 · 两列「左标签 + 右控件」· 控件内右侧字数计数 · 必填前置红点
   · 明细两页签 + 「共N条 ｜ 从本地Excel导入 添加一行」。全部以 .ct-* 作用域，不影响其它表单。
   ★ 配色口径（用户口径 2026-09-17）：**只对齐尺寸/间距/字号/控件形态，颜色一律沿用本系统原有配色**，
     不抄线上主橙 rgb(255,128,0)、导航浅橙底 rgb(255,247,230)、链接蓝 rgb(12,108,255)、星号红 rgb(255,0,0)、
     描边 #C1C5CE、深色字 #181C25 —— 这些一律映射回 var(--primary)/var(--primary-600)/var(--amber)/var(--amber-50)/
     var(--text)/var(--border)/var(--surface-2)/#ff3f3f/#e8791c 等既有 token。
   · 未选中页签 rgb(84, 88, 97) · 引用框「＋」#737C8C（以上均为线上色值，本系统不采用，仅作对照）。 */
.modal.opp-full.ct-headmode .modal-head{display:flex;align-items:center;gap:10px;height:48px;padding:0 16px 0 8px}   /* 线上标题栏高 48px、标题左内边距 8px */
.modal.opp-full .ct-headacts{margin-left:auto;display:flex;align-items:center;gap:8px}
.modal.opp-full .ct-headacts .btn{height:28px;padding:0 10px;font-size:14px;border-radius:6px;line-height:26px}   /* 只对齐尺寸；配色沿用 .btn / .btn-primary 本系统色 */
.modal.opp-full .ct-grid{grid-template-columns:repeat(2,minmax(0,630px));gap:12px clamp(24px,9vw,120px);max-width:1400px;margin:0 auto}   /* 线上：每列 590px（标签 128 + 间距 8 + 控件 454）、列间距 120px、整片 1300px 居中；行距 12px + 字段下边距 4px = 行上间距 16px */
.modal.opp-full .ct-grid .field{align-items:flex-start}
.modal.opp-full .ct-grid .field>label{
  display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;   /* 2026-09-23：字段名单行显示（原为两行截断） */
  padding-top:7px;line-height:15.4px}
.ct-w{position:relative;display:block;width:100%;max-width:454px}   /* 线上控件宽 454px */
.ct-w>input,.ct-w>select,.ct-w>textarea{width:100%;box-sizing:border-box}
.modal.opp-full .field .ct-w[data-cntw] input:not([type=checkbox]):not([type=radio]){padding-right:48px}   /* 线上单行文本内边距 5px 48px 5px 5px（计数贴控件内右缘） */
/* 控件外观（尺寸照线上 2026-09-17 实测）：1px 边框（用 var(--border)）、文字左内边距 5px；日期左内边距 30px；下拉 13px 字号/左 6px 右 36px */
.modal.opp-full .field .ct-w>input:not([type=checkbox]):not([type=radio]),.modal.opp-full .field .ct-w>select,.modal.opp-full .field .ct-w>textarea{border:1px solid var(--border);padding:5px 10px 5px 5px}
.modal.opp-full .field .ct-w>input[type=date]:not([type=checkbox]):not([type=radio]){padding-left:30px}
.modal.opp-full .field .ct-w>select{padding:5px 36px 5px 6px;font-size:13px}
.modal.opp-full .field .ct-w>input:not([type=checkbox]):not([type=radio]):has(+ .ct-add){padding:0 34px 0 5px}   /* 引用/搜索框：线上内边距 0 34px 0 5px，右侧为「＋」30×30 热区 */
.modal.opp-full .field .ct-w>select:has(+ .ct-add){padding-right:64px}   /* 引用框是下拉时，再让开原生箭头 */
.ct-w>select+.ct-add{right:24px}
.modal.opp-full .ct-grid .field .ct-w>textarea{padding:5px;height:60px;line-height:20px}   /* 线上多行文本：高 60px、内边距 5px、行高 20px */
.modal.opp-full .field .ct-w[data-cntw] textarea{padding-right:48px}
.ct-w>textarea{max-width:454px}
.ct-cnt{position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:12px;color:#909399;pointer-events:none}   /* 线上字数计数：12px / #909399，贴控件内右侧 8px */
.ct-w>textarea~.ct-cnt{top:auto;right:8px;bottom:4px;transform:none}   /* 多行文本：计数贴右下 */
.ct-req::before{content:"*";color:#ff3f3f;font-size:14px;margin-right:4px;font-weight:700}   /* 必填星号：位置/字号照线上，颜色沿用本系统 --red 系 */
.ct-req{display:inline}
.ct-tip{margin-left:4px;color:var(--muted);font-size:12px;cursor:help}
.ct-radios{display:flex;flex-wrap:wrap;max-width:454px}   /* 线上 .crm-field-selecttile：选项间距由选项自身的 margin 给出，不用 gap */
.ct-radios label{display:inline-flex;align-items:center;gap:8px;height:20px;font-size:14px;font-weight:400;color:var(--text);white-space:nowrap;margin:8px 0 0 16px}   /* 线上平铺单选：margin 8px 0 0 16px、高 20px、图标与文字间距 8px */
.ct-radios.ct-ve label{white-space:normal;height:auto;min-height:20px}   /* 长名（签约主体）允许折行，别被 20px 的选项高裁掉 */
.ct-ro{background:var(--surface-2);color:var(--muted)}
/* 只读字段一律致灰（线上 disabled 底色 rgb(242,243,245)、cursor:not-allowed；颜色沿用本系统 token）。
   必须带作用域：`.field input{background:var(--surface)}` 的优先级(0,1,1)压过裸 `.ct-ro`(0,1,0)，
   否则只读字段渲染出来和可填字段一样白（用户反馈「只读的位置没有致灰」）。 */
.modal.opp-full .field input.ct-ro,.modal.opp-full .field select.ct-ro,.modal.opp-full .field textarea.ct-ro,
.modal.opp-full .field input[readonly]:not([type=checkbox]):not([type=radio]),
.modal.opp-full .field select[readonly],.modal.opp-full .field textarea[readonly],
.modal.opp-full .field input[disabled],.modal.opp-full .field select[disabled]{
  background:var(--surface-2);color:var(--muted);cursor:not-allowed}
.ct-add{position:absolute;right:2px;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:30px;height:30px;color:var(--primary);cursor:pointer;font-size:16px;line-height:1}   /* 引用/搜索框右侧「＋」：30×30 热区（几何照线上），颜色沿用 var(--primary) */
.ct-file{display:flex;align-items:center;gap:10px;min-height:32px}
.ct-lk{color:var(--primary);cursor:pointer;font-size:13px}
.modal.opp-full .ct-file .ct-lk{font-size:14px;line-height:32px}   /* 「＋添加附件」：字号/行高照线上，颜色沿用 .ct-lk 本系统色 */
#od_sec_pay{margin-top:16px}   /* 合同详情页签区：原写成 .ct-tabs，会同名漏给客户档案中列 tab（#ctMidTabs） */
/* 合同表单的「回款节点 / 交付内容」明细区＝**纵向堆叠**（页签条 → 工具条 → 表格）。
   别给它挂 .ct-tabs：那是横向 tab 条（display:flex;flex-wrap:wrap，客户档案中列 tab 用），
   会把页签条/工具条/表格排成一行——宽窗口下表格直接跑到页签右边，窄窗口下表格被挤到第二行且不成整宽。 */
.ct-nodes{display:block}
.ct-anchor{display:block;height:0}
.ct-tabbar{display:flex;gap:24px;border-bottom:1px solid var(--border)}
.ct-tabbar .ct-tab{background:none;border:0;padding:0;font-size:16px;font-weight:600;line-height:39px;color:var(--text);cursor:pointer;position:relative}   /* 合同详情页签：16px/600、行高 39px（照线上）；必须挂 .ct-tabbar，否则会盖掉客户档案中列 tab 的 11.5px */
.ct-tabbar .ct-tab.on{color:#e8791c;font-weight:600}
.ct-tabbar .ct-tab.on::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:#e8791c}
.ct-panelbar{display:flex;gap:16px;align-items:center;justify-content:flex-end;padding:9px 0}
.modal.opp-full .ct-nodes [hidden],.modal.opp-full .ct-panelbar[hidden]{display:none}   /* hidden 需压过 display:flex */
.ct-panelbar>span:first-child{margin-right:auto}
.ct-panelbar .ct-lk{font-size:12px}   /* 明细工具条链接：字号照线上，颜色沿用 .ct-lk 本系统色 */
.ct-none{text-align:center;color:var(--muted);padding:26px 0}
.ct-table th{font-weight:400;color:var(--text)}
.ct-table td,.ct-table th{padding:6px 8px}
.ct-table input,.ct-table select{width:100%;height:28px;font-size:13px;padding:2px 6px;border-radius:6px}
.ct-multi{height:32px}
/* ══ 「选择数据」选择器（照纷享销客线上实测 2026-09-17）
   标题带 46px + 1px 分隔线（右上：全屏 / 关闭）· 工具条 24px 控件（对象 ｜ 视图▾  筛选  [字段▾ ｜ 搜索🔍]  ◎  新建）
   · 表头 13px 常规字重 + 1px 下边框 · 页脚右对齐「共 N 条 / 确定 / 取消」（主按钮 32px，用本系统蓝） ══ */
.modal.ct-pick{--ct-caret:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='6'%3E%3Cpath d='M1 1l3.5 3.5L8 1' fill='none' stroke='%23dcdcdc' stroke-width='1.4' stroke-linecap='round'/%3E%3C/svg%3E");
  max-width:min(832px,96vw);height:86vh;border-radius:4px;display:flex;flex-direction:column;
  margin:calc(9vh - 30px) auto auto}   /* 线上弹窗贴顶 ≈9vh（遮罩自身有 30px 上内边距，扣掉后与线上 77px 对齐） */
.modal.ct-pick.ct-full-on{position:fixed;inset:0;width:auto;height:auto;max-width:none;margin:0;border-radius:0;z-index:1}
.modal.ct-pick .modal-head{padding:12px 10px 11px 16px;flex:0 0 auto;border-bottom:1px solid #e5e5e5}
.modal.ct-pick .modal-head h3{font-size:16px;font-weight:600;line-height:22px;color:var(--text)}
.modal.ct-pick .modal-head .x{color:#4a4a4a;font-size:16px;padding:2px 6px;border-radius:4px;margin-left:0}
.modal.ct-pick .modal-head .x:hover{background:#f2f3f5}
.ct-full{padding:2px 6px;border:0;background:none;color:#4a4a4a;cursor:pointer;display:inline-flex;align-items:center;border-radius:4px}
.ct-full:hover{background:#f2f3f5}
.modal.ct-pick .modal-body{padding:12px 0 0;flex:1 1 auto;min-height:0;max-height:none;overflow:hidden;display:flex;flex-direction:column}
.modal.ct-pick .modal-foot{padding:5px 14px;flex:0 0 auto;border-top:1px solid #e5e5e5;gap:8px}
/* 工具条 */
.ct-toolbar{display:flex;align-items:center;gap:7px;margin:0 14px 8px;flex:0 0 auto}
.ct-obj{font-size:14px;color:var(--text);white-space:nowrap}
.ct-objsep{width:1px;height:12px;background:#dcdfe6;margin:0 5px;flex:0 0 1px}
.ct-view{appearance:none;-webkit-appearance:none;border:0;background:transparent;font-size:14px;color:var(--text);cursor:pointer;padding:0 15px 0 0;
  background-image:var(--ct-caret);background-repeat:no-repeat;background-position:right 3px center}
.ct-flt{height:24px;padding:0 9px;font-size:13px;color:var(--text);background:var(--surface);border:1px solid #d2d2d2;border-radius:6px;cursor:pointer;
  display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
.ct-flt:hover{border-color:#b9b9b9}
.ct-flt.on{border-color:var(--primary);color:var(--primary)}
.ct-fnum{background:var(--primary);color:#fff;border-radius:9px;font-size:10px;line-height:15px;padding:0 5px;font-style:normal}
.ct-find{display:inline-flex;align-items:center;height:24px;width:285px;flex:0 1 285px;border:1px solid #d2d2d2;border-radius:6px;background:var(--surface);padding:0 6px 0 7px}
.ct-find-sel{appearance:none;-webkit-appearance:none;border:0;background:transparent;font-size:13px;color:var(--text);cursor:pointer;width:94px;flex:0 0 94px;
  padding:0 14px 0 0;background-image:var(--ct-caret);background-repeat:no-repeat;background-position:right 2px center}
.ct-find-sep{width:1px;height:12px;background:#e0e0e0;margin:0 8px;flex:0 0 1px}
.ct-find input{flex:1 1 auto;min-width:0;height:22px;border:0;outline:0;background:transparent;font-size:13px;color:var(--text);padding:0}
.ct-find input::placeholder{color:#b9b9b9}
.ct-find-ico{border:0;background:none;padding:0;margin-left:4px;color:#8c8c8c;cursor:pointer;display:inline-flex}
.ct-find-ico:hover{color:var(--text)}
.ct-ico{border:0;background:none;padding:0 2px;margin-left:14px;color:#4a4a4a;cursor:pointer;display:inline-flex}
.ct-ico:hover{color:var(--primary)}
.ct-spacer{flex:1 1 auto}
.ct-new{height:26px;padding:0 11px;font-size:13px;border:0;border-radius:5px;background:var(--primary);color:#fff;cursor:pointer;white-space:nowrap}
.ct-new:hover{background:var(--primary-600)}
/* 表格：无外框（线上只有表头下边框） */
.ct-tablewrap{flex:0 1 auto;min-height:0;max-height:100%;overflow:auto;border:0;border-radius:0;box-shadow:none;background:transparent}
.ct-tablewrap>.ct-none{position:sticky;left:0;width:100%}
.ct-picktable{font-size:13px}
.ct-picktable th{font-size:13px;line-height:19px;font-weight:400;color:var(--text);background:var(--surface);white-space:nowrap;padding:2px 8px;
  border-bottom:1px solid #e0e0e0;position:sticky;top:0;z-index:1}
.ct-picktable td{white-space:nowrap;padding:6px 8px;color:var(--text);font-size:13px}
.ct-picktable th:first-child,.ct-picktable td:first-child{padding-left:6px}
.ct-picktable td.num{text-align:right}
.ct-picktable tr:hover td{background:#f7f8fa}
.modal.ct-pick .ct-none{color:#8c8c8c;font-size:13px;padding:56px 0}   /* 线上空态：表头下约 132px 高的居中「没有数据」 */
/* 表头：列名 + 锁定图标（线上在列名前）+ 排序箭头（线上在列名右侧；悬停/生效时出现，点列名切换升/降） */
.ct-picktable th.ct-sortable{cursor:pointer;user-select:none}
.ct-th{display:inline-flex;align-items:center;gap:4px}
.ct-lock{display:inline-flex;color:#9aa3af;margin-right:1px}
.ct-lock:hover{color:var(--primary)}
.ct-sortico{display:inline-flex;color:#c0c4cc;opacity:0;transition:opacity .12s}
.ct-picktable th.ct-sortable:hover .ct-sortico{opacity:1}
.ct-sortico.on{opacity:1;color:var(--primary)}
.ct-sortico.desc{transform:rotate(180deg)}

/* 页脚：线上「共 N 条 / 确定 / 取消」整组贴右（left 侧留白），主按钮橙、次按钮白底描边 */
.modal.ct-pick .ct-pickfoot{font-size:12px;color:#454545;margin-right:11px}
.modal.ct-pick .modal-foot .btn{height:30px;padding:0 14px;font-size:14px;font-weight:400;border-radius:6px;background:var(--surface);border:1px solid #d2d2d2;color:#454545}
.modal.ct-pick .modal-foot .btn:hover{background:#f7f8fa}
.modal.ct-pick .modal-foot .btn-primary{height:32px;padding:0 17px;background:var(--primary);border-color:var(--primary);color:#fff}
.modal.ct-pick .modal-foot .btn-primary:hover{background:var(--primary-600);border-color:var(--primary-600)}
.modal.opp-full h3.ct-sec{border-left:0;padding-left:0;color:var(--text)}   /* 分组标题：16px/700，无左色条；颜色用 var(--text) */
.modal.opp-full .ct-radios input[type=radio]{appearance:none;-webkit-appearance:none;flex:0 0 auto;box-sizing:border-box;padding:0;width:16px;height:16px;min-width:16px;margin:0;border:1px solid var(--border);border-radius:50%;background:var(--surface);position:relative}   /* 平铺单选圆形图标 16×16、1px 边框（几何照线上，颜色用 var(--border)/var(--primary)；.field input 的 padding:10px 12px 会把 16px 撑成 26×22，必须清零） */
.modal.opp-full .ct-radios input[type=radio]:checked{border-color:var(--primary)}
.modal.opp-full .ct-radios input[type=radio]:checked::after{content:"";position:absolute;inset:3px;border-radius:50%;background:var(--primary)}
.modal.opp-full .ct-grid input[type=checkbox]{width:14px;height:14px;box-sizing:border-box;padding:0}
/* 下拉多选（线上 select_many / employee_many 形态：单行控件 + 勾选清单；值以「、」连接进出） */
.modal.opp-full .ct-msel{position:relative;display:block;width:100%;max-width:454px}
.modal.opp-full .ct-msel-tit{display:flex;align-items:center;justify-content:space-between;height:32px;padding:0 6px;
  border:1px solid var(--border);border-radius:8px;font-size:13px;line-height:30px;color:var(--text);background:var(--surface);cursor:pointer}
.modal.opp-full .ct-msel-txt{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.modal.opp-full .ct-msel-ar{flex:0 0 auto;width:30px;text-align:center;font-size:12px;color:var(--text)}
.modal.opp-full .ct-msel-menu{position:absolute;left:0;right:0;top:calc(100% + 2px);z-index:40;max-height:280px;overflow:auto;
  padding:4px;background:var(--surface);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.12)}
.modal.opp-full .ct-msel-menu[hidden]{display:none}
.modal.opp-full .ct-msel-it{display:flex;align-items:center;gap:8px;height:28px;padding:0 6px;border-radius:6px;font-size:13px;color:var(--text);cursor:pointer}
.modal.opp-full .ct-msel-it:hover{background:var(--surface-2)}
.modal.opp-full .ct-msel-it input[type=checkbox]{width:14px;height:14px;box-sizing:border-box;padding:0}
/* ══ 机会点联系人（商机详情页签｜2026-09-17 逐控件对齐纷享线上） ══
   标题行(折叠 + 全部▾) · 工具条(搜索/筛选/排序/列设置/新增/刷新/全屏) · 表头(排序·锁定·筛选)
   · 勾选批量条(已选择N条·发邮件) · 表尾(共N条/每页/分页) · 表单(仅显示必填/行距设置) */
.sm-head{display:flex;align-items:center;gap:8px;padding:0 0 8px;border-bottom:1px solid var(--border);margin-bottom:8px;flex-wrap:wrap}
.sm-fold{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;color:var(--muted);cursor:pointer;user-select:none;transition:transform .15s}
.sm-fold.on{transform:rotate(-90deg)}
.sm-title{font-size:13px;font-weight:700}
.sm-head .opp-rel-n{color:var(--muted);font-size:12px}
.sm-view{display:inline-flex;align-items:center;gap:3px;font-size:12px;color:var(--primary);cursor:pointer;padding:1px 5px;border-radius:5px}
.sm-view:hover{background:var(--primary-50)}
.sm-tools{display:inline-flex;align-items:center;gap:2px}
.sm-tb{display:inline-flex;align-items:center;gap:4px;padding:4px 6px;border:none;background:none;color:var(--muted);cursor:pointer;border-radius:6px;font-size:12px}
.sm-tb:hover{background:var(--surface-2);color:var(--primary)}
.sm-tb:disabled{opacity:.4;cursor:default}
.sm-svg{vertical-align:-2px}
.sm-fnum{background:var(--primary);color:#fff;border-radius:9px;font-size:10px;padding:0 5px;font-style:normal}
.sm-fclear{color:var(--muted);font-size:13px;margin-left:2px}
.sm-search{display:flex;align-items:center;gap:6px;margin:0 0 8px;padding:6px 8px;background:var(--surface-2);border:1px solid var(--border);border-radius:8px}
.sm-search select{max-width:160px}
.sm-search input{flex:1;min-width:120px}
.sm-tablewrap{overflow:auto;border:1px solid var(--border);border-radius:8px;max-height:62vh}
.sm-table{width:100%;border-collapse:separate;border-spacing:0;min-width:1620px}
.sm-table th{position:sticky;top:0;z-index:2;background:var(--surface-2);text-align:left;padding:6px 10px;font-size:13px;font-weight:700;color:var(--muted);white-space:nowrap;border-bottom:1px solid var(--border)}
.sm-table td{padding:7px 10px;font-size:13px;line-height:19px;white-space:nowrap;max-width:300px;overflow:hidden;text-overflow:ellipsis;border-bottom:1px dashed var(--border)}
.sm-table tr.on td{background:var(--primary-50)}
.sm-table tbody tr:hover td{background:var(--surface-2)}
.sm-th-t{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}
/* 列操作图标＝线上「悬停才出现、浮在列名右侧」：绝对定位，不占位、不换行（否则表头会被挤成两行） */
.sm-th-icos{position:absolute;right:6px;top:50%;transform:translateY(-50%);display:inline-flex;gap:3px;
  background:var(--surface-2);padding-left:5px;opacity:0;transition:opacity .12s;pointer-events:none}
.sm-table th:hover .sm-th-icos{opacity:1;pointer-events:auto}
.sm-hico{display:inline-flex;color:var(--muted);cursor:pointer}
.sm-hico:hover,.sm-hico.on{color:var(--primary)}
.sm-ck{width:34px;text-align:center}
.sm-no{width:52px;color:var(--muted)}
.sm-newtab{color:var(--muted);margin-left:5px;vertical-align:-2px}
.sm-newtab:hover{color:var(--primary)}
.sm-lookup{color:var(--primary);text-decoration:none}
.sm-lookup:hover{text-decoration:underline}
.sm-ops{position:sticky;right:0;background:var(--surface);border-left:1px solid var(--border);white-space:nowrap}
.sm-batch{display:flex;align-items:center;gap:8px;margin-top:8px;padding:6px 10px;background:var(--primary-50);border:1px solid var(--border);border-radius:8px;font-size:12.5px}
.sm-batch[hidden]{display:none}
.sm-seln{color:var(--primary);font-weight:700;margin:0 2px;font-style:normal}
.sm-bsep{width:1px;height:14px;background:var(--border)}
.sm-page{display:flex;align-items:center;gap:8px;margin-top:8px;font-size:12px}
.sm-size{padding:2px 6px}
.sm-page-n{color:var(--muted);font-variant-numeric:tabular-nums}
.sm-menu{background:var(--surface);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.12);padding:5px;min-width:180px}
.sm-mi{display:block;width:100%;text-align:left;padding:7px 10px;border:none;background:none;font-size:13px;color:var(--text);cursor:pointer;border-radius:7px}
.sm-mi:hover{background:var(--surface-2);color:var(--primary)}
.sm-mi.on{background:var(--surface-2);font-weight:600;color:var(--primary)}
.sm-msep{height:1px;background:var(--border);margin:4px 2px}
.sm-menu-sm{min-width:130px}
.sm-mf-t{font-size:12px;color:var(--muted);padding:4px 8px 6px;border-bottom:1px dashed var(--border);margin-bottom:6px}
.sm-menu-filter{padding:6px;min-width:236px}
.sm-menu-filter input,.sm-menu-filter select{width:100%}
.sm-mf-ops{display:flex;flex-wrap:wrap;gap:10px;margin:6px 2px}
.sm-mf-ops label{display:inline-flex;align-items:center;gap:3px;font-size:12px;color:var(--text)}
.sm-mf-foot{display:flex;align-items:center;gap:6px;margin-top:6px}
.sm-menu-cols{min-width:210px}
.sm-sw{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 8px;font-size:12.5px;cursor:pointer}
.sm-filter{width:580px;max-width:90vw;padding:8px}
.sm-flt-t{margin:0 0 6px;font-size:13px}
.sm-alone{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.sm-alone label{width:92px;flex-shrink:0;font-size:12px;color:var(--muted)}
.sm-alone input{flex:1}
.sm-conds{border-top:1px dashed var(--border);padding-top:8px;max-height:320px;overflow:auto}
.sm-cond{display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap}
.sm-cond select{max-width:150px}
.sm-cond input{width:150px}
.sm-cond-del{color:var(--muted);cursor:pointer}
.sm-cond-and{font-size:12px;color:var(--muted)}
.sm-add-cond{display:flex;align-items:center;gap:8px}
.sm-flt-foot{display:flex;align-items:center;gap:6px;margin-top:8px;border-top:1px solid var(--border);padding-top:8px}
.sm-peek{min-width:236px;max-width:320px}
.sm-peek-t{font-size:12.5px;font-weight:700;padding:4px 8px 6px;border-bottom:1px dashed var(--border);margin-bottom:4px}
.sm-peek-kv{display:flex;gap:8px;padding:3px 8px;font-size:12.5px}
.sm-peek-kv .k{width:70px;flex-shrink:0;color:var(--muted)}
.sm-peek-foot{padding:6px 8px 2px;display:flex;justify-content:flex-end}
.sm-scene{display:flex;align-items:center;gap:6px;padding:6px 0;border-bottom:1px dashed var(--border);font-size:12.5px}
.sm-form-bar{display:flex;align-items:center;gap:10px;margin-bottom:8px;padding-bottom:6px;border-bottom:1px dashed var(--border);font-size:12.5px}
.sm-rows{display:inline-flex;align-items:center;gap:4px;color:var(--muted)}
.sm-group-t{font-size:12.5px;font-weight:700;color:var(--muted);margin:2px 0 6px}
.sm-form.tight .field{margin-bottom:4px}
.sm-form.normal .field{margin-bottom:8px}
.sm-form.loose .field{margin-bottom:16px}
.sm-form.tight .grid2{gap:6px}
.sm-form.loose .grid2{gap:14px}
.sm-full{position:fixed;inset:0;z-index:1100;background:var(--surface);padding:14px 18px;overflow:auto}
.sm-full .sm-tablewrap{max-height:calc(100vh - 220px)}

/* 机会点联系人表单：联系人「引用搜索」下拉（线上同形态：聚焦列最近联系人、输入即过滤） */
.sm-lookup-list{position:absolute;left:0;right:0;top:calc(100% + 2px);z-index:30;background:var(--surface);
  border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.12);max-height:220px;overflow:auto;padding:4px}
.sm-lookup-list.hidden{display:none}
.sm-lookup-it{padding:6px 8px;border-radius:6px;cursor:pointer;font-size:12.5px;display:flex;align-items:center}
.sm-lookup-it:hover{background:var(--surface-2)}
/* 合规：未填必填项的红字提示（线上：字段下方「请填写…」，橙红小字）+ 条件补充输入 */
.modal.opp-full .ct-err{grid-column:1/-1;color:#e8791c;font-size:12px;line-height:1.4;padding-top:2px}
.modal.opp-full .ct-err::before{content:"ⓘ ";font-style:normal}
.modal.opp-full .ct-cond[hidden]{display:none}

/* 表单外壳「仅显示必填字段」＝开关（线上同形；此前是复选框） */
.od-switch{display:inline-flex;align-items:center;gap:6px;cursor:pointer;user-select:none}
.od-switch input{position:absolute;opacity:0;width:0;height:0}
.od-switch-t{width:32px;height:16px;border-radius:8px;background:#d7dbe3;position:relative;transition:background .15s;flex-shrink:0}   /* 线上迷你开关：32×16 */
.od-switch-t::after{content:"";position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:#fff;transition:left .15s;box-shadow:0 1px 2px rgba(0,0,0,.2)}
.od-switch input:checked + .od-switch-t{background:var(--primary)}
.od-switch input:checked + .od-switch-t::after{left:18px}

/* 表单标题栏右上动作（机会点联系人等整页表单；线上同位置） */
.sm-head-acts{display:inline-flex;gap:6px;align-items:center;margin-right:10px}

/* 机会点联系人表单：本系统固有字段收进默认收起的「更多字段」（默认视图＝线上 6 项） */
.sm-more-wrap{margin-top:6px}
.sm-more-t{border:none;background:none;color:var(--primary);font-size:12.5px;cursor:pointer;padding:4px 0}
.sm-more-t:hover{text-decoration:underline}
#smMoreBox{margin-top:6px}
/* 咨询类型＝「其他」时的手填输入（与新建商机「需求类别＝其他」同款交互） */
.modal.opp-full .ct-inline{margin-top:6px;display:flex}
.modal.opp-full .ct-inline[hidden]{display:none}
.modal.opp-full .ct-inline input{max-width:454px}
/* 下拉的计数要让开原生箭头（否则显示成 0/10◣） */
.modal.opp-full .field .ct-w[data-cntw] select{padding-right:62px}
.modal.opp-full .field .ct-w[data-cntw]>select+.ct-cnt{right:26px}
/* 合同两张明细表：首列勾选、序号列、只读单元格（照线上：勾选框 + 序号 + 操作「删除 复制 ⋮」） */
.modal.opp-full .ct-table th.ct-ck,.modal.opp-full .ct-table td.ct-ck{width:30px;text-align:center}
.modal.opp-full .ct-table td.ct-no{width:42px;color:var(--muted);font-size:12px}
.modal.opp-full .ct-table td.ct-ro-cell{color:var(--text);font-size:12.5px;text-align:right;white-space:nowrap}
.modal.opp-full .ct-table td.ct-ops{white-space:nowrap}
.modal.opp-full .ct-table td.ct-ops .ct-lk{margin-right:8px}
.modal.opp-full .ct-table td.ct-inh{color:var(--text);font-size:12.5px;white-space:nowrap}   /* 继承列（客户/项目名称）：自动获取、只读 */
/* ============ 审批流程面板（照纷享线上真实 DOM，2026-09-17 实测） ============
   右侧 slide 抽屉：640px 贴右、白底、无遮罩、阴影 -4px 0 2px -2px rgba(0,0,0,.063)、z-index 500、12px 字号 */
/* 抽屉＝全屏承载层（承接"点外部关闭"的透明遮罩）+ 右侧 640px 面板 */
.apv-drawer{position:fixed;inset:0;z-index:500}
.apv-drawer-body{position:absolute;top:0;right:0;bottom:0;width:min(640px,96vw);background:#fff;padding:12px 18px 0;
  display:flex;flex-direction:column;overflow:hidden;   /* 头/页签/动作固定，中段分区自己滚（线上同款） */
  box-shadow:-4px 0 2px -2px rgba(0,0,0,.063)}
.apv-drawer-body .apv-scroll{padding-bottom:16px}
.apv-panel{display:flex;flex-direction:column;height:100%;font-size:12px;color:var(--text)}
/* 分区标题（线上：橙色竖条 + 白底，不是色块卡片） */
.apv-h{margin:14px 0 8px;padding-left:8px;border-left:3px solid #f0871f;font-size:12.5px;font-weight:600;color:var(--text)}
.apv-h:first-child{margin-top:2px}
.apv-scroll{flex:1 1 auto;min-height:0;overflow:auto}
/* 头部：头像 + 姓名/部门 + 提交时间 + CRM 审批 */
.apv-head{display:flex;align-items:center;gap:8px;padding:2px 0 10px}
.apv-avatar{width:40px;height:40px;border-radius:50%;background:var(--surface-2);display:flex;align-items:center;justify-content:center;font-weight:600;font-size:14px;color:var(--text);flex:0 0 40px}
.apv-who{display:flex;flex-direction:column;line-height:1.3}
.apv-who b{font-size:13px}
.apv-who .muted{font-size:11.5px}
.apv-time{margin-left:auto;color:var(--muted);font-size:11.5px}
.apv-brand{color:#e8791c;font-size:11.5px;font-weight:600;padding-left:10px;border-left:1px solid var(--border)}
.apv-x{margin-left:10px;border:0;background:none;font-size:18px;line-height:1;color:var(--muted);cursor:pointer}
/* 页签（线上为平铺 li，选中底部下划线） */
.apv-tabs{display:flex;gap:20px;list-style:none;margin:2px 0 10px;padding:0;border-bottom:1px solid var(--border);flex:0 0 auto}
.apv-tabs li{padding:6px 0;cursor:pointer;color:var(--muted);border-bottom:2px solid transparent;margin-bottom:-1px}
.apv-tabs li.on{color:var(--text);font-weight:600;border-bottom-color:var(--primary)}
.apv-tab{display:none}
.apv-tab.on{display:block}
/* 审批内容：流程卡片 */
.apv-flow{margin:0 0 4px;font-size:13.5px;font-weight:600}
.apv-line2{color:var(--text)}
.apv-obj{color:var(--primary)}
.apv-changes{width:100%;margin-top:8px;border-collapse:collapse;font-size:12px}
.apv-changes td{padding:2px 0;vertical-align:top}
.apv-changes td.k{color:var(--muted);width:34%}
.apv-changes td.from{color:var(--muted);width:26%}
.apv-changes td.arrow{width:16px;text-align:center;color:var(--muted)}
/* 详细信息：标签值两列 */
.apv-sub-h{color:var(--muted);margin:2px 0 6px}
.apv-sec{font-size:12px;color:var(--muted);margin:8px 0 6px}
.apv-fields{display:grid;grid-template-columns:1fr 1fr;gap:2px 18px}
/* 明细子表（人天报价详情 / 回款节点 / 交付内容）与附件（2026-09-18：审批面板内直接展开） */
.apv-sub{font-size:12px;font-weight:600;color:var(--text);margin:2px 0 6px}
.apv-tblwrap{overflow:auto;border:1px solid var(--border);border-radius:6px;margin-bottom:10px}
.apv-tbl{width:100%;border-collapse:collapse;font-size:11.5px;white-space:nowrap}
.apv-tbl th{background:color-mix(in srgb,var(--border) 22%,transparent);color:var(--muted);font-weight:400;text-align:left}
.apv-tbl th,.apv-tbl td{border-bottom:1px solid var(--border);padding:5px 8px}
.apv-tbl tr:last-child td{border-bottom:0}
.apv-att{display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px dashed var(--border);font-size:12px}
.apv-att .ft{font-style:normal;font-size:9px;font-weight:600;color:#fff;background:var(--primary);border-radius:3px;padding:1px 4px;flex:0 0 auto}
.apv-att .nm{flex:1 1 auto;min-width:0;word-break:break-all}
.apv-att a{color:var(--primary);flex:0 0 auto}
.apv-f{display:flex;gap:8px;padding:3px 0;border-bottom:1px dashed var(--border)}
.apv-f .k{color:var(--muted);width:42%;flex:0 0 42%}
.apv-f .v{color:var(--text);word-break:break-all}
/* 审批意见：时间轴 */
.apv-timeline{list-style:none;margin:0;padding:0}
.apv-node{display:flex;gap:8px;padding:8px 0;border-left:2px solid var(--border);margin-left:7px;padding-left:12px;position:relative}
.apv-node .apv-ico{position:absolute;left:-11px;top:8px;width:16px;height:16px;border-radius:50%;background:#fff;border:1px solid var(--border);display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--muted)}
.apv-node.approved .apv-ico{background:var(--green);border-color:var(--green);color:#fff}
.apv-node.rejected .apv-ico{background:var(--red);border-color:var(--red);color:#fff}
.apv-node.pending .apv-ico{border-color:#e8791c;color:#e8791c}
.apv-node.start .apv-ico{background:var(--primary);border-color:var(--primary);color:#fff;font-size:8px}
.apv-main{flex:1;min-width:0}
.apv-line{display:flex;align-items:center;gap:6px}
.apv-st{font-size:11.5px}
.apv-st.approved{color:var(--green)}
.apv-st.pending{color:#e8791c}
.apv-st.rejected{color:var(--red)}
.apv-urgent{margin-left:auto;color:#e8791c;border-color:#f0c99a}
/* 记录行：线上是浅灰圆角块（同意 X 时间 / 自动通过 X 时间），不是裸文字 */
.apv-log{color:var(--muted);font-size:11.5px;margin-top:4px;background:var(--surface-2);border-radius:4px;padding:4px 8px;display:inline-block}
.apv-log .apv-when{margin-left:6px}
.apv-node.future{opacity:.92}
.apv-node.future .apv-ico{color:#9aa5b3}
.apv-more,.apv-foot{margin-top:8px;color:var(--primary);font-size:12px;cursor:pointer}
.apv-foot{text-align:right}
.apv-end{margin-top:10px;padding-top:8px;border-top:1px dashed var(--border);font-weight:600}
.apv-end.approved{color:var(--green)}
.apv-end.rejected{color:var(--red)}
.apv-end .apv-when{font-weight:400;color:var(--muted);margin-left:6px}
/* 流程图（查看审批配置）：信息卡 + 竖向节点链 + 通过/驳回/撤回后操作 */
.apv-cfg-info{display:grid;grid-template-columns:1fr 1fr;gap:2px 24px;background:var(--surface-2);border-radius:6px;padding:10px 14px;margin-bottom:12px}
.apv-cfg-f{display:flex;gap:10px;padding:3px 0;font-size:12px}
.apv-cfg-f .k{color:var(--muted);flex:0 0 96px}
.apv-cfg-graph{display:flex;flex-direction:column;align-items:center;padding:8px 0 4px}
.apv-cfg-link{width:2px;height:26px;background:var(--border)}
.apv-cfg-start{background:#2f9e63;color:#fff;border-radius:14px;padding:4px 22px;font-size:12px;font-weight:600}
.apv-cfg-end{width:44px;height:44px;border-radius:50%;background:var(--primary);color:#fff;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}
.apv-cfg-node{background:#fff;border:1px solid var(--border);border-radius:6px;padding:8px 14px;min-width:230px;box-shadow:0 1px 2px rgba(15,23,42,.06)}
.apv-cfg-node.approved{border-color:var(--green)}
.apv-cfg-node.pending{border-color:#e8791c}
.apv-cfg-node b{font-size:12.5px}
.apv-cfg-node .muted{font-size:11.5px;margin-top:2px}
.apv-cfg-meta{display:flex;justify-content:space-between;gap:16px;font-size:11px;color:var(--muted);margin-top:6px}
.apv-cfg-acts{display:flex;gap:12px;margin-top:0}
.apv-cfg-act{border-radius:6px;padding:8px 14px;color:#fff;cursor:pointer;min-width:150px}
.apv-cfg-act.ok{background:#2f9e63}
.apv-cfg-act.no{background:#e05a4f}
.apv-cfg-act.back{background:#8a93a0}
.apv-cfg-act .t{font-size:12px;font-weight:600}
.apv-cfg-act .n{font-size:11px;opacity:.9;margin-top:2px}
.apv-cfg-act ul{list-style:none;margin:6px 0 0;padding:0;font-size:11px;background:rgba(0,0,0,.12);border-radius:4px;padding:6px 8px}
.apv-cfg-act ul.hidden{display:none}
/* 显示全部信息 开关（线上橙色） */
.apv-sub-h{display:flex;align-items:center;gap:8px}
.apv-switch{margin-left:auto;display:inline-flex;cursor:pointer}
.apv-switch input{display:none}
.apv-switch span{width:34px;height:18px;border-radius:10px;background:#d6dae1;position:relative;display:inline-block;transition:.15s}
.apv-switch span:after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:#fff;transition:.15s}
.apv-switch input:checked+span{background:#f0871f}
.apv-switch input:checked+span:after{left:18px}
/* 右侧面板底部的审批动作条（待我审批：同意/驳回 + 意见） */
.apv-actions{flex:0 0 auto;margin-top:10px;padding-top:10px;border-top:1px solid var(--border)}
.apv-actions textarea{width:100%;box-sizing:border-box;border:1px solid var(--border);border-radius:6px;font-size:12px;padding:6px 8px;font-family:inherit;resize:vertical}
.apv-act-btns{display:flex;gap:8px;justify-content:flex-end;margin-top:8px}
/* 审批评论（回复 / 讨论） */
.apv-cmts{margin-top:4px}
.apv-cmt{margin:4px 0;padding:5px 8px;background:var(--surface-2);border-radius:4px;font-size:11.5px}
.apv-cmt b{font-weight:600}
.apv-cmt .apv-when{margin-left:8px}
.apv-cmt-body{margin-top:2px;color:var(--text);word-break:break-all}
.apv-reply-lk{color:var(--primary);cursor:pointer;font-size:11.5px;margin-top:3px;display:inline-block}
.apv-composer{flex:0 0 auto;border-top:1px solid var(--border);padding:8px 0 4px}
.apv-composer textarea{width:100%;box-sizing:border-box;border:1px solid var(--border);border-radius:6px;font-size:12px;padding:6px 8px;font-family:inherit;resize:vertical}
.apv-cmt-bar{display:flex;align-items:center;gap:8px;margin-top:6px}
.apv-bottombar{flex:0 0 auto;display:flex;gap:18px;justify-content:flex-end;padding:6px 0 10px;border-top:1px solid var(--border)}
/* 面板外层：透明遮罩承接"点击外部关闭"（不压暗页面，保持线上观感） */
.apv-backdrop{position:absolute;inset:0;background:transparent}

/* ===== 项目组选人（技术负责人 / Sponsor）· 就地编辑 + 组织树 + 综合排名 =====
   口径见 src/app/routers/member_options.py（后端是唯一真源，前端只展示） */
.mo-editor{border:1px solid #c5dcff;background:#f6f9ff;border-radius:8px;padding:8px;margin:6px 0 2px 22px}
.mo-editor .mo-grid{display:grid;grid-template-columns:1fr;gap:8px}   /* 单列：选人区独占左右整宽（两列并排时每边只有 458px，树+候选挤成一团） */
.mo-editor [data-mo-field]{border-top:1px dashed var(--border);padding-top:6px}
.mo-editor [data-mo-field]:first-child{border-top:0;padding-top:0}
.mo-editor [data-mo-field][data-mo-active="1"]{background:rgba(47,158,110,.06);border-radius:8px;padding:6px 8px}
.mo-step{font-size:10.5px;font-weight:400;color:var(--primary);margin-left:4px}
.mo-editor .field{margin:0}
.mo-editor .mo-foot{display:flex;gap:8px;justify-content:flex-end;margin-top:8px}
.mo-pick{border:1px solid var(--border);border-radius:8px;background:var(--surface,#fff);padding:6px}
.mo-head{display:flex;gap:6px;align-items:center}
.mo-head .mo-cur{flex:1;min-width:0;font-size:12.5px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mo-search{flex:0 0 40%;height:26px;font-size:12px;padding:2px 6px;border:1px solid var(--border);border-radius:6px}
.mo-search[hidden]{display:none}   /* 收起态不显示搜索框（只在挑人时出现） */
.mo-body{margin-top:6px}
.mo-cols{display:flex;gap:8px;align-items:flex-start}
.mo-treewrap{flex:0 0 34%;max-height:230px;overflow:auto;border:1px solid var(--border);border-radius:6px;padding:4px}
.mo-listwrap{flex:1 1 auto;min-width:0;max-height:230px;overflow:auto}
.mo-node{cursor:pointer;padding:2px 4px;border-radius:5px;font-size:12px;line-height:1.5}
.mo-node:hover{background:rgba(0,0,0,.04)}
.mo-org{font-weight:600}
.mo-org.bg{color:var(--primary)}
.mo-org.on{color:var(--primary);text-decoration:underline}
.mo-item{display:grid;grid-template-columns:20px 1fr auto auto;gap:6px;align-items:center;
  padding:4px 6px;border-radius:6px;cursor:pointer;border-bottom:1px dashed var(--border)}
.mo-item:hover{background:rgba(0,0,0,.04)}
.mo-item.on{background:var(--primary-weak,rgba(47,158,110,.12))}
.mo-item .mo-rk{font-size:11px;color:var(--muted);text-align:right}
.mo-item .mo-nm{font-size:12.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mo-item .mo-org-tag{font-size:11px;color:var(--muted);max-width:130px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mo-item .mo-sc{font-size:12.5px;font-weight:700;color:var(--primary);min-width:32px;text-align:right}
.mo-item .mo-why{grid-column:1 / -1;font-size:11px;line-height:1.4}

/* ===== 竞品作战卡：一屏能扫的条（用户 2026-09-18：全是文字没法看） ===== */
/* 一行两张（用户 2026-09-18）：5 张卡一屏放下；窄屏回单列 */
.bc-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:6px}
@media (max-width:1100px){.bc-grid{grid-template-columns:1fr}}
.bc-card{padding:8px 10px}
.bc-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.bc-name{font-size:14px}
.bc-fight{font-size:11.5px;color:var(--muted);background:rgba(0,0,0,.04);border-radius:999px;padding:2px 8px}
.bc-fight b{color:#1F2A37}
.bc-tactic{margin-top:5px;font-size:12.5px;color:#0f2747;background:rgba(47,158,110,.10);border-left:3px solid var(--primary);
  border-radius:4px;padding:4px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bc-cols{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin-top:5px}
.bc-cols4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin-top:5px}
.bc-sec{min-width:0}
.bc-h{font-size:11px;font-weight:700;color:var(--muted);margin-bottom:3px}
.bc-h.ok{color:#1c7a3f}.bc-h.bad{color:#b5610c}.bc-h.warn{color:var(--primary)}
.bc-strip{display:flex;flex-wrap:wrap;gap:4px}
.bc-chip{font-size:11.5px;line-height:1.35;border-radius:6px;padding:1px 6px;max-width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bc-chip.bc-ok{background:rgba(28,122,63,.10);color:#1c7a3f}
.bc-chip.bc-bad{background:rgba(181,97,12,.12);color:#8a4b08}
.bc-chip.bc-warn{background:rgba(47,158,110,.12);color:#1b6b4a}
.bc-chip.bc-plain{background:rgba(0,0,0,.05);color:#334}
.bc-moretag{font-size:11px;color:var(--muted);align-self:center}
.bc-mine{font-size:11.5px;color:#c0392b;background:rgba(192,57,43,.08);border-radius:6px;padding:3px 8px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bc-toggle{margin-top:6px}
.bc-fold{margin-top:6px;border-top:1px dashed var(--border);padding-top:6px;display:grid;gap:6px}
.bc-fold[hidden]{display:none}   /* 必须显式写：上面的 display:grid 会压过 hidden 的 display:none（踩过，白占 175px） */
.bc-long{font-size:12px;color:#334;line-height:1.6;white-space:pre-wrap}

/* 作战卡·横向对比矩阵：一行一对手，单元格里仍是短条 chips */
.bc-matrix{table-layout:fixed;width:100%;font-size:12.5px}
.bc-matrix th{font-size:11px;font-weight:700;color:var(--muted);text-align:left;padding:6px 8px;border-bottom:1px solid var(--border)}
.bc-matrix td{vertical-align:top;padding:6px 8px;border-bottom:1px dashed var(--border)}
.bc-matrix td .bc-strip{gap:3px}
.bc-matrix td .bc-chip{font-size:11px}

/* ===== 单客户 SWOT 矩阵（用户 2026-09-18）：2×2 四象限 + 对策 + 动作 ===== */
.swot-wrap{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.swot-q{border:1px solid var(--border);border-radius:8px;padding:6px 8px;min-width:0}
.swot-q.s{background:rgba(28,122,63,.06);border-color:rgba(28,122,63,.35)}
.swot-q.w{background:rgba(181,97,12,.06);border-color:rgba(181,97,12,.35)}
.swot-q.o{background:rgba(47,158,110,.07);border-color:rgba(47,158,110,.35)}
.swot-q.t{background:rgba(192,57,43,.06);border-color:rgba(192,57,43,.35)}
.swot-h{font-size:11.5px;font-weight:700;margin-bottom:3px;display:flex;justify-content:space-between}
.swot-li{font-size:12px;line-height:1.5;margin-bottom:2px}
.swot-li .muted{font-size:10.5px;font-weight:400;display:block}
.swot-strats,.swot-acts{grid-column:1 / -1;margin-top:2px}
.swot-strat{font-size:12px;line-height:1.5;border-left:3px solid var(--primary);background:rgba(0,0,0,.02);
  border-radius:4px;padding:3px 8px;margin-bottom:3px}
.swot-strat b{margin-right:6px}
.swot-act{font-size:12px;line-height:1.5;margin-bottom:1px}

/* ── 我的待办：一条＝一行，字段横排成列（原来标题与副信息堆成两行，一屏看不了几条；
   客户 2026-09-19：「为啥不一行显示多列，而搞成一条两行」）────────────────── */
.td-row{display:grid;align-items:center;gap:8px;padding:5px 10px;margin-bottom:3px;cursor:pointer;
  grid-template-columns:52px 172px minmax(150px,1.45fr) minmax(110px,1fr) 118px auto 14px}
.td-row .td-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
/* 来源徽标：最长的是「📌 临期里程碑（≤7天/逾期）」163px —— 列宽要放得下它，且徽标绝不越过本列
   （徽标是 nowrap 的 inline-flex，溢出会直接压到标题列上，客户 2026-09-19 反馈「字与第三列重叠」）。 */
.td-row .badge{max-width:100%;min-width:0}
.td-row .badge .td-ell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}   /* flex 容器自身不产生行盒，省略号必须落在内层 span 上 */
.td-row .td-due{font-size:11px;color:var(--muted);text-align:right;white-space:nowrap}
.td-row .btn-sm{padding:2px 9px;font-size:12px}   /* 行内按钮撑高整行（30px→22px），压掉后一条 ≈34px 一屏多看好几条 */
/* 行内操作＝一个格子里并排两个按钮（两个独立 grid 子元素会各占一格、把这一行挤成两行） */
.td-row .td-acts{display:flex;gap:6px;align-items:center;justify-self:end}
.td-row .td-assign{color:var(--muted)}                 /* 指派是次行动，弱化；主行动仍是「去处理」 */
.td-row .td-assign:hover{color:var(--primary);border-color:var(--primary)}
/* 窄屏：副信息列（最次要）整列收起，其余列保留，仍是一行一条 */
@media (max-width:1100px){
  .td-row{grid-template-columns:52px 172px minmax(0,1fr) 118px auto 14px}
  .td-row .td-subwrap{display:none}
}
/* 筛选条：一行放完（象限标签 + 来源下拉）；窄屏宁可横向滚动也不换行 */
#tdFilter{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;overflow-x:auto;margin-bottom:8px;padding-bottom:2px}
#tdFilter>*{flex:0 0 auto}                              /* 谁都不许收缩（收缩会把按钮里的字挤到第二行） */
#tdFilter .seg button{white-space:nowrap}
@media (max-width:1200px){ .td-qlab{display:none} }     /* 窄一点只留「🔥4」这样的图标+数字，仍是一行 */
.td-srcsel{flex:0 0 auto;height:32px;font-size:12.5px;padding:0 8px;border:1px solid var(--border);
  border-radius:var(--radius);background:var(--surface);color:var(--text);max-width:280px}
#tdList{padding-bottom:56px}   /* 让开右下角 AI 悬浮球（#aiFab）：否则最后一条的「去处理」被压在球下面点不到 */

/* ===== 2026-09-21 对齐纷享销客「销售线索」详情右上角动作条（关注 · 转移 · 分配 · 提醒 · ⋯） =====
   线上实测（客服账号，2026-09-21 复核）：按钮高 28px / 内边距 7px 10px / 圆角 6px / 1px 实线 #C1C5CE /
   字号 13px / 字重 500 / 白底、文字 #181C25；按钮间距 8px；
   ⋯ 为 28×28 同尺寸图标按钮，展开时描边转橙（#FF9B29，本系统用 --accent），浮层菜单白底 8px 圆角、
   行高 20px + 6px 8px 内边距（首三项＝复制 / 编辑 / 市场活动邀约情况，其后收纳本地生命周期动作）；
   行末 ⟳ / ⛶ 为 16px 无框图标、与按钮集群隔 16px（关闭按钮归标题栏 .x）。 */
.fx-act-bar{display:flex;gap:8px;align-items:center;margin-bottom:8px;flex-wrap:wrap}
.fx-act{height:28px;padding:0 10px;font-size:13px;line-height:26px;font-weight:500;color:var(--text);background:var(--surface);
  border:1px solid #C1C5CE;border-radius:var(--radius-sm);cursor:pointer;display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
.fx-act:hover{border-color:var(--primary);color:var(--primary)}
.fx-act.on{color:var(--accent);border-color:var(--accent);background:var(--surface)}   /* 已关注 / ⋯ 展开态：线上描边转橙、底色仍白 */
.fx-heart{font-size:13px}
.fx-act-more{padding:0;width:28px;justify-content:center;font-size:14px;line-height:26px;letter-spacing:0}
.fx-act-wrap{position:relative;display:inline-flex}
.fx-menu{position:absolute;right:0;top:36px;min-width:122px;background:var(--surface);border:1px solid var(--border);
  border-radius:8px;box-shadow:var(--shadow-lg);padding:8px 0;z-index:1200}
.fx-menu a{display:block;padding:6px 8px;font-size:13px;line-height:20px;color:var(--text);text-decoration:none;white-space:nowrap}
.fx-menu a:hover{background:var(--surface-2)}
.fx-menu a.dis{color:var(--muted);cursor:default}   /* 保留 hover 以便显示 title 说明，点了无动作 */
.fx-menu-sep{height:1px;background:var(--border);margin:4px 0}
.fx-chipbox{display:flex;flex-wrap:wrap;gap:6px;min-height:34px;padding:6px 8px;border:1px dashed var(--border);
  border-radius:var(--radius-sm);background:var(--surface-2)}
.fx-chip{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border-radius:var(--radius-full);
  background:var(--primary-50);color:var(--primary-600);font-size:12.5px}
.fx-chip a{color:var(--muted);text-decoration:none;font-size:14px;line-height:1}
.fx-chip-pick{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;border:1px solid var(--border);
  border-radius:var(--radius-full);background:var(--surface);font-size:12.5px;font-weight:400;cursor:pointer}


/* ── 2026-09-21 用户口径：系统内**所有表单/字段一律单行、文字不换行**（超出打省略号）──────────
   背景：`.field>label` 与 `td` 原本是 word-break:break-word，标签/单元格一长就折成两行 ——
   表格行高参差、表单看着没对齐。现在统一单行 + 省略号；完整内容仍在 title（表格）或悬停可见。
   例外（保持自然换行）：textarea（多行输入）与正文类（合同条款 .cbody、AI 消息、文档预览、pre）。 */
.field>label,.fld>label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-break:keep-all;line-height:1.4}
.field .muted,.fld .muted{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.field input,.field select,.fld input,.fld select{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-break:keep-all}
td .muted,td b,td span,td div{white-space:nowrap}
.kv{align-items:center;white-space:nowrap;flex-wrap:nowrap;overflow:hidden}
/* 列设置：行首拖拽把手 + 拖拽态/落点提示（2026-09-23，与 ↑↓ 并存） */
.cs-grip{cursor:grab;color:var(--muted);margin-right:6px;user-select:none;-webkit-user-select:none}
.kv.dragging{opacity:.45}
.kv.drop-before{box-shadow:inset 0 2px 0 var(--primary)}
.kv.drop-after{box-shadow:inset 0 -2px 0 var(--primary)}
.kv>*{min-width:0}
.kv .k{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:10px}
.kv>span:last-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;text-align:right}
/* 正文类不受单行约束（这些是"读的内容"，不是表单） */
textarea,.cbody,.ai-msg,.msg-body,.doc-preview,pre,.clause-body{white-space:pre-wrap}


/* 2026-09-21（续）：卡片/区块里的**说明句**一律单行 —— 客户截图指出「权限设置 → Agent 权限」那块
   说明文字折了两行（上一轮只约束了表单字段/表格/键值对，说明段落漏了）。
   这类都是"一句话提示"而非正文；超长则省略号 + title 看全文。
   正文类（.cbody / AI 消息 / 文档预览 / pre / textarea）不受影响。 */
.card>p.muted,.card>p,.sec-desc,.hint,.tip,#view>p.muted{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* 发布按钮：线上橙底白字（实测色 #ff8f1f） */
.opp-feed-cmp-ft .opp-feed-btn-pub{background:var(--primary);border-color:var(--primary);color:#fff}
.opp-feed-cmp-ft .opp-feed-btn-pub:hover{background:var(--primary-600);border-color:var(--primary-600)}
/* 富文本编辑区：线上 14px / 白底 */
.fx-rich-body{font-size:14px;line-height:1.5;background:#fff}
.fx-rich{border:1px solid rgb(193,197,206);border-radius:8px;background:#fff;overflow:hidden}

/* 动态条目：按线上截图（头像行 + 字段行 + 查看更多 + CRM 块 + 底部操作行 + 列表尾） */
.fx-pub-ico{font-size:13px;margin-right:4px;color:#91959e}
.opp-feed-pub-mini{border:1px solid rgb(193,197,206);border-radius:8px;padding:10px 12px;background:#fff}
.fx-fobj{font-size:12px;color:rgb(145,149,158)}
.opp-feed-more{color:rgb(145,149,158);margin-left:2px}
.fx-frows{margin:2px 0 6px}
.fx-frow{display:flex;gap:10px;align-items:baseline;padding:2px 0;font-size:12.5px;line-height:20px}
.fx-frow .k{flex:0 0 96px;color:rgb(145,149,158)}
.fx-frow .v{flex:1;color:rgb(24,28,37);word-break:break-word}
.fx-fmorebtn{display:inline-block;font-size:12px;color:#1677ff;text-decoration:none;padding:2px 0}
.fx-fcrm{border:1px solid rgb(193,197,206);border-radius:6px;overflow:hidden;margin:6px 0}
.fx-fcrm-h{background:#f5f6f7;font-size:12px;color:rgb(84,88,97);padding:4px 8px}
.fx-fcrm .fx-frow{padding:6px 8px;margin:0}
.fx-fops{display:flex;align-items:center;gap:12px;font-size:12px;color:rgb(84,88,97);padding-top:6px;border-top:1px solid var(--border);margin-top:6px}
.fx-fops a{color:rgb(84,88,97);text-decoration:none}
.fx-fops a:hover{color:var(--primary)}
.fx-listend{text-align:center;font-size:12px;color:rgb(145,149,158);padding:14px 0 4px}
.fx-empty{display:flex;flex-direction:column;align-items:center;gap:8px;padding:36px 0 20px;color:rgb(145,149,158);font-size:12.5px}

/* 关联业务数据：搜索框＝描边外壳 + 内嵌无边框输入（线上实测 外壳描边/内输入 28px 13px 无边框） */
.fx-searchwrap{display:flex;align-items:center;height:32px;box-sizing:border-box;border:1px solid rgb(193,197,206);border-radius:8px;background:#f5f6f7;padding:0 8px;margin-top:4px}
.fx-searchin{border:none;outline:none;background:transparent;font-size:13px;color:rgb(24,28,37);width:100%}
.fx-searchin::placeholder{color:rgb(145,149,158)}
.fx-frmlink{color:#1677ff;text-decoration:none}
.fx-frmlink:hover{text-decoration:underline}
.fx-fcrm .fx-frow .v a{color:#1677ff}

/* 线索详情右栏动态条目（2026-09-21 对齐纷享截图）：灰色人形头像 / 姓名深色 / CRM 头部网格图标 / 操作行悬停显现 */
.lead-detail-mask .opp-feed-ava{background:#eef0f3;color:#c3c7d1}
.lead-detail-mask .opp-feed-ava svg{width:26px;height:26px}
.lead-detail-mask .opp-feed-nm{color:rgb(24,28,37)}
/* 姓名列宽：.opp-feed-who 的 92px 右内边距是给**绝对定位**的 .opp-feed-kind 预留的（商机动态卡），
   线索详情右栏的对象标签 .fx-fobj 是流内 flex 项，不用预留 —— 否则 144px 的姓名列只剩 52px 可用，
   「姓名+所属部门」会被折成三行。 */
.lead-detail-mask .opp-feed-who{padding-right:0}
.lead-detail-mask .fx-fops{display:none;border-top:none;margin-top:2px}
.lead-detail-mask .opp-feed-it:hover .fx-fops{display:flex}
.fx-fcrm-h{display:flex;align-items:center;gap:5px}
.fx-fcrm-h svg{width:13px;height:13px;flex:0 0 13px;color:rgb(84,88,97)}

/* 「关联业务数据」检索结果浮层（在右栏内联，不用弹窗） */
.fx-linklist{margin-top:4px;border:1px solid rgb(193,197,206);border-radius:8px;background:#fff;max-height:200px;overflow:auto;box-shadow:0 2px 8px rgba(0,0,0,.06)}
.fx-linkit{display:flex;justify-content:space-between;gap:8px;padding:6px 10px;font-size:12.5px;cursor:pointer;border-bottom:1px solid var(--border)}
.fx-linkit:last-child{border-bottom:none}
.fx-linkit:hover{background:#f5f6f7}
.fx-linkit .muted{font-size:11.5px}

/* 沟通内容编辑区：框内白底、上边距与最小高度照线上 */
.fx-rich .fx-rich-body{border-bottom:none;margin:0;padding:8px;min-height:120px}

/* 跟进记录的回复（对齐线上「回复」）：条目下缩进列表 + 就地输入框 */
.fx-cmts{margin-top:6px}
.fx-cmt{display:flex;gap:8px;padding:5px 0 5px 6px;border-top:1px dashed var(--border)}
.fx-cmt-av{flex:0 0 22px;width:22px;height:22px;border-radius:50%;background:var(--surface-2);color:rgb(84,88,97);display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}
.fx-cmt-bd{flex:1;min-width:0}
.fx-cmt-nm{font-size:12px;color:rgb(84,88,97);display:flex;gap:6px;align-items:baseline}
.fx-cmt-tx{font-size:12.5px;color:rgb(24,28,37);white-space:pre-wrap;margin-top:1px}
.fx-cmt-ops{display:flex;gap:10px;font-size:11.5px;margin-top:2px}
.fx-cmt-ops a{color:rgb(145,149,158);text-decoration:none}
.fx-cmt-ops a:hover{color:var(--primary)}
.fx-cmtform{margin:6px 0 2px 30px}

/* 详情主操作行末的无框图标（刷新 / 放大 / 关闭）——2026-09-21 对齐线上：图标不带边框、16px、灰 #666，
   与动作按钮集群之间空 16px（线上 ⟳ 与 ⋯ 之间即一段留白），关闭按钮仍由标题栏 .x 承担 */
.fx-act.fx-act-ic{border:none;background:none;color:var(--muted);padding:0 4px;font-size:16px;line-height:26px}
.fx-act.fx-act-ic:hover{color:var(--primary);background:none}
.fx-act-bar .fx-act-ic{margin-left:8px}
.modal-mask.lead-detail-mask .modal-head .x{font-size:18px}

/* 「转换」弹窗（2026-09-21 照抄纷享）：三张可选卡 + 预设业务类型 + 两个自动带入复选框 */
.cv-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:10px}
.cv-card{position:relative;border:1px solid var(--border);border-radius:8px;padding:20px 8px;text-align:center;cursor:pointer;background:var(--surface);transition:background .12s,border-color .12s}
.cv-card:hover{border-color:var(--primary-soft)}
.cv-card.on{border-color:var(--primary);background:var(--primary-50)}
.cv-tick{position:absolute;top:5px;right:9px;font-size:13px;color:var(--primary);opacity:0}
.cv-card.on .cv-tick{opacity:1}
.cv-ic{font-size:22px;line-height:1;color:var(--muted)}
.cv-card.on .cv-ic{color:var(--primary)}
.cv-t{font-size:13px;margin-top:10px;color:var(--text)}
.cv-card.on .cv-t{color:var(--primary)}
.cv-types{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:14px}
.cv-type{height:32px;box-sizing:border-box;border:1px solid rgb(193,197,206);border-radius:6px;font-size:12px;padding:0 8px;background:#fff;color:var(--text);width:100%}
.cv-ck{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text);margin:7px 0}

/* 转换表单：仅显示必填字段（与线索/商机表单同口径） */
.opp-form-pane.req-only .field.opt{display:none}

/* ===== 2026-09-21 「转换」第二步弹窗结构对齐纷享线上（截图逐项）=====
   页签头部栏（pane 名蓝字 + 右「配置」）· 关联到已有客户/新建客户单选 · 标签设置(常用/必填/范围) · 右上 提交/保存草稿/取消 */
.cvf-pane-head{display:flex;align-items:center;justify-content:space-between;background:var(--surface-2);
  border-radius:6px;padding:7px 12px;margin:0 0 10px}
.cvf-pane-head .cvf-pane-name{font-size:14px;font-weight:700;color:var(--primary)}
.cvf-pane-head .cvf-cfg{font-size:12.5px;color:var(--primary);cursor:pointer;user-select:none}
.cvf-pane-head .cvf-cfg:hover{text-decoration:underline}
.cvf-linkmode{display:flex;flex-direction:column;gap:7px;margin:2px 0 10px}
.cvf-linkmode .cvf-radio{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--text);cursor:pointer;width:fit-content}
.cvf-linkmode .cvf-radio input{accent-color:var(--accent)}
.cvf-linkpick{margin:0 0 10px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:var(--surface)}
.cvf-linkpick input{width:100%;box-sizing:border-box;height:30px;border:1px solid var(--border);border-radius:6px;padding:0 8px;font-size:13px}
.cvf-linkpick .cvf-linklist{margin-top:4px}
.cvf-linkpick .cvf-link-it{padding:6px 8px;font-size:13px;color:var(--text);border-radius:6px;cursor:pointer}
.cvf-linkpick .cvf-link-it:hover{background:var(--surface-2)}
.cvf-linkpick .cvf-link-none{padding:6px 8px;font-size:12px;color:var(--muted)}
.cvf-taglbl{margin-left:24px;font-size:14px;color:var(--text)}
.cvf-tags{display:inline-flex;align-items:center;gap:2px}
.cvf-tag{border:none;background:none;padding:2px 8px;font:inherit;font-size:13px;color:var(--muted);cursor:pointer;border-radius:4px}
.cvf-tag:hover{color:var(--text)}
.cvf-tag.on{color:var(--accent);font-weight:700}
/* 「关联到已有客户」态：隐藏新建客户字段区（照线上切到客户搜索） */
.opp-form-pane.link-existing .opp-form-group{display:none}
/* 禁用字段灰显（线上「客户定级」等锁定字段为灰底）：压过 .modal.opp-full .field 的白底配色 */
.modal.opp-full .field select[disabled],.modal.opp-full .field input[disabled]{background:var(--surface-2);color:var(--muted);cursor:not-allowed}

/* ===== 2026-09-21 线索列表页头：页签 + 工具条同排 =====
   工具（筛选/字段下拉/搜索/视图/列设置/刷新）从独立 tool-bar 行并进页签行，聚在「新建」左侧那段空位，
   整组靠右（margin-left:auto），页签行放得下就是一行；放不下时这一组整体换到第二行仍贴右，页签永不被压扁。 */
.lead-head{display:flex;align-items:flex-end;flex-wrap:wrap;gap:8px;border-bottom:1px solid var(--border);margin-bottom:8px}
.lead-head > .fx-tabs{flex:0 1 auto;min-width:200px;flex-wrap:nowrap;overflow-x:auto;border-bottom:0;margin:0;padding-bottom:6px;scrollbar-width:thin}
.lead-head > .fx-tabs::-webkit-scrollbar{height:3px}
.lead-head-tools{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:6px;padding-bottom:6px;margin-left:auto;flex:0 1 auto}
.lead-head-tools > .btn, .lead-head-tools > select, .lead-head-tools > input{height:28px;padding-top:0;padding-bottom:0;line-height:26px}
.lead-head-tools > select{max-width:100px;padding-left:8px;padding-right:6px;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--text);font-size:12px}
.lead-head-tools > input{padding-left:10px;padding-right:10px;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--text);font-size:12.5px}
.lead-head-tools > input#lMineQ{flex:0 1 140px;width:140px;min-width:100px}
.lead-head-tools .fx-view-icons{flex:0 0 auto}
.lead-head-tools .fx-view-icons a{width:22px}
.lead-head-sync{font-size:11px;color:var(--muted);white-space:nowrap;max-width:280px;overflow:hidden;text-overflow:ellipsis}

/* ===== 2026-09-21 线索表单：只读多行字段（线上「历史（老系统）跟进记录」）=====
   纷享线上该行是**灰显禁用的多行框**（disabled textarea，无字数计数）；此前本地渲染成单行灰字
   （.opp-form-ro），与线上外形完全不同。这里按线上口径出 disabled textarea，并补一条高优先级的
   禁用态配色（.modal.opp-full .field textarea 的 color:var(--text) 会盖掉全局 textarea[disabled]）。 */
.modal.opp-full .field textarea[disabled]{background:var(--surface-2);color:var(--muted);cursor:not-allowed}

/* ===== 移动端壳内嵌（URL 带 ?embed=1，见 app.core.js route()）：只留业务内容 =====
   背景：手机 App 的「详情」把桌面页塞进壳内 WebView（mobile/pages/hybrid/webview）。
   桌面壳的左侧栏 + 顶栏 + 两栏详情 + 展开的流程条在 390px 下要占掉一屏多，
   用户打开详情本该先看到字段 —— 这里在 embed 模式下把这些一次性收掉，桌面端不受影响。 */
body.m-embed .sidebar,
body.m-embed .topbar{display:none!important}
body.m-embed .main{padding:0!important}
body.m-embed #view{padding:0!important}
body.m-embed .modal-mask{padding:0!important;align-items:stretch!important;background:transparent!important}
body.m-embed .modal-mask>.modal{border-radius:0!important;max-height:100vh!important;height:100vh!important;width:100%!important;max-width:none!important;margin:0!important}
body.m-embed .modal-head{padding:6px 10px!important;gap:4px}
body.m-embed .modal-head h3{font-size:14px!important}
body.m-embed .opp-detail-grid{grid-template-columns:minmax(0,1fr)!important;gap:8px!important}
body.m-embed .opp-head-row{gap:4px!important;margin:0 0 6px!important}
body.m-embed .opp-head-row .btn-sm{padding:2px 7px!important;font-size:11px!important}
body.m-embed .opp-flow-card.m-embed-fold .stt-body,
body.m-embed .opp-flow-card.m-embed-fold .stt-seg,
body.m-embed .opp-flow-card.m-embed-fold #oppStageTasksBox,
body.m-embed .opp-flow-card.m-embed-fold #oppDealTasksBox{display:none!important}
body.m-embed .opp-flow-card.m-embed-fold .stt-head{margin-bottom:0!important}
/* ==========================================================================================
   新建项目交付（参考纷享「新建项目交付」页 · 2026-09-23）
   近全屏 + 左锚点导航 + 右两列表单 + 头部按钮组；附件内联在字段里
   ========================================================================================== */
.np-mask{padding:16px;align-items:center}
.np-modal{max-width:none;width:96vw;height:94vh;display:flex;flex-direction:column;overflow:hidden}
.np-head{flex:0 0 auto;gap:10px}
.np-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}
.np-seg{display:inline-flex;border:1px solid var(--border);border-radius:8px;overflow:hidden}
.np-seg button{border:none;background:var(--surface);padding:4px 9px;cursor:pointer;font-size:13px;color:var(--muted)}
.np-seg button.on{background:var(--primary);color:#fff}
.np-tools select{height:30px;border:1px solid var(--border);border-radius:8px;background:var(--surface);font-size:12.5px;padding:0 6px}
.np-chk{display:flex;align-items:center;gap:4px;font-size:12.5px;color:var(--muted);white-space:nowrap}
.np-body{flex:1 1 auto;min-height:0;display:flex;background:var(--surface-2)}
.np-nav{flex:0 0 168px;border-right:1px solid var(--border);background:var(--surface);padding:8px 0;overflow-y:auto}
.np-nav-i{display:flex;justify-content:space-between;gap:6px;padding:8px 14px;font-size:12.5px;color:var(--text);text-decoration:none;border-left:3px solid transparent}
.np-nav-i em{font-style:normal;color:var(--muted);font-size:11px}
.np-nav-i:hover{background:var(--surface-2)}
.np-nav-i.on{border-left-color:var(--primary);background:rgba(27,110,243,.07);font-weight:600;color:var(--primary)}
.np-draft-tip{margin:10px 12px 4px;padding:8px 10px;border-radius:8px;background:var(--warn-soft,#fdf3e2);font-size:11.5px;color:#a56600;line-height:1.6}
.np-form{flex:1 1 auto;min-width:0;overflow-y:auto;padding:14px 18px 40px}
.np-sec{margin-bottom:10px}
.np-sec-t{margin:6px 0 8px;font-size:13.5px;font-weight:700;color:var(--navy,#0f172a);padding-bottom:6px;border-bottom:1px solid var(--border)}
.np-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--np-gap,14px)}
.np-form[data-cols="1"] .np-grid{grid-template-columns:1fr}
.np-form[data-density="compact"]{--np-gap:8px}
.np-form[data-density="cozy"]{--np-gap:14px}
.np-form[data-density="loose"]{--np-gap:22px}
.np-f{min-width:0}
.np-f .np-lb{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);margin-bottom:4px}
.np-f input,.np-f select,.np-f textarea{width:100%;box-sizing:border-box;height:34px;padding:0 9px;border:1px solid var(--border);border-radius:8px;background:var(--surface);font-size:13px;color:var(--text)}
.np-f textarea{height:auto;padding:7px 9px;line-height:1.5;resize:vertical}
.np-cnt{margin-left:auto;font-size:11px;color:var(--muted)}
.np-help{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;background:var(--primary);color:#fff;font-size:10px;cursor:help}
.np-empty{margin:0;font-size:12px;color:var(--muted)}
.np-sw{display:flex;align-items:center;gap:6px;font-size:12.5px}
.np-f-att{grid-column:span 1}
.np-files{display:flex;flex-wrap:wrap;gap:6px;margin-left:6px}
.np-file{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;color:var(--primary);background:var(--brand-soft,#eaf1fe);border-radius:6px;padding:2px 6px;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.np-file b{cursor:pointer;color:var(--muted);font-weight:400}
.np-file-lost{color:#a56600;background:var(--warn-soft,#fdf3e2)}
.np-add{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;color:var(--primary);cursor:pointer;padding:6px 0}
.np-add:hover{text-decoration:underline}
@media(max-width:900px){.np-modal{width:100vw;height:96vh}.np-nav{flex-basis:120px}.np-grid{grid-template-columns:1fr}}

/* 2026-09-23 用户口径：「弹窗左列可以稍宽点，字段名称不要换行」
   · 这类「新建 合同 / 新建项目交付 / 售前文档」共用 _docFormShell 的外壳，统一把左导航加宽到 190px
   · 字段名列改为按内容自适应 + nowrap：字段名不再折行（很长的名字由 title 悬浮显示全文），
     控件列保底 140px，避免长标签把输入框挤没 */
.modal.opp-full .opp-form-shell > .opp-form-nav,
.modal.opp-full .opp-form-shell > nav.opp-form-nav{flex:0 0 190px}
.modal.opp-full .field{grid-template-columns:max-content minmax(140px,1fr)}
.modal.opp-full .field > label{white-space:nowrap;overflow:visible;text-overflow:clip;display:inline-flex;align-items:center;gap:4px;flex-wrap:nowrap}
/* 附件字段的 label 里挂着文件名清单，允许它占多行（清单另起行），但字段名本身仍单行 */
.modal.opp-full .field > label .np-files{flex-wrap:wrap}
.modal.opp-full .field > label .np-help{flex:0 0 auto}

/* ===== 2026-09-23 恢复：以下 4 条为 b4489fe0 之后各提交新增的合法样式（原样保留） ===== */
/* 2026-09-23 用户口径：「+附件为啥不用蓝色」——基础规则 .field>label{color:var(--muted)} 会把它压成深灰，
   这里提高特异性并改用主色（实测计算色 rgb(46,90,140) = --primary #2E5A8C） */
.modal .field label.np-add,.modal.opp-full .field > label.np-add{color:var(--blue);font-weight:500}   /* 亮蓝 #3b82f6（用户：再蓝一点）*/
.modal.opp-full .field > label.np-add:hover{color:var(--navy)}

/* 2026-09-23 用户：记录里的编号/名称用亮蓝（对齐纷享销客），点击进各自弹窗 */
.lnk-code{color:var(--blue);cursor:pointer;text-decoration:none}
.lnk-code:hover{color:var(--primary);text-decoration:underline}
a.lnk-code b{color:inherit}

/* 2026-09-23 用户：详情弹窗照纷享「记录视图」——分组标题 + 一行一个字段（标签左、值右） */
.pj-sec{margin-bottom:12px}
.pj-sec-h{margin:14px 0 4px;font-size:13px;font-weight:600;border-bottom:1px solid var(--border);padding-bottom:5px}
/* 纷享记录视图：组内两列并排（标签左·值右），一行两组 */
.pj-rows{display:grid;grid-template-columns:1fr 1fr;gap:0 22px}
.pj-rows>.field{display:flex;align-items:center;gap:12px;padding:6px 2px;margin:0;border-bottom:1px dashed var(--border);min-width:0}
.pj-rows>.field>label{flex:0 0 150px;margin:0;font-weight:400;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pj-rows>.field>.opp-form-ro{flex:1;min-width:0}
.pj-rows>.field.np-f-att{align-items:flex-start}
.pj-rows>.field.np-f-att>label{padding-top:2px}

.pj-sec-h{cursor:pointer;user-select:none}
.pj-tri{display:inline-block;width:12px;color:var(--muted);font-size:11px}
.pj-sec.collapsed .pj-rows{display:none}
.pj-sep{border-top:1px solid var(--border);margin:16px 0 8px}
.pj-head-bar{display:flex;align-items:center;gap:6px;margin-left:auto;margin-right:10px}
.pj-more{position:relative;display:inline-block}
.pj-more-btn{list-style:none;cursor:pointer;border:1px solid var(--border);border-radius:6px;padding:3px 9px;font-size:13px;line-height:1.3;background:var(--surface)}
.pj-more-btn::-webkit-details-marker{display:none}
.pj-more-menu{position:absolute;right:0;top:calc(100% + 4px);z-index:20;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:6px;min-width:150px;display:none;box-shadow:0 6px 20px rgba(0,0,0,.12)}
.pj-more[open] .pj-more-menu{display:flex;flex-direction:column;gap:6px}

/* 2026-09-23 用户：项目交付详情页签（详细信息 / 交付执行），与记录详情外壳配套 */
.pj-tabs{display:flex;gap:20px;border-bottom:1px solid var(--border);margin:0 0 10px}
.pj-tab{color:var(--muted);text-decoration:none;font-size:13.5px;padding:6px 2px;border-bottom:2px solid transparent}
.pj-tab.on{color:var(--primary);border-bottom-color:var(--primary);font-weight:600}
.pj-tabs + div .ld-grp:first-child .ld-grp-h{margin-top:4px}

/* 2026-09-23 用户：字段两列、字段名不得换行（项目交付详情） */
.pj-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 22px}
.pj-grid>.opp-field-row{min-width:0}
.pj-grid .opp-field-row .k{flex:0 0 150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pj-team{display:flex;flex-wrap:wrap;gap:6px;padding:4px 0}
.pj-team span{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:2px 10px;font-size:12.5px;white-space:nowrap}
.pj-lite-table{width:100%;border-collapse:collapse;font-size:12.5px}
.pj-lite-table th,.pj-lite-table td{border-bottom:1px solid var(--border);padding:6px 8px;text-align:left}
.pj-lite-table th{color:var(--muted);font-weight:500;white-space:nowrap}

/* 2026-09-23 用户：项目交付详情照纷享版面 —— 摘要行 / 页签行右端开关 / 左内容 + 右相关团队栏 */
.pj-sum{display:flex;flex-wrap:wrap;gap:8px 26px;padding:2px 2px 10px;font-size:12.5px}
.pj-sum span{display:flex;gap:6px;align-items:baseline;min-width:0}
.pj-sum i{font-style:normal;color:var(--muted)}
.pj-sum b{font-weight:600;color:var(--text)}
.pj-tabs{align-items:center}
.pj-allsw{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--muted);white-space:nowrap;cursor:pointer}
.pj-allsw input{accent-color:var(--primary)}
.pj-cols{display:grid;grid-template-columns:1fr 300px;gap:18px;align-items:start}
.pj-col-main{min-width:0}
.pj-rail{border-left:1px solid var(--border);padding-left:14px;min-width:0}
.pj-rail-h{margin:0 0 8px;font-size:13px;font-weight:600}
.pj-rail .pj-team{flex-direction:column;align-items:flex-start}
.pj-rail .pj-team span{white-space:normal}
@media (max-width: 1100px){ .pj-cols{grid-template-columns:1fr} .pj-rail{border-left:0;padding-left:0} }
/* ===== 2026-09-23 用户：右上动作条与工具条按钮高度统一（此前 25/27/28/30/38 混杂），口径 28px ===== */
:root{--btn-h:28px}
.modal-head .btn, .modal-head .pj-more-btn, .pj-head-bar .btn, .pj-head-bar .pj-more-btn,
.toolbar .btn, .toolbar summary.pj-more-btn, #view > .toolbar .btn,
.apv-tabs button, .pj-tabs .pj-tab, .pj-allsw{
  height:var(--btn-h); padding:0 10px; font-size:13px; line-height:calc(var(--btn-h) - 2px);
  display:inline-flex; align-items:center; justify-content:center; box-sizing:border-box;
}
/* ===== 2026-09-23 案例库表单（对齐纷享「新建 案例库」）===== */
.cs-shell{display:grid;grid-template-columns:132px 1fr;gap:16px;align-items:start}
.cs-nav{position:sticky;top:0;display:flex;flex-direction:column;gap:4px}
.cs-nav button{text-align:left;border:0;background:transparent;color:var(--muted);font-size:13px;padding:6px 8px;border-radius:6px;cursor:pointer}
.cs-nav button.on{background:var(--surface-2);color:var(--primary);font-weight:600}
.cs-bar{display:flex;align-items:center;gap:6px;margin:0 0 8px;padding-bottom:6px;border-bottom:1px dashed var(--border);flex-wrap:wrap}
.cs-bar .btn.on{background:var(--primary);border-color:var(--primary);color:#fff}
.cs-h{margin:14px 0 6px;font-size:13px;font-weight:600;border-bottom:1px solid var(--border);padding-bottom:5px}
#csForm{max-height:calc(90vh - 190px);overflow-y:auto;padding-right:6px}
#csForm.dense .field,#csForm.dense .opp-field-row{padding-top:1px;padding-bottom:1px}
#csForm.roomy .field,#csForm.roomy .opp-field-row{padding-top:9px;padding-bottom:9px}
/* ===== 合同详情：官方（纷享）同款整页 + 页签（2026-09-23） ===== */
.ct-page{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:0 0 14px}
.ct-page.ct-dfull{position:fixed;inset:0;z-index:900;border-radius:0;overflow:auto;padding-bottom:24px}
.ct-dhead{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:12px 16px;border-bottom:1px solid var(--border)}
.ct-dtitle{font-size:16px;font-weight:700;color:#181c25;display:flex;align-items:center}
.ct-dtitle .ct-code{color:#1677ff;margin-left:6px;cursor:default}
.ct-dacts{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.ct-dacts .btn{font-size:12.5px}
.ct-more{position:absolute;z-index:950;right:16px;margin-top:-2px;background:var(--surface);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px rgba(16,24,40,.14);padding:8px;display:flex;gap:6px;flex-wrap:wrap;max-width:420px}
.ct-dtabs{display:flex;gap:2px;overflow-x:auto;padding:0 12px;border-bottom:1px solid var(--border);background:var(--surface)}
.ct-tab{appearance:none;background:none;border:none;border-bottom:2px solid transparent;padding:11px 12px;font-size:13px;color:#475467;cursor:pointer;white-space:nowrap}
.ct-tab:hover{color:#101828}
.ct-tab.on{color:#101828;font-weight:600;border-bottom-color:#ef7d22}
.ct-dbody{padding:14px 16px 4px}
.ct-pane{min-height:80px}
.ct-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 26px}
.ct-f{display:flex;gap:8px;align-items:flex-start;min-width:0}
.ct-f > label{flex:0 0 168px;text-align:right;color:#6b7686;font-size:12.5px;padding-top:1px;white-space:normal;word-break:break-word;line-height:1.35}   /* 2026-09-23：合同详情并入纷享自定义字段后出现「整句当字段名」（如「验收周期是否符合标准条款：…」）——
      原来 nowrap + 168px 会溢出到邻列，这里允许在字段名列内折行 */
.ct-grid > .ct-f.ct-f-wide{grid-column:1/-1}   /* 长字段名整行铺满，值跟在后面（线上这类字段也是整行） */
.ct-f.ct-f-wide > label{flex:0 0 auto;max-width:46%;text-align:left}
.ct-f.ct-f-wide > .ct-fv{white-space:normal;overflow:visible;text-overflow:clip}
.ct-f > .ct-fv{flex:1;min-width:0;font-size:12.5px;color:#181c25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ct-lnk{color:#1677ff;cursor:pointer}
.ct-lnk:hover{text-decoration:underline}
@media (max-width:1100px){ .ct-grid{grid-template-columns:minmax(0,1fr)} }

/* ---- 合同详情「详细信息」完全对齐纷享记录页（2026-09-23，线上 getBoundingClientRect 实测）----
   线上：单元格 320×38、标签列 84px 左对齐 13px #737881、值列 228px（距标签 92px）13px #181c25、
   列距 32px、行距 0（靠单元格 38px 高）、分组标题 13px/700 #181c25。
   只作用于合同详情那张卡（.ct-fx），不动其它用 .ct-f/.ct-grid 的页面。 */
.ct-fx .ct-grid{grid-template-columns:repeat(2,minmax(0,320px));gap:0 32px;max-width:none;margin:0}
.ct-fx .ct-f{min-height:38px;padding:4px 0;gap:8px;align-items:flex-start}
.ct-fx .ct-f > label{flex:0 0 84px;text-align:left;font-size:13px;line-height:1.35;color:#737881;
  padding-top:0;white-space:normal;word-break:break-word}
.ct-fx .ct-f > .ct-fv{flex:1;min-width:0;font-size:13px;line-height:1.35;color:#181c25;
  white-space:normal;word-break:break-word;overflow:visible;text-overflow:clip}
.ct-fx .ct-f.ct-f-wide{grid-column:1/-1}
.ct-fx .ct-f.ct-f-wide > label{flex:0 0 auto;max-width:46%}
.ct-fx .ct-fx-h{font-size:13px;font-weight:700;color:#181c25;margin:0 0 7px}
.ct-fx .ct-att{display:block;padding:1px 0}
.ct-fx .ct-att .muted{margin-left:4px}
/* 相关团队卡（合同详情右栏，照纷享）：角色 + 人（人员可点开） */
.ct-team{min-width:0}
.ct-tm{display:flex;gap:8px;align-items:baseline;min-height:32px;padding:4px 0;font-size:13px}
.ct-tm-role{flex:0 0 84px;color:#737881}
.ct-tm-who{flex:1;min-width:0;color:#181c25;word-break:break-word}

/* 分组标题＝可折叠（照纷享：fc_head 带三角；本仓复用 .ld-grp 的 details/summary 三角） */
.ct-fx .ld-grp{margin-bottom:12px}
.ct-fx .ld-grp-h{font-size:13px;font-weight:700;color:#181c25;margin:0 0 7px}
/* details 收起时必须真的隐藏内容：作者样式 .ct-grid{display:grid} 会盖掉 UA 的 display:none（同 .ld-grp-body 的老问题） */
.ct-fx details:not([open]) > *:not(summary){display:none}


/* 详细信息：左＝字段卡（跨两行），右＝提示条（第1行）+ 相关团队（第2行）—— 与纷享「字段左 / 关联信息右」同构。
   用 grid 显式摆位（原来的 flex-wrap 会把相关团队挤到下一行左侧）。只作用于 detail 这个 pane。 */
.ct-pane[data-ctpane="detail"]{display:grid;grid-template-columns:710px minmax(0,1fr);
  grid-template-rows:min-content min-content 1fr;align-content:start;gap:12px 14px;align-items:start}
.ct-pane[data-ctpane="detail"] > .ct-fx{grid-column:1;grid-row:1 / span 3}
.ct-pane[data-ctpane="detail"] > :not(.ct-fx):not(.ct-team){grid-column:2;grid-row:1}
.ct-pane[data-ctpane="detail"] > .ct-team{grid-column:2;grid-row:2;align-self:start;flex:none}


/* ===== 2026-09-23 案例库表单（对齐纷享整页表单）：两列栅格 / 必填红星 / 按钮不截断 ===== */
.cs-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 26px;align-items:start}
.cs-grid .opp-field-row{min-width:0}
.cs-grid .opp-field-row .k{flex:0 0 132px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cs-grid .opp-field-row .v input,.cs-grid .opp-field-row .v select{width:100%;box-sizing:border-box}
.cs-grid .opp-field-row .v textarea{width:100%;box-sizing:border-box}
.cs-star{color:#e74c3c;font-style:normal;margin-right:3px}
.opp-field-row.cs-req .k{color:var(--text);font-weight:500}
.pj-head-bar{flex-wrap:wrap;row-gap:6px}
.pj-head-bar .btn{white-space:nowrap}
.cs-shell{grid-template-columns:150px 1fr}
/* ===== 列宽拖动（2026-09-23） ===== */
.rz-table thead th{position:relative}
.rz-table.rz-fixed{table-layout:fixed}
.rz-h{position:absolute;top:0;right:-3px;width:7px;height:100%;cursor:col-resize;user-select:none;z-index:3}
.rz-h::after{content:"";position:absolute;left:3px;top:20%;height:60%;width:1px;background:transparent}
.rz-h:hover::after{background:var(--brand)}
.rz-table thead th{overflow:hidden;text-overflow:ellipsis}
.rz-table.rz-fixed td{overflow:hidden;text-overflow:ellipsis}

/* 沟通记录工具栏的语音按钮（2026-09-23）：只留这一个按钮，做大做显眼 */
.fx-rbi-mic{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 12px;border-radius:8px;
  border:1px solid var(--primary);background:var(--primary);color:#fff;cursor:pointer;font-size:13px;
  font-weight:600;box-shadow:0 1px 2px rgba(16,24,40,.16)}
.fx-rbi-mic:hover{filter:brightness(.96)}
.fx-rbi-mic.rec{background:#d64550;border-color:#d64550;animation:micPulse 1.2s ease-in-out infinite}
.fx-rbi-mic[disabled]{opacity:.6;cursor:not-allowed}
/* ===== 2026-09-23 列表加粗归一（用户：哪些真需要加粗？）=====
   规则：加粗只用于「记录主标识」列 / 分组标题行 / KPI 卡主数值 / 必须一眼看到的异常态。
   列表行里的「数值列（右对齐或 .num）」一律不加粗——靠颜色与字号表达，不靠字重；
   同一行因此最多保留 1 处加粗（主标识），层级不再打架。 */
table tbody td.num b, table tbody td.num strong,
table tbody td[style*="text-align:right"] b, table tbody td[style*="text-align:right"] strong,
table tbody td.r b, table tbody td.r strong { font-weight: inherit; }
table tbody td.muted b, table tbody td.muted strong { font-weight: inherit; }
/* ===== 2026-09-23 用户拍板：列表主标识「不加粗，只做蓝色链接」（纷享口径）=====
   ① 列表行（非分组标题行）里的 b/strong 一律跟随常规字重；
   ② 主标识改用 .lnk-id（蓝链，可点进详情，点击由所在行的行级处理接管）。 */
table tbody td:not([colspan]) > b, table tbody td:not([colspan]) > strong { font-weight: inherit; }
td .lnk-id, td span.lnk-id, td a.lnk-id, .lnk-id{ color:var(--blue); cursor:pointer; text-decoration:none; font-weight:inherit; }
td .lnk-id:hover, .lnk-id:hover{ color:var(--primary); text-decoration:underline; }
td .lnk, td span.lnk, td b.lnk { color: var(--blue); cursor: pointer; text-decoration: none; font-weight: inherit; }
td .lnk:hover { color: var(--primary); text-decoration: underline; }
