:root{
  /* 浅色主题（SaaS 风格）：白卡片 + 浅灰底 + 金色品牌点缀。
     语义不变：--gold-soft 仍是「金色文字/强调」，但改为深金保证浅底可读。 */
  --bg:#f4f6f9; --bg2:#ffffff; --panel:rgba(255,255,255,.88);
  --panel-solid:#ffffff; --line:#e3e8ef;
  --gold:#b8860b; --gold-soft:#8a6a15; --gold-deep:#9a6b00; --blue:#2563eb; --aurora:#64748b;
  --text:#1f2733; --muted:#66707f; --danger:#dc2626; --ok:#0ca678; --warn:#b45309;
  --radius:14px; --shadow:0 10px 30px rgba(15,23,42,.10);
}
*{box-sizing:border-box;}
html,body{margin:0;height:100%;}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  background:linear-gradient(180deg,#f7f9fc 0%,#eef2f7 100%);
  background-attachment:fixed;
  color:var(--text); -webkit-font-smoothing:antialiased;
}
/* 旧深色主题的锤纹质感叠层：浅色下关闭 */
body::after{content:none;}
button{font-family:inherit;cursor:pointer;}
input{font-family:inherit;}

/* 移动端拦截 */
.mobile-block{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(180deg,#f7f9fc,#eef2f7);z-index:9999;padding:24px;text-align:center;}
.mb-card{max-width:420px;padding:38px 30px;border:1px solid var(--line);border-radius:var(--radius);
  background:var(--panel);backdrop-filter:blur(12px);box-shadow:var(--shadow);}
.mb-icon{font-size:54px;margin-bottom:10px;}
.mb-card h2{margin:6px 0 12px;font-size:20px;color:var(--gold-soft);}
.mb-card p{color:var(--muted);line-height:1.7;font-size:14px;margin:0;}

/* 登录 */
.login-view{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:20px;}
.login-card{width:380px;max-width:92vw;padding:40px 34px;border:1px solid var(--line);border-radius:20px;
  background:var(--panel);backdrop-filter:blur(14px);box-shadow:var(--shadow);}
.login-logo{display:flex;align-items:center;gap:10px;justify-content:center;}
.login-logo img{width:34px;height:34px;}
.login-logo span{font-size:20px;font-weight:700;letter-spacing:1px;color:var(--gold-soft);}
.login-title{text-align:center;margin:14px 0 2px;font-size:23px;}
.login-sub{text-align:center;color:var(--muted);font-size:13px;margin:0 0 26px;letter-spacing:.5px;}
.field{display:block;margin-bottom:16px;}
.field span{display:block;font-size:13px;color:var(--muted);margin-bottom:7px;}
.field input{width:100%;height:44px;padding:0 14px;border-radius:10px;border:1px solid var(--line);
  background:#f7f9fb;color:var(--text);font-size:14px;outline:none;transition:.2s;}
.field input:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(212,175,55,.15);}
.login-error{background:rgba(255,93,108,.12);border:1px solid rgba(255,93,108,.35);color:#dc2626;
  padding:10px 12px;border-radius:10px;font-size:13px;margin-bottom:14px;}
.login-tip{color:var(--muted);font-size:12px;text-align:center;margin:18px 0 0;}

/* 按钮 */
.btn{border:1px solid var(--line);background:#f6f8fa;color:var(--text);
  padding:9px 16px;border-radius:10px;font-size:13px;transition:.18s;}
.btn:hover{border-color:var(--gold);color:var(--gold-soft);}
.btn-primary{background:linear-gradient(135deg,#e2bd4d,#c19312);border-color:transparent;color:#1a1405;font-weight:700;}
.btn-primary:hover{filter:brightness(1.08);color:#1a1405;}
.btn-primary:disabled{opacity:.5;cursor:not-allowed;filter:none;}
.btn-ghost{background:transparent;}
.btn-block{width:100%;height:46px;font-size:15px;margin-top:4px;}
.btn-danger{border-color:rgba(255,93,108,.4);color:#dc2626;}
.btn-danger:hover{border-color:var(--danger);color:#fff;background:rgba(255,93,108,.16);}
.btn-gold{border-color:rgba(212,175,55,.5);color:var(--gold-soft);background:linear-gradient(135deg,rgba(212,175,55,.16),rgba(184,134,11,.12));}
.btn-gold:hover{border-color:var(--gold);color:#fff;background:linear-gradient(135deg,rgba(212,175,55,.3),rgba(184,134,11,.22));}
/* 股池行情时间标记（页头显示实时行情时间，单元格不再叠加「实时」徽章） */
.pool-meta .quote-at{color:var(--gold-soft);}
.btn-warn{border-color:rgba(255,180,84,.4);color:#b45309;}
.btn-warn:hover{border-color:var(--warn);color:#1a1405;background:rgba(255,180,84,.2);}
.btn-sm{padding:6px 12px;font-size:12px;}

/* 主应用布局 */
.app-view{position:fixed;inset:0;display:flex;}
.sidebar{width:232px;flex:none;display:flex;flex-direction:column;
  background:#ffffff;
  border-right:1px solid var(--line);padding:22px 16px;}
.side-brand{display:flex;align-items:center;gap:11px;padding:4px 8px 22px;}
.side-brand img{width:36px;height:36px;}
.side-brand-text{display:flex;flex-direction:column;line-height:1.25;}
.side-brand-text strong{font-size:16px;color:var(--gold-soft);letter-spacing:.5px;}
.side-brand-text small{font-size:11px;color:var(--muted);}
.side-nav{display:flex;flex-direction:column;gap:6px;margin-top:6px;}
.nav-item{display:flex;align-items:center;gap:11px;text-align:left;padding:12px 14px;border-radius:11px;
  background:transparent;border:1px solid transparent;color:var(--muted);font-size:14px;transition:.18s;}
.nav-item .nav-ico{font-size:17px;}
.nav-item:hover{color:var(--text);background:#f6f8fa;}
.nav-item.active{color:var(--gold-soft);background:linear-gradient(135deg,rgba(212,175,55,.16),rgba(123,92,255,.12));
  border-color:var(--line);box-shadow:0 0 0 1px rgba(212,175,55,.1) inset;}
.side-foot{margin-top:auto;font-size:11px;color:var(--muted);padding:14px 8px 0;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:6px;opacity:.75;line-height:1.6;}
.side-disc{margin:0;padding:0;font-size:10.5px;opacity:.85;}

.main{flex:1;display:flex;flex-direction:column;min-width:0;}
.topbar{height:62px;flex:none;display:flex;align-items:center;justify-content:space-between;
  padding:0 26px;border-bottom:1px solid var(--line);background:rgba(255,255,255,.85);backdrop-filter:blur(8px);}
.topbar-title{font-size:17px;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.topbar-right{display:flex;align-items:center;gap:14px;}
.admin-badge{padding:6px 12px;border-radius:20px;background:rgba(212,175,55,.12);border:1px solid var(--line);
  color:var(--gold-soft);font-size:13px;}

.content{flex:1;overflow:auto;padding:26px;position:relative;}
.panel{animation:fade .25s ease;}
@keyframes fade{from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:none;}}
.panel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:18px;}
.panel-head h2{margin:0;font-size:19px;}
.panel-desc{margin:6px 0 0;color:var(--muted);font-size:13px;}

/* AI 选股面板：作战室是**纵向阅读流**（说明+统计+表格+脚注），不是三栏 dashboard。
   ★ 此前用 absolute + inset + overflow:hidden 独占视口，是给「左策略/右结果」三栏设计的；
   内容形态变成纵向文档后，超出视口的部分被裁掉、父级 .content 也被 :has() 设成 hidden，
   页面彻底滚不动。改回文档流，统一交给 .content 滚动；只有「策略与回测」三栏区内部自己滚。 */
#aipick-panel{display:none;flex-direction:column;gap:14px;min-height:100%;}
#aipick-panel.active{display:flex;}
#aipick-panel > .panel-head{flex:none;margin-bottom:14px;}

/* 二级视图：此前 .aip-view 完全没有样式，四个视图裸奔，切换后布局全靠 inline display。 */
.aip-view{display:flex;flex-direction:column;gap:14px;min-width:0;}
#ap-view-detail{flex:1;min-height:0;}

/* 板块强度 · 涨停题材监控（对标参考 HTML 逻辑，系统古法黄金风格） */
#sector-panel{display:none;position:absolute;inset:26px;flex-direction:column;overflow:hidden;}
#limitup-panel{display:none;position:absolute;inset:26px;flex-direction:column;overflow:hidden;}
.content:has(#sector-panel[style*="display: flex"]),.content:has(#limitup-panel[style*="display: flex"]){overflow:hidden;}
#sector-panel > .panel-head,#limitup-panel > .panel-head{flex:none;margin-bottom:14px;}

/* ============ 板块强度三栏 ============ */
.sec3-layout{display:flex;gap:14px;flex:1;min-height:0;}
.sec3-left{width:168px;flex:0 0 168px;overflow:auto;display:flex;flex-direction:column;gap:8px;padding-right:4px;}
.sec3-mid{width:300px;flex:0 0 300px;overflow:auto;display:flex;flex-direction:column;gap:10px;padding-right:4px;}
.sec3-right{flex:1;min-width:0;overflow:auto;display:flex;flex-direction:column;gap:14px;padding-right:4px;}
.sec3-line{display:flex;align-items:center;justify-content:space-between;padding:9px 12px;border:1px solid var(--line);border-radius:10px;cursor:pointer;background:var(--panel-solid);transition:.15s;}
.sec3-line:hover{border-color:var(--gold);}
.sec3-line.active{background:linear-gradient(135deg,rgba(201,162,39,.18),rgba(201,162,39,.06));border-color:var(--gold);}
.sec3-line-name{font-size:14px;font-weight:600;}
.sec3-line-count{font-size:12px;color:var(--muted);background:#f1f4f7;border-radius:20px;padding:1px 9px;}
.sec3-board{padding:10px 12px;border:1px solid var(--line);border-radius:10px;cursor:pointer;background:var(--panel-solid);transition:.15s;}
.sec3-board:hover{border-color:var(--gold);}
.sec3-board.active{border-color:var(--gold);background:linear-gradient(135deg,rgba(201,162,39,.16),rgba(201,162,39,.04));box-shadow:0 0 0 1px var(--gold) inset;}
.sec3-board-top{display:flex;align-items:center;justify-content:space-between;}
.sec3-board-name{font-size:14px;font-weight:600;}
.sec3-board-score{font-size:15px;font-weight:700;padding:1px 8px;border-radius:8px;}
.sec3-board-meta{display:flex;gap:10px;margin-top:6px;font-size:12px;color:var(--muted);}
.band-ok{color:#0ca678;background:rgba(95,179,161,.14);}
.band-risk{color:#dc2626;background:rgba(226,87,76,.14);}
.band-mid{color:#a16207;background:rgba(201,162,39,.14);}
.up{color:#dc2626;} .down{color:#0ca678;}
.sec3-detail-empty{padding:40px;text-align:center;color:var(--muted);}
.sec3-detail-head{display:flex;align-items:baseline;gap:12px;}
.sec3-detail-head h3{margin:0;font-size:18px;}
.sec3-detail-sub{font-size:12px;color:var(--muted);}
.sec3-kline{width:100%;height:240px;background:var(--panel-solid);border:1px solid var(--line);border-radius:12px;}
.sec3-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;}
.sec3-card{background:var(--panel-solid);border:1px solid var(--line);border-radius:10px;padding:10px 12px;}
.sec3-card-t{font-size:12px;color:var(--muted);margin-bottom:6px;}
.sec3-card-b{font-size:16px;font-weight:700;}
.sec3-sec{background:var(--panel-solid);border:1px solid var(--line);border-radius:10px;padding:12px 14px;}
.sec3-sec-title{font-size:13px;color:var(--gold);font-weight:600;margin-bottom:8px;}
.sec3-reasons{margin:0;padding-left:18px;color:var(--muted);font-size:13px;line-height:1.7;}
.sec3-tags{display:flex;flex-wrap:wrap;gap:6px;}
.sec3-tag{font-size:12px;padding:2px 10px;border-radius:20px;background:rgba(201,162,39,.12);color:var(--gold);border:1px solid rgba(201,162,39,.3);}
.sec3-infer{font-size:13px;line-height:1.7;color:#475569;}
.sec3-stocks{width:100%;border-collapse:collapse;font-size:13px;}
.sec3-stocks th,.sec3-stocks td{text-align:left;padding:7px 10px;border-bottom:1px solid var(--line);}
.sec3-stocks th{color:var(--muted);font-weight:500;font-size:12px;}
.sec3-disclaimer{font-size:11px;color:var(--muted);opacity:.7;}
/* 涨停题材两栏：左 = 涨停时间线（涨速优先，窄列通高滚动），
   右 = 板块卡片网格（自适应换行，一屏尽量多放信息） */
.sec-lb-layout{display:flex;gap:14px;flex:1;min-height:0;overflow:hidden;}
.sec-lb-left{width:396px;flex:0 0 396px;min-width:0;display:flex;flex-direction:column;overflow:hidden;}
.sec-lb-right{flex:1;min-width:0;overflow-y:auto;padding:2px 4px 10px 2px;}
.sec-lb-title{flex:none;padding:8px 4px;border-bottom:1px solid var(--line);color:var(--gold-soft);
  font-size:13px;font-weight:600;display:flex;align-items:center;gap:6px;}
.sec-lb-title::before{content:'';display:inline-block;width:4px;height:16px;
  background:linear-gradient(135deg,#e2bd4d,#c19312);border-radius:2px;}
.lb-timeline{flex:1;min-height:0;overflow-y:auto;}

/* 板块卡片自适应网格 */
.lb-plate-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(236px,1fr));gap:12px;align-content:start;}
.lb-plate-item{background:var(--panel-solid);border:1px solid var(--line);
  border-radius:12px;padding:10px 12px;display:flex;flex-direction:column;gap:8px;transition:.18s;}
.lb-plate-item:hover{background:rgba(212,175,55,.08);border-color:var(--gold);transform:translateY(-2px);}
.lb-plate-item.highlight{background:rgba(212,175,55,.12);border-left:3px solid var(--gold);
  box-shadow:0 0 0 1px var(--gold),0 4px 12px rgba(15,23,42,.08);}
.lb-plate-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  border-bottom:1px dashed var(--line);padding-bottom:6px;}
.lb-plate-name{font-weight:700;font-size:13px;color:var(--text);display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;}
.lb-count{display:inline-flex;align-items:center;background:linear-gradient(135deg,var(--danger),#d9543f);
  color:#fff;border-radius:20px;padding:0 8px;font-size:10px;font-weight:700;line-height:18px;white-space:nowrap;}
.lb-broken{display:inline-flex;align-items:center;background:rgba(95,207,155,.18);color:var(--ok);
  border:1px solid rgba(95,207,155,.4);border-radius:20px;padding:0 8px;font-size:10px;font-weight:700;line-height:18px;
  white-space:nowrap;margin-left:4px;}
.lb-plate-desc{color:var(--muted);font-size:10px;background:rgba(212,175,55,.08);padding:0 6px;border-radius:20px;line-height:1.5;}
.lb-plate-stocks{display:flex;flex-wrap:wrap;gap:6px;max-height:260px;overflow-y:auto;}
.lb-stock-tag{display:inline-flex;align-items:center;gap:5px;padding:3px 6px;background:#f6f8fa;
  border:1px solid var(--line);border-radius:6px;font-size:10px;cursor:pointer;transition:.1s;}
.lb-stock-tag:hover{background:rgba(212,175,55,.12);transform:translateY(-1px);}
.lb-stock-time{font-family:monospace;font-size:9px;background:rgba(212,175,55,.1);color:var(--gold-soft);padding:0 3px;border-radius:4px;}
.lb-stock-name{font-weight:500;font-size:10px;color:var(--text);display:inline-block;}
.lb-stock-name.highlight{color:var(--gold-soft);font-weight:700;}
.lb-stock-name.special{color:var(--ok);}
.lb-stock-name.neg{color:var(--ok);border:1px solid var(--ok);border-radius:4px;padding:0 3px;background:rgba(95,207,155,.1);font-weight:600;}
.lb-stock-board{background:#eef1f5;padding:0 4px;border-radius:4px;font-size:8px;color:var(--gold-soft);}

/* 角色标签 */
.lb-tag{display:inline-flex;align-items:center;padding:1px 5px;border-radius:3px;font-size:9px;font-weight:600;margin-right:2px;}
.lb-tag-dragon{background:rgba(255,95,162,.16);color:#d6336c;border:1px solid rgba(255,95,162,.4);}
.lb-tag-army{background:rgba(255,192,107,.16);color:var(--warn);border:1px solid rgba(255,192,107,.4);}
.lb-tag-commander{background:rgba(255,93,108,.16);color:var(--danger);border:1px solid rgba(255,93,108,.4);}
.lb-tag-left{background:#e5e9f0;color:#fff;border:1px solid #c9d2dd;}
.lb-tag-right{background:rgba(184,134,11,.18);color:var(--gold-deep);border:1px solid rgba(184,134,11,.4);}

/* 涨停时间线 */
.lb-time-item{display:flex;flex-direction:column;padding:8px 4px 8px 6px;border-bottom:1px solid #f6f8fa;transition:background .1s;cursor:pointer;}
.lb-time-item:hover{background:rgba(212,175,55,.06);}
.lb-time-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:3px;}
.lb-time-t{font-family:monospace;font-size:12px;font-weight:600;color:var(--gold-soft);width:56px;flex-shrink:0;}
.lb-time-info{flex:1;display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.lb-time-name{font-weight:600;font-size:11px;color:var(--text);}
.lb-time-plate{background:linear-gradient(135deg,var(--aurora),var(--gold-deep));color:#fff;padding:1px 8px;border-radius:4px;font-size:10px;font-weight:600;margin-left:2px;}
.lb-time-reason{font-size:11px;color:var(--muted);margin-left:62px;line-height:1.45;word-break:break-all;}
.lb-fund{display:inline-flex;align-items:center;background:rgba(255,93,108,.12);padding:1px 6px;border-radius:3px;font-size:10px;font-weight:600;border:1px solid rgba(255,93,108,.3);}
.lb-fund.in{color:var(--danger);}
.lb-fund.out{color:var(--ok);background:rgba(95,207,155,.12);border-color:rgba(95,207,155,.3);}

.loading,.empty,.muted{color:var(--muted);}
.loading,.empty{padding:18px;text-align:center;font-size:13px;}

@media (max-width:1100px){
  .sec-lb-left{width:320px;flex-basis:320px;}
}
@media (max-width:860px){
  .sec-lb-layout{flex-direction:column;overflow:visible;}
  .sec-lb-left{width:100%;flex:none;max-height:46vh;}
  .sec-lb-right{overflow:visible;}
}
@media (max-width:480px){
  .lb-plate-stocks{max-height:220px;}
}
.data-table{width:100%;border-collapse:collapse;font-size:13.5px;}
.data-table thead th{text-align:left;padding:13px 16px;background:rgba(212,175,55,.06);
  color:var(--gold-soft);font-weight:600;font-size:12.5px;border-bottom:1px solid var(--line);white-space:nowrap;}
.data-table tbody td{padding:13px 16px;border-bottom:1px solid #f6f8fa;color:var(--text);}
.data-table tbody tr:last-child td{border-bottom:none;}
.data-table tbody tr:hover{background:#fafbfd;}
.data-table .empty{text-align:center;color:var(--muted);padding:30px;}
.data-table .num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;}
.data-table th.sortable{cursor:pointer;user-select:none;transition:background .15s;}
.data-table th.sortable:hover{background:rgba(212,175,55,.14);}
.data-table th.sortable.active{color:var(--gold);}
.pct{font-variant-numeric:tabular-nums;font-weight:600;}
.pct.up{color:#dc2626;}      /* 涨：红 */
.pct.down{color:#0ca678;}    /* 跌：绿 */
.pct.flat{color:var(--muted);}
.col-ops{width:1%;white-space:nowrap;text-align:right;}
.col-weight{width:120px;}
.col-enable{width:90px;text-align:center;}
.row-ops{display:flex;gap:8px;justify-content:flex-end;}
.tag{display:inline-block;padding:2px 9px;border-radius:20px;font-size:11.5px;border:1px solid var(--line);}
.tag-admin{color:var(--gold-soft);background:rgba(212,175,55,.12);}
.tag-user{color:var(--blue);background:rgba(61,169,252,.12);}
.tag-expired{color:var(--danger);background:rgba(255,93,108,.12);}
.muted{color:var(--muted);}

/* 策略 */
.strategy-layout{display:grid;grid-template-columns:1fr 360px;gap:20px;align-items:start;}
.strategy-actions{display:flex;align-items:center;gap:12px;}
.weight-total{font-size:13px;color:var(--muted);}
.weight-total.ok{color:var(--ok);}
.weight-total.bad{color:var(--danger);}
.w-input{width:78px;height:34px;padding:0 8px;border-radius:8px;border:1px solid var(--line);
  background:#f7f9fb;color:var(--text);text-align:center;font-size:14px;outline:none;}
.w-input:focus{border-color:var(--gold);}
.cat-cell{font-weight:600;color:var(--gold-soft);white-space:nowrap;}
.desc-cell{color:var(--muted);font-size:12.5px;max-width:340px;}
.switch{position:relative;display:inline-block;width:42px;height:23px;}
.switch input{opacity:0;width:0;height:0;}
.slider{position:absolute;inset:0;background:#dbe1e8;border-radius:20px;transition:.2s;cursor:pointer;}
.slider:before{content:"";position:absolute;width:17px;height:17px;left:3px;top:3px;background:#fff;border-radius:50%;transition:.2s;}
.switch input:checked + .slider{background:linear-gradient(135deg,#e2bd4d,#c19312);}
.switch input:checked + .slider:before{transform:translateX(19px);}
.chart-card{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-solid);padding:16px;}
.chart-card h3{margin:0 0 12px;font-size:14px;color:var(--gold-soft);}
.chart-box{width:100%;height:420px;}

/* 弹窗 */
.modal-mask{position:fixed;inset:0;background:rgba(15,23,42,.45);backdrop-filter:blur(3px);
  display:flex;align-items:center;justify-content:center;z-index:5000;padding:24px;overflow:auto;}
.modal{width:440px;max-width:94vw;max-height:calc(100vh - 48px);margin:auto;
  background:var(--panel-solid);border:1px solid var(--line);
  border-radius:16px;box-shadow:var(--shadow);overflow:hidden;animation:pop .2s ease;
  display:flex;flex-direction:column;}
@keyframes pop{from{opacity:0;transform:scale(.96);}to{opacity:1;transform:none;}}
.modal-head{flex:none;padding:18px 22px;border-bottom:1px solid var(--line);font-size:16px;font-weight:600;color:var(--gold-soft);}
.modal-body{flex:1 1 auto;min-height:0;padding:22px;display:flex;flex-direction:column;gap:16px;overflow-y:auto;}
.modal-foot{flex:none;padding:16px 22px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:10px;}
.modal .field{margin-bottom:0;}

/* toast */
.toast-root{position:fixed;top:22px;left:50%;transform:translateX(-50%);z-index:9000;
  display:flex;flex-direction:column;gap:10px;align-items:center;}
.toast{padding:11px 18px;border-radius:10px;font-size:13.5px;background:var(--panel-solid);
  border:1px solid var(--line);box-shadow:var(--shadow);animation:slidein .25s ease;}
.toast.ok{border-color:rgba(51,214,159,.5);color:var(--ok);}
.toast.err{border-color:rgba(255,93,108,.5);color:#dc2626;}
.toast.info{color:var(--gold-soft);}
@keyframes slidein{from{opacity:0;transform:translateY(-10px);}to{opacity:1;transform:none;}}

/* .app-footer removed — disclaimer moved into sidebar side-foot */

/* Client 管理（下游 MCP 接入） */
.mcp-badge{padding:6px 13px;border-radius:20px;font-size:13px;border:1px solid var(--line);}
.mcp-badge.ok{color:var(--ok);background:rgba(51,214,159,.12);border-color:rgba(51,214,159,.35);}
.mcp-badge.bad{color:var(--danger);background:rgba(255,93,108,.12);border-color:rgba(255,93,108,.35);}
.mcp-badge.muted{color:var(--muted);}

.mcp-config{display:grid;grid-template-columns:repeat(2,1fr);gap:10px 24px;padding:16px 18px;
  border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-solid);margin-bottom:18px;}
.mcp-config-row{display:flex;align-items:center;gap:10px;font-size:13px;}
.mcp-k{color:var(--muted);min-width:64px;}
.mcp-v{color:var(--text);font-weight:500;}
.mcp-v.mcp-url{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;word-break:break-all;}
.mcp-v.ok{color:var(--ok);}
.mcp-v.bad{color:var(--danger);}

.client-toolbar{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-bottom:18px;}
.client-search{flex:1;min-width:240px;height:42px;padding:0 14px;border-radius:10px;border:1px solid var(--line);
  background:#f7f9fb;color:var(--text);font-size:14px;outline:none;transition:.2s;}
.client-search:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(212,175,55,.15);}
.client-cats{display:flex;flex-wrap:wrap;gap:8px;}
.cat-chip{padding:7px 14px;border-radius:20px;border:1px solid var(--line);background:#fafbfd;
  color:var(--muted);font-size:12.5px;transition:.18s;}
.cat-chip:hover{color:var(--text);border-color:var(--gold);}
.cat-chip.active{color:var(--gold-soft);background:linear-gradient(135deg,rgba(212,175,55,.16),rgba(123,92,255,.12));
  border-color:var(--line);}
.cat-chip.hot{color:#92600a;border-color:rgba(212,175,55,.45);background:linear-gradient(135deg,rgba(212,175,55,.12),rgba(184,134,11,.06));
  font-weight:600;}
.cat-chip.hot:hover{color:#fff;border-color:var(--gold);}

.client-catalog{display:flex;flex-direction:column;gap:22px;}
.client-cat-head{display:flex;align-items:center;gap:10px;margin-bottom:12px;padding-bottom:8px;
  border-bottom:1px solid rgba(212,175,55,.12);}
.client-cat-ico{font-size:17px;}
.client-cat-name{font-size:15px;font-weight:600;color:var(--gold-soft);}
.client-cat-count{font-size:12px;color:var(--muted);}
.client-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:14px;}
.api-card{border:1px solid var(--line);border-radius:13px;background:var(--panel-solid);padding:15px 16px;
  display:flex;flex-direction:column;gap:9px;transition:.18s;}
.api-card:hover{border-color:rgba(212,175,55,.4);box-shadow:0 8px 26px rgba(15,23,42,.10);transform:translateY(-2px);}
.api-card-top{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.api-name{font-size:14.5px;font-weight:600;}
.api-tool{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;color:var(--blue);
  background:rgba(61,169,252,.1);padding:2px 8px;border-radius:6px;align-self:flex-start;}
.api-desc{color:var(--muted);font-size:12.5px;line-height:1.6;}
.api-card-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:2px;}
.api-note{font-size:11.5px;color:var(--warn);}
.api-badge.hot{display:inline-flex;align-items:center;gap:2px;margin-left:8px;padding:1px 8px;border-radius:999px;
  font-size:11px;font-weight:700;color:#1a1206;white-space:nowrap;
  background:linear-gradient(135deg,#f7d774,#d4af37);
  border:1px solid rgba(247,215,116,.8);
  box-shadow:0 0 0 1px rgba(212,175,55,.5),0 2px 8px rgba(212,175,55,.35);}
.api-card.hot{border-color:rgba(212,175,55,.55);
  background:linear-gradient(180deg,rgba(212,175,55,.08),#ffffff);
  box-shadow:0 0 0 1px rgba(212,175,55,.22),0 8px 28px rgba(184,134,11,.2);}
.api-card.hot .api-name{color:var(--gold-soft);}

.tag-free{color:var(--ok);background:rgba(51,214,159,.12);border-color:rgba(51,214,159,.3);}
.tag-points{color:var(--warn);background:rgba(255,180,84,.12);border-color:rgba(255,180,84,.3);}
.tag-special{color:var(--muted);background:#f1f4f7;}
.client-empty{padding:40px;text-align:center;color:var(--muted);border:1px dashed var(--line);border-radius:13px;}
.mcp-note{margin-top:20px;font-size:12px;color:var(--muted);line-height:1.7;padding:12px 14px;
  border-left:3px solid rgba(212,175,55,.4);background:rgba(212,175,55,.05);border-radius:0 10px 10px 0;}

/* 调试弹窗 */
.dbg-modal{width:720px;max-width:96vw;}
.dbg-body{gap:14px;}
.dbg-sec{display:flex;flex-direction:column;gap:7px;}
.dbg-sec-title{font-size:12.5px;color:var(--gold-soft);font-weight:600;}
.dbg-code{margin:0;padding:12px 14px;border-radius:10px;background:#f1f4f8;
  border:1px solid var(--line);color:#334155;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:12px;line-height:1.55;max-height:300px;overflow:auto;white-space:pre-wrap;word-break:break-all;}
.dbg-args{margin:0;padding:12px 14px;border-radius:10px;border:1px solid var(--line);
  background:#f1f4f8;color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:12px;line-height:1.55;min-height:96px;resize:vertical;outline:none;}
.dbg-args:focus{border-color:var(--gold);}
.dbg-res{color:var(--ok);}
.dbg-raw{color:var(--muted);}
.dbg-status{font-size:12.5px;color:var(--muted);padding:6px 0;}
.dbg-status.ok{color:var(--ok);}
.dbg-status.bad{color:var(--danger);}

@media (max-width:1100px){
  .strategy-layout{grid-template-columns:1fr;}
  .chart-box{height:300px;}
  .mcp-config{grid-template-columns:1fr;}
  .client-grid{grid-template-columns:1fr;}
}

/* ---------- 股池管理 ---------- */
.pool-block{background:var(--panel,#ffffff);border:1px solid #e5e9f0;border-radius:12px;padding:16px 18px;margin-top:18px;}
.pool-head{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:12px;}
.pool-title{display:flex;align-items:baseline;gap:10px;}
.pool-name{font-size:16px;font-weight:600;color:#1e293b;}
.pool-count{font-size:13px;color:#a16207;background:rgba(231,201,105,.12);border:1px solid rgba(231,201,105,.3);border-radius:999px;padding:1px 10px;}
.pool-meta{display:flex;gap:18px;font-size:12px;color:#64748b;}
.pool-meta span{white-space:nowrap;}
.pool-head .btn{margin-left:auto;}
.src-tags{display:flex;flex-wrap:wrap;gap:4px;}
.src-tag{font-size:11px;padding:1px 7px;border-radius:6px;white-space:nowrap;cursor:default;display:inline-flex;align-items:center;gap:4px;}
.src-tag .src-day{font-size:10px;opacity:.85;font-weight:500;}

/* 股池二级 Tab */
.subtabs{display:flex;gap:8px;margin:16px 0 4px;}
.subtab{background:#f6f8fa;border:1px solid #e5e9f0;color:var(--muted,#64748b);
  font-size:13px;padding:8px 18px;border-radius:10px;cursor:pointer;transition:all .15s;}
.subtab:hover{border-color:rgba(231,201,105,.4);color:var(--text,#1e293b);}
.subtab.active{background:linear-gradient(135deg,rgba(231,201,105,.18),rgba(124,92,255,.18));
  border-color:rgba(231,201,105,.55);color:#fff;font-weight:600;}

/* 搜索条：按代码/名称实时过滤股池 */
.pool-search-bar{display:flex;align-items:center;gap:8px;margin:8px 0 4px;position:relative;}
.pool-search-bar .pool-search-ico{position:absolute;left:12px;font-size:13px;opacity:.55;pointer-events:none;}
.pool-search-bar #pool-search-input{flex:1 1 auto;min-width:0;background:#ffffff;
  border:1px solid rgba(124,92,255,.22);border-radius:10px;color:var(--text,#1e293b);
  font-size:13px;padding:9px 32px 9px 34px;outline:none;transition:border-color .15s,box-shadow .15s;}
.pool-search-bar #pool-search-input::placeholder{color:var(--muted,#64748b);}
.pool-search-bar #pool-search-input:focus{border-color:rgba(124,92,255,.6);
  box-shadow:0 0 0 3px rgba(124,92,255,.15);}
.pool-search-bar .pool-search-clear{position:absolute;right:8px;border:none;background:transparent;
  color:var(--muted,#64748b);font-size:13px;cursor:pointer;padding:4px 6px;line-height:1;border-radius:6px;}
.pool-search-bar .pool-search-clear:hover{color:#fff;background:#e5e9f0;}

/* 规则说明区：默认折叠，减少首屏占用 */
.pool-rules{background:rgba(124,92,255,.05);border:1px solid rgba(124,92,255,.15);border-radius:12px;
  padding:12px 16px;margin:8px 0 6px;font-size:12.5px;line-height:1.6;color:#334155;}
.pool-rules.rules-open{background:rgba(124,92,255,.09);border-color:rgba(124,92,255,.28);}
.rules-head{display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer;}
.rules-head h4{margin:0;font-size:14px;color:#a16207;font-weight:600;}
.rules-summary{margin:3px 0 0;font-size:12px;color:var(--muted,#64748b);}
.rules-body{margin-top:8px;}
.rules-body ul.compact{margin:0;padding-left:18px;}
.rules-body ul.compact li{margin:4px 0;}
.pool-rules b{color:#1e293b;}

/* 股池空数据时的诊断摘要 */
.inline-diag{background:rgba(255,93,108,.06);border:1px solid rgba(255,93,108,.2);border-radius:12px;
  padding:14px 16px;margin:10px 0 6px;font-size:13px;line-height:1.7;color:#334155;}
.inline-diag-title{font-size:15px;font-weight:700;color:#dc2626;margin-bottom:8px;}
.inline-diag-row{margin:4px 0;}
.inline-diag-section{font-size:13px;font-weight:600;color:#a16207;margin:12px 0 6px;border-top:1px solid #e5e9f0;padding-top:8px;}
.inline-diag-actions{display:flex;gap:10px;margin-top:14px;}
.diag-ok{color:#0ca678;font-weight:600;}
.diag-err{color:#dc2626;font-weight:600;}
.diag-issue{margin:4px 0;padding:6px 10px;background:rgba(255,93,108,.08);border-radius:8px;font-size:12.5px;}
.inline-diag-advice{margin:10px 0;padding:8px 12px;background:rgba(255,122,69,.12);border:1px solid rgba(255,122,69,.35);border-radius:8px;color:#c2410c;font-size:12.5px;line-height:1.6;}
.raw-cell{max-width:320px;font-size:12px;}
.diag-raw{display:block;color:#64748b;font-family:ui-monospace,Menlo,Consolas,monospace;white-space:pre-wrap;word-break:break-all;}

/* 分页 */
.pager{display:flex;align-items:center;gap:14px;justify-content:flex-end;margin-top:12px;font-size:13px;color:var(--muted,#64748b);}
.pager-top{margin-top:0;margin-bottom:10px;}
.pg-btn{background:#f3f5f8;border:1px solid #dde3ea;color:var(--text,#1e293b);
  padding:6px 14px;border-radius:8px;cursor:pointer;transition:all .15s;}
.pg-btn:hover:not(:disabled){border-color:rgba(231,201,105,.45);}
.pg-btn:disabled{opacity:.4;cursor:not-allowed;}

/* 股池多标签筛选条：来源/因子垂直排列，因子中文名允许折行 */
.filter-bar{display:flex;flex-direction:column;align-items:stretch;gap:10px;margin:0 0 12px;
  padding:10px 14px;border:1px solid var(--line);border-radius:var(--radius);background:#fbfcfe;}
.filter-group{display:flex;align-items:flex-start;gap:10px;flex-wrap:wrap;}
.filter-label{font-size:12.5px;color:var(--muted);white-space:nowrap;padding-top:5px;min-width:36px;}
.filter-bar .chips{display:flex;flex-wrap:wrap;gap:8px;}
.filter-chip{cursor:pointer;font-size:12.5px;padding:4px 12px;border-radius:999px;
  border:1px solid var(--c, #7b5cff);color:var(--c, #7b5cff);background:transparent;
  transition:all .15s;white-space:nowrap;line-height:1.35;}
.filter-bar .factor-chips .filter-chip{white-space:normal;text-align:center;max-width:110px;}
.filter-chip:hover{background:color-mix(in srgb, var(--c, #7b5cff) 14%, transparent);}
.filter-chip.active{background:var(--c, #7b5cff);color:#0d1117;font-weight:600;border-color:var(--c, #7b5cff);}
.clear-filter-btn{cursor:pointer;font-size:12px;padding:4px 12px;border-radius:999px;margin-left:auto;
  border:1px solid var(--danger, #dc2626);color:var(--danger, #dc2626);background:transparent;transition:all .15s;}
.clear-filter-btn:hover{background:rgba(255,93,108,.12);}
/* 因子组内为交集筛选：选中 N 个因子时，在筛选条右侧提示「交集·N」，表明须同时命中 */
.filter-mode{font-size:11px;color:var(--muted);align-self:center;padding:2px 8px;border-radius:999px;
  border:1px dashed color-mix(in srgb, var(--muted) 40%, transparent);white-space:nowrap;}
.pg-info{white-space:nowrap;}

/* 股池内容密度优化 */
.pool-content .data-table thead th{padding:9px 10px;font-size:12px;}
/* 行内统一垂直居中：命中标签列天然最高，其余列若顶部对齐会明显参差不齐 */
.pool-content .data-table tbody td{padding:7px 10px;font-size:12.5px;vertical-align:middle;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* 固定布局：名称/最新价/涨跌幅/最近支撑只给「够用」的宽度，剩余空间全部留给命中标签。
   width:auto 的列在 table-layout:fixed 下吸收所有剩余宽度。 */
.pool-content .data-table{table-layout:fixed;}
.pool-content .data-table thead th:nth-child(1){width:76px;}  /* 代码 */
.pool-content .data-table thead th:nth-child(2){width:88px;}  /* 名称 */
.pool-content .data-table thead th:nth-child(3){width:80px;}  /* 最新价 */
.pool-content .data-table thead th:nth-child(4){width:86px;}  /* 涨跌幅 */
.pool-content .data-table thead th:nth-child(5){width:120px;} /* 最近支撑 */
.pool-content .data-table thead th:nth-child(6){width:auto;}  /* 命中标签：吸收剩余空间 */
.pool-content .data-table thead th:nth-child(7){width:98px;}  /* 入池/驻留 */
/* 标签列要横向铺放多枚标签，放开不换行与省略约束 */
.pool-content .data-table .hit-tags-cell{white-space:normal;overflow:visible;}
.pool-content .data-table .hit-row{display:flex;flex-wrap:wrap;gap:4px;align-items:center;line-height:1.4;}
.pool-content .data-table .hit-row.hit-factors{margin-top:5px;padding-top:5px;border-top:1px dashed #e5e9f0;}
/* 超跌标签行：与来源/因子行同构，独立成行便于按强度维度快速扫读 */
.pool-content .data-table .hit-row.hit-oversold{margin-top:5px;padding-top:5px;border-top:1px dashed #e5e9f0;}
/* 「入选」标签行：记的是个股**入选当天**的定格因子标签（金色日期前缀以示区分），
   与上一行「实时因子标签」（当前状态）语义完全不同 —— 入选标签落定即冻结、按入选日累积不覆盖。
   ★=首次入池；「共N次」折叠其余历史入选记录，hover 看全部。 */
.pool-content .data-table .hit-row.hit-entry{margin-top:5px;padding-top:5px;border-top:1px dashed rgba(212,175,55,.18);}
.pool-content .data-table .entry-head{font-size:11.5px;color:var(--gold-soft);font-weight:600;letter-spacing:.2px;cursor:help;}
.pool-content .data-table .entry-star{color:var(--gold);margin-left:2px;}
.pool-content .data-table .entry-px,
.pool-content .data-table .entry-pct{font-style:normal;font-size:11px;color:var(--muted);margin-left:3px;font-weight:400;}
.pool-content .data-table .entry-more{margin-left:4px;font-size:11px;padding:1px 6px;border-radius:4px;
  background:rgba(212,175,55,.14);color:var(--gold-soft);border:1px solid rgba(212,175,55,.28);cursor:help;}
.pool-content .data-table .src-tag.risk-tag{font-weight:600;box-shadow:0 0 0 1px rgba(224,49,49,.25) inset;}
/* 「支撑位」列：主支撑（名称+价格+破位进度）置顶，其余命中支撑位在其下依次列出。
   此前只展示主支撑一个，8 个支撑因子里非主支撑的那些在页面上完全看不到。 */
.pool-content .data-table .sup-cell{white-space:nowrap;}
.pool-content .data-table .sup-name{display:flex;flex-direction:column;gap:3px;align-items:flex-start;}
.pool-content .data-table .sup-main{display:flex;flex-direction:column;gap:3px;align-items:flex-start;}
.pool-content .data-table .sup-line2{display:flex;align-items:center;gap:6px;}
.pool-content .data-table .sup-tag{font-size:11.5px;font-weight:600;padding:1px 8px;border-radius:4px;background:rgba(232,89,12,.16);color:#d9480f;}
.pool-content .data-table .sup-tag.sup-t-sup_ma60,
.pool-content .data-table .sup-tag.sup-t-sup_gap{background:rgba(28,126,214,.16);color:#1971c2;}
.pool-content .data-table .sup-price{font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--text);}
.pool-content .data-table .sup-days{font-size:10.5px;padding:1px 6px;border-radius:999px;white-space:nowrap;}
.pool-content .data-table .sup-days.sup-hold{background:rgba(95,207,155,.16);color:#0ca678;}
.pool-content .data-table .sup-days.sup-warn{background:rgba(231,201,105,.18);color:var(--gold-soft);}
.pool-content .data-table .sup-days.sup-broken{background:rgba(224,49,49,.2);color:#dc2626;}
/* 其余命中支撑位：小号 chip，破折号分隔「名称 价格 距现价」 */
.pool-content .data-table .sup-rest{display:flex;flex-wrap:wrap;gap:3px 5px;margin-top:2px;}
.pool-content .data-table .sup-item{font-size:10.5px;padding:0 5px;border-radius:3px;white-space:nowrap;
  background:#f6f8fa;border:1px solid #e5e9f0;color:var(--muted);
  display:inline-flex;align-items:center;gap:4px;line-height:1.6;}
.pool-content .data-table .sup-item b{font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;}
.pool-content .data-table .sup-item i{font-style:normal;opacity:.75;font-variant-numeric:tabular-nums;}
/* 现价已贴近该支撑位（3% 以内）：这是最可能被测试到的位置，提亮以提示 */
.pool-content .data-table .sup-item.sup-near{border-color:rgba(231,201,105,.45);color:var(--gold-soft);
  background:rgba(231,201,105,.10);}

/* 因子标签：只两个色相（正向红 / 负向绿），强弱靠填充浓度递进 —— 深底 > 浅底 > 描边。
   取代此前每个因子一个专属色（21 种），形态库扩到 34 个后新因子无对应色、且难以扫读。
   三档**一律不反白、不加粗**：一行里并排 5~8 个实心块太抢眼，会把支撑位与涨跌幅压过去，
   短线圈票时视线应落在数据上，标签只做「有哪些因子」的索引。 */
.ftag{font-size:10px;padding:0 5px;border-radius:4px;white-space:nowrap;display:inline-flex;
  align-items:center;gap:3px;border:1px solid transparent;line-height:1.5;cursor:default;font-weight:400;}
.ftag i{font-style:normal;font-size:9px;opacity:.7;font-variant-numeric:tabular-nums;}
/* 正向：红系（A 股语境下红=看多） */
.ftag.tag-pos{--tc:#e03131;--tbg:rgba(255,107,107,.14);--tbg2:rgba(255,107,107,.26);}
/* 负向：绿系 */
.ftag.tag-neg{--tc:#2f9e44;--tbg:rgba(81,207,102,.14);--tbg2:rgba(81,207,102,.26);}
.ftag.tier-strong{background:var(--tbg2);color:var(--tc);border-color:color-mix(in srgb, var(--tc) 60%, transparent);}
.ftag.tier-mid{background:var(--tbg);color:var(--tc);border-color:color-mix(in srgb, var(--tc) 35%, transparent);}
.ftag.tier-weak{background:transparent;color:var(--tc);border-color:color-mix(in srgb, var(--tc) 25%, transparent);opacity:.85;}
/* 否决项（ST 退市风险 / 断头铡刀等）：命中即应排除，加外圈以区别于普通负向因子 */
.ftag.tag-veto{box-shadow:0 0 0 1px color-mix(in srgb, var(--tc) 55%, transparent);}
/* 空标签占位：三态区分「正常」与「需要动手」。
   此前所有空标签都是一个灰「—」，用户分不清「算过了没命中」和「本地没日K算不出来」，
   只能全池乱点刷新。现在：
     blank=灰（正常，无需处理） · warn=金（缺数据，要点按钮） · info=蓝灰（等外部条件）
   刻意做得比 .ftag 更轻 —— 占位不该和真实标签抢注意力。 */
.tag-blank{font-size:10px;padding:0 5px;border-radius:4px;white-space:nowrap;display:inline-flex;
  align-items:center;line-height:1.5;cursor:help;border:1px dashed transparent;font-weight:400;}
.tag-blank.blank{color:var(--muted);opacity:.7;border-color:color-mix(in srgb, var(--muted) 30%, transparent);}
.tag-blank.warn{color:var(--gold-soft);background:rgba(231,201,105,.10);
  border-color:color-mix(in srgb, var(--gold-soft) 45%, transparent);}
.tag-blank.info{color:var(--muted);background:#f6f8fa;
  border-color:color-mix(in srgb, var(--muted) 30%, transparent);}
/* 筛选条里的因子 chip 复用同一套 6 色，命中只数用小号数字角标 */
.filter-chip.ftag{font-size:11px;padding:1px 8px;border-radius:999px;cursor:pointer;}
.filter-chip.ftag.active{box-shadow:0 0 0 2px var(--text);}
.tags-meta{font-size:11.5px;color:var(--muted);cursor:default;}
.tags-meta.warn{color:var(--gold-soft);}
.tags-meta.stale{opacity:.75;}
.pool-content .data-table .src-tags{max-width:260px;}
.pool-content .pool-head{margin-bottom:8px;gap:12px;}
.pool-content .pool-meta{gap:14px;font-size:11.5px;}
.pool-content .pool-title{gap:8px;}
.pool-content .pool-name{font-size:15px;}
.pool-content .factor-col{max-width:180px;}

/* ============ 因子管理：短线因子目录 ============ */
.factor-tab{margin-top:4px;}
.factor-layout{display:flex;gap:18px;align-items:flex-start;margin-top:8px;}
.factor-nav{position:sticky;top:8px;flex:0 0 186px;display:flex;flex-direction:column;gap:2px;max-height:72vh;overflow:auto;
  padding:8px;border:1px solid var(--line);border-radius:var(--radius);background:#fbfcfe;}
.factor-nav-group{display:flex;flex-direction:column;}
/* 二级子类：左侧竖线 + 缩进，视觉上归属到上方的一级分类，不另占一条导航条目 */
.nav-subs{display:flex;flex-direction:column;margin:1px 0 4px 10px;padding-left:8px;border-left:1px solid var(--line);}
.factor-nav-item,.nav-sub-item{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 12px;border-radius:9px;
  border:1px solid transparent;background:transparent;color:var(--muted);cursor:pointer;text-align:left;transition:all .15s;}
.factor-nav-item{font-size:13.5px;}
.nav-sub-item{font-size:12.5px;padding:6px 10px;color:var(--muted);}
.factor-nav-item:hover,.nav-sub-item:hover{border-color:rgba(231,201,105,.35);color:var(--text);}
.factor-nav-item.active,.nav-sub-item.active{background:linear-gradient(135deg,rgba(231,201,105,.18),rgba(124,92,255,.18));
  border-color:rgba(231,201,105,.5);color:var(--text);}
.nav-sub-item.active{background:rgba(231,201,105,.10);border-color:rgba(231,201,105,.32);}
.factor-nav-item .nav-label,.nav-sub-item .nav-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.factor-nav-item .nav-count{font-size:11px;color:#0d1117;background:rgba(231,201,105,.85);border-radius:999px;padding:1px 8px;font-weight:600;}
.nav-sub-item .nav-count{font-size:10.5px;color:var(--muted);background:transparent;border:1px solid var(--line);
  border-radius:999px;padding:0 6px;font-weight:500;}
.factor-content{flex:1 1 auto;min-width:0;}
.factor-section{margin-bottom:22px;}
.factor-section-head{display:flex;align-items:center;gap:12px;margin:6px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--line);}
.factor-section-head h3{margin:0;font-size:16px;color:var(--text);}
.section-meta{font-size:12.5px;color:var(--muted);}
.hf-tag{color:var(--gold-soft);font-weight:600;}
.factor-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(284px,1fr));gap:14px;}
.factor-card{border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;background:rgba(255,255,255,.025);transition:all .15s;}
.factor-card:hover{border-color:rgba(231,201,105,.35);}
.factor-card.hf{border-color:rgba(231,201,105,.45);background:linear-gradient(180deg,rgba(231,201,105,.07),#fbfcfe);}
.fc-head{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:wrap;}
.fc-name{font-size:14.5px;font-weight:600;color:var(--text);}
.hf-badge{font-size:11px;font-weight:600;color:#0d1117;background:linear-gradient(135deg,#a16207,#D4AF37);border-radius:999px;padding:2px 9px;}
.validity{margin-left:auto;font-size:11.5px;padding:2px 9px;border-radius:999px;background:#f1f4f7;color:var(--muted);white-space:nowrap;}
.validity.v-高{background:rgba(95,207,155,.16);color:#0ca678;}
.validity.v-中{background:rgba(231,201,105,.16);color:var(--gold-soft);}
.validity.v-低{background:rgba(255,125,108,.14);color:#dc2626;}
/* 支撑强度分级徽章：由强到弱 红→橙→蓝→灰，与有效性标签区分（有效性用绿/金/红） */
.strength-badge{font-size:11.5px;font-weight:600;padding:2px 9px;border-radius:999px;white-space:nowrap;border:1px solid transparent;}
.strength-badge.s4{background:rgba(224,49,49,.18);color:#dc2626;border-color:rgba(224,49,49,.35);}
.strength-badge.s3{background:rgba(247,103,7,.18);color:#d9480f;border-color:rgba(247,103,7,.32);}
.strength-badge.s2{background:rgba(28,126,214,.18);color:#1971c2;border-color:rgba(28,126,214,.32);}
.strength-badge.s1{background:rgba(134,142,150,.16);color:#64748b;border-color:rgba(134,142,150,.28);}
/* 因子方向徽章（负向/否决）—— 必须与正向因子视觉区分。
   历史缺陷：竞价诱多「应规避」却与正向因子同色同权重加分，结论与设计意图完全相反。 */
.dir-badge{font-size:11.5px;font-weight:700;padding:2px 9px;border-radius:999px;white-space:nowrap;border:1px solid transparent;}
.dir-badge.dir-neg{background:rgba(224,49,49,.2);color:#dc2626;border-color:rgba(224,49,49,.45);}
.dir-badge.dir-veto{background:rgba(224,49,49,.32);color:#fff;border-color:rgba(224,49,49,.6);}
/* 因子状态徽章：reserved = 已定义但引擎当前未消费，提示调权重不会影响选股结果 */
.status-badge{font-size:11.5px;font-weight:600;padding:2px 9px;border-radius:999px;white-space:nowrap;
  background:rgba(134,142,150,.18);color:#64748b;border:1px dashed rgba(134,142,150,.45);}
/* 负向/否决因子整卡以红色左边框强调，避免与正向因子混淆 */
.factor-card.neg{border-left:3px solid rgba(224,49,49,.55);}
.fc-desc{font-size:12.5px;line-height:1.6;color:#334155;margin:5px 0;}
.fc-desc b{color:var(--text);font-weight:600;}
/* 形态因子完整说明（docs/06）：二级子类分段 + 折叠文档区块 */
.factor-subsection{margin-bottom:16px;}
.factor-subsection:last-child{margin-bottom:0;}
.factor-sub-head{display:flex;align-items:center;gap:10px;margin:0 0 10px;}
.factor-sub-head h4{margin:0;font-size:13.5px;font-weight:600;color:var(--gold-soft);
  padding-left:9px;border-left:3px solid rgba(212,175,55,.5);}
.fc-docs{margin-top:8px;border-top:1px dashed #e5e9f0;padding-top:8px;}
.fc-docs summary{cursor:pointer;font-size:12px;color:var(--muted);list-style:none;user-select:none;}
.fc-docs summary::-webkit-details-marker{display:none;}
.fc-docs summary:before{content:'▸ ';color:var(--gold-soft);}
.fc-docs[open] summary:before{content:'▾ ';}
.fc-docs summary:hover{color:var(--text);}
.fc-docs-body{margin-top:8px;display:flex;flex-direction:column;gap:6px;
  background:#f3f6f9;border-radius:8px;padding:9px 11px;}
.doc-row{font-size:12px;line-height:1.65;color:#334155;}
.doc-row b{color:var(--text);font-weight:600;}
.doc-meta{margin-top:2px;padding-top:6px;border-top:1px dashed #eef1f5;
  font-size:11px;color:var(--muted);line-height:1.6;}
.fc-foot{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:10px;padding-top:10px;border-top:1px dashed #e5e9f0;}
.fc-w{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--muted);}
.fc-w input{width:64px;}
.fc-toggle{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--muted);}
.w-input{width:72px;padding:5px 8px;border-radius:8px;border:1px solid var(--line);background:#f7f9fb;color:var(--text);font-size:13px;}
.factor-status{margin:6px 0 4px;font-size:13px;color:var(--muted);min-height:20px;}
.factor-status .prog{color:var(--gold-soft);font-weight:600;}
.factor-status .err{color:#dc2626;}
.weight-chart{width:100%;height:240px;margin:4px 0 10px;}
.switch.sm{transform:scale(.82);transform-origin:left center;}
.cat-cell{color:var(--gold-soft);font-weight:600;white-space:nowrap;}
.desc-cell{color:var(--muted);max-width:360px;}

/* 统一因子卡片：紧凑权重小字（仅三度维度显示） */
.fc-w.chip{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);margin-right:auto;}
.fc-w.chip .w-sm{width:52px;padding:2px 4px;font-size:12px;background:#f6f8fa;border:1px solid var(--line);border-radius:6px;color:var(--text);}
.w-sm{width:60px;}
.fc-foot{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:10px;padding-top:10px;border-top:1px solid #f3f5f8;}

/* 打分引擎权重侧滑面板 */
.weight-panel{position:fixed;top:0;right:0;width:340px;max-width:92vw;height:100vh;z-index:60;
  background:#ffffff;border-left:1px solid rgba(231,201,105,.25);box-shadow:-12px 0 40px rgba(15,23,42,.10);
  display:flex;flex-direction:column;padding:18px 18px 14px;backdrop-filter:blur(6px);}
.weight-panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px;}
.weight-panel-head h3{margin:0;font-size:16px;color:var(--text);}
.weight-panel-body{flex:1 1 auto;overflow:auto;display:flex;flex-direction:column;gap:12px;padding-right:4px;}
.weight-panel-foot{padding-top:12px;border-top:1px solid #e5e9f0;margin-top:8px;}
.wp-row{display:flex;align-items:center;gap:10px;}
.wp-name{flex:0 0 76px;font-size:13px;color:var(--text);}
.wp-bar{flex:1 1 auto;height:8px;border-radius:999px;background:#f1f4f7;overflow:hidden;}
.wp-bar i{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,#7b5cff,#D4AF37);}
.wp-row .w-sm{width:56px;text-align:center;}

/* 股池配置条（最大驻留天数可视化配置 + 操作按钮） */
.pool-config-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:2px 0 16px;
  padding:11px 14px;border:1px solid var(--line);border-radius:var(--radius);
  background:#ffffff;backdrop-filter:blur(6px);}
.cfg-item{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--muted);white-space:nowrap;}
.cfg-item input{width:74px;height:34px;padding:0 10px;border-radius:8px;border:1px solid var(--line);
  background:#f7f9fb;color:var(--text);font-size:13px;}
.cfg-item input:focus{outline:none;border-color:var(--gold);}

/* ============================================================
   策略回测模块（docs/08）
   样式纪律：颜色一律走 :root 变量；金调透明层沿用 rgba(212,175,55,x)
   与文件上半部保持一致（背景/描边/分割线）。
   ============================================================ */

/* 小型按钮：回测模块表格内、工具条里按钮密集，默认 .btn 太大 */
.btn-xs{padding:4px 10px;font-size:12px;border-radius:7px;}

/* 风险提示：需求要求「每页顶部显著展示」 */
.bt-risk{display:inline-block;padding:7px 13px;border-radius:9px;font-size:12px;line-height:1.5;
  color:var(--warn);background:rgba(255,192,107,.10);border:1px solid rgba(255,192,107,.32);
  max-width:420px;white-space:normal;}

/* ---- Tab 条 ---- */
.bt-tabs-bar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:16px;
  padding-bottom:12px;border-bottom:1px solid var(--line);}
.bt-tabs{display:flex;gap:8px;flex-wrap:wrap;}
.bt-tab{padding:7px 16px;border-radius:9px;font-size:13px;
  border:1px solid var(--line);background:#f6f8fa;color:var(--muted);transition:.18s;}
.bt-tab:hover{border-color:var(--gold);color:var(--gold-soft);}
.bt-tab.active{background:linear-gradient(135deg,#e2bd4d,#c19312);border-color:transparent;
  color:#1a1405;font-weight:700;}
.bt-running{padding:5px 12px;border-radius:20px;font-size:12px;
  color:var(--ok);background:rgba(95,207,155,.12);border:1px solid rgba(95,207,155,.35);}

.bt-pane{animation:fade .25s ease;}

/* 策略组合：左列表 + 右编辑器 */
.bt-split{display:grid;grid-template-columns:300px 1fr;gap:18px;align-items:start;}
.bt-pane-col{min-width:0;}

/* ---- 通用块 ---- */
.bt-subhead{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 10px;}
.bt-subhead>span{font-size:14px;font-weight:600;color:var(--gold-soft);}
.bt-subhead input[type=date]{height:30px;padding:0 8px;border-radius:7px;border:1px solid var(--line);
  background:#f7f9fb;color:var(--text);font-size:12px;}

.bt-empty{padding:26px 18px;text-align:center;color:var(--muted);font-size:13px;
  border:1px dashed var(--line);border-radius:12px;background:#f5f7fa;}
.bt-hint{font-size:12px;line-height:1.7;color:var(--muted);}
.bt-card{border:1px solid var(--line);border-radius:var(--radius);background:#ffffff;
  padding:14px 16px;margin-bottom:16px;backdrop-filter:blur(6px);}
.bt-card-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  font-size:14px;font-weight:600;color:var(--gold-soft);margin-bottom:12px;}
.bt-card-head .bt-hint{font-weight:400;}

/* 提示条：ok / warn / err 三态 */
.bt-alert{padding:10px 13px;border-radius:10px;font-size:12.5px;line-height:1.7;margin-bottom:12px;
  border:1px solid var(--line);background:#fafbfd;color:var(--text);}
.bt-alert.ok{color:var(--ok);background:rgba(95,207,155,.10);border-color:rgba(95,207,155,.30);}
.bt-alert.warn{color:var(--warn);background:rgba(255,192,107,.10);border-color:rgba(255,192,107,.30);}
.bt-alert.err{color:var(--danger);background:rgba(255,125,108,.10);border-color:rgba(255,125,108,.32);}
.bt-alert b{color:inherit;}
.bt-alert .bt-hint{margin-top:4px;}

.bt-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px;}
.bt-params{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:12px;
  padding:11px 14px;border:1px solid var(--line);border-radius:12px;background:#ffffff;}
.bt-ic-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:12px 0;}

/* 参数里的 select 补样式（.cfg-item 只定义了 input） */
.bt-params .cfg-item select,.bt-ic-bar .cfg-item select{height:34px;padding:0 8px;border-radius:8px;
  border:1px solid var(--line);background:#f7f9fb;color:var(--text);font-size:13px;}
.bt-params .cfg-item select:focus,.bt-ic-bar .cfg-item select:focus{outline:none;border-color:var(--gold);}

/* ---- 表单 ---- */
.bt-form{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-bottom:12px;}
.bt-field{display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--muted);min-width:0;}
.bt-field.wide{grid-column:1 / -1;}
.bt-field input{height:34px;padding:0 10px;border-radius:8px;border:1px solid var(--line);
  background:#f7f9fb;color:var(--text);font-size:13px;}
.bt-field input:focus{outline:none;border-color:var(--gold);box-shadow:0 0 0 3px rgba(212,175,55,.15);}

/* 持有期多选 */
.bt-holdings{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px;}
.bt-label{font-size:12px;color:var(--muted);}
.bt-chip{display:inline-flex;align-items:center;gap:5px;padding:5px 11px;border-radius:20px;
  font-size:12px;color:var(--muted);border:1px solid var(--line);background:#fafbfd;cursor:pointer;}
.bt-chip input{margin:0;accent-color:var(--gold);}
.bt-chip.active{color:var(--gold-soft);border-color:var(--gold);background:rgba(212,175,55,.14);}
.bt-weight-sum{font-size:12px;color:var(--muted);margin-bottom:10px;}
.bt-weight-sum b{color:var(--text);}

/* ---- 因子勾选树 ---- */
.bt-ftree{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:12px;margin-bottom:16px;}
.bt-fgroup{border:1px solid var(--line);border-radius:11px;overflow:hidden;background:#f3f6f9;}
.bt-fgroup-head{display:flex;align-items:center;justify-content:space-between;
  padding:8px 12px;font-size:12.5px;font-weight:600;color:var(--gold-soft);
  background:rgba(212,175,55,.07);border-bottom:1px solid var(--line);}
.bt-fgroup-head i{font-style:normal;font-size:11.5px;color:var(--muted);font-weight:400;}
.bt-fgroup-body{max-height:280px;overflow:auto;}
.bt-frow{display:grid;grid-template-columns:1fr 64px 62px;align-items:center;gap:8px;
  padding:6px 12px;border-bottom:1px solid #f6f8fa;}
.bt-frow:last-child{border-bottom:none;}
.bt-frow.on{background:rgba(212,175,55,.06);}
/* 不可回测的因子：整行压暗，让用户一眼知道「选了也不会进打分」 */
.bt-frow.disabled{opacity:.42;}
.bt-fchk{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--text);
  min-width:0;cursor:pointer;}
.bt-fchk input{margin:0;accent-color:var(--gold);flex:0 0 auto;}
.bt-fname{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bt-lock{font-size:10.5px;color:var(--danger);grid-column:1 / -1;margin-top:-2px;}
.bt-fw,.bt-fdir{height:28px;padding:0 6px;border-radius:7px;border:1px solid var(--line);
  background:#f7f9fb;color:var(--text);font-size:12px;min-width:0;}
.bt-fw:focus,.bt-fdir:focus{outline:none;border-color:var(--gold);}

/* ---- 策略卡片 ---- */
.bt-scard{border:1px solid var(--line);border-radius:12px;padding:12px 13px;margin-bottom:10px;
  background:#ffffff;cursor:pointer;transition:.18s;}
.bt-scard:hover{border-color:var(--gold);}
.bt-scard.active{border-color:var(--gold);box-shadow:0 0 0 2px rgba(212,175,55,.18);}
.bt-scard-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px;}
.bt-sname{font-size:13.5px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bt-smeta{display:flex;gap:10px;flex-wrap:wrap;font-size:11.5px;color:var(--muted);margin-bottom:6px;}
.bt-srun{font-size:11.5px;color:var(--text);margin-bottom:9px;line-height:1.5;}
.bt-srun.muted{color:var(--muted);}
.bt-sops{display:flex;gap:6px;flex-wrap:wrap;}
.bt-pqs{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:22px;
  padding:0 7px;border-radius:11px;font-size:11.5px;font-weight:700;}
.bt-pqs.ok{color:var(--ok);background:rgba(95,207,155,.14);border:1px solid rgba(95,207,155,.38);}
.bt-pqs.warn{color:var(--warn);background:rgba(255,192,107,.14);border:1px solid rgba(255,192,107,.38);}
.bt-pqs.bad{color:var(--danger);background:rgba(255,125,108,.14);border:1px solid rgba(255,125,108,.38);}
/* AI 选股模块区块小标题 */
.ap-sub{margin:22px 0 10px;font-size:15px;font-weight:600;color:var(--gold-soft);border-left:3px solid var(--gold);padding-left:10px;}
.ap-detail td{padding:0 !important;background:#f3f6f9;}
.ap-pick-row{cursor:pointer;}
.ap-pick-row:hover{background:#f3f5f8;}
/* AI 选股 · 策略编辑弹窗 */
.ap-form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px 18px;margin-bottom:6px;}
.ap-field{display:flex;flex-direction:column;gap:5px;}
.ap-field-label{font-size:12px;color:var(--muted);}
.ap-weight-sum{margin:4px 0 10px;font-size:13px;font-weight:600;color:var(--danger);}
.ap-factor-list{display:flex;flex-direction:column;gap:8px;max-height:240px;overflow:auto;padding:4px 0;}
.ap-factor-row{display:flex;align-items:center;gap:10px;background:#fafbfd;border:1px solid var(--line);border-radius:9px;padding:7px 10px;}
.ap-factor-name{flex:1;font-size:13px;color:var(--text);}
.ap-add-row{display:flex;gap:10px;margin-top:10px;}

/* ---- 预置模板 ---- */
.bt-templates{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;margin-bottom:14px;}
.bt-tcard{border:1px solid var(--line);border-radius:11px;padding:12px 13px;background:#f3f6f9;
  display:flex;flex-direction:column;gap:7px;}
.bt-tname{font-size:13.5px;font-weight:600;color:var(--gold-soft);}
.bt-tdesc{font-size:12px;line-height:1.6;color:var(--muted);flex:1 1 auto;}
.bt-tmeta{font-size:11.5px;color:var(--muted);}

/* ---- 打分预览 ---- */
.bt-preview{margin-top:8px;}
.bt-pv-meta{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--muted);margin-bottom:10px;}
.bt-attrs{display:flex;gap:5px;flex-wrap:wrap;max-width:420px;}
.bt-attr{display:inline-flex;align-items:center;gap:4px;padding:2px 7px;border-radius:6px;font-size:11px;
  border:1px solid var(--line);background:rgba(212,175,55,.07);color:var(--text);cursor:help;}
.bt-attr i{font-style:normal;font-weight:600;color:var(--gold-soft);}
.bt-warn-inline{color:var(--warn);cursor:help;}
.bt-ok{color:var(--ok);}
.bt-bad{color:var(--danger);}
.bt-st{display:inline-block;margin-left:5px;padding:1px 5px;border-radius:5px;font-size:10px;
  color:var(--warn);background:rgba(255,192,107,.14);border:1px solid rgba(255,192,107,.34);}
.bt-mini{font-size:10.5px;color:var(--muted);}

/* ---- 进度条 ---- */
.bt-progress{margin:10px 0 14px;}
.bt-prog-text{font-size:12px;color:var(--muted);margin-bottom:6px;}
.bt-prog-bar{height:7px;border-radius:999px;background:#eef1f5;overflow:hidden;}
.bt-prog-bar i{display:block;height:100%;border-radius:999px;
  background:linear-gradient(90deg,var(--gold-deep),var(--gold));transition:width .3s ease;}
.bt-sample-warn{font-size:12px;line-height:1.7;margin-bottom:12px;}

/* ---- IC 表：分层收益条 ---- */
.bt-layers{min-width:150px;}
.bt-layerbar{display:flex;align-items:flex-end;gap:3px;height:34px;}
.bt-lb{display:flex;flex-direction:column;align-items:center;justify-content:flex-end;flex:1 1 0;height:100%;cursor:help;}
.bt-lb i{display:block;width:100%;border-radius:2px 2px 0 0;min-height:2px;}
.bt-lb i.up{background:var(--danger);}
.bt-lb i.down{background:var(--ok);}
.bt-lb i.flat{background:var(--muted);}
.bt-lb b{font-size:9px;font-weight:400;color:var(--muted);margin-top:2px;}
.bt-fid{font-size:10.5px;color:var(--muted);font-weight:400;}

/* 显著性 / 最优值高亮 */
.bt-sig{background:rgba(95,207,155,.13);font-weight:600;}
.bt-cell-best{background:rgba(212,175,55,.16);font-weight:700;color:var(--gold-soft);}
.bt-hl{background:rgba(212,175,55,.09);}
.bt-star{color:var(--gold);}

/* 涨绿跌红只作用于本模块，避免影响股池页既有的 .pct.up/.pct.down */
.bt-pane .up{color:var(--danger);}
.bt-pane .down{color:var(--ok);}
.bt-pane .flat{color:var(--muted);}
.bt-pane .num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;}

/* ---- 回测结果 ---- */
.bt-verdict{border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;margin-bottom:16px;
  background:#ffffff;backdrop-filter:blur(6px);}
.bt-verdict.ok{border-color:rgba(95,207,155,.42);background:rgba(95,207,155,.09);}
.bt-verdict.warn{border-color:rgba(255,192,107,.42);background:rgba(255,192,107,.09);}
.bt-verdict.err{border-color:rgba(255,125,108,.42);background:rgba(255,125,108,.09);}
.bt-vhead{font-size:14px;color:var(--text);margin-bottom:12px;line-height:1.7;}
.bt-crits{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:8px;}
.bt-crit{display:flex;align-items:center;gap:7px;font-size:12.5px;}
.bt-crit.ok{color:var(--ok);}
.bt-crit.no{color:var(--muted);}
.bt-cbox{display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;
  border-radius:5px;font-size:11px;border:1px solid currentColor;flex:0 0 auto;}
.bt-crit-sum{grid-column:1 / -1;margin-top:4px;padding-top:9px;border-top:1px solid var(--line);
  font-size:12px;color:var(--muted);}

/* ---- PK ---- */
.bt-pk-pick{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px;}

/* ---- 数据准备：KV 面板 ---- */
.bt-kv{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:0 20px;}
.bt-kv-row{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:8px 0;border-bottom:1px solid #f6f8fa;font-size:12.5px;}
.bt-kv-row span{color:var(--muted);}
.bt-kv-row b{color:var(--text);font-weight:600;}

/* 窄屏：左列收起，因子库单列 */
@media (max-width:1180px){
  .bt-split{grid-template-columns:1fr;}
  .bt-form{grid-template-columns:repeat(2,minmax(0,1fr));}
  .bt-ftree{grid-template-columns:1fr;}
}

/* ===== 板块强度模块（sector.js） ===== */
.sec-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px;}
.sec-toolbar .sec-spacer{flex:1;}
.sec-filter-label{font-size:12px;color:var(--muted);}
.sec-select{background:#f7f9fb;border:1px solid var(--line);color:var(--text);
  font-size:12px;padding:6px 10px;border-radius:8px;outline:none;}
.sec-select:focus{border-color:var(--gold);}
.sec-toolbar .btn.active{background:linear-gradient(135deg,#e2bd4d,#c19312);border-color:transparent;color:#1a1405;font-weight:700;}

.sec-layout{display:grid;grid-template-columns:1.35fr 1fr;gap:18px;align-items:start;}
@media (max-width:1180px){.sec-layout{grid-template-columns:1fr;}}

.sec-summary{display:flex;flex-wrap:wrap;gap:10px 22px;padding:12px 16px;margin-bottom:14px;
  background:var(--panel);border:1px solid var(--line);border-radius:12px;}
.sec-sum-item{display:flex;align-items:center;gap:6px;font-size:14px;}
.sec-sum-k{color:var(--muted);font-size:12px;}
.sec-sum-item b{font-size:17px;font-weight:700;}
.sec-top{color:var(--gold-soft);}

.sec-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px;align-content:start;}

.sec-card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 16px;
  cursor:pointer;transition:.18s;box-shadow:0 6px 18px rgba(15,23,42,.08);}
.sec-card:hover{transform:translateY(-2px);border-color:var(--gold);}
.sec-card.active{border-color:var(--gold);box-shadow:0 0 0 1px var(--gold),0 8px 22px rgba(15,23,42,.10);}
.sec-card-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px;}
.sec-name{font-size:14px;font-weight:700;color:var(--text);}
.sec-score{font-size:22px;font-weight:800;line-height:1;font-variant-numeric:tabular-nums;}
.sec-badges{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px;}
.sec-stage{display:inline-flex;align-items:center;padding:2px 10px;border-radius:20px;font-size:11px;font-weight:600;border:1px solid;}
.sec-band{display:inline-flex;align-items:center;padding:2px 10px;border-radius:20px;font-size:11px;font-weight:600;}
.sec-band-opp{background:rgba(95,207,155,.16);color:var(--ok);}
.sec-band-neu{background:rgba(255,192,107,.14);color:var(--warn);}
.sec-band-risk{background:rgba(255,125,108,.16);color:var(--danger);}
.sec-metrics{display:grid;grid-template-columns:1fr 1fr;gap:8px 12px;}
.sec-m{display:flex;align-items:center;justify-content:space-between;font-size:12.5px;
  border-bottom:1px dashed #f1f4f7;padding-bottom:5px;}
.sec-mk{color:var(--muted);font-size:11.5px;}
.sec-infer{margin-top:10px;font-size:11.5px;line-height:1.55;color:var(--muted);
  background:#f3f6f9;padding:8px 10px;border-radius:8px;border-left:2px solid var(--aurora);}
.sec-warn{font-size:10px;color:var(--warn);margin-left:4px;}

.sec-detail{position:sticky;top:14px;background:var(--panel);border:1px solid var(--line);
  border-radius:14px;padding:18px;min-height:200px;box-shadow:0 6px 18px rgba(15,23,42,.08);}
.sec-detail-empty{padding:30px 14px;text-align:center;font-size:13px;}
.sec-d-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:4px;}
.sec-d-name{font-size:18px;font-weight:800;color:var(--gold-soft);}
.sec-d-sub{color:var(--muted);font-size:12px;margin-bottom:14px;}
.sec-d-sec{margin-bottom:16px;}
.sec-d-sec h4{margin:0 0 8px;font-size:13px;color:var(--text);font-weight:700;
  padding-left:8px;border-left:3px solid var(--gold);}
.sec-d-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px;}
.sec-d-grid>div{display:flex;align-items:center;justify-content:space-between;font-size:12.5px;
  border-bottom:1px dashed #f1f4f7;padding-bottom:5px;}
.sec-d-grid .sec-mk{color:var(--muted);font-size:11.5px;}
.sec-d-list{margin:0;padding-left:18px;font-size:12.5px;line-height:1.6;color:var(--text);}
.sec-tags{display:flex;flex-wrap:wrap;gap:6px;}
.sec-tag{background:rgba(212,175,55,.12);border:1px solid var(--line);color:var(--gold-soft);
  font-size:11.5px;padding:3px 10px;border-radius:16px;}
.sec-bars{display:flex;align-items:flex-end;gap:3px;height:44px;margin-top:10px;}
.sec-bar{width:8px;border-radius:2px 2px 0 0;}
.sec-bar.up{background:var(--danger);}
.sec-bar.down{background:var(--ok);}
.sec-concl{margin:0;font-size:13px;line-height:1.65;color:var(--text);}
.sec-alt{display:flex;flex-wrap:wrap;gap:8px;}
.sec-alt-item{cursor:pointer;background:#f1f4f8;border:1px solid var(--line);border-radius:8px;
  padding:6px 10px;font-size:12.5px;transition:.15s;}
.sec-alt-item:hover{border-color:var(--gold);color:var(--gold-soft);}
.sec-alt-item b{color:var(--gold-soft);}
.sec-alt-item i{color:var(--muted);font-style:normal;font-size:11px;margin-left:4px;}
.sec-disclaim{margin-top:14px;font-size:11px;color:var(--muted);line-height:1.5;
  border-top:1px dashed #e5e9f0;padding-top:10px;}

/* ===================== AI 选股（左右分栏 + 二级菜单） ===================== */
.nav-group{margin:2px 0;}
.nav-group-head{display:flex;align-items:center;gap:11px;text-align:left;width:100%;padding:12px 14px;border-radius:11px;
  background:transparent;border:1px solid transparent;color:var(--muted);font-size:14px;cursor:pointer;transition:.15s;}
.nav-group-head:hover{color:var(--text);background:#f6f8fa;}
.nav-group-label{font-weight:600;color:var(--text);}
.nav-caret{margin-left:auto;font-size:11px;transition:transform .15s;color:var(--muted);}
.nav-group.collapsed .nav-caret{transform:rotate(-90deg);}
.nav-sub{display:flex;flex-direction:column;gap:4px;padding:2px 0 4px 14px;margin-left:8px;border-left:1px solid #eef1f5;}
.nav-group.collapsed .nav-sub{display:none;}
.nav-sub-item{margin-left:0;font-size:13.5px;padding:9px 14px;}

/* 文档流下高度由内容决定，min-height 保证三栏有可用高度（否则 flex:1 会塌缩）。 */
.aip-layout{flex:1;min-height:560px;display:flex;gap:18px;align-items:stretch;}
.aip-left{width:372px;flex:0 0 372px;display:flex;flex-direction:column;min-height:0;overflow:hidden;}
.aip-left-head,.aip-topbar{flex:none;}
.aip-left-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;}
.aip-left-title{font-size:15px;font-weight:600;color:var(--gold-soft);}
.aip-topbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px;}
.aip-global-status{font-size:12px;margin-left:auto;}
.aip-global-status.running{color:var(--gold-soft);}
.aip-global-status.failed{color:#dc2626;}
.aip-cards{flex:1;min-height:0;max-height:660px;overflow-y:auto;display:flex;flex-direction:column;gap:16px;padding-right:4px;}

/* 策略分组：三度选股置顶（页面优先展示），分组头带金色左边框与数量徽标 */
.aip-group{display:flex;flex-direction:column;gap:10px;}
.aip-group-head{display:flex;align-items:center;gap:8px;padding-left:8px;border-left:3px solid var(--gold);}
.aip-group[data-engine="factor"] .aip-group-head{border-left-color:rgba(123,92,255,.7);}
.aip-group-title{font-size:13px;font-weight:700;color:var(--gold-soft);letter-spacing:.5px;}
.aip-group[data-engine="factor"] .aip-group-title{color:#6741d9;}
.aip-group-count{font-size:11px;color:var(--muted);background:#f1f4f7;
  border-radius:9px;padding:1px 7px;font-variant-numeric:tabular-nums;}
.aip-group-hint{font-size:11.5px;line-height:1.5;padding-left:11px;margin-top:-4px;}

/* 引擎徽标：三度金色 / 因子紫色，与分组头配色呼应 */
.aip-engine{font-size:10.5px;font-weight:700;border-radius:6px;padding:2px 6px;letter-spacing:.5px;white-space:nowrap;}
.aip-engine.sandu{color:#1a1206;background:linear-gradient(135deg,#e8c86a,#d4af37);}
.aip-engine.factor{color:#f2effc;background:linear-gradient(135deg,#7b5cff,#5a3fd6);}
.aip-result-name .aip-engine{margin-right:8px;vertical-align:middle;}

.aip-card{display:flex;flex-direction:column;gap:10px;background:#fafbfd;
  border:1px solid var(--line);border-radius:14px;padding:14px;cursor:pointer;transition:.15s;}
.aip-card:hover{border-color:rgba(212,175,55,.4);background:#f3f5f8;}
.aip-card.active{border-color:var(--gold);background:linear-gradient(135deg,rgba(212,175,55,.12),rgba(123,92,255,.08));}
.aip-card-name{font-size:15px;font-weight:700;color:var(--text);display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.aip-card-desc{font-size:12.5px;color:var(--muted);line-height:1.5;max-height:38px;overflow:hidden;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;}
.aip-card-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12px;}
.aip-card-updated{font-size:11.5px;}
.aip-status{font-size:11.5px;font-weight:600;}
.aip-status.on{color:var(--ok);}
.aip-status.off{color:var(--muted);}
.aip-card-actions{display:flex;gap:8px;flex-wrap:wrap;}
.aip-card-actions .btn{flex:1 1 auto;}

.aip-right{flex:1;min-width:0;min-height:0;overflow:hidden;display:flex;flex-direction:column;}
.aip-right-empty{flex:1;display:flex;align-items:center;justify-content:center;min-height:320px;
  color:var(--muted);font-size:14px;border:1px dashed #e5e9f0;border-radius:14px;}
.aip-right-body{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;gap:14px;min-width:0;}
.aip-right-body > .aip-result-head,
.aip-right-body > .aip-note,
.aip-right-body > .aip-stats,
.aip-right-body > .aip-tabs{flex:none;}
.aip-right-body > .table-wrap{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;}
.aip-result-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;}
.aip-result-name{font-size:17px;font-weight:700;color:var(--gold-soft);}
.aip-export{display:flex;gap:8px;}

.aip-note{font-size:12px;line-height:1.6;color:var(--gold-soft);background:rgba(212,175,55,.08);
  border:1px solid rgba(212,175,55,.25);border-radius:10px;padding:10px 12px;}

.aip-stats{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;}
.aip-stat{background:#fafbfd;border:1px solid var(--line);border-radius:12px;padding:12px 14px;text-align:center;}
.aip-stat-val{font-size:18px;font-weight:700;font-variant-numeric:tabular-nums;}
.aip-stat-label{font-size:11.5px;color:var(--muted);margin-top:4px;}

.aip-tabs{display:flex;flex-wrap:wrap;gap:6px;padding-bottom:6px;border-bottom:1px solid var(--line);max-height:64px;overflow-y:auto;}
.aip-tab{display:flex;justify-content:space-between;align-items:center;flex:1 0 96px;max-width:130px;padding:5px 8px;border-radius:9px;background:transparent;border:1px solid var(--line);
  color:var(--muted);font-size:12px;cursor:pointer;transition:.15s;line-height:1.3;}
.aip-tab:hover{color:var(--text);background:#f6f8fa;}
.aip-tab.active{color:var(--gold-soft);background:rgba(212,175,55,.1);border-color:var(--gold-soft);font-weight:600;}
.aip-tab-date{font-weight:500;}
.aip-tab-ret{font-size:11px;}
.aip-tab-ret .pct{font-weight:700;}

.spinner{display:inline-block;width:12px;height:12px;border:2px solid rgba(100,116,139,.35);
  border-top-color:#475569;border-radius:50%;animation:spin .7s linear infinite;vertical-align:-1px;margin-right:4px;}
@keyframes spin{to{transform:rotate(360deg);}}

@media (max-width:1100px){
  .aip-layout{flex-direction:column;min-height:0;}
  .aip-left{width:100%;flex:none;}
  .aip-cards{max-height:360px;}
  .aip-stats{grid-template-columns:repeat(2,1fr);}
}

/* ===== AI 选股 · 多策略 PK 面板 ===== */
.ap-pk-panel{margin-top:14px;padding:14px 16px;border:1px solid var(--line);border-radius:14px;background:#fbfcfe;}
.ap-pk-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:10px;}
.ap-pk-title{font-size:15px;font-weight:700;color:var(--gold-soft);}
.ap-pk-hint{font-size:12px;margin-top:4px;}
.ap-pk-actions{display:flex;gap:8px;}
.ap-pk-panel .table-wrap{max-height:420px;overflow:auto;}
.ap-pk-row{cursor:pointer;}
.ap-pk-row:hover td{background:#f6f8fa;}
.ap-pk-row.current td{background:rgba(212,175,55,.08);}
.ap-pk-empty{padding:18px;text-align:center;color:var(--muted);}

/* 严格轨快照缺失 → 兼容轨降级：虚线 + 降级徽标，避免用户把含前视偏差的结果当无偏看 */
.aip-tab.degraded{border-style:dashed;border-color:var(--warn,#d89a2a);}
.ap-degrade-tag{display:inline-block;margin-left:8px;padding:1px 6px;border-radius:6px;font-size:11px;font-weight:600;
  color:var(--warn,#d89a2a);border:1px dashed var(--warn,#d89a2a);}

/* ===== AI 选股 v2：视图切换 / 今日名单 / 盘中 / 跟踪 ===== */
.aip-vtabs{display:flex;gap:6px;padding:6px;margin-bottom:12px;border-bottom:1px solid var(--line);flex-wrap:wrap;}
.aip-vtab{padding:7px 16px;border-radius:9px;background:transparent;border:1px solid var(--line);
  color:var(--muted);font-size:13px;cursor:pointer;font-family:inherit;}
.aip-vtab:hover{color:var(--text);background:#f6f8fa;}
.aip-vtab.active{color:var(--gold-soft);background:rgba(212,175,55,.12);border-color:var(--gold-soft);font-weight:600;}

.aip-plan-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:12px;}
.aip-plan-title{font-size:16px;font-weight:700;color:var(--gold-soft);}
.aip-plan-hint{font-size:12px;line-height:1.6;margin-top:4px;max-width:760px;}
.aip-plan-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;}
.aip-plan-foot{margin-top:10px;font-size:11.5px;line-height:1.6;}
.aip-check{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);cursor:pointer;}
.aip-select{background:var(--panel-solid);border:1px solid var(--line);color:var(--text);
  border-radius:8px;padding:5px 8px;font-size:12px;font-family:inherit;}

/* 分层 / 状态徽标 */
.aip-bucket{display:inline-block;padding:1px 7px;border-radius:6px;font-size:11px;font-weight:600;}
.aip-bucket.attack{color:#c2410c;border:1px solid rgba(255,157,122,.45);background:rgba(255,157,122,.1);}
.aip-bucket.steady{color:#1971c2;border:1px solid rgba(127,212,255,.45);background:rgba(127,212,255,.1);}
.aip-status{display:inline-block;padding:1px 7px;border-radius:6px;font-size:11px;font-weight:600;}
.aip-status.new{color:var(--gold-soft);border:1px solid rgba(212,175,55,.45);background:rgba(212,175,55,.1);}
.aip-status.hold{color:var(--ok);border:1px solid rgba(95,207,155,.45);background:rgba(95,207,155,.1);}
.aip-status.exit{color:var(--muted);border:1px solid var(--line);background:#fafbfd;}
.aip-buy-no{color:var(--danger);font-weight:600;}
.aip-buy-yes{color:var(--ok);font-weight:600;}
.aip-votes{font-weight:700;color:var(--gold-soft);}

/* 盘中状态条 */
.aip-intra-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:10px 14px;margin-bottom:10px;
  border-radius:12px;border:1px solid var(--line);background:#fafbfd;}
.aip-intra-phase{font-size:14px;font-weight:700;padding:3px 12px;border-radius:8px;}
.aip-intra-phase.monitor{color:var(--warn);border:1px solid rgba(255,192,107,.5);background:rgba(255,192,107,.12);}
.aip-intra-phase.final{color:#0f1a12;background:linear-gradient(135deg,#0ca678,#3aa876);border-color:transparent;}
.aip-intra-phase.auction{color:#1971c2;border:1px solid rgba(127,212,255,.5);background:rgba(127,212,255,.12);}
.aip-intra-phase.idle{color:var(--muted);border:1px solid var(--line);}
.aip-intra-countdown{font-size:15px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--gold-soft);}
.aip-intra-actions{display:flex;gap:8px;align-items:center;margin-left:auto;flex-wrap:wrap;}
.aip-intra-bar.locked{border-color:rgba(95,207,155,.45);background:rgba(95,207,155,.07);}

/* 缺数据提示：明确告知哪些交易日还没生成，而不是渲染一堆点开为空的 tab */
.aip-missing-tip{font-size:12px;line-height:1.6;color:var(--warn);background:rgba(255,192,107,.08);
  border:1px solid rgba(255,192,107,.25);border-radius:10px;padding:8px 12px;}

/* ===================== 个股档案：检索 / 详情弹窗 / 购买建议 ===================== */

/* 检索条 */
.aip-search{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:10px 0 6px;}
.aip-search-input{flex:1 1 320px;min-width:220px;height:36px;padding:0 12px;border-radius:10px;
  border:1px solid var(--line);background:#f7f9fb;color:var(--text);font-size:13px;outline:none;transition:.2s;}
.aip-search-input:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(212,175,55,.15);}
.aip-search-input::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none;}
.aip-search-result{margin:0 0 12px;padding:12px;border-radius:12px;
  border:1px solid var(--line);background:#fafbfd;}

/* 表格行整体可点：不给鼠标反馈，用户不会知道能点开档案 */
.ap-row{cursor:pointer;transition:background .15s;}
.ap-row:hover{background:rgba(212,175,55,.10);}
.ap-sector{display:inline-block;padding:1px 7px;border-radius:6px;font-size:11px;
  color:var(--gold-soft);border:1px solid rgba(212,175,55,.35);background:rgba(212,175,55,.08);
  white-space:nowrap;}

/* 大弹窗：档案内容多，440px 会把每一项挤成一行半 */
.modal.ap-modal-lg{width:900px;max-width:96vw;}
.ap-dos-mask{align-items:flex-start;}
.modal.ap-modal-lg .modal-head{display:flex;align-items:center;justify-content:space-between;}

/* 档案头部 */
.ap-dos-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding-bottom:12px;border-bottom:1px solid var(--line);}
.ap-dos-code{font-size:13px;color:var(--muted);font-variant-numeric:tabular-nums;}
.ap-dos-name{font-size:20px;font-weight:700;color:var(--gold-soft);}
.ap-dos-date{font-size:12px;}
.ap-dos-tags{display:flex;gap:6px;margin-left:auto;}
.ap-dos-tag{font-size:11px;padding:2px 8px;border-radius:6px;font-weight:600;}
.ap-dos-tag.main{color:var(--gold-soft);border:1px solid rgba(212,175,55,.45);background:rgba(212,175,55,.12);}
.ap-dos-tag.intra{color:#1971c2;border:1px solid rgba(127,212,255,.45);background:rgba(127,212,255,.12);}
.ap-dos-tag.watch{color:var(--ok);border:1px solid rgba(95,207,155,.45);background:rgba(95,207,155,.12);}
.ap-dos-tag.pool{color:#7048e8;border:1px solid rgba(167,139,255,.45);background:rgba(167,139,255,.12);}

/* 分节 */
.ap-dos-sec{border:1px solid var(--line);border-radius:12px;padding:12px 14px;background:#fbfcfe;}
.ap-dos-h{font-size:13px;font-weight:700;color:var(--gold-soft);margin-bottom:10px;letter-spacing:.5px;}
.ap-dos-empty{color:var(--muted);font-size:13px;padding:10px 0;text-align:center;}

/* 键值网格 */
.ap-dos-kv{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px;}
.ap-dos-kv-item{display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  padding:7px 10px;border-radius:8px;border:1px solid var(--line);background:#f3f6f9;}
.ap-dos-k{font-size:12px;color:var(--muted);white-space:nowrap;}
.ap-dos-v{font-size:13px;font-weight:600;font-variant-numeric:tabular-nums;text-align:right;}
.ap-dos-kv-item.ok{border-color:rgba(95,207,155,.45);}
.ap-dos-kv-item.ok .ap-dos-v{color:var(--ok);}
.ap-dos-kv-item.bad{border-color:rgba(255,125,108,.45);}
.ap-dos-kv-item.bad .ap-dos-v{color:var(--danger);}
.ap-dos-kv-item.warn{border-color:rgba(255,192,107,.45);}
.ap-dos-kv-item.warn .ap-dos-v{color:var(--warn);}
.ap-dos-kv-item.up .ap-dos-v{color:#dc2626;}
.ap-dos-kv-item.down .ap-dos-v{color:#0ca678;}
.ap-dos-kv-item.flat .ap-dos-v{color:var(--muted);}

/* 价格口径标签：不标注会让人把收盘价当现价 */
.ap-dos-src{font-size:10px;font-weight:700;padding:1px 6px;border-radius:5px;margin-left:4px;vertical-align:1px;}
.ap-dos-src.live{color:var(--ok);border:1px solid rgba(95,207,155,.5);background:rgba(95,207,155,.12);}
.ap-dos-src.stale{color:var(--muted);border:1px solid var(--line);background:#f6f8fa;}

/* 迷你 K 线 */
.ap-dos-kline{border:1px solid var(--line);border-radius:12px;padding:12px 14px;background:#fbfcfe;}
.ap-dos-kline-head{font-size:13px;font-weight:600;display:flex;align-items:center;gap:8px;margin-bottom:6px;}
.ap-dos-kline-foot{font-size:11px;margin-top:4px;}
.ap-dos-svg{display:block;width:100%;height:130px;}

/* 归因明细 */
.ap-dos-attr{margin-top:8px;}
.ap-dos-attr-h{font-size:12px;color:var(--gold-soft);font-weight:600;margin-bottom:6px;}
.ap-dos-attr-row{display:flex;justify-content:space-between;gap:12px;font-size:12px;
  padding:4px 8px;border-radius:6px;background:#f5f7fa;margin-bottom:4px;}
.ap-dos-attr-row span:first-child{color:var(--muted);white-space:nowrap;}
.ap-dos-attr-row span:last-child{text-align:right;word-break:break-all;}

/* 购买建议 */
.ap-adv-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:10px 14px;border-radius:12px;margin-bottom:10px;border:1px solid var(--line);}
.ap-adv-verdict{font-size:15px;font-weight:800;letter-spacing:.5px;}
.ap-adv-headline{font-size:13px;color:var(--text);flex:1 1 240px;min-width:180px;}
.ap-adv-counts{font-size:12px;color:var(--muted);white-space:nowrap;}
.ap-adv-head.ap-adv-buy{border-color:rgba(255,91,91,.45);background:rgba(255,91,91,.10);}
.ap-adv-head.ap-adv-buy .ap-adv-verdict{color:#dc2626;}
.ap-adv-head.ap-adv-avoid{border-color:rgba(95,207,155,.45);background:rgba(95,207,155,.10);}
.ap-adv-head.ap-adv-avoid .ap-adv-verdict{color:var(--ok);}
.ap-adv-head.ap-adv-unknown{border-color:var(--line);background:#fafbfd;}
.ap-adv-head.ap-adv-unknown .ap-adv-verdict{color:var(--muted);}

.ap-adv-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
.ap-adv-col{border:1px solid var(--line);border-radius:12px;padding:10px 12px;background:#fbfcfe;}
.ap-adv-h{font-size:12px;font-weight:700;color:var(--gold-soft);margin-bottom:6px;}
.ap-adv-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px;}
.ap-adv-list li{display:flex;flex-direction:column;gap:2px;padding:6px 8px;border-radius:8px;
  background:#f3f6f9;border-left:2px solid var(--line);}
.ap-adv-list li.veto{border-left-color:var(--danger);background:rgba(255,125,108,.08);}
.ap-adv-list li.info{border-left-color:#1971c2;background:rgba(127,212,255,.06);}
.ap-adv-t{font-size:12px;font-weight:700;}
.ap-adv-list li.veto .ap-adv-t{color:var(--danger);}
.ap-adv-d{font-size:12px;color:var(--muted);line-height:1.6;}
.ap-adv-empty{font-size:12px;color:var(--muted);padding:4px 0;}
.ap-adv-foot{font-size:11px;color:var(--muted);line-height:1.6;margin-top:10px;
  padding-top:8px;border-top:1px dashed var(--line);}

/* 检索结果卡片 */
.ap-sr-head{font-size:12px;color:var(--muted);margin-bottom:8px;}
.ap-sr-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:10px;}
.ap-sr-card{cursor:pointer;border:1px solid var(--line);border-radius:12px;padding:12px;
  background:#fafbfd;transition:.16s;}
.ap-sr-card:hover{transform:translateY(-2px);box-shadow:var(--shadow);}
.ap-sr-card.ap-adv-buy{border-color:rgba(255,91,91,.40);background:rgba(255,91,91,.06);}
.ap-sr-card.ap-adv-avoid{border-color:rgba(95,207,155,.40);background:rgba(95,207,155,.06);}
.ap-sr-top{display:flex;align-items:baseline;gap:8px;}
.ap-sr-name{font-size:15px;font-weight:700;color:var(--gold-soft);}
.ap-sr-code{font-size:12px;}
.ap-sr-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:6px 0;font-size:11px;}
.ap-sr-verdict{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:8px;}
.ap-sr-headline{font-size:12px;color:var(--muted);}
.ap-sr-price{display:grid;grid-template-columns:repeat(auto-fill,minmax(88px,1fr));gap:6px;
  font-size:11px;color:var(--muted);margin-bottom:8px;}
.ap-sr-price b{display:block;font-size:13px;color:var(--text);font-variant-numeric:tabular-nums;}
.ap-sr-reasons{display:flex;flex-direction:column;gap:4px;font-size:11px;line-height:1.6;color:var(--muted);}
.ap-sr-reason.veto{color:var(--danger);}

@media (max-width:820px){
  .ap-adv-grid{grid-template-columns:1fr;}
  .modal.ap-modal-lg{width:96vw;}
}

/* ==================== 移动端适配 ====================
   ≤920px：侧栏 → off-canvas 抽屉（汉堡唤出）、内容单列化、宽表横向滚动；
   ≤640px：弹窗全屏化、输入 16px 防 iOS 聚焦缩放。
   桌面端零改动：所有规则都在媒体查询内。 */
@media (max-width:920px){
  .topbar-menu{display:inline-flex;}
  .topbar{padding:0 12px;height:56px;position:sticky;top:0;z-index:50;}
  .topbar-title{font-size:15px;}
  .admin-badge{font-size:12px;padding:5px 10px;}
  /* 关键：移动端放弃「fixed 壳 + 内部滚动」，改自然文档流——iOS/安卓原生滚动最可靠。
     fixed 壳的内部滚动区在触屏上容易出现整页滑不动的兼容问题。 */
  html,body{height:auto;min-height:100%;}
  .app-view{position:relative;inset:auto;height:auto;min-height:100dvh;flex-direction:column;}
  .main{flex:1;}
  .content{overflow:visible;padding:14px 12px calc(20px + env(safe-area-inset-bottom));}
  /* 抽屉侧栏 */
  .sidebar{position:fixed;top:0;left:0;bottom:0;z-index:100;width:270px;max-width:82vw;
    transform:translateX(-105%);transition:transform .25s ease;
    box-shadow:0 0 40px rgba(15,23,42,.18);
    padding-top:max(22px,env(safe-area-inset-top));overflow-y:auto;}
  .sidebar.open{transform:translateX(0);}
  .drawer-mask.show{display:block;}
  /* 全屏视图（板块强度/涨停题材）：撤销桌面端的 absolute+overflow:hidden，回归文档流 */
  #sector-panel,#limitup-panel{position:static;inset:auto;overflow:visible;}
  .content:has(#sector-panel[style*="display: flex"]),
  .content:has(#limitup-panel[style*="display: flex"]){overflow:visible;}
  .sec-lb-layout{overflow:visible;}
  .sec3-layout{overflow:visible;}
  #aipick-panel{min-height:0;}
  .panel-head{flex-direction:column;align-items:stretch;gap:10px;margin-bottom:14px;}
  .panel-head > div:last-child{align-self:flex-start;}
  .panel-desc{font-size:12.5px;}
  .bt-risk{font-size:11px;line-height:1.6;}
  /* 宽表：横向滚动（移动端标准解法） */
  .table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;}
  .data-table{min-width:640px;}
  .data-table thead th,.data-table tbody td{padding:10px 12px;}
  /* 作战室工具行 */
  .aip-plan-head{flex-direction:column;align-items:stretch;gap:8px;}
  .aip-plan-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
  .aip-stats{flex-wrap:wrap;gap:8px;}
  .aip-vtabs{display:flex;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;gap:8px;}
  .aip-vtab{white-space:nowrap;flex:none;}
  .aip-check{white-space:nowrap;}
  /* 板块强度三栏 → 纵向堆叠 */
  .sec3-layout{flex-direction:column;}
  .sec3-left,.sec3-mid{width:100%;flex:none;max-height:34vh;}
  .sec3-cards{grid-template-columns:repeat(2,1fr);}
  .sec3-detail-head{flex-wrap:wrap;}
  .weight-panel-body{max-height:44vh;}
}
@media (max-width:640px){
  /* 弹窗全屏化 */
  .modal-mask{padding:0;align-items:stretch;}
  .modal{width:100vw;max-width:100vw;height:100%;max-height:100vh;border-radius:0;border:none;
    margin:0;animation:fade .2s ease;}
  .modal-body{padding:16px;}
  .modal-head{padding:14px 16px;}
  .modal-foot{padding:12px 16px;}
  .modal-foot .btn{flex:1;}
  /* 触屏基础 */
  input,select,textarea{font-size:16px;} /* 防 iOS 聚焦自动放大 */
  .btn{padding:10px 14px;}
  .btn-sm{padding:9px 12px;}
  .chart-box{height:280px;}
  .toast-root{width:92vw;}
}
