:root{
  --bg:#f4f6f9; --card:#ffffff; --line:#e4e8ee; --line2:#eef1f5;
  --tx:#1b2230; --tx2:#5b6675; --tx3:#8b95a5;
  --up:#e2453c; --down:#17a673; --accent:#2f6fed; --accent2:#eef3ff;
  --gold:#c8871a;
  --shadow:0 1px 2px rgba(20,30,50,.05),0 6px 18px rgba(20,30,50,.05);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  background:var(--bg); color:var(--tx); font-size:13px; line-height:1.55;
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  -webkit-font-smoothing:antialiased;
}
h1,h2,h3,h4{margin:0;font-weight:600}
.r{text-align:right}.muted{color:var(--tx3);font-size:12px}
.hidden{display:none!important}
.mono{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}

/* ---------- topbar ---------- */
.topbar{
  display:flex;align-items:center;gap:24px;padding:12px 20px;background:#fff;
  border-bottom:1px solid var(--line);position:sticky;top:0;z-index:30;
}
.brand{display:flex;align-items:center;gap:10px;min-width:260px}
.brand .logo{width:30px;height:30px;display:block;border-radius:7px;flex:none}
.brand h1{font-size:16px;letter-spacing:.2px}
.brand .sub{margin:0;font-size:11px;color:var(--tx3)}
.topmeta{display:flex;gap:22px;flex:1}
.meta-item{display:flex;flex-direction:column;line-height:1.25}
.meta-item .lbl{font-size:11px;color:var(--tx3)}
.meta-item b{font-size:15px;font-variant-numeric:tabular-nums}
.actions{display:flex;gap:8px}

/* ---------- 顶部股票搜索 ----------
   一个「会展开的输入框」：平时只是一条淡底的搜索条，聚焦时提亮、下方浮出结果面板。
   结果面板挂在 .topsearch 里绝对定位（不是 body 级弹层），因为 topbar 本身就是
   sticky + z-index:30 —— 面板要跟着它一起走，且必须比 topbar 更高一层（z:60）。 */
.topsearch{
  position:relative;display:flex;align-items:center;gap:6px;flex:0 0 232px;
  height:34px;padding:0 8px 0 10px;border:1px solid var(--line);border-radius:9px;
  background:#f7f9fc;transition:.15s;
}
.topsearch:focus-within{background:#fff;border-color:var(--accent);box-shadow:0 0 0 3px rgba(47,111,237,.1)}
.ts-ico{color:var(--tx3);flex:none;transition:.15s}
.topsearch:focus-within .ts-ico{color:var(--accent)}
#ts-input{
  flex:1;min-width:0;width:100%;border:none;background:transparent;outline:none;
  font-size:13px;font-family:inherit;color:var(--tx);padding:0;line-height:34px;
}
#ts-input::placeholder{color:var(--tx3);font-size:12.5px}
.ts-clear{
  flex:none;border:none;background:#e6eaf1;color:var(--tx2);border-radius:50%;
  width:16px;height:16px;line-height:15px;font-size:10px;cursor:pointer;padding:0;
}
.ts-clear:hover{background:#d5dbe6;color:var(--tx)}
.ts-clear[hidden]{display:none}
.ts-kbd{
  flex:none;font-family:ui-monospace,Menlo,monospace;font-size:10.5px;color:var(--tx3);
  border:1px solid var(--line);border-bottom-width:2px;border-radius:4px;
  padding:0 4px;line-height:14px;background:#fff;
}
/* 输入框里有内容时隐藏快捷键提示：它们争同一块地方，而这时提示已经没用了 */
.topsearch.has-val .ts-kbd{display:none}

.ts-pop{
  position:absolute;top:calc(100% + 6px);right:0;left:auto;min-width:360px;
  max-width:calc(100vw - 24px);
  background:#fff;border:1px solid var(--line);border-radius:10px;padding:4px;
  box-shadow:0 14px 34px rgba(20,30,50,.16);z-index:60;
  max-height:min(62vh,430px);overflow:auto;
}
.ts-pop[hidden]{display:none}
.ts-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:7px;cursor:pointer}
.ts-row.on,.ts-row:hover{background:var(--accent2)}
.ts-row .ts-code{font-variant-numeric:tabular-nums;font-size:12.5px;color:var(--tx2);flex:none;width:52px}
.ts-row .ts-name{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ts-row .ts-board{font-size:10.5px;color:var(--tx3);border:1px solid var(--line2);
  border-radius:4px;padding:0 4px;flex:none}
.ts-row .ts-py{font-family:ui-monospace,Menlo,monospace;font-size:10.5px;color:var(--tx3);
  flex:none;margin-left:auto;letter-spacing:.4px}
.ts-row .ts-px{flex:none;text-align:right;font-variant-numeric:tabular-nums;font-size:12.5px;
  min-width:96px;display:flex;gap:6px;justify-content:flex-end}
.ts-row mark{background:#fff2c2;color:inherit;padding:0 1px;border-radius:2px}
.ts-row .ts-live{font-size:9.5px;color:#fff;background:var(--accent);border-radius:3px;padding:0 3px}
.ts-empty,.ts-loading{padding:14px 10px;text-align:center;color:var(--tx3);font-size:12.5px}
.ts-pop .ts-foot{padding:5px 10px 4px;color:var(--tx3);font-size:11px;border-top:1px solid var(--line2);
  margin-top:3px;display:flex;gap:10px}
.ts-pop .ts-foot kbd{font-family:ui-monospace,Menlo,monospace;border:1px solid var(--line);
  border-radius:3px;padding:0 3px;background:#f8fafc}
@media(max-width:1200px){.topsearch{flex-basis:190px}.ts-kbd{display:none}}
@media(max-width:900px){.topmeta{display:none}.topsearch{flex:1 1 auto}}

.btn{
  border:1px solid var(--line);background:#fff;color:var(--tx);border-radius:7px;
  padding:7px 14px;font-size:13px;cursor:pointer;transition:.15s;font-family:inherit;
}
.btn:hover{background:#f7f9fc;border-color:#cfd7e3}
.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}
.btn.primary:hover{background:#255ed6}
.btn.ghost{background:#fff}
.btn.tiny{padding:3px 9px;font-size:11px;border-radius:5px}
.btn.block{width:100%;margin-top:6px;padding:9px}
.btn:disabled{opacity:.5;cursor:not-allowed}

/* ---------- taskbar ---------- */
.taskbar{
  display:flex;align-items:center;gap:12px;padding:8px 20px;background:#fffbe9;
  border-bottom:1px solid #f2e6bd;font-size:12px;position:sticky;top:57px;z-index:29;
}
.tb-name{font-weight:600;white-space:nowrap}
.tb-track{flex:1;height:6px;background:#eee6cf;border-radius:3px;overflow:hidden;min-width:120px}
.tb-fill{height:100%;width:0;background:linear-gradient(90deg,#e8a33d,#e2453c);transition:width .3s}
.tb-msg{color:var(--tx2);max-width:44%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---------- tabs ---------- */
.tabs{display:flex;gap:4px;padding:10px 20px 0;background:#fff;border-bottom:1px solid var(--line);
  position:sticky;top:57px;z-index:28}
.tab{
  padding:8px 16px;font-size:13px;color:var(--tx2);cursor:pointer;border-radius:7px 7px 0 0;
  border:1px solid transparent;border-bottom:none;text-decoration:none;
}
.tab:hover{color:var(--tx)}
.tab.active{color:var(--accent);background:var(--accent2);border-color:var(--line);font-weight:600}

main{padding:16px 20px 60px;max-width:1680px;margin:0 auto}
.panel{display:none}
.panel.active{display:block;animation:fade .22s ease}
@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}

/* ---------- cards ---------- */
.card{background:var(--card);border:1px solid var(--line);border-radius:11px;box-shadow:var(--shadow);
  padding:14px 16px;margin-bottom:14px}
.card-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;gap:12px;
  flex-wrap:wrap}
.card-hd h2{font-size:14px}
/* hd-tools 必须允许换行：候选池头部塞了日期下拉 + 行情徽标 + 自动刷新 + 过滤勾选框
   + 生成于 + 只数六件东西，「全部」视图的只数文案尤其长 —— 不换行的话窗口稍窄，
   排在后面的「生成于 / N 只」就被挤出可视区（看起来像“这行信息不显示了”）。 */
.hd-tools{display:flex;align-items:center;gap:10px;flex-wrap:wrap;row-gap:4px;min-width:0}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.grid3{display:grid;grid-template-columns:260px 1fr 1fr;gap:14px;margin-bottom:14px}
.grid4{display:grid;grid-template-columns:230px 1fr 1fr 1fr;gap:14px;margin-bottom:14px}
.span2{grid-column:span 2}
/* 模拟盘折叠工具区：一个按钮开合「下单面板 + 今日推荐」 */
.man-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.man-bar .grow{flex:1 1 auto}
.man-bar #man-tools-toggle{white-space:nowrap}
/* 多组模拟盘的切换条与管理面板 */
.man-acc-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px}
.man-acc-bar .grow{flex:1 1 auto}
.seg.small{margin-bottom:0;padding:2px}
.seg.small .seg-btn{padding:5px 12px;font-size:12px;display:inline-flex;align-items:center;gap:6px}
.mb-btn .sd{width:7px;height:7px;border-radius:50%;background:var(--sc,#2f6fed);flex:none}
.mb-btn:not(.active) .sd{opacity:.55}
.mgr{margin-bottom:14px}
.mgr-add{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.mgr-add .inp{flex:0 1 260px}
.mgr-add .muted{margin-left:auto;font-size:11.5px;color:var(--tx3)}
.mgr-list{display:flex;flex-direction:column;gap:6px}
.mgr-row{display:flex;align-items:center;gap:8px;padding:6px 9px;border:1px solid var(--line);
  border-radius:8px;background:#fbfcfe;flex-wrap:wrap}
.mgr-row.cur{border-color:var(--accent);background:var(--accent2)}
.mgr-row .idx{width:20px;text-align:center;color:var(--tx3);font-size:12px}
.mgr-row .inp{flex:0 1 220px;padding:5px 9px;font-size:12.5px}
.mgr-row .muted{flex:1 1 160px;font-size:11.5px;color:var(--tx3)}
.mgr-row .btn{white-space:nowrap}
.btn.danger{color:var(--up);border-color:#f4dad8}
.btn.danger:hover{background:#fdf2f1;border-color:#f0c5c1}
/* 下单面板 与 一键跟单 两卡对齐：
   ① 两卡 margin-bottom 都清零 —— .card 默认带 14px 下边距，只有右卡（:last-child）
      清了的话，grid 行高虽然拉伸对齐，左卡自身会比右卡矮 14px（底部露出一条空隙）；
   ② 卡片改纵向 flex，中间主体（表单 / 表格区）flex:1 吃掉剩余高度 ——
      两卡的「最后一块内容」（买入按钮 / 口径说明）贴在同一底线上，而不是上齐下不齐。 */
#man-tools>.grid2>.card{margin-bottom:0;display:flex;flex-direction:column}
#man-tools>.grid2>.card>.order-form,
#man-tools>.grid2>.card>.tablewrap,
#man-tools>.grid2>.card>.tablewrap .tbl{flex:1 1 auto}
#man-tools>.grid2>.card>.hint{margin-top:10px;margin-bottom:0}
#man-tools>.grid2{margin-bottom:14px}
@media(max-width:1400px){.grid3{grid-template-columns:1fr 1fr}.grid4{grid-template-columns:1fr 1fr}}
@media(max-width:980px){.grid2,.grid3,.grid4{grid-template-columns:1fr}.span2{grid-column:auto}}

/* ---------- index strip ---------- */
.regime{display:flex;align-items:center;gap:10px;padding:9px 14px;border-radius:9px;
  margin-bottom:14px;font-size:12.5px;border:1px solid}
.regime.on{background:#eef8f3;border-color:#cfe9dd;color:#146c4d}
.regime.off{background:#fdf2f1;border-color:#f6d9d6;color:#a8342c}
.regime b{font-weight:600}
.idx-strip{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}
.idx{background:#fff;border:1px solid var(--line);border-radius:11px;padding:10px 14px;box-shadow:var(--shadow)}
.idx .n{font-size:12px;color:var(--tx3)}
.idx .v{font-size:19px;font-weight:600;font-variant-numeric:tabular-nums;margin-top:2px}
.idx .d{font-size:12px;font-variant-numeric:tabular-nums}

/* ---------- table ---------- */
.tablewrap{overflow-x:auto}
.tablewrap.scroll{max-height:420px;overflow-y:auto}
/* 收益排名：行数多（单策略 150~200 笔），给更高的滚动区；表头仍然 sticky */
.tablewrap.scroll.lg{max-height:640px}
.tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.tbl th{
  text-align:left;font-weight:500;color:var(--tx3);font-size:11.5px;padding:7px 9px;
  border-bottom:1px solid var(--line);white-space:nowrap;background:#fbfcfe;position:sticky;top:0;z-index:2;
}
/* 数字列表头右对齐：`.tbl th`(0-1-1) 会压过 `.r`(0-1-0)，必须用更高特异性的选择器，
   否则所有 <th class="r"> 静默失效 → 表头靠左、数据靠右（全站列表头错位的根因） */
.tbl th.r{text-align:right}
.tbl td{padding:7px 9px;border-bottom:1px solid var(--line2);white-space:nowrap;
  font-variant-numeric:tabular-nums}
/* 只有绑定了 data-id 的行才可点，其余保持默认指针，避免误导 */
.tbl tbody tr{cursor:default;transition:.12s}
.tbl tbody tr[data-id]{cursor:pointer}
.tbl tbody tr:hover{background:#f7faff}
.tbl tbody tr[data-id]:hover td.code,.tbl tbody tr[data-id]:hover td.name{color:var(--accent)}
.tbl tbody tr.sel{background:var(--accent2)}
.tbl tbody tr.sum{background:#f6f9ff;font-weight:600}
.tbl tbody tr.sum:hover{background:#eef4ff}
.sub{display:block;font-size:10.5px;font-weight:400;color:var(--tx3);
  line-height:1.35;font-variant-numeric:tabular-nums}
.sub b{font-weight:600;color:var(--tx2)}
.tbl .code{color:var(--tx2);font-size:12px}
.tbl .name{font-weight:500}
.up{color:var(--up)}.down{color:var(--down)}
.pill{display:inline-block;padding:1px 7px;border-radius:20px;font-size:11px;background:#f0f3f8;color:var(--tx2)}
.pill.red{background:#fdeceb;color:var(--up)}
/* 「第 N 次交易」「分批卖出 N 笔」角标：同一只票多次进出必须一眼看出是独立的两笔，
   否则会被误读成加仓/合计。刻意做得比正文小且灰，不抢数字。 */
.seq{display:inline-block;margin-left:4px;padding:0 5px;border-radius:6px;background:#eef2f8;
  color:var(--tx3);font-size:10.5px;line-height:15px;vertical-align:1px;font-variant-numeric:tabular-nums}
/* 排序切换放在卡片头右侧，去掉 .seg 自带的底部外边距，避免把标题撑高 */
#ledger-sort{margin-bottom:0}
#ledger-sort .seg-btn{padding:4px 10px;font-size:12px}
.pill.blue{background:#eaf1ff;color:var(--accent)}
.pill.green{background:#e8f7f1;color:var(--down)}
/* 「临近触发」与提醒数字：金色是「注意但还没发生」，与涨红跌绿区分开 */
.pill.warn{background:#fdf3e6;color:var(--gold)}
.gold{color:var(--gold)}
/* 日K评分四档配色（2026-10-28）：卖出=实心红（最强告警）、减仓=金、持有=灰（.pill 默认）、
   强势持有=浅红（涨红）。之前 .gold / .up 两个类没定义样式 → 强势持有渲染成灰底灰字。 */
.pill.gold{background:#fdf3e6;color:var(--gold)}
.pill.up{background:#fdeceb;color:var(--up);font-weight:600}
.pill.danger{background:var(--up);color:#fff;font-weight:600}
/* 离场提示的明细行：五条规则摊平写，允许换行（正文行是 nowrap，这里必须覆盖，
   否则一行 60 多字会把卡片撑到屏幕外）。整行不高亮，因为它不可点。 */
.ex-row-detail td{background:#fbfcfe;color:var(--tx3);font-size:11.5px;white-space:normal;
  padding-top:3px;padding-bottom:8px;line-height:1.7}
.ex-row-detail:hover td{background:#fbfcfe}
.ex-lv{display:inline-block;margin-right:14px}   /* 一条规则一个整体，折行不从中间断 */
.score{font-weight:700;font-variant-numeric:tabular-nums}
.score.s1{color:#c0392b}.score.s2{color:#d4781f}.score.s3{color:var(--tx2)}
.bar-cell{display:flex;align-items:center;gap:6px}
.bar-mini{width:44px;height:5px;background:#eef1f5;border-radius:3px;overflow:hidden}
.bar-mini i{display:block;height:100%;background:linear-gradient(90deg,#f0a13c,#e2453c)}

/* ---------- 走势最强候选榜 ---------- */
.trk-lead .rank{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;
  padding:0 5px;border-radius:6px;background:#f0f3f8;color:var(--tx3);font-size:11.5px;font-weight:600}
.trk-lead .rank.r1{background:#fdeceb;color:#c0392b}
.trk-lead .rank.r2{background:#fdf3e6;color:#c8871a}
.trk-lead .rank.r3{background:#eef3ff;color:var(--accent)}
.trk-lead .tbl .name{font-weight:600}

/* ---------- form ---------- */
.inp{border:1px solid var(--line);border-radius:7px;padding:7px 10px;font-size:13px;
  font-family:inherit;color:var(--tx);background:#fff;outline:none;width:100%}
.inp:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(47,111,237,.1)}
select.inp{width:auto;min-width:130px}

/* ---------- 候选日期下拉（自绘面板） ----------
   原生 <select> 无法做「滚到底加载更早日期」，所以做成「隐藏 select 存状态 +
   按钮 + 绝对定位面板」。视觉上仍与 .inp 一致，右侧对齐在 .hd-tools 里不顶边界。 */
.dd{position:relative;display:inline-block}
.dd-btn{width:auto;min-width:172px;text-align:left;cursor:pointer;background:#fff;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.dd-btn .dd-caret{float:right;margin-left:8px;color:var(--tx3);font-size:10px;line-height:1.6}
.dd-pop{position:absolute;right:0;top:calc(100% + 4px);z-index:40;background:#fff;
  border:1px solid var(--line);border-radius:9px;min-width:236px;overflow:hidden;
  box-shadow:0 10px 28px rgba(20,30,50,.14)}
.dd-list{max-height:268px;overflow-y:auto;padding:4px;overscroll-behavior:contain}
.dd-item{padding:7px 10px;border-radius:6px;font-size:12.5px;color:var(--tx2);cursor:pointer;
  white-space:nowrap;font-variant-numeric:tabular-nums}
.dd-item:hover{background:var(--line2);color:var(--tx)}
.dd-item.on{background:var(--accent2);color:var(--accent);font-weight:600}
.dd-empty{padding:12px 10px;text-align:center}
.dd-more{padding:6px 10px;border-top:1px solid var(--line2);font-size:11.5px;
  text-align:center;background:#fafbfd}
.field{margin-bottom:12px;position:relative}
.field label{display:block;font-size:12px;color:var(--tx3);margin-bottom:5px}
.chk{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--tx2);cursor:pointer}
.quick{display:flex;gap:6px;margin-top:6px}
.quick button{flex:1;border:1px solid var(--line);background:#fff;border-radius:6px;padding:4px;
  font-size:12px;cursor:pointer;color:var(--tx2);font-family:inherit}
.quick button:hover{background:var(--accent2);color:var(--accent);border-color:#c5d8ff}
.hint{margin-top:10px;font-size:11.5px;color:var(--tx3);background:#f8fafc;border-radius:7px;padding:8px 10px}

/* ---------- 自动刷新控件（已归并进「数据更新与回测」卡，策略说明页） ----------
   真正的定时器在服务端，这里只负责「看状态 + 改间隔」；所以没有开始/停止按钮，
   只有「启用」与两个间隔输入。 */
.ar-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.ar-sw{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--tx2);
  cursor:pointer;user-select:none}
.ar-sw input{width:15px;height:15px;accent-color:var(--accent);cursor:pointer}
.ar-fld{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--tx2)}
.ar-num{width:66px;padding:5px 8px;text-align:center;font-variant-numeric:tabular-nums}
.ar-meta{margin-top:10px;font-size:12px;color:var(--tx2);display:flex;gap:16px;flex-wrap:wrap}
.ar-meta b{color:var(--tx);font-variant-numeric:tabular-nums}
.ar-saved{font-size:11.5px;color:var(--down)}

/* 「上次任务」的分步用时表。默认折叠：只想知道「多久」的人看不到 20 行明细，
   要优化时再点开看是同步慢、取数慢还是某个策略慢。 */
.ar-steps{margin-top:8px}
.ar-steps summary{cursor:pointer;font-size:12px;color:var(--tx2);list-style:none;
  display:inline-flex;align-items:center;gap:6px;user-select:none}
.ar-steps summary::-webkit-details-marker{display:none}
.ar-steps summary b{color:var(--tx);font-variant-numeric:tabular-nums}
.ar-steps summary::before{content:'▸';font-size:10px}
.ar-steps details[open] summary::before{content:'▾'}
.ar-steps table{margin-top:6px;border-collapse:collapse;font-size:11.5px;
  font-variant-numeric:tabular-nums;width:100%;max-width:780px}
.ar-steps td{padding:3px 10px 3px 0;border-bottom:1px solid var(--line);vertical-align:top}
.ar-steps td:nth-child(1){white-space:nowrap}
.ar-steps td:nth-child(2){text-align:right;white-space:nowrap;font-weight:600;padding-right:14px}
.ar-steps td:nth-child(3){color:var(--tx2)}
.ar-steps tr.sum td{border-bottom:none;padding-top:6px;color:var(--tx2)}
.ar-steps tr.sum td:nth-child(2){color:var(--tx)}

/* hint 里写配置键名用 code（与 .prose code 同一观感，但 hint 不在 .prose 里） */
.hint code{background:#eef2f8;padding:1px 5px;border-radius:4px;font-size:11px;
  font-family:Menlo,Consolas,monospace;color:var(--tx2)}
.hint code + code{margin-left:2px}
#fs-card .ar-meta{margin-top:8px}
/* 「上次失败 · 怎么办」单独占一行：上百字的建议塞进 flex 行会把状态行挤爆 */
.fs-fix{flex-basis:100%;margin-top:6px;padding:7px 10px;border-radius:6px;
  background:var(--warnbg,#fff6e5);color:var(--tx);font-size:12px;line-height:1.6}
@media(max-width:900px){.ar-row{gap:10px}.ar-fld{font-size:12px}}
.suggest{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid var(--line);
  border-radius:8px;box-shadow:0 8px 24px rgba(20,30,50,.12);z-index:20;max-height:240px;overflow:auto}
.suggest div{padding:7px 11px;cursor:pointer;font-size:12.5px;display:flex;justify-content:space-between}
.suggest div:hover{background:var(--accent2)}
.seg{display:inline-flex;background:#eaeef4;border-radius:9px;padding:3px;margin-bottom:14px}
.seg-btn{border:none;background:transparent;padding:7px 18px;border-radius:7px;font-size:13px;
  cursor:pointer;color:var(--tx2);font-family:inherit;font-weight:500}
.seg-btn.active{background:#fff;color:var(--tx);box-shadow:0 1px 3px rgba(0,0,0,.08)}

/* ---------- 策略切换条（顶部常驻） ----------
   每套策略一个色点（--sc 由 app.js 按 config.STRATEGIES[*].color 注入），
   按钮右侧带该策略自动盘的累计收益与当日候选数 —— 切换前就能看出差异。 */
/* ---------- 策略切换条 ----------
   sticky 固定：topbar(57px) + tabs(~47px) 之下，z:27 在 tabs(28)/taskbar(29) 之下 ——
   往下翻长列表（成交记录 / 收益排名）时切策略不用滚回顶部。
   背景必须实色（原来透明），否则卡片会从底下透出来。 */
.strategy-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:8px 20px;background:var(--bg);
  position:sticky;top:104px;z-index:27;
  border-bottom:1px solid var(--line2);
  box-shadow:0 2px 4px -3px rgba(20,30,50,.06)}
/* display:flex 会压过 [hidden] 的 UA 样式，必须显式关掉（模拟盘起整条收起） */
.strategy-bar[hidden]{display:none}
.sb-label{font-size:11.5px;color:var(--tx3);letter-spacing:.05em}
.sb-seg{margin-bottom:0}
.sb-btn{display:inline-flex;align-items:center;gap:7px;padding:6px 13px}
/* 字母代号 A~G：与 K线候选徽标同一套视觉（方块 / 策略色 / 当前策略=实色），
   这样「切换条上的 B」与「图上的紫框方块 B」一眼能对上。替代了原来的 7px 色点。 */
.sb-letter{display:inline-flex;align-items:center;justify-content:center;
  width:16px;height:16px;flex:none;border-radius:4px;font-style:normal;
  font-size:10.5px;font-weight:700;line-height:1;letter-spacing:0;
  background:var(--sc,#2f6fed);color:#fff}
.sb-btn:not(.active) .sb-letter{background:#fff;color:var(--sc,#2f6fed);
  box-shadow:inset 0 0 0 1px var(--sc,#2f6fed);opacity:.9}
.sb-ret{font-size:11.5px;font-variant-numeric:tabular-nums;font-weight:600}
.sb-btn:not(.active) .sb-ret{font-weight:500;opacity:.85}
/* 「全部」合并视图按钮与 A~G 策略按钮**同一套样式**（实线、同款字母方块/收益列），
   不做额外区分 —— sb-all 类仅作为选择器钩子保留。 */
/* 已停用策略（B/D）：灰阶 + 虚线，只作「当前查看的是已停用策略」的占位标记 */
.sb-btn.sb-disabled,.sb-btn.sb-disabled.active{background:#f1f3f7;border-style:dashed;
  color:#6b7280;box-shadow:none;cursor:default}
.sb-btn.sb-disabled .sb-letter{background:#9aa3af;color:#fff}
.sb-btn.sb-disabled .sb-ret{font-size:11px;font-weight:500;opacity:.9}
/* 策略说明页总览表里已停用的行：整行降饱和，与可用的五套区分开 */
tr.row-dis td{color:#8b95a5}
tr.row-dis:hover td{background:#fafbfc}
/* 总览表最后一列的启用开关（状态写库，点一下立即生效；启用会自动补扫候选 + 重跑回测） */
td.st-sw-cell{white-space:nowrap;text-align:center}
.st-sw{display:inline-flex;align-items:center;gap:6px;padding:2px 9px 2px 3px;border-radius:20px;
  border:1px solid var(--line);background:#fff;cursor:pointer;font-size:11.5px;color:var(--tx3);
  font-family:inherit;transition:background .15s,border-color .15s,color .15s}
.st-sw i{width:26px;height:14px;border-radius:20px;background:#d7dbe2;position:relative;
  transition:background .15s;flex:0 0 auto}
.st-sw i::after{content:'';position:absolute;top:2px;left:2px;width:10px;height:10px;border-radius:50%;
  background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:left .15s}
.st-sw:hover{box-shadow:0 1px 3px rgba(20,30,50,.1);color:var(--tx2)}
.st-sw.on{color:#12805a;border-color:#bfe6d2;background:#f3fbf7}
.st-sw.on i{background:#22a06b}
.st-sw.on i::after{left:14px}
.st-sw:disabled{opacity:.5;cursor:progress}
/* 候选池「命中策略」列：同一只票被多套策略选中时并排显示 A/B/... 徽标 */
.hits{display:inline-flex;gap:3px;vertical-align:middle}
.hit-badge{display:inline-flex;align-items:center;justify-content:center;
  width:16px;height:16px;border-radius:4px;font-style:normal;font-size:10.5px;
  font-weight:700;line-height:1;background:var(--hc,#6b7280);color:#fff}
td.hits-cell{white-space:nowrap}
.sb-note{font-size:11.5px;color:var(--tx3);line-height:1.6}
.sb-note b{color:var(--tx2);font-weight:600}
.sb-note .pill{margin-left:2px}

/* ---------- stats ---------- */
.stat-card{display:flex;flex-direction:column;gap:0}
.stat-row{display:flex;justify-content:space-between;align-items:baseline;padding:7px 0;
  border-bottom:1px dashed var(--line2)}
.stat-row:last-child{border:none}
.stat-row .k{color:var(--tx3);font-size:12px}
.stat-row .v{font-size:16px;font-weight:600;font-variant-numeric:tabular-nums;text-align:right}

/* ---------- 账户总览卡（AI盘百万盘 / 无限盘 / 模拟盘 共用） ----------
   2026-10-26：持仓列表独立成行后，第一排左「账户总览」右「离场分析」各占一半。
   三盘共用同一套结构：KPI 4 格 → 两栏明细（资金与资产 | 交易统计）→ 一行最好/最差。
   只在 50% 宽度里，所以要压紧：正文 12.5px、行距比通用 .stat-row 小一半。
   两栏在窄屏（<1180px）自动折成一栏 —— 一张卡里再横着塞两列会读不清。 */
.ov-kpi{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:12px}
.ov-kpi .ov-cell{background:#f8fafc;border-radius:8px;padding:7px 9px;min-width:0}
.ov-kpi .k{font-size:11px;color:var(--tx3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ov-kpi .v{font-size:15px;font-weight:700;line-height:1.35;font-variant-numeric:tabular-nums;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ov-kpi .v .u{font-size:10.5px;font-weight:400;color:var(--tx3);margin-left:2px}
.ov-cols{display:grid;grid-template-columns:1fr 1fr;gap:0 18px}
.ov-hd{display:flex;align-items:baseline;justify-content:space-between;gap:8px;
  font-size:11.5px;color:var(--tx2);font-weight:600;margin:0 0 2px;
  padding-bottom:4px;border-bottom:1px solid var(--line)}
.ov-hd .muted{font-weight:400;font-size:11px}
.ov-cols .stat-row{padding:4px 0}
.ov-cols .stat-row .k{font-size:11.5px}
.ov-cols .stat-row .v{font-size:12.5px}
.ov-wide{padding-top:6px;border-top:1px solid var(--line2)}
.ov-wide .v{font-size:12px;font-weight:600}
.stat-row .v .sub{font-size:11px;font-weight:400}
.ov-hint{margin-top:8px}
@media(max-width:1180px){.ov-cols{grid-template-columns:1fr;gap:0}
  .ov-kpi{grid-template-columns:1fr 1fr}}
/* 第一排两卡等高：离场分析的图吃掉卡片剩余高度，避免右卡底部一大块空白。
   高度用 flex 而不是写死 px —— 左侧总览卡的行数随账户类型变（无限盘少两行）。 */
.ov-row{align-items:stretch}
.ov-row>.card{display:flex;flex-direction:column;margin-bottom:14px}
.ov-row>.card>.chart{flex:1 1 auto;height:auto;min-height:320px}
.legend{display:flex;gap:14px;font-size:12px;color:var(--tx2)}
.legend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px}
/* 可点击的图例项：点击隐藏/显示该曲线。隐藏态整项变灰 + 删除线 + 色块淡出，
   让「这条被我关掉了」和「这条本来就没有数据」一眼能分开。 */
.legend .lg-item{display:inline-flex;align-items:center;gap:0;padding:1px 0;border:0;
  background:none;font:inherit;font-size:12px;color:inherit;cursor:pointer;white-space:nowrap}
.legend .lg-item:hover{color:var(--tx)}
.legend .lg-item:hover i{outline:2px solid rgba(47,111,237,.18)}
.legend .lg-item.off{color:#aeb6c2;text-decoration:line-through}
.legend .lg-item.off i{opacity:.28}
.legend .lg-item:focus-visible{outline:2px solid var(--accent);outline-offset:2px}

/* ---------- 实时行情徽标 ---------- */
.qbadge{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;padding:2px 9px;
  border-radius:20px;background:#f0f3f8;color:var(--tx2);white-space:nowrap;font-variant-numeric:tabular-nums}
.qbadge .dot{width:6px;height:6px;border-radius:50%;background:currentColor;display:inline-block}
.qbadge.live{background:#fdeceb;color:var(--up)}
.qbadge.live .dot{animation:pulse 1.4s ease-in-out infinite}
.qbadge.warn{background:#fff8e6;color:#9a6b10}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.3;transform:scale(.8)}}
.meta-item b.phase{font-size:13px}
.phase.open{color:var(--up)}
.phase.closed,.phase.pre,.phase.holiday{color:var(--tx3)}
.refresh-spin{display:inline-block;animation:spin .9s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}

/* ---------- 性能统计（数据工具页） ---------- */
.perf-sub{margin:14px 0 6px;font-size:13px;color:var(--tx2)}
/* ---------- K线卡片头部：最新价 / 涨跌幅 ---------- */
.kl-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;min-width:0}
/* 抽屉标题后的「总市值」：数据来自东财快照，取不到时整块隐藏（不显示 —，否则像「市值 0」） */
.dw-cap{display:inline-flex;align-items:baseline;gap:5px;font-size:11.5px;color:var(--tx3);
  font-variant-numeric:tabular-nums}
.dw-cap[hidden]{display:none}
.dw-cap .k{font-size:11px}
.dw-cap .v{color:var(--tx2);font-weight:600;font-size:11.5px}
.kl-price{display:inline-flex;align-items:baseline;gap:9px;font-variant-numeric:tabular-nums}
.kl-price .p{font-size:17px;font-weight:700;line-height:1.15}
.kl-price .c{font-size:12.5px;font-weight:600}
.kl-price .unit{font-size:11px;color:var(--tx3);font-weight:400}
/* K线第一行的「日K评分」徽章（通用视图口径，任何股票都有）；悬停 title 出依据 */
.escore{display:inline-flex;align-items:center;cursor:help}
.escore[hidden]{display:none}

/* K线悬停提示 */
.kl-tip{min-width:196px}
.kl-tip .kt{display:flex;align-items:center;gap:6px;font-size:12px;padding-bottom:5px;
  margin-bottom:5px;border-bottom:1px solid var(--line2);color:var(--tx2)}
.kl-tip .kt b{color:var(--tx)}
.kl-tip .kt .live{background:var(--up);color:#fff;border-radius:3px;padding:0 4px;font-size:10px;font-weight:400}
.kl-tip .kt .ptag{background:var(--accent2);color:var(--accent);border-radius:3px;padding:0 4px;
  font-size:10px;font-weight:500}
.kl-tip .kr{display:flex;justify-content:space-between;gap:18px;line-height:1.7;font-size:12px}
.kl-tip .kr .k{color:var(--tx3)}
.kl-tip .kr .v{font-variant-numeric:tabular-nums;font-weight:600}
.kl-tip .kdiv{margin-top:5px;padding-top:5px;border-top:1px dashed var(--line2);
  display:grid;grid-template-columns:1fr 1fr;gap:0 16px}
.kl-up{color:var(--up)}
.kl-down{color:var(--down)}

/* ---------- chart ---------- */
.chart{width:100%;height:330px}
.chart.tall{height:420px}
.chart.short{height:230px}
.score-box{margin-top:6px}
.score-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.score-item{background:#f8fafc;border-radius:8px;padding:7px 9px}
.score-item .sk{font-size:11px;color:var(--tx3)}
.score-item .sv{font-size:13px;font-weight:600}
.score-track{height:4px;background:#e9edf3;border-radius:2px;margin-top:4px;overflow:hidden}
.score-track i{display:block;height:100%;background:var(--accent)}

/* ---------- K线周期切换（日/周/月/季/年） ---------- */
.kl-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap;margin:2px 0 8px}
.kl-tabs:empty{display:none}
.kl-tab{border:1px solid var(--line);background:#fff;color:var(--tx2);border-radius:6px;
  padding:3px 11px;font-size:12px;cursor:pointer;font-family:inherit;transition:.13s;line-height:1.6}
.kl-tab:hover{background:#f7f9fc;border-color:#cfd7e3;color:var(--tx)}
.kl-tab.active{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}
.kl-tab-note{margin-left:auto;font-size:11px;color:var(--tx3)}
.kl-tab-note b{color:var(--tx2);font-weight:600}
/* 副指标开关（RSI / MACD）：与周期按钮同一套外观，但用左侧竖线隔开 ——
   两组按钮各有一个「高亮项」，不隔开会被读成同一组（「日/周/月/RSI」）。 */
.kl-ind{display:inline-flex;align-items:center;gap:4px;margin-left:10px;padding-left:10px;
  border-left:1px solid var(--line)}
.kl-ind[hidden]{display:none}
.kl-ind-tab{padding:3px 9px}
/* ⚙（RSI 周期设置入口）：内嵌在 RSI 按钮里（设置与 RSI 是一个整体，不是并列按钮），
   比按钮文字更轻、可独立点按展开下方的小面板 */
.kl-ind-gear{margin-left:4px;padding:0 1px;font-size:11px;color:inherit;opacity:.62;
  cursor:pointer;line-height:1}
.kl-ind-gear:hover{opacity:1}
/* RSI 周期设置小面板：挂在切换条（.kl-tabs）下方，绝对定位小弹层 */
.kl-tabs{position:relative}
.kl-ind-setbox{position:absolute;z-index:12;display:inline-flex;align-items:center;gap:6px;
  padding:8px 10px;margin-top:4px;background:#fff;border:1px solid var(--line);
  border-radius:9px;box-shadow:0 8px 24px rgba(20,30,50,.14);font-size:12px}
.kl-ind-setbox[hidden]{display:none}
.rsi-set-lb{color:var(--tx3);white-space:nowrap}
.rsi-set-in{width:52px;padding:3px 6px;border:1px solid var(--line);border-radius:6px;
  font-size:12.5px;font-family:inherit;text-align:center}
.rsi-set-in:focus{outline:none;border-color:var(--accent)}
/* 悬停提示里副指标数值前的色点（与图上那条线同色） */
.kl-tip .idt{display:inline-block;width:6px;height:6px;border-radius:50%;margin-right:4px;
  vertical-align:middle;opacity:.9}
/* 抽屉K线工具条上的开关（候选标记）：小号复选框，与周期按钮同一行 */
.kl-fc{display:inline-flex;align-items:center;gap:4px;margin-left:8px;font-size:12px;
  color:var(--tx2);cursor:pointer;user-select:none;white-space:nowrap}
.kl-fc input{accent-color:#f59e0b;margin:0;cursor:pointer}
/* 缩放锁按钮：锁形图标即状态（🔒=锁定 🔓=解锁），锁定时琥珀色底一眼可辨 */
.kl-lock{margin-left:8px;border:1px solid var(--line);background:#fff;border-radius:6px;
  padding:2px 7px;font-size:13px;line-height:1.5;cursor:pointer;font-family:inherit;
  color:var(--tx2);user-select:none}
.kl-lock[aria-pressed="true"]{background:#fff7ed;border-color:#f3c98b}
.kl-lock:hover{border-color:#cfd7e3;color:var(--tx)}
/* 候选命中图例（字母 A~G）：方形徽标 = 候选命中，圆点 B/S = 成交。
   两者必须一眼分开 —— 尤其策略B 的徽标（紫框紫字方形）与买入点的红底白字圆形。 */
.kl-cand-legend{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin:-2px 0 6px;padding:4px 8px;font-size:11px;color:var(--tx2);
  background:#f8fafc;border:1px solid var(--line);border-radius:7px}
.kl-cand-legend[hidden]{display:none}
.kl-cand-legend .cl-hd{color:var(--tx3)}
.kl-cand-legend .cl-item{display:inline-flex;align-items:center;gap:4px}
.kl-cand-legend .cl-item.cur{font-weight:600;color:var(--tx)}
.kl-cand-legend .cl-badge{display:inline-flex;align-items:center;justify-content:center;
  width:17px;height:14px;border-radius:3px;font-style:normal;font-size:10px;font-weight:600;
  line-height:1;color:var(--sc);border:1.2px solid var(--sc);background:#fff}
.kl-cand-legend .cl-item.cur .cl-badge{background:var(--sc);color:#fff}
.kl-cand-legend .cl-tip{margin-left:auto;color:var(--tx3)}

/* ---------- 基本面（参考东方财富个股详情页） ---------- */
.fund-box:empty{display:none}
.fund-sec{margin-top:14px;padding-top:12px;border-top:1px solid var(--line2)}
.fund-sec:first-child{margin-top:10px;padding-top:0;border-top:none}
.fs-hd{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;font-size:12.5px;font-weight:600;
  color:var(--tx);margin-bottom:8px}
.fs-hd .fs-src{font-size:11px;font-weight:400;color:var(--tx3)}
.fs-hd .fs-err{margin-left:auto;font-size:11px;color:#9a6b10;background:#fff8e6;
  border-radius:5px;padding:1px 7px;font-weight:400}
/* 备用源徽标与「字段缺失」提示：和「取数失败」区分开 —— 有数但不满，不是错误 */
.fs-hd .fs-warn{margin-left:auto;font-size:11px;color:#8a5a00;background:#fff3d6;
  border:1px solid #f2d79b;border-radius:5px;padding:0 7px;font-weight:400}
.fund-miss{margin-top:6px;font-size:11px;color:#8a5a00;background:#fffaf0;border:1px solid #f4e3bd;
  border-radius:6px;padding:5px 8px;line-height:1.6}
.fund-tags{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12px;color:var(--tx2)}
.fund-tags .chip{background:#f0f3f8;border-radius:20px;padding:1px 9px;font-size:11px;color:var(--tx2)}
.fund-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(152px,1fr));gap:7px 12px}
.fg{display:flex;justify-content:space-between;align-items:baseline;gap:10px;
  border-bottom:1px dashed var(--line2);padding:4px 0}
.fg .k{color:var(--tx3);font-size:11.5px;white-space:nowrap}
.fg .v{font-size:12.5px;font-weight:600;font-variant-numeric:tabular-nums;text-align:right}
.fund-tbl{min-width:820px}
.fund-tbl td:first-child{font-weight:500}
.fund-note{margin-top:8px;font-size:11px;color:var(--tx3);line-height:1.7}
.fund-none{font-size:12px;color:var(--tx3);padding:6px 0}

/* ---------- prose ---------- */
.prose{font-size:13.5px;line-height:1.8;color:var(--tx)}
.prose h3{font-size:15px;margin:18px 0 8px;padding-left:9px;border-left:3px solid var(--accent)}
.prose h3:first-child{margin-top:0}
.prose ul{margin:6px 0;padding-left:20px}
.prose li{margin:3px 0}
.prose code{background:#f1f4f9;padding:1px 6px;border-radius:4px;font-size:12.5px;
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#c0392b}
.prose table{width:100%;border-collapse:collapse;font-size:12.5px;margin:8px 0}
.prose th,.prose td{border:1px solid var(--line);padding:6px 9px;text-align:left}
.prose th{background:#f8fafc;font-weight:500;color:var(--tx2)}
.kv{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:8px 0}

/* ---------- 股票详情抽屉 ---------- */
.dw-mask{position:fixed;inset:0;background:rgba(20,30,50,.30);z-index:40;
  opacity:0;visibility:hidden;transition:opacity .24s ease,visibility 0s linear .24s}
.dw-mask.open{opacity:1;visibility:visible;transition:opacity .24s ease}
.drawer{
  position:fixed;top:0;right:0;bottom:0;width:min(780px,96vw);background:var(--card);
  border-left:1px solid var(--line);box-shadow:-14px 0 40px rgba(20,30,50,.16);
  z-index:41;display:flex;flex-direction:column;
  transform:translateX(103%);visibility:hidden;
  transition:transform .26s cubic-bezier(.4,0,.2,1),visibility 0s linear .26s;
}
.drawer.open{transform:none;visibility:visible;
  transition:transform .26s cubic-bezier(.4,0,.2,1)}
.dw-hd{position:relative;display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;
  padding:12px 62px 12px 16px;border-bottom:1px solid var(--line);background:#fbfcfe}
.dw-hd h2{font-size:15px}
.dw-body{flex:1;overflow:auto;padding:12px 16px 4px}
.drawer #dw-chart{height:calc(100vh - 288px);min-height:300px}
.drawer #dw-score{margin-top:6px}
.dw-foot{padding:8px 16px;border-top:1px solid var(--line2);background:#fbfcfe}
.dw-foot b{color:var(--tx2)}
/* 关闭键：右上角圆形大按钮（2026-10-29）。34px = 手指触控舒适下限（32px+）与
   抽屉头部高度之间的平衡点：再大就压到第一行的价格/市值，再小就难点中。
   absolute 而不是排在工具行里 —— 两行工具换行变宽时它都钉死在右上角不跳位。 */
.dw-close{position:absolute;top:10px;right:12px;width:34px;height:34px;border-radius:50%;
  border:1px solid var(--line);background:#fff;font-size:16px;color:var(--tx2);
  cursor:pointer;padding:0;line-height:1;font-family:inherit;
  box-shadow:0 1px 4px rgba(20,30,50,.08)}
.dw-close:hover{background:#f2f5f9;color:var(--tx)}
.dw-close:active{background:#e9eef5}
body.dw-open{overflow:hidden}
@media(max-width:900px){
  .drawer{width:100vw;border-left:none}
  .dw-hd{padding:10px 12px}
  .dw-body{padding:10px 12px 4px}
  .drawer #dw-chart{height:calc(100vh - 290px)}
}

/* ---------- 自选股 ---------- */
.tab .tab-n{display:inline-block;min-width:17px;margin-left:5px;padding:0 5px;border-radius:9px;
  background:#eaeef4;color:var(--tx2);font-size:10.5px;line-height:1.6;text-align:center;
  font-variant-numeric:tabular-nums;vertical-align:1px}
.tab.active .tab-n{background:#dbe6ff;color:var(--accent)}
.wk-add{display:flex;gap:8px;align-items:flex-start;margin-bottom:8px}
.wk-add-inp{position:relative;flex:1;max-width:440px;margin-bottom:0}
/* 反推结果头栏（抽屉快捷反推）：标题信息 + 「收起」按钮两端对齐。
   原 .rt-code-wrap / .rt-kbox / .rt-kchart 已随数据工具页反推卡删除（2026-10-28）。 */
.rt-headbar{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.watch-tbl tr.wk-row{cursor:pointer}
.watch-tbl tr.wk-row.dragging{opacity:.4;background:var(--accent2)}
.watch-tbl .wk-sort{white-space:nowrap}
.wk-handle{cursor:grab;color:var(--tx3);letter-spacing:-3px;user-select:none;margin-right:3px;
  font-size:13px;vertical-align:-1px}
.wk-handle:active{cursor:grabbing}
.wk-idx{display:inline-block;min-width:18px;text-align:center;color:var(--tx3);font-size:11.5px;
  font-weight:600;font-variant-numeric:tabular-nums}
.wk-btns{display:inline-flex;gap:2px;margin-left:7px}
.wk-btn{padding:1px 5px;min-width:21px;line-height:1.55;font-size:11px}
.wk-btn:disabled{opacity:.3;cursor:not-allowed}
.btn.star{white-space:nowrap}
.btn.star.on{background:#fff7e6;border-color:#eed9a4;color:var(--gold)}
.btn.star.on:hover{background:#fdefcf;border-color:#e4c882}

/* ---------- toast ---------- */
.toast{position:fixed;bottom:28px;left:50%;transform:translateX(-50%);background:#1b2230;color:#fff;
  padding:10px 20px;border-radius:9px;font-size:13px;z-index:99;box-shadow:0 8px 26px rgba(0,0,0,.25)}
.empty{padding:26px;text-align:center;color:var(--tx3);font-size:13px}

/* ---------- 顶栏：当前登录用户 ---------- */
.usermeta{display:flex;align-items:center;gap:8px;flex:none;padding-left:4px}
.usermeta[hidden]{display:none}
.um-mail{font-size:12px;color:var(--tx2);max-width:190px;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;font-variant-numeric:tabular-nums}
.um-mail::before{content:"👤";margin-right:5px;font-size:11px;opacity:.75}

/* ---------- 登录 / 注册闸门 ----------
   全屏遮罩 + 一张卡。不跳独立页面：登录成功后要恢复当前页签与筛选状态。
   背景用两团极淡的径向渐变（蓝/绿）压住白卡的单调，又不抢输入框的注意力。 */
.auth-gate{
  position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;padding:24px;
  background:
    radial-gradient(1100px 560px at 18% -10%, #e9f0ff 0%, rgba(233,240,255,0) 62%),
    radial-gradient(900px 520px at 102% 112%, #e9f7f1 0%, rgba(233,247,241,0) 58%),
    var(--bg);
}
.auth-gate[hidden]{display:none}
.auth-card{
  width:100%;max-width:392px;background:var(--card);border:1px solid var(--line);border-radius:16px;
  padding:24px 26px 18px;box-shadow:0 24px 56px rgba(20,30,50,.11),0 2px 6px rgba(20,30,50,.05);
}
.ag-brand{display:flex;align-items:center;gap:10px;margin-bottom:16px}
.ag-logo{width:34px;height:34px;display:block;border-radius:8px;flex:none}
.ag-brand h2{font-size:16px;letter-spacing:.2px}
.ag-sub{margin:2px 0 0;font-size:11.5px;color:var(--tx3)}
.ag-tabs{display:flex;gap:4px;background:#f2f5f9;border-radius:9px;padding:3px;margin-bottom:14px}
.ag-tab{
  flex:1;border:none;background:transparent;color:var(--tx2);font:inherit;font-size:12.5px;
  padding:7px 0;border-radius:7px;cursor:pointer;transition:.15s;
}
.ag-tab:hover{color:var(--tx)}
.ag-tab.active{background:#fff;color:var(--accent);font-weight:600;box-shadow:0 1px 2px rgba(20,30,50,.08)}
.ag-field{margin-bottom:11px}
.ag-field[hidden]{display:none}
.ag-field > label{display:block;font-size:11.5px;color:var(--tx3);margin-bottom:4px}
.ag-field input{
  width:100%;height:38px;padding:0 11px;border:1px solid var(--line);border-radius:9px;
  background:#fbfcfe;font:inherit;font-size:13px;color:var(--tx);outline:none;transition:.15s;
}
.ag-field input:focus{background:#fff;border-color:var(--accent);box-shadow:0 0 0 3px rgba(47,111,237,.1)}
.ag-field input::placeholder{color:#aab3c0;font-size:12.5px}
.ag-code-row{display:flex;gap:8px}
.ag-code-row input{flex:1;letter-spacing:3px;font-variant-numeric:tabular-nums}
.ag-code-row .btn{flex:none;height:38px;padding:0 12px;font-size:12.5px;white-space:nowrap}
.ag-code-row .btn:disabled{opacity:.55;cursor:not-allowed}
.ag-msg{min-height:18px;font-size:12px;line-height:1.5;margin:2px 0 8px;color:var(--tx2)}
.ag-msg.err{color:var(--up)}
.ag-msg.ok{color:var(--down)}
.ag-msg.dev{color:var(--gold)}
.ag-submit{height:40px;font-size:13.5px;margin-top:2px}
.ag-note{margin:12px 0 0;font-size:11px;line-height:1.6;color:var(--tx3);text-align:center}
.ag-note b{color:var(--tx2);font-weight:600}
.ag-note .warn{color:var(--gold)}

/* ---------- 邀请码（管理员弹窗） ----------
   列表每行一格：码 / 绑定邮箱 / 状态 / 角色 / 有效期 / 操作。
   码用等宽字体 + 字距，避免 0/O、1/l 看混（生成时字符表里已经去掉了这些字符）。 */
.iv-mask{position:fixed;inset:0;z-index:210;display:flex;align-items:flex-start;justify-content:center;
  padding:60px 24px 24px;background:rgba(18,24,36,.34);backdrop-filter:blur(2px)}
.iv-mask[hidden]{display:none}
.iv-card{width:100%;max-width:620px;max-height:calc(100vh - 96px);overflow:auto;background:var(--card);
  border:1px solid var(--line);border-radius:14px;padding:18px 20px 16px;
  box-shadow:0 24px 56px rgba(20,30,50,.22)}
.iv-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.iv-head h3{font-size:15px;margin:0}
.iv-x{border:0;background:transparent;font-size:20px;line-height:1;color:var(--tx3);cursor:pointer;
  padding:0 2px;border-radius:6px}
.iv-x:hover{color:var(--tx);background:#f2f5f9}
.iv-tip{margin:0 0 12px;font-size:11.5px;line-height:1.7;color:var(--tx3)}
.iv-form{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.iv-form input#iv-email{flex:1;min-width:180px;height:34px;padding:0 10px;border:1px solid var(--line);
  border-radius:8px;background:#f7f9fc;font-size:12.5px;color:var(--tx)}
.iv-form input#iv-email:focus{outline:none;background:#fff;border-color:var(--accent);
  box-shadow:0 0 0 3px rgba(47,111,237,.1)}
.iv-ttl{font-size:11.5px;color:var(--tx3);display:flex;align-items:center;gap:4px;white-space:nowrap}
.iv-ttl input{width:52px;height:34px;padding:0 6px;border:1px solid var(--line);border-radius:8px;
  background:#f7f9fc;font-size:12.5px;text-align:center;color:var(--tx)}
.iv-sendmail{display:flex;align-items:center;gap:6px;margin:8px 0 0;font-size:11.5px;color:var(--tx3)}
.iv-msg{min-height:18px;font-size:12px;line-height:1.6;margin:8px 0 4px;color:var(--tx2);word-break:break-all}
.iv-msg.err{color:var(--up)}
.iv-msg.ok{color:var(--down)}
.iv-list{display:flex;flex-direction:column;gap:6px;margin-top:4px}
.iv-empty{margin:6px 0;font-size:12px;color:var(--tx3)}
.iv-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:7px 9px;border-radius:9px;
  background:#f8fafd;border:1px solid #eef2f8}
.iv-row.used,.iv-row.expired{opacity:.62}
.iv-code{font-family:Menlo,Consolas,monospace;font-size:12.5px;letter-spacing:.6px;color:var(--tx);
  background:#fff;border:1px solid var(--line);border-radius:6px;padding:2px 6px}
.iv-who{font-size:12px;color:var(--tx2);flex:1;min-width:120px;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.iv-role{font-size:11.5px;color:var(--tx3)}
.iv-when{font-size:11.5px;white-space:nowrap}
.iv-acts{display:flex;gap:4px;flex:none}
.btn.tiny.danger{color:var(--up)}

/* ==========================================================================
   移动端适配（2026-10-29）
   --------------------------------------------------------------------------
   桌面端是「一屏看多栏」的布局：顶栏 sticky、8 个页签平铺、7 个策略按钮平铺、
   表格 13 列 nowrap。手机上只有 360~430px 宽，这些都会直接撑破视口。

   改造思路（尽量只动 CSS，不改 DOM 与交互逻辑）：
   1) 顶栏不再吸顶 —— 它是 sticky top:0，而 taskbar / tabs / strategy-bar 的
      sticky 偏移全部按「顶栏 57px」写死。手机顶栏会折成两行、高度不固定，
      继续 sticky 会让下面三条的偏移全部错位。改成静态后，整页只有页签一层
      sticky，层次最简单、也不会互相遮挡。
   2) 宽条（页签 / 策略切换）改横向滚动，不平铺换行 —— 换行会把首屏吃掉半屏。
   3) 表格保持 tablewrap 横滑（列多且 nowrap，压列会读不出数），但加上
      iOS 惯性滚动与横向 overscroll 隔离，避免误触整页返回。
   4) 输入框在手机上给 16px —— iOS Safari 对 <16px 的输入框会在聚焦时强制放大
      整页，退不回去，是移动端最典型的「页面被放大」来源。
   ========================================================================== */
@media (max-width: 760px) {
  /* ---------- 顶栏：两行，不吸顶 ---------- */
  .topbar{position:static;flex-wrap:wrap;gap:10px;padding:10px 12px}
  .brand{min-width:0;flex:1 1 auto;gap:8px}
  .brand .logo{width:26px;height:26px;border-radius:6px}
  .brand h1{font-size:15px}
  .brand .sub{display:none}                 /* 副标题在手机上只占高度 */
  .usermeta{padding-left:0}
  .um-mail{display:none}                    /* 留出位置给「邀请 / 退出」 */
  .topsearch{flex:1 1 100%;height:38px}
  .ts-pop{left:0;right:0;min-width:0;max-width:none}
  .ts-row .ts-px{min-width:78px}

  /* ---------- 页签：横向滚动 + 唯一一层 sticky ---------- */
  .tabs{
    position:sticky;top:0;z-index:28;
    flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;
    padding:6px 10px 0;gap:2px;
    -webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;
    scrollbar-width:none;
  }
  .tabs::-webkit-scrollbar{display:none}
  .tab{flex:0 0 auto;padding:8px 12px;font-size:12.5px}

  /* ---------- 任务条：静态，进度与文案分两行 ---------- */
  .taskbar{position:static;flex-wrap:wrap;gap:8px;padding:8px 12px}
  .tb-track{flex:1 1 100%;order:3}
  .tb-msg{flex:1 1 100%;max-width:none;order:4;white-space:normal}

  /* ---------- 策略切换条：横向滚动 ---------- */
  .strategy-bar{
    position:static;flex-wrap:nowrap;overflow-x:auto;gap:8px;padding:8px 10px;
    -webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;
    scrollbar-width:none;
  }
  .strategy-bar::-webkit-scrollbar{display:none}
  .sb-label{display:none}                   /* 「策略」二字在手机上没信息量 */
  .sb-note{display:none}                    /* 口径说明留到「策略说明」页看 */
  .sb-btn{flex:0 0 auto;padding:6px 10px;font-size:12.5px}
  .sb-ret{font-size:11px}

  /* ---------- 主区与卡片 ---------- */
  main{padding:10px 10px calc(56px + env(safe-area-inset-bottom))}
  .card{padding:11px;border-radius:9px;margin-bottom:10px}
  .card-hd{gap:8px;margin-bottom:8px}
  .card-hd h2{font-size:13.5px;line-height:1.45}
  .hd-tools{gap:8px;row-gap:6px}
  .regime{flex-wrap:wrap;font-size:12px;padding:8px 10px;line-height:1.6}

  /* ---------- 指数 4 格 → 2 格 ---------- */
  .idx-strip{grid-template-columns:1fr 1fr;gap:8px}
  .idx{padding:8px 10px;border-radius:9px}
  .idx .n{font-size:11px}
  .idx .v{font-size:16px}

  /* ---------- 卡内小栅格 ---------- */
  .score-grid{grid-template-columns:1fr 1fr}
  .kv{grid-template-columns:1fr}
  .legend{flex-wrap:wrap;gap:8px 12px}
  .stat-row .v{font-size:15px}

  /* ---------- 表格：横滑 + 惯性 ---------- */
  .tablewrap{
    -webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;
    scrollbar-width:thin;
  }
  .tbl{font-size:12px}
  .tbl th{font-size:11px;padding:7px 8px}
  .tbl td{padding:7px 8px}
  .tbl th,.tbl td{padding-left:8px;padding-right:8px}
  .sub{font-size:10px}

  /* ---------- 图表高度：按手机竖屏重设 ---------- */
  .chart{height:250px}
  .chart.tall{height:320px}
  .chart.short{height:200px}
  .score-box{margin-top:4px}

  /* ---------- 表单控件：16px 防 iOS 聚焦缩放 ---------- */
  .inp,#ts-input,.ag-field input,.iv-form input#iv-email,.iv-ttl input,
  .ag-code-row input,.ar-num,.mgr-row .inp{font-size:16px}
  .inp{padding:8px 10px}
  select.inp{width:100%;min-width:0}
  .dd{display:block;width:100%}
  .dd-btn{width:100%;min-width:0}
  .dd-pop{left:0;right:auto;width:100%;min-width:0;max-width:none}
  .field label{font-size:11.5px}
  .quick button{padding:7px 4px;font-size:12.5px}

  /* ---------- 按钮：加大触控面积 ---------- */
  .btn{padding:8px 13px}
  .btn.tiny{padding:5px 10px;font-size:11.5px}
  .seg{max-width:100%;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}
  .seg::-webkit-scrollbar{display:none}
  .seg-btn{flex:0 0 auto;padding:7px 14px;font-size:12.5px}

  /* ---------- K线工具条：周期按钮允许换行，图例收窄 ---------- */
  .kl-tabs{gap:6px}
  .kl-tab{padding:5px 10px;font-size:12px}
  .kl-tab-note{margin-left:0;flex:1 1 100%}
  .kl-cand-legend{gap:8px;font-size:10.5px}
  .kl-cand-legend .cl-tip{display:none}
  .kl-head{gap:8px}
  .kl-price .p{font-size:16px}

  /* ---------- 详情抽屉 ---------- */
  .dw-hd{padding:10px 54px 10px 12px}
  .dw-hd h2{font-size:14px}
  .dw-body{padding:10px 12px 4px}
  .drawer #dw-chart{height:calc(100vh - 300px);min-height:240px}
  .dw-foot{padding:8px 12px}

  /* ---------- 登录闸门 ---------- */
  .auth-gate{padding:16px}
  .auth-card{padding:20px 18px 14px;border-radius:14px}
  .ag-brand{margin-bottom:14px}
  .ag-brand h2{font-size:15px}
  .ag-submit{height:42px}

  /* ---------- 邀请码弹窗 ---------- */
  .iv-mask{padding:20px 12px}
  .iv-card{padding:14px 14px 12px;border-radius:12px}
  .iv-form{gap:6px}
  .iv-form input#iv-email{min-width:0;flex:1 1 100%}
  .iv-ttl{flex:1 1 auto}
  .iv-row{gap:6px;padding:8px}
  .iv-who{flex:1 1 100%;min-width:0}
  .iv-acts{margin-left:auto}

  /* ---------- toast：改为通栏，居中文字 ---------- */
  .toast{left:12px;right:12px;transform:none;bottom:16px;text-align:center;padding:10px 14px}
  .empty{padding:20px;font-size:12.5px}

  /* ---------- 说明页（.prose）的表格：宽表横滑，不许压扁 ----------
     策略总览 8 列表被塞进 390px 时，每列只剩 40px，中文竖排一字一行，
     整页还被撑到 468px 出横向滚动。app.js 已给每张 .prose table 包了
     .tbl-scroll 横滑容器；这里让表格按内容自然展开（td 限宽保证长句折行），
     容器在窄屏内横向滚动。 */
  .tbl-scroll{
    overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;
    scrollbar-width:thin;
  }
  .prose table{width:max-content;min-width:100%;max-width:none}
  .prose th,.prose td{white-space:normal;max-width:20em}
  .prose code{word-break:break-all}         /* 配置键名常无空格，防撑破 */
}

/* 小屏手机（iPhone SE / 小米 8 之类，<=420px）再压一档 */
@media (max-width: 420px) {
  main{padding:8px 8px calc(52px + env(safe-area-inset-bottom))}
  .card{padding:9px;margin-bottom:8px}
  .topbar{padding:8px 10px;gap:8px}
  .brand h1{font-size:14px}
  .idx .v{font-size:15px}
  .tbl{font-size:11.5px}
  .tbl th,.tbl td{padding:6px 7px}
  .btn{padding:7px 11px}
  .chart{height:230px}
  .chart.tall{height:290px}
}
