:root{
  --primary:#1e3a6b;        /* 勤律深蓝主色 */
  --primary-dark:#0f2545;
  --primary-2:#2d5390;
  --gold:#c8a96a;            /* 印章金 */
  --gold-dark:#a08142;
  --navy:#0e1f3d;
  --navy-2:#16294d;
  --bg:#f4f6fa;
  --card:#ffffff;
  --border:#e5e9f0;
  --text:#1a2333;
  --text-2:#5b6577;
  --muted:#9aa3b2;
  --up:#e03131;      /* 涨-红 */
  --down:#2f9e44;    /* 跌-绿 */
  --shadow:0 1px 3px rgba(16,24,40,.06),0 1px 2px rgba(16,24,40,.04);
  --radius:12px;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  background:var(--bg);color:var(--text);font-size:14px;
}
.hidden{display:none!important}
a{text-decoration:none;color:inherit}
button{font-family:inherit;cursor:pointer;border:none;background:none}

/* ===== 登录页 ===== */
.login-page{
  min-height:100vh;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(135deg,#0e1f3d 0%,#1e3a6b 55%,#3a5fa0 130%);
  padding:20px;
}
.login-card{
  width:400px;max-width:100%;background:#fff;border-radius:16px;
  padding:36px 34px;box-shadow:0 20px 60px rgba(0,0,0,.25);
}
.login-brand{display:flex;align-items:center;gap:14px;margin-bottom:28px}
.logo-mark{
  width:52px;height:52px;border-radius:12px;flex:none;
  object-fit:contain;
}
.login-brand h1{font-size:22px;letter-spacing:.5px}
.login-brand p{color:var(--muted);font-size:13px;margin-top:2px}
.login-card label{display:block;font-size:13px;color:var(--text-2);margin:14px 0 6px}
.login-card input{
  width:100%;padding:11px 14px;border:1px solid var(--border);
  border-radius:10px;font-size:14px;transition:.15s;outline:none;
}
.login-card input:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgba(30,58,107,.15)}
.btn-primary{
  background:var(--primary);color:#fff;padding:11px 18px;border-radius:10px;
  font-size:14px;font-weight:600;transition:.15s;
}
.btn-primary:hover{background:var(--primary-dark)}
.btn-block{width:100%;margin-top:22px}
.login-error{color:var(--up);font-size:13px;margin-top:12px;min-height:18px}
.login-foot{text-align:center;color:var(--muted);font-size:12px;margin-top:18px}

/* ===== 布局 ===== */
.app{display:flex;min-height:100vh}
.sidebar{
  width:230px;flex:none;background:linear-gradient(180deg,var(--navy),var(--navy-2));
  color:#cbd5e1;display:flex;flex-direction:column;
  position:sticky;top:0;height:100vh;overflow-y:auto;
}
.sidebar-brand{display:flex;align-items:center;gap:11px;padding:20px 18px 16px}
.sidebar-brand .logo-mark{width:38px;height:38px;object-fit:contain}
.sb-text{display:flex;flex-direction:column;line-height:1.2}
.sb-text b{color:#fff;font-size:16px}
.sb-text span{font-size:11px;color:#8fa3bf}
.nav{flex:1;padding:6px 12px}
.nav-group{font-size:11px;color:#7f93b0;padding:14px 10px 6px;letter-spacing:.5px}
.nav-item{
  display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:9px;
  color:#cbd5e1;font-size:14px;margin:2px 0;transition:.15s;cursor:pointer;
}
.nav-item:hover{background:rgba(255,255,255,.06);color:#fff}
.nav-item.active{background:var(--primary);color:#fff;font-weight:600}
.nav-item .ico{width:18px;text-align:center;font-size:15px;opacity:.9}
.sidebar-foot{padding:14px 18px;border-top:1px solid rgba(255,255,255,.08);font-size:12px;color:#9db1c9}

.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{
  height:60px;background:#fff;border-bottom:1px solid var(--border);
  display:flex;align-items:center;gap:14px;padding:0 22px;
  position:sticky;top:0;z-index:20;
}
.menu-toggle{display:none;font-size:20px;color:var(--text-2)}
.topbar-title{font-size:17px;font-weight:700}
.topbar-right{margin-left:auto;display:flex;align-items:center;gap:14px}
.topbar-date{color:var(--muted);font-size:13px}
.user-chip{
  background:#eaf0fa;color:var(--primary-dark);padding:6px 12px;
  border-radius:20px;font-size:13px;font-weight:600;
}
.btn-ghost{
  padding:7px 13px;border-radius:8px;color:var(--text-2);
  border:1px solid var(--border);font-size:13px;transition:.15s;
}
.btn-ghost:hover{background:#f1f4f9}

.content{padding:22px;max-width:1400px;width:100%;margin:0 auto}

/* ===== 卡片 ===== */
.card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);
  padding:20px;margin-bottom:18px}
.card-title{font-size:15px;font-weight:700;margin-bottom:16px;display:flex;align-items:center;gap:8px}
.card-title .sub{font-weight:400;color:var(--muted);font-size:12px;margin-left:auto}

/* KPI */
.kpi-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:18px}
.kpi{
  background:#fff;border-radius:var(--radius);box-shadow:var(--shadow);
  padding:18px 20px;display:flex;flex-direction:column;gap:6px;
}
.kpi .k-label{font-size:13px;color:var(--text-2)}
.kpi .k-value{font-size:26px;font-weight:800;letter-spacing:-.5px}
.kpi .k-sub{font-size:12px;color:var(--muted)}
.kpi .k-value.up{color:var(--up)}
.kpi .k-value.down{color:var(--down)}

/* 产品卡片 */
.product-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}
.product-card{
  background:linear-gradient(135deg,#fff,#f7faff);border:1px solid var(--border);
  border-radius:var(--radius);padding:18px 20px;box-shadow:var(--shadow);
  cursor:pointer;transition:.18s;
}
.product-card:hover{border-color:var(--primary);transform:translateY(-2px)}

/* ---- 长条形紧凑卡（第 9 轮需求⑤）----
   12 张两列大卡 → 12 条横向长条：信息一条不丢，纵向高度压到约 1/3。
   ============================================================ */
.product-grid.pc-grid-strip{grid-template-columns:1fr;gap:8px}
.product-card.pc-strip{
  display:flex;align-items:center;gap:12px;
  padding:10px 16px;border-radius:10px;
}
.product-card.pc-strip:hover{transform:none;box-shadow:0 2px 12px rgba(30,58,107,.10)}
.product-card.pc-strip.active{
  border-color:var(--primary);background:linear-gradient(135deg,#fff,#eef4ff);
  box-shadow:inset 3px 0 0 var(--primary);
}
.pc-strip-name{
  font-size:14px;font-weight:700;min-width:150px;max-width:230px;
  flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.pc-strip-metrics{
  display:flex;align-items:center;gap:16px;flex:1 1 auto;min-width:0;
  font-size:12px;color:var(--text-2);overflow:hidden;
  white-space:nowrap;
}
.pc-strip-metrics .m{flex:none}
.pc-strip-metrics .m b{color:var(--text);font-variant-numeric:tabular-nums}
.pc-strip-metrics .up b{color:var(--up)}
.pc-strip-metrics .down b{color:var(--down)}
.pc-strip-pills{display:flex;align-items:center;gap:4px;flex:none;flex-wrap:nowrap}
.pc-strip-pills .pill{font-size:10px;padding:2px 7px;white-space:nowrap}
.pc-strip-nav{text-align:right;flex:none;min-width:78px}
.pc-strip-nav .v{display:block;font-size:17px;font-weight:800;
  font-variant-numeric:tabular-nums;line-height:1.15}
.pc-strip-nav .l{display:block;font-size:10px;color:var(--muted)}
.pc-top{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.pc-badge{background:var(--navy);color:#fff;font-size:12px;font-weight:700;
  padding:4px 9px;border-radius:7px;letter-spacing:.5px}
.pc-name{font-size:15px;font-weight:700;flex:1;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.pc-mv{text-align:right;flex:none}
.pc-mv .v{font-size:18px;font-weight:800}
.pc-mv .l{font-size:11px;color:var(--muted)}
.pc-meta{display:flex;gap:18px;font-size:13px;color:var(--text-2);flex-wrap:wrap}
.pc-meta b{color:var(--text)}

/* 图表容器 */
.chart-wrap{height:300px;position:relative}

/* ===== 表格 ===== */
.toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:16px}
.toolbar .spacer{flex:1}
.search-box{
  display:flex;align-items:center;background:#fff;border:1px solid var(--border);
  border-radius:9px;padding:0 12px;gap:8px;min-width:220px;
}
.search-box input{border:none;outline:none;padding:9px 0;font-size:13px;flex:1;background:none}
.search-box .s-ico{color:var(--muted);font-size:14px}
select,input[type=text],input[type=number],input[type=password],input[type=date],textarea{
  border:1px solid var(--border);border-radius:9px;padding:9px 12px;font-size:13px;
  outline:none;background:#fff;color:var(--text);font-family:inherit;
}
select:focus,input:focus,textarea:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgba(30,58,107,.1)}
.btn{
  padding:9px 15px;border-radius:9px;font-size:13px;font-weight:600;transition:.15s;
  display:inline-flex;align-items:center;gap:6px;
}
.btn-outline{border:1px solid var(--border);color:var(--text-2);background:#fff}
.btn-outline:hover{border-color:var(--primary);color:var(--primary)}
.btn-danger{background:#fdecec;color:#c92a2a}
.btn-danger:hover{background:#fbdada}

.table-wrap{overflow-x:auto;background:#fff;border-radius:var(--radius);box-shadow:var(--shadow)}
table{width:100%;border-collapse:collapse;font-size:13px}
th{
  text-align:left;padding:12px 16px;color:var(--text-2);font-weight:600;
  background:#f8fafc;border-bottom:1px solid var(--border);white-space:nowrap;
  position:sticky;top:0;
}
td{padding:11px 16px;border-bottom:1px solid #f0f2f7;white-space:nowrap}
tr:hover td{background:#fafbfe}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
.pill{display:inline-block;padding:3px 10px;border-radius:20px;font-size:12px;font-weight:600}
.pill-blue{background:#eaf0fa;color:var(--primary-dark)}
.pill-green{background:#e6f6ea;color:var(--down)}
.pill-gray{background:#f0f2f5;color:var(--text-2)}
.pill-gold{background:#fdf4dc;color:#a97709}
.pill-red{background:#fdecec;color:var(--up)}
.pill-strategy{background:linear-gradient(135deg,#fff5e0,#fde6a8);color:#7d5a00;font-size:11px;padding:2px 8px}
/* 份额徽标（第 9 轮需求③）：标记该行是 A/B/C 多份额合并后的产品 */
.pill-share{background:linear-gradient(135deg,#e8f3ff,#d3e6ff);color:#1c4f8a;font-size:11px;padding:2px 8px;border:1px solid #bcd8f7}

/* 份额组展开箭头（第 9 轮需求③）：总层面 → A/B/C 类 */
.share-toggle{
  display:inline-flex;align-items:center;justify-content:center;
  width:18px;height:18px;margin-right:4px;border-radius:5px;
  font-size:11px;line-height:1;color:#3a6ea5;cursor:pointer;
  background:#eef4fd;border:1px solid #cfe0f5;user-select:none;
  transition:background .15s ease;
}
.share-toggle:hover{background:#dbe9fb}
.wl-share-parent>td:nth-child(3){font-weight:600}
tr.wl-share-row{background:#f8fbff}
tr.wl-share-row:hover{background:#eff6ff}
tr.wl-share-row>td{font-size:12.5px;color:#43506a}
.share-child-name .branch{color:#9db4d0;margin-right:2px}
.share-child-name .muted{font-size:11px;margin-left:4px}

/* ===== 抽屉「份额切换」条（第 9 轮需求③）===== */
.drawer-shares{
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  margin:8px 0 4px;padding:8px 10px;border-radius:10px;
  background:#f5f8ff;border:1px solid #dbe6f7;
}
.drawer-shares .ds-label{font-size:12px;font-weight:700;color:var(--muted);margin-right:2px}
.drawer-shares .ds-btn{
  padding:4px 12px;border-radius:16px;border:1px solid #c9d8ee;background:#fff;
  color:var(--text-2);font-size:12px;font-weight:700;cursor:pointer;transition:.15s;
}
.drawer-shares .ds-btn:hover{border-color:var(--primary);color:var(--primary)}
.drawer-shares .ds-btn.active{
  background:var(--primary);border-color:var(--primary);color:#fff;
}
.drawer-shares .ds-hint{font-size:11px;color:var(--muted);margin-left:4px}

/* ===== 抽屉「池级别」条（第 12 轮）：跟踪池 ⇄ 核心池 ===== */
.drawer-pool{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin:4px 0 8px;padding:8px 10px;border-radius:10px;
  background:#fdf8ec;border:1px solid #f0e2c0;
}
.drawer-pool .dp-tag{
  font-size:12px;font-weight:700;color:var(--gold-dark);
  background:#fff;border:1px solid #e8d9b0;border-radius:14px;padding:2px 10px;
  white-space:nowrap;
}
.drawer-pool .dp-info{font-size:12px;color:var(--text-2)}
.drawer-pool .dp-info b{color:var(--text)}
.drawer-pool .dp-date{padding:4px 8px;font-size:12px;width:auto}
.drawer-pool .dp-note{padding:4px 8px;font-size:12px;min-width:200px;flex:1}
.drawer-pool button{padding:4px 12px;font-size:12px}
/* 目录树里的「来源」小徽标（自有 / 火富牛） */
.pill-src-own{background:#eef4ff;color:#2d5390}
.pill-src-fof99{background:#fdf4dc;color:#a97709}

/* ===== 观察池卡片网格 ===== */
.observe-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:14px;margin-top:8px}
.fund-card{
  background:#fff;border-radius:12px;padding:14px;cursor:pointer;
  border:1px solid var(--border);box-shadow:0 1px 2px rgba(16,24,40,.04);
  transition:.18s;
}
.fund-card:hover{border-color:var(--primary);transform:translateY(-2px);box-shadow:0 6px 20px rgba(30,58,107,.08)}
.fc-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}
.fc-name{font-size:14px;font-weight:700;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
.fc-meta{display:flex;align-items:center;gap:6px;margin-bottom:10px;font-size:12px;color:var(--text-2)}
.fc-mgr{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fc-nav{display:flex;justify-content:space-between;margin-bottom:10px}
.fc-nav > div{display:flex;flex-direction:column;gap:2px}
.fc-nav-label{font-size:11px;color:var(--muted)}
.fc-nav-val{font-size:16px;font-weight:700;color:var(--text)}
.fc-nav-val.up{color:var(--up)}
.fc-nav-val.down{color:var(--down)}
.fc-spark{margin:0 -4px 8px;height:48px}
.fc-foot{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--muted)}
.fc-foot .link{font-size:12px;color:var(--primary)}

/* ===== 持仓按管理人/策略分组 ===== */
.mgr-group{
  margin-bottom:18px;padding:14px;background:#fafbfd;border-radius:10px;
  border-left:3px solid var(--primary);
}
.mgr-head{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-size:14px}
.mgr-head i{color:var(--primary);font-size:16px}
.mgr-head .muted{margin-left:auto;font-size:12px}
.strat-group{margin:10px 0 14px 16px}
.strat-head{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:12px;color:var(--text-2)}
.strat-head .muted{margin-left:auto}
.pos-table{width:100%;border-collapse:collapse;background:#fff;border-radius:8px;overflow:hidden;font-size:12px}
.pos-table th{background:#f3f5f9;color:var(--text-2);font-weight:600;padding:8px 10px;text-align:left;border-bottom:1px solid var(--border)}
.pos-table td{padding:8px 10px;border-bottom:1px solid #f3f5f9}
.pos-table tr:hover td{background:#fafbfd}
.sim-table{width:100%;border-collapse:collapse;font-size:13px}
.sim-table th,.sim-table td{padding:9px 12px;border-bottom:1px solid var(--border);text-align:left}
.sim-table input.sim-shares{width:140px;padding:6px 8px;border:1px solid var(--border);border-radius:6px;font-size:13px}

/* ===== 子基金分析-风险指标 ===== */
.metrics-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}
.metric-card{
  padding:12px 14px;background:linear-gradient(135deg,#fafbfd,#fff);
  border:1px solid var(--border);border-radius:10px;
}
.m-label{font-size:12px;color:var(--text-2);margin-bottom:6px}
.m-value{font-size:20px;font-weight:700;color:var(--text)}
.m-value.up{color:var(--up)}
.m-value.down{color:var(--down)}
.muted{color:var(--muted)}
.up{color:var(--up)}
.down{color:var(--down)}
.row-actions{display:flex;gap:6px}
.link{color:var(--primary);cursor:pointer}
.link:hover{text-decoration:underline}
.empty{padding:40px;text-align:center;color:var(--muted)}
.tag-adjusted{color:var(--gold);font-size:11px;border:1px solid var(--gold);border-radius:4px;padding:1px 4px;margin-left:4px}

/* ===== 模拟组合（Paper） ===== */
.paper-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}
.paper-card{
  background:linear-gradient(135deg,#fff,#fafcff);border:1px solid var(--border);
  border-radius:12px;padding:16px 18px;cursor:pointer;box-shadow:var(--shadow);transition:.18s;
  display:flex;flex-direction:column;gap:8px;
}
.paper-card:hover{border-color:var(--primary);transform:translateY(-2px);box-shadow:0 8px 24px rgba(30,58,107,.1)}
.pc-name{font-size:15px;font-weight:700;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pc-meta{font-size:12px;color:var(--text-2)}
.pc-meta b{color:var(--text)}
.pc-foot{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--muted);margin-top:auto}

.paper-charts{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:0}
.paper-charts .chart-half{height:240px;position:relative}
.paper-charts .full{grid-column:1/-1;height:280px;position:relative}
@media(max-width:1100px){.paper-charts{grid-template-columns:1fr}}

.corr-table{border-collapse:collapse;font-size:12px;width:auto;min-width:100%}
.corr-table th,.corr-table td{padding:7px 11px;border:1px solid var(--border);text-align:center;min-width:62px}
.corr-table th{background:#f8fafc;font-weight:600;color:var(--text-2)}
.corr-table td.diag{background:#eef1f6;color:var(--muted);font-weight:700}
.corr-table td.corr-cell{cursor:default}
.corr-positive{background:rgba(224,49,49,.12)}
.corr-strong{background:rgba(224,49,49,.32);color:#7a1414;font-weight:700}
.corr-negative{background:rgba(47,158,68,.12)}
.corr-strong-neg{background:rgba(47,158,68,.32);color:#0c5022;font-weight:700}
.corr-na{color:var(--muted)}

.holding-pie-wrap{height:240px;position:relative;display:flex;align-items:center;gap:14px}
.holding-pie-wrap canvas{flex:0 0 220px;max-width:220px}
.pie-legend{flex:1;font-size:12px;display:flex;flex-direction:column;gap:5px;max-height:230px;overflow-y:auto}
.pie-legend .li{display:flex;align-items:center;gap:8px;padding:3px 4px;border-radius:5px}
.pie-legend .li:hover{background:#f4f6fa}
.pie-legend .sw{width:11px;height:11px;border-radius:3px;flex:0 0 11px}
.pie-legend .nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pie-legend .pc{font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}

/* 两张饼图并排 */
.pie-pair{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.pie-pair .card{padding:16px 18px}
.pie-pair .holding-pie-wrap{height:250px}
.pie-pair .holding-pie-wrap canvas{flex:0 0 190px;max-width:190px}
.pie-pair .pie-legend{max-height:240px}
@media(max-width:1100px){.pie-pair{grid-template-columns:1fr}}

/* 观察池顶部两张占比饼图 */
.wl-pie-card{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.wl-pie-card .card{padding:16px 18px}
.wl-pie-card .holding-pie-wrap{height:220px}
.wl-pie-card .holding-pie-wrap canvas{flex:0 0 170px;max-width:170px}
.wl-pie-card .pie-legend{max-height:210px}
@media(max-width:1100px){.wl-pie-card{grid-template-columns:1fr}}

/* ===== 交易流水类型标签 ===== */
.tx-pill{
  display:inline-block;padding:2px 9px;border-radius:6px;font-size:12px;
  font-weight:600;line-height:1.7;white-space:nowrap;
}
.tx-subscribe{background:#fdecec;color:#c92a2a;border:1px solid #f8d3d3}     /* 申购 · 红（资金流入）*/
.tx-redeem{background:#e6f6ea;color:#1f7a35;border:1px solid #c8ecd3}        /* 赎回 · 绿 */
.tx-dividend{background:#fdf4dc;color:#a97709;border:1px solid #f5e3b3}      /* 分红 · 金 */
.tx-reinvest{background:#fff3e0;color:#c05621;border:1px solid #fbd9b5}      /* 红利再投 · 橙 */
.tx-deposit{background:#eaf0fa;color:#1e3a6b;border:1px solid #d3e0f5}       /* 资金转入 · 蓝 */
.tx-withdraw{background:#f0f2f5;color:#5a6577;border:1px solid #e0e4ea}      /* 资金转出 · 灰 */

/* 表格行内小图标标签 */
.tx-ico{font-size:11px;opacity:.75;margin-right:3px}

/* 合计行 */
.tbl tr.sum-row{background:#f8fafc;font-weight:700}
.tbl tr.sum-row td{border-top:2px solid var(--border);color:var(--text)}

/* 净值频率标签 */
.freq-tag{
  display:inline-block;padding:1px 7px;border-radius:5px;font-size:11px;
  font-weight:600;margin-left:6px;vertical-align:1px;
}
.freq-daily{background:#eef1f6;color:#475569}
.freq-weekly{background:#e8e3fb;color:#5b3bb8}
.freq-unknown{background:#f0f2f5;color:#8b93a1}

/* 净值状态标签（缺失/正常/未知）：日频连续 3 个交易日 / 周频连续 10 个交易日无净值 → 缺失 */
.nav-status-tag{
  display:inline-block;padding:1px 7px;border-radius:5px;font-size:11px;
  font-weight:600;margin-left:6px;vertical-align:1px;
}
.nav-status-normal{background:#e7f7ec;color:#1a8a44}
.nav-status-missing{background:#fde8e8;color:#c83a3a;border:1px solid #f3bdbd}
.nav-status-unknown{background:#f0f2f5;color:#8b93a1}

/* 抽屉 · 净值区间条 */
.nav-range-bar{
  display:flex;align-items:center;gap:10px;background:#f8fafc;
  border:1px solid var(--border);border-radius:9px;padding:9px 13px;font-size:12px;
}
.nav-range-bar .rb-item{display:flex;flex-direction:column;gap:2px}
.nav-range-bar .rb-label{color:var(--muted);font-size:11px}
.nav-range-bar .rb-val{font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}
.nav-range-bar .rb-arrow{color:var(--muted);font-size:14px}

.range-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:#fafbfd;border:1px solid var(--border);border-radius:10px;padding:10px 14px;margin-bottom:14px}
.range-bar label{font-size:13px;color:var(--text-2)}
.range-bar .preset-seg{display:inline-flex;gap:4px;background:#fff;border:1px solid var(--border);border-radius:8px;padding:3px}
.range-bar .preset-seg button{padding:5px 10px;font-size:12px;border-radius:6px;color:var(--text-2);transition:.15s}
.range-bar .preset-seg button:hover{color:var(--text)}
.range-bar .preset-seg button.active{background:var(--primary);color:#fff;font-weight:600}
.range-bar input[type=date]{padding:6px 9px;font-size:13px}

/* ===== 表单 ===== */
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.form-grid .full{grid-column:1/-1}
.form-row{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}
.form-row label{font-size:13px;color:var(--text-2);font-weight:500}
.form-row input,.form-row select,.form-row textarea{width:100%}
.form-row textarea{resize:vertical;min-height:64px}
.form-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:18px;padding-top:14px;border-top:1px solid var(--border)}
.form-item{display:flex;flex-direction:column;gap:6px}
.form-item label{font-size:13px;color:var(--text-2)}
.form-item input,.form-item select,.form-item textarea{width:100%}
.form-item textarea{resize:vertical;min-height:70px}
.modal-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}

/* ===== 模态框 ===== */
.modal-mask{
  position:fixed;inset:0;background:rgba(15,23,42,.5);z-index:100;
  display:flex;align-items:flex-start;justify-content:center;padding:60px 16px;
  overflow-y:auto;
}
/* 抽屉开着时，弹窗需压过 .drawer-mask(z-index:120) */
.modal-mask.modal-above-drawer{z-index:140}
.modal{
  background:#fff;border-radius:14px;width:560px;max-width:100%;
  box-shadow:0 24px 70px rgba(0,0,0,.3);animation:pop .18s ease;
}
@keyframes pop{from{opacity:0;transform:translateY(12px) scale(.98)}to{opacity:1;transform:none}}
.modal-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:18px 22px;border-bottom:1px solid var(--border);
}
.modal-head span{font-size:16px;font-weight:700}
.modal-close{font-size:18px;color:var(--muted);padding:4px;border-radius:6px}
.modal-close:hover{background:#f1f4f9;color:var(--text)}
.modal-body{padding:22px}

/* ===== 分组折叠 / 分段切换 ===== */
.seg{display:inline-flex;background:#eef1f6;border-radius:9px;padding:3px;gap:2px}
.seg-btn{padding:6px 14px;border-radius:7px;font-size:13px;color:var(--text-2);font-weight:500;transition:.15s}
.seg-btn:hover{color:var(--text)}
.seg-btn.active{background:#fff;color:var(--primary);font-weight:600;box-shadow:0 1px 3px rgba(16,24,40,.12)}
.fold-ico{display:inline-block;width:14px;text-align:center;color:var(--muted);font-size:13px}

/* ===== 右侧抽屉 · 产品要素表 ===== */
.drawer-mask{
  position:fixed;inset:0;background:rgba(15,23,42,.4);z-index:120;
  display:flex;justify-content:flex-end;
}
.drawer{
  /* 第 55 轮 · 需求 4（用户裁定「70vw，上限 1600px」）：抽屉宽度由 520px 扩大一倍余。
     ⚠ 用 vw 而非固定 px，小屏才会自适应；max-width 兜住超宽屏（4K）避免过度拉伸。 */
  width:70vw;max-width:1600px;min-width:520px;height:100%;background:#fff;
  box-shadow:-12px 0 40px rgba(0,0,0,.15);
  display:flex;flex-direction:column;animation:slideIn .22s ease;
}
@keyframes slideIn{from{transform:translateX(40px);opacity:0}to{transform:none;opacity:1}}
.drawer-head{
  display:flex;align-items:flex-start;justify-content:space-between;
  padding:18px 22px;border-bottom:1px solid var(--border);flex:none;
}
.drawer-title{font-size:16px;font-weight:700}
.drawer-fund{font-size:12px;color:var(--muted);margin-top:4px}
.drawer-body{flex:1;overflow-y:auto;padding:20px 22px}
.drawer-foot{
  display:flex;justify-content:flex-end;gap:10px;padding:14px 22px;
  border-top:1px solid var(--border);flex:none;
}
.drawer-sec{margin-bottom:20px}
.drawer-sec-title{
  font-size:13px;font-weight:700;color:var(--primary);margin-bottom:12px;
  padding-left:9px;border-left:3px solid var(--gold);
}
.drawer-sec-title .sub{font-weight:400;color:var(--muted);font-size:12px;margin-left:auto}

/* ===== Toast ===== */
.toast{
  position:fixed;top:20px;left:50%;transform:translateX(-50%);
  background:#1a2333;color:#fff;padding:11px 20px;border-radius:10px;
  font-size:13px;z-index:200;box-shadow:0 8px 24px rgba(0,0,0,.25);
}
.toast.ok{background:var(--down)}
.toast.err{background:var(--up)}

/* 回测 */
.sim-table{width:100%;border-collapse:collapse;font-size:13px}
.sim-table th,.sim-table td{padding:9px 12px;border-bottom:1px solid var(--border);text-align:left}
.sim-table input{width:130px;text-align:right}
.legend{display:flex;gap:16px;flex-wrap:wrap;font-size:12px;color:var(--text-2);margin-top:10px}
.legend i{display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:5px;vertical-align:-1px}

/* 同步状态 */
.sync-panel{display:flex;gap:20px;align-items:flex-start;flex-wrap:wrap}
.sync-status-box{background:#f8fafc;border:1px solid var(--border);border-radius:10px;padding:16px;min-width:280px}
.sync-status-box .row{display:flex;justify-content:space-between;padding:5px 0;font-size:13px}
.sync-status-box .row b{color:var(--text)}
.progress{height:8px;background:#e8edf5;border-radius:5px;overflow:hidden;margin:10px 0}
.progress .bar{height:100%;background:var(--primary);transition:width .3s}

/* ===== 响应式 ===== */
@media(max-width:1100px){
  .kpi-grid{grid-template-columns:repeat(2,1fr)}
  .product-grid{grid-template-columns:1fr}
  /* 长条卡在窄屏逐步收起次要列，避免挤压 */
  .pc-strip-metrics .m:nth-child(n+4){display:none}
}
@media(max-width:768px){
  .sidebar{position:fixed;left:0;top:0;z-index:50;transform:translateX(-100%);transition:.25s}
  .sidebar.open{transform:translateX(0)}
  .menu-toggle{display:block}
  .kpi-grid{grid-template-columns:1fr 1fr}
  .form-grid{grid-template-columns:1fr}
  .topbar-date{display:none}
  .content{padding:14px}
  .topbar{padding:0 14px}
  .pc-strip-metrics{display:none}
  .pc-strip-pills{display:none}
  .pc-strip-name{max-width:none;flex:1 1 auto}
  /* 第 91 轮：手机顶栏太挤 —— 标题单行截断、隐藏用户名胶囊（侧栏底部已有）、
     按钮收窄。日程作为首页后，手机第一眼看到的就是这条顶栏。 */
  .topbar-title{font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .user-chip{display:none}
  .topbar-right{gap:4px}
  .topbar-right .btn-ghost{padding:6px 9px;font-size:12px}
  .notif-btn{padding:6px 8px}
}

/* ===== v3 补充：在管产品合计行 / 净值口径切换 / 跟踪池在管产品分类 ===== */
.tbl tfoot td{
  border-top:2px solid var(--border);
  background:#f8fafc;
  color:var(--text);
  font-weight:600;
}
.card-title .seg{margin-left:auto}
.card-title .seg .seg-btn{padding:5px 12px;font-size:12px}
.card-title .seg .seg-btn:disabled{opacity:.45;cursor:not-allowed}
.product-card.pc-noval{opacity:.62}
.tbl tr.wl-fof-row{background:#fbfcff}
.tbl tr.wl-fof-row:hover{background:#f2f6ff}

/* ===== v4 补充：一级标签页 / 宽弹窗 / 横向对比选择器 / 持仓分类表 ===== */
/* --- 一级标签页（跟踪池内：子基金 / 在管产品）--- */
.tabs{display:inline-flex;gap:4px;background:#eef1f6;border-radius:10px;padding:4px;
  /* 第 92 轮：产品详情有 8 个 tab，1080px 及以下装不下会把整页撑宽（实测 docW 1117）。
     让它自己横向滚动，别顶破父容器。 */
  max-width:100%;overflow-x:auto;scrollbar-width:thin}
.tabs::-webkit-scrollbar{height:4px}
.tabs::-webkit-scrollbar-thumb{background:#c7cfdb;border-radius:2px}
.tabs .tab{flex:0 0 auto}
.tabs .tab{
  padding:8px 18px;border-radius:8px;font-size:13.5px;font-weight:600;
  color:var(--text-2);background:transparent;transition:.15s;white-space:nowrap;
}
.tabs .tab:hover{color:var(--text)}
.tabs .tab.active{background:#fff;color:var(--primary);box-shadow:0 1px 3px rgba(16,24,40,.14)}
.tabs-line{display:flex;gap:2px;border-bottom:1px solid var(--border);margin-bottom:14px}
.tabs-line .tab{
  padding:9px 16px;font-size:14px;font-weight:600;color:var(--text-2);
  border-bottom:2px solid transparent;margin-bottom:-1px;transition:.15s;
}
.tabs-line .tab:hover{color:var(--text)}
.tabs-line .tab.active{color:var(--primary);border-bottom-color:var(--primary)}

/* --- 宽弹窗（横向对比）--- */
.modal.modal-wide{width:980px}
.modal.modal-wide .modal-body{padding:20px 22px 24px}

/* --- 横向对比 · 可搜索多选选择器 --- */
.cmp-picker{position:relative;margin-bottom:12px}
.cmp-picker .inp{width:100%}
.cmp-suggest{
  margin-top:8px;background:#fff;border:1px solid var(--border);border-radius:10px;
  max-height:230px;overflow-y:auto;
}
.cmp-suggest .opt{
  padding:9px 12px;display:flex;align-items:center;gap:8px;cursor:pointer;
  font-size:13px;border-bottom:1px solid #f4f6fa;
}
.cmp-suggest .opt:last-child{border-bottom:none}
.cmp-suggest .opt:hover,.cmp-suggest .opt.hl{background:#f2f6ff}
.cmp-suggest .opt .nm{flex:1;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cmp-suggest .opt .tag{font-size:11px;color:var(--muted)}
.cmp-suggest .empty{padding:14px;text-align:center;color:var(--muted);font-size:13px}
.cmp-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px;min-height:30px}
.chip{
  display:inline-flex;align-items:center;gap:7px;padding:5px 8px 5px 11px;
  border-radius:20px;background:#eef1f6;font-size:12.5px;font-weight:600;
  color:var(--text-2);border:1px solid transparent;
}
.chip.fund{border-color:#cfe6d5;background:#eefaf1;color:#1e7a3c}
.chip.fof{border-color:#f0dcae;background:#fdf7e7;color:#8a6100}
.chip .x{cursor:pointer;font-weight:700;color:inherit;opacity:.6;padding:0 2px}
.chip .x:hover{opacity:1}
.chip .dot{width:9px;height:9px;border-radius:50%;display:inline-block}

/* --- 持仓分类表 --- */
.cls-wrap{margin-top:14px}
.cls-head{
  display:flex;align-items:center;gap:10px;padding:10px 12px;
  background:#f8fafc;border:1px solid var(--border);border-radius:10px 10px 0 0;
  border-bottom:none;font-weight:700;font-size:14px;
}
.cls-head .mv{margin-left:auto;font-variant-numeric:tabular-nums}
.cls-head .pc{font-size:12px;color:var(--muted);font-weight:600}
.cls-body{border:1px solid var(--border);border-radius:0 0 10px 10px;overflow:hidden}
.cls-body .tbl{border-radius:0;box-shadow:none}
.cls-kpi{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:12px}
.cls-kpi .box{background:#f8fafc;border:1px solid var(--border);border-radius:10px;padding:12px 14px}
.cls-kpi .box .l{font-size:12.5px;color:var(--text-2)}
.cls-kpi .box .v{font-size:19px;font-weight:800;margin-top:3px;font-variant-numeric:tabular-nums}
.tag-sub{font-size:11px;color:var(--muted);font-weight:500}
.joint-note{
  margin-top:10px;padding:9px 12px;border-radius:9px;background:#fffaf0;
  border:1px dashed #f0dcae;font-size:12.5px;color:#8a6100;
}
@media(max-width:1100px){ .modal.modal-wide{width:100%} .cls-kpi{grid-template-columns:1fr} }
.tbl tr.hl-row:hover{background:#f2f6ff}


/* ============================================================
   净值曲线区间拖拽（第 14 轮 · 需求 #99）
   ============================================================ */
.navrange { margin: 2px 0 10px; }
.navrange-track { position: relative; height: 26px; margin: 20px 10px 0;
  background: #eef1f5; border-radius: 6px; cursor: crosshair; touch-action: none; }
.navrange-sel { position: absolute; top: 0; height: 100%; border-left: 2px solid #4083ff;
  border-right: 2px solid #4083ff; background: rgba(64,131,255,.16);
  pointer-events: none; box-sizing: border-box; }
.navrange-handle { position: absolute; top: -7px; width: 16px; height: 40px;
  margin-left: -8px; cursor: ew-resize; touch-action: none; z-index: 2; }
.navrange-handle::after { content: ""; position: absolute; left: 6px; top: 9px;
  width: 4px; height: 22px; border-radius: 2px; background: #4083ff; }
.navrange-handle:hover::after { background: #1d5fd0; }
.navrange-tag { position: absolute; top: -19px; left: 50%;
  transform: translateX(-50%); white-space: nowrap; font-size: 10px;
  line-height: 16px; padding: 0 5px; border-radius: 3px; background: #2b3445;
  color: #fff; pointer-events: none; }
.navrange-actions { display: flex; align-items: center; gap: 8px;
  margin: 5px 10px 0; font-size: 11px; color: #6b7280; }
.navrange-info { flex: 1; }
/* 第 122 轮：去掉 !important —— 它会压过后面的统一层，导致小按钮永远是
   1px 内边距 + 11px 字（全站 39 处 btn-xs）。
   尺寸改由文件末尾「控件统一层」的 .btn-xs 统一接管。 */
.btn-xs { font-size: 12px; }

/* 暗色主题适配 */
html[data-theme="dark"] .navrange-track { background: #2a3038; }
html[data-theme="dark"] .navrange-actions { color: #9aa4b2; }


/* ============================================================
   分页 + 紧凑模式（第 14 轮 · 需求 #100）
   ============================================================ */
.wl-pager { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin-top: 8px; padding: 10px 4px 2px; border-top: 1px solid #eef1f5;
  font-size: 12px; color: #6b7280; }
.wl-pager .pg-info { flex: 1; }
.wl-pager .pg-btns { display: flex; align-items: center; gap: 4px; }
.wl-pager .pg-num { min-width: 54px; text-align: center; color: #374151;
  font-variant-numeric: tabular-nums; }
.wl-pager button[disabled] { opacity: .45; cursor: not-allowed; }
/* 第 122 轮：同上，去掉 !important（统一层负责 28px 高、12px 字）。 */
.inp-sm { font-size: 12px; }

/* 紧凑模式：藏占比图 + 收紧行高，直接缩短页面 */
#wl-panel-funds.wl-compact #wl-pies { display: none; }
#wl-panel-funds.wl-compact .kpi-grid { margin-bottom: 8px; }
#wl-panel-funds.wl-compact .tbl td,
#wl-panel-funds.wl-compact .tbl th { padding-top: 2px; padding-bottom: 2px;
  font-size: 12px; }
#wl-panel-funds.wl-compact .mgr-head { padding-top: 3px; padding-bottom: 3px; }
#wl-panel-funds.wl-compact .card-title { margin-bottom: 4px; }

/* 暗色主题适配 */
html[data-theme="dark"] .wl-pager { color: #9aa4b2; border-top-color: #2a3038; }
html[data-theme="dark"] .wl-pager .pg-num { color: #cbd5e1; }


/* ============================================================
   已停发标记（第 15 轮 · 需求①）
   ============================================================ */
/* 开关型 outline 按钮的激活态（#wl-compact / #wl-showdel 共用） */
.btn-outline.active { border-color: var(--primary); color: var(--primary);
  background: rgba(30,58,107,.07); font-weight: 600; }
/* 已停发行淡化，避免与跟踪中产品混淆 */
.wl-del-row > td { opacity: .62; }
.wl-del-row:hover > td { opacity: 1; }

/* 暗色主题适配 */
html[data-theme="dark"] .btn-outline.active {
  background: rgba(120,160,230,.16); border-color: #6f9bd8; color: #cfe0ff; }


/* ============================================================
   管理人台账（第 15 轮 · 需求② · P0 规范化）
   ============================================================ */
.mgr-sug { display: flex; flex-wrap: wrap; gap: 8px; padding: 4px 0 10px; }
.mgr-chip { border: 1px solid var(--border); background: #fff; border-radius: 999px;
  padding: 4px 12px; font-size: 12.5px; color: var(--text-2); cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px; }
.mgr-chip b { color: var(--primary); }
.mgr-chip:hover { border-color: var(--primary); color: var(--primary); }
.mgr-chip-go { font-size: 11px; color: var(--muted); }
.mgr-chip:hover .mgr-chip-go { color: var(--primary); }
.mgr-pend > summary { cursor: pointer; font-size: 12.5px; color: var(--text-2);
  padding: 6px 0; user-select: none; }
.mgr-pend-bar { display: flex; gap: 8px; align-items: center; margin: 6px 0 8px; }
.mgr-merge-box { max-height: 280px; overflow: auto; border: 1px solid var(--border);
  border-radius: 8px; padding: 8px 10px; }
.mgr-merge-row { display: flex; align-items: center; gap: 8px; padding: 3px 0;
  font-size: 13px; cursor: pointer; }
.mgr-merge-row span:last-child { margin-left: auto; }
.num { text-align: right; font-variant-numeric: tabular-nums; }
.muted.sm, .sm { font-size: 11.5px; }

/* 暗色主题适配 */
html[data-theme="dark"] .mgr-chip { background: #1b2230; }
html[data-theme="dark"] .mgr-merge-box { border-color: #2a3038; }

/* ============================================================
   跟踪池筛选条：三大类复选 + 策略复选（第 16 轮 · 需求①）
   ============================================================ */
.wl-filters { display: flex; flex-direction: column; gap: 6px; margin: 0 0 10px; }
.wl-filter-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.wl-filter-label { flex: 0 0 auto; min-width: 34px; font-size: 12.5px; font-weight: 600;
  color: var(--text-2); }
.wl-chips { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.wl-chip { display: inline-flex; align-items: center; gap: 5px; cursor: pointer;
  border: 1px solid var(--border); background: #fff; border-radius: 999px;
  padding: 3px 11px; font-size: 12.5px; color: var(--text-2);
  transition: .15s; user-select: none; }
.wl-chip input { display: none; }
.wl-chip:hover { border-color: var(--primary-2); color: var(--primary-2); }
.wl-chip em { font-style: normal; font-size: 11px; color: var(--muted);
  font-variant-numeric: tabular-nums; }
/* 勾选态：主色描边 + 浅底，与「板块标签」一致 */
.wl-chip.on { border-color: var(--primary); background: #eef4ff; color: var(--primary);
  font-weight: 600; }
.wl-chip.on em { color: var(--primary-2); }
/* 大类未勾选时：空心圈提示「未启用」 */
.wl-chip:not(.on)::before { content: ""; width: 8px; height: 8px; border-radius: 50%;
  border: 1.5px solid currentColor; opacity: .55; }
.wl-chip.on::before { content: "✓"; font-size: 10px; }
.wl-chip.on.is-other { border-color: var(--gold-dark); background: #fdf7e7; color: var(--gold-dark); }
.wl-chip.on.is-other em { color: var(--gold-dark); }
/* 私募基金未勾选时，策略这一行不生效 → 弱化 */
.wl-filter-row.is-muted { opacity: .45; pointer-events: none; }

/* 暗色主题适配 */
html[data-theme="dark"] .wl-chip { background: #1b2230; border-color: #2a3038; }
html[data-theme="dark"] .wl-chip.on { background: #16233d; border-color: #4b79bb; color: #a9c6ee; }
html[data-theme="dark"] .wl-chip.on em { color: #8fb0dd; }
html[data-theme="dark"] .wl-chip.on.is-other { background: #2e2713; border-color: #a08142;
  color: #e2c886; }


/* ===========================================================
   跟踪管理人（第 17 轮 · 需求①②③）
   =========================================================== */

/* 需求①：别名列缩短 —— 列宽收紧；单个徽标超长则省略，完整值看 title */
.mgr-alias-th { width: 210px; }
.mgr-alias-cell { max-width: 210px; overflow: hidden; }
.mgr-alias-cell .pill { max-width: 92px; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; display: inline-block; vertical-align: bottom;
  margin: 1px 3px 1px 0; }

/* 需求②：待归属卡片缩小成一行 + 按钮；展开后才是「分类搜索」 */
.mgr-pend-card { padding-top: 10px; padding-bottom: 10px; }
.mgr-pend-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.mgr-pend-head b { font-size: 14px; }
.mgr-pend-ico { font-size: 14px; }
.mgr-pend-hint { flex: 1; min-width: 180px; }
.mgr-pend-body { margin-top: 10px; border-top: 1px dashed var(--border); padding-top: 10px; }
.mgr-pend-search { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin-bottom: 8px; }
.mgr-pend-search .inp { max-width: 240px; }
#mgr-pend-list .tbl { margin-top: 2px; }

html[data-theme="dark"] .mgr-pend-body { border-top-color: #2a3038; }

/* ============================================================
   第 18 轮（2026-09-18）
   ② 跟踪池 KPI 口径小字 + 差异说明弹窗
   ③ 两张占比饼图默认收起 →「跟踪池全景」按钮展开
   ⑤ 抽屉「导出 Excel」
   ⑥ 更新公告弹窗
   ============================================================ */

/* ---- ② KPI 口径小字 / 可点卡片 ---- */
.kpi.k-clickable { cursor: pointer; transition: box-shadow .15s, transform .15s; }
.kpi.k-clickable:hover { box-shadow: 0 6px 18px rgba(30,58,107,.14); transform: translateY(-1px); }
.kpi.k-clickable::after {
  content: "▸ 看口径"; position: absolute; right: 14px; bottom: 16px;
  font-size: 11px; color: var(--muted); opacity: .0; transition: opacity .15s;
}
.kpi.k-clickable:hover::after { opacity: 1; }
.kpi { position: relative; }

/* 口径说明弹窗 */
.kx-row {
  display: flex; align-items: center; gap: 10px; padding: 8px 10px;
  border: 1px solid var(--border); border-radius: 8px; margin-bottom: 6px;
}
.kx-row b { font-size: 18px; }
.kx-tag {
  display: inline-block; padding: 2px 8px; border-radius: 999px;
  font-size: 12px; white-space: nowrap;
}
.kx-pool { background: rgba(30,58,107,.10); color: #1e3a6b; }
.kx-ledger { background: rgba(200,169,106,.18); color: #8a6d24; }
.kx-notin {
  margin-top: 10px; padding: 10px 12px; border-radius: 8px;
  background: rgba(30,58,107,.05); border: 1px dashed var(--border);
}
.kx-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; max-height: 180px; overflow: auto; }

/* ---- ③ 跟踪池全景：默认收起，点按钮才展开 ---- */
#wl-panel-funds.wl-pano-off #wl-pies { display: none; }
#wl-panel-funds.wl-pano-off .wl-pie-card { margin-bottom: 0; }

/* ---- ⑤ 抽屉「导出 Excel」条 ---- */
.drawer-export {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 8px; padding: 6px 0 0; border-top: 1px dashed var(--border);
}
.drawer-export .de-hint { font-size: 12px; color: var(--muted); }
.drawer-export .de-hint b { color: var(--text-2); }

/* ---- ⑥ 更新公告弹窗 ---- */
.rel-wrap { max-height: 55vh; overflow: auto; padding-right: 4px; }
.rel-item {
  border: 1px solid var(--border); border-radius: 10px;
  padding: 12px 14px; margin-bottom: 10px; background: rgba(30,58,107,.035);
}
.rel-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 6px; }
.rel-head b { font-size: 14px; }
.rel-ver {
  font-family: ui-monospace, Consolas, monospace; font-size: 12px;
  padding: 2px 7px; border-radius: 6px;
  background: rgba(30,58,107,.10); color: #1e3a6b;
}
.rel-list { margin: 0; padding-left: 20px; }
.rel-list li { font-size: 13px; line-height: 1.75; color: var(--text-2); }

/* 深色主题下的补偿（浅底在这三处会刺眼） */
html[data-theme="dark"] .kx-pool,
html[data-theme="dark"] .rel-ver { background: rgba(120,170,255,.16); color: #b9d3ff; }
html[data-theme="dark"] .kx-ledger { background: rgba(200,169,106,.20); color: #e6cf9a; }
html[data-theme="dark"] .kx-notin,
html[data-theme="dark"] .rel-item { background: rgba(255,255,255,.035); }



/* ==========================================================================
   第 19 轮 · 需求③：跟踪池全景口径提示条
   两张全景饼图固定按「在池 + 未停发」画，这条提示把口径与被排除量写在图上方，
   避免用户看到「70 家」再去跟台账的「96 家」对不上。
   ========================================================================== */
.wl-pano-note {
  margin: 0 0 12px; padding: 8px 12px;
  border: 1px solid var(--border); border-left: 3px solid var(--accent, #1e3a6b);
  border-radius: 8px; background: rgba(30, 58, 107, .05);
  font-size: 12.5px; line-height: 1.65; color: var(--text-2);
}
.wl-pano-note b { color: var(--text-1); }
html[data-theme="dark"] .wl-pano-note {
  background: rgba(120, 170, 255, .09); border-left-color: #6f9cff;
}
.wl-pano-note:empty { display: none; }
/* 饼图收起时，口径提示条一起收起 —— 它只解释那两张图，图不在就没必要占位 */
#wl-panel-funds.wl-pano-off .wl-pano-note { display: none; }

/* ==========================================================================
   第 20 轮 · 需求②：修改记录
   一张只读留痕表。刻意做成「窄而密」—— 审计是拿来扫的，不是拿来读的。
   ========================================================================== */
.au-bar {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
}
.au-bar input[type="search"] { flex: 1 1 260px; min-width: 200px; }
.au-bar input[type="date"] { flex: 0 0 auto; }
.au-bar select { flex: 0 0 auto; min-width: 120px; }

.au-tbl { width: 100%; border-collapse: collapse; }
.au-tbl th {
  text-align: left; font-weight: 500; font-size: 12px; color: var(--muted);
  padding: 8px 10px; border-bottom: 1px solid var(--border); white-space: nowrap;
}
.au-tbl td {
  padding: 9px 10px; border-bottom: 1px solid var(--border);
  font-size: 13px; vertical-align: top;
}
.au-row { cursor: pointer; }
.au-row:hover { background: rgba(30, 58, 107, .045); }
html[data-theme="dark"] .au-row:hover { background: rgba(120, 170, 255, .10); }

.au-inline { margin-top: 5px; display: flex; flex-direction: column; gap: 3px; }
.au-ch {
  display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap;
  font-size: 12px; line-height: 1.55;
}
.au-f {
  flex: 0 0 auto; color: var(--text-2); background: rgba(30, 58, 107, .07);
  border-radius: 4px; padding: 0 5px;
}
html[data-theme="dark"] .au-f { background: rgba(120, 170, 255, .14); }
.au-old { color: var(--muted); text-decoration: line-through; }
.au-arrow { color: var(--muted); }
.au-new { color: var(--text-1); }
.au-ch i { color: var(--muted); font-style: normal; opacity: .7; }

.au-meta {
  display: grid; grid-template-columns: 1fr; gap: 6px;
  padding: 10px 12px; margin-bottom: 12px;
  background: rgba(30, 58, 107, .045); border-radius: 8px; font-size: 13px;
}
html[data-theme="dark"] .au-meta { background: rgba(255, 255, 255, .05); }
.au-meta > div { display: flex; gap: 10px; align-items: baseline; }
.au-meta b {
  flex: 0 0 56px; color: var(--muted); font-weight: 500; font-size: 12px;
}
.au-diff { max-height: 52vh; overflow: auto; }
.au-diff .au-ch { padding: 5px 0; border-bottom: 1px dashed var(--border); }

.au-pager {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--border);
}

/* ===== 尽调笔记（第 21 轮 · 需求①③）===== */
.dd-wrap{display:flex;gap:14px;align-items:stretch;height:calc(100vh - 150px);min-height:460px}
.dd-side{
  width:270px;flex:0 0 270px;display:flex;flex-direction:column;
  background:var(--card);border:1px solid var(--line);border-radius:10px;overflow:hidden;
}
.dd-side-top{padding:10px 10px 8px;border-bottom:1px solid var(--line)}
.dd-side-top .inp{width:100%}
.dd-only{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted);margin-top:7px;cursor:pointer}
.dd-side-stat{font-size:12px;color:var(--muted);margin-top:7px}
.dd-side-stat b{color:var(--text)}
.dd-side-stat .dd-has{color:var(--primary)}
.dd-mgr-list{flex:1;overflow-y:auto;padding:6px}
.dd-mgr{
  display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;
  padding:8px 10px;margin-bottom:2px;border:0;border-radius:7px;background:transparent;
  color:var(--text);font-size:13px;text-align:left;cursor:pointer;font-family:inherit;
}
.dd-mgr:hover{background:var(--hover)}
.dd-mgr.active{background:var(--primary);color:#fff}
.dd-mgr.active .dd-mgr-cnt{background:rgba(255,255,255,.24);color:#fff}
.dd-mgr-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dd-mgr-cnt{
  flex:0 0 auto;min-width:22px;text-align:center;font-size:11px;padding:1px 6px;
  border-radius:9px;background:var(--line);color:var(--muted);
}
.dd-mgr-cnt.on{background:var(--primary-soft);color:var(--primary);font-weight:700}
.dd-main{flex:1;min-width:0;display:flex;flex-direction:column;
  background:var(--card);border:1px solid var(--line);border-radius:10px;overflow:hidden}
.dd-main-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  padding:12px 14px;border-bottom:1px solid var(--line);flex-wrap:wrap}
.dd-main-title{font-size:14px}
.dd-main-title b{font-size:15px;margin-right:6px}
.dd-main-actions{display:flex;gap:6px;flex-wrap:wrap}
/* 第 35 轮 · 需求②：路演材料一行 chip —— 不在页面内展示，点击弹窗查看 */
.dd-road-row {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 7px 10px; margin: 0 0 8px;
  border: 1px dashed var(--border, #d8d8d8); border-radius: 8px;
  background: rgba(127, 127, 127, 0.05);
}
.dd-road-label { font-weight: 600; font-size: 12.5px; white-space: nowrap; }
.dd-road-chip {
  display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
  padding: 3px 9px; border-radius: 999px; font-size: 12.5px;
  border: 1px solid var(--border, #d8d8d8); background: transparent;
  color: inherit; max-width: 320px; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap;
}
.dd-road-chip:hover { border-color: var(--gold, #c8a15a); }
.dd-road-chip em {
  font-style: normal; font-size: 10.5px; opacity: .65;
  border-left: 1px solid currentColor; padding-left: 6px;
}
.dd-road-host { min-height: 120px; }

/* 第 37 轮 · 需求⑥：把两类附件分成两个并排的框，一眼看出「尽调笔记 / 路演材料」
   的区别；整体高度受限（正文优先），不占展示空间。 */
.dd-attach-grid{
  display:grid;grid-template-columns:1fr 1fr;gap:8px;
  padding:8px 12px;border-bottom:1px solid var(--line);
}
.dd-attach-box{
  border:1px solid var(--line);border-radius:8px;overflow:hidden;
  display:flex;flex-direction:column;min-width:0;background:var(--card);
}
.dd-attach-hd{
  display:flex;align-items:center;gap:6px;padding:5px 9px;
  background:var(--hover);font-size:12px;font-weight:600;
  border-bottom:1px solid var(--line);
}
.dd-attach-n{
  font-size:11px;font-weight:600;padding:0 6px;border-radius:999px;
  background:var(--primary-soft);color:var(--primary);
}
.dd-attach-hint{margin-left:auto;font-weight:400;font-size:11px;color:var(--muted)}
.dd-attach-body{max-height:76px;overflow-y:auto;padding:6px 8px}
.dd-attach-empty{font-size:12px;color:var(--muted);padding:4px 2px}
.dd-attach-body .dd-tabs{border-bottom:0;padding:0;flex-wrap:wrap;gap:6px}
.dd-attach-body .dd-road-row{border:0;background:transparent;padding:0;margin:0;gap:6px}
@media (max-width:760px){.dd-attach-grid{grid-template-columns:1fr}}

.dd-tabs {display:flex;gap:6px;overflow-x:auto;padding:8px 12px;border-bottom:1px solid var(--line)}
.dd-tab{
  flex:0 0 auto;max-width:260px;text-align:left;padding:6px 10px;border-radius:7px;
  border:1px solid var(--line);background:transparent;color:var(--text);cursor:pointer;
  font-size:12px;font-family:inherit;line-height:1.35;
}
.dd-tab:hover{border-color:var(--primary)}
.dd-tab.active{border-color:var(--primary);background:var(--primary-soft);color:var(--primary);font-weight:600}
.dd-tab-meta{display:block;font-size:11px;color:var(--muted);margin-top:2px}
.dd-tab.active .dd-tab-meta{color:var(--primary)}
.dd-body{flex:1;overflow-y:auto;display:flex;flex-direction:column;min-height:0}
.dd-doc-head{padding:10px 14px;border-bottom:1px dashed var(--line)}
.dd-doc-title{font-size:15px;font-weight:700}
.dd-doc-meta{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:5px}
.dd-doc-actions{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.dd-warn{margin-top:8px;padding:7px 10px;border-radius:7px;font-size:12px;
  background:var(--gold-soft,rgba(200,140,0,.12));color:#a8730a}
.dd-doc-wrap{flex:1;display:flex;gap:0;min-height:0}
.dd-doc-area{flex:1;min-width:0;overflow-y:auto;padding:16px 18px;position:relative}
.dd-doc{font-size:13.5px;line-height:1.75}
.dd-doc h1,.dd-doc h2,.dd-doc h3,.dd-doc h4{margin:16px 0 8px;line-height:1.35}
.dd-doc h1{font-size:20px;border-bottom:1px solid var(--line);padding-bottom:6px}
.dd-doc h2{font-size:17px}
.dd-doc h3{font-size:15px}
.dd-doc p{margin:8px 0}
.dd-doc ul,.dd-doc ol{padding-left:22px;margin:8px 0}
.dd-doc li{margin:3px 0}
.dd-doc code{background:var(--hover);padding:1px 5px;border-radius:4px;font-size:12.5px}
.dd-doc pre{background:var(--hover);padding:10px 12px;border-radius:7px;overflow-x:auto}
.dd-doc pre code{background:none;padding:0}
.dd-doc blockquote{margin:10px 0;padding:6px 12px;border-left:3px solid var(--line);color:var(--muted)}
.dd-doc img{max-width:100%;height:auto;border-radius:6px}
.dd-doc a{color:var(--primary)}
.dd-doc .dd-li{margin:2px 0}
.dd-tbl{border-collapse:collapse;width:100%;margin:10px 0;font-size:12.5px}
.dd-tbl th,.dd-tbl td{border:1px solid var(--line);padding:5px 9px;text-align:left;vertical-align:top}
.dd-tbl th{background:var(--hover);font-weight:700}
.dd-sheet-h{margin:16px 0 6px;font-weight:700;font-size:13px;color:var(--primary)}
.dd-slide{border:1px solid var(--line);border-radius:8px;padding:10px 14px;margin:12px 0}
.dd-slide-h{font-size:12px;color:var(--muted);margin-bottom:6px}
.dd-ppt-img{max-width:100%;border-radius:6px;margin:6px 0;display:block}
.dd-notes{margin-top:8px;padding:8px 10px;border-left:3px solid var(--line);
  color:var(--muted);font-size:12.5px}
.dd-pre{white-space:pre-wrap;word-break:break-word;font-size:12.5px}
.dd-pdf{width:100%;height:100%;min-height:520px;border:0;background:#fff}
.dd-img{max-width:100%}
.dd-none{padding:26px;text-align:center;color:var(--muted)}
.dd-hl{
  background:rgba(220,53,69,.16);color:#c0272d;border-radius:3px;padding:0 2px;
  border-bottom:1px dashed #c0272d;cursor:pointer;
}
.dd-annos{
  width:272px;flex:0 0 272px;border-left:1px solid var(--line);overflow-y:auto;
  padding:10px 12px;background:var(--hover);
  /* 预留自身滚动条的槽位，避免出现/消失时整栏内容左右跳动 */
  scrollbar-gutter:stable;
}

/* 第 38 轮 · 需求①：把「尽调笔记」三个滚动容器的 native 滚动条改成 8px 细条。
   native 经典滚动条自带**上下箭头按钮**（▲/▼），且正好贴着批注栏左缘、与
   「批注」标题同高，视觉上和折叠把手连成一道墙 —— 用户反馈的「上下滑块挡住
   批注的字」即此。一旦用 ::-webkit-scrollbar 接管，箭头按钮就不会再出现。 */
.dd-doc-area,.dd-annos,.dd-side{scrollbar-width:thin}
.dd-doc-area::-webkit-scrollbar,
.dd-annos::-webkit-scrollbar,
.dd-side::-webkit-scrollbar{width:8px;height:8px}
.dd-doc-area::-webkit-scrollbar-track,
.dd-annos::-webkit-scrollbar-track,
.dd-side::-webkit-scrollbar-track{background:transparent}
.dd-doc-area::-webkit-scrollbar-thumb,
.dd-annos::-webkit-scrollbar-thumb,
.dd-side::-webkit-scrollbar-thumb{
  background:var(--line);border-radius:4px;
}
.dd-doc-area::-webkit-scrollbar-thumb:hover,
.dd-annos::-webkit-scrollbar-thumb:hover,
.dd-side::-webkit-scrollbar-thumb:hover{background:var(--muted)}
.dd-annos-h{display:flex;align-items:center;gap:7px;font-size:13px}
.dd-annos-h .pill{margin-left:0}
/* 第 38 轮 · 需求①：原来这里是 `.dd-annos-h button{margin-left:auto}`，
   会把**所有**按钮推到最右 —— 后来把折叠把手放进标题行时它也会被推走。
   收窄到只作用于「＋ 整篇批注」，把手才能紧跟在它后面。 */
.dd-annos-h #dd-anno-add{margin-left:auto}
.dd-annos-tip{margin:6px 0 10px;line-height:1.5}
.dd-anno{
  background:var(--card);border:1px solid var(--line);border-radius:8px;
  padding:8px 10px;margin-bottom:8px;transition:box-shadow .25s,border-color .25s;
}
.dd-anno.flash{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft)}
.dd-anno-meta{display:flex;align-items:center;gap:7px;font-size:12px}
.dd-anno-meta b{color:var(--text)}
.dd-anno-meta .dd-anno-del{margin-left:auto;color:#c0272d}
.dd-anno-meta .dd-anno-edit{margin-left:auto}
.dd-anno-meta .dd-anno-edit + .dd-anno-del{margin-left:4px}

/* 第 37 轮 · 需求④：批注下的回复列表与回复输入框 */
.dd-anno-reps{margin-top:7px;padding-top:6px;border-top:1px dashed var(--line)}
.dd-anno-norep{font-size:11.5px;color:var(--muted);padding:1px 0}
.dd-anno-rep{padding:4px 0 5px;border-bottom:1px dotted var(--line)}
.dd-anno-rep:last-child{border-bottom:0}
.dd-anno-rep-h{display:flex;align-items:center;gap:6px;font-size:11.5px}
.dd-anno-rep-h b{color:var(--text)}
.dd-anno-rep-h .dd-rep-del{margin-left:auto;color:#c0272d}
.dd-anno-rep-b{font-size:12.5px;line-height:1.55;margin-top:2px;white-space:pre-wrap}
.dd-anno-repbox{display:flex;gap:6px;align-items:center;margin-top:7px}
.dd-anno-repbox .dd-rep-inp{flex:1;min-width:0;font-size:12.5px;padding:4px 8px}
.dd-anno-repbox .dd-rep-send{flex:0 0 auto}

/* 第 37 轮 · 需求⑤：右上角通知（铃铛 + 未读角标 + 下拉面板） */
.notif-wrap{position:relative;display:inline-flex}
.notif-btn{position:relative}
.notif-dot{
  position:absolute;top:-2px;right:-4px;font-style:normal;font-size:10px;font-weight:700;
  min-width:15px;height:15px;line-height:15px;padding:0 4px;border-radius:999px;
  background:#c0272d;color:#fff;text-align:center;
}
.notif-panel{
  position:absolute;top:calc(100% + 6px);right:0;z-index:60;
  width:320px;max-height:400px;overflow-y:auto;
  background:var(--card);border:1px solid var(--line);border-radius:10px;
  box-shadow:0 8px 24px rgba(0,0,0,.16);
}
.notif-hd{
  display:flex;align-items:center;gap:8px;padding:8px 10px;
  border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--card);
}
.notif-hd button{margin-left:auto}
.notif-item{padding:8px 10px;border-bottom:1px solid var(--line);cursor:pointer}
.notif-item:hover{background:var(--hover)}
.notif-item.unread{border-left:3px solid var(--primary)}
.notif-t{font-size:12.5px;font-weight:600}
.notif-b{font-size:12px;color:var(--muted);margin-top:2px;line-height:1.5;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.notif-time{font-size:11px;color:var(--muted);margin-top:3px}

/* 第 37 轮 · 需求③：批注栏可向右收起，给正文让出宽度（272px → 22px 竖条）。
   第 38 轮 · 需求①：把手从「绝对定位在面板左缘」改为「标题行内的普通按钮」。
   ⚠ 旧实现 position:absolute;left:0;top:8px 会压住标题「批注」的前 7px
     （实测 elementFromPoint 在标题左缘采到的最上层元素就是该按钮）。
     改成行内 flex 项后由布局自然让位，结构上不可能再重叠。
   ⚠ 折叠态不再用 `.dd-annos.folded>*:not(.dd-anno-fold)`（把手已不是直接子元素），
     改为隐藏「标题行的其它子元素」+ 提示行 + 列表；把手自身始终可见。 */
.dd-annos{position:relative}
.dd-anno-fold{
  flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  width:18px;height:18px;line-height:1;padding:0;
  border:1px solid var(--line);border-radius:5px;
  background:var(--card);color:var(--muted);cursor:pointer;font-size:12px;
}
.dd-anno-fold:hover{color:var(--primary);border-color:var(--primary)}
.dd-annos.folded{flex:0 0 22px;width:22px;min-width:22px;padding:0;overflow:hidden}
.dd-annos.folded .dd-annos-h{gap:0;justify-content:center;margin:0}
.dd-annos.folded .dd-annos-h>*:not(.dd-anno-fold){display:none}
.dd-annos.folded .dd-annos-tip,
.dd-annos.folded #dd-anno-list{display:none}
.dd-anno-anchor{font-size:12px;color:#c0272d;background:rgba(220,53,69,.10);
  border-radius:5px;padding:3px 7px;margin:5px 0;word-break:break-word}
.dd-anno-body{font-size:12.5px;line-height:1.6;white-space:pre-wrap;word-break:break-word}
.dd-selbtn{
  position:fixed;z-index:60;padding:5px 11px;border-radius:16px;border:0;
  background:var(--primary);color:#fff;font-size:12px;cursor:pointer;
  box-shadow:0 4px 14px rgba(0,0,0,.22);font-family:inherit;
}
.dd-up-row{display:flex;gap:10px;margin-bottom:12px;align-items:flex-start}
.dd-up-row>label{flex:0 0 74px;font-size:13px;color:var(--muted);padding-top:8px}
.dd-up-fld{flex:1;min-width:0}
.dd-up-fld .inp{width:100%}
.dd-drop{
  border:1.5px dashed var(--line);border-radius:9px;padding:16px;text-align:center;
  font-size:13px;color:var(--muted);transition:border-color .2s,background .2s;
}
.dd-drop.over{border-color:var(--primary);background:var(--primary-soft)}
.dd-pick{color:var(--primary);cursor:pointer;text-decoration:underline}
.dd-anno-input{width:100%;margin-top:10px;resize:vertical;font-family:inherit}
.drawer-materials{
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin:12px 0 0;
  padding:9px 12px;border:1px solid var(--line);border-radius:8px;font-size:12.5px;
}
.drawer-materials .dm-label{font-weight:700;color:var(--muted)}
.drawer-materials .dm-item{
  max-width:230px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  padding:2px 8px;border-radius:6px;background:var(--hover);color:var(--text);
  text-decoration:none;
}
.drawer-materials .dm-item:hover{background:var(--primary-soft);color:var(--primary)}
.drawer-materials #dm-all,.drawer-materials #dm-up{margin-left:0}
@media (max-width:1100px){
  .dd-wrap{flex-direction:column;height:auto}
  .dd-side{width:100%;flex:0 0 auto;max-height:230px}
  .dd-annos{width:100%;flex:0 0 auto;border-left:0;border-top:1px solid var(--line)}
  .dd-doc-wrap{flex-direction:column}
}

/* ================= 第 28 轮 · 策略分类树筛选 + 抽屉策略区 ================= */
/* 筛选条：一级/二级单选芯片（选中态统一用 .on），只数为 0 的自动弱化 */
.wl-chip.is-zero { opacity: .45; }
.wl-chip.is-other { border-style: dashed; }
#wl-metric-row .inp.sl { min-width: 132px; }
#wl-metric-row .inp { height: var(--ui-h); padding: 0 10px; }
/* 表格里的指标列：数值列窄一点，避免挤掉「简称」 */
th.mt-th { min-width: 96px; }
td.mt-cell { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
td.mt-cell.muted { color: #94a3b8; }

/* 抽屉 · 策略分类条 */
.drawer-strategy {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  margin: 8px 0 4px; padding: 8px 10px;
  border: 1px solid var(--line, #e2e8f0); border-radius: 8px;
  background: var(--soft, #f8fafc);
}
.drawer-strategy .ds-label { font-size: 12px; color: #64748b; white-space: nowrap; }
.drawer-strategy .ds-sel { height: var(--ui-h); padding: 0 10px; min-width: 128px; }
.drawer-strategy .ds-val { font-size: 13px; }
.drawer-strategy .ds-sep { color: #94a3b8; margin: 0 2px; }
.drawer-strategy .ds-tags { display: inline-flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.drawer-strategy .ds-tag {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 1px 8px; border-radius: 999px; font-size: 12px;
  background: #e0edff; color: #1e3a6b; border: 1px solid #c7ddff;
}
.drawer-strategy .ds-tag .ds-x {
  font-style: normal; cursor: pointer; color: #64748b; font-weight: 700;
}
.drawer-strategy .ds-tag .ds-x:hover { color: #dc2626; }
.drawer-strategy .ds-new { height: var(--ui-h); padding: 0 10px; min-width: 240px; }
.drawer-strategy .ds-rec { font-size: 12px; color: #64748b; }
.drawer-strategy .ds-rec .ds-add {
  cursor: pointer; margin-right: 4px; padding: 1px 6px; border-radius: 999px;
  background: #fff; border: 1px dashed #c7ddff; color: #1e3a6b; font-weight: 600;
}
.drawer-strategy .ds-rec .ds-add:hover { background: #e0edff; }

/* 抽屉 · 业绩指标格 */
.mt-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 6px; }
.mt-item {
  display: flex; flex-direction: column; gap: 2px;
  padding: 6px 8px; border-radius: 6px; background: var(--soft, #f8fafc);
}
.mt-item span { font-size: 11px; color: #64748b; }
.mt-item b { font-size: 13px; }

/* 第 35 轮 · 需求③：抽屉「业绩指标」瘦身
   ------------------------------------------------------------
   原样：单格 flex-column（标签一行 + 数值一行）+ padding 6px8px + gap 6px
         → 每行实际高度 ≈ 34px，11 格在 376px 可用宽度里排 4 行 ≈ 160px。
   现在：标签与数值同行（flex-row + space-between）、padding 2px6px、gap 2px10px
         → 每行 ≈ 20px；卡玛两格合一后 10 格，2 列自适应 → 5 行 ≈ 100px。
   ⚠ 用 minmax(150px) 自适应而非写死列数：抽屉窄时自动 2 列，不会把
     「近一年最大回撤」这类长标签挤到 ellipsis 截断。 */
.mt-grid.mt-dense { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 2px 10px; }
.mt-grid.mt-dense .mt-item {
  flex-direction: row; align-items: baseline; justify-content: space-between; gap: 4px;
  padding: 2px 6px; border-radius: 5px;
}
.mt-grid.mt-dense .mt-item span {
  font-size: 10.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.mt-grid.mt-dense .mt-item b { font-size: 12px; white-space: nowrap; }
.mt-dim { color: var(--muted, #64748b); font-weight: 400; font-size: 10px; }

/* 第 35 轮 · 需求③：口径说明缩字 —— 页面上只留一行摘要，全文挂 title 悬停看 */
.hint-mini { font-size: 10.5px; line-height: 1.55; color: var(--muted, #64748b); margin-top: 6px; cursor: help; }


/* ============================================================
   第 30 轮 · 需求③⑦：跟踪池筛选窗格改版
   ------------------------------------------------------------
   改版前：.wl-filters 是一组没有边界、没有分隔的裸行，十来个标签铺满
           整屏，看不出「哪一行在筛什么、哪几行是一组」。
   改版后：一张带主色左描边的白卡片 + 行间虚线分组 + 维度名前置小竖条，
           结构上就是「管理人 / 一级策略 / 二级策略 / 策略标签 / 指标 /
           计算区间 / 指标范围」七行。三级是逐级展开的，默认只看得到头两行。

   注意：以下全部是**新增选择器**或对 .wl-filters 内部元素的选择器，
         不影响别的页面 —— .wl-filter-row / .wl-filter-label 只在
         renderWatchlist() 生成的这张卡片里出现（全项目仅此一处）。
   ============================================================ */

/* ① 面板本体：白底卡片 + 左侧主色描边，和下方结果卡片形成「筛选 → 结果」的层级 */
.wl-filters {
  background: var(--card);
  border: 1px solid var(--border);
  border-left: 3px solid var(--primary);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 11px 14px 12px;
  margin: 0 0 12px;
  gap: 9px;
}

/* ② 行分隔：只在行与行之间画虚线（首行不画），视觉上把七个维度切成七组 */
.wl-filter-row + .wl-filter-row {
  border-top: 1px dashed #eef1f6;
  padding-top: 9px;
}

/* ③ 维度名：前置一根主色小竖条，扫读时能立刻定位「这行筛的是什么」 */
.wl-filter-label {
  position: relative;
  padding-left: 9px;
  min-width: 56px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--text-2);
  letter-spacing: .2px;
}
.wl-filter-label::before {
  content: "";
  position: absolute; left: 0; top: 50%; margin-top: -6px;
  width: 3px; height: 12px; border-radius: 2px;
  background: var(--primary); opacity: .5;
}

/* ④ 逐级展开（需求③）：二级点了才出现、三级再点了才出现。
      hidden 时强制不占位；出现时给一点下落动效，避免「啪」地弹出来。
      ⚠ 别用 display:none 之外的方式隐藏 —— 否则 flex 的 gap 仍会留出空档。 */
.wl-filter-row[hidden] { display: none !important; }
.wl-filter-row:not([hidden]) { animation: wlRowIn .18s ease-out; }
@keyframes wlRowIn {
  from { opacity: 0; transform: translateY(-3px); }
  to   { opacity: 1; transform: none; }
}

/* ⑤ chip 在筛选卡片里放大一点点击目标（原 3px 11px 偏小，密集时容易点错） */
.wl-filters .wl-chip { padding: 4px 12px; }

/* ⑥ 标签折叠（需求③）：标签近百个，默认只渲染前 N 个。
      提示语与「展开全部 / 全选 / 清空」按钮推到右侧，不与标签混在一起。 */
#wl-l3-row .spacer,
#wl-range-row .spacer { flex: 1 1 auto; min-width: 8px; }
#wl-l3-toggle { white-space: nowrap; }

/* ⑦ 指标三行（需求⑦）：数字一律等宽，扫读时位数能对齐 */
#wl-metric-row .wl-chip,
#wl-win-row .wl-chip,
#wl-range-row .wl-chip { font-variant-numeric: tabular-nums; }
/* 「指标范围」行是整条筛选链的收口，给一层浅底把它从上面几行里拎出来 */
#wl-range-row {
  background: #fafbfe;
  border: 1px solid #eff2f7;
  border-radius: 8px;
  padding: 7px 9px;
}
#wl-range-row + .wl-filter-row { border-top: none; }

/* ⑧ 自定义区间（需求⑦）：两个输入框 + 单位，贴在同一行 */
.wl-custom-range {
  display: inline-flex; align-items: center; gap: 6px; padding-left: 4px;
}
/* ⚠ 必须显式处理 [hidden]：UA 样式表里 [hidden] 只是 `display: none`，
   而上面的 `display: inline-flex` 是作者样式 —— 会把它盖掉，
   于是「没选自定义」时那两个输入框照样显示（截图复查时发现的）。
   凡是「用 display 改过元素形态」又「靠 hidden 属性控制显隐」的地方都要补这一条。 */
.wl-custom-range[hidden] { display: none !important; }
.wl-custom-range .inp {
  height: var(--ui-h); padding: 0 8px;
  text-align: right; font-variant-numeric: tabular-nums;
}
.wl-custom-range .hint { font-size: 12px; }

/* ⑧-b 强制换行（需求⑦）：「指标范围」行的分档 chip 有 7~8 个，剩下的
       「当前筛选摘要 + 清除指标」会零碎地挤在第二行左侧（实测截图如此）。
       插一个占满整行、零高的元素把它俩稳定推到第二行并靠右。 */
.wl-break { flex-basis: 100%; height: 0; width: 0; }

/* ⑨ 当前筛选摘要：未启用 = 灰色文字；已生效 = 主色小药丸（由 app.js 切 .on） */
#wl-idx-hint { font-size: 12px; white-space: nowrap; }
#wl-idx-hint.on {
  background: #eef4ff; color: var(--primary);
  border: 1px solid #d6e3fa; border-radius: 999px;
  padding: 2px 10px; font-weight: 600;
}


/* ============================================================
   第 30 轮 · 需求⑥：列头点一下就排序（原来的「排序下拉」已删除）
   ------------------------------------------------------------
   可排序列 = 最新净值 / 近一周 / 近一月 / 近三月 / 近六月 / 近一年收益 /
             最新净值日。未排序列显示淡淡的 ⇅，当前列显示实心箭头 ↓ / ↑。
   ============================================================ */
th.th-sort { cursor: pointer; user-select: none; transition: .12s; }
th.th-sort:hover { background: #eef2f9; color: var(--primary); }
th.th-sort .sort-ico {
  margin-left: 3px; font-size: 10px; opacity: .38;
  font-variant-numeric: normal;
}
th.th-sort:hover .sort-ico { opacity: .8; }
/* 当前排序的列：浅蓝底 + 主色加粗，和「只是可点」的列明确区分 */
th.th-sort.on { background: #eef4ff; color: var(--primary); font-weight: 700; }
th.th-sort.on .sort-ico { opacity: 1; }
/* 升序时箭头染金：颜色 + 箭头形状双重提示，避免只看箭头看不出方向 */
th.th-sort.on.asc .sort-ico { color: var(--gold-dark); }


/* ============================================================
   第 30 轮 · 暗色主题适配
   ============================================================ */
html[data-theme="dark"] .wl-filters {
  background: #141a24; border-color: #2a3038; border-left-color: #4b79bb;
}
html[data-theme="dark"] .wl-filter-row + .wl-filter-row { border-top-color: #232a34; }
html[data-theme="dark"] .wl-filter-label::before { background: #4b79bb; opacity: .7; }
html[data-theme="dark"] #wl-range-row { background: #171e29; border-color: #232a34; }
html[data-theme="dark"] #wl-idx-hint.on {
  background: #16233d; border-color: #3a5a8c; color: #a9c6ee;
}
html[data-theme="dark"] th.th-sort:hover { background: #1b2230; color: #a9c6ee; }
html[data-theme="dark"] th.th-sort.on { background: #16233d; color: #a9c6ee; }
html[data-theme="dark"] th.th-sort.on.asc .sort-ico { color: #e2c886; }

/* =====================================================================
   第 32 轮 · 需求三 / 需求五
   ===================================================================== */

/* ---- 需求五：为什么文字只显示一半 ----
   全局 `select,input{padding:9px 12px}`（上下共 18px）+ `*{box-sizing:border-box}`，
   凡是再写死 `height:28px / 30px` 的控件，内容区只剩 8~10px，
   小于 13px 文字的正常行高（≈18px）→ 文字下半截被裁掉。
   凡是给输入控件设 height 的地方，padding 上下必须置 0，且 height ≥ 32px。 */
select, input[type=text], input[type=number], input[type=password], input[type=date] {
  line-height: 1.45;
}

/* ---- 需求三：表格横向滑块 ---- */
/* `.table-wrap` 原本就有 overflow-x:auto；这里只补「滚动条要看得见」——
   默认的 macOS/Windows 细滚动条常常被误认为没有可拖拽区域。 */
.table-wrap::-webkit-scrollbar { height: 11px; }
.table-wrap::-webkit-scrollbar-track { background: #eef2f7; border-radius: 8px; }
.table-wrap::-webkit-scrollbar-thumb {
  background: #bfcbd9; border-radius: 8px; border: 2px solid #eef2f7;
}
.table-wrap::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
.table-wrap { scrollbar-width: thin; scrollbar-color: #bfcbd9 #eef2f7; }
/* 嵌在 .card 里的滚动容器：card 已经有白底/圆角/阴影，这里只保留滚动能力 */
.table-wrap.in-card { background: transparent; box-shadow: none; border-radius: 0; }

/* ---- 在管产品一览表（13 张长条卡 → 一张表）---- */
.prod-tbl th { white-space: nowrap; vertical-align: bottom; line-height: 1.32; }
/* 第 124 轮 · 已清盘产品表（12 列定宽）。
   ⚠ 必须 fixed：auto 布局下浏览器会把剩余宽度整块分给第 1 列，
     导致表头只剩「#」可见、其余列被挤出可视区（实测 th# 宽 1139px）。 */
.liq-tbl { table-layout: fixed; }
.liq-tbl th { white-space: nowrap; vertical-align: bottom; line-height: 1.32; }
.liq-tbl td { padding: 9px 12px; }
.liq-tbl .prod-date { color: var(--text-2); font-variant-numeric: tabular-nums; }
.liq-tbl td.prod-idx { color: var(--muted); }
.liq-tbl td.prod-pills { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.liq-tbl td.prod-pills .pill { font-size: 10px; padding: 2px 7px; margin-left: 3px; }
.liq-tbl .pc-name { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* ⚠⚠ 与 .prod-tbl 同一条坑：<tr> 上挂着历史类名 product-card / pc-strip，
   .product-card.pc-strip 是 display:flex ⇒ 不显式还原成 table-row 的话，
   行内单元格会被压成「内容宽度」，与 thead 的定宽列完全错位
   （实测 td 合计 964px / 表宽 1126px，最后一列只抢到 28px，胶囊被截成「已」）。 */
.liq-tbl tbody tr.product-card,
.liq-tbl tbody tr.product-card.pc-strip {
  display: table-row; padding: 0; margin: 0; border: none; border-radius: 0;
  background: transparent; box-shadow: none; cursor: pointer; transform: none;
}
.liq-tbl tbody tr.product-card:hover { transform: none; box-shadow: none; }
.liq-tbl tbody tr.product-card.pc-strip.active { background: transparent; }
.liq-tbl tbody tr.product-card.active td { background: #eef4ff; }
.liq-tbl tbody tr.product-card.active td:first-child { box-shadow: inset 3px 0 0 var(--primary); }
.prod-tbl td { padding: 9px 14px; }
.prod-tbl .prod-date { color: var(--text-2); font-variant-numeric: tabular-nums; }
.prod-tbl td.prod-idx { color: var(--muted); }
.prod-tbl .prod-range { color: var(--text-2); font-variant-numeric: tabular-nums; }
.prod-tbl td.prod-pills { white-space: nowrap; }
.prod-tbl td.prod-pills .pill { font-size: 10px; padding: 2px 7px; margin-left: 3px; }
.prod-tbl .prod-name-cell { display: flex; align-items: center; gap: 8px; }
.prod-tbl .prod-name-cell .pc-strip-name { min-width: 0; max-width: 240px; }

/* ⚠ <tr> 上仍挂着 product-card / pc-strip 两个历史类名（为了不打断 round5~10 的
   UI 套件选择器：它们按 .product-card 取行、点击、读 data-fof / .active）。
   但 .product-card.pc-strip 原本是 display:flex + 圆角 + 阴影 —— 直接落在 <tr> 上
   会把表格布局冲垮，所以这里显式还原成表格行。 */
.prod-tbl tbody tr.product-card,
.prod-tbl tbody tr.product-card.pc-strip {
  display: table-row; padding: 0; margin: 0; border: none; border-radius: 0;
  background: transparent; box-shadow: none; cursor: pointer; transform: none;
}
.prod-tbl tbody tr.product-card:hover { transform: none; box-shadow: none; }
.prod-tbl tbody tr.product-card.pc-strip.active { background: transparent; }
.prod-tbl tbody tr.product-card.active td { background: #eef4ff; }
.prod-tbl tbody tr.product-card.active td:first-child {
  box-shadow: inset 3px 0 0 var(--primary);
}
.prod-tbl tbody tr.product-card.pc-noval { opacity: .62; }

/* ---- 第 32 轮 · 需求六：跟踪管理人页（管理人 → 旗下产品 → 复用抽屉）---- */
.mgr-tbl .mgr-name-cell { min-width: 240px; }
.mgr-toggle { cursor: pointer; display: inline-flex; align-items: center; gap: 5px; }
.mgr-toggle:hover b { color: var(--primary); text-decoration: underline; }
.mgr-caret { color: var(--muted); font-size: 11px; display: inline-block; transition: transform .15s; }
.mgr-toggle.open .mgr-caret { color: var(--primary); transform: rotate(90deg); }

.mgr-funds {
  margin-top: 8px; padding: 8px 10px; border-radius: 9px;
  background: var(--soft, #f8fafc); border: 1px solid var(--line, #e2e8f0);
}
.mgr-funds-load { font-size: 12px; color: var(--muted); padding: 2px 0; }
.mgr-funds-hint { font-size: 11px; color: var(--muted); margin-bottom: 6px; }
.mgr-fund-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.mgr-fund-chip {
  display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
  padding: 4px 9px; border-radius: 8px; font-size: 12px; text-align: left;
  background: #fff; border: 1px solid var(--border, #dde3ec); color: var(--text);
  transition: .15s; max-width: 100%;
}
.mgr-fund-chip:hover { border-color: var(--primary); box-shadow: 0 1px 6px rgba(30,58,107,.12); }
.mgr-fund-chip .mfc-code {
  font-size: 10px; font-weight: 700; letter-spacing: .3px;
  background: var(--navy, #1e3a6b); color: #fff; padding: 1px 6px; border-radius: 5px;
  font-variant-numeric: tabular-nums;
}
.mgr-fund-chip .mfc-name {
  max-width: 190px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.mfc-tag {
  font-size: 10px; padding: 1px 6px; border-radius: 999px; white-space: nowrap;
}
.mfc-core { background: #fff4e0; color: #b26a00; }
.mfc-invested { background: #e6f6ea; color: var(--down, #2f9e44); }
.mfc-delisted { background: #eef1f6; color: #64748b; }
.mfc-kind { background: #eaf0fa; color: var(--primary-dark, #1e3a6b); }
/* 展开区在 <td> 里，不受表头 nowrap 约束 —— 允许换行 */
.mgr-tbl td.mgr-name-cell { white-space: normal; }

/* ===========================================================
   第 33 轮 · 需求一/二：表格左侧列冻结
   ===========================================================
   冻结单元格自带不透明背景，会盖住 tr 上的背景色，
   所以 hover / 份额子行 / 已选中行等状态要逐条复刻。
   冻结区右边界用 box-shadow 而不是 border ——
   border-collapse:collapse 下 sticky 单元格的 border 会被相邻格吃掉。 */
.tbl.cols-freeze th.fz,
.tbl.cols-freeze td.fz{
  position:sticky;
  background:var(--card);
  z-index:3;
}
.tbl.cols-freeze th.fz{ background:#f8fafc; z-index:7; }
.tbl.cols-freeze th.fz-last,
.tbl.cols-freeze td.fz-last{ box-shadow:1px 0 0 0 var(--border); }
.tbl.cols-freeze tbody tr:hover td.fz{ background:#fafbfe; }
.tbl.cols-freeze tbody tr.wl-share-row td.fz{ background:#f8fbff; }
.tbl.cols-freeze tbody tr.wl-share-row:hover td.fz{ background:#eff6ff; }
.tbl.cols-freeze tbody tr.wl-fof-row td.fz{ background:#fbfcff; }
.tbl.cols-freeze tbody tr.wl-fof-row:hover td.fz{ background:#f2f6ff; }
.tbl.cols-freeze tbody tr.sum-row td.fz{ background:#f8fafc; }
.tbl.cols-freeze tbody tr.hl-row:hover td.fz{ background:#f2f6ff; }
.tbl.cols-freeze tbody tr.product-card.active td.fz,
.tbl.cols-freeze tbody tr.product-card.active:hover td.fz{ background:#eef4ff; }
.tbl.cols-freeze tbody tr.product-card.pc-noval td.fz{ background:#fffdf8; }

/* 设置里被隐藏的列：表头与所有行同步隐藏，冻结偏移会自动跳过 */
.col-hidden{ display:none !important; }

/* ===========================================================
   第 33 轮 · 需求四：指标列设置面板
   =========================================================== */
.prod-list-card{ position:relative; }
.prod-cols-btn{ padding:6px 12px; font-size:12px; border-radius:9px; cursor:pointer; white-space:nowrap; }
.prod-cols-panel{
  position:absolute; right:14px; top:48px; z-index:60;
  width:352px; max-height:72vh; overflow:auto;
  background:var(--card); border:1px solid var(--border); border-radius:12px;
  box-shadow:0 14px 34px rgba(15,32,63,.18); padding:10px 14px 12px;
}
.prod-cols-panel .pcp-group{
  margin:10px 0 4px; font-size:12px; font-weight:700; color:var(--muted);
  border-bottom:1px solid #f1f4f9; padding-bottom:4px;
}
.prod-cols-panel .pcp-group:first-child{ margin-top:2px; }
.prod-cols-panel label{
  display:flex; align-items:center; gap:8px;
  padding:4px 6px; font-size:12.5px; color:var(--text); cursor:pointer; border-radius:6px;
}
.prod-cols-panel label:hover{ background:#f6f9ff; }
.prod-cols-panel label input[type=checkbox]{
  width:15px; height:15px; padding:0; margin:0; flex:0 0 auto; cursor:pointer;
}
.prod-cols-panel label.pcp-lock{ color:var(--muted); cursor:default; }
.prod-cols-panel label.pcp-lock:hover{ background:none; }
.prod-cols-panel .pcp-foot{
  display:flex; gap:8px; margin-top:12px; padding-top:10px;
  border-top:1px solid var(--border);
}
.prod-cols-panel .pcp-foot button{ padding:5px 11px; font-size:12px; border-radius:8px; cursor:pointer; }


/* ============================================================================
   第 34 轮
   ============================================================================ */

/* ---- ① 抽屉：工具条挂在正文顶部（头部只留标题），滚轮落在哪都在滚抽屉 ---- */
.drawer-bars{display:flex;flex-direction:column}
/* 滚到边界时不把滚动链交给后面的页面 */
.drawer-body{overscroll-behavior:contain}
/* 抽屉打开期间锁住主页面滚动（overscroll-behavior 挡不住「滚轮落在不可滚动的头部」） */
html.drawer-lock{overflow:hidden}

/* ---- ② 抽屉「尽调材料」条：取消上传，只留「查看尽调报告」 ---- */
.drawer-materials .dm-cnt{color:var(--text-2)}
.drawer-materials .dm-cnt b{color:var(--text);font-weight:800}

/* ---- ③ 导出条：自定义时间区间 ---- */
.drawer-export .de-range{display:inline-flex;align-items:center;gap:5px}
/* 第 101 轮：原来 height:auto + padding:3px ⇒ 实际高度约 20px，
   日历图标几乎点不中（用户反馈「无法选择时间」）。
   加高到 30px 并放大字号；点击整框用 showPicker() 唤起（见 app.js）。 */
.drawer-export .de-date{width:146px;padding:5px 8px;font-size:12.5px;
  height:30px;box-sizing:border-box;cursor:pointer}
.drawer-export .de-all{font-size:11.5px;color:var(--muted);cursor:pointer;
  border-bottom:1px dashed var(--border);white-space:nowrap}
.drawer-export .de-all:hover{color:var(--primary);border-bottom-color:var(--primary)}

/* ===== 第 109 轮 · 份额对账多文件上传 ===== */
.sr-flist{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:8px}
.sr-flist:empty{display:none}
.sr-fchip{position:relative;display:inline-flex;align-items:center;gap:4px;
  max-width:280px;padding:3px 20px 3px 9px;border:1px solid var(--border);
  border-radius:6px;background:#fff;font-size:12px;color:var(--text-2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sr-fchip i{font-style:normal;color:var(--muted);font-size:11px;flex:0 0 auto}
.sr-fchip .sr-fdel{position:absolute;right:4px;top:50%;transform:translateY(-50%);
  width:14px;height:14px;line-height:13px;text-align:center;border-radius:50%;
  background:#e2e8f0;color:#64748b;font-size:10px;font-style:normal;cursor:pointer}
.sr-fchip .sr-fdel:hover{background:#dc2626;color:#fff}
.sr-keep{display:flex;align-items:center;gap:6px;margin-top:8px;font-size:12px;
  color:var(--text-2);cursor:pointer;user-select:none}
.sr-keep input{flex:0 0 14px;width:14px;height:14px;margin:0}
.sr-upmsg{margin-top:6px}
.sr-upmsg:empty{display:none}
.sr-fres{font-size:12px;line-height:1.7;padding-left:14px;position:relative;word-break:break-all}
.sr-fres:before{content:"•";position:absolute;left:2px;top:0}
.sr-fres.ok{color:var(--text-2)}
.sr-fres.err{color:#b91c1c}

/* ===== 第 108 轮 · 份额月度对账 ===== */
.sr-wrap{display:flex;flex-direction:column;gap:12px}
.sr-up{background:#f8fafc;border:1px solid var(--border);border-radius:10px;padding:10px 12px}
.sr-up-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:6px}
.sr-months{font-size:13px}
.sr-mrow{display:flex;gap:8px;flex-wrap:wrap;margin-top:6px}
.sr-mchip{position:relative;padding:5px 10px;border:1px solid var(--border);border-radius:16px;
  cursor:pointer;background:#fff;font-size:12.5px;user-select:none}
.sr-mchip i{font-style:normal;color:var(--muted);font-size:11px;margin-left:2px}
.sr-mchip.on{border-color:var(--primary);color:var(--primary);background:var(--primary-soft)}
.sr-mchip .sr-del{position:absolute;top:-6px;right:-6px;width:15px;height:15px;line-height:14px;
  text-align:center;border-radius:50%;background:#e2e8f0;color:#64748b;font-size:10px;font-style:normal}
.sr-mchip .sr-del:hover{background:#dc2626;color:#fff}
.sr-head{display:flex;align-items:baseline;gap:10px;margin-bottom:8px}
.sr-kpis{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.sr-kpi{border:1px solid;border-radius:8px;padding:4px 10px;font-size:12.5px}
.sr-kpi b{margin-left:6px;font-size:14px}
.sr-tbl td{font-size:12.5px}
.sr-tx{font-size:11.5px;color:var(--text-2);line-height:1.6}
.sr-badge{border:1px solid;border-radius:10px;padding:1px 7px;font-size:11.5px;white-space:nowrap}
/* 第 110 轮：对账表 9 列，弹窗只有 ~1080px —— 不固定列宽会被压扁、文字互相重叠。
   参照投资人表（.inv-tbl）的做法：table-layout:fixed + 明确列宽，容器横向滚动。 */
.sr-tbl{width:1260px;min-width:1260px;table-layout:fixed}
/* ⚠ 全局 td 是 white-space:nowrap（第 210 行），不在这里改回来，
   状态列的提示会整行溢出到「交易明细」列上。 */
.sr-tbl td{vertical-align:top;white-space:normal}
.sr-tbl th:nth-child(1),.sr-tbl td:nth-child(1){width:220px}
.sr-tbl th:nth-child(2),.sr-tbl td:nth-child(2){width:96px}
.sr-tbl th:nth-child(3),.sr-tbl td:nth-child(3),
.sr-tbl th:nth-child(4),.sr-tbl td:nth-child(4),
.sr-tbl th:nth-child(5),.sr-tbl td:nth-child(5),
.sr-tbl th:nth-child(6),.sr-tbl td:nth-child(6),
.sr-tbl th:nth-child(7),.sr-tbl td:nth-child(7){width:104px}
.sr-tbl th:nth-child(8),.sr-tbl td:nth-child(8){width:220px}
.sr-tbl th:nth-child(9),.sr-tbl td:nth-child(9){width:204px}
.sr-tbl .sr-badge{display:inline-block}
.sr-split{margin-top:3px;font-size:11px;color:#64748b;line-height:1.5}
.sr-hint{margin-top:3px;font-size:11px;line-height:1.5;color:#b91c1c}
.sr-head .btn-xs{margin-left:auto}
.sr-tip{margin-top:10px;padding:8px 12px;border-radius:8px;background:#fef2f2;
  border:1px solid #fecaca;color:#b91c1c;font-size:13px}

/* ===== 第 106 轮 · 费用页「缺估值表」提示 ===== */
.fee-gap{margin-top:10px;padding:10px 12px;border-radius:10px;
  background:#fffbeb;border:1px solid #fcd34d}
.fee-gap-h{font-size:13px;color:#92400e;font-weight:600;margin-bottom:6px}
.fee-gap-h .hint{font-weight:400;color:#b45309;margin-left:8px;font-size:12px}
.fee-gap-row{font-size:12.5px;color:#7c2d12;line-height:1.9;display:flex;gap:8px;
  align-items:baseline;flex-wrap:wrap}
.fee-gap-row b{color:#92400e;min-width:96px}
.fee-gap-row b{font-weight:600}

/* ===== 第 103 轮 · 自绘日期选择器（替代原生日历）===== */
.dtp{position:fixed;z-index:160;width:236px;padding:8px;background:#fff;
  border:1px solid var(--border);border-radius:10px;
  box-shadow:0 10px 30px rgba(16,24,40,.18);
  font-size:12.5px;color:var(--text);user-select:none}
.dtp.hidden{display:none}
.dtp-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
.dtp-title{font-size:13px}
.dtp-nav{width:24px;height:24px;border:1px solid var(--border);background:#fff;
  border-radius:6px;cursor:pointer;line-height:1;color:var(--text-2);padding:0}
.dtp-nav:hover{border-color:var(--primary);color:var(--primary)}
.dtp-dow{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;
  color:var(--muted);font-size:11px;margin-bottom:2px}
.dtp-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.dtp-d{display:flex;align-items:center;justify-content:center;height:26px;
  border-radius:6px;cursor:pointer;color:var(--text)}
.dtp-d:hover{background:var(--primary-soft)}
.dtp-d.off{visibility:hidden;cursor:default}
.dtp-d.today{border:1px solid var(--primary);color:var(--primary)}
.dtp-d.sel{background:var(--primary);color:#fff;font-weight:700}
.dtp-d.dis{color:#c7cdd6;cursor:not-allowed;background:none}
.dtp-foot{display:flex;justify-content:space-between;margin-top:6px;
  padding-top:6px;border-top:1px dashed var(--border)}
.dtp-btn{border:0;background:none;color:var(--primary);cursor:pointer;
  font-size:12px;padding:2px 4px}

/* ---- ④ 跟踪池顶部卡片压成一条：116px → 约 52px ---- */
.kpi-grid.kpi-strip{display:flex;flex-wrap:wrap;gap:0;padding:0;margin-bottom:14px;
  background:#fff;border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}
.kpi-grid.kpi-strip .kpi{flex:1 1 0;min-width:150px;background:transparent;
  box-shadow:none;border-radius:0;border-right:1px solid var(--border);
  padding:10px 16px;flex-direction:row;align-items:baseline;flex-wrap:wrap;gap:0 8px}
.kpi-grid.kpi-strip .kpi:last-child{border-right:0}
.kpi-grid.kpi-strip .k-label{font-size:12px;color:var(--muted)}
.kpi-grid.kpi-strip .k-value{font-size:19px;font-weight:800;letter-spacing:-.3px;line-height:1.25}
.kpi-grid.kpi-strip .k-value span{font-size:12px !important}
.kpi-grid.kpi-strip .k-sub{flex-basis:100%;font-size:11px;margin-top:1px}
.kpi-grid.kpi-strip .kpi.k-clickable{cursor:pointer}
.kpi-grid.kpi-strip .kpi.k-clickable:hover{background:var(--primary-soft)}

/* ---- ⑤ 策略列：一级 · 二级（与筛选同口径），过长省略 ---- */
.tbl td .stg{display:inline-block;max-width:170px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}

/* ---- ⑥ 弹窗里的尽调报告（复用尽调笔记面板） ---- */
.dd-wrap-modal{height:min(72vh,720px);min-height:420px}
.modal-body .dd-selbtn{z-index:130}      /* 要压过 .modal-mask 的 z-index:100 */
.dd-anno-inline{background:var(--primary-soft);border-color:var(--primary)}
.dd-anno-inline-act{display:flex;justify-content:flex-end;gap:6px;margin-top:6px}

/* 暗色主题兜底（主题开关暂未启用，先跟着既有规则写一条） */
html[data-theme="dark"] .kpi-grid.kpi-strip{background:#1b2028}


/* ---- 第 41 轮 · 需求③：用户权限表单（可见基金白名单 + 搜索建议） ---- */
.u-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px;min-height:24px}
.u-tag{display:inline-flex;align-items:center;gap:5px;font-size:12px;
  background:var(--primary-soft);border:1px solid var(--primary);
  color:var(--primary);border-radius:12px;padding:2px 8px;line-height:1.6}
.u-tag i{cursor:pointer;font-style:normal;font-weight:700;opacity:.65}
.u-tag i:hover{opacity:1}
.u-sug{max-height:190px;overflow:auto;border:1px solid var(--border);
  border-radius:6px;background:#fff;box-shadow:var(--shadow)}
.u-sug-item{padding:5px 10px;font-size:13px;cursor:pointer}
.u-sug-item:hover{background:var(--primary-soft)}
.u-sug.hidden{display:none}
/* 第 60 轮 · 需求 6：「可见板块」勾选区固定列宽网格 —— 勾选项多少都不撑窗口。
   固定 176px 一列，auto-fill 自动铺列；标签过长省略号，不再把弹窗挤变形。 */
#u-views{display:grid;grid-template-columns:repeat(auto-fill,176px);
  gap:6px 10px;align-items:center}
#u-views label{font-size:13px;cursor:pointer;display:flex;align-items:center;
  gap:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
/* 第 96 轮修 bug：这个 checkbox 被拉成了整行宽（实测 input 宽度 = label 的 176px），
   中文标签被挤到容器外、被 overflow:hidden 裁掉 ⇒ 用户只看到一堆没有文字的方框。
   给 checkbox 明确尺寸，并让文本项可收缩。 */
#u-views label input[type=checkbox]{flex:0 0 15px;width:15px;height:15px;margin:0}
#u-views label span{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
#u-perm-box{border-top:1px dashed var(--border);padding-top:10px;margin-top:4px}
/* 第 60 轮 · 需求 6：搜索框统一占满整行，输入时不再改变行宽 */
#u-funds-q,#u-holdings-q,#u-inv-q,#u-invone-q{width:100%;box-sizing:border-box}
#u-views-hint{line-height:1.6}

/* 第 45 轮 - 任务 A：周度回顾固定列 + 配色 */
.wr-table-wrap{overflow:auto;position:relative}
.wr-tbl{border-collapse:separate;border-spacing:0;width:100%;font-size:12.5px}
.wr-tbl thead th{position:sticky;top:0;background:#eef2ff;z-index:6;font-weight:600;border-bottom:2px solid #cbd5e1;color:#334155}
.wr-tbl .wr-c-idx,.wr-tbl .wr-c-name,.wr-tbl .wr-c-strat{background:#fff;z-index:1}
.wr-tbl thead th.wr-c-idx,.wr-tbl thead th.wr-c-name,.wr-tbl thead th.wr-c-strat{z-index:1;background:#eef2ff}
.wr-tbl td.wr-c-idx,.wr-tbl th.wr-c-idx{min-width:36px}
.wr-tbl td.wr-c-name,.wr-tbl th.wr-c-name{min-width:170px;max-width:240px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wr-tbl td.wr-c-strat,.wr-tbl th.wr-c-strat{min-width:120px}
.wr-tbl tbody tr:hover td{background:#f8fafc}

.wr-tbl .wr-up{color:#dc2626;font-weight:600}
.wr-tbl .wr-dn{color:#15803d;font-weight:600}
.wr-tbl .pos{color:#dc2626;font-weight:600}
.wr-tbl .neg{color:#15803d;font-weight:600}
.wr-tbl .muted{color:#94a3b8;font-weight:400}

/* 第 47 轮 · 「在管产品·周度回顾」弹窗前 3 列镜像 rail（mirror rail 方案） */
.wr-split{display:flex;align-items:flex-start;gap:0;position:relative}
.wr-split .wr-name-rail{flex:0 0 auto;position:sticky;left:0;z-index:5;background:#fff;overflow:hidden;box-shadow:2px 0 4px rgba(0,0,0,0.08);max-height:70vh}
.wr-split .wr-tbl-rail{margin:0;border-collapse:separate;border-spacing:0;font-size:12.5px}
.wr-split .wr-tbl-rail th,.wr-split .wr-tbl-rail td{padding:8px 10px;border-bottom:1px solid #e2e8f0;font-size:12.5px;background:#fff}
.wr-split .wr-tbl-rail thead th{background:#eef2ff;font-weight:600;border-bottom:2px solid #cbd5e1;color:#334155}
.wr-split .wr-tbl-rail td.whr-c-name-placeholder{padding:6px 10px;background:#f1f5f9;border-bottom:1px solid #cbd5e1;font-size:12px;color:#475569;font-weight:600}
/* rail 列宽度匹配源表对应列 */
.wr-split .wr-tbl-rail td.wr-c-idx,.wr-split .wr-tbl-rail th.wr-c-idx{min-width:36px}
.wr-split .wr-tbl-rail td.wr-c-name,.wr-split .wr-tbl-rail th.wr-c-name{min-width:170px;max-width:240px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wr-split .wr-tbl-rail td.wr-c-strat,.wr-split .wr-tbl-rail th.wr-c-strat{min-width:120px}

/* 第 45 轮 - 任务 C/D: 持仓周度回顾表格样式 */
.whr-wrap{max-height:65vh;overflow-x:auto;overflow-y:auto;position:relative;flex:1 1 auto;min-width:0}
.whr-tbl{border-collapse:separate;border-spacing:0;width:max-content;min-width:100%;font-size:12.5px}
/* 第 46 轮 · 需求 B：name 列镜像 rail 方案 */
.whr-split{display:flex;align-items:flex-start;gap:0;position:relative}
.whr-split .whr-name-rail{flex:0 0 auto;position:sticky;left:0;z-index:5;background:#fff;max-height:65vh;overflow:hidden;box-shadow:2px 0 4px rgba(0,0,0,0.08)}
.whr-split .whr-tbl-rail{margin:0;border-collapse:separate;border-spacing:0;font-size:12.5px}
.whr-split .whr-tbl-rail th,.whr-split .whr-tbl-rail td{padding:8px 10px;border-bottom:1px solid #e2e8f0;font-size:12.5px;background:#fff}
.whr-split .whr-tbl-rail thead th{background:#eef2ff;font-weight:600;border-bottom:2px solid #cbd5e1;color:#334155}
.whr-split .whr-tbl-rail td.whr-c-name,.whr-split .whr-tbl-rail th.whr-c-name{min-width:200px;max-width:280px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.whr-split .whr-tbl-rail td.whr-c-name-placeholder{min-width:200px;padding:6px 10px;background:#f1f5f9;border-bottom:1px solid #cbd5e1;font-size:12px;color:#475569;font-weight:600}
.whr-tbl thead th{position:sticky;top:0;background:#eef2ff;z-index:6;font-weight:600;border-bottom:2px solid #cbd5e1;color:#334155}
/* 第 60 轮 · 需求 5：wr-tbl 前 3 列改纯 sticky（原「缩 0 宽 + 镜像 rail」规则已删）。 */
.wr-table-wrap.wr-wrap{flex:1 1 auto;min-width:0}
/* 第 60 轮 · 需求 5：镜像 rail 方案退役，改纯 sticky。
   原「把源表 .whr-c-name 列缩成 0 宽」的规则已删除 —— 否则 sticky 无从谈起。
   ⚠ 该列不再需要 max-width 截断：sticky 冻结列过窄会把产品名挤成省略号。 */
.whr-tbl .whr-c-name{background:#fff;white-space:nowrap}
.whr-tbl tbody tr:hover td{background:#f8fafc}
.whr-tbl tbody tr:hover td.whr-c-name{background:#f1f5f9}
.strat-l1{font-weight:600;font-size:12px;color:#475569}
.strat-l2{font-size:11px;color:#64748b;margin-top:2px}
.wr-idx-sel{font-size:11.5px;padding:1px 4px;border:1px solid #cbd5e1;border-radius:3px;background:#fafbfc;cursor:pointer;max-width:140px}
.wr-idx-sel:focus{border-color:#3b82f6;outline:none;background:#fff}
/* 第 49 轮 · 需求 2：换基准指数后正在向后端取数时的过渡态 */
.wr-idx-sel[data-loading="1"]{opacity:.55}
.wr-idx-loading{opacity:.45;font-style:italic}
.wr-idx-loading::after{content:'…';font-style:normal}
.whr-section-hd{background:#f1f5f9;font-weight:600;font-size:12px;color:#475569;padding:6px 10px;border-top:1px solid #cbd5e1;border-bottom:1px solid #e2e8f0}
.wr-up{color:#dc2626}
.wr-dn{color:#15803d}
.wr-tbl .num{font-variant-numeric:tabular-nums}



/* ============================================================
   第 51 轮 · 个股持仓（主观多头产品：睿亿医药大健康2号）
   ============================================================ */
.stk-summary{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:8px 0 10px}
.stk-toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:4px 0 12px}
.stk-search{padding:6px 10px;border:1px solid #d9dee6;border-radius:6px;font-size:13px;min-width:180px}
.stk-card{border:1px solid #e5e9f0;border-radius:8px;padding:10px 12px;margin-bottom:8px;background:#fff}
.stk-card[data-status="holding"]{border-left:3px solid #16a34a}
.stk-card[data-status="closed"]{border-left:3px solid #cbd5e1;background:#fafbfc}
.stk-head{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.stk-name{font-weight:700;font-size:14px}
.stk-code{font-family:ui-monospace,Consolas,monospace;font-size:12px;color:#64748b}
.stk-meta{font-size:12px;color:#64748b}
.stk-toggle{margin-left:auto;font-size:12px;padding:3px 10px}
.stk-rounds{margin-top:8px;display:flex;flex-direction:column;gap:4px}
.stk-round{display:flex;flex-wrap:wrap;gap:10px;align-items:center;font-size:12px;
  padding:5px 8px;background:#f8fafc;border-radius:6px}
.stk-rno{font-weight:600;color:#334155}
.stk-rdate{font-variant-numeric:tabular-nums;color:#475569}
.stk-rtag{padding:1px 7px;border-radius:10px;font-size:11px}
.stk-rtag.on{background:#e6f6ea;color:#15803d}
.stk-rtag.off{background:#f1f5f9;color:#64748b}
.stk-rn{color:#94a3b8}
.stk-rpnl{margin-left:auto;font-variant-numeric:tabular-nums;font-weight:600}
.stk-rpnl.up{color:#dc2626}
.stk-rpnl.down{color:#15803d}
.stk-trades{margin-top:8px}
.stk-tbl{font-size:12px}
.stk-src{color:#94a3b8;font-size:11px}

/* ---- 当日持仓试算 ---- */
.dt-grid{display:grid;grid-template-columns:minmax(360px,1fr) minmax(420px,1.2fr);gap:18px}
@media(max-width:1100px){.dt-grid{grid-template-columns:1fr}}
.dt-actions{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0}
.dt-paste{width:100%;font-family:ui-monospace,Consolas,monospace;font-size:12px;
  border:1px solid #d9dee6;border-radius:6px;padding:8px;margin-bottom:8px}
.dt-summary{margin-top:10px}
.dt-line{font-size:13px;color:#475569}
.dt-total{margin-top:12px;padding:10px 12px;background:#f8fafc;border-radius:8px;
  font-size:13px;display:flex;flex-direction:column;gap:4px}
.dt-net{font-size:15px;color:#0f172a}
.dt-sel,.dt-side{width:100%;padding:5px 6px;border:1px solid #d9dee6;border-radius:5px;font-size:12px}
.dt-qty,.dt-px,.dt-cur{width:100%;padding:5px 6px;border:1px solid #d9dee6;border-radius:5px;font-size:12px;
  font-variant-numeric:tabular-nums}

/* ---- 第 51 轮 · 需求②③：个股持仓历史（分标的选择式 + 双币种） ---- */
.stk-picklist{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 12px}
.stk-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;font-size:12px;
  border:1px solid #e2e8f0;border-radius:14px;background:#fff;cursor:pointer;color:#334155}
.stk-chip:hover{border-color:#94a3b8;background:#f8fafc}
.stk-cost{margin:8px 0 4px;padding:8px 10px;background:#f8fafc;border:1px solid #e8edf4;border-radius:6px}
.stk-cost-h{font-size:12px;color:#475569;margin-bottom:6px}
.stk-ccy{font-size:12px;color:#475569;white-space:nowrap}
.stk-nm{font-weight:600}
.stk-tbl td,.stk-tbl th{white-space:nowrap}

/* ---- 第 51 轮 · 需求③⑤⑥⑦：口径开关 / 三块式 / 试算上下分 ---- */
.stk-bcol{width:52px;text-align:center}
.stk-basis{padding:1px 7px;font-size:11px;line-height:16px;border:1px solid #c7d2e0;border-radius:9px;
  background:#eef2f8;color:#334155;cursor:pointer;font-weight:600;white-space:nowrap}
.stk-basis:hover{background:#dfe7f3;border-color:#94a3b8}
.stk-basis[data-basis="current"]{background:#fff5e6;border-color:#e8c98a;color:#8a5a00}
.stk-hv-tbl tfoot td{padding-top:6px;border-top:2px solid #dde3ec}
.dt-actions{display:flex;gap:8px;flex-wrap:wrap;margin:8px 0}
.dt-total{margin:8px 0 14px;display:flex;gap:18px;flex-wrap:wrap;align-items:center;
  padding:6px 10px;background:#f8fafc;border:1px solid #e8edf4;border-radius:6px;font-size:13px}
.dt-total .dt-net{font-size:14px}
#dt-act-dt-summary{display:block}

/* ---- 第 51 轮 · 需求②：当日叠加口径提示条 / 持仓变动标 ---- */
.stk-live{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:6px 0 10px;
  padding:7px 10px;background:#fffbef;border:1px solid #f0e2bf;border-radius:6px;font-size:12px}
.stk-dq{display:inline-block;margin-left:6px;padding:0 5px;border-radius:8px;font-size:11px;
  background:#fff1f0;color:#b42318;font-weight:600}


/* ============================================================
   第 54 轮 · 投资人管理（列表 + 资产全景抽屉）
   ============================================================ */
/* 持有人信息：两行四列自适应网格 */
.inv-info-grid{
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px 18px;
}
.inv-info-grid > div{
  display:flex;flex-direction:column;gap:2px;min-width:0;
  padding:7px 10px;background:#f8fafc;border-radius:8px;
}
.inv-info-grid > div > span{font-size:11px;color:var(--muted)}
.inv-info-grid > div > b{
  font-size:13px;font-weight:600;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
/* 策略占比：名称 + 横条 + 数值 */
.inv-strat-row{
  display:flex;align-items:center;gap:10px;padding:5px 0;font-size:13px;
}
.inv-strat-row + .inv-strat-row{border-top:1px dashed #eef1f6}
.inv-strat-name{flex:0 0 130px;font-weight:600;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.inv-strat-bar{
  flex:1;height:9px;background:#eef2f7;border-radius:6px;overflow:hidden;min-width:60px;
}
.inv-strat-bar > i{
  display:block;height:100%;border-radius:6px;
  background:linear-gradient(90deg,#4d7fd6,#2b5cad);
}
.inv-strat-val{flex:0 0 220px;text-align:right;font-variant-numeric:tabular-nums}
.inv-strat-val small{font-size:11px}
/* 投资人列表：整行可点 */
#inv-tbl tbody tr{cursor:pointer}
/* 全景抽屉内的表格：表头不吸顶，避免与抽屉滚动打架 */
#drawer-body .table-wrap{max-height:none}
#drawer-body .table-wrap table th{position:static}
@media (max-width:1100px){
  .inv-info-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .inv-strat-val{flex:0 0 150px}
}

/* 第 54 轮 · 修正：投资人页面 KPI（金额带「万」且值较长）与徽标挤行问题 */
/* 抽屉内 4 列 KPI 在 560px 宽下会换行 ⇒ 值不换行 + 自适应字号 */
#drawer-body .kpi-grid .kpi{padding:14px 14px;gap:4px}
#drawer-body .kpi .k-label{font-size:12px}
#drawer-body .kpi .k-value{font-size:20px;white-space:nowrap}
#drawer-body .kpi .k-value span{font-size:12px}
#drawer-body .kpi .k-sub{font-size:11px;line-height:1.5}
/* 投资人列表：名称列与徽标不挤在一起 */
#inv-tbl td:first-child{max-width:340px;white-space:normal}
#inv-tbl td:first-child .pill{margin-left:6px;vertical-align:1px}

/* ============================================================
   第 54 轮 · 持仓明细卡片（替代 12 列宽表，适配 436px 抽屉宽）
   ============================================================ */
.ivh-card{
  border:1px solid var(--border);border-radius:10px;padding:10px 12px;
  margin-bottom:9px;background:#fff;transition:box-shadow .15s;
}
.ivh-card:hover{box-shadow:0 4px 14px rgba(30,58,107,.09)}
.ivh-card:last-of-type{margin-bottom:0}
.ivh-head{
  display:flex;align-items:center;gap:7px;
  padding-bottom:7px;margin-bottom:8px;border-bottom:1px dashed #eef1f6;
}
.ivh-head > b{font-size:13.5px;font-weight:700;color:var(--text);
  flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ivh-head .pill{flex:none}
.ivh-mv{margin-left:auto;font-size:15px;font-weight:800;
  color:var(--text);font-variant-numeric:tabular-nums;white-space:nowrap}
.ivh-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 10px}
.ivh-cell{display:flex;flex-direction:column;gap:1px;min-width:0}
.ivh-lb{font-size:11px;color:var(--muted);white-space:nowrap}
.ivh-vl{font-size:13px;font-weight:600;color:var(--text);
  font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ivh-vl.up{color:var(--up)}
.ivh-vl.down{color:var(--down)}
.ivh-foot{
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  margin-top:8px;padding-top:7px;border-top:1px dashed #eef1f6;
}
.ivh-methods{display:flex;gap:4px;flex-wrap:wrap}
.ivh-methods .pill{font-size:11px;padding:2px 8px}
/* 合计条 */
.ivh-sum{
  display:flex;flex-wrap:wrap;gap:6px 16px;align-items:center;
  margin-top:11px;padding:9px 12px;background:#f8fafc;border-radius:9px;
  font-size:12px;color:var(--text-2);
}
.ivh-sum b{color:var(--text);font-variant-numeric:tabular-nums}
.ivh-sum b.up{color:var(--up)}
.ivh-sum b.down{color:var(--down)}

/* ============================================================
   第 54 轮补丁 B · 投资人列表：首列冻结 + 零市值沉底 + 可排序表头
   ============================================================ */
/* 冻结列容器必须能横向滚动（技能 table-sticky-column-freeze 前提） */
/* 第 54 轮 · 第二批需求 2：第一列（投资人名称）+ 第二列（类型）冻结。
   ⚠ 冻结要有意义，必须让表格**宽于容器**才会横向滚动。踩到的坑：
   ① 11 列被 `table{width:100%}` 按比例拉伸，列总宽恒等于容器宽（1356px）
      ⇒ scrollWidth == clientWidth，sticky 完全无用武之地；
   ② 只写 min-width 不够（1280 < 1356 仍不滚）。
   解法：`width:max-content` 让列按**内容宽度**自然展开 + `min-width` 兜底保证
   一定超出容器 ⇒ 必然横向滚动、冻结列才真正生效。
   ⚠ `left` 偏移由 JS 按实际渲染宽度累计算出（不能硬编码）。 */
#inv-wrap{overflow-x:auto}
/* ⚠ 第 124 轮：min-width 原为 1520（对应 11 列）。加到 12 列后 max-content 已 >1520，
   但**硬编码的 1520 会继续把各列按比例撑开**，导致新增的「整体 XIRR」列被推到
   可视区之外（实测左边界 1106、容器宽 1166）。改成 1160：
   只要 max-content 仍大于容器就照样横向滚动、冻结列照常生效；窄屏同理。 */
#inv-wrap > .inv-tbl{width:max-content;min-width:1160px;table-layout:auto}
/* 第 124 轮：新增「整体 XIRR」列后，把最容易撑爆的第一列收住 ——
   产品型投资人名（「勤律恩舍星月1号私募证券投资基金」）单名就占 394px，
   导致新增列永远落在可视区之外。截断 + title 悬浮看全名（抽屉里也有全名）。 */
.inv-tbl td.inv-fz:first-child .inv-name{
  display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;vertical-align:bottom;
}
.inv-tbl th, .inv-tbl td{white-space:nowrap}
.inv-tbl th.inv-fz, .inv-tbl td.inv-fz{position:sticky;z-index:3;background:#fff}
.inv-tbl thead th.inv-fz{z-index:8;background:#f8fafc}
.inv-tbl th.inv-fz:last-of-type, .inv-tbl td.inv-fz:last-of-type{
  box-shadow:2px 0 5px -2px rgba(30,58,107,.18);
}
.inv-tbl th.inv-fz,
.inv-tbl td.inv-fz{
  position:sticky;
  z-index:3;
  background:#fff;
  /* left 由 JS 按实际渲染宽度计算后内联写入，此处只给视觉边界 */
}
.inv-tbl thead th.inv-fz{ z-index:8; background:#f8fafc; }
/* 冻结列右侧分隔阴影（用 box-shadow 而非 border，避免列宽抖动） */
.inv-tbl th.inv-fz:last-of-type,
.inv-tbl td.inv-fz:last-of-type{
  box-shadow: 2px 0 5px -2px rgba(30,58,107,.18);
}
/* 冻结列必须复刻行状态背景，否则滚动时透底 */
.inv-tbl tbody tr:hover td.inv-fz{ background:#fafbfe; }
.inv-tbl tbody tr.inv-zero-row td.inv-fz{ background:#fcfcfd; }
.inv-tbl tbody tr.inv-zero-row td{ background:#fcfcfd; color:var(--text-2); }
.inv-tbl tbody tr.inv-zero-row:hover td{ background:#f6f7fa; }
/* 可排序表头 */
.inv-tbl thead th[data-sort]{ cursor:pointer; user-select:none; }
.inv-tbl thead th[data-sort]:hover{ color:var(--primary); background:#eef4ff; }


/* ===== 第 54 轮 · 第二批需求 5：子基金占比饼图 + 产品要素表 ===== */
.prod-sub-wrap{display:flex;gap:18px;align-items:stretch;flex-wrap:wrap}
.prod-sub-pie{position:relative;flex:1 1 340px;min-width:300px;height:290px}
.prod-sub-pie canvas{width:100%!important;height:100%!important}
.prod-sub-empty{
  position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  color:var(--text-2);font-size:13px;background:#fbfcfe;border:1px dashed var(--border);
  border-radius:8px;text-align:center;padding:0 18px;line-height:1.7;
}
/* ⚠ 第 67 轮：flex 子项必须 min-width:0 才能被压缩，
   否则内容（长标签+长文案）会把面板顶宽，右侧文字溢出容器。 */
.prod-sub-side{flex:0 1 400px;min-width:0;display:flex;flex-direction:column;overflow:hidden}
.prod-sub-side-hd{
  display:flex;align-items:center;justify-content:space-between;
  padding-bottom:6px;margin-bottom:8px;border-bottom:1px solid var(--border);
  font-weight:600;font-size:13px;color:var(--text-1);
}
/* ⚠ 第 67 轮：必须 table-layout:fixed——否则表格按内容自适应，
   `.fs-k` 的 104px 形同虚设，整表会宽出面板导致右侧文字被裁。 */
.fs-tbl{width:100%;table-layout:fixed;border-collapse:collapse;font-size:12.5px}
.fs-tbl tr{border-bottom:1px solid #f1f3f7}
.fs-tbl tr:last-child{border-bottom:0}
.fs-k{
  width:104px;padding:6px 8px 6px 0;color:var(--text-2);
  vertical-align:top;
  /* ⚠ nowrap 会让长标签（如「业绩报酬的计提时点」）撑宽整表 ⇒ 允许换行 */
  white-space:normal;word-break:break-word;line-height:1.5;
}
.fs-v{
  padding:6px 0;color:var(--text-1);line-height:1.6;
  /* 长串（英文名/代码/长句）必须能断，否则单行撑破容器 */
  word-break:break-word;overflow-wrap:anywhere;min-width:0;
}
.fs-empty{color:#c2c8d2}
.fs-input{
  width:100%;padding:4px 7px;border:1px solid var(--border);border-radius:5px;
  font-size:12.5px;font-family:inherit;color:var(--text-1);background:#fff;
}
.fs-input:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 2px #2563eb1a}
.fs-actions{display:flex;align-items:center;gap:8px;margin-top:10px}

/* ============================================================
   第 58 轮 · 用户与权限大改造
   ------------------------------------------------------------
   脱敏角色（外部渠道方 / 公司市场人员 / 投资人账号）：
   隐藏所有规模、投资金额参数列。
   ============================================================ */
body.role-masked .mask-num { display: none !important; }
body.role-masked [data-masked-col] { display: none !important; }
/* 角色徽章在深色表格里的可读性 */
.role-badge { display: inline-block; line-height: 1.6; }


/* ============================================================
   第 60 轮 · 需求 5：周度回顾「固定窗格」—— 纯 CSS sticky 冻结列
   （技能 table-sticky-column-freeze 的六条硬约束逐条落实）
     · left 由 JS 按实际渲染宽度算 → 内联；CSS 只管 sticky 与层级
     · 冻结格自带**不透明背景**；行状态（hover / 无持仓行）逐条复刻
     · 右边界用 box-shadow（border-collapse:collapse 下 border 会被吃掉）
   ============================================================ */
/* ---- 持仓周度回顾（.whr-tbl）---- */
.whr-tbl.cols-freeze th.fz,
.whr-tbl.cols-freeze td.fz{position:sticky;z-index:6;background:#fff}
/* 表头冻结格必须压在表体冻结格之上 */
.whr-tbl.cols-freeze thead th.fz{background:#eef2ff;z-index:7}
/* 右边界 */
.whr-tbl.cols-freeze th.fz-last,
.whr-tbl.cols-freeze td.fz-last{box-shadow:2px 0 4px rgba(0,0,0,.10)}
/* ★ 冻结格有了背景就会盖住写在 tr 上的背景 ⇒ 逐条复刻行状态 */
.whr-tbl.cols-freeze tbody tr:hover td.fz{background:#f8fafc}
.whr-tbl.cols-freeze tbody tr.pc-noval td.fz{background:#fff}

/* ---- 周度回顾弹窗（.wr-tbl，前 3 列）---- */
.wr-tbl.cols-freeze th.fz,
.wr-tbl.cols-freeze td.fz{position:sticky;z-index:6;background:#fff}
.wr-tbl.cols-freeze thead th.fz{background:#eef2ff;z-index:7}
.wr-tbl.cols-freeze th.fz-last,
.wr-tbl.cols-freeze td.fz-last{box-shadow:2px 0 4px rgba(0,0,0,.10)}
.wr-tbl.cols-freeze tbody tr:hover td.fz{background:#f8fafc}
.wr-tbl.cols-freeze tbody tr.pc-noval td.fz{background:#fff}


/* 第 61 轮 · 需求 2：子基金明细「估值日净值 / 持仓盈亏」着色
   红 = 高于成本净值（涨）、绿 = 低于成本净值（跌）、持平 = 默认色（不加类） */
.pnl-up{color:#dc2626}
.pnl-dn{color:#15803d}


/* 第 64 轮 · 需求 2：子基金抽屉「回撤」小标题 */
.dd-head{display:flex;align-items:baseline;gap:8px;margin:0 0 2px}
.dd-head .dd-title{font-size:12.5px;font-weight:600;color:var(--text-2)}
.dd-head .sub{font-size:11.5px;color:var(--muted)}


/* 第 64 轮 · 需求 1：导出条上的频率选择器 */
.de-freq{display:inline-flex;align-items:center;gap:5px}
.de-sel{width:auto;height:26px;padding:0 4px;font-size:12px;line-height:24px}

/* ============================================================
   第 71 轮 · 一页通弹窗（编辑要素 + 导出）
   ------------------------------------------------------------
   用户要求：「一页通改为按键弹窗，在弹窗内编辑要素信息、导出等功能，
   并且调整输入框，让框尽量大一点可以展示所有已输入的内容」。
   排版：左列表单（可滚动）+ 右侧导出设置，宽屏两栏、窄屏单栏。
   ============================================================ */
.op-grid{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(0,1fr);gap:18px;align-items:start}
@media (max-width:900px){.op-grid{grid-template-columns:minmax(0,1fr)}}

.op-col-form{min-width:0}
.op-col-side{min-width:0;background:#fbfaf8;border:1px solid #eee7de;border-radius:10px;padding:12px 14px}
.op-sec{font-size:12px;font-weight:600;color:#987C64;letter-spacing:.3px;margin:0 0 10px;
        padding-bottom:6px;border-bottom:1px solid #e8dfd4}
.op-fields{max-height:52vh;overflow-y:auto;padding-right:4px}
.op-field{margin-bottom:12px}
.op-label{display:block;font-size:12px;color:#6e5947;margin-bottom:5px;font-weight:500}

/* 输入框「尽量大」：textarea 可拖拽调高 + 自动撑高（JS），最小 62px */
/* ⚠ 显式声明换行：不依赖浏览器默认，避免个别环境下 textarea 不 wrap */
.fs-ta{min-height:84px;resize:vertical;line-height:1.65;font-size:13px;
       white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;
       width:100%;padding:8px 10px;border:1px solid var(--border);border-radius:6px;
       font-family:inherit;color:var(--text-1);background:#fff;box-sizing:border-box}
.fs-ta:focus{outline:none;border-color:#987C64;box-shadow:0 0 0 2px rgba(152,124,100,.15)}
.op-col-form .fs-input{width:100%;padding:8px 10px;font-size:13px}

.op-tip{margin-top:8px;padding:8px 10px;background:#f6f1ea;border-radius:6px;
        color:#8a7358;font-size:12px;line-height:1.6}
.op-actions{margin-top:14px;padding-top:12px;border-top:1px solid var(--border);
            display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.modal-wide{max-width:1080px;width:94vw}
.modal.modal-wide.modal-xwide{width:min(1360px,95vw);max-width:1360px}

/* ---- 第 71 轮 · 市场策略回顾表格 ---- */
.sr-tbl{font-size:12.5px}
.sr-tbl th{font-weight:600;font-size:12px;white-space:nowrap}
.sr-tbl td,.sr-tbl th{padding:7px 8px;vertical-align:middle}
.sr-tag{font-weight:600;color:#3a332d;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sr-n{text-align:center;color:#8a8078}
.sr-band{font-family:var(--font-mono,monospace);font-size:11.5px;color:#6e5947;
         white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sr-up{color:#A32D2D;font-weight:600}
.sr-down{color:#3B6D11;font-weight:600}
.sr-flag{display:inline-block;padding:1px 7px;border-radius:10px;background:#FAEEDA;
         color:#854F0B;font-size:11.5px;cursor:help;white-space:nowrap}

/* ---- 第 71 轮 · 业绩归因 tab ---- */
.attr-hd{display:flex;flex-direction:column;gap:3px;margin-bottom:10px}
.attr-warn{background:#FAEEDA;border:1px solid #EFD9AE;border-radius:8px;
           padding:9px 12px;color:#854F0B;font-size:12.5px;line-height:1.65;margin-bottom:12px}
.attr-sums{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
.attr-card{background:var(--color-background-secondary,#fbfaf8);border-radius:8px;
           padding:10px 12px;display:flex;flex-direction:column;gap:4px}
.attr-card span{font-size:12px;color:#8a8078}
.attr-card b{font-size:19px;font-weight:600}
.attr-agg{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
          gap:14px;margin-top:12px}
.attr-chip{display:inline-block;margin:4px 6px 0 0;padding:3px 9px;border-radius:12px;
           background:#f6f1ea;color:#6e5947;font-size:12px}
.attr-chip b{font-weight:600;margin-right:4px}

/* ---- 第 76 轮 · 策略市场回顾「判定说明」折叠块 ---- */
.sr-help{margin:2px 0 10px;border:1px solid #e8dfd4;border-radius:8px;background:#fbfaf8}
.sr-help summary{padding:8px 12px;cursor:pointer;font-size:12.5px;font-weight:600;color:#6e5947;
                 list-style:none}
.sr-help summary::-webkit-details-marker{display:none}
.sr-help summary::before{content:"▸ ";color:#987C64}
.sr-help[open] summary::before{content:"▾ "}
.sr-help-body{padding:0 14px 12px 14px;font-size:12.5px;line-height:1.75;color:#5a5148}
.sr-help-body p{margin:6px 0}
.sr-help-body ul{margin:4px 0 8px 18px;padding:0}
.sr-help-body li{margin:2px 0}
.sr-help-body code{background:#f1ece5;padding:1px 5px;border-radius:4px;font-size:12px}

/* ---- 第 78 轮 · 衍生品归因 ---- */
.dv-toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:2px 0 4px}
.dv-filter{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:#6e5947}
.dv-filter select{padding:3px 8px;border:1px solid #e0d6c9;border-radius:6px;
                  background:#fff;font-size:12.5px;color:#4a4139}
.dv-note{margin-top:10px;padding:8px 12px;border-radius:8px;background:#fbf8f4;
         border:1px solid #eee5d9;font-size:12px;line-height:1.7;color:#6e5947}
.dv-buckets{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));
            gap:10px;margin-top:12px}
.dv-bucket{background:#fbfaf8;border-radius:8px;padding:9px 12px}
.dv-bk-hd{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:12.5px}
.dv-bk-hd b{color:#3a332d}
.dv-bar{height:5px;border-radius:3px;background:#efe8df;margin:7px 0 5px;overflow:hidden}
.dv-bar i{display:block;height:100%;border-radius:3px}
.dv-bar i.up{background:#A32D2D}
.dv-bar i.down{background:#3B6D11}
.dv-bk-ft{font-size:11px;color:#8a8078}
.dv-closed{display:inline-block;margin-left:4px;padding:0 4px;border-radius:8px;
           background:#efe8df;color:#8a8078;font-size:10.5px}
.dv-q-ok{color:#3B6D11}.dv-q-warn{color:#854F0B}
.dv-q-bad{color:#A32D2D}.dv-q-hint{color:#8a8078}
.dv-tbl td{padding:5px 8px}

/* --- 第 84 轮 · 横向对比：可选配色 --- */
.cmp-dot{cursor:pointer;box-shadow:0 0 0 2px #fff, 0 0 0 3px rgba(20,30,60,.10);transition:transform .12s}
.cmp-dot:hover{transform:scale(1.3)}
.cmp-palette{
  position:fixed;z-index:10050;width:236px;padding:10px 11px;background:#fff;
  border:1px solid var(--border);border-radius:10px;box-shadow:0 12px 32px rgba(20,30,60,.20);
}
.cmp-palette .cp-hd{
  font-size:11.5px;color:var(--muted);margin-bottom:8px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.cp-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;justify-items:center}
.cp-sw{
  width:26px;height:26px;border-radius:50%;cursor:pointer;border:2px solid #fff;
  box-shadow:0 0 0 1px rgba(20,30,60,.14);transition:transform .12s;
}
.cp-sw:hover{transform:scale(1.12)}
.cp-sw.on{box-shadow:0 0 0 2px #1d4ed8}
.cp-ft{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  margin-top:10px;padding-top:8px;border-top:1px solid #f0f2f6;
}
.cp-custom{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2);cursor:pointer}
.cp-custom input{width:26px;height:22px;padding:0;border:none;background:none;cursor:pointer}
.cp-auto{font-size:12px;color:var(--primary);background:none;border:none;cursor:pointer;padding:0}
.cp-auto:hover{text-decoration:underline}

/* --- 第 84 轮 · 横向对比：按策略批量筛选 --- */
.cmp-filter{margin-top:10px;border:1px solid var(--border);border-radius:10px;background:#fbfcfe}
.cmp-filter>summary{
  cursor:pointer;padding:8px 12px;font-size:13px;font-weight:600;color:var(--text-2);
  list-style:none;display:flex;align-items:center;gap:6px;
}
.cmp-filter>summary::-webkit-details-marker{display:none}
.cmp-filter>summary::before{content:"▸";display:inline-block;transition:transform .15s}
.cmp-filter[open]>summary::before{transform:rotate(90deg)}
.cmp-f-body{padding:0 12px 10px}
.cmp-f-row{display:flex;gap:8px;padding:6px 0;border-top:1px dashed #eef1f6}
.cmp-f-row:first-child{border-top:none}
.cmp-f-row[hidden]{display:none}
.cmp-f-lb{flex:0 0 58px;font-size:12px;color:var(--muted);padding-top:5px}
.cmp-f-hits{flex:1;min-width:0}
.cmp-f-hitbar{display:flex;align-items:center;gap:8px;margin-bottom:6px;flex-wrap:wrap}
.cmp-hitlist{display:flex;flex-wrap:wrap;gap:6px;max-height:108px;overflow-y:auto}
.cmp-hitlist .hit{
  font-size:12px;padding:3px 9px;border:1px solid var(--border);border-radius:14px;
  background:#fff;color:var(--text-2);cursor:pointer;white-space:nowrap;
}
.cmp-hitlist .hit i{font-style:normal;font-size:10.5px;color:var(--muted);margin-left:4px}
.cmp-hitlist .hit:hover{border-color:var(--primary-2);color:var(--primary-2)}
.cmp-hitlist .hit.on{background:#eef4ff;border-color:var(--primary);color:var(--primary);font-weight:600}

/* ---- 第 85 轮 · 横向对比：表头穿模 ----
   ⚠ 根因是全局 `th{position:sticky;top:0}`：在弹窗里它钉的是 **.modal-body 滚动区顶部**，
   而 ② 指标对比 / ③ 区间收益 / ④ 相关性 三张表共用同一个滚动容器 ⇒
   表头被钉在半空中，压住自己（甚至上一张表）的数据行，行被切成两半。
   这几张表本来就不需要冻结表头，直接退回静态定位。 */
#cmp-metrics table th,
#cmp-periods table th,
#cmp-corr table th { position: static; }

/* 同一处病灶：8 个对象时 ③/④ 的列宽能到 1350px，而弹窗正文只有 ~936px，
   `.modal-body` 又没有横向滚动 ⇒ 表格直接戳出弹窗、被屏幕右边缘截断。
   给这三块各自加横向滚动，宽表在容器内部滑，不再破版。 */
#cmp-metrics,
#cmp-periods,
#cmp-corr { overflow-x: auto; }
#cmp-metrics table,
#cmp-periods table,
#cmp-corr table { min-width: max-content; }

/* ---- 第 86 轮 · 横向对比：显式调色盘 ---- */
.cmp-cp{
  margin:0 0 10px;padding:10px 12px;border:1px solid var(--border);
  border-radius:10px;background:#fbfcfe;
}
.cmp-cp[hidden]{display:none}
.cmp-cp-hd{display:flex;align-items:center;gap:10px;margin-bottom:6px;font-size:13px;color:var(--text-2)}
.cmp-cp-hd .btn-xs{margin-left:auto;flex:0 0 auto}
.cmp-cp-row{display:flex;align-items:center;gap:10px;padding:4px 0;border-top:1px dashed #eef1f6}
.cmp-cp-row:first-child{border-top:none}
.cmp-cp-nm{
  flex:0 0 236px;min-width:0;display:flex;align-items:center;gap:6px;
  font-size:12.5px;color:var(--text);
}
.cmp-cp-nm .cmp-line{display:inline-block;flex:0 0 22px;width:22px;height:8px}
.cmp-cp-nm .cmp-cp-t{
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;
}
.cmp-cp-nm em{font-style:normal;font-size:10.5px;color:var(--muted);flex:0 0 auto}
.cmp-cp-sws{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.cpsw{
  width:20px;height:20px;border-radius:50%;cursor:pointer;border:2px solid #fff;
  box-shadow:0 0 0 1px rgba(20,30,60,.14);transition:transform .12s;
}
.cpsw:hover{transform:scale(1.15)}
.cpsw.on{box-shadow:0 0 0 2px #1d4ed8}
.cmp-cp-cust{display:inline-flex;align-items:center;cursor:pointer;margin-left:2px}
.cmp-cp-cust input{width:26px;height:22px;padding:0;border:none;background:none;cursor:pointer}

/* ---- 第 88 轮 · 用户管理：口令查看 ---- */
.pw-val{
  display:inline-block;margin-left:6px;padding:1px 6px;border-radius:5px;
  background:#f1f5f9;color:#0f172a;font-size:12px;letter-spacing:.5px;
}

/* ================= 第 91 轮 · 日程 / 待办 ================= */
.sched-page{display:flex;flex-direction:column;gap:14px}
.sched-kpi{display:grid;grid-template-columns:repeat(3,minmax(96px,140px)) 1fr;gap:10px}
.sched-kpi-item{
  background:#fff;border:1px solid var(--border);border-radius:12px;padding:10px 14px;
  display:flex;flex-direction:column;gap:2px;cursor:pointer;transition:.15s;
}
.sched-kpi-item:hover{border-color:var(--primary);box-shadow:0 2px 10px rgba(30,58,107,.08)}
.sched-kpi-item span{font-size:12px;color:var(--muted)}
.sched-kpi-item b{font-size:22px;line-height:1.1;color:var(--text)}
.sched-kpi-item.warn{border-color:#f3c2c2;background:#fff8f8}
.sched-kpi-item.warn b{color:#c92a2a}
.sched-kpi-next{
  background:#fff;border:1px solid var(--border);border-radius:12px;padding:10px 14px;
  display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-2);min-width:0;
}
.sched-kpi-next b{color:var(--text)}
.sched-grid{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:14px;align-items:start}
.sched-cal-card,.sched-list-card{padding:12px 14px}
.sched-cal-hd{display:flex;align-items:center;gap:6px;margin-bottom:10px}
.sched-cal-hd b{font-size:15px;min-width:104px;text-align:center}
.sched-cal{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}
.sched-wd{text-align:center;font-size:11.5px;color:var(--muted);padding:2px 0 4px}
.sched-cell{
  min-height:44px;border-radius:8px;border:1px solid transparent;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;justify-content:flex-start;
  padding:4px 2px;gap:2px;transition:.12s;
}
.sched-cell:hover{background:#f2f6ff;border-color:#dbe6ff}
.sched-cell.other{opacity:.35}
.sched-cell.today{border-color:var(--primary);background:#eef4ff}
.sched-cell.sel{border-color:var(--primary);background:var(--primary);color:#fff}
.sched-cell.sel .sc-dn{color:#fff}
.sched-cell.alldone .sc-dn{color:#8a9a8f}
.sc-dn{font-size:13px;font-weight:600;line-height:1.2}
.sc-dots{display:flex;gap:2px;flex-wrap:wrap;justify-content:center;min-height:6px}
.sc-dots .dot,.sched-legend .dot{width:5px;height:5px;border-radius:50%;display:inline-block}
.dot.p1{background:#dc2626}.dot.p2{background:#2f6fed}.dot.p3{background:#94a3b8}
.dot.done{background:#cbd5e1}
.sched-legend{display:flex;gap:12px;font-size:11.5px;color:var(--muted);margin-top:10px;padding-top:8px;border-top:1px solid var(--line)}
.sched-legend span{display:inline-flex;align-items:center;gap:4px}
.sched-list-hd{display:flex;align-items:baseline;gap:8px;margin-bottom:8px}
.sched-list-hd b{font-size:15px}
#sch-list{display:flex;flex-direction:column;gap:8px}
.sc-item{
  display:flex;align-items:flex-start;gap:10px;padding:9px 10px 9px 12px;
  border:1px solid var(--border);border-left:3px solid #2f6fed;border-radius:9px;background:#fff;
}
.sc-item.p1{border-left-color:#dc2626}
.sc-item.p2{border-left-color:#2f6fed}
.sc-item.p3{border-left-color:#94a3b8}
.sc-item.done{opacity:.55;background:#fafbfc}
.sc-item.done .sc-title{text-decoration:line-through}
.sc-check{
  flex:0 0 18px;width:18px;height:18px;border:1.5px solid #c3cad6;border-radius:50%;
  display:flex;align-items:center;justify-content:center;font-size:11px;color:#fff;
  cursor:pointer;margin-top:1px;background:#fff;
}
.sc-item.done .sc-check{background:#16a34a;border-color:#16a34a}
.sc-body{flex:1;min-width:0}
.sc-title{font-size:13.5px;color:var(--text);line-height:1.4;word-break:break-word}
.sc-meta{font-size:11.5px;color:var(--muted);margin-top:2px;word-break:break-word}
.sc-tag{
  display:inline-block;margin-left:6px;padding:0 5px;border-radius:4px;
  background:#eef1f6;color:#5b6675;font-size:10.5px;vertical-align:1px;
}
.sc-tag.hi{background:#fdecec;color:#c92a2a}
.sc-ops{flex:0 0 auto;display:flex;gap:6px;font-size:12px}
.sc-ops .btn-link{padding:0}

@media(max-width:900px){
  .sched-kpi{grid-template-columns:repeat(3,1fr)}
  .sched-kpi-next{grid-column:1 / -1}
  .sched-grid{grid-template-columns:1fr}
  .sched-cell{min-height:40px}
}
@media(max-width:480px){
  .sched-cell{min-height:36px;padding:3px 1px}
  .sc-dn{font-size:12px}
  .sched-cal-hd b{min-width:88px;font-size:14px}
  .sched-kpi-item b{font-size:19px}
  .sched-kpi-item span{font-size:11px}
}

/* ---- 第 92 轮 · 产品详情 tab 内宽表横向滚动 ----
   这些表原先直接挂在 #prod-tab-body 下，宽了就顶破卡片、整页横滚。
   ⚠ 不要用 display:block 那条 hack（会把 table 布局搞坏），套一层 div 更稳。 */
.prod-tab-scroll{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch}
.prod-tab-scroll > table{margin:0}
/* 卡片标题行在窄屏下允许换行，避免按钮把页面撑宽 */
@media(max-width:1200px){
  .card-title{flex-wrap:wrap;row-gap:6px}
}

/* ---- 第 97 轮 · 费用页工具栏统一 + 分成比例小标签 ----
   原来「查询」比「重算」矮一截，四个按钮各长各的；统一高度/内边距，
   只保留「重算」为实心主按钮，其余一律描边。 */
.fee-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.fee-toolbar .inp,
.fee-toolbar .btn-outline,
.fee-toolbar .btn-primary{height:var(--ui-h);box-sizing:border-box;line-height:1}
.fee-toolbar .btn-outline,
.fee-toolbar .btn-primary{padding:0 14px;display:inline-flex;align-items:center;
  justify-content:center;font-size:13px}
.fee-toolbar .hint{line-height:var(--ui-h)}
.fee-pct{display:inline-block;margin-left:4px;padding:0 5px;border-radius:4px;
  background:#eef2f7;color:#64748b;font-size:11px;font-weight:600;vertical-align:1px}
/* 第 119 轮：费用分配表底部合计行 */
tr.fee-total td{background:#f4f7fb;border-top:2px solid #d8e2ef;font-weight:600}
tr.fee-total td:first-child{border-radius:0 0 0 8px}
tr.fee-total td:last-child{border-radius:0 0 8px 0}
tr.fee-total .hint{font-weight:400}

/* ================= 第 99 轮 · 日程周视图（飞书式时间轴）================= */
.sched-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.sched-week-card{padding:0;overflow:hidden}
.wk{border-radius:10px;overflow:hidden}
/* ⚠ 表头必须和列内容在**同一个滚动容器**里，否则垂直滚动条占位会让
   表头与下方列宽差 15px，看起来像错位（第 99 轮实测踩到）。
   sticky 让它滚走内容时仍可见。 */
.wk-head{display:grid;grid-template-columns:56px repeat(7,1fr);
  background:#f8fafc;border-bottom:1px solid var(--border);
  position:sticky;top:0;z-index:6}
.wk-hd{padding:7px 4px;text-align:center;line-height:1.2;border-left:1px solid #eef1f6}
.wk-hd span{display:block;font-size:11.5px;color:#64748b}
.wk-hd b{font-size:15px;color:var(--text)}
.wk-hd.today b{color:var(--primary)}
.wk-hd.today{background:#eef4ff}
.wk-allday-row{display:grid;grid-template-columns:56px repeat(7,1fr);
  min-height:26px;border-bottom:1px solid var(--border);background:#fff}
.wk-gutter{display:flex;align-items:center;justify-content:flex-end;
  padding-right:6px;font-size:10.5px;color:var(--muted)}
.wk-allday-col{border-left:1px solid #eef1f6;padding:2px}
.wk-ad-ev{background:#e2e8f0;color:#334155;border-radius:4px;padding:1px 5px;
  font-size:11px;margin-bottom:2px;cursor:pointer;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.wk-ad-ev.p1{background:#fee2e2;color:#991b1b}
.wk-ad-ev.p2{background:#dbeafe;color:#1e40af}
.wk-ad-ev.p3{background:#e2e8f0;color:#334155}
.wk-scroll{max-height:min(60vh,560px);overflow-y:auto;overflow-x:hidden}
.wk-body{display:grid;grid-template-columns:56px repeat(7,1fr);position:relative}
.wk-hours{border-right:1px solid #eef1f6}
.wk-hour{position:relative;border-bottom:1px dashed #f1f5f9}
.wk-hour span{position:absolute;top:-7px;right:6px;font-size:10.5px;color:var(--muted);background:#fff}
.wk-col{position:relative;border-left:1px solid #eef1f6}
.wk-col.today{background:#fbfdff}
.wk-slot{height:48px;border-bottom:1px dashed #f1f5f9;cursor:pointer;transition:.1s}
.wk-slot:hover{background:#f2f7ff}
.wk-ev{position:absolute;left:2px;right:3px;border-radius:5px;padding:2px 5px;
  background:var(--primary);color:#fff;overflow:hidden;cursor:pointer;z-index:2;
  box-shadow:0 1px 2px rgba(16,24,40,.12)}
.wk-ev b{display:block;font-size:11.5px;font-weight:600;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;line-height:1.25}
.wk-ev span{font-size:10px;opacity:.92;display:block;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.wk-ev.p1{background:#dc2626}
.wk-ev.p2{background:#2563eb}
.wk-ev.p3{background:#64748b}
.wk-ev.done{opacity:.55;text-decoration:line-through}
.wk-now{position:absolute;left:0;right:0;height:2px;background:#ef4444;z-index:3;pointer-events:none}
.wk-now::before{content:"";position:absolute;left:-3px;top:-3px;width:8px;height:8px;
  border-radius:50%;background:#ef4444}

/* ---- 紧凑表单 ---- */
.sc-row{display:flex;gap:8px;align-items:flex-end}
.sc-fld{display:flex;flex-direction:column;gap:4px;min-width:0}
.sc-fld label{font-size:12px;color:var(--text-2);font-weight:500}
.sc-chk{display:inline-flex;align-items:center;gap:5px;font-size:13px;
  font-weight:400;cursor:pointer;margin:0}
.sc-chk input{width:14px;height:14px;flex:0 0 14px;margin:0}
.sc-att{display:grid;grid-template-columns:repeat(auto-fill,minmax(112px,1fr));
  gap:4px 8px;max-height:92px;overflow-y:auto;padding:6px 8px;
  border:1px solid var(--border);border-radius:8px;background:#fcfdff}
.sc-att-item{display:flex;align-items:center;gap:5px;font-size:12.5px;
  cursor:pointer;padding:2px 0;min-width:0}
.sc-att-item input{width:14px;height:14px;flex:0 0 14px;margin:0}
.sc-att-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sc-att-item.me span{color:var(--primary);font-weight:600}

/* 第 100 轮 · 周视图固定 08:00–18:00；8 点前有日程时表头显示角标 */
.wk-hd{position:relative}
.wk-out{position:absolute;top:3px;right:4px;font-style:normal;font-size:9.5px;
  line-height:13px;min-width:13px;padding:0 3px;border-radius:7px;
  background:#f59e0b;color:#fff;font-weight:600}

/* 第 102 轮 · 裸表格兜底滚动容器（只加横向滚动，不改表格布局） */
.table-scroll-x{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch}
.table-scroll-x > table{margin:0}


/* ============================================================================
   第 122 轮 · 控件统一层（按钮 / 输入框 / 下拉 / 复选 / 表格操作）
   ----------------------------------------------------------------------------
   实测起点：同一页面 16 个按钮 8 种视觉（高 33/35/36/auto、圆角 0/6/8/10、
   字号 11/13/14/18），`.btn-secondary`(24 处) / `.btn-link`(14 处) / `.btn-sm`
   从未定义过，一直走浏览器默认样式。
   本层统一为一套令牌：高度 34 / 小 30 / 特小 26，圆角 8，边框 #dfe4ec。
   ⚠ 只改外观，不改任何 DOM 结构、类名与布局契约（不碰表格定长列、不碰 sticky）。
   ============================================================================ */
:root{
  --ui-h:34px;                  /* 标准控件高度 */
  --ui-h-sm:30px;
  --ui-h-xs:26px;
  --ui-r:8px;                   /* 控件圆角 */
  --ui-r-xs:6px;
  --ui-bd:#dfe4ec;              /* 控件描边 */
  --ui-bd-hover:#c3ccda;
  --ui-bg-soft:#f4f7fb;
  --ui-ring:0 0 0 3px rgba(30,58,107,.12);
  --ui-fast:.15s cubic-bezier(.4,0,.2,1);
}

/* ---------- 1. 统一按钮骨架 ---------- */
.btn,
.btn-primary,
.btn-secondary,
.btn-outline,
.btn-ghost,
.btn-danger{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  height:var(--ui-h);padding:0 14px;border-radius:var(--ui-r);
  border:1px solid transparent;background:transparent;
  font-family:inherit;font-size:13px;font-weight:600;line-height:1;
  white-space:nowrap;text-decoration:none;cursor:pointer;
  transition:background var(--ui-fast),border-color var(--ui-fast),
             color var(--ui-fast),box-shadow var(--ui-fast),
             transform .08s ease,filter var(--ui-fast);
}
.btn:active,
.btn-primary:active,
.btn-secondary:active,
.btn-outline:active,
.btn-ghost:active,
.btn-danger:active{transform:translateY(1px)}

/* 主按钮：深蓝实心 + 极轻投影，hover 提亮、按下回落 */
.btn-primary{
  background:linear-gradient(180deg,#26467f 0%,#1b3560 100%);
  border-color:#1b3560;color:#fff;
  box-shadow:0 1px 2px rgba(16,24,40,.12),inset 0 1px 0 rgba(255,255,255,.08);
}
.btn-primary:hover{background:linear-gradient(180deg,#2d5390 0%,#22406f 100%);
  border-color:#22406f;box-shadow:0 2px 6px rgba(16,24,40,.16)}
.btn-primary:active{background:#1a3358;box-shadow:inset 0 1px 3px rgba(0,0,0,.18)}

/* 次要按钮（24 处原来是无样式状态）：白底描边，中性可点 */
.btn-secondary{
  background:#fff;border-color:var(--ui-bd);color:#3d4a5f;
  box-shadow:0 1px 1px rgba(16,24,40,.03);
}
.btn-secondary:hover{background:var(--ui-bg-soft);border-color:var(--ui-bd-hover);color:var(--primary)}
.btn-secondary:active{background:#e9eef7}

/* 描边按钮：比 secondary 更轻，用于工具条 */
.btn-outline{
  background:#fff;border-color:var(--ui-bd);color:var(--text-2);
  box-shadow:0 1px 1px rgba(16,24,40,.03);
}
.btn-outline:hover{background:#f7faff;border-color:var(--primary);color:var(--primary)}
.btn-outline:active{background:#eef3fb}

/* 幽灵按钮：无描边，hover 才出底 */
.btn-ghost{color:var(--text-2);border-color:transparent;background:transparent}
.btn-ghost:hover{background:var(--ui-bg-soft);color:var(--text)}

/* 危险按钮 */
.btn-danger{background:#fdecec;border-color:#f7d4d4;color:#c92a2a}
.btn-danger:hover{background:#fbdada;border-color:#f2bcbc;color:#a51e1e}

/* 文字链按钮（14 处原来也是无样式）：表格里的「编辑 / 删除 / 查看」 */
.btn-link{
  display:inline-flex;align-items:center;justify-content:center;
  height:24px;padding:0 7px;border-radius:var(--ui-r-xs);
  border:1px solid transparent;background:transparent;
  font-family:inherit;font-size:13px;font-weight:600;line-height:1;
  color:var(--primary);white-space:nowrap;cursor:pointer;text-decoration:none;
  transition:background var(--ui-fast),color var(--ui-fast);
}
.btn-link:hover{background:#eef3fb;color:var(--primary-dark)}
.btn-link:active{background:#e3ebf8}

/* 尺寸档（覆盖上面的默认档，顺序必须在变体之后） */
.btn-xs{height:var(--ui-h-xs);padding:0 9px;border-radius:var(--ui-r-xs);
  font-size:12px;font-weight:600;gap:4px}
.btn-sm{height:var(--ui-h-sm);padding:0 12px;font-size:12px;gap:5px}
.btn-block{width:100%;margin-top:22px;height:44px;font-size:14px}

/* 禁用态：不响应 hover，光标提示不可点 */
.btn:disabled,.btn[aria-disabled="true"],
.btn-primary:disabled,.btn-secondary:disabled,.btn-outline:disabled,
.btn-ghost:disabled,.btn-danger:disabled,.btn-link:disabled{
  opacity:.48;cursor:not-allowed;transform:none;box-shadow:none;filter:none;
}

/* ---------- 2. 统一输入控件 ---------- */
input[type=text],input[type=number],input[type=password],input[type=date],
input[type=search],input[type=email],input[type=tel],input:not([type]),
select,textarea,.inp{
  height:var(--ui-h);padding:0 11px;
  border:1px solid var(--ui-bd);border-radius:var(--ui-r);
  background:#fff;color:var(--text);
  font-family:inherit;font-size:13px;line-height:normal;
  transition:border-color var(--ui-fast),box-shadow var(--ui-fast),background var(--ui-fast);
}
input[type=text]:hover,input[type=number]:hover,input[type=password]:hover,
input[type=date]:hover,input[type=search]:hover,select:hover,textarea:hover,.inp:hover{
  border-color:var(--ui-bd-hover);
}
input[type=text]:focus,input[type=number]:focus,input[type=password]:focus,
input[type=date]:focus,input[type=search]:focus,select:focus,textarea:focus,.inp:focus{
  outline:none;border-color:var(--primary);box-shadow:var(--ui-ring);
}
input[type=text]:disabled,input[type=number]:disabled,input[type=password]:disabled,
input[type=date]:disabled,select:disabled,textarea:disabled,.inp:disabled{
  background:#f5f7fa;color:#8b95a6;border-color:#e6eaf1;cursor:not-allowed;
}
textarea{height:auto;min-height:76px;padding:9px 11px;line-height:1.6;resize:vertical}
.inp-sm{height:var(--ui-h-xs);padding:0 8px;border-radius:var(--ui-r-xs);font-size:12px}
input[readonly]{background:#fafbfd}

/* 下拉：去掉系统箭头，换成统一的细描 chevron（否则 Windows 上是粗黑三角） */
select:not([multiple]){
  -webkit-appearance:none;-moz-appearance:none;appearance:none;
  padding-right:30px;
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%235b6577' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 9px center;background-size:12px;
}
select:not([multiple]):disabled{opacity:.7}

/* 日期控件的小日历图标：默认太黑太抢眼 */
input[type=date]::-webkit-calendar-picker-indicator{
  opacity:.5;cursor:pointer;padding:2px;border-radius:4px;transition:var(--ui-fast);
}
input[type=date]::-webkit-calendar-picker-indicator:hover{opacity:.9;background:#eef2f8}

/* 占位符统一灰度，避免各浏览器深浅不一 */
::placeholder{color:#a6aebb;opacity:1}

/* 复选 / 单选：统一尺寸与主色 */
input[type=checkbox],input[type=radio]{
  width:15px;height:15px;accent-color:var(--primary);
  cursor:pointer;vertical-align:-2px;
}
input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed;opacity:.55}

/* ---------- 3. 键盘可达性（鼠标点击不出现描边，Tab 才出现）---------- */
.btn:focus-visible,.btn-primary:focus-visible,.btn-secondary:focus-visible,
.btn-outline:focus-visible,.btn-ghost:focus-visible,.btn-danger:focus-visible,
.btn-link:focus-visible,.seg-btn:focus-visible{
  outline:2px solid var(--primary);outline-offset:2px;
}

/* ---------- 4. 表格内的操作按钮 ---------- */
td .btn-link{margin-right:2px}
td .btn-link + .btn-link{margin-left:2px}
td .btn-xs,td .btn-sm{vertical-align:middle}
td .btn-xs + .btn-xs{margin-left:4px}
/* 最后一行不再画分隔线，卡片底部干净 */
.table-wrap tbody tr:last-child td{border-bottom:none}

/* ---------- 5. 分段控件（单位/累计、日频/周频…）微调 ---------- */
.seg-btn{transition:background var(--ui-fast),color var(--ui-fast),box-shadow var(--ui-fast)}
.seg-btn:disabled{opacity:.45;cursor:not-allowed}

/* ---------- 6. 分页按钮与工具条里的原生 button ---------- */
.wl-pager button{
  height:26px;min-width:26px;padding:0 8px;border:1px solid var(--ui-bd);
  border-radius:var(--ui-r-xs);background:#fff;color:var(--text-2);
  font-size:12px;font-weight:600;transition:var(--ui-fast);
}
.wl-pager button:hover:not([disabled]){border-color:var(--primary);color:var(--primary);background:#f7faff}
.wl-pager button[disabled]{opacity:.45;cursor:not-allowed}

/* ---------- 7. 弹窗 / 抽屉底部的取消·保存条（按钮不再贴边）---------- */
.modal-foot .btn + .btn,
.modal-actions .btn + .btn,
.drawer-foot .btn + .btn{margin-left:8px}

/* ---------- 8. 尊重「减少动态效果」的系统设置 ---------- */
@media (prefers-reduced-motion:reduce){
  .btn,.btn-primary,.btn-secondary,.btn-outline,.btn-ghost,.btn-danger,.btn-link,
  input,select,textarea,.seg-btn{transition:none}
  .btn:active,.btn-primary:active,.btn-secondary:active,.btn-outline:active,
  .btn-ghost:active,.btn-danger:active{transform:none}
}

/* ---------- 9. 顶栏动作按钮（改密 / 退出 / 通知）：比正文按钮矮一档 ---------- */
.topbar-right .btn-ghost,
.topbar-right .btn-outline,
.topbar-right .btn-secondary{height:var(--ui-h-sm);padding:0 11px;font-size:12.5px;
  border-radius:var(--ui-r-xs)}
.topbar-right .notif-btn{height:var(--ui-h-sm);width:var(--ui-h-sm);padding:0;
  display:inline-flex;align-items:center;justify-content:center;border-radius:var(--ui-r-xs)}

/* ---------- 10. 表单网格里的控件与标签节奏 ---------- */
.form-item label{display:block;font-size:12.5px;font-weight:600;color:var(--text-2);margin-bottom:6px}
.form-item{margin-bottom:2px}
.form-grid{gap:14px 16px}

/* ---------- 11. 抽屉 / 弹窗的底部按钮条 ---------- */
.drawer-actions .btn,
.modal-foot .btn,
.modal-foot .btn-primary,
.modal-foot .btn-secondary,
.modal-foot .btn-outline{min-width:76px}

/* ---------- 12. 表格观感：表头更克制、行距更紧、hover 有过渡 ---------- */
.table-wrap table th,
table.tbl th{
  font-size:12.5px;letter-spacing:.2px;font-weight:600;color:#64748b;
  box-shadow:inset 0 -1px 0 var(--border);
}
table.tbl td{padding:10px 14px}
table.tbl tbody tr{transition:background var(--ui-fast)}
table.tbl tbody tr:hover td{background:#f8faff}
.empty{padding:42px 16px;text-align:center;color:var(--muted);font-size:13px}

/* 数值列统一等宽数字，纵向对齐不跳动（原本只有 .num 加了） */
table.tbl td:has(> .num),
td.num{font-variant-numeric:tabular-nums}

/* ---------- 13. 侧栏导航：选中态加一道左侧高亮，hover 更跟手 ---------- */
.nav-item{position:relative;transition:background var(--ui-fast),color var(--ui-fast)}
.nav-item.active::before{
  content:"";position:absolute;left:-6px;top:50%;transform:translateY(-50%);
  width:3px;height:18px;border-radius:0 3px 3px 0;background:var(--gold);
}
.nav-item:focus-visible{outline:2px solid rgba(255,255,255,.6);outline-offset:-2px}

/* ---------- 14. 全局滚动条（表格外的部分也统一，避免两套粗细） ---------- */
html{scrollbar-width:thin;scrollbar-color:#c7cfdb transparent}
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:#c7cfdb;border-radius:8px;border:3px solid var(--bg)}
::-webkit-scrollbar-thumb:hover{background:#a9b5c6}

/* ---------- 15. 卡片标题层级 ---------- */
.card-title{letter-spacing:.1px}
.card-title .sub{font-weight:400}

/* ---------- 16. 登录页：正文控件统一成 34px 后，登录卡片显得单薄 ----------
   登录页是"独立场景"，输入框与按钮保留大号（44px），只跟随配色与圆角语言。 */
.login-card input{
  height:44px;padding:0 14px;border-radius:10px;font-size:14px;
}
.login-card input:hover{border-color:var(--ui-bd-hover)}
.login-card input:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgba(30,58,107,.15)}
.login-card .btn-primary{
  height:46px;border-radius:10px;font-size:15px;letter-spacing:.5px;
}
.login-card label{font-size:12.5px;font-weight:600;letter-spacing:.2px}

/* ---------- 17. 修正统一层内部的两处冲突 ---------- */
/* ① 顶栏规则(0,2,0) 会把顶栏里的 .btn-xs 拉高到 30px，小按钮失去档位。
      统一层里再声明一次(同特异性、后置优先)把特小档压回 26px。 */
.topbar-right .btn-xs{height:var(--ui-h-xs);padding:0 9px;font-size:12px;border-radius:var(--ui-r-xs)}
.topbar-right .btn-sm{height:var(--ui-h-sm);font-size:12px}

/* ② 分页按钮原来各写各的圆角（实测 7px 与 6px 混杂） */
.wl-pager button,.pg-btns button{border-radius:var(--ui-r-xs)}

/* ③ 搜索框是"容器式"输入（外框带边框，内部 input 无边框）：
      高度统一到 34px，内部 input 撑满，避免出现 32px 的第三种高度。 */
.search-box{height:var(--ui-h);border-radius:var(--ui-r);padding:0 12px;
  transition:border-color var(--ui-fast),box-shadow var(--ui-fast)}
.search-box:focus-within{border-color:var(--primary);box-shadow:var(--ui-ring)}
.search-box input,.search-box input[type=text]{height:100%;padding:0;border:none;
  border-radius:0;box-shadow:none;background:transparent;font-size:13px}
.search-box input:focus{box-shadow:none}

/* ④ 表格末行去分隔线：users / 费用等页面的表格不在 .table-wrap 里，需要一并覆盖 */
table.tbl tbody tr:last-child td{border-bottom:none}

/* ---------- 18. 用户与权限表：长文本列收窄换行，别把「操作」挤出视野 ----------
   实测：1600 宽视口下表格 1546px、容器 1286px ⇒ 溢出 260px，「操作」列在视口外，
   用户得先往右拖才能点编辑/删除。可见板块最多 8 个名字（约 40 字），让它换行即可。 */
#users-tbl th:nth-child(4),#users-tbl td:nth-child(4){
  white-space:normal;word-break:break-word;min-width:128px;max-width:210px;
}
#users-tbl th:nth-child(5),#users-tbl td:nth-child(5){
  white-space:normal;word-break:break-word;min-width:110px;max-width:170px;
}
#users-tbl .col-time{white-space:nowrap;font-variant-numeric:tabular-nums;color:var(--text-2)}
/* 9 列 × 4px = 36px，正好把最后那 15px 溢出吃掉，表格不再需要横向拖动 */
#users-tbl th,#users-tbl td{padding-left:12px;padding-right:12px}
#users-tbl td:last-child{white-space:nowrap}


/* ============================================================
   第 126 轮 · 确认单上传（业绩报酬页）
   ============================================================ */
.cf-drop{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:14px;border:1px dashed var(--border);border-radius:12px;background:#fbfdff;
}
.cf-drop .hint{flex:1 1 260px;min-width:0;font-size:12px;line-height:1.6}
.cf-tbl td{padding:5px 6px;vertical-align:middle}
.cf-tbl .inp{height:30px;padding:3px 6px;font-size:12.5px}
.cf-tbl td.num .inp{text-align:right}
.cf-tbl select.inp{height:30px}
@media (max-width:768px){
  .cf-drop{padding:11px;gap:8px}
  .cf-tbl .inp{height:34px;font-size:13px}
}

/* ============================================================
   第 125 轮 · 移动端适配层（<=768px）
   ------------------------------------------------------------
   背景：手机端打开后「只能看到日程待办」。根因不是布局，而是 showView() 里
   一句 `#menu-toggle.classList.add("hidden")` 把汉堡按钮永久隐藏（.hidden
   是 display:none!important，压过 768 断点）⇒ 侧栏再也打不开。已在 app.js 修掉。

   本层只做三件事：
     ① 让「侧栏 → 所有板块」在手机上打得开、点得动（遮罩 / 锁滚动 / 全高）；
     ② 把卡片、KPI、筛选、工具栏、弹窗、抽屉按 390px 重排，谁都不许撑破视口；
     ③ 宽表一律「容器内横向滚动 + 可读字号」，不再把整页顶宽（整页缩小=字变 6px）。
   原则：**不隐藏任何板块、不删任何筛选项** —— 手机上也要能完成日常操作。
   ============================================================ */

/* 第 125 轮：手机端周视图每列只有 ~44px，标题原先 nowrap 只剩「活…」。
   改成两行截断（≈8 个字），不改变块高与时间位置。 */
@media (max-width:768px){
  .wk-ev{padding:2px 3px}
  .wk-ev b{
    white-space:normal;overflow:hidden;display:-webkit-box;
    -webkit-line-clamp:2;-webkit-box-orient:vertical;
    font-size:9.5px;line-height:1.15;word-break:break-all;
  }
  .wk-ev span{font-size:9px;white-space:normal;line-height:1.1}
  .wk-hd span{font-size:10px}
  .wk-hd b{font-size:13px}
  .wk-hours{width:34px}
}

/* ---- 侧栏遮罩（桌面端不参与布局） ---- */
.sidebar-mask{
  position:fixed;inset:0;z-index:55;background:rgba(15,23,42,.46);
  opacity:0;transition:opacity .2s ease;
}
.sidebar-mask.show{opacity:1}
body.sb-open{overflow:hidden}

@media (max-width:900px){
  /* 900 断点就开始抽屉化：iPad 竖屏 + 手机横屏也能用 */
  .sidebar{
    position:fixed;left:0;top:0;z-index:60;width:264px;max-width:86vw;
    transform:translateX(-100%);transition:transform .24s ease;
    box-shadow:10px 0 30px rgba(0,0,0,.28);
  }
  .sidebar.open{transform:translateX(0)}
  .menu-toggle{display:block}
}

@media (max-width:768px){
  html,body{-webkit-text-size-adjust:100%;overflow-x:hidden}
  body{font-size:14px}

  /* ---------- 顶栏 ---------- */
  .topbar{height:54px;padding:0 10px;gap:8px}
  .menu-toggle{
    display:block;font-size:19px;line-height:1;padding:7px 10px;
    border-radius:9px;background:#f3f6fb;border:1px solid var(--border);color:var(--text);
  }
  .topbar-title{font-size:15px;min-width:0}
  .topbar-right{gap:5px}
  .topbar-right .btn-ghost{padding:6px 8px;font-size:12px}
  .notif-panel{width:min(92vw,360px);right:-6px}

  /* ---------- 内容与卡片 ---------- */
  .content{padding:10px 10px calc(26px + env(safe-area-inset-bottom))}
  .card{padding:12px;border-radius:12px;margin-bottom:11px}
  .card-title{font-size:14px;margin-bottom:10px;gap:6px;flex-wrap:wrap;line-height:1.4}
  .card-title .sub{margin-left:0;flex:1 1 100%;font-size:11.5px}
  /* 宽表放在 card 里时（审计/费用等异步渲染的表没被 .table-wrap 包住）：
     让卡片自己成为滚动容器，绝不把 document 顶宽。 */
  #content .card{overflow-x:auto;-webkit-overflow-scrolling:touch}

  /* ---------- KPI ---------- */
  .kpi-grid{grid-template-columns:1fr 1fr !important;gap:9px;margin-bottom:12px}
  .kpi{padding:11px 12px;border-radius:12px;gap:3px}
  .kpi .k-label{font-size:12px}
  .kpi .k-value{font-size:19px;letter-spacing:-.3px}
  .kpi .k-sub{font-size:11px}
  .sched-kpi{grid-template-columns:1fr 1fr !important;gap:9px !important}

  /* ---------- 工具栏 / 标签页 ---------- */
  .toolbar{gap:7px;margin-bottom:10px}
  .toolbar .spacer{flex:1 1 100%;height:0}
  .toolbar .hint{flex:1 1 100%;order:9}
  .toolbar .btn-primary,.toolbar .btn-outline{flex:1 1 auto;justify-content:center;min-height:34px}
  .tabs{width:100%;max-width:100%;overflow-x:auto;padding:4px}
  .tabs .tab{padding:7px 12px;font-size:12.5px}

  /* ---------- 表格：容器内滚动 + 可读字号 ---------- */
  .table-wrap,.table-scroll-x,.prod-tab-scroll,#inv-wrap{
    max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;
  }
  /* 第 125 轮：表格整体再收一档 —— 手机上「一屏能看到几行」比字号重要，
     12px→11.5px、行内边距 7/9→6/7，14 行的在管产品列表能多露 2~3 行。 */
  #content table.tbl{font-size:11.5px}
  #content table.tbl th,#content table.tbl td{padding:6px 7px}
  #content table.tbl th{font-size:11px;line-height:1.3}
  #content table.tbl td{line-height:1.35}
  /* 冻结列的可读宽度：名称列别占满半屏，否则冻结列总宽超过可视区，拖动就像冻不住 */
  /* ⚠ 表格单元格的 max-width 在 table-layout:auto 下不生效，必须压内容元素；
     否则名称列仍按 190px 的内联 min-width 撑开，冻结列又变成半屏。 */
  #prod-tbl th:nth-child(2){min-width:0 !important}
  #prod-tbl td.prod-name-cell{min-width:0 !important;max-width:none}
  /* 冻结区右缘加一道投影，拖动时能看出「这块是钉住的」 */
  #content table.tbl.cols-freeze th.fz-last,
  #content table.tbl.cols-freeze td.fz-last{
    box-shadow:6px 0 8px -6px rgba(15,23,42,.28);
  }
  /* 最后 25px：在管产品这 6 列再各收 1~2px，正好排进 390 屏（不再横向滚动） */
  #prod-tbl{font-size:11px}
  #prod-tbl th,#prod-tbl td{padding:4px 5px}
  #prod-tbl th:nth-child(1),#prod-tbl td:nth-child(1){width:26px;padding:4px 3px}
  #prod-tbl .pc-strip-name{display:block;max-width:70px;overflow:hidden;
    text-overflow:ellipsis;white-space:nowrap}

  /* 表头/首列在滚动时保持可读 */
  #content table.tbl thead th{position:sticky;top:0;z-index:2}
  #content table.tbl td .pill{font-size:10.5px}

  /* ---------- 跟踪池筛选卡 ---------- */
  /* 只有在 .wl-open 时才展开；默认收起，先看到列表 */
  .wl-filters{display:none}
  .wl-filters.wl-open{display:flex}
  .wl-filters{padding:10px 11px 11px;gap:8px;border-radius:12px}
  .wl-filter-row{gap:6px 7px}
  .wl-filter-row + .wl-filter-row{padding-top:8px}
  .wl-filter-label{flex:1 1 100%;min-width:0;padding-left:8px}
  .wl-filters #wl-mgr{width:100% !important;max-width:none !important;min-width:0 !important}
  .wl-filters .wl-chips{gap:5px;flex:1 1 100%}
  .wl-filters .wl-chip{font-size:12px;padding:4px 10px}
  #wl-range-row{flex-wrap:wrap}
  #wl-range-row .wl-custom-range{flex:1 1 100%;display:flex;align-items:center;gap:5px}
  #wl-range-row .wl-custom-range .inp{width:auto !important;flex:1 1 0;min-width:0}
  #wl-l3-row .spacer,#wl-range-row .spacer{flex:1 1 100%;height:0;min-width:0}
  #wl-search{flex:1 1 100% !important;min-width:0 !important;width:100%}
  #wl-source-mode{flex:1 1 100%}
  #wl-source-mode .seg-btn{flex:1 1 0;text-align:center}

  /* ---------- 页签内的次级工具条（持仓/净值等） ---------- */
  .prod-cols-panel{position:static;width:100%;max-height:60vh;overflow:auto}
  .drawer-bars,#drawer-bars{flex-wrap:wrap;gap:6px}
  .drawer-bars .inp,#drawer-bars select,#drawer-bars input{max-width:100%}

  /* ---------- 抽屉里的「净值数据」条：4 项收成 2×2 ---------- */
  .nav-range-bar{display:grid;grid-template-columns:1fr 1fr;gap:8px 10px;align-items:start}
  .nav-range-bar .rb-arrow{display:none}
  .nav-range-bar .rb-item{min-width:0}
  .nav-range-bar .rb-val{font-size:14px}

  /* ---------- 宽表「降列」：手机上只留日常要看的主指标 ----------
     桌面端一列不减（19 列），手机上把「前一周/前 5 日」这类基准明细列先收起，
     需要时点行看详情抽屉。整表从 2081px 收到 ~520px，一屏内可读。 */
  #prod-tbl th:nth-child(7),#prod-tbl td:nth-child(7),
  #prod-tbl th:nth-child(8),#prod-tbl td:nth-child(8),
  #prod-tbl th:nth-child(9),#prod-tbl td:nth-child(9),
  #prod-tbl th:nth-child(10),#prod-tbl td:nth-child(10),
  #prod-tbl th:nth-child(11),#prod-tbl td:nth-child(11),
  #prod-tbl th:nth-child(12),#prod-tbl td:nth-child(12),
  #prod-tbl th:nth-child(13),#prod-tbl td:nth-child(13),
  #prod-tbl th:nth-child(14),#prod-tbl td:nth-child(14),
  /* 手机端再收一列：净值日期几乎每行相同，且详情页有；收掉后表格能在 390 屏内排下，
     不必横向拖动 = 也不会有「冻结列遮住半个日期」的观感问题。 */
  #prod-tbl th:nth-child(3),#prod-tbl td:nth-child(3),
  #prod-tbl th:nth-child(16),#prod-tbl td:nth-child(16),
  #prod-tbl th:nth-child(17),#prod-tbl td:nth-child(17),
  #prod-tbl th:nth-child(18),#prod-tbl td:nth-child(18),
  #prod-tbl th:nth-child(19),#prod-tbl td:nth-child(19){display:none !important}
  #prod-tbl .prod-name-cell{min-width:120px}
  #prod-cols-btn{display:none !important}
  #prod-tbl th,#prod-tbl td{white-space:nowrap}

  /* 已清盘：只留 名称 / 成立 / 清盘 / 单位 / 累计 / 成立以来 */
  #liq-tbl th:nth-child(3),#liq-tbl td:nth-child(3),
  #liq-tbl th:nth-child(6),#liq-tbl td:nth-child(6),
  #liq-tbl th:nth-child(7),#liq-tbl td:nth-child(7),
  #liq-tbl th:nth-child(11),#liq-tbl td:nth-child(11),
  #liq-tbl th:nth-child(12),#liq-tbl td:nth-child(12){display:none !important}
  #liq-tbl col:nth-child(3),#liq-tbl col:nth-child(6),#liq-tbl col:nth-child(7),
  #liq-tbl col:nth-child(11),#liq-tbl col:nth-child(12){width:0 !important}
  #liq-tbl{min-width:0 !important;table-layout:auto !important}

  /* 投资人：只留 名称 / 类型 / 市值 / 投入 / 收益率 / XIRR / 操作 */
  #inv-tbl th:nth-child(3),#inv-tbl td:nth-child(3),
  #inv-tbl th:nth-child(6),#inv-tbl td:nth-child(6),
  #inv-tbl th:nth-child(7),#inv-tbl td:nth-child(7),
  #inv-tbl th:nth-child(10),#inv-tbl td:nth-child(10),
  #inv-tbl th:nth-child(11),#inv-tbl td:nth-child(11){display:none !important}
  #inv-wrap > .inv-tbl{min-width:0 !important;width:max-content}
  #inv-tbl .inv-fz{position:static !important;left:auto !important;box-shadow:none !important}
  .inv-tbl td.inv-fz:first-child .inv-name{max-width:150px}

  /* 用户与权限：只留 用户名 / 显示名 / 角色 / 操作（编辑删除必须一屏可达） */
  #users-tbl th:nth-child(4),#users-tbl td:nth-child(4),
  #users-tbl th:nth-child(5),#users-tbl td:nth-child(5),
  #users-tbl th:nth-child(6),#users-tbl td:nth-child(6),
  #users-tbl th:nth-child(7),#users-tbl td:nth-child(7){display:none !important}

  /* 跟踪池里的「在管产品」标签页：估值表分支列让位（详情抽屉里有） */
  #wl-fof-table table th:nth-child(4),#wl-fof-table table td:nth-child(4){display:none !important}

  /* 管理人：别名列在手机上让位（详情里还有） */
  .mgr-tbl th:nth-child(3),.mgr-tbl td:nth-child(3){display:none !important}

  /* ---------- 工具栏提示语在手机上让位给按钮 ---------- */
  .toolbar > .hint{display:none}
  #wl-strategy-review{background:#fff !important;color:var(--primary) !important;
    border:1px solid var(--primary) !important;box-shadow:none !important}

  /* ---------- 右侧抽屉：手机全屏 ---------- */
  .drawer{
    width:100vw !important;max-width:none !important;min-width:0 !important;
    height:100vh;height:100dvh;
  }
  .drawer-head{padding:12px 14px}
  .drawer-title{font-size:15px}
  .drawer-body{padding:12px 13px 18px}
  .drawer-foot{padding:10px 13px calc(10px + env(safe-area-inset-bottom))}
  .drawer-foot .btn-primary,.drawer-foot .btn-secondary{flex:1 1 0}
  .drawer-sec-title{font-size:12.5px}

  /* ---------- 弹窗 ---------- */
  .modal-mask{padding:8px 9px;align-items:flex-start}
  .modal{
    width:calc(100vw - 18px) !important;max-width:none !important;
    max-height:calc(100vh - 20px);max-height:calc(100dvh - 20px);
    border-radius:14px;
  }
  /* 手机屏幕小，指标/公式口径说明让位给数据本身（桌面端照旧显示） */
  .hint-formula,.hint-mini{display:none !important}
  .modal.modal-wide{width:calc(100vw - 18px) !important}
  .modal-body{padding:12px 13px 16px;max-height:calc(100vh - 72px);overflow-y:auto}
  .modal-head{padding:12px 14px}

  /* ---------- 表单 / 输入 ---------- */
  .form-grid{grid-template-columns:1fr !important}
  .inp,select.inp,input.inp{max-width:100%}
  /* 费用期间：不要被 flex:1 1 0 压成 40px 空盒，给一个「至少能点开日历」的宽度 */
  .fee-toolbar .inp[type=date]{flex:1 1 108px;width:auto !important;min-width:108px}
  .fee-toolbar .hint{margin-left:0 !important}
  .fee-toolbar .btn-outline,.fee-toolbar .btn-primary{flex:1 1 auto}
  .au-bar input[type=search]{flex:1 1 100%;min-width:0}
  .au-bar select{flex:1 1 46%;min-width:0}
  .au-bar input[type=date]{flex:1 1 46%;min-width:0}

  /* ---------- 登录页 ---------- */
  .login-page{padding:14px}
  .login-card{width:100%;max-width:420px;padding:22px 18px;border-radius:16px}
  .login-brand h1{font-size:20px}

  /* ---------- Toast ---------- */
  .toast{left:10px;right:10px;transform:none;text-align:center;font-size:13px}

  /* ---------- 图表：容器满宽，避免 canvas 撑破 ---------- */
  canvas{max-width:100%}
  .holding-pie-wrap{grid-template-columns:1fr}
  .pie-pair,.wl-pie-card{grid-template-columns:1fr}
}

/* 手机端筛选折叠按钮（桌面端不显示） */
.only-mobile{display:none}
@media (max-width:768px){
  .wl-filter-toggle{
    display:flex;align-items:center;gap:8px;width:100%;
    padding:10px 12px;margin:0 0 8px;border-radius:11px;
    background:#fff;border:1px solid var(--border);box-shadow:var(--shadow);
    font-size:13.5px;font-weight:600;color:var(--text-2);text-align:left;
  }
  .wl-filter-toggle .wft-cnt{color:var(--primary);font-weight:700;font-size:12px}
  .wl-filter-toggle .wft-caret{margin-left:auto;transition:transform .18s;color:var(--muted)}
  .wl-filter-toggle.open .wft-caret{transform:rotate(180deg)}
}

/* ---------- 跟踪池 · 手机端卡片（第 125 轮） ---------- */
.wl-cards{display:flex;flex-direction:column;gap:8px;background:transparent;box-shadow:none;padding:0}
.wl-card{
  display:flex;gap:9px;padding:10px 11px;background:#fff;border:1px solid var(--border);
  border-radius:12px;box-shadow:var(--shadow);cursor:pointer;
}
.wl-card:active{background:#f7faff}
.wc-chk{padding-top:3px;flex:none}
.wc-chk input{width:17px;height:17px}
.wc-body{flex:1;min-width:0}
.wc-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.wc-name{font-size:14px;color:var(--text);line-height:1.3}
.wc-code{font-size:11px;color:var(--muted);background:#f4f6fa;padding:1px 5px;border-radius:4px}
.wc-sub{font-size:11.5px;color:var(--muted);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wc-metrics{display:flex;gap:16px;margin-top:8px}
.wc-metrics>span{display:flex;flex-direction:column;gap:2px;min-width:0}
.wc-metrics i{font-style:normal;font-size:11px;color:var(--muted)}
.wc-metrics b,.wc-mv{font-size:13.5px;font-weight:700;font-variant-numeric:tabular-nums}
.wc-foot{display:flex;align-items:center;gap:6px;margin-top:8px;flex-wrap:wrap}
.wc-foot .pill{font-size:10.5px;padding:2px 7px}
.wc-date{margin-left:auto;font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums}

@media (max-width:420px){
  .kpi-grid{grid-template-columns:1fr 1fr !important}
  .kpi .k-value{font-size:17px}
  .topbar-right .btn-ghost{padding:5px 7px;font-size:11.5px}
  .card{padding:11px}
  .content{padding:8px 8px calc(24px + env(safe-area-inset-bottom))}
}


/* ============================================================
   第 125 轮补丁 · 自绘时间选择器 + 手机端弹窗滚动
   ============================================================ */

/* ---- 时间选择器（时 / 分 两列滚轮） ---- */
.tp{
  position:fixed;z-index:210;width:250px;padding:12px 12px 10px;background:#fff;
  border-radius:14px;box-shadow:0 18px 50px rgba(15,23,42,.26);
  border:1px solid var(--border);user-select:none;
}
.tp.hidden{display:none}
.tp-hd{display:flex;align-items:baseline;justify-content:space-between}
.tp-hd span{font-size:12.5px;color:var(--text-2)}
.tp-hd b{font-size:19px;color:var(--primary);font-variant-numeric:tabular-nums;letter-spacing:.5px}
.tp-sub{font-size:11.5px;color:var(--muted);min-height:15px;margin:2px 0 8px}
.tp-cols{
  display:flex;gap:8px;height:180px;position:relative;
  /* 上下边缘渐隐：滚轮里被裁掉半截的相邻项不会显得像「错位」 */
  -webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 16%,#000 84%,transparent 100%);
  mask-image:linear-gradient(to bottom,transparent 0,#000 16%,#000 84%,transparent 100%);
}
/* 中间选中带 */
.tp-cols::before{
  content:"";position:absolute;left:0;right:0;top:72px;height:36px;
  border-top:1px solid var(--border);border-bottom:1px solid var(--border);
  background:var(--primary-soft,#eef4ff);opacity:.55;pointer-events:none;border-radius:6px;
}
.tp-col{
  flex:1;overflow-y:auto;scroll-snap-type:y mandatory;
  padding:72px 0;scrollbar-width:none;-webkit-overflow-scrolling:touch;
  overscroll-behavior:contain;
}
.tp-col::-webkit-scrollbar{display:none}
.tp-i{
  height:36px;display:flex;align-items:center;justify-content:center;
  font-size:15px;color:var(--text-2);scroll-snap-align:center;cursor:pointer;
  font-variant-numeric:tabular-nums;border-radius:6px;
}
.tp-i.on{color:var(--primary);font-weight:700;font-size:17px;background:#fff;position:relative;z-index:1}
.tp-ft{display:flex;gap:8px;margin-top:10px}
.tp-btn{
  flex:1;height:34px;border-radius:9px;border:1px solid var(--border);
  background:#fff;font-size:13px;color:var(--text-2);cursor:pointer;
}
.tp-btn.primary{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}

@media (max-width:768px){
  /* 手机：底部弹层，双列滚轮更高一点 */
  .tp{
    left:10px;right:10px;bottom:calc(10px + env(safe-area-inset-bottom));
    top:auto;width:auto;padding:14px 14px 12px;border-radius:16px;
    box-shadow:0 -8px 40px rgba(15,23,42,.3);
  }
  .tp-cols{height:204px}
  .tp-col{padding:84px 0}
  .tp-cols::before{top:84px;height:36px}
  .tp-i{height:36px;font-size:17px}
  .tp-i.on{font-size:19px}
  .tp-btn{height:40px;font-size:14px}

  /* 日程表单：380 屏上 4 个字段挤一行，时间框只剩 ~70px（显示成「0…」）。
     日期独占一行，开始/结束/优先级各占 1/3，时间能完整显示 HH:MM。 */
  .sc-row{flex-wrap:wrap;gap:8px}
  .sc-row .sc-fld{flex:1 1 28% !important}
  .sc-row .sc-fld:first-child{flex:1 1 100% !important}

  /* ---- 弹窗：单一滚动容器 ----
     原先 .modal-body 自己滚 + 里面表格又是 overflow-x:auto（= 同时成为纵向滚动容器），
     部分手机浏览器（微信/UC/小米自带）不把纵向手势继续往上冒泡 ⇒ 表现为「完全滑不动」。
     现在弹窗内只保留一个滚动容器，表格不再自建滚动层。 */
  /* ⚠ dvh 不是所有厂商浏览器都认（微信/UC/小米自带、部分安卓 WebView）。
     不认时 max-height 整条被丢弃 ⇒ 弹窗无高度约束、.modal-body 没有可滚动空间，
     外层 .modal-mask 又是 position:fixed ⇒ 表现为「弹窗比屏幕高、完全滑不动」。
     先给 vh 兜底，再由 JS `_fitModal()` 用 px 覆盖（visualViewport 更准）。 */
  .modal{
    display:flex;flex-direction:column;overflow:hidden;
    max-height:calc(100vh - 20px);
    max-height:calc(100dvh - 20px);
  }
  .modal-head{flex:0 0 auto}
  .modal-body{
    flex:1 1 auto;min-height:0;max-height:none;overflow:auto;
    overscroll-behavior:contain;-webkit-overflow-scrolling:touch;
  }
  /* 弹窗内所有表格容器都交出滚动权（.wr-table-wrap / .whr-wrap 也要），
     只留 .modal-body 一个滚动容器 —— 嵌套滚动在部分内核上完全不动。 */
  .modal-body .table-scroll-x,
  .modal-body .table-wrap,
  .modal-body .wr-table-wrap,
  .modal-body .whr-wrap{
    overflow:visible !important;max-height:none !important;
    height:auto !important;position:static !important;
  }
  .modal-body table{max-width:none}
  /* 弹窗内禁止 sticky：滚动层换成 .modal-body 后，表头的参照物变了，
     会停在半空、行从表头上下穿出去（用户截图的「穿模」）。 */
  .modal-body table th,.modal-body table td{position:static !important}
  .modal-body table th.fz,.modal-body table td.fz{
    left:auto !important;box-shadow:none !important;z-index:auto !important;
  }
  .modal-body .wr-name-rail,.modal-body .whr-name-rail{
    position:static !important;max-height:none !important;overflow:visible !important;
  }

  /* 周度回顾 10 列在 390 屏上必然横溢（1184 vs 372）。手机上只留
     #/产品名称/最新周单位净值/最新周累计净值/累计净值周变动 —— 其余四列
     （策略、规模、起始日、前一周两个净值）在桌面端看，手机上点产品行看详情。 */
  #wr-body table th:nth-child(3),#wr-body table td:nth-child(3),
  #wr-body table th:nth-child(4),#wr-body table td:nth-child(4),
  #wr-body table th:nth-child(5),#wr-body table td:nth-child(5),
  #wr-body table th:nth-child(6),#wr-body table td:nth-child(6),
  #wr-body table th:nth-child(8),#wr-body table td:nth-child(8){display:none !important}
  #wr-body table{font-size:11px}
  /* ⚠ 表头字号必须显式写：`.wr-split .wr-tbl-rail th` 有 font-size:12.5px，
     只给 table 设 11px 的话 th 仍是 12.5px，列宽收不下来。 */
  #wr-body table th,#wr-body table td{font-size:11px;padding:6px 3px;white-space:nowrap}
  #wr-body table th{font-size:10px}
  /* ⚠ 原规则 .wr-tbl td.wr-c-name 有 min-width:170px，只写 max-width 盖不住 ⇒ 名称列撑到 170 */
  #wr-body table td.wr-c-name,#wr-body table th.wr-c-name{
    min-width:0 !important;max-width:70px !important;width:70px !important;padding-left:3px !important;
  }
  #wr-body table td.wr-c-idx,#wr-body table th.wr-c-idx{min-width:0 !important;width:26px !important;padding:6px 3px !important}
  #wr-body .wr-table-wrap{overflow:visible !important}

  /* ---- 第 126 轮 · 在管产品详情「持仓周度回顾」手机端 ----
     用户反馈：① 列表完全拖不动 ② 表头穿模。
     根因是**双层横向滚动**：#prod-tab-body 里的每张表又被 _wrapProdTabTables()
     包了一层 .prod-tab-scroll，于是 .whr-wrap > .prod-tab-scroll > table：
       · 内层宽 1404px 但 sticky 表头的滚动参照变成了内层容器，
         纵向滚动（.whr-wrap 的 max-height）时行从表头上下穿出去 = 穿模；
       · 手势落在内层，内层没有可滚内容时不冒泡 ⇒ 表现为完全拖不动。
     JS 侧已改为「已在滚动容器里的表不再包一层」，这里再把 .whr-wrap 明确成
     唯一横向滚动层，并把名称列收窄（180px 内联 min-width 会吃掉 81% 屏宽，
     冻结列比可滚区还宽，拖动就像冻不住）。 */
  #phr-inner .whr-wrap{
    overflow-x:auto !important;overflow-y:auto;max-height:60vh;
    -webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;
  }
  /* ⚠ th 上是内联 style="min-width:180px"，不收 !important 盖不住 */
  #phr-inner .whr-tbl th.whr-c-name,
  #phr-inner .whr-tbl td.whr-c-name{
    min-width:0 !important;width:92px !important;max-width:92px !important;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  /* 手机上只留决策要看的口径：产品 / 策略 / 持仓占比 / 最新周末累计 /
     周变动 / 收益率 / 年化 / 基准指数 / 本周超额。
     起始日、初始净值、前周末累计、产品规模（万）留给桌面端。 */
  #phr-inner .whr-c-start,
  #phr-inner .whr-c-init,
  #phr-inner .whr-c-prevacc,
  #phr-inner .whr-c-scale{display:none !important}
  #phr-inner .whr-tbl{font-size:11px}
  #phr-inner .whr-tbl th,
  #phr-inner .whr-tbl td{font-size:11px;padding:6px 5px;white-space:nowrap}
  #phr-inner .whr-tbl th{font-size:10px}
  /* 冻结首列右缘投影，拖动时能看出这块是钉住的 */
  #phr-inner .whr-tbl.cols-freeze th.fz-last,
  #phr-inner .whr-tbl.cols-freeze td.fz-last{box-shadow:2px 0 4px rgba(0,0,0,.10)}
}

/* ============================================================
   第 127 轮 · 业绩报酬计提明细（费用分配计算 → 业绩报酬）
   结构：日期 → 计提事件（分红/赎回/清盘）→ 产品 → 明细表
   ============================================================ */
.fee-ev-bar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:2px 0 10px}
.fee-ev-bar label{font-size:12px;color:#475569;display:inline-flex;gap:6px;align-items:center}
.fee-ev-bar label input{padding:4px 8px}
.fee-ev-chips{display:inline-flex;gap:6px;margin-left:auto;flex-wrap:wrap}
.fee-ev-chips .chip{
  cursor:pointer;background:#f8fafc;border:1px solid #e2e8f0;border-radius:999px;
  padding:3px 12px;font-size:12px;color:#475569;line-height:1.6;
}
.fee-ev-chips .chip:hover{background:#eef2ff;border-color:#c7d2fe;color:#1e3a8a}
.fee-ev-chips .chip.active{background:#1e3a8a;border-color:#1e3a8a;color:#fff}
.fee-ev-group{border:1px solid #e8edf5;border-radius:10px;margin:12px 0;overflow:hidden}
.fee-ev-hd{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:8px 12px;background:#f6f8fc;border-bottom:1px solid #e8edf5;
  font-size:13px;color:#334155;
}
.fee-ev-hd b{font-weight:600}
.fee-ev-hd .muted{font-size:12px}
.fee-ev-group .table-wrap{max-height:none;overflow-x:auto}
.fee-ev-tbl{margin:0;font-size:12.5px}
.fee-ev-tbl thead th{background:#fff;border-bottom:1px solid #eef2f7}
.fee-ev-tbl tbody tr:hover td{background:#fafcff}

@media (max-width:900px){
  /* 手机端：事件头折行、明细表横向滚动、chips 独占一行 */
  .fee-ev-chips{margin-left:0;width:100%}
  .fee-ev-hd{gap:6px;font-size:12px;padding:7px 9px}
  .fee-ev-tbl{font-size:11.5px}
  .fee-ev-tbl th,.fee-ev-tbl td{padding:6px 6px}
}

/* ---- 第 128 轮：业绩报酬按「日期」分段 + 三方分配 ---- */
.fee-ev-date{margin:14px 0 4px}
.fee-ev-date-hd{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:7px 12px;border-radius:10px;background:#eef2ff;border:1px solid #dbe4ff;
  font-size:13px;color:#1e3a8a;
}
.fee-ev-date-hd b{font-weight:700}
.fee-ev-total{font-size:12px;color:#334155}
.fee-ev-total b{color:#1e3a8a;font-size:13px}
.fee-ev-split{
  font-size:12px;color:#475569;background:#fff;border:1px solid #e2e8f0;
  border-radius:999px;padding:2px 10px;
}
.fee-ev-ratio{
  margin-left:auto;font-size:11px;color:#64748b;background:#f8fafc;
  border:1px dashed #cbd5e1;border-radius:999px;padding:1px 9px;
}
.sched-owner-wrap{display:inline-flex;align-items:center;gap:6px;flex:0 0 auto}
.sched-owner-wrap .hint{white-space:nowrap}
.sched-owner-wrap select{
  height:28px;padding:0 8px;font-size:12.5px;border-radius:8px;
  border:1px solid #d7dee9;background:#fff;color:#334155;max-width:170px;
}
@media (max-width:900px){
  .fee-ev-date-hd{gap:6px;font-size:12px;padding:6px 9px}
  .fee-ev-split{font-size:11px}
  .fee-ev-ratio{margin-left:0}
  .sched-owner-wrap{display:flex;flex:1 1 100%;width:100%;margin:6px 0 0;gap:8px}
  .sched-owner-wrap select{flex:1 1 auto;max-width:none;width:auto;min-width:0}
}

/* ---- 第 129 轮：ICP 备案号（登录页 + 侧边栏底部）---- */
.login-beian{text-align:center;margin-top:4px;font-size:11.5px;line-height:1.6}
.login-beian a{color:#94a3b8;text-decoration:none}
.login-beian a:hover{color:#475569;text-decoration:underline}
.sidebar-beian{padding:0 18px 12px;font-size:11px;line-height:1.5}
.sidebar-beian a{color:#7d8ea3;text-decoration:none}
.sidebar-beian a:hover{color:#c7d5e6;text-decoration:underline}
