/* ═══════════════════════════════════════════════════════
   福兮量化终端 · 专业金融终端主题
   深色商务风 · 高密度数据排版 · A股红涨绿跌规范
   ═══════════════════════════════════════════════════════ */
:root{
  --bg:#0a0e17;
  --bg2:#0d1220;
  --panel:#101627;
  --panel2:#141b30;
  --line:#1e2740;
  --line2:#2a3550;
  --text:#dde4f0;
  --muted:#7c88a6;
  --muted2:#5a6580;
  --red:#f23645;      /* 涨 */
  --red-bg:rgba(242,54,69,.12);
  --green:#00c087;    /* 跌 */
  --green-bg:rgba(0,192,135,.10);
  --gold:#d4af37;
  --gold2:#e8c86a;
  --cyan:#4aa8ff;
  --mono:'SF Mono','JetBrains Mono','Menlo',Consolas,'Courier New',monospace;
  --sans:'PingFang SC','Microsoft YaHei',-apple-system,BlinkMacSystemFont,'Helvetica Neue',sans-serif;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{background:var(--bg);color:var(--text);font-family:var(--sans);font-size:13px;min-height:100vh;overflow-x:hidden}
/* ── 背景（专业暗化银河）── */
/* ── v6.14.1 修复：#space 不再带 filter ──────────────────────────────
 *  v6.14.0 时 #space 上有 `filter:brightness(.48) saturate(.7) contrast(1.05)`，
 *  而星球/陨石当时嵌在它内部 —— 这是个真实缺陷：
 *    ① filter 非 none 的元素会【成为后代的包含块】，使后代中
 *       position:fixed 不再相对视口定位（跨浏览器行为不一致）；
 *    ② filter 作用于【整个子树】→ 素材里已降暗到 0.72 的星球
 *       又被乘 0.48，实际亮度只剩 0.35，天体被压得过暗；
 *    ③ 还会强制子树栅格化，增加合成开销。
 *  修法：把 filter 下移到【只包住 galaxy.jpg 背景】的伪元素上，
 *  星球/陨石移到 #space 之外（见 standalone-server.js 的结构注释）。
 *  这样背景该暗的照样暗，天体则保持素材本身的亮度与定位语义。 */
/* ══ v6.17.0（用户要求）：背景改为【纯色渐变】，移除背景图 ═════════════
 *  用户反馈："背景图太丑了，不好看，帮我换张好看的"
 *          → 追问后明确选择："不要背景图，改纯色渐变"
 *
 *  ── 为什么换图解决不了（实测数据，这是做出该决策的依据）─────────
 *  对线上页面截图做像素级测量后发现：
 *    · 主内容面板 .panel 是 rgba(16,22,39,.92) —— 【92% 不透明】
 *    · 页面共有 32 处半透明深色背景（面板/表头/卡片）
 *    · 实测背景图【仅在两侧窄边 + 底部可见，合计约 15% 屏幕面积】
 *  即：无论换成多好看的图，85% 的面积都被面板盖住，用户几乎看不到。
 *  这是"换了好几张图都不满意"的根本原因 —— 问题不在素材。
 *
 *  ── 新方案：纯色渐变（无图片请求、无加载失败风险）──────────────
 *  用多层 radial-gradient 叠加模拟"深空辉光"，效果上：
 *    · 中心偏上有一团极淡的青色辉光（呼应主色 var(--cyan)）
 *    · 底部一片更深的暗区，让页脚自然收束
 *    · 整体亮度压得很低（实测均亮度 < 15/255），
 *      保证与面板、正文形成足够对比，绝不干扰阅读
 *  技术收益：
 *    · 去掉 1 个 HTTP 请求（原先每次访问都要下载 434KB）
 *    · 没有任何图片解码与合成开销，滚动更稳
 *    · 不会因图片丢失/损坏导致背景崩坏（图片是"资源依赖"，
 *      渐变只是几行 CSS）
 *  ⚠️ 保留了原有的星尘/银河 canvas 与扫描线动效：
 *    它们是"动效"，与"背景图"是两件事，用户只要求去掉背景图。 */
#space{position:fixed;inset:0;z-index:0;overflow:hidden;
  background:
    radial-gradient(1200px 720px at 50% -8%, rgba(43,92,138,.22), transparent 62%),
    radial-gradient(900px 620px at 12% 22%, rgba(74,168,255,.09), transparent 60%),
    radial-gradient(1000px 700px at 88% 34%, rgba(140,110,220,.075), transparent 62%),
    linear-gradient(180deg, #0b1220 0%, #0a0f1c 32%, #080d18 68%, #060a13 100%)}
/* 细网格纹理：纯色容易显得"平"，叠一层极淡的网格能增加质感，
   同时在视觉上把背景与内容面板区分开（网格只在面板外可见）。
   ⚠️ 用 repeating-linear-gradient 而非图片，仍是零请求。 */
#space::before{content:'';position:absolute;inset:0;opacity:.5;
  background-image:
    repeating-linear-gradient(0deg, rgba(255,255,255,.016) 0 1px, transparent 1px 44px),
    repeating-linear-gradient(90deg, rgba(255,255,255,.016) 0 1px, transparent 1px 44px);
  mask-image:radial-gradient(ellipse 120% 80% at 50% 40%, #000 30%, transparent 78%);
  -webkit-mask-image:radial-gradient(ellipse 120% 80% at 50% 40%, #000 30%, transparent 78%)}
/* 底部暗化：让长页面底部自然收暗，避免"渐变色被截断"的突兀感 */
#space::after{content:'';position:absolute;inset:0;
  background:linear-gradient(180deg, transparent 0%, rgba(4,7,14,.28) 62%, rgba(3,5,11,.62) 100%)}
/* ── v6.18.0（用户要求）：已移除背景动效样式 ──────────────────────────
 *  用户反馈："背景星球动图代码和UI移除"。
 *  以下样式随动效一并删除（对应的 HTML 元素与 JS 也已移除）：
 *    #galaxyFx  —— 银河旋臂 canvas（旋转星系 + 亮核）
 *    #starfield —— 星尘粒子 canvas
 *    #scanline + @keyframes scan  —— 循环扫描线
 *    .shooting + @keyframes shoot —— 随机流星
 *  保留 #space 的纯色渐变背景（用户只要求去掉动图，背景渐变仍需要）。
 *  ⚠️ 若将来要恢复动效：HTML 加回 canvas、JS 加回绘制逻辑、
 *    此处加回样式，三处必须同步（缺一处即为静默失效）。 */


.wrap{position:relative;z-index:3;max-width:1280px;margin:0 auto;padding:0 20px 60px}

/* ── 顶部品牌栏 ── */
.topbar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;padding:14px 0 10px;border-bottom:1px solid var(--line)}
.brand{display:flex;align-items:center;gap:12px}
.brand .logo{width:38px;height:38px;border-radius:8px;background:linear-gradient(135deg,#1a2438,#0d1220);border:1px solid var(--line2);display:flex;align-items:center;justify-content:center;font-size:18px;color:var(--gold)}
.brand h1{font-size:17px;font-weight:700;letter-spacing:2px;color:#eef2fa}
.brand h1 em{font-style:normal;color:var(--gold);font-weight:800}
.brand .ver{font-size:10.5px;color:var(--muted2);letter-spacing:1px;border:1px solid var(--line2);border-radius:4px;padding:1px 6px;margin-left:8px}
.brand .tagline{font-size:11px;color:var(--muted);margin-top:2px;letter-spacing:.5px}

/* ══ 主流ETF实时行情（v6.9.18 重设计）════════════════════════════
 *  位置：资讯速览下方、个股查询上方（用户指定）。
 *  配色遵循 A 股规范：涨=红(--red)、跌=绿(--green)。
 *
 *  v6.9.18 三项改动（用户明确要求）：
 *   ① 去掉筛选项 —— .etf-tabs / .etf-tab 整套样式删除，
 *      筛选逻辑也从 app.js 移除（不是隐藏，是彻底不要）。
 *   ② 压缩高度 —— 卡片由 3 行压到 2 行，行高/内边距同步收紧；
 *      .etf-grid 的 min-height 从 88px 降到 0（收起态由内容自然撑开，
 *      不再预留多余空白）。成交额/振幅移到 title 悬停提示。
 *   ③ 默认 2 行 + 展开收起 —— 截断逻辑在 app.js（按实际列数 × 2），
 *      这里只负责开关按钮与计数文字的外观。
 *
 *  ⚠️ 列宽从 196px 提到 150px：更窄的卡片能在同样宽度里多放一列，
 *     "2 行"因此能覆盖更多只 ETF（宽屏实测 6 列 × 2 行 = 12 只）。 */
.etf-grid{min-height:0}
/* ── v6.21.0：行业ETF排行榜 Top6（推荐准入依据）─────────────────────
   用户要求"所属行业ETF 必须在所有ETF排行榜 Top6 中"。
   这一块把判定依据摊开给用户看，因此排版以"可快速核对名次"为第一目标：
   名次号固定宽度右对齐 + 涨跌幅等宽，方便纵向扫读比较。 */
.etf-rank-note{font-size:12px;color:var(--muted);line-height:1.6;margin:0 0 9px;
  padding:7px 10px;border-radius:7px;background:rgba(255,255,255,.03);border:1px solid var(--line)}
.etf-rank-note b{color:#e6ecf8}
.etf-rank-list{display:flex;flex-direction:column;gap:5px}
.etf-rank-row{display:grid;grid-template-columns:26px minmax(0,1.5fr) 62px 74px minmax(0,1fr);
  align-items:center;gap:9px;padding:6px 10px;border-radius:7px;
  border:1px solid var(--line);background:rgba(20,27,48,.6);font-size:12.5px}
.etf-rank-row.top3{background:rgba(228,72,72,.07);border-color:rgba(228,72,72,.28)}
.etf-rank-no{text-align:right;font-weight:700;color:#e6ecf8;font-variant-numeric:tabular-nums}
.etf-rank-row.top3 .etf-rank-no{color:var(--red)}
.etf-rank-name{color:#e6ecf8;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.etf-rank-code{color:var(--muted);font-size:11.5px;font-variant-numeric:tabular-nums}
.etf-rank-pct{text-align:right;font-weight:700;font-variant-numeric:tabular-nums}
.etf-rank-ind{color:var(--muted);font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
@media(max-width:720px){
  .etf-rank-row{grid-template-columns:22px minmax(0,1.4fr) 58px 66px;gap:7px}
  .etf-rank-ind{display:none}
}
/* 个股理由面板里的"行业ETF排名"行（v6.21.0）—— 涨/跌/缺失三态着色 */
.reason-etf-inline .etf-rank-line{font-weight:600}
.reason-etf-inline .etf-rank-line.up{color:var(--red)}
.reason-etf-inline .etf-rank-line.down{color:var(--green)}
.reason-etf-inline .etf-rank-line.flat{color:var(--muted)}
/* 防抖动：加载态给固定高度避免下方内容跳动 */
.etf-loading{padding:20px 0;text-align:center;color:var(--muted);font-size:12.5px}
.etf-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:7px}
.etf-card{border-radius:8px;padding:7px 10px;border:1px solid var(--line);
  background:linear-gradient(160deg,rgba(20,27,48,.92),rgba(16,22,39,.92));transition:.18s;
  cursor:default}
.etf-card:hover{border-color:var(--line2);transform:translateY(-1px)}
/* 涨=红、跌=绿：整卡用左侧色条 + 涨跌幅文字着色，一眼可辨 */
.etf-card.up{border-left:3px solid var(--red)}
.etf-card.down{border-left:3px solid var(--green)}
.etf-card.flat{border-left:3px solid var(--line2)}
/* 第 1 行：名称 + 涨跌幅（涨幅是主视觉，放右侧对齐） */
.etf-card .ec-top{display:flex;align-items:baseline;justify-content:space-between;gap:6px}
.etf-card .ec-name{font-size:12px;font-weight:600;color:#e6ecf8;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;min-width:0}
.etf-card .ec-pct{font-size:13.5px;font-weight:800;font-family:var(--mono);
  letter-spacing:.2px;flex-shrink:0}
.etf-card.up .ec-pct{color:var(--red)}
.etf-card.down .ec-pct{color:var(--green)}
.etf-card.flat .ec-pct{color:var(--muted)}
/* 第 2 行：代码 + 现价（次要信息，弱化处理） */
.etf-card .ec-bot{display:flex;align-items:baseline;justify-content:space-between;gap:6px;margin-top:2px}
.etf-card .ec-code{font-size:10px;font-family:var(--mono);color:var(--muted2)}
.etf-card .ec-price{font-size:11.5px;font-family:var(--mono);color:#b9c6dc}
/* ── 展开/收起开关行 ── */
.etf-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;
  margin-top:9px;padding-top:8px;border-top:1px solid var(--line);min-height:20px}
.etf-foot .etf-count{font-size:11px;color:var(--muted2);font-family:var(--mono)}
.etf-toggle{font-size:11.5px;font-weight:600;color:var(--cyan);cursor:pointer;
  background:rgba(74,168,255,.08);border:1px solid rgba(74,168,255,.28);
  border-radius:6px;padding:3px 12px;transition:.18s}
.etf-toggle:hover{background:rgba(74,168,255,.18);color:#cfe4ff}
.etf-toggle:active{transform:translateY(1px)}

/* ── 榜单口径说明（v6.9.19）──
   对外推广前补充：把"准入规则/标的范围/概率口径/参考价位"四条讲清楚。
   视觉上做成低饱和的信息条 —— 专业但不抢行情数据的焦点。
   小屏自动换行，避免撑破面板。 */
.board-note{display:flex;flex-wrap:wrap;gap:6px 14px;padding:8px 12px;margin-bottom:10px;
  background:rgba(74,168,255,.05);border:1px solid rgba(74,168,255,.16);
  border-radius:8px;font-size:11px;line-height:1.7}
.board-note .bn-item{color:var(--muted);display:flex;align-items:baseline;gap:5px}
.board-note .bn-item b{color:#9fc4ea;font-weight:700;flex-shrink:0}

/* ── 资讯速览（与 panel 卡片体系统一：同圆角/边框/标题风格） ── */
.news-ticker{display:flex;flex-direction:column;gap:4px;background:rgba(16,22,39,.92);border:1px solid var(--line);border-radius:10px;padding:0;margin:12px 0;overflow:hidden}
/* 标题行：资讯速览标签 + 缩放按钮同一行（按钮右侧） */
.news-ticker .nt-head{display:flex;align-items:center;justify-content:space-between;padding:10px 18px;border-bottom:1px solid var(--line);background:rgba(13,18,32,.6)}
.news-ticker .nt-label{font-size:13.5px;font-weight:600;color:#e8edf7;letter-spacing:1px;display:flex;align-items:center;gap:8px}
.news-ticker .nt-label::before{content:'';width:6px;height:6px;border-radius:50%;background:var(--cyan);box-shadow:0 0 8px var(--cyan)}
.news-ticker .nt-items{display:flex;flex-direction:column;gap:2px;padding:8px 18px 12px}
/* 资讯速览展开/收起（文字链接：与标题同行靠右） */
.news-ticker .nt-toggle{display:inline-flex;align-items:center;justify-content:center;padding:3px 10px;font-size:11.5px;font-weight:600;line-height:1;border-radius:5px;background:rgba(74,168,255,.08);border:1px solid rgba(74,168,255,.3);color:var(--cyan);cursor:pointer;transition:.2s;flex-shrink:0;white-space:nowrap}
.news-ticker .nt-toggle:hover{background:rgba(74,168,255,.2);border-color:var(--cyan)}
/* 每条：图标+[多]/[空]标签+文本（简约，仅文字颜色，无边框——边框仅用于榜单信号标签） */
.news-ticker .nt-item{display:flex;align-items:flex-start;gap:6px;font-size:12px;color:#c6cfe2;line-height:1.6;padding:2px 0}
.news-ticker .nt-item .nt-ico{flex-shrink:0;font-size:11px;margin-top:2px}
.news-ticker .nt-item .nt-title{flex-shrink:0;font-size:10.5px;font-weight:600;margin-top:1px;min-width:26px;text-align:center}
.news-ticker .nt-item .nt-title.bull{color:var(--red)}
.news-ticker .nt-item .nt-title.bear{color:var(--green)}
.news-ticker .nt-item .nt-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.news-ticker .nt-item .nt-text a{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:bottom}
.news-ticker .nt-item a{color:#8ecbff;text-decoration:none;border-bottom:1px dashed rgba(142,203,255,.4)}
.news-ticker .nt-item a:hover{color:#fff}

/* ── 市场指数条 ── */
.market-strip{display:flex;gap:0;margin:12px 0;background:var(--panel);border:1px solid var(--line);border-radius:10px;overflow:hidden}
.mkt-idx{flex:1;padding:10px 16px;border-right:1px solid var(--line);min-width:0}
.mkt-idx:last-child{border-right:none}
.mkt-idx .mi-name{font-size:11px;color:var(--muted);letter-spacing:1px}
.mkt-idx .mi-val{font-size:17px;font-weight:700;font-family:var(--mono);margin-top:2px}
.mkt-idx .mi-chg{font-size:11.5px;font-family:var(--mono);margin-top:1px}
.mkt-idx.up .mi-val,.mkt-idx.up .mi-chg{color:var(--red)}
.mkt-idx.down .mi-val,.mkt-idx.down .mi-chg{color:var(--green)}
.mkt-idx.flat .mi-val,.mkt-idx.flat .mi-chg{color:var(--muted)}

/* ── 状态栏 ── */
.stat-bar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;padding:12px 0 4px}
.stat-line{display:flex;gap:18px;flex-wrap:wrap}
.stat-line .st{display:flex;align-items:baseline;gap:6px}
.stat-line .st b{font-size:14px;font-weight:700;color:#eef2fa;font-family:var(--mono)}
.stat-line .st b.up{color:var(--red)}.stat-line .st b.down{color:var(--green)}
.stat-line .st span{font-size:11px;color:var(--muted)}
#statusText{font-size:12px;color:var(--muted)}

/* ── 工具栏 ── */
button,select{background:var(--panel2);color:var(--text);border:1px solid var(--line2);border-radius:6px;padding:7px 14px;font-size:12.5px;cursor:pointer;transition:.2s;font-family:var(--sans)}
button:hover,select:hover{border-color:var(--cyan);color:#fff}
select option{background:#0d1220}
button.gold{border-color:rgba(212,175,55,.4);color:var(--gold2)}
button.gold:hover{border-color:var(--gold);box-shadow:0 0 10px rgba(212,175,55,.2)}

/* ── 个股预测查询模块 ── */
.stock-query{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 18px}
.stock-query input{flex:1;min-width:240px;padding:8px 12px;border-radius:6px;background:rgba(13,18,32,.9);border:1px solid rgba(74,168,255,.3);color:#e8edf7;font-size:13px;outline:none;transition:.2s}
.stock-query input:focus{border-color:var(--cyan);box-shadow:0 0 8px rgba(74,168,255,.2)}
.stock-query input::placeholder{color:#5a6478}
.stock-query button{flex-shrink:0}
button.ghost{border-color:rgba(120,140,180,.3);color:var(--muted)}
button.ghost:hover{border-color:var(--cyan);color:var(--cyan);box-shadow:0 0 8px rgba(74,168,255,.15)}
.stock-query-status{font-size:12px;color:var(--muted);margin-left:4px}
.stock-query-status.ok{color:var(--green)}
.stock-query-status.warn{color:var(--gold2)}
.stock-query-status.err{color:var(--red)}
#stockQueryResult{margin-top:4px}

/* ── 面板 ── */
.panel{background:rgba(16,22,39,.92);border:1px solid var(--line);border-radius:10px;margin-bottom:16px;overflow:hidden}
.panel-head{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:12px 18px;border-bottom:1px solid var(--line);background:rgba(13,18,32,.6)}
.panel-head h2{font-size:13.5px;font-weight:600;color:#e8edf7;letter-spacing:1px;display:flex;align-items:center;gap:8px}
.panel-head h2 .dot{width:6px;height:6px;border-radius:50%;background:var(--cyan);box-shadow:0 0 8px var(--cyan)}
.panel-head .meta{font-size:11.5px;color:var(--muted)}
.panel-body{padding:0}

/* ── 表格（高密度金融排版）── */
.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
table{width:100%;border-collapse:collapse;font-size:12px}
th,td{padding:6px 8px;text-align:left;border-bottom:1px solid rgba(30,39,64,.6);white-space:nowrap}
th{color:var(--muted);font-weight:500;font-size:10.5px;letter-spacing:.5px;background:rgba(13,18,32,.4)}
tr:last-child td{border-bottom:none}
/* 核心榜内容按需宽度（不再 fixed 压缩截断），横向滚动查看全部列 */
#tbody,#stockQueryBody{font-variant-numeric:tabular-nums}
#tbody td,#stockQueryBody td{white-space:nowrap}
/* 止盈/止损价列醒目区分：预估止盈价红色（预期涨）、止损价绿色（风险价） */
#tbody td:nth-child(11),#stockQueryBody td:nth-child(10){color:var(--red);font-weight:600}
#tbody td:nth-child(12),#stockQueryBody td:nth-child(11){color:var(--green);font-weight:600}
#tbody td.name-cell,#stockQueryBody td.name-cell{min-width:110px}
/* ── 每日历史预测验证 · 卡片式布局（全新设计）── */
.hist-list{display:flex;flex-direction:column;gap:14px;padding:12px 14px}
.hist-card{background:rgba(16,22,39,.92);border:1px solid var(--line);border-radius:8px;overflow:hidden;transition:border-color .2s}
.hist-card:hover{border-color:rgba(74,168,255,.4)}
/* 卡片头：所有信息一行水平排列（紧凑高度），超出自动换行 */
.hist-card-head{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid var(--line);background:rgba(13,18,32,.6)}
.hist-card-date{font-size:13px;color:#e8edf7;letter-spacing:.5px;white-space:nowrap}
.hist-card-date b{color:#eef2fa;font-size:14px}
.hist-card-info{font-size:11.5px;color:var(--muted);white-space:nowrap}
.hist-card-info .code{color:var(--muted);font-size:10.5px}
/* 命中徽章：红=命中(≥50%)，绿=失准，灰=未收盘 */
.hist-card-badge{font-size:10.5px;font-weight:700;padding:2px 8px;border-radius:5px;white-space:nowrap;font-family:var(--mono)}
.hist-card-badge.badge-hit{color:var(--red);background:rgba(242,54,69,.12);border:1px solid rgba(242,54,69,.45)}
.hist-card-badge.badge-miss{color:var(--green);background:rgba(0,192,135,.10);border:1px solid rgba(0,192,135,.4)}
.hist-card-badge.badge-wait{color:var(--muted);background:rgba(74,168,255,.08);border:1px solid rgba(74,168,255,.25)}
/* 展开/收起小按钮（紧凑圆形图标按钮） */
.hist-card-toggle{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;margin-left:auto;font-size:11px;line-height:1;border-radius:50%;background:rgba(74,168,255,.08);border:1px solid rgba(74,168,255,.35);color:var(--cyan);cursor:pointer;transition:.2s;flex-shrink:0}
.hist-card-toggle:hover{background:rgba(74,168,255,.2);border-color:var(--cyan)}
/* 卡片展开区：轮次详情 */
.hist-card-detail{padding:0}
.hist-card-detail .round-tags{padding:0 16px}
.hist-card-detail .rb-sec{padding:8px 16px}

/* 历史验证表格：固定关键列宽，保证展开/收起宽度一致 */
/* 历史主表：内容自适应宽度 + min-width 触发横向滑动（参考核心推荐榜设计）
   去掉固定百分比列宽（旧版 width:100%+百分比 → 列被压缩无法滑动） */
#predHistTable{width:100%;table-layout:auto;min-width:640px}
#predHistTable th:nth-child(1){min-width:90px}
#predHistTable th:nth-child(2){min-width:150px}
#predHistTable th:nth-child(3){min-width:70px}
#predHistTable th:nth-child(4){min-width:130px}
#predHistTable th:nth-child(5){min-width:220px}
#predHistTable th:nth-child(6){min-width:80px}
/* 历史主表：关键列允许换行，内容完整显示（不截断） */
#predHistTable td{white-space:normal;word-break:break-word}
#predHistTable td:nth-child(4),#predHistTable td:nth-child(5){white-space:normal;line-height:1.6}
tbody tr:hover{background:rgba(74,168,255,.04)}
.rank{color:var(--muted2);width:30px;font-family:var(--mono)}
/* ── 排行榜名次变动动画（实时刷新时名次变化行位移动画，1秒楼层感）── */
/* 名次提前：从下到上移动（1秒，像电梯升层） */
@keyframes rankUp{0%{transform:translateY(36px);opacity:.15}60%{transform:translateY(-4px);opacity:1}100%{transform:translateY(0);opacity:1}}
/* 名次落后：从上到下移动（1秒，像电梯降层） */
@keyframes rankDown{0%{transform:translateY(-36px);opacity:.15}60%{transform:translateY(4px);opacity:1}100%{transform:translateY(0);opacity:1}}
.rank-up{animation:rankUp 1s cubic-bezier(.25,.8,.35,1)}
.rank-down{animation:rankDown 1s cubic-bezier(.25,.8,.35,1)}
/* 动画行浮层效果：移动时像"换了一层楼" */
.rank-up,.rank-down{position:relative;z-index:2;box-shadow:0 6px 18px rgba(0,0,0,.4);background:rgba(16,22,39,.98)}
/* 推荐得分：60分以上红、60分以下绿（与股票涨跌色一致：涨红跌绿） */
.name{font-weight:600;color:#f2f5fb}
.code{color:var(--muted);font-size:11px;margin-left:5px;font-family:var(--mono)}
.up{color:var(--red)}
.down{color:var(--green)}
.flat{color:var(--muted)}
.prob-num{display:inline-block;font-size:14px;font-weight:700;font-variant-numeric:tabular-nums;font-family:var(--mono)}
.tag{display:inline-block;font-size:10.5px;padding:1px 7px;border-radius:4px;margin:1px 3px 1px 0;background:rgba(30,39,64,.6);color:var(--muted);border:1px solid var(--line2)}
/* 信号标签：利好(bull)=红色外框，利空(bear)=绿色外框（醒目） */
.tag.bull{color:#ff6b7a;border:1.5px solid var(--red);background:rgba(242,54,69,.12)}
.tag.bear{color:#4fe0ac;border:1.5px solid var(--green);background:rgba(0,192,135,.10)}
/* ── v6.23.0（用户要求）：上行概率 <55% 的「观望」标签 ──────────────
   语义是【确定性不足的提示】，不是方向判断，故用琥珀色，与
   bull(红)/bear(绿) 的方向色明确区分，避免被误读成又一个看空信号。
   虚线描边进一步暗示"不确定/待定"。 */
/* ── v6.28.0：观望标签是【唯一】的"不看好"视觉表达 ──────────────────
   合并前并存两种：⚪观望/🛡大盘防守 实心徽标（.signal-bear/.signal-neutral）
   与 .tag.watch 虚框标签。用户要求合并为同一逻辑与样式，故：
     · 徽标只保留「🟢看涨」（.signal-bull）
     · 一切"不看好"统一走下面的 .tag.watch
   已删除 .signal-bear/.signal-neutral（含 .hist-round-table 变体），
   避免后人误以为还有第二条渲染路径。 */
.tag.watch{color:#ffc46b;border:1.5px dashed rgba(255,196,107,.75);background:rgba(255,180,64,.10);cursor:help}
.signal-badge{display:inline-block;font-size:10.5px;font-weight:600;padding:2px 8px;border-radius:4px;margin-right:4px;letter-spacing:.5px}
.signal-bull{color:#ff8fa0;background:var(--red-bg);border:1px solid rgba(242,54,69,.45)}
/* v6.9.29：大盘防守（非个股走弱）—— 中性色，避免与「观望」混淆。
   大盘弱时全池都会触发防守，若标成"观望"会与推荐榜自相矛盾。 */
.stop{color:var(--green)}
.reason-btn{display:inline-block;font-size:11px;padding:3px 10px;border-radius:5px;background:rgba(74,168,255,.08);border:1px solid rgba(74,168,255,.35);color:var(--cyan);cursor:pointer;transition:.2s;white-space:nowrap}
/* 资讯超链接：可点击跳转原文 */
a.news-link{color:#7ec8ff;text-decoration:none;border-bottom:1px dashed rgba(126,200,255,.4);transition:.15s;cursor:pointer;word-break:break-all}
a.news-link:hover{color:#a8dcff;border-bottom-color:#a8dcff;text-decoration:underline;background:rgba(74,168,255,.08)}
.reason-btn:hover{background:rgba(74,168,255,.18);box-shadow:0 0 8px rgba(74,168,255,.25)}

/* 历史轮次标题：与核心榜 panel-head 一致（青色dot + 标题 + meta） */
.hist-round-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid var(--line);background:rgba(13,18,32,.6);margin-bottom:8px}
.hist-round-head .hrh-dot{width:6px;height:6px;border-radius:50%;background:var(--cyan);box-shadow:0 0 8px var(--cyan);flex-shrink:0}
.hist-round-head b{font-size:13px;font-weight:700;color:#e8edf7;letter-spacing:1px}
.hist-round-head .hrh-meta{font-size:11px;color:var(--muted)}
.hist-round-head .hrh-count{font-size:11px;color:var(--gold2);margin-left:auto}
/* 历史轮次详情表：与核心榜完全一致的样式（滚动容器 + 同款表头/行） */
.hist-table-wrap{width:100%;box-sizing:border-box;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:4px 0}
.hist-round-table{width:100%;border-collapse:collapse;font-size:12px;table-layout:auto;min-width:760px}
.hist-round-table th{color:var(--muted);font-weight:500;font-size:10.5px;letter-spacing:.5px;background:rgba(13,18,32,.4);padding:6px 8px;text-align:left;border-bottom:1px solid rgba(30,39,64,.6);white-space:nowrap}
.hist-round-table td{padding:6px 8px;text-align:left;border-bottom:1px solid rgba(30,39,64,.6);white-space:nowrap;font-size:12px;color:#c6cfe2}
.hist-round-table tr:last-child td{border-bottom:none}
.hist-round-table tr:hover{background:rgba(74,168,255,.04)}
.hist-round-table td.rank{color:var(--muted2);width:30px;font-family:var(--mono)}
.hist-round-table .name{font-weight:600;color:#f2f5fb}
.hist-round-table .code{color:var(--muted);font-size:11px;margin-left:5px;font-family:var(--mono)}
.hist-round-table .prob-num{display:inline-block;font-size:14px;font-weight:700;font-variant-numeric:tabular-nums;font-family:var(--mono)}
.hist-round-table .hist-round-table .hist-round-table .hist-round-table .tag{display:inline-block;font-size:10.5px;padding:1px 7px;border-radius:4px;margin:1px 3px 1px 0;background:rgba(30,39,64,.6);color:var(--muted);border:1px solid var(--line2)}
.hist-round-table .tag.bull{color:#ff6b7a;border:1.5px solid var(--red);background:rgba(242,54,69,.12)}
.hist-round-table .tag.bear{color:#4fe0ac;border:1.5px solid var(--green);background:rgba(0,192,135,.10)}
.hist-round-table .tag.watch{color:#ffc46b;border:1.5px dashed rgba(255,196,107,.75);background:rgba(255,180,64,.10);cursor:help}
.hist-round-table .signal-badge{display:inline-block;font-size:10.5px;font-weight:600;padding:2px 8px;border-radius:4px;margin-right:4px;letter-spacing:.5px}
.hist-round-table .signal-bull{color:#ff8fa0;background:var(--red-bg);border:1px solid rgba(242,54,69,.45)}
.hist-round-table .stop{color:var(--green)}
.hist-round-table .up{color:var(--red)}
.hist-round-table .down{color:var(--green)}
.hist-round-table .flat{color:var(--muted)}
/* ── 展开详情 ── */
.detail-row td{background:rgba(13,18,32,.85);border-bottom:1px solid var(--line);padding:0;overflow-x:auto;-webkit-overflow-scrolling:touch}
.detail-row td>div,.detail-row td>table{width:100%;box-sizing:border-box}
.reason-box{padding:12px 16px;font-size:12px;line-height:1.9;color:#c6cfe2;width:100%;box-sizing:border-box}
.reason-box .rb-title{font-weight:700;color:var(--cyan);font-size:13px;margin-bottom:6px}
.reason-box .rb-sec{margin-top:8px;padding-top:6px;border-top:1px dashed rgba(74,168,255,.15)}
.reason-box .rb-sec b{color:#9db8ff}
.reason-box .rb-green{color:var(--green)}.reason-box .rb-red{color:var(--red)}.reason-box .rb-yel{color:var(--gold2)}
/* 展开详情：滚动容器（td 可横滑，参考核心榜） */
.detail-row table,.round-detail-box table{width:100%;box-sizing:border-box;table-layout:auto}
/* 历史明细 12 列宽表：min-width 保证横向滑动可见全列（不压缩） */
.round-detail-box table, .detail-row td > .reason-box table{min-width:760px}
.detail-row td,.round-detail-box td{white-space:nowrap}
.round-detail-box{width:100%;box-sizing:border-box;overflow-x:auto;-webkit-overflow-scrolling:touch}
/* 信号/资讯类长文本列允许换行，避免截断 */
.detail-row td:last-child,.round-detail-box td:last-child{white-space:normal;word-break:break-word}
/* 宏观策略参数评判表 */
.macro-table td{white-space:nowrap}
.macro-table td:last-child{text-align:right;font-weight:600}
/* 收盘对账结果颜色（A股惯例：红=预测成功/盈利，绿=预测失败/亏损） */
.reason-box .res-hit{color:var(--red);font-weight:700}
.reason-box .res-miss{color:var(--green);font-weight:700}
.reason-box table{width:100%;font-size:11.5px;border-collapse:collapse;margin-top:4px}
.reason-box table th{background:rgba(13,18,32,.6)}
.reason-box table td{padding:3px 8px;border:none;border-bottom:1px solid rgba(74,168,255,.08);font-size:11.5px}

/* ── 预测轮次标签 ── */
.round-tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
.round-tag{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:6px;font-size:12px;font-weight:600;color:#c6cfe2;background:rgba(16,22,39,.92);border:1px solid var(--line);cursor:pointer;transition:.2s;white-space:nowrap}
.round-tag:hover{background:rgba(74,168,255,.10);border-color:var(--cyan)}
.round-tag .rt-time{color:var(--cyan);font-size:11.5px;font-family:var(--mono)}
.round-tag .rt-t1{color:#cfe4ff;max-width:9em;overflow:hidden;text-overflow:ellipsis}
.round-tag .rt-hit{font-size:10.5px;font-weight:700;padding:1px 6px;border-radius:4px;font-family:var(--mono)}
.round-tag .rt-hit.hit-ok{color:var(--red);background:rgba(242,54,69,.10);border:1px solid rgba(242,54,69,.35)}
.round-tag .rt-hit.hit-bad{color:var(--green);background:rgba(0,192,135,.10);border:1px solid rgba(0,192,135,.35)}
/* 轮次按收盘结果着色：红=命中(成功)，绿=失准(失败) */
.round-tag.round-hit{border-color:rgba(242,54,69,.45);background:rgba(242,54,69,.07)}
.round-tag.round-hit:hover{background:rgba(242,54,69,.14)}
.round-tag.round-hit.active{background:rgba(242,54,69,.22);border-color:var(--red)}
.round-tag.round-miss{border-color:rgba(0,192,135,.45);background:rgba(0,192,135,.07)}
.round-tag.round-miss:hover{background:rgba(0,192,135,.14)}
.round-tag.round-miss.active{background:rgba(0,192,135,.22);border-color:var(--green)}
.round-tag.active{background:rgba(74,168,255,.20);border-color:var(--cyan);color:#eef2fa}
.round-tag-more{display:inline-flex;align-items:center;gap:6px;padding:5px 13px;border-radius:6px;font-size:12px;font-weight:600;color:var(--muted);background:rgba(74,168,255,.06);border:1px dashed rgba(74,168,255,.3);cursor:pointer}
.round-tag-more:hover{background:rgba(74,168,255,.14)}

/* ── 更新日志弹层 ── */
/* ══ v6.9.27 模拟交易弹层（用户要求）═════════════════════════════
 *  入口在「更新日志」旁；初始资金 10 万元，T+1 跟榜策略。
 *  视觉层级：关键指标 > 资金曲线 > 逐笔明细 > 持仓 > 合规声明。
 *  涨跌配色沿用全站 A 股规范（涨=红、跌=绿）。 */
#ptModal{display:none;position:fixed;inset:0;z-index:99;background:rgba(5,8,14,.86);
  backdrop-filter:blur(6px);align-items:flex-start;justify-content:center;padding:36px 16px;overflow-y:auto}
#ptModal .pt-box{background:linear-gradient(170deg,#141b30,#0d1220);border:1px solid rgba(212,175,55,.35);
  border-radius:12px;max-width:860px;width:100%;padding:20px;box-shadow:0 0 50px rgba(212,175,55,.08)}
#ptModal .pt-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
#ptModal h2{color:var(--gold2);font-size:17px;letter-spacing:1px;display:flex;align-items:baseline;gap:10px}
#ptModal h2 .pt-sub{font-size:11.5px;color:var(--muted);font-weight:400;letter-spacing:0}
#ptClose{width:28px;height:28px;border-radius:7px;background:rgba(255,255,255,.06);
  border:1px solid var(--line);color:var(--muted);cursor:pointer;font-size:13px}
#ptClose:hover{background:rgba(255,107,122,.18);color:#ff8b98}
.pt-toolbar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:13px;
  padding-bottom:12px;border-bottom:1px solid var(--line)}
.pt-btn{padding:6px 15px;font-size:12.5px;font-weight:600;border-radius:7px;cursor:pointer;
  background:rgba(74,168,255,.1);border:1px solid rgba(74,168,255,.3);color:#9fc4ea;transition:.18s}
.pt-btn:hover{background:rgba(74,168,255,.2);color:#fff}
.pt-btn:disabled{opacity:.5;cursor:not-allowed}
.pt-btn-main{background:rgba(212,175,55,.14);border-color:rgba(212,175,55,.45);color:var(--gold2)}
.pt-btn-main:hover{background:rgba(212,175,55,.24)}
.pt-select{background:rgba(16,22,39,.9);border:1px solid var(--line);border-radius:6px;
  color:#c6cfe2;font-size:12px;padding:5px 9px}
.pt-note{font-size:11.5px;color:var(--muted2);margin-left:auto}
/* 关键指标 */
.pt-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:9px;margin-bottom:15px}
.pt-st{background:rgba(16,22,39,.75);border:1px solid var(--line);border-radius:9px;padding:9px 12px}
.pt-st span{display:block;font-size:11px;color:var(--muted2);margin-bottom:3px}
.pt-st b{font-size:15px;font-family:var(--mono);color:#e6ecf8}
.pt-st b.up{color:var(--red)}.pt-st b.down{color:var(--green)}
/* ── v6.10.0：当前生效的交易规则（用户要求"能盈利"，规则必须一眼可见）──
   用与指标卡不同的底色区分"数据"与"规则说明"：
   用户看到盈亏后紧接着能看到"是按什么规则做出来的"，
   否则数字无从解读（例如"为什么这几周没交易"＝择时闸门未放行）。 */
.pt-rule{margin:-6px 0 14px;padding:9px 12px;border-radius:9px;font-size:12px;line-height:1.7;
  background:rgba(90,140,255,.07);border:1px solid rgba(90,140,255,.22);color:var(--muted2)}
.pt-rule b{color:#cfe0ff;font-weight:600}
.pt-rule-note{display:block;margin-top:6px;padding-top:6px;border-top:1px dashed rgba(90,140,255,.25);
  font-size:11.5px;line-height:1.65;color:var(--muted2)}
.pt-rule-note b{color:#e3b341;font-weight:600}
.pt-rule:empty{display:none}
/* 亮点 */
.pt-highlights{display:flex;gap:9px;flex-wrap:wrap;margin-bottom:12px}
.pt-hl{font-size:12px;padding:5px 11px;border-radius:7px;background:rgba(255,255,255,.04);border:1px solid var(--line)}
.pt-hl.up{color:var(--red);border-color:rgba(242,54,69,.3)}
.pt-hl.down{color:var(--green);border-color:rgba(87,255,190,.3)}
/* 资金曲线 */
.pt-curve{margin-bottom:15px}
.pt-curve-title{font-size:12.5px;font-weight:700;color:#b9c6dc;margin-bottom:8px;
  padding-left:8px;border-left:3px solid rgba(74,168,255,.5)}
.pt-bars{display:flex;align-items:flex-end;gap:4px;height:76px;padding:8px 10px;
  background:rgba(13,18,32,.5);border-radius:8px;overflow-x:auto}
.pt-bar-wrap{display:flex;flex-direction:column;align-items:center;justify-content:flex-end;
  flex:1;min-width:32px;height:100%}
.pt-bar{width:70%;max-width:26px;border-radius:2px 2px 0 0;min-height:2px}
.pt-bar.up{background:linear-gradient(180deg,var(--red),rgba(242,54,69,.35))}
.pt-bar.down{background:linear-gradient(180deg,rgba(87,255,190,.35),var(--green))}
.pt-bar.flat{background:var(--line2)}
.pt-bar-x{font-size:9px;color:var(--muted2);margin-top:3px;font-family:var(--mono);white-space:nowrap}
/* 交易明细表 */
.pt-trades{margin-bottom:15px}
.pt-table{width:100%;border-collapse:collapse;font-size:12px}
.pt-table th{background:rgba(13,18,32,.7);color:var(--muted);font-weight:600;
  padding:7px 9px;text-align:left;border-bottom:1px solid var(--line)}
.pt-table td{padding:6px 9px;border-bottom:1px solid rgba(74,168,255,.07);
  font-family:var(--mono);color:#c6cfe2}
.pt-table td.up{color:var(--red);font-weight:700}
.pt-table td.down{color:var(--green);font-weight:700}
.pt-table .pt-name{font-family:inherit;color:#e6ecf8;font-weight:600}
.pt-table .pt-code{font-size:10px;color:var(--muted2);margin-left:6px}
/* 持仓 */
.pt-holdings{margin-bottom:14px}
.pt-hold-list{display:flex;flex-wrap:wrap;gap:6px}
.pt-hold{font-size:11.5px;padding:4px 10px;border-radius:6px;background:rgba(255,255,255,.04);
  border:1px solid var(--line);color:#c6cfe2}
.pt-hold em{font-style:normal;color:var(--muted2);font-family:var(--mono);margin-left:4px}
/* 空态与声明 */
.pt-loading,.pt-empty{padding:26px 16px;text-align:center;color:var(--muted);font-size:12.5px;line-height:1.9}
.pt-empty-sm{padding:10px;color:var(--muted2);font-size:12px}
.pt-disclaimer{margin-top:6px;padding-top:11px;border-top:1px solid var(--line);
  font-size:11px;color:var(--muted2);line-height:1.75}
/* ── v6.9.29 自主交易账户：新增元素样式 ────────────────────────────
 *  账户无需"开始"按钮，故工具栏改为状态提示 + 重置；
 *  新增决策记录区（让用户看到"为何空仓"，避免疑惑账户没动作）。 */
.pt-auto{font-size:12.5px;font-weight:600;color:var(--gold2);
  padding:5px 12px;border-radius:7px;background:rgba(212,175,55,.1);
  border:1px solid rgba(212,175,55,.3)}
.pt-reason{font-family:inherit;font-size:11px;color:var(--muted2);max-width:150px}
/* 决策记录 */
.pt-decisions{margin-bottom:14px}
.pt-dec-list{display:flex;flex-direction:column;gap:4px}
.pt-dec{display:flex;align-items:center;gap:9px;font-size:11.5px;color:#c6cfe2;
  padding:5px 10px;border-radius:6px;background:rgba(255,255,255,.03);border:1px solid var(--line)}
.pt-dec-tag{flex-shrink:0;font-size:10px;font-weight:800;padding:2px 7px;border-radius:4px}
.pt-dec-tag.up{color:var(--red);background:rgba(242,54,69,.14)}
.pt-dec-tag.flat{color:var(--muted);background:rgba(255,255,255,.06)}
.pt-dec-day{flex-shrink:0;color:var(--muted2);font-family:var(--mono)}
@media(max-width:768px){
  /* 手机适配：指标两列、曲线与表格横向滚动、工具栏换行 */
  .pt-stats{grid-template-columns:repeat(2,1fr)}
  .pt-bars{padding:6px}
  .pt-bar-wrap{min-width:26px}
  .pt-note{margin-left:0;width:100%}
}

#clModal{display:none;position:fixed;inset:0;z-index:99;background:rgba(5,8,14,.85);backdrop-filter:blur(6px);align-items:flex-start;justify-content:center;padding:40px 16px;overflow-y:auto}
#clModal .cl-box{background:linear-gradient(170deg,#141b30,#0d1220);border:1px solid rgba(212,175,55,.35);border-radius:12px;max-width:760px;width:100%;padding:22px;box-shadow:0 0 50px rgba(212,175,55,.08)}
#clModal h2{color:var(--gold2);font-size:17px;letter-spacing:1px;display:flex;justify-content:space-between;align-items:center}
#clClose{font-size:18px;background:transparent;border:none;color:var(--muted);cursor:pointer}
#clBody{max-height:60vh;overflow-y:auto;margin-top:12px}
.cl-item{background:rgba(212,175,55,.04);border:1px solid rgba(212,175,55,.15);border-radius:10px;padding:14px;margin-bottom:12px}
.cl-item .cl-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.cl-item .cl-title{color:var(--gold2);font-size:14px;font-weight:600}
.cl-item .cl-time{color:var(--muted);font-size:11px}
.cl-item .cl-tag{display:inline-block;font-size:10px;padding:2px 8px;border-radius:4px;margin-bottom:8px}
.cl-item .cl-change{font-size:12.5px;color:#c6b98a;line-height:1.8;padding-left:10px;border-left:2px solid rgba(212,175,55,.25);margin:4px 0}
.cl-item .cl-note{font-size:11.5px;color:var(--muted);margin-top:8px}

/* ── 页脚 ── */
.foot{color:var(--muted);font-size:11px;line-height:2;margin-top:20px;padding-top:16px;border-top:1px solid var(--line)}
.foot .disclaimer{color:var(--muted2);font-size:10.5px;line-height:1.8}
.foot .copy{display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px;margin-top:6px}
/* ── v6.9.32：技术信号的【模型前缀】内联色标 ────────────────────────
 *  用户要求"技术信号必须是 3 个模型产出的信号标签"，同时要求
 *  "布局与历史记录保持一致"。故不再每模型单独占一行（那会把
 *  「技术信号」列撑到数百像素高、行高失控），改为在同一个 tag 内
 *  加一个小前缀（A/B/C），既标明来源又保持紧凑。 */
.tag-by{font-style:normal;font-weight:800;font-size:9px;margin-right:3px;
  padding:0 3px;border-radius:2px;vertical-align:1px;opacity:.95}
.tag-by-A{color:#ffb27a;background:rgba(255,178,122,.16)}
.tag-by-B{color:#8fd0ff;background:rgba(143,208,255,.16)}
.tag-by-C{color:#b79cff;background:rgba(183,156,255,.16)}
.tag-by-市{color:var(--muted2);background:rgba(255,255,255,.07)}

/* ── v6.9.26：技术信号按模型分组（用户要求）────────────────────────
 * 每行 = 一个模型的信号标签集合，行首色标标明模型（A/B/C），
 * 另有一行"市场"放非模型来源的宏观标签（资讯/地缘/政策/资金），
 * 使用户一眼能分辨"哪些是模型算出来的、哪些是市场信息"。 */
.msig-row{display:flex;align-items:flex-start;gap:5px;flex-wrap:wrap;margin-bottom:3px}
.msig-row:last-child{margin-bottom:0}
.msig-by{flex-shrink:0;width:34px;text-align:center;font-size:10px;font-weight:800;
  line-height:16px;border-radius:4px;font-family:var(--mono)}
.msig-A{color:#ffb27a;background:rgba(255,178,122,.14);border:1px solid rgba(255,178,122,.3)}
.msig-B{color:#8fd0ff;background:rgba(143,208,255,.14);border:1px solid rgba(143,208,255,.3)}
.msig-C{color:#b79cff;background:rgba(183,156,255,.14);border:1px solid rgba(183,156,255,.3)}
.msig-mkt{color:var(--muted2);background:rgba(255,255,255,.05);border:1px solid var(--line)}
/* 市场来源标签弱化处理，与模型信号形成视觉区分 */
.tag-mkt{opacity:.72}

/* ── ICP 备案号（v6.9.17）──
   法规要求悬挂于首页底部显著位置。样式与门户首页（ai-fuxi.com/）保持一致：
   居中、小字号、低调但有足够对比度可读（管局核查时会看是否"显著"）。
   链接色与页脚正文同色系，hover 提亮 —— 既符合"可点击跳转"的要求，
   又不喧宾夺主抢走行情数据的视觉焦点。 */
.foot .icp{display:block;text-align:center;margin-top:10px;font-size:11px}
.foot .icp a{color:var(--muted);text-decoration:none;transition:color .18s}
.foot .icp a:hover{color:var(--cyan);text-decoration:underline}

/* ── 访问统计 PV/UV（v6.9.44 页脚 → v6.9.45 移入隐藏面板）─────────────
   用户要求（v6.9.44）："帮我设计在线显示这个页面显示的 PV，UV 数据"
   用户要求（v6.9.45）："PV、UV帮我移动到，brand。福标签中，隐藏入口页面中"
   设计取舍：
    · 移入面板后不再受"页脚信息层"的低权重约束，但仍是辅助信息，
      故数字用 gold 提亮、标签保持 muted，不与上方账户指标抢焦点。
    · 数字用等宽数字（font-variant-numeric: tabular-nums）：
      数值会随刷新变化，等宽可避免"数字跳动导致整行左右抖动"
      （本项目在轮次进度条上踩过同类抖动坑）。
    · 可换行：手机窄屏下 4 组数据会折行，故用 flex-wrap，而不是硬挤一行溢出。 */
.stats-foot{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;
  gap:6px 12px;margin:8px 0 2px;font-size:12px;color:var(--muted)}
.stats-foot .sf-item{display:inline-flex;align-items:baseline;gap:4px;white-space:nowrap}
.stats-foot .sf-k{color:var(--muted2)}
.stats-foot .sf-v{color:var(--gold);font-weight:700;font-size:15px;
  font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}
.stats-foot .sf-u{color:var(--muted2);font-size:11px}
.stats-foot .sf-sep{color:var(--line2)}

/* 面板内的统计区块容器（与账户指标区隔开） */
.pt-stats-block{margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.pt-stats-block .pt-curve-title{margin-bottom:4px}

/* 近 7 日趋势迷你柱状图：每天两根（PV 金 / UV 蓝） */
.sf-trend{display:flex;align-items:flex-end;justify-content:center;gap:10px;
  height:66px;margin:6px 0 2px}
.sf-day{display:flex;flex-direction:column;align-items:center;gap:3px;min-width:34px}
.sf-day .sf-bars{display:flex;align-items:flex-end;gap:3px;height:46px}
.sf-bar{display:block;width:9px;border-radius:2px 2px 0 0;transition:height .3s}
.sf-bar.pv{background:linear-gradient(180deg,#f0d060,#b8912a)}
.sf-bar.uv{background:linear-gradient(180deg,#5ec8f0,#2b7fa8)}
.sf-day .sf-x{font-size:9.5px;color:var(--muted2);white-space:nowrap}
.sf-empty{text-align:center;color:var(--muted2);font-size:11.5px;padding:12px 0}

/* 图例 + 口径说明 */
.sf-legend{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
  gap:6px 14px;margin-top:8px;font-size:11px;color:var(--muted2)}
.sf-legend .sf-lg{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
.sf-legend .sf-lg.sep{border-left:1px solid var(--line2);padding-left:14px}
.sf-dot{display:inline-block;width:8px;height:8px;border-radius:2px}
.sf-dot.pv{background:#e0bb44}
.sf-dot.uv{background:#4fa8d0}
.sf-tip{margin-top:6px;width:100%;text-align:center;font-size:10.5px;
  color:var(--muted2);opacity:.8;line-height:1.7}
@media (max-width:720px){
  /* 窄屏：7 天柱状图会挤在一起，改为横向滚动而不是压扁变形 */
  .sf-trend{justify-content:flex-start;overflow-x:auto;padding-bottom:2px}
  .sf-legend .sf-lg.sep{border-left:none;padding-left:0}
}

/* ── 「福」字隐藏入口的极轻提示（v6.9.44）────────────────────────
   ⚠️ 隐藏入口不应看起来可点 —— 故默认没有任何按钮化样式（无边框、无光标变化）。
   只在 hover 时给一点极轻的亮度/描边反馈，让"知道入口的人"有确认感，
   而普通访客不会因此察觉这里能点。 */
.brand .logo{transition:border-color .18s,box-shadow .18s}
.brand .logo:hover{border-color:var(--gold);box-shadow:0 0 0 1px rgba(212,175,55,.18)}
.brand .logo:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.error{color:var(--red);padding:20px;text-align:center}
.hm{display:inline-block;background:rgba(16,22,39,.9);border:1px solid var(--line);border-radius:6px;padding:5px 12px;font-size:11.5px;color:var(--muted);margin:8px 6px 0 0}
.hm b{color:var(--cyan);font-size:13px;margin-left:3px;font-family:var(--mono)}

@media(max-width:768px){
  /* v6.9.24 产品化结论区手机适配：字号收紧、卡片竖排，
     避免"关键词+说明"在同一行被挤压换行导致难以扫读 */
  .rh-label{font-size:17px}
  .rh-prob{font-size:12.5px}
  .rh-sig{flex-direction:column;gap:3px;padding:7px 10px}
  .rh-sig-key{min-width:0}
  .rh-action{flex-direction:column;gap:4px;padding:9px 11px}
  .rh-mok{margin-left:0}
  .market-strip{flex-wrap:wrap}
  .mkt-idx{border-right:none;border-bottom:1px solid var(--line);flex:1 1 33%}
  .stat-line{gap:10px}
  .wrap{padding:0 12px 40px}
  /* ETF 手机适配（v6.9.18）：列宽收到 130px → 手机竖屏约 2 列，
     收起态 "2 行" 即 4 只，避免卡片过窄导致名称被截成两个字。
     字号同步微调，保证"涨跌幅"这一主信息仍清晰可读。 */
  .etf-cards{grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:6px}
  .etf-card{padding:6px 8px}
  .etf-card .ec-name{font-size:11.5px}
  .etf-card .ec-pct{font-size:13px}
  .etf-foot{flex-wrap:wrap;gap:6px}
  /* 手机适配：表格字号收紧 + 全列横向滚动，保证数据完整可见 */
  table{font-size:11.5px}
  th,td{padding:6px 8px}
  .table-wrap{margin:0 -4px}
  /* 历史主表手机适配：6列横向滚动完整显示 */
  #predHistTable{min-width:640px}
  /* 历史明细表手机适配：滚动查看全列 */
  .detail-row .table-wrap,.round-detail-box{overflow-x:auto}
  /* 历史卡片手机适配：紧凑布局，信息完整显示 */
  .hist-list{padding:8px}
  .hist-card-head{padding:6px 10px;gap:8px}
  .hist-card-date{font-size:12px}
  .hist-card-date b{font-size:13px}
  .hist-card-badge{font-size:9.5px;padding:2px 6px}
  .hist-card-info{font-size:10.5px}
  .hist-card-toggle{width:20px;height:20px;font-size:10px}
  .hist-card-detail .round-tags{padding:0 10px}
  /* 工具栏换行（资讯速览已移到下方独立容器，不再参与工具栏布局） */
    /* 信号标签手机上多行展示 */
  #tbody td:last-child,#stockQueryBody td:last-child{white-space:normal}
  #tbody .tag,#stockQueryBody .tag{white-space:nowrap}
}
/* 更小屏幕（≤420px）：进一步紧凑 */
@media(max-width:420px){
  .brand h1{font-size:14px}
    .news-ticker .nt-text{font-size:11.5px}
}

/* ═══════════════════════════════════════════════════════
   v4.0 全量预测轮次表单
   每一轮 = 无缓存全量预测（遍历全池）→ 最优推荐前10
   头部：日期福兮 + 开始/结束预测时间 + 展开【总XX轮】
   每轮一行，倒序（最新在最上），点击展开该轮前10
   ══════════════════════════════════════════════════════ */
.rounds-head{padding:12px 16px;border-bottom:1px solid var(--line);background:rgba(13,18,32,.45)}
.rounds-list{display:flex;flex-direction:column;gap:8px;padding:12px 14px}
.rounds-empty{padding:24px;text-align:center;color:var(--muted);font-size:12px;background:rgba(16,22,39,.5);border:1px dashed var(--line2);border-radius:8px}
.round-card{background:rgba(16,22,39,.92);border:1px solid var(--line);border-radius:8px;overflow:hidden;transition:border-color .2s}
.round-card:hover{border-color:var(--line2)}
.round-card-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 14px;cursor:pointer;user-select:none}
.round-card-head:hover{background:rgba(74,168,255,.04)}
.rc-seq{font-size:13.5px;font-weight:700;color:#e8edf7;letter-spacing:.5px;font-family:var(--mono);flex-shrink:0}
.round-card-head:hover .rc-seq{color:var(--cyan)}
/* ── v6.14.0（用户要求）：轮次预测时间（紧跟在"第XX轮预测结果"之后）──
 *  用户要求："把每一轮预测的具体时间也显示出来，
 *            显示在第XX轮预测结果 UI后面"。
 *  设计：比轮次号小一号、弱一档颜色 —— 它是补充信息（何时跑的），
 *  不与该轮的"第N轮"序号抢视觉焦点；等宽字体保证多行纵向对齐。 */
.rc-time{font-size:11.5px;font-family:var(--mono);color:#8b9ab3;
  background:rgba(124,136,166,.1);border:1px solid rgba(124,136,166,.2);
  padding:1px 7px;border-radius:5px;flex-shrink:0;white-space:nowrap;
  cursor:help;transition:color .15s,border-color .15s}
.round-card-head:hover .rc-time{color:#aab8cc;border-color:rgba(124,136,166,.36)}


.rc-toggle{padding:2px 9px;font-size:11px;font-weight:600;line-height:1.5;border-radius:5px;background:rgba(74,168,255,.08);border:1px solid rgba(74,168,255,.28);color:var(--cyan);cursor:pointer;transition:.2s;flex-shrink:0;white-space:nowrap}
.rc-toggle:hover{background:rgba(74,168,255,.2);border-color:var(--cyan)}
.round-card-body{border-top:1px solid var(--line);background:rgba(10,14,23,.5)}
.round-table{min-width:100%}
.round-table td{padding:7px 9px;font-size:12px}
.round-table th{padding:7px 9px}
.round-table td.rank{color:var(--muted2);width:30px;font-family:var(--mono)}
.round-table .name{font-weight:600;color:#f2f5fb}
.round-table .code{color:var(--muted);font-size:11px;margin-left:5px;font-family:var(--mono)}
.round-table .prob-num{display:inline-block;font-size:14px;font-weight:700;font-variant-numeric:tabular-nums;font-family:var(--mono)}
@media(max-width:760px){
  .rounds-head{padding:10px 12px}
    .round-card-head{padding:8px 10px;gap:6px}
.rc-seq{font-size:12.5px}
  
  
  .rounds-list{padding:8px}
  .round-table{min-width:760px}
}
.rounds-more{width:100%;margin-top:4px;padding:8px;font-size:12px;color:var(--cyan);background:rgba(74,168,255,.06);border:1px dashed rgba(74,168,255,.3);border-radius:8px;cursor:pointer;transition:.2s}
.rounds-more:hover{background:rgba(74,168,255,.16);border-color:var(--cyan)}

/* ── v4.4 每轮卡片：榜首信息（同一行内）────────────── */
.rc-top{display:inline-flex;align-items:center;gap:6px;flex:1;min-width:0;font-size:12px;overflow:hidden}
.rc-top .rt-name{color:var(--gold2);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:9em}
.rc-top .rt-code{color:var(--muted2);font-size:10.5px;font-family:var(--mono);white-space:nowrap;margin-left:-2px}
.rc-top .rt-prob{font-family:var(--mono);font-weight:700;font-size:12px;white-space:nowrap;padding:0 5px;border-radius:4px;background:rgba(30,39,64,.5)}
/* ── v6.27.0：概率"校准"标记 ──────────────────────────────────
   实测模型概率反校准（预测 70% → 实际 12.7%），故展示值经收缩到基准率。
   标记存在的意义：让用户知道这个百分比不是模型的原始置信度，
   悬停可看到原始值与收缩依据。样式刻意低调——它是提示，不是装饰。 */
.rc-top .rt-prob-flag{font-style:normal;font-size:9px;font-weight:400;margin-left:3px;padding:0 3px;border-radius:3px;background:rgba(255,255,255,.12);color:var(--dim,#8b93a7);vertical-align:1px;letter-spacing:.2px}
/* v6.2.6：该轮无人通过"三模型一致看涨"门槛时的中性提示（与 .rc-top 占同一位置） */
.rc-top-none{flex:1;min-width:0;font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* ── v6.8.4：v4.4 的"头部对账成功率"样式已删除 ────────────────
 *  头部对账行本身已移除（原因见 standalone-server.js 中 #roundsListHead 注释），
 *  故 .rounds-head .rh-acc / .ra-label / .ra-rate / .ra-good / .ra-bad /
 *  .ra-wait / .ra-detail / .ra-hint 这组规则不再有任何元素命中，属死代码。
 *  注意：行内（.day-head）那套 .ra-* 配色【另有定义】，在下方
 *  「.day-head .dy-acc .ra-*」处，与这里删除的这批无关，切勿混淆。 */
@media(max-width:760px){
  .rc-top{font-size:11px;gap:4px}
  .rc-top .rt-name{max-width:6em}
}

/* ── v4.5 头部（精简为单行：预测目标日 + 对账成功率）────── */
.rounds-head .rh-line{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px}
.rounds-head .rh-title{font-size:14.5px;font-weight:700;color:#f2f5fb;letter-spacing:.5px}
/* ── v4.5 轮次列表头（当前预测日期 · 全部轮次，点击隐藏/显示）── */
@media(max-width:760px){
      }

/* ═══════════════════════════════════════════════════════
   v4.6 顶部右侧 + 弹幕
   ═══════════════════════════════════════════════════════ */
/* 顶部栏右侧：统计信息 + 更新日志按钮（右上角） */
button.topbar-cl{padding:5px 12px;font-size:12px;font-weight:600;border-radius:6px;white-space:nowrap}
/* 头部与轮次列表头合并为一行 */
.rounds-head{cursor:pointer;user-select:none;transition:.2s}
.rounds-head:hover{background:rgba(74,168,255,.07)}
.rounds-head .rlh-count{font-size:11.5px;color:var(--muted);flex:1}
.rounds-head .rlh-toggle{font-size:11px;color:var(--cyan);margin-right:10px}

/* ── 弹幕层：固定覆盖，右侧→左侧滚动 ── */
.danmaku-layer{position:fixed;inset:0;pointer-events:none;z-index:40;overflow:hidden}
.danmaku{position:absolute;right:0;display:inline-flex;align-items:center;gap:7px;
  padding:5px 13px;border-radius:999px;white-space:nowrap;
  font-size:12.5px;line-height:1.4;backdrop-filter:blur(6px);
  will-change:transform;animation-name:danmakuMove;animation-timing-function:linear;animation-fill-mode:forwards}
/* 从屏幕右侧外 → 完全移出左侧外 */
@keyframes danmakuMove{
  from{transform:translateX(100vw)}
  to{transform:translateX(calc(-100% - 100vw))}
}
.danmaku.dm-bull{background:rgba(242,54,69,.16);border:1px solid rgba(242,54,69,.45);color:#ffd7dc}
.danmaku.dm-bear{background:rgba(0,192,135,.14);border:1px solid rgba(0,192,135,.45);color:#c9ffe9}
.danmaku .dm-text{max-width:52vw;overflow:hidden;text-overflow:ellipsis}
.danmaku a.dm-text{color:inherit;text-decoration:none}
.danmaku a.dm-text:hover{text-decoration:underline}
/* 弹幕层允许点击其中的链接（其余区域不拦截页面交互） */
.danmaku-layer .danmaku{pointer-events:auto}
@media(max-width:760px){
  .danmaku{font-size:11.5px;padding:4px 10px}
  .danmaku .dm-text{max-width:44vw}
  .topbar-right{gap:8px}
  button.topbar-cl{padding:4px 9px;font-size:11px}
}

/* v4.6：工具栏空时不占空间（仅在错误提示时出现） */
/* v4.8：抖动修复——工具栏不再随内容显隐
 * 原实现 .toolbar:has(#statusText:empty){display:none} + 每次 load() 先设
 * "加载中…" → 工具栏每30秒显隐一次 → 下方全部内容上下位移约40px（肉眼可见抖动）。
 * 现在：工具栏本体零高度零边距，状态文字的边距挂在自己身上（仅在错误时出现）。 */
.toolbar{display:block;margin:0;padding:0;min-height:0;height:auto}
.toolbar #statusText{display:block}
.toolbar #statusText:empty{display:none}
.toolbar #statusText:not(:empty){margin:12px 0}

/* ═══ v4.7 调整 ═══ */
/* v6.8.4：原「全部轮次（共N轮）与展开箭头紧邻为一组」的 .rlh-group 规则已删除 ——
   该分组元素随头部对账行一并移除，已无元素命中。 */
.rounds-head .rlh-toggle{margin-right:10px}
/* 需求3：统计信息与更新日志在同一行，更新日志固定最右 */
.topbar-right{display:flex;align-items:center;gap:14px;flex-wrap:wrap;justify-content:flex-end}
.topbar-right .stat-line{justify-content:flex-end}
.topbar-right .topbar-cl{margin-left:auto}
/* 需求5：弹幕【多】/【空】标签（与资讯速览 nt-title 同款：纯文字着色） */
.danmaku .dm-tag{font-size:11px;font-weight:700;flex-shrink:0;letter-spacing:.5px}
.danmaku .dm-tag.bull{color:#ff8b98}
.danmaku .dm-tag.bear{color:#5fe8b8}

/* ═══ v4.8 抖动修复（页面刷新时整体位移）═══════════════
 * 根因：load() 每30秒先把 statusText 设为"加载中…"再清空，
 *       而原 .toolbar:has(#statusText:empty){display:none} 随之显隐切换，
 *       使下方全部内容上下位移约 40px。现已改为 toolbar 零高度常驻。 */
/* 数字等宽：避免数值变化时宽度抖动 */
.rp-num{color:var(--cyan);font-family:var(--mono);font-variant-numeric:tabular-nums}
.stat-line .st b,.mkt-idx .mi-val,.mkt-idx .mi-chg{font-variant-numeric:tabular-nums}
/* v6.8.4：原"对账状态与轮次组固定基线"规则（.rh-acc/.rlh-group）已删除，
   两者均随头部对账行一并移除，已无元素命中。头部现存 .rh-title 为单行文本，
   无需固定行高。 */
/* 市场指数条固定高度：行情加载前后不改变页面高度 */
/* v5.5.2 抖动修复：固定高度与真实内容一致。
   原 min-height:62px 而真实内容约 72px → 接口异常时塌到 62px，
   恢复后弹回 72px，造成下方内容 10px 上下位移（用户反馈的"向下抖动"）。
   用 height 而非 min-height，使高度在任何数据状态下都恒定。 */
.market-strip{height:73px;min-height:73px}
@media(max-width:768px){.market-strip{height:auto;min-height:0}}

/* ══ v5.0 参考维度展示 ═══ */

/* ═ v5.2 预测理由按钮 + 弹窗 ═════════════════════════ */
/* 股票列：名称+代码+理由按钮 同行紧凑排列 */
.round-table .stock-cell{display:inline-flex;align-items:center;gap:5px;flex-wrap:nowrap}
.round-table .reason-btn{padding:1px 7px;font-size:10.5px;border-radius:4px;cursor:pointer;margin-left:2px;
  background:rgba(74,168,255,.14);border:1px solid rgba(74,168,255,.42);color:#9fd0ff;
  font-weight:600;white-space:nowrap;transition:.18s}
.round-table .reason-btn:hover{background:rgba(74,168,255,.3);border-color:var(--cyan);color:#fff;transform:translateY(-1px)}

.reason-mask{position:fixed;inset:0;background:rgba(4,7,14,.78);backdrop-filter:blur(4px);
  z-index:120;display:flex;align-items:center;justify-content:center;padding:20px;overflow:auto}
.reason-box{width:100%;max-width:720px;max-height:86vh;display:flex;flex-direction:column;
  background:linear-gradient(180deg,#101728,#0b1120);border:1px solid rgba(74,168,255,.32);
  border-radius:14px;box-shadow:0 24px 70px rgba(0,0,0,.65)}
.reason-head{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:15px 20px;border-bottom:1px solid var(--line)}
.reason-title{font-size:15px;font-weight:700;color:#eef2fa;letter-spacing:.3px}
.reason-close{width:28px;height:28px;border-radius:7px;cursor:pointer;flex-shrink:0;position:relative;
  background:rgba(255,255,255,.05);border:1px solid var(--line);color:var(--muted)}
.reason-close::before,.reason-close::after{content:'';position:absolute;left:50%;top:50%;
  width:12px;height:1.6px;background:currentColor;border-radius:2px}
.reason-close::before{transform:translate(-50%,-50%) rotate(45deg)}
.reason-close::after{transform:translate(-50%,-50%) rotate(-45deg)}
.reason-close:hover{background:rgba(255,107,122,.18);color:#ff8b98;border-color:rgba(255,107,122,.5)}
.reason-body{padding:18px 20px 20px;overflow-y:auto;font-size:13px;line-height:1.75}

/* ══ v6.9.24 产品化结论区（用户要求"产品化、有侧重点"）════════════════
 *  放在理由弹窗最顶部，替代原先"一上来就是方法论"的技术描述。
 *  视觉层级：大字结论 > 信号卡片 > 操作提示 > 模型方向 > 技术明细。
 *  配色沿用全站 A 股规范：涨=红(--red)、跌=绿(--green)。 */

/* ① 大字结论卡 */
.rh-headline{padding:14px 16px;margin-bottom:12px;border-radius:11px;
  background:linear-gradient(135deg,rgba(20,27,48,.95),rgba(16,22,39,.95));
  border:1px solid var(--line)}
.rh-headline.rh-up{border-left:4px solid var(--red)}
.rh-headline.rh-down{border-left:4px solid var(--green)}
.rh-headline.rh-flat{border-left:4px solid var(--line2)}
.rh-top{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
.rh-label{font-size:20px;font-weight:800;letter-spacing:1px}
.rh-up .rh-label{color:var(--red)}
.rh-down .rh-label{color:var(--green)}
.rh-flat .rh-label{color:var(--muted)}
.rh-prob{font-size:14px;font-family:var(--mono);color:#c6cfe2;font-weight:600}
/* v6.9.24：共识不通过时不展示占位概率，改用说明文字（弱化显示） */
.rh-prob-na{font-family:inherit;font-size:12.5px;color:var(--muted2);font-weight:400}
.rh-strength{font-size:11.5px;color:var(--muted2);padding:2px 8px;border-radius:5px;
  background:rgba(255,255,255,.05);border:1px solid var(--line)}
.rh-why{margin-top:7px;font-size:12.5px;color:var(--muted);line-height:1.65}

/* ② 信号卡片：关键词 + 一句人话 */
.rh-signals{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}
.rh-sig{display:flex;align-items:baseline;gap:9px;padding:8px 12px;border-radius:8px;
  background:rgba(16,22,39,.75);border:1px solid var(--line);font-size:12.5px}
.rh-sig-key{font-weight:800;flex-shrink:0;min-width:76px}
.rh-sig-txt{color:#c6cfe2;line-height:1.6}
.rh-sig-up{border-left:3px solid var(--red)}
.rh-sig-up .rh-sig-key{color:var(--red)}
.rh-sig-down{border-left:3px solid var(--green)}
.rh-sig-down .rh-sig-key{color:var(--green)}
.rh-sig-flat{border-left:3px solid var(--line2)}
.rh-sig-flat .rh-sig-key{color:var(--muted)}
.rh-sig-warn{border-left:3px solid var(--gold2)}
.rh-sig-warn .rh-sig-key{color:var(--gold2)}

/* ③ 操作提示条（比结论更醒目，因为它是"所以我该做什么"） */
.rh-action{display:flex;align-items:baseline;gap:10px;padding:10px 14px;margin-bottom:12px;
  border-radius:9px;font-size:13px;background:rgba(74,168,255,.07);border:1px solid rgba(74,168,255,.2)}
.rh-act-level{font-weight:800;font-size:14px;flex-shrink:0}
.rh-act-txt{color:#c6cfe2;line-height:1.6}
.rh-act-up .rh-act-level{color:var(--red)}
.rh-act-down .rh-act-level{color:var(--green)}
.rh-act-flat .rh-act-level{color:var(--muted)}
.rh-act-warn .rh-act-level{color:var(--gold2)}
.rh-act-down{background:rgba(87,255,190,.06);border-color:rgba(87,255,190,.22)}
.rh-act-warn{background:rgba(255,215,106,.07);border-color:rgba(255,215,106,.22)}

/* ④ 三模型方向一览 */
.rh-models{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-bottom:14px;
  padding-bottom:11px;border-bottom:1px dashed var(--line)}
.rh-mtag{font-size:11px;font-family:var(--mono);padding:3px 9px;border-radius:5px;
  background:rgba(255,255,255,.04);border:1px solid var(--line)}
.rh-mtag-up{color:var(--red);border-color:rgba(242,54,69,.35)}
.rh-mtag-down{color:var(--green);border-color:rgba(87,255,190,.35)}
.rh-mtag-flat{color:var(--muted)}
.rh-mok{font-size:11.5px;font-weight:700;color:var(--cyan);margin-left:auto}
.rh-mok-no{color:var(--gold2)}
/* ── v6.19.2（用户反馈）：模型标尺说明 ──────────────────────────────
 *  背景：用户指出"历史规律 52% 看多"与"上行概率 48.7%"数值不一致。
 *  根因是 B 的展示层混用了两个标尺（归一化分数 vs 真实历史上涨率）。
 *  修正后统一显示真实上涨率，并在此说明它为何天然低于 50%
 *  （其自然水位是历史基准≈47%），避免用户再把它读成"模型B看空"。
 *  视觉：比标签更弱的一行小字，不抢主信息。 */
.rh-models-note{font-size:11px;color:var(--muted);margin:-8px 0 14px;
  padding-left:2px;line-height:1.5}
.reason-verdict{padding:11px 14px;margin-bottom:16px;border-radius:9px;font-size:13.5px;font-weight:600;
  background:rgba(74,168,255,.1);border-left:3px solid var(--cyan);color:#dce6f7}
.reason-sec{margin-bottom:16px}
.reason-sec-title{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  font-size:13px;font-weight:700;color:#cfe0f7;margin-bottom:7px;padding-left:9px;
  border-left:3px solid rgba(74,168,255,.6)}
.reason-sec.risk .reason-sec-title{border-left-color:rgba(255,107,122,.7);color:#ffc9d0}
/* ── v6.12.0（用户要求）：公告逐条展示 + 可点击链接 ──────────────────
 *  标题可点击跳到东财公告原文页，用下划线 + 箭头暗示"可点"；
 *  日期/类型作为前置灰色元信息，与标题同一行但视觉更弱。 */
.ann-list li.ann-item{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.ann-meta{flex:0 0 auto;font-size:11px;font-family:var(--mono);color:#7c88a6;
  padding:1px 6px;border-radius:4px;background:rgba(124,136,166,.12)}
.ann-link{color:#8fc7ff;text-decoration:none;border-bottom:1px dashed rgba(143,199,255,.45);
  font-size:12.5px;line-height:1.6;word-break:break-word;transition:color .15s,border-color .15s}
.ann-link:hover{color:#bfe0ff;border-bottom-color:#bfe0ff}
.ann-link::after{content:' ↗';font-size:10.5px;opacity:.7}
.ann-text{font-size:12.5px;color:#c3cddd;line-height:1.6;word-break:break-word}
/* ══ v6.13.0（用户要求）：理由面板 —— 利好 / 利空 两栏对比 ═══════════
 *  用户要求"理由信息太多，精简并突出区分利好与利空"。
 *  设计：两栏并排（窄屏自动堆叠），左绿右红，栏头带图标与条数，
 *  让用户三秒看清"几只利好、几条利空"，直接形成权衡印象。
 *  颜色沿用 A 股红涨绿跌的市场惯例（利好=红/暖色系在前端主题里
 *  已用于上涨，此处沿用同一语义变量，避免与既有配色冲突）。 */
.bb-wrap{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:4px 0 12px}
@media (max-width:640px){.bb-wrap{grid-template-columns:1fr}}
.bb-col{border-radius:10px;padding:10px 12px;min-width:0}
.bb-bull{background:rgba(242,54,69,.07);border:1px solid rgba(242,54,69,.22)}
.bb-bear{background:rgba(46,164,79,.07);border:1px solid rgba(46,164,79,.22)}
.bb-head{display:flex;align-items:center;gap:6px;margin-bottom:7px;
  font-size:12.5px;font-weight:700}
.bb-bull .bb-head{color:#ff9aa6}
.bb-bear .bb-head{color:#7fd39a}
.bb-ico{font-size:10px;line-height:1}
.bb-title{flex:1 1 auto}
.bb-count{flex:0 0 auto;font-family:var(--mono);font-size:11px;font-weight:700;
  padding:0 6px;border-radius:8px;background:rgba(255,255,255,.08)}
.bb-list{margin:0;padding:0;list-style:none}
.bb-list li{position:relative;padding-left:12px;margin-bottom:5px;
  font-size:12.5px;line-height:1.55;color:#dbe4f0;word-break:break-word}
.bb-list li:last-child{margin-bottom:0}
.bb-list li:before{content:'';position:absolute;left:2px;top:7px;
  width:4px;height:4px;border-radius:50%}
.bb-bull .bb-list li:before{background:#ff9aa6}
.bb-bear .bb-list li:before{background:#7fd39a}
.bb-empty{color:#7c88a6;font-style:italic}
/* 明细折叠区：默认收起，只有结论与利好/利空常驻可见 */
.reason-all-detail{margin-top:6px;border-top:1px dashed rgba(124,136,166,.22);padding-top:10px}
.reason-all-toggle{width:100%;text-align:left;cursor:pointer;
  background:rgba(124,136,166,.08);border:1px solid rgba(124,136,166,.2);
  color:#b9c6d8;font-size:12.5px;padding:8px 11px;border-radius:8px;
  transition:background .15s,border-color .15s}
.reason-all-toggle:hover{background:rgba(124,136,166,.14);border-color:rgba(124,136,166,.34)}
.reason-all-body{margin-top:10px}
 /* ── v6.14.0（用户要求）：换手率独立成列（位于"参考止损价"右侧）──────
 *  用户要求："换手率放在一个新列中，列名称叫换手率，
 *            放在参考止损价列右边，数据显示例如：3%"。
 *  显示为整数百分比（列名已表意，单元格不再重复"换手"二字）。
 *  列内等宽字体 + 居中，使一列数字纵向对齐、便于快速比较。 */
.turn-cell{font-family:var(--mono);white-space:nowrap;text-align:center}
.turn{font-weight:700}
/* 达标用中性色（这是准入条件，不是"利好"，不该抢红色上涨的视觉权重）；
   不足才用警示色，便于一眼发现问题标的（正常情况下榜单不会有） */
.turn.ok{color:#c9d6e8}
.turn.low{color:#ffb0a0}
/* ── v6.21.0：榜单"所属ETF"列 ──────────────────────────────────────
 *  用户要求"在预测结果列表中把所属ETF展示出来，确保推荐的在ETF top榜单中"。
 *  因此这一列要同时表达【是哪只ETF】与【它在排行榜第几名】：
 *    上行：ETF 名称（次要色，避免抢股票的视觉权重）
 *    下行：名次徽标（达标=青绿、未达标=警示红）
 *  宽度受限（榜单列多），名称过长省略号截断，完整信息在 title 提示里。 */
.etf-cell{display:inline-flex;flex-direction:column;gap:2px;line-height:1.25;max-width:120px}
.etf-cell-name{font-size:11.5px;color:#b9c6da;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.etf-cell-rank{font-size:11px;font-weight:700;font-family:var(--mono);color:var(--muted);white-space:nowrap}
.etf-cell-rank.ok{color:#3fd6a8}
.etf-cell.bad .etf-cell-rank{color:#ffb0a0}
.etf-cell-td{white-space:nowrap}
/* ── v6.9.14：对标 ETF 明细内联在"模型C"区块内 ──────────────────
 *  用户要求"本股对标的行业ETF合并在模型C里面说明"。
 *  原先它是独立一节（标题"本股对标的行业ETF"），与紧随其后的
 *  "模型C · 行业ETF"重复且割裂 —— ETF 本就是 C 的对标物。
 *  样式上用浅底 + 左侧细线把它标成 C 区块内的"参照物"子块：
 *    · 与 C 的结论列表有视觉区分（它是背景信息，不是结论）
 *    · 但仍归属 C（同色系、有缩进），不再像另一个模型 */
.reason-sec-c .reason-etf-inline{margin:2px 0 8px;padding:8px 10px;border-radius:7px;
  background:rgba(74,168,255,.06);border-left:2px solid rgba(74,168,255,.35)}
.reason-sec-c .reason-etf-inline .reason-list{margin:0}
.reason-sec-c .reason-etf-inline .reason-list li{margin-bottom:4px;font-size:12.5px}
.reason-sec-c .reason-etf-inline .reason-list li:last-child{margin-bottom:0}
.reason-prob{font-size:11.5px;font-family:var(--mono);font-weight:700;padding:1px 7px;border-radius:4px}
.reason-prob.up{color:#ff9aa6;background:rgba(242,54,69,.15)}
.reason-prob.down{color:#7fe0bb;background:rgba(0,192,135,.14)}
/* v6.9.6：C 只预测幅度、不表态方向时的中性标签 —— 用灰蓝表示"无方向观点"，
   与看涨(红)/看跌(绿)区分开，避免用户把中性占位读成"看涨 50%" */
.reason-prob.flat{color:#9fb0cc;background:rgba(159,176,204,.14)}
.reason-list{margin:0;padding-left:20px;list-style:none}
.reason-list li{position:relative;margin-bottom:5px;color:#b9c6dc}
.reason-list li::before{content:'·';position:absolute;left:-13px;color:var(--cyan);font-weight:700}
.reason-list.info li::before{content:'✓';font-size:10px;left:-15px;color:#4fe0ac}
.reason-sec.risk .reason-list li::before{content:'!';color:#ff8b98}
.reason-foot{margin-top:16px;padding-top:12px;border-top:1px solid var(--line);
  font-size:11px;color:var(--muted2);line-height:1.6}
@media(max-width:760px){
  .reason-box{max-height:92vh}
  .reason-body{font-size:12.5px;padding:14px 15px 16px}
  .reason-title{font-size:13.5px}
  .reason-list{padding-left:18px}
}

/* ═══════════════════════════════════════════════════════
   v5.6 预测日竖排列表（一行一个预测日，可展开）
   ═══════════════════════════════════════════════════════ */
.rounds-days{padding:0 14px 10px;display:flex;flex-direction:column;gap:7px}
/* 预测日行 */
.day-row{border:1px solid rgba(74,168,255,.2);border-radius:9px;
  background:rgba(74,168,255,.05);overflow:hidden;transition:.2s}
.day-row:hover{border-color:rgba(74,168,255,.42)}
.day-head{display:flex;align-items:center;gap:8px;padding:10px 13px;
  cursor:pointer;user-select:none;transition:.18s;flex-wrap:wrap}
.day-head:hover{background:rgba(74,168,255,.09)}
.day-head.open{background:rgba(74,168,255,.13);border-bottom:1px solid rgba(74,168,255,.22)}
.day-head .dy-arrow{font-size:10px;color:var(--cyan);flex-shrink:0;width:11px}
.day-head .dy-date{font-size:14px;font-weight:700;color:#f0f4fb;
  font-family:var(--mono);letter-spacing:.4px;white-space:nowrap}
.day-head .dy-sep{color:var(--muted2);font-size:11px}
.day-head .dy-count{font-size:12px;font-weight:600;color:#9fd0ff;
  font-family:var(--mono);white-space:nowrap}
.day-head .dy-label{font-size:11px;color:var(--muted);white-space:nowrap}
.day-head .dy-acc{margin-left:auto;font-size:11px;white-space:nowrap;
  display:flex;align-items:center;gap:3px;flex-wrap:wrap;justify-content:flex-end}
/* v6.8.3：行内对账配色。
 *  头部那套 .ra-rate/.ra-good/.ra-bad 选择器是【限定在 .rounds-head 下】的
 *  （见上方 .rounds-head .ra-rate），在 .day-head 里不生效；
 *  若不补这段，行内成功率会退化成无样式文本，涨跌配色也会丢失。
 *
 *  ── v6.9.8 配色方向修正（用户反馈"你现在相反了"）────────────────
 *  本产品遵循 A 股规范：**红涨绿跌**（见 :root 的 --red 注释"涨"、
 *  --green 注释"跌"；下文 .up{color:var(--red)} / .down{color:var(--green)}）。
 *  对账"成功率"是【正面指标】，语义等同"涨"，因此：
 *      成功率高 → 红色（--red）   ｜ 成功率低 → 绿色（--green）
 *  原实现恰好写反（ra-good 用 #4fe0ac 绿、ra-bad 用 #ff6b7a 红），
 *  会让用户把"高成功率"读成坏消息、把"低成功率"读成好消息。
 *  这里改用主题变量而不是硬编码色值，避免以后再和各处配色脱节。 */
.day-head .dy-acc .dy-acc-label{color:var(--muted2)}
.day-head .dy-acc .dy-acc-sub{color:var(--muted);font-family:var(--mono)}
.day-head .dy-acc .ra-rate{font-family:var(--mono);font-weight:700;font-size:11.5px}
.day-head .dy-acc .ra-good{color:var(--red)}
.day-head .dy-acc .ra-bad{color:var(--green)}
.day-head .dy-acc .ra-wait{color:#8b93a1;font-weight:500}
.day-head .dy-toggle{padding:2px 9px;font-size:11px;border-radius:5px;cursor:pointer;flex-shrink:0;
  background:rgba(74,168,255,.12);border:1px solid rgba(74,168,255,.36);color:#9fd0ff;font-weight:600}
.day-head .dy-toggle:hover{background:rgba(74,168,255,.26);border-color:var(--cyan);color:#fff}
/* 展开体：该预测日的轮次列表 */
.day-body{padding:9px 11px 11px;background:rgba(6,10,20,.42)}
.day-body .day-loading{padding:12px;text-align:center;font-size:12px;color:var(--muted)}
.day-body .day-sum{padding:6px 4px 9px;font-size:11.5px;color:var(--muted)}
/* 轮次卡片在展开体内更紧凑 */
.day-body .round-card{margin-bottom:5px;border-color:rgba(74,168,255,.14)}
.day-body .round-card-head{padding:8px 11px}
@media(max-width:760px){
  .rounds-days{padding:0 8px 8px}
  .day-head{padding:8px 10px;gap:6px}
  .day-head .dy-date{font-size:12.5px}
  .day-head .dy-label{display:none}
  /* v6.8.3：窄屏下对账摘要会更长（含三模型命中率），
     必须允许换行并占满整行，否则会与日期/轮次数挤在一起或被裁掉 */
  .day-head .dy-acc{margin-left:0;width:100%;justify-content:flex-start}
  .day-head .dy-toggle{padding:2px 7px;font-size:10px}
  .day-body{padding:7px 6px 9px}
}

/* v6.2.3 轮次进度中的暂停原因（与正常状态区分） */
.poll-progress .rp-pause{color:#8b93a1}
