:root{
  --bg:#f4f6f9; --panel:#fff; --line:#e5e9f0; --line-soft:#eef1f6;
  --ink:#16243a; --ink-2:#46536b; --ink-3:#8492a8;
  --brand:#1d4ed8; --brand-soft:#eaf0ff;
  --up:#d92b2b; --down:#16a34a;      /* 国内习惯：涨红跌绿 */
  --warn:#c2761a; --warn-soft:#fdf3e3;
  --ok:#16a34a; --ok-soft:#e8f7ee;
  --radius:12px; --shadow:0 1px 2px rgba(16,36,63,.05),0 4px 16px rgba(16,36,63,.05);
}
*{box-sizing:border-box;margin:0;padding:0}
body{font:14px/1.55 -apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
  background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased}
.hidden{display:none!important}

.app{display:flex;min-height:100vh}

/* ---------- 侧边栏 ---------- */
.sidebar{width:232px;flex:0 0 232px;background:var(--ink);color:#c9d3e4;
  display:flex;flex-direction:column;position:sticky;top:0;height:100vh}
.brand{display:flex;gap:12px;align-items:center;padding:22px 20px 20px;border-bottom:1px solid rgba(255,255,255,.08)}
.brand-mark{width:38px;height:38px;border-radius:10px;background:linear-gradient(135deg,#2f6bff,#1d4ed8);
  display:grid;place-items:center;font-weight:700;color:#fff;font-size:15px;letter-spacing:.5px}
.brand-logo{width:34px;height:34px;object-fit:contain;border-radius:9px;background:#fff;flex:0 0 auto}
.am-logo{width:20px;height:20px;object-fit:contain;border-radius:5px;background:#fff;flex:0 0 auto}
.brand-title{font-size:14px;font-weight:600;color:#fff;line-height:1.3}
.brand-sub{font-size:10px;color:#7f90ac;letter-spacing:.6px;text-transform:uppercase}
.nav{flex:1;padding:14px 10px;overflow-y:auto}
.nav-group-label{font-size:10px;color:#63748f;padding:14px 12px 6px;letter-spacing:1px}
.nav-item{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:8px;
  color:#c9d3e4;cursor:pointer;font-size:13.5px;margin-bottom:2px;transition:.15s}
.nav-item:hover{background:rgba(255,255,255,.07);color:#fff}
.nav-item.active{background:var(--brand);color:#fff;font-weight:600}
.ni-icon{width:16px;text-align:center;opacity:.85;font-size:13px}
.sidebar-foot{padding:14px 16px 18px;border-top:1px solid rgba(255,255,255,.08);font-size:11.5px}
.sf-row{display:flex;justify-content:space-between;padding:3px 0;color:#8fa0bb}
.sf-row b{color:#dbe4f0;font-weight:500}
.btn-ghost{width:100%;margin-top:10px;padding:7px;background:transparent;color:#a8b8d0;
  border:1px solid rgba(255,255,255,.16);border-radius:7px;cursor:pointer;font-size:12px}
.btn-ghost:hover{background:rgba(255,255,255,.07);color:#fff}

/* ---------- 顶栏 ---------- */
.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{height:60px;background:var(--panel);border-bottom:1px solid var(--line);
  display:flex;align-items:center;justify-content:space-between;padding:0 24px;position:sticky;top:0;z-index:20}
.period-picker{display:flex;align-items:center;gap:10px}
.period-picker select{padding:7px 11px;border:1px solid var(--line);border-radius:8px;
  background:#fff;font-size:13px;color:var(--ink);cursor:pointer;font-weight:500}
.hint{font-size:12px;color:var(--ink-3)}
.hint-def{font-size:11.5px;line-height:1.7;color:var(--ink-3);background:#f6f8fc;border-left:3px solid #c9d6ea;
  border-radius:0 6px 6px 0;padding:7px 10px}
.hint-def b{color:var(--ink-2);font-weight:600}
.badge-soft{font-size:12px;color:var(--ink-3);background:var(--line-soft);padding:5px 11px;border-radius:20px}
.badge-ok{font-size:12px;color:var(--ok);background:var(--ok-soft);padding:4px 10px;border-radius:20px;font-weight:500}

/* ---------- 视图 ---------- */
.view{padding:22px 24px 60px}
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:18px}
@media(max-width:1250px){.grid-2{grid-template-columns:1fr}}

/* ---------- KPI ---------- */
/* 10 张卡片按 5 列排成整两行，避免最后一行只剩 4 张、右侧留空 */
.kpi-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:14px;margin-bottom:18px}
@media(max-width:1400px){.kpi-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:820px){.kpi-grid{grid-template-columns:repeat(2,1fr)}}
.kpi{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  padding:16px 18px;box-shadow:var(--shadow)}
.kpi-label{font-size:12px;color:var(--ink-3);margin-bottom:7px}
.kpi-value{font-size:22px;font-weight:650;letter-spacing:-.4px;line-height:1.2}
.kpi-sub{font-size:11.5px;color:var(--ink-3);margin-top:5px}
.kpi.accent .kpi-value{color:var(--brand)}
.kpi.up .kpi-value{color:var(--up)}
.kpi.down .kpi-value{color:var(--down)}

/* ---------- 面板 ---------- */
.panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  padding:18px 20px 20px;box-shadow:var(--shadow);margin-bottom:18px}
.panel-head{display:flex;align-items:center;justify-content:space-between;
  gap:14px;margin-bottom:14px;flex-wrap:wrap}
.panel-head h3{font-size:15px;font-weight:600}
/* 逾期客户是页面第一块、要「一眼看到」，用浅暖底 + 左侧色条与普通面板区分（不加重边框，避免整页发红） */
.panel-overdue{position:relative;background:linear-gradient(180deg,#fff8f6 0,#fff 92px);border-color:#f2ddd8}
.panel-overdue::before{content:'';position:absolute;left:0;top:16px;bottom:16px;width:3px;
  border-radius:0 3px 3px 0;background:#cf4a3a;opacity:.7}
.panel-actions{display:flex;gap:8px;align-items:center;flex:0 0 auto}
/* 客户信息表的工具条（搜索 + 4 个按钮）在 1440 下已顶到面板右边被裁掉：
   标题不抢宽度，搜索框收窄，整体靠右；真放不下就换行，不会溢出被裁 */
#view-customers .panel-head h3{flex:0 0 auto}
#view-customers .panel-head .panel-actions{flex:0 0 auto;flex-wrap:wrap;justify-content:flex-end;row-gap:8px}
#view-customers .panel-head .panel-actions>.inp{flex:0 0 auto;width:160px;max-width:160px}
/* 面板操作区的按钮/下拉不允许被压窄换行（「变动记录」曾被挤成四行竖排） */
.panel-actions>.btn,.panel-actions>.btn-primary,.panel-actions>.btn-sm{white-space:nowrap;flex:0 0 auto}
/* 面板头上的工具条：标题不抢宽度，工具条整体靠右，真放不下才换行（不然会被面板右边裁掉） */
.panel-head>h3{flex:0 0 auto}
.panel-head>.panel-actions{flex:0 1 auto;min-width:0;flex-wrap:wrap;justify-content:flex-end;row-gap:8px}
/* ⚠ .inp 默认 width:100%，放进工具条会把整条撑爆——「业绩明细」的日期框曾横穿半屏，
   后面的日期/产品线下拉/搜索框/按钮全被推出可视区。这里统一按内容宽度并逐类封顶。 */
.panel-actions>.inp{flex:0 0 auto;width:auto;min-width:0;max-width:220px}
.panel-actions>input[type=date]{width:146px;min-width:146px;max-width:146px}
.panel-actions>select.inp{width:auto;min-width:118px;max-width:180px}
#perfKw{width:168px;max-width:168px}
.chart{width:100%;height:320px}
.chart.tall{height:380px}

/* ---------- 表格 ---------- */
.table-wrap{overflow:auto;border:1px solid var(--line-soft);border-radius:9px;margin-top:14px}
.tbl{width:100%;border-collapse:collapse;font-size:13px;white-space:nowrap}
.tbl th{background:#f8fafc;text-align:left;padding:10px 13px;font-weight:600;
  color:var(--ink-2);border-bottom:1px solid var(--line);position:sticky;top:0;font-size:12.5px;z-index:2}
.tbl td{padding:9px 13px;border-bottom:1px solid var(--line-soft);color:var(--ink)}
.tbl tbody tr:hover{background:#fafbfd}
.tbl tbody tr:last-child td{border-bottom:none}
.tbl .num{text-align:right;font-variant-numeric:tabular-nums}
.tbl .strong{font-weight:600}
.tbl .muted{color:var(--ink-3)}
.tbl td.editable{cursor:pointer;border-radius:5px}
.tbl td.editable:hover{background:var(--brand-soft);box-shadow:inset 0 0 0 1px #c7d6ff}
/* ---------- 列宽拖拽（CRM 26 列自己调宽窄） ---------- */
.tbl-resizable{table-layout:fixed}
/* fixed 布局下必须裁剪，否则超长公司名会盖到隔壁列上；截断后想看清就把它拖宽 */
.tbl-resizable th,.tbl-resizable td{overflow:hidden;text-overflow:ellipsis}
.tbl-resizable th.resizable{position:relative}
/* 分隔条贴在 th 右内边缘（不是 -5px 外挂）：th 裁了 overflow，外挂的部分会被切掉、点不到 */
.col-resize{position:absolute;top:0;right:0;width:9px;height:100%;cursor:col-resize;z-index:4;
  -webkit-user-select:none;user-select:none}
.col-resize::after{content:'';position:absolute;left:3px;top:24%;width:2px;height:52%;border-radius:1px;
  background:transparent;transition:background .12s}
.col-resize:hover::after{background:var(--brand);opacity:.45}
.col-resize.dragging::after{background:var(--brand);opacity:.9}
body.col-resizing{cursor:col-resize}
body.col-resizing *{-webkit-user-select:none!important;user-select:none!important}
/* 拖动时跟着鼠标的像素提示：不显示这个，用户只能靠感觉猜拉到多少 */
.colw-tip{position:fixed;z-index:9999;background:var(--brand);color:#fff;font-size:11px;
  padding:2px 7px;border-radius:4px;pointer-events:none;font-variant-numeric:tabular-nums;
  box-shadow:0 2px 8px rgba(16,36,63,.18)}
/* 拖表头换列序：整列跟手半透明，落点列左侧/右侧亮一条竖线指示插到哪 */
.tbl-resizable th[draggable="true"]{cursor:grab}
.tbl-resizable th[draggable="true"]:active{cursor:grabbing}
th.col-dragging{opacity:.42;background:var(--brand-soft)}
th.col-drag-over{box-shadow:inset 3px 0 0 var(--brand)}
th.col-drag-over.drop-after{box-shadow:inset -3px 0 0 var(--brand)}
.colw-hint{margin-left:auto}
.colw-hint b{color:var(--brand);cursor:pointer;font-weight:600}
/* 查重弹窗：8 列要挤进一个弹窗，比常规表格再紧一档 */
.tbl-dupe{font-size:12px}
.tbl-dupe th{padding:7px 9px;font-size:11.5px;white-space:normal;line-height:1.35}
.tbl-dupe td{padding:6px 9px}
.tbl-dupe tfoot th{background:#f1f5fb;border-top:1px solid var(--line);position:static}
/* 客户榜：点客户行展开分产品线业绩/毛利 */
.tbl .cust-caret{position:relative;display:inline-block;width:15px;height:14px;margin-right:4px;
  color:#8391a6;vertical-align:-2px;transition:color .16s}
.tbl .cust-caret::before{content:'';position:absolute;left:3px;top:50%;margin-top:-4px;
  border-left:5px solid currentColor;border-top:4px solid transparent;border-bottom:4px solid transparent;
  transition:transform .16s;transform-origin:2px 4px}
.tbl .cust-caret.ghost{visibility:hidden}
.tbl tr.cust-row{cursor:pointer}
.tbl tr.cust-row:hover{background:#f7faff}
.tbl tr.cust-row:hover .cust-caret{color:var(--brand)}
.tbl tr.cust-row.cust-open td:first-child{color:var(--brand)}
.tbl tr.cust-open{background:#f2f7ff}
.tbl tr.cust-open:hover{background:#eef4ff}
.tbl tr.cust-open .cust-caret{color:var(--brand)}
.tbl tr.cust-open .cust-caret::before{transform:rotate(90deg)}
.tbl tr.cust-sub{background:#f8fafd}
.tbl tr.cust-sub:hover{background:#f5f8fc}
.tbl tr.cust-sub td{padding:6px 13px;font-size:12.5px;color:var(--ink-2);
  border-bottom:1px dashed #eaeff6}
.tbl tr.cust-sub td:first-child{border-left:3px solid #c9d8f0}
.tbl tr.cust-sub .cs-line{display:inline-block;margin-left:12px;font-weight:600;color:var(--ink)}
.tbl tr.cust-sub .cs-line::before{content:'└ ';color:#c3cddc;font-weight:400}
.tbl tr.cust-sub .cs-line + .hint{margin-left:8px}
.tbl tr.cust-sub .cs-tag{display:inline-block;margin-left:6px;padding:1px 5px;border-radius:4px;
  background:#eef2f9;color:#6b7a92;font-size:11px;font-weight:400}
.tbl tr.cust-sub .cs-tag + .hint{margin-left:6px}
.tbl tr.cust-sub .cs-gp{font-weight:600;color:var(--ink)}
/* 合作产品业务标签：cid技术 / 星川 / 小红书B站 / 广告收量 … */
.tbl .biz-tag{display:inline-block;padding:1.5px 8px;border-radius:11px;font-size:11.5px;
  font-weight:500;line-height:1.55;white-space:nowrap;background:#eef3fd;color:#3b62a8;
  border:1px solid #dce6f8}
.tbl .biz-tag.sub{font-size:11px;padding:1px 7px;background:#f0f3f8;color:#6b7a92;
  border-color:#e4e9f2}
/* 表头排序按钮：业绩 / 毛利 / 毛利率 可点，当前列显示实心箭头 */
.tbl th .th-sort{display:inline-flex;align-items:center;gap:4px;border:0;background:none;
  font:inherit;color:inherit;cursor:pointer;padding:0;white-space:nowrap}
.tbl th .th-sort:hover{color:var(--brand)}
.tbl th .th-sort .sort-mark{font-size:9px;line-height:1;color:#c3cddc;transform:translateY(-1px)}
.tbl th .th-sort.on{color:var(--brand)}
.tbl th .th-sort.on .sort-mark{color:var(--brand)}
.bar-cell{position:relative}
.bar-cell .bar{display:inline-block;height:6px;border-radius:3px;background:var(--brand);
  vertical-align:middle;margin-right:8px;min-width:2px}
.pill{display:inline-block;padding:2px 9px;border-radius:20px;font-size:11.5px;font-weight:500}
.pill-blue{background:var(--brand-soft);color:var(--brand)}
.pill-green{background:var(--ok-soft);color:var(--ok)}
.pill-warn{background:var(--warn-soft);color:var(--warn)}
.pill-gray{background:#eef1f6;color:var(--ink-3)}

/* ---------- 产品线 → 团队 → 个人 下钻表 ---------- */
.seg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fff}
.seg button{padding:6px 12px;border:none;background:#fff;color:var(--ink-2);font-size:12.5px;
  cursor:pointer;font-family:inherit;white-space:nowrap}
.seg button + button{border-left:1px solid var(--line)}
.seg button:hover{background:#f6f8fb}
.seg button.active{background:var(--brand-soft);color:var(--brand);font-weight:600}
.tbl-tree tr.tree-total td{background:#eef2f8;font-weight:700;border-bottom:1px solid var(--line)}
.tbl-tree tr.tree-l1{cursor:pointer}
.tbl-tree tr.tree-l2{cursor:pointer}
.tbl-tree tr.tree-l1 td{background:#f4f8ff;font-weight:600;border-bottom:1px solid var(--line)}
.tbl-tree tr.tree-l1:hover td{background:#e9f1ff}
.tbl-tree tr.tree-l2 td{background:#fafbfd;font-weight:600}
.tbl-tree tr.tree-l2:hover td{background:#f2f5fa}
.tbl-tree tr.tree-l3 td:first-child{padding-left:13px;color:var(--ink-2)}
.tbl-tree .tg{display:inline-block;width:15px;color:var(--ink-3);font-size:11px;text-align:left}
.tbl-tree .tg-team{margin-left:16px}
.tbl-tree .tg-emp{margin-left:32px;text-align:center;width:13px}

/* ---------- 胶囊式产品线切换 ---------- */
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:2px}
.chips button{padding:5px 13px;border:1px solid var(--line);background:#fff;border-radius:16px;
  font-size:12.5px;color:var(--ink-2);cursor:pointer;font-family:inherit;white-space:nowrap}
.chips button:hover{background:#f6f8fb}
.chips button.active{background:var(--brand-soft);border-color:#c7d6ff;color:var(--brand);font-weight:600}

/* ---------- 表单 ---------- */
.form-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
@media(max-width:1100px){.form-grid{grid-template-columns:repeat(2,1fr)}}
.field{display:flex;flex-direction:column;gap:5px}
.field label{font-size:12px;color:var(--ink-2);font-weight:500}
.inp,.field input,.field select{padding:8px 11px;border:1px solid var(--line);border-radius:8px;
  background:#fff;font-size:13px;color:var(--ink);width:100%;font-family:inherit}
.inp:focus,.field input:focus,.field select:focus{outline:none;border-color:var(--brand);
  box-shadow:0 0 0 3px rgba(29,78,216,.1)}
.form-actions{margin-top:16px;display:flex;gap:10px}
/* 直播服务费表单：控件多（客户/月费/生效月/结束月/产品线/系列/备注 + 2 个按钮），
   不换行会被压成一条线、按钮文字竖排。这里允许换行 + 固定控件高度。 */
.lf-form{flex-wrap:wrap;align-items:center;gap:8px}
.lf-form .inp{height:36px;flex:0 0 auto;width:150px}
.lf-form #lfCust{width:230px}
.lf-form #lfNote{width:190px}
.lf-form .btn,.lf-form .btn-primary{height:36px;white-space:nowrap;flex:0 0 auto;padding:0 16px}
.lf-form select.inp{min-width:132px}
/* 规则页三条 form-actions 通用的老毛病：select 会撑满整行，把按钮压成竖排文字 */
#view-rules .form-actions{flex-wrap:wrap;align-items:center}
#view-rules .form-actions .inp{height:36px}
/* 产品线 + 系列两个下拉必须按内容自适应，否则各占一行，搜索框和按钮被挤到第三行 */
#view-rules .form-actions select.inp{width:auto;min-width:150px;max-width:230px;flex:0 0 auto}
#view-rules .form-actions input.inp{flex:0 0 auto}
#view-rules .form-actions .btn,#view-rules .form-actions .btn-primary{height:36px;white-space:nowrap}
.btn,.btn-primary{padding:8px 18px;border-radius:8px;font-size:13px;cursor:pointer;
  border:1px solid var(--line);background:#fff;color:var(--ink);font-weight:500;font-family:inherit}
.btn:hover{background:#f6f8fb}
.btn-primary{background:var(--brand);color:#fff;border-color:var(--brand)}
.btn-primary:hover{background:#1740b8}
/* 破坏性操作（一键清除等）。⚠ 曾经误用 --down（国内配色里那是「跌=绿」），
   按钮变成浅红底 + 绿字，跟旁边的控件混在一起几乎看不见。这里给真正的警示红。 */
.btn-danger{padding:8px 18px;border-radius:8px;font-size:13px;cursor:pointer;font-family:inherit;
  border:1px solid #f0b4ae;background:#fdf3f2;color:#c23127;font-weight:500;
  white-space:nowrap;flex:0 0 auto}
.btn-danger:hover{background:#fee2e2}
.btn-danger:disabled{opacity:.45;cursor:not-allowed}

/* ---------- 一键清除 ---------- */
.clr-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
@media(max-width:760px){.clr-grid{grid-template-columns:repeat(2,1fr)}}
.clr-quick{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}
.clr-quick .btn{font-size:12.5px;padding:6px 12px}
.clr-checks{display:flex;flex-wrap:wrap;gap:16px;margin-top:12px;font-size:12.5px;color:var(--ink-2)}
.clr-checks label{display:flex;align-items:center;gap:6px;cursor:pointer}
.clr-preview{margin-top:16px;border:1px solid var(--line);border-radius:10px;overflow:hidden}
.clr-preview-head{background:#fafbfd;padding:11px 15px;font-size:13px;font-weight:600;
  border-bottom:1px solid var(--line-soft)}
.clr-stat{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:15px}
.clr-stat div{background:#fafbfd;border:1px solid var(--line-soft);border-radius:9px;padding:11px 13px}
.clr-stat .cs-l{font-size:11.5px;color:var(--ink-3);margin-bottom:4px}
.clr-stat .cs-v{font-size:17px;font-weight:650;font-variant-numeric:tabular-nums}
.clr-warn{margin-top:14px;padding:12px 15px;border-radius:9px;font-size:12.5px;line-height:1.75;
  background:#fff5f5;border:1px solid #f3b4b4;color:#8f2020}
.clr-ok{margin-top:14px;padding:12px 15px;border-radius:9px;font-size:12.5px;line-height:1.75;
  background:var(--ok-soft);border:1px solid #b6e6cd;color:#0a6e42}
.clr-notes{margin:14px 0 0;padding-left:18px;font-size:12px;color:var(--ink-3);line-height:1.8}
.clr-notes li{margin-bottom:2px}
.paste{width:100%;min-height:130px;border:1px solid var(--line);border-radius:9px;padding:12px;
  font:12.5px/1.7 ui-monospace,SFMono-Regular,Menlo,monospace;resize:vertical;color:var(--ink)}
.paste:focus{outline:none;border-color:var(--brand)}

/* ---------- 组织树 ---------- */
.org-line{margin-bottom:20px}
.org-line-title{font-size:13px;font-weight:600;color:var(--ink-2);margin-bottom:10px;
  display:flex;align-items:center;gap:8px}
.org-line-title .dot{width:8px;height:8px;border-radius:50%}
.dot-product{background:#2563eb}.dot-sales{background:#d97706}.dot-functional{background:#64748b}
.org-chips{display:flex;flex-wrap:wrap;gap:9px}
.org-chip{background:#fff;border:1px solid var(--line);border-radius:9px;padding:10px 14px;
  min-width:132px;box-shadow:var(--shadow)}
.org-chip .oc-name{font-size:13px;font-weight:600;margin-bottom:3px}
.org-chip .oc-meta{font-size:11.5px;color:var(--ink-3)}
/* 卡片内第三行：当月薪资汇总（底薪+社保+绩效提成），悬停看拆分 */
.org-chip .oc-pay{font-size:11.5px;color:var(--ink-2);margin-top:4px;padding-top:4px;
  border-top:1px dashed var(--line);font-variant-numeric:tabular-nums}
.org-chip .oc-pay b{color:var(--ink);font-weight:600}

/* ---------- 成本测算 ---------- */
.cost-box{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
@media(max-width:1100px){.cost-box{grid-template-columns:repeat(2,1fr)}}
.cost-item{background:#fafbfd;border:1px solid var(--line-soft);border-radius:9px;padding:13px 15px}
.cost-item .ci-label{font-size:12px;color:var(--ink-3);margin-bottom:5px}
.cost-item .ci-value{font-size:17px;font-weight:600;font-variant-numeric:tabular-nums}
.cost-item .ci-sub{font-size:12px;color:var(--ink-3);margin-top:6px;font-variant-numeric:tabular-nums}
.cost-item .ci-sub b{color:var(--ink-1);font-weight:600;margin-left:2px}
.cost-item.net .ci-sub b{color:var(--brand)}
.cost-item.net{background:var(--brand-soft);border-color:#d5e0ff}
.cost-item.net .ci-value{color:var(--brand)}
.cost-item.neg .ci-value{color:var(--up)}

/* ---------- 弹窗 ---------- */
.modal{position:fixed;inset:0;background:rgba(16,36,63,.42);z-index:100;
  display:grid;place-items:center;padding:24px}
.modal-box{background:#fff;border-radius:14px;width:min(620px,94vw);max-height:86vh;
  display:flex;flex-direction:column;box-shadow:0 24px 60px rgba(16,36,63,.24)}
/* 宽弹窗：粘贴预览这类 10+ 列的表塞进 620px 会挤成一团 */
.modal-box.wide{width:min(980px,96vw)}
.modal-head{display:flex;justify-content:space-between;align-items:center;
  padding:16px 20px;border-bottom:1px solid var(--line)}
.modal-head h3{font-size:15px;font-weight:600}
.modal-head .btn-ghost{width:auto;margin:0;padding:5px 10px;color:var(--ink-3);
  border-color:var(--line);background:#fff}
.modal-body{padding:18px 20px 22px;overflow:auto}
.hl{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--line-soft)}
.hl:last-child{border-bottom:none}
.hl span{color:var(--ink-3);font-size:13px}
.hl b{font-weight:600;font-variant-numeric:tabular-nums}
.hl.warn b{color:var(--warn)}
.hl.ok b{color:var(--ok)}

/* ---------- 粘贴解析：未匹配问题汇总 ---------- */
.issue-box{margin:10px 0 0;border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:var(--panel)}
.issue-box.issue-ok{border-color:#c9ebd5;background:var(--ok-soft)}
.issue-box.issue-warn{border-color:#f3d9ac;background:#fffdf8}
.issue-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin-bottom:8px}
.issue-head b{font-size:13.5px}
.issue-ok .issue-head b{color:#12703a}
.issue-warn .issue-head b{color:#8a5a12}
.issue-tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.issue-tbl th{text-align:left;font-weight:600;color:var(--ink-3);font-size:11.5px;padding:4px 8px;border-bottom:1px solid var(--line-soft)}
.issue-tbl td{padding:7px 8px;border-bottom:1px solid var(--line-soft);vertical-align:top}
.issue-tbl tr:last-child td{border-bottom:0}
.issue-tbl .num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.issue-desc{font-size:11px;color:var(--ink-3);margin-top:2px;max-width:230px;line-height:1.4}
.issue-val{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px;padding:1px 0;font-size:12px}
.issue-val code{background:#f2f4f8;border-radius:4px;padding:1px 5px;font-family:inherit;color:var(--ink)}
.issue-val span{color:var(--ink-3);font-size:11.5px}
.issue-val .issue-amt{color:var(--ink-2);font-variant-numeric:tabular-nums}
.issue-val em{font-style:normal;color:var(--brand);font-size:11.5px}
.issue-more{color:var(--ink-3);font-size:11.5px;padding-top:3px}
.issue-actions{display:flex;align-items:center;flex-wrap:wrap;gap:12px;margin-top:10px;padding-top:9px;border-top:1px dashed var(--line)}
.issue-actions label{font-size:12.5px;color:var(--ink-2);display:flex;align-items:center;gap:6px;cursor:pointer}
.btn-sm{padding:4px 11px;font-size:12px}

/* ---------- 人事维护表单（新增员工 / 编辑字段） ---------- */
.emp-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 16px;margin-bottom:4px}
.emp-form .ef{display:flex;flex-direction:column;gap:4px;min-width:0}
.emp-form .ef>span{font-size:12px;color:var(--ink-3)}
.emp-form .inp{width:100%}
.ef-sep{grid-column:1/-1;margin-top:6px;padding-top:8px;border-top:1px solid var(--line);
  font-size:12.5px;color:var(--ink-2);font-weight:600}

/* 待生效调薪提示：挂在底薪 / 社保数字下方，避免误读当前值 */
.pend-tip{margin-top:1px;font-size:11px;color:#b7791f;white-space:nowrap}
/* 问题表列宽：问题说明 42% / 行数 9% / 金额 15% / 明细 34%，避免说明列被挤成多行 */
.issue-tbl{table-layout:fixed}
.issue-tbl th:nth-child(1),.issue-tbl td:nth-child(1){width:42%}
.issue-tbl th:nth-child(2),.issue-tbl td:nth-child(2){width:9%}
.issue-tbl th:nth-child(3),.issue-tbl td:nth-child(3){width:15%}
.issue-tbl th:nth-child(4),.issue-tbl td:nth-child(4){width:34%}
.issue-tbl .issue-desc{max-width:none}
.issue-tbl td:nth-child(4),.issue-tbl th:nth-child(4){padding-left:20px}
.issue-tbl td:nth-child(3){padding-right:14px}
/* 重复导入弹窗：本次行数少于库里已有 → 提示可能漏贴 */
.num.short{color:var(--warn);font-weight:600}
.hint.short{color:var(--warn);background:var(--warn-soft);border-radius:7px;padding:8px 10px;margin-top:6px}

/* ---------- 每日趋势：分业务线小图 ---------- */
.day-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(330px,1fr));gap:14px}
.day-tile{border:1px solid var(--line-soft);border-radius:10px;padding:10px 12px 2px;background:var(--panel)}
.day-tile.total{border-color:#d9e3f6;background:linear-gradient(180deg,#f7faff,#fff)}
.day-tile-head{display:block;margin-bottom:2px}
.day-tile-head b{font-size:13px;font-weight:600;color:var(--ink)}
.day-tile-head span{font-size:11.5px;color:var(--ink-3)}
.day-tile-chart{width:100%;height:152px}
.day-tile .lg{display:flex;gap:14px;align-items:center;font-size:11.5px;color:var(--ink-3);padding:0 2px 6px}
.day-tile .lg i{display:inline-block;width:14px;height:3px;border-radius:2px;margin-right:5px;vertical-align:middle}
.day-tile-head{margin-bottom:4px}
.day-tile-head>div{min-width:0}
.dt-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.dt-sum{font-size:11.5px;color:var(--ink-3);margin-top:1px}
.day-tile .lg i{width:9px;height:9px;border-radius:3px;margin:0 4px 0 10px}

/* ---------- 登录 / 账号 / 商务视角 ---------- */
.login-mask{position:fixed;inset:0;z-index:300;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(160deg,#eef2fb,#f7f9fc)}
.login-box{width:340px;background:var(--panel);border:1px solid var(--line);border-radius:14px;
  padding:26px 24px 20px;box-shadow:0 18px 48px rgba(20,40,80,.14)}
.login-brand{display:flex;align-items:center;gap:9px;font-size:16px;font-weight:700;color:var(--ink)}
.login-sub{font-size:12px;color:var(--ink-3);margin:6px 0 16px}
.login-box .inp{width:100%;margin-bottom:10px}
.login-err{color:var(--danger,#c0392b);background:#fdeeec;border-radius:7px;padding:8px 10px;
  font-size:12.5px;margin-top:10px}
.login-tip{font-size:11.5px;color:var(--ink-3);margin-top:14px;line-height:1.6}
.user-chip{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink-2);
  background:var(--panel);border:1px solid var(--line);border-radius:999px;padding:4px 11px}
.user-chip b{font-weight:600;color:var(--ink)}
.user-chip .role{font-size:11px;color:var(--brand,#1d4ed8);background:#eaf1ff;border-radius:5px;padding:1px 6px}
/* 商务视角提示条 */
.biz-banner{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12.5px;color:var(--ink-2);
  background:linear-gradient(90deg,#eef4ff,#f8fafd);border:1px solid #d9e3f6;border-radius:10px;
  padding:9px 14px;margin-bottom:14px}
.biz-banner b{color:var(--ink)}
.biz-banner .pill-soft{background:#eaf1ff;color:#1d4ed8;border-radius:999px;padding:2px 9px;font-size:11.5px}
/* 数据质量告警：已知脏数据、但暂不处置（数字照旧计入统计），必须在页面上看得见 */
.dq-banner{background:linear-gradient(90deg,#fff8ec,#fffdf8);border:1px solid #f3d9a8;border-radius:10px;
  padding:10px 14px;margin-bottom:14px;font-size:12.5px;color:#7a4a06}
.dq-banner .dq-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;cursor:pointer;user-select:none}
.dq-banner .dq-tag{background:#f6c86a;color:#5b3702;border-radius:999px;padding:2px 9px;font-size:11.5px;font-weight:600;white-space:nowrap}
.dq-banner b{color:#5b3702}
.dq-banner .dq-sum{margin-left:auto;font-weight:600;white-space:nowrap}
.dq-banner .dq-toggle{color:#a0641a;text-decoration:underline;white-space:nowrap;font-size:12px;background:none;border:0;cursor:pointer;padding:0}
.dq-banner .dq-list{margin:8px 0 0;padding:0;list-style:none;display:grid;gap:6px}
.dq-banner .dq-item{background:#fff;border:1px solid #f0dcb6;border-radius:8px;padding:8px 10px;line-height:1.55}
.dq-banner .dq-item .dt{font-weight:600;color:#7a4a06;margin-right:6px}
.dq-banner .dq-item .det{display:block;color:#8a6329;font-size:12px;margin-top:3px}
.dq-banner .dq-item .imp{color:#b45309;font-weight:600}
.dq-banner.is-open .dq-list{display:grid}
.dq-banner:not(.is-open) .dq-list{display:none}
/* 业绩明细里落在告警区间的日期：黄底 + 行内小标，鼠标悬停看原因 */
.dq-date{display:inline-flex;align-items:center;gap:4px;background:#fdf3d9;border-radius:6px;
  padding:1px 6px;box-shadow:inset 0 0 0 1px #f2ddb0;white-space:nowrap;cursor:help}
.dq-date .dq-mark{font-style:normal;font-size:10.5px;color:#96620b;background:#f7e3b4;
  border-radius:4px;padding:0 4px;line-height:1.5}
/* 顶栏右侧：时间区间 + 视角下拉 + 用户名 + 改密/退出，必须一行排开 */
.topbar-right{display:flex;align-items:center;gap:10px;flex-wrap:nowrap}
.topbar-right .badge-soft{white-space:nowrap}
@media(max-width:1200px){.topbar-right .badge-soft{display:none}}
.user-chip{white-space:nowrap;flex:0 0 auto}
.topbar-right .btn-ghost{width:auto;margin:0;padding:5px 10px;color:var(--ink-3);white-space:nowrap;flex:0 0 auto}

/* ---------- 账号与报表权限 ---------- */
.acct-layout{display:grid;grid-template-columns:296px minmax(0,1fr);gap:20px;align-items:start}
.acct-list{display:flex;flex-direction:column;gap:8px;max-height:calc(100vh - 290px);overflow:auto;padding-right:2px}
.acct-item{border:1px solid var(--line);border-radius:10px;padding:10px 12px;cursor:pointer;
  background:var(--panel);transition:.14s}
.acct-item:hover{border-color:#c7d6ff;background:#fafcff}
.acct-item.on{border-color:var(--brand);background:var(--brand-soft);box-shadow:inset 0 0 0 1px var(--brand)}
.acct-item.off{opacity:.62}
.ai-top{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:13.5px}
.ai-top b{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ai-meta{font-size:11.5px;color:var(--ink-3);margin-top:3px}
.ai-meta b{color:var(--ink-2);font-weight:600}
.ai-meta2{font-size:11px;color:#a2aec1;margin-top:1px}
.ai-off{color:var(--danger,#c0392b)}

.acct-detail{min-width:0}
.acct-empty{color:var(--ink-3);font-size:12.5px;padding:34px 10px;text-align:center;
  border:1px dashed var(--line);border-radius:10px}
.acct-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;
  padding-bottom:14px;border-bottom:1px solid var(--line)}
.acct-title{font-size:17px;font-weight:700;display:flex;align-items:center;gap:8px;
  flex-wrap:wrap;margin-bottom:4px}
.acct-count{display:flex;align-items:baseline;gap:5px;color:var(--ink-3);font-size:11.5px;
  white-space:nowrap;flex:0 0 auto}
.acct-count b{font-size:27px;line-height:1;color:var(--brand);font-weight:700;
  font-variant-numeric:tabular-nums}

.acct-sec{padding:16px 0;border-bottom:1px solid var(--line-soft)}
.acct-sec:last-of-type{border-bottom:none;padding-bottom:4px}
.acct-sec-title{font-size:13.5px;font-weight:600;margin-bottom:10px;
  display:flex;align-items:center;gap:10px;flex-wrap:wrap}

/* 模拟左侧菜单，直观回答「她登录后能看到什么」 */
.acct-preview-row{display:flex;gap:20px;align-items:flex-start;flex-wrap:wrap}
.acct-facts{flex:1 1 340px;min-width:280px;border:1px solid var(--line-soft);
  border-radius:12px;padding:14px 16px 12px;background:#fcfdff}
.af-title{font-size:10.5px;color:var(--ink-3);letter-spacing:.7px;font-weight:600;margin-bottom:8px}
.af-row{display:flex;gap:12px;align-items:baseline;padding:8px 0;
  border-bottom:1px dashed var(--line-soft);font-size:12.5px}
.af-row:last-of-type{border-bottom:none}
.af-row span{color:var(--ink-3);flex:0 0 62px;font-size:11.5px}
.af-row b{font-weight:600;color:var(--ink);line-height:1.5}
.af-row b.sl-warn{color:var(--warn)}
.af-note{margin-top:9px;font-size:11px;color:var(--ink-3);line-height:1.65;
  background:#f4f7fc;border-radius:8px;padding:8px 10px}
.acct-menu{width:238px;background:var(--ink);border-radius:12px;padding:11px 9px;
  box-shadow:0 6px 20px rgba(16,36,63,.16);flex:0 0 auto}
.am-brand{display:flex;align-items:center;gap:8px;color:#fff;font-size:11.5px;font-weight:600;
  padding:2px 7px 9px;border-bottom:1px solid rgba(255,255,255,.08);margin-bottom:6px}
.am-mark{width:21px;height:21px;border-radius:6px;display:grid;place-items:center;font-size:9.5px;
  background:linear-gradient(135deg,#2f6bff,#1d4ed8);color:#fff;flex:0 0 auto}
.am-group{font-size:9.5px;color:#63748f;letter-spacing:1px;padding:7px 7px 4px}
.am-item{font-size:12px;color:#c9d3e4;padding:5.5px 7px;border-radius:6px}
.am-item:nth-child(odd){background:rgba(255,255,255,.03)}
.am-user{margin-top:9px;padding:7px 7px 1px;border-top:1px solid rgba(255,255,255,.08);
  font-size:10.5px;color:#7f90ac}
.am-empty{color:#8a99b3;font-size:11.5px;padding:24px 8px;text-align:center;line-height:1.6}

.perm-groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(268px,1fr));gap:12px}
.perm-group{border:1px solid var(--line-soft);border-radius:10px;padding:9px 11px;background:#fcfdff}
.pg-title{font-size:10.5px;color:var(--ink-3);letter-spacing:.7px;font-weight:600;margin-bottom:5px}
.perm-row{display:flex;gap:9px;align-items:flex-start;padding:6px 7px;border-radius:8px;
  cursor:pointer;transition:.12s}
.perm-row:hover{background:#f4f8ff}
.perm-row.on{background:var(--brand-soft)}
.perm-row.locked{cursor:not-allowed;opacity:.9}
.perm-row input{margin-top:3px;width:15px;height:15px;accent-color:var(--brand);flex:0 0 auto}
.pr-body{display:flex;flex-direction:column;gap:1px;min-width:0}
.pr-name{font-size:12.5px;font-weight:600;color:var(--ink);line-height:1.4}
.pr-tag{font-style:normal;font-size:10px;color:var(--warn);background:var(--warn-soft);
  border-radius:4px;padding:0 5px;margin-left:6px;vertical-align:1px}
.pr-desc{font-size:11px;color:var(--ink-3);line-height:1.5}

.acct-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px}
.acct-grid label{display:flex;flex-direction:column;gap:4px;font-size:11.5px;color:var(--ink-3)}
.acct-grid label.span2{grid-column:1/-1}
.acct-grid .inp{width:100%}
.acct-scope{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin-top:12px;
  padding:9px 12px;background:#f6f8fc;border-left:3px solid #c9d6ea;border-radius:0 8px 8px 0;
  font-size:12.5px}
.acct-scope .sl-k{color:var(--ink-3);font-size:11.5px;flex:0 0 auto}
.acct-scope b{font-weight:600}
.acct-scope b.sl-warn{color:var(--warn)}
.acct-scope .hint{margin-left:auto}
.sl-warn{color:var(--warn)}
.acct-note{font-size:11.5px;color:var(--warn);background:var(--warn-soft);border-radius:8px;
  padding:8px 11px;margin-bottom:10px;line-height:1.6}
.acct-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding-top:16px}
.acct-msg-ok{color:var(--ok)}
.acct-msg-err{color:#c0392b}
.acct-actions .hint{margin-left:2px}

@media(max-width:1080px){
  .acct-layout{grid-template-columns:1fr}
  .acct-list{flex-direction:row;flex-wrap:wrap;max-height:none}
  .acct-item{flex:1 1 220px}
  .acct-grid{grid-template-columns:1fr}
}


/* ---------- 产品线视角 ---------- */
.pl-mode{border:1px solid var(--line);border-radius:8px;background:#fff}
.pl-mode.active{border-color:var(--brand);background:var(--brand-soft);color:var(--brand);font-weight:600}
.pl-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px;margin:4px 0 6px}
.pl-cell{border:1px solid var(--line-soft);border-radius:10px;padding:11px 13px;background:#fcfdff}
.pl-k{font-size:11.5px;color:var(--ink-3);letter-spacing:.2px}
.pl-v{font-size:19px;font-weight:600;color:var(--ink);margin:3px 0 2px;line-height:1.25}
.pl-s{font-size:11.5px;color:var(--ink-2);margin-top:2px}
.pl-bar{height:6px;border-radius:4px;background:var(--line-soft);margin:8px 0 2px;overflow:hidden}
.pl-bar i{display:block;height:100%;border-radius:4px}
.pl-bar i.pl-full{background:#16a34a}
.pl-bar i.pl-warn{background:#c2761a}
.pl-bar i.pl-low{background:#d92b2b}
.pl-pick{display:flex;flex-wrap:wrap;gap:8px;margin:6px 0 2px}
.pl-pick-i{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);
  border-radius:8px;padding:6px 10px;font-size:12.5px;color:var(--ink-2);cursor:pointer;background:#fff}
.pl-pick-i.on{border-color:var(--brand);background:var(--brand-soft);color:var(--brand);font-weight:600}
.pl-pick-i input{accent-color:var(--brand)}
/* 口径切换按钮：.btn-ghost 默认 width:100%，在 flex 行里会被拉伸，这里强制按内容宽度 */
.panel-actions .pl-mode{flex:0 0 auto;width:auto;margin:0;padding:6px 14px;white-space:nowrap}
#plScopeHint{white-space:nowrap}
/* 产品线卡片：6 个指标排成 3 列 × 2 行，避免最后一行只剩一个 */
.pl-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
@media(max-width:720px){.pl-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
/* 客户明细分页 */
.pl-pager{display:flex;align-items:center;justify-content:space-between;gap:10px;
  flex-wrap:wrap;padding:10px 2px 2px}
.pl-pager-btns{display:flex;gap:8px}
.pl-pager .btn{width:auto;flex:0 0 auto}
.pl-pager .btn[disabled]{opacity:.4;cursor:not-allowed;pointer-events:none}
#plCards .pl-rank{width:42px;min-width:42px;color:var(--ink-3);font-size:12px;text-align:right}
/* 可排序表头：默认低调，当前排序列高亮并带箭头 */
#plCards .pl-sort{cursor:pointer;user-select:none;white-space:nowrap}
#plCards .pl-sort:hover{color:var(--brand)}
#plCards .pl-sort.on{color:var(--brand);font-weight:600}
/* 排序标记：未排序列给浅色 ⇅（提示可点），当前列实心箭头 */
#plCards .pl-sort .sort-mark{display:inline-block;margin-left:3px;font-size:10px;line-height:1;
  color:#9aa8bd;transform:translateY(-1px)}
#plCards .pl-sort:hover .sort-mark{color:var(--brand)}
#plCards .pl-sort.on .sort-mark{color:var(--brand);font-size:11px;transform:none}
/* 商务/团队：客户可跨人跨团队，主归属 + 「等N人」，悬停看拆分 */
#plCards .pl-who{white-space:nowrap}
#plCards .pl-who-more{color:var(--ink-3);font-size:11px;margin-left:3px}

/* ---------- 资金管理（垫款回款 / 总账） ---------- */
/* KPI 配色：财务场景不用股市红绿，直接 绿=健康 / 红=风险 */
.kpi.good .kpi-value{color:#16a34a}
.kpi.risk .kpi-value{color:#d92b2b}

/* 应收账款三块已移到左侧菜单，页面顶部的 .fund-tabs 页签条下线 */
.fund-flag.active,.fund-tab.active,.fl-metric.active,.fl-view.active{border-color:var(--brand);
  background:var(--brand-soft);color:var(--brand);font-weight:600}
.pill-red{background:#fdecec;color:#d92b2b}

.fund-act{display:flex;gap:4px;flex-wrap:wrap}
.btn-mini{border:1px solid var(--line);background:#fff;border-radius:6px;padding:3px 8px;
  font-size:11.5px;color:var(--ink-2);cursor:pointer;white-space:nowrap;transition:.15s}
.btn-mini:hover{border-color:var(--brand);color:var(--brand);background:var(--brand-soft)}
.btn-mini-del:hover{border-color:#d92b2b;color:#d92b2b;background:#fdecec}

/* 逾期行：左侧红条 + 极淡红底，扫一眼就能定位 */
tr.fund-ovd td{background:#fffbfb}
tr.fund-ovd td:first-child{box-shadow:inset 3px 0 0 #d92b2b}

.fund-brief{background:#f7f9fd;border:1px solid var(--line-soft);border-radius:9px;
  padding:10px 13px;font-size:12.5px;color:var(--ink-2);margin-bottom:14px;line-height:1.95}
.fund-brief b{color:var(--ink);font-variant-numeric:tabular-nums}
.fund-left{color:#d92b2b}

.form-grid label.span2{grid-column:1/-1}
.modal-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}

.fl-cell{font-variant-numeric:tabular-nums;font-size:12px;white-space:nowrap;cursor:default}
tr.fl-total td{background:#f4f7fc;font-weight:600;border-top:2px solid var(--line)}

/* 筛选栏：.inp 默认 width:100%，放进 flex 行会各占一整行；高度和面板工具条统一 32px */
#view-fund .panel-actions .inp{width:auto;min-width:130px;max-width:190px;
  height:32px;padding:0 10px;font-size:12.5px}
#fundKw{min-width:200px!important}

/* ---------- 面板右上工具条（保证金 / 平台 / 客户垫款共用） ----------
   之前这几个 .inp 没有约束，width:100% 会在右侧挤成三行竖排、按钮再另起一行，
   标题只能孤零零地垂直居中。这里统一成「一行、32px 高、右对齐、放不下才换行」。 */
.fl-tools{display:flex;align-items:center;justify-content:flex-end;
  gap:8px;flex-wrap:wrap;min-width:0}
.fl-tools>*{flex:0 0 auto}
.fl-tools .inp{width:auto;height:32px;padding:0 10px;font-size:12.5px;border-radius:7px;
  background:#fafbfe;border-color:#dfe5f0;color:var(--ink-2);cursor:pointer}
.fl-tools .inp:hover{border-color:#c9d4e6}
.fl-tools .inp:focus{background:#fff;color:var(--ink)}
.fl-tools input[type=search]{min-width:238px;cursor:text}
.fl-tools .btn,.fl-tools .btn-sm,.fl-tools .btn-primary{height:32px;padding:0 13px;
  font-size:12.5px;border-radius:7px;display:inline-flex;align-items:center;line-height:1;
  white-space:nowrap}
/* 筛选器与操作按钮之间的一道细竖线，避免「展开全部」被看成筛选条件 */
.fl-tools .fl-sep{width:1px;height:18px;background:var(--line);margin:0 2px}
@media(max-width:1180px){.fl-tools{justify-content:flex-start}}

/* 台账：长文本单行省略，别把行高顶成三行 */
.fund-clamp{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:210px}
#tblFund td{vertical-align:middle;line-height:1.45}
#tblFund .fund-st{white-space:nowrap}
#tblFund .fund-st .pill{display:block;margin-bottom:3px;width:fit-content}
#tblFund .fund-st .pill:last-child{margin-bottom:0}
/* 归属挤进客户列的第三行小字，省一列的横向空间 */
.fund-who{font-size:11px;color:var(--ink-3);margin-top:2px;max-width:150px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 操作按钮 2×2 排列：横排放不下会换行成 4 行，把整行撑到 120px 高 */
#tblFund .fund-act{display:grid;grid-template-columns:1fr 1fr;gap:4px}
#tblFund .btn-mini{padding:3px 6px;text-align:center}
/* 操作列固定在右侧：列多时横向滚动，按钮始终点得到 */
#tblFund th.fund-ops,#tblFund td.fund-ops{position:sticky;right:0;z-index:2;background:#fff;
  box-shadow:-8px 0 10px -8px rgba(16,36,63,.22);min-width:132px;width:132px}
#tblFund thead th.fund-ops{background:#f8fafc}
#tblFund tr.fund-ovd td.fund-ops{background:#fffbfb}

/* 客户垫款明细的操作列也固定在右侧：这张表 12 列，窄屏要横滚，
   按钮滚出视野时用户会以为「没有编辑功能」，直接在表格里反复点空白 */
#tblFundDetail th.fund-ops,#tblFundDetail td.fund-ops{position:sticky;right:0;z-index:2;background:#fff;
  box-shadow:-8px 0 10px -8px rgba(16,36,63,.22);min-width:132px;width:132px;white-space:nowrap}
#tblFundDetail thead th.fund-ops{background:#f8fafc}
#tblFundDetail tr.fund-ovd td.fund-ops{background:#fffbfb}

/* 平台应收 / 保证金：列也不少，操作列同样固定在右侧 */
#tblFundPlatform th.plat-ops,#tblFundPlatform td.plat-ops,
#tblFundDeposit th.dep-ops,#tblFundDeposit td.dep-ops{position:sticky;right:0;z-index:2;background:#fff;
  box-shadow:-8px 0 10px -8px rgba(16,36,63,.22);white-space:nowrap}
#tblFundPlatform thead th.plat-ops,#tblFundDeposit thead th.dep-ops{background:#f8fafc}
#tblFundDeposit tr.fund-ovd td.dep-ops{background:#fffbfb}
/* 保证金汇总：按收款方折叠成一行小计，点开才看明细 */
#tblFundDeposit tr.dep-grp{cursor:pointer;background:#f6f8fb}
#tblFundDeposit tr.dep-grp:hover{background:#eef3f9}
#tblFundDeposit tr.dep-grp td{padding:10px 8px;border-top:1px solid #e6ecf2}
#tblFundDeposit .grp-caret{display:inline-block;width:14px;color:#7a8aa0;font-weight:700}
#tblFundDeposit .dep-grpsum{color:#4a5a70;font-size:12px;white-space:nowrap}
#tblFundDeposit .dep-grpsum b{color:#1d2b3a;font-size:13px}
/* 汇总行的「未回」挂在分组名下面：一屏十几个分组，未回才是要看的那个数 */
#tblFundDeposit .grp-left{margin:1px 0 0 14px;font-size:11.5px;color:var(--ink-3);white-space:nowrap}
#tblFundDeposit .grp-left b{font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums}
#tblFundDeposit .grp-left b.grp-red{color:#c0392b}
#tblFundDeposit .dep-grpnum{font-weight:600;font-variant-numeric:tabular-nums}
/* 操作列是 sticky 的白底，汇总行是浅灰底 —— 不跟着改会在最右侧留一道白色竖条 */
#tblFundDeposit tr.dep-grp td.dep-ops{background:#f6f8fb}
#tblFundDeposit tr.dep-grp:hover td.dep-ops{background:#eef3f9}
#tblFundDeposit tr.dep-item td{background:#fff}
/* 「登记回款 / 编辑 / 删」三个小按钮要挤在一行，换行会把行高翻倍 */
#tblFundDeposit td.dep-ops .fund-act{flex-wrap:nowrap;justify-content:flex-end}
#tblFundDeposit tr.dep-item td:first-child{padding-left:26px}
/* 两张新表列名比老表长（「当月新增应收」），不压住会折成两行把行高撑乱 */
#tblFundPlatform thead th,#tblFundDeposit thead th{white-space:nowrap}

/* 逾期客户：跟进动作格子直接可点可写，给足「能编辑」的视觉暗示 */
/* td 上的 min-width 在 table-layout:auto 下会被内容压过去，撑宽度只能靠内层块 */
#tblFundOverdue .fund-act-cell{vertical-align:middle;padding:8px 10px;
  box-shadow:inset -1px 0 0 var(--line-soft)}
#tblFundOverdue .fund-act-cell .act-in{min-width:150px;max-width:220px;line-height:1.45;
  font-size:12px;color:var(--ink-2);cursor:text}
#tblFundOverdue .fund-act-cell:hover{background:#f7f9fd;box-shadow:inset 0 0 0 1px var(--brand-soft)}
#tblFundOverdue .fund-act-cell:active{background:var(--brand-soft)}
/* 无写权限的格子：灰化 + 禁止手型，点不动就不该看起来能点 */
#tblFundOverdue .muted-cell{background:#fbfcfd}
#tblFundOverdue .muted-cell .act-in{color:var(--ink-3);cursor:default}
#tblFundOverdue .muted-cell:hover{background:#fbfcfd;box-shadow:inset -1px 0 0 var(--line-soft)}
/* 合计行：客户线 / 逾期客户两张表都有，跟着滚动容器走 */
#tblFundCust tr.fl-total td,#tblFundOverdue tr.fl-total td{font-variant-numeric:tabular-nums;white-space:nowrap}

/* ==================== 客户管理（CRM）====================
   字段与《客户crm管理系统》模板 A~Z 对齐，26 列很宽：
   横向滚动 + 左侧「公司编号 / 公司名称」两列冻结，滚动时始终看得出是哪一行。 */
.cust-filters{display:flex;flex-wrap:wrap;gap:10px 12px;align-items:flex-end;
  padding:11px 13px;margin-bottom:11px;border:1px solid var(--line-soft);
  border-radius:9px;background:#fbfcfe}
.cust-filters label{display:flex;flex-direction:column;gap:3px;font-size:11px;color:var(--ink-3)}
.cust-filters .inp{min-width:118px}
.cust-filters label input[type=date]{min-width:132px}
.cust-filters #cfReset{align-self:flex-end}

/* 宽表：单元格不折行，靠横向滚动；首两列冻结 */
.tbl-crm{border-collapse:separate;border-spacing:0}
.tbl-crm th,.tbl-crm td{white-space:nowrap}
.tbl-crm thead th{position:sticky;top:0;z-index:3;background:#f4f7fc}
.tbl-crm th:nth-child(1),.tbl-crm td:nth-child(1),
.tbl-crm th:nth-child(2),.tbl-crm td:nth-child(2){position:sticky;z-index:2;background:var(--panel)}
.tbl-crm th:nth-child(1),.tbl-crm td:nth-child(1){left:0;width:96px;min-width:96px;max-width:96px}
.tbl-crm th:nth-child(2),.tbl-crm td:nth-child(2){left:96px;width:200px;min-width:200px;max-width:200px}
/* 冻结列与表头的交叉处要盖在最上层，否则滚动时会从缝里透出其它单元格 */
.tbl-crm thead th:nth-child(1),.tbl-crm thead th:nth-child(2){z-index:4;background:#f4f7fc}
.tbl-crm tbody tr:hover td:nth-child(1),.tbl-crm tbody tr:hover td:nth-child(2){background:#f7f9fd}
.tbl-crm td.locked{color:var(--ink-3);background:#fbfcfd}
.tbl-crm td.cust-name{max-width:200px;overflow:hidden;text-overflow:ellipsis}
.tbl-crm td.cust-ops{position:sticky;right:0;background:var(--panel);z-index:2;
  box-shadow:inset 1px 0 0 var(--line-soft)}
.tbl-crm tbody tr:hover td.cust-ops{background:#f7f9fd}
.tbl-crm .sort-mark{display:inline-block;margin-left:3px;font-size:10px;
  line-height:1;color:#c3cddc;transform:translateY(-1px)}
.tbl-crm th[data-sort]:hover .sort-mark{color:var(--brand)}
.tbl-crm .perf-cell{cursor:help}
.tbl-foot{padding:8px 2px 0;display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}
.clamp{display:block;max-width:170px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.neg{color:var(--up)}
.req{color:var(--up)}

/* 合作产品业务标签 */
.coop-tags{display:inline-flex;flex-wrap:nowrap;gap:3px;align-items:center}
.tag{display:inline-block;padding:1px 6px;border-radius:4px;background:#eef2f9;
  color:#42536b;font-size:11px;white-space:nowrap}
.tag-more{background:#e3e9f5;color:var(--ink-3);cursor:help}

/* 两级业务多选：先勾产品线，再勾具体系列 */
.coop-picker{display:grid;grid-template-columns:repeat(auto-fill,minmax(236px,1fr));gap:9px;
  max-height:236px;overflow:auto;padding:10px;
  border:1px solid var(--line-soft);border-radius:9px;background:#fbfcfe}
.coop-group{border:1px solid var(--line-soft);border-radius:8px;padding:7px 9px;background:var(--panel)}
.coop-line{display:flex;align-items:center;gap:5px;font-size:13px;
  margin-bottom:5px;padding-bottom:5px;border-bottom:1px dashed var(--line-soft);cursor:pointer}
.coop-series{display:flex;flex-wrap:wrap;gap:3px 10px}
.coop-series label{display:inline-flex;align-items:center;gap:3px;
  font-size:12px;color:var(--ink-2);cursor:pointer}

/* 详情页：档案字段网格 */
.ci-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(178px,1fr));gap:9px 16px}
.ci{display:flex;flex-direction:column;gap:1px;font-size:12px;min-width:0}
.ci>span{color:var(--ink-3);font-size:11px}
.ci>b{font-weight:600;color:var(--ink);font-size:13px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ci-wide{margin-top:9px;font-size:12px}
.ci-wide>span{display:block;color:var(--ink-3);font-size:11px;margin-bottom:2px}
.ci-wide>b{font-weight:500;color:var(--ink-2);line-height:1.6}
.sub-head{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
  margin:15px 0 7px;font-size:13px;font-weight:600;color:var(--ink)}
.form-grid-3{grid-template-columns:repeat(3,1fr)}
@media(max-width:1100px){.form-grid-3{grid-template-columns:repeat(2,1fr)}}

/* 选项字典维护 */
.dict-list{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:13px}
.dict-item{display:inline-flex;align-items:center;gap:4px;padding:3px 5px 3px 9px;
  border-radius:5px;background:#eef2f9;font-size:12px;color:var(--ink-2)}
.dict-del{border:0;background:transparent;color:var(--ink-3);cursor:pointer;
  font-size:15px;line-height:1;padding:0 2px}
.dict-del:hover{color:var(--up)}
.dict-add{display:inline-flex;align-items:center;padding:3px 11px;border-radius:5px;
  border:1px dashed var(--line);color:var(--brand);cursor:pointer;font-size:12px}
.dict-add:hover{background:var(--brand-soft)}

/* 操作列收窄成图标列，横滚时尽量少遮挡内容 */
.tbl-crm td.cust-ops{width:56px;min-width:56px;max-width:56px;text-align:center;white-space:nowrap}
.op-ico{display:inline-block;cursor:pointer;padding:2px 5px;border-radius:5px;
  color:var(--brand);font-size:13px;line-height:1.3}
.op-ico:hover{background:var(--brand-soft)}
/* 名称后的「+N」：表示这条档案还含几个旧写法（合并进来的各产品线名称） */
.mg-badge{display:inline-block;margin-left:6px;padding:1px 6px;border-radius:9px;
  background:#eef3fb;color:#4a6b9a;font-size:10.5px;font-weight:600;
  vertical-align:middle;cursor:help;font-variant-numeric:tabular-nums}
/* ---------- 未建档客户 ---------- */
/* 业绩里有、档案里没有的名字。金额是重点，所以单独成表、按金额降序，不塞进 19 列的档案表。 */
#tblGhost td.cust-name b{font-weight:500}
#tblGhost td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
#tblGhost tbody tr:hover{background:#f7fafd}
#boxGhost .hint-def{margin:-2px 0 10px}
.ghost-note{color:#8a6a2f}
.ghost-note b{color:#b26a00}
.op-link{display:inline-block;padding:2px 6px;color:var(--brand);cursor:pointer;
  font-size:12px;white-space:nowrap;border-radius:5px}
.op-link:hover{background:var(--brand-soft)}
/* ---------- 客户合并弹窗 ---------- */
.mg-list{display:flex;flex-direction:column;gap:10px;max-height:54vh;overflow:auto;padding-right:4px}
.mg-sec{margin:20px 0 10px;font-size:12.5px;font-weight:600;color:#5a6b80}
.mg-grp{border:1px solid var(--line);border-radius:10px;padding:11px 13px;background:var(--panel)}
.mg-grp-head{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--ink-3);flex-wrap:wrap}
.mg-grp-head b{font-size:13px;color:var(--ink)}
.mg-grp-head .sp{flex:1}
.mg-tip{font-size:11.5px;color:var(--ink-3);margin:6px 0 4px}
.mg-row{display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:7px;cursor:pointer;
  border:1px solid transparent}
.mg-row:hover{background:#f6f8fb}
.mg-row.on{background:var(--brand-soft);border-color:#cfe0f7}
.mg-row input{accent-color:var(--brand);margin:0}
.mg-no{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;color:var(--ink-3);min-width:52px}
.mg-nm{font-weight:600;font-size:13px;min-width:120px}
.mg-team{font-size:11.5px;color:var(--ink-3)}
.mg-meta{margin-left:auto;font-size:11.5px;color:var(--ink-3);text-align:right;line-height:1.5}
/* 底部操作条：列表滚动时钉在底部，否则「关闭」会被长列表顶到看不见的地方。
   bottom 取负的 modal-body 内边距，让白底正好压到弹窗底边，不留一条缝。 */
.mg-foot{position:sticky;bottom:-22px;display:flex;align-items:center;gap:8px;
  margin-top:12px;padding:12px 0;background:#fff;border-top:1px solid var(--line)}
/* ---------- 批量建档 / 店铺归并 ---------- */
.bk-mode{display:flex;gap:10px;margin-bottom:12px}
.bk-mode>label{flex:1;display:flex;gap:8px;align-items:flex-start;padding:11px 13px;cursor:pointer;
  border:1px solid var(--line);border-radius:10px;background:var(--panel)}
.bk-mode>label:has(input:checked){border-color:var(--brand);background:var(--brand-soft)}
.bk-mode label input{margin-top:2px;accent-color:var(--brand)}
.bk-mode label i{font-style:normal;font-size:11.5px;color:var(--ink-3);line-height:1.6;display:block;margin-top:2px}
.bk-mode .bk-off{opacity:.5;cursor:not-allowed}
.bk-sum{font-size:12.5px;color:var(--ink-2);padding:9px 12px;margin-bottom:12px;border-radius:8px;
  background:#f6f8fb;border-left:3px solid var(--brand)}
.bk-mem{margin-top:8px;display:flex;flex-direction:column;gap:2px}
.bk-mem-row{display:flex;align-items:center;gap:9px;padding:4px 0 4px 2px;font-size:12px}
.bk-mem-row .mg-nm{font-weight:500;font-size:12.5px}
.bk-flat{max-height:52vh;overflow:auto;border:1px solid var(--line);border-radius:10px}
.bk-flat-row{display:flex;align-items:center;gap:10px;padding:7px 12px;font-size:12.5px;
  border-bottom:1px solid var(--line)}
.bk-flat-row:last-child{border-bottom:0}
.bk-flat-row .sp{flex:1}
/* 合并弹窗的两个页签：重复档案 / 店铺归并 */
.mg-tabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin:0 0 12px;padding-bottom:10px;border-bottom:1px solid var(--line)}
/* 店铺归并：一组的成员清单跟在组头下面，比胶囊列表更紧凑 */
.sg-row{display:flex;align-items:center;gap:10px;padding:6px 0;border-top:1px dashed var(--line);font-size:12px}
.sg-row:first-child{border-top:0}

/* 手动合并：左右两栏「保留 / 并入」，各自带搜索。名字完全不像时只能人指定 */
.mm-wrap{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:start}
.mm-side{border:1px solid var(--line);border-radius:8px;padding:12px 12px 8px;background:var(--panel)}
.mm-title{font-weight:600;font-size:13px;margin-bottom:2px}
.mm-hint{font-size:11.5px;color:var(--ink-3);margin-bottom:8px}
.mm-side .inp{width:100%}
.mm-list{max-height:250px;overflow:auto;margin-top:6px}
.mm-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;
  font-size:12.5px;cursor:pointer}
.mm-row:hover{background:#f2f6fc}
.mm-row b{font-weight:600}
.mm-tip{font-size:12px;color:var(--ink-3);padding:8px 4px}
.mm-picked{background:#f7f9fc;border:1px solid var(--line);border-radius:6px;padding:10px;font-size:12.5px}
.mm-picked b{margin-left:6px}
/* 首次合作是「起~止」两个日期，label 本身是纵向的，内部再套一层横向排 */
.cust-filters .dr-wrap{display:flex;align-items:center;gap:5px}
.cust-filters .dr-wrap i{font-style:normal;color:var(--ink-3);font-size:11px}
.cust-filters .dr-wrap .inp{min-width:128px}

/* 筛选栏的「重置」：btn-ghost 在这里太轻，看着像一行说明文字，给回按钮外观 */
.cust-filters #cfReset{align-self:flex-end;flex:0 0 auto;width:auto;
  height:30px;padding:0 14px;border-radius:6px;
  border:1px solid var(--line);background:var(--panel);color:var(--ink-2);
  font-size:12px;cursor:pointer;white-space:nowrap}
.cust-filters #cfReset:hover{border-color:var(--brand);color:var(--brand);background:var(--brand-soft)}
.cust-filters .dr-wrap .inp{min-width:120px}
