/* ============================================================================
 * 舵手1号 · style.css —— 浅色白金主题（P0 纯视觉重构）
 * 定稿方向：白底 + 金强调；Inter + JetBrains Mono；今日指挥台 + 总览→下钻。
 * 约束：只改视觉/排版层。红=涨/赚(--up)、绿=跌/亏(--down) 语义不变；
 *       全部旧 class / DOM id 保留；生产不依赖外部字体 CDN（系统字体栈）。
 * 结构：① 令牌 → ② 关键帧/无障碍 → ③ 基础 → ④ 顶栏 → ⑤ 侧栏/导航 →
 *       ⑥ 主内容/视图 → ⑦ 卡片/面板/分区 → ⑧ KPI 吸顶条 → ⑨ 表格 →
 *       ⑩ 组件类(输入/标签/抽屉/清单行) → ⑪ 资讯/日程/告警 → ⑫ 图表 →
 *       ⑬ 移动端。
 * ========================================================================== */

/* ===== ① 令牌（白金 · 定稿） ===== */
:root{
  color-scheme:light;
  /* —— 指定 token（新体系） —— */
  --bg:#f8f5ef;                 /* 页面底色（微暖白） */
  --surface:#ffffff;            /* 卡片/面板面 */
  --surface-2:#faf7f1;          /* 次级面（标签/表头/悬浮） */
  --surface-3:#f0e9db;          /* 抬升面（hover/输入底） */
  --border:#e4d9c6;             /* 主边框 */
  --border-2:#cbb896;           /* 强调边框（金棕） */
  --text:#281f13;               /* 正文（暖黑） */
  --muted:#63543d;              /* 次级文本 */
  --faint:#8a7a5f;              /* 弱文本（保持白底可读，不偏浅） */
  --accent:#b9822a;             /* 强调金 */
  --accent-soft:rgba(185,130,42,.11);
  --accent-grad:linear-gradient(135deg,#d9a854,#a06f1c);
  --up:#d63f47;                 /* 红=涨/赚（语义定稿，禁改） */
  --down:#128a4b;               /* 绿=跌/亏（语义定稿，禁改） */
  --up-bg:rgba(214,63,71,.09);
  --down-bg:rgba(18,138,75,.09);
  --danger-bg:rgba(214,63,71,.08);
  /* —— round-10 ISS-126 方案A：**非涨跌语义**专用色阶（红/绿只留给涨跌） ——
   * 依据：--up/--down 的语义是「涨/赚」「跌/亏」（本文件 28-29 行，硬约束）；
   *       评分星级 / 胜率可信度 / 置信度 / 板块强度 / 止损目标 等**不是涨跌**，
   *       共用红绿会在同一屏产生「红=涨 还是 红=低分」的误读（对色盲用户尤甚）。
   * 取值：灰（低）→ 金（中）→ 蓝（高），三级单调、均不占用红绿；实测像素见
   *       docs/round10_shots_after/palette.json（before/after RGB 对照）。 */
  --scale-high:#2f6ca8;         /* 「高/好/强/可信」= 蓝 */
  --scale-mid:#b9822a;          /* 「中」= 金（= --accent，保持既有强调观感） */
  --scale-low:#8c8071;          /* 「低/差/弱」= 中性灰 */
  /* —— 旧 token 别名：兼容 index.html/各 JS 既有 var() 内联引用 —— */
  --bg2:#faf7f1;                /* 旧输入底/次级面 → surface-2 */
  --card:#ffffff;               /* 旧卡片面 → surface */
  --card2:#faf7f1;              /* 旧抬升面 → surface-2 */
  --card3:#f3ecdd;              /* 旧 hover 面 → surface-3 略提亮 */
  --border2:#e7dcc7;            /* 旧细分隔线（略浅于 --border-2） */
  --flat:#63543d;               /* 旧 flat → muted */
  --accent-bg:rgba(185,130,42,.11);
  /* —— 圆角 / 阴影（暖棕透明阴影，浅色下克制） —— */
  --radius-xs:4px;
  --radius-sm:6px;
  --radius:10px;
  --radius-lg:14px;
  --shadow-sm:0 1px 2px rgba(92,70,30,.08);
  --shadow:0 2px 10px rgba(92,70,30,.10);
  --shadow-lg:0 12px 28px rgba(92,70,30,.14);
  /* —— 4pt 间距体系 + 语义层 —— */
  --space-1:4px; --space-2:8px; --space-3:12px; --space-4:16px; --space-5:20px; --space-6:28px;
  --space-section:32px;         /* 分区间距（今日指挥台 §1-§4 之间） */
  --space-panel:18px;           /* 面板内边距语义层 */
  /* —— 字体（Inter/JetBrains Mono 系统回落，可离线；中文 PingFang SC） —— */
  --font:"Inter",-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei","Segoe UI",sans-serif;
  --mono:"JetBrains Mono",ui-monospace,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;
  /* —— 动效 token：统一缓动/时长（只用 transform+opacity） —— */
  --ease:cubic-bezier(.22,.61,.36,1);
  --dur-fast:150ms;
  --dur:240ms;
  --dur-slow:420ms;
  --glow-accent:0 0 0 1px rgba(185,130,42,.16),0 8px 22px rgba(185,130,42,.13);
  --glow-up:0 4px 18px rgba(214,63,71,.16);
  --glow-down:0 4px 18px rgba(18,138,75,.16);
}

/* ===== ② 关键帧（克制使用：视图入场/列表淡入/右滑/呼吸光/骨架微光） ===== */
@keyframes viewIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes slideIn{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:translateX(0)}}
@keyframes glowPulse{0%,100%{opacity:.5}50%{opacity:.95}}
@keyframes shimmer{from{background-position:-200px 0}to{background-position:200px 0}}

/* 视图切换入场：JS 在 switchView 时给目标视图加 .view-enter */
.view-enter{animation:viewIn var(--dur-slow) var(--ease) both}
/* 列表条目入场（innerHTML 重渲染时自然重播，纯 opacity 不引抖动） */
.alert-item,.news-item,.cal-evt,.listrow{animation:fadeIn var(--dur) var(--ease) both}
/* 骨架微光（可选类）：加载占位条 */
.shimmer{background:linear-gradient(90deg,var(--card2) 25%,var(--card3) 50%,var(--card2) 75%);background-size:400px 100%;animation:shimmer 1.4s linear infinite}

/* 无障碍：减少动态偏好时关闭动画、过渡压到近即时（保留淡入淡出级别的状态切换） */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation:none!important;transition-duration:.01ms!important;scroll-behavior:auto!important}
  .view-enter{animation:none!important}
}

/* ===== ③ 基础 ===== */
*{margin:0;padding:0;box-sizing:border-box}
html,body{height:100%}
body{background:var(--bg);color:var(--text);font-family:var(--font);font-size:14px;line-height:1.62;height:100vh;display:flex;flex-direction:column;overflow:hidden;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
::selection{background:rgba(185,130,42,.26);color:#2a1f0d}
:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
/* 数字统一等宽/表格对齐 */
.num,th.num,td.num{font-family:var(--mono);font-variant-numeric:tabular-nums}
.up{color:var(--up)}.down{color:var(--down)}.flat{color:var(--muted)}
a{color:inherit;text-decoration:none}

/* 细窄浅色滚动条 */
*{scrollbar-width:thin;scrollbar-color:#cfc3a8 transparent}
*::-webkit-scrollbar{width:9px;height:9px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{background:#d8ccb2;border:2px solid transparent;border-radius:8px;background-clip:padding-box}
*::-webkit-scrollbar-thumb:hover{background:#c4b48f;background-clip:padding-box}

/* 输入/选择等表单控件：组件化基类 + 裸控件兜底 */
input:not([type=checkbox]):not([type=radio]),select,textarea{
  background:var(--surface-2);border:1px solid var(--border);border-radius:8px;
  color:var(--text);padding:7px 10px;font-size:13px;font-family:var(--font);
  transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease);
}
input:not([type=checkbox]):not([type=radio]):focus,select:focus,textarea:focus{
  border-color:var(--accent);background:var(--surface);box-shadow:0 0 0 3px var(--accent-soft);outline:none}
input::placeholder,textarea::placeholder{color:var(--faint)}
input[type=checkbox],input[type=radio]{accent-color:var(--accent)}

/* ===== ④ 顶栏 ===== */
header{display:flex;align-items:center;gap:10px;min-height:56px;padding:0 18px;background:var(--surface);border-bottom:1px solid var(--border);box-shadow:inset 0 1px 0 rgba(255,255,255,.6),0 1px 6px rgba(92,70,30,.05);position:relative;z-index:20;flex-wrap:wrap}
header::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:linear-gradient(90deg,transparent,var(--accent-grad),transparent);opacity:.55;pointer-events:none}
.logo{font-size:15px;font-weight:800;white-space:nowrap;display:inline-flex;align-items:center;gap:8px;letter-spacing:.02em;color:var(--text)}
.logo::before{content:"";width:4px;height:16px;background:var(--accent-grad);border-radius:2px}
.logo span{color:var(--accent)}
.logo small{font-weight:500;color:var(--faint);font-size:12px;margin-left:2px}
.tabs{display:flex;gap:2px;background:var(--surface-2);border:1px solid var(--border);border-radius:999px;padding:3px}
.tab{padding:5px 14px;border-radius:999px;cursor:pointer;font-size:13px;color:var(--muted);transition:background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),transform var(--dur-fast) var(--ease)}
.tab:hover{color:var(--text);background:var(--surface-3)}
.tab:active{transform:scale(.96)}
.tab.active{background:var(--accent-grad);color:#2a1f0d;font-weight:700;box-shadow:0 2px 8px rgba(185,130,42,.25)}
.nav{display:flex;align-items:center;gap:6px}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;background:var(--surface-2);border:1px solid var(--border);color:var(--text);padding:6px 13px;border-radius:8px;cursor:pointer;font-size:12.5px;font-weight:600;letter-spacing:.01em;line-height:1.4;white-space:nowrap;transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease),transform var(--dur-fast) var(--ease)}
.btn:hover{border-color:var(--accent);color:var(--accent);background:var(--surface);box-shadow:0 3px 10px rgba(185,130,42,.14);transform:translateY(-1px)}
.btn:active{transform:scale(.96);box-shadow:none}
.btn:disabled{opacity:.45;cursor:not-allowed;filter:saturate(.5);transform:none;box-shadow:none}
.btn.primary{background:var(--accent-grad);color:#2a1f0d;font-weight:800;border-color:transparent;box-shadow:0 2px 8px rgba(185,130,42,.22)}
.btn.primary:hover{filter:brightness(1.06);color:#2a1f0d;box-shadow:0 5px 16px rgba(185,130,42,.3)}
.btn.danger{background:var(--up);color:#fff;border-color:transparent}
.btn.danger:hover{background:#e2545b;color:#fff}
.date-label{font-family:var(--mono);font-size:14px;font-weight:700;padding:0 8px;min-width:122px;text-align:center;color:var(--text);letter-spacing:.02em;font-variant-numeric:tabular-nums}
.spacer{flex:1}
.toggle{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:13px;cursor:pointer;user-select:none}
.toggle input{width:15px;height:15px;cursor:pointer}
#statusBar{display:none;padding:7px 16px;background:var(--surface-3);border-bottom:1px solid var(--border);font-size:12.5px;color:var(--accent);font-family:var(--mono)}
#statusBar.error{color:var(--up);background:var(--danger-bg);border-bottom-color:rgba(214,63,71,.3)}
#aiNotice{display:none;padding:7px 16px;background:var(--surface-2);border-bottom:1px solid var(--border);font-size:12px;color:var(--muted)}
/* 顶栏全局搜索（P1 由侧栏移入顶栏；ID 不变，行为不变） */
header .gsearch{position:relative;display:inline-flex;align-items:center}
header .gsearch::before{content:"⌕";position:absolute;left:11px;font-size:15px;color:var(--faint);pointer-events:none;font-weight:700}
header .gsearch input{border:none;background:var(--surface-2);border:1px solid var(--border);border-radius:999px;padding:6px 14px 6px 28px;width:212px;font-size:12.5px;transition:width var(--dur) var(--ease),border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}
header .gsearch input:focus{width:252px;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:none}
header #searchDrop{top:calc(100% + 5px);left:0;right:auto;width:286px;border-radius:10px}
@media(max-width:760px){header .gsearch{display:none}}

/* ===== ⑤ 主布局 / 侧栏 ===== */
.main{flex:1;display:flex;min-height:0;position:relative}
.sidebar{width:212px;min-width:212px;background:var(--surface);border-right:1px solid var(--border);overflow-y:auto;padding:12px 8px 18px;height:100%}
.sidebar h3{font-size:12px;color:var(--muted);padding:4px 8px 8px}
.side-head{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted);padding:10px 8px 8px;cursor:pointer;user-select:none}
.side-head:hover{color:var(--text)}
.side-head .arrow{display:inline-block;transition:transform .2s;font-size:10px}
.side-head.collapsed .arrow{transform:rotate(-90deg)}
#historyWrap{transition:opacity .2s}
#historyWrap.hidden{display:none}

/* 导航主区：5 个一级项 + 可折叠「更多工具」（旧视图入口全部保留于 DOM） */
.side-nav{display:flex;flex-direction:column;gap:3px;margin-bottom:8px;padding-bottom:12px;border-bottom:1px solid var(--border)}
.side-nav .nav-group{font-size:10px;color:var(--faint);padding:12px 10px 4px;letter-spacing:.14em;font-weight:700}
.side-nav .nav-group:first-child{padding-top:2px}
.side-nav .nav-item{position:relative;display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:8px;cursor:pointer;font-size:13px;font-weight:500;color:var(--muted);border-left:2px solid transparent;transition:background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),transform var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}
.side-nav .nav-item .n-ico{width:18px;text-align:center;font-size:13px;line-height:1;opacity:.9;flex-shrink:0;transition:transform var(--dur-fast) var(--ease)}
/* 导航图标：统一单色线性 SVG（stroke 继承 currentColor；金色仅用于当前选中项） */
.side-nav .nav-item .n-ico svg{width:16px;height:16px;display:block;margin:0 auto;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
#mNav .mn-ic svg{width:17px;height:17px;display:block;margin:0 auto;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.side-nav .nav-item .n-t{white-space:nowrap}
.side-nav .nav-item:hover .n-ico{opacity:1}
.side-nav .nav-item:active{transform:translateX(2px) scale(.97)}
.side-nav .nav-item.active{background:var(--accent-soft);color:var(--accent);font-weight:700;border-left-color:var(--accent);animation:fadeIn var(--dur) var(--ease)}
.side-nav .nav-item.active .n-ico{opacity:1}
.side-nav .nav-item .badge{min-width:16px;height:16px;padding:0 5px;margin-left:auto;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;background:var(--accent-grad);color:#2a1f0d;font-size:10px;font-weight:800;font-family:var(--mono);line-height:1}
/* 一级入口更醒目（容器作用域：switchView 覆写 className 不影响） */
.side-nav .nav-primary > .nav-item{font-weight:600;color:var(--text);letter-spacing:.01em}
.side-nav .nav-primary > .nav-item .n-ico{font-size:14px}
/* 次级入口小一号、弱化，默认收纳在「更多工具」里 */
.side-nav #moreToolsWrap .nav-item{font-size:12.5px;padding-left:26px;color:var(--faint)}
.side-nav #moreToolsWrap .nav-item:hover{color:var(--text)}
.side-nav #moreToolsWrap .nav-item.active{color:var(--accent)}
.side-nav .nav-sep{height:1px;background:var(--border);margin:10px 6px}
.side-nav .nav-mini{font-size:10.5px;color:var(--faint);letter-spacing:.1em;font-weight:700;padding:4px 10px 2px}
#moreToolsWrap{overflow:hidden;transition:max-height .24s var(--ease),opacity .2s var(--ease)}
#moreToolsWrap.hidden{max-height:0;opacity:0}
/* 「更多工具」弱化：默认折叠、虚线细分、标题弱化（仅兼容旧入口，不承载主功能） */
#moreToolsHead{opacity:.78;font-weight:600;letter-spacing:.04em;font-size:11.5px;padding:8px 8px 6px 10px;border-top:1px dashed var(--border);margin-top:2px}
.side-nav #moreToolsWrap{padding-left:8px;border-left:1px dashed var(--border)}
.side-nav #moreToolsWrap .nav-item{font-size:12px;color:var(--faint);opacity:.85;padding:6px 8px 6px 8px}
.side-nav #moreToolsWrap .nav-mini{color:var(--faint);font-size:10px;opacity:.7}

/* 顶栏用户菜单（账号设置 / AI 状态 / 系统管理入口，普通成员仅 5 个一级导航） */
#userChip{position:relative;align-items:center;gap:6px}
#userChip .um-trigger{font-weight:700;gap:5px;padding:3px 11px;font-size:12.5px}
#userChip .um-arrow{font-size:9px;color:var(--muted);margin-left:2px}
.um-menu{position:absolute;top:calc(100% + 8px);right:0;z-index:1200;display:none;min-width:236px;padding:6px;background:var(--surface);border:1px solid var(--border-2);border-radius:12px;box-shadow:var(--shadow-lg)}
body.um-open #userMenu{display:block}
.um-menu .um-head{display:flex;align-items:center;gap:7px;flex-wrap:wrap;padding:8px 10px 7px;font-size:13px;font-weight:700;border-bottom:1px solid var(--border);margin-bottom:4px}
.um-role{font-size:10.5px;color:var(--muted);font-weight:500;background:var(--surface-3);border-radius:999px;padding:1px 8px}
.um-ai{font-size:10.5px;color:var(--faint);font-weight:500;margin-left:auto}
.um-ai.on{color:var(--accent)}
.um-item{display:flex;width:100%;align-items:center;gap:8px;padding:8px 10px;border:none;background:none;color:var(--text);font-size:12.5px;text-align:left;cursor:pointer;border-radius:8px}
.um-item:hover{background:var(--surface-2);color:var(--accent)}
.um-item.um-danger{color:var(--up)}
.um-item.um-danger:hover{background:var(--danger-bg);color:var(--up)}
@media(max-width:760px){.um-menu{position:fixed;top:52px;right:8px}}

/* 侧栏身份 / 历史日期列表 */
#sideUser{display:none;padding:8px 10px;font-size:12px;color:var(--muted);border-bottom:1px solid var(--border);margin-bottom:10px;line-height:1.8}
.side-item{display:flex;align-items:center;gap:7px;padding:7px 10px;border-radius:8px;cursor:pointer;font-size:13px;color:var(--muted);border-left:2px solid transparent;transition:background .15s ease,color .15s ease,border-color .15s ease}
.side-item:hover{background:var(--surface-2);color:var(--text)}
.side-item.active{background:var(--accent-soft);color:var(--accent);font-weight:700;border-left-color:var(--accent)}
.side-item .dot{width:7px;height:7px;border-radius:50%;background:var(--border-2);flex-shrink:0}
.side-item .dot.no{background:var(--border)}
.side-item .wday{margin-left:auto;font-size:10px;color:var(--faint);font-family:var(--mono)}
.side-item .down{color:var(--down)}
.side-item .up{color:var(--up)}

/* ===== ⑥ 主内容 / 视图 ===== */
.content{flex:1;position:relative;background:radial-gradient(1100px 420px at 85% -6%,rgba(185,130,42,.05),transparent 60%),var(--bg);min-width:0;overflow-y:auto;overflow-x:hidden}
iframe{width:100%;height:100%;border:none;background:var(--surface)}
.placeholder{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;color:var(--muted);text-align:center;padding:20px}
.placeholder h2{color:var(--text);font-size:18px;letter-spacing:.02em}

/* 视图容器（旧容器与 display 契约不变，仅排版留白调整） */
#view-monitor,#view-screen,#view-backtest,#view-warroom,#view-calendar,#view-aiusage,#view-fund,#view-market,#view-plan,#view-stock{display:none;min-height:100%;padding:22px 26px 44px}

/* 页面标题 / 副题（新组件） */
.page-head{margin-bottom:16px}
h1.heading{font-size:25px;font-weight:800;letter-spacing:-.02em;line-height:1.2;color:var(--text);display:flex;align-items:center;gap:10px}
h1.heading .gld{background:var(--accent-grad);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.page-head .sub{color:var(--muted);font-size:13px;margin-top:5px;letter-spacing:.01em}

/* ===== ⑦ 卡片 / 面板 / 分区 ===== */
.m-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px;margin-bottom:18px}
.m-card{position:relative;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:15px 17px;box-shadow:var(--shadow-sm);min-width:0;transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease),box-shadow var(--dur) var(--ease),transform var(--dur-fast) var(--ease)}
.m-card:hover{border-color:var(--border-2);background:var(--surface);box-shadow:var(--shadow-lg),var(--glow-accent);transform:translateY(-2px)}
.m-card:active{transform:translateY(0) scale(.99)}
.m-card .l{color:var(--muted);font-size:11px;font-weight:600;letter-spacing:.05em;line-height:1.5}
.m-card .v{font-family:var(--mono);font-size:19px;font-weight:750;margin-top:6px;letter-spacing:-.01em;line-height:1.3;font-variant-numeric:tabular-nums;overflow-wrap:anywhere;min-width:0}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px}
@media(max-width:900px){.grid2,.grid3{grid-template-columns:1fr}}
/* 面板 pod */
.panel,.pod{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:18px 20px;margin-bottom:18px;box-shadow:var(--shadow-sm);transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
.panel:hover{border-color:var(--border-2)}
.panel h3,.pod h3{font-size:15px;font-weight:700;margin-bottom:15px;line-height:1.5;letter-spacing:.02em;color:var(--text)}
.panel h3::before,.pod h3::before{content:"";display:inline-block;width:3px;height:14px;background:var(--accent-grad);border-radius:2px;margin-right:9px;vertical-align:-2px}
.panel h3 .btn,.pod h3 .btn{vertical-align:middle}
/* 分区标题（今日指挥台 §1-§4 叙事流） */
.sec{margin-top:var(--space-section)}
.section-title,.sec-h{display:flex;align-items:center;gap:9px;font-size:15px;font-weight:700;letter-spacing:.01em;color:var(--text);margin-bottom:14px}
.section-title::before,.sec-h::before{content:"";width:3px;height:15px;background:var(--accent-grad);border-radius:2px}
.sec-h .tag{margin-left:auto;font-size:11px;color:var(--faint);font-weight:500}
/* 首屏焦点：今日盈亏/持仓主面板作为视觉锚点（提升层级，CSS-only） */
#pnlPanel{position:relative;border-color:var(--border-2);background:linear-gradient(180deg,rgba(185,130,42,.06),var(--surface) 45%);overflow:hidden}
#pnlPanel::after{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--accent-grad);opacity:.9;border-radius:0 2px 2px 0;box-shadow:0 0 10px rgba(185,130,42,.35);animation:glowPulse 3.6s ease-in-out infinite}
#pnlPanel .m-card{background:var(--surface-2);border-color:var(--border)}
#pnlPanel .m-card .v{font-weight:750}
.panel.collapsible > h3{cursor:pointer;user-select:none}
.panel.collapsible > h3 .chev{display:inline-block;font-size:10px;color:var(--faint);margin-right:2px;transition:transform .18s ease;vertical-align:1px}
.panel.collapsible.collapsed > h3 .chev{transform:rotate(-90deg)}
.panel.collapsible.collapsed > *:not(h3){display:none!important}

/* ===== ⑧ KPI 吸顶条（今日指挥台） ===== */
.kpi-strip{position:sticky;top:0;z-index:9;display:grid;grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:12px;margin:2px 0 8px;padding:14px 16px;border:1px solid var(--border);border-radius:var(--radius-lg);background:rgba(255,255,255,.88);box-shadow:var(--shadow);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);overflow:hidden}
.kpi-strip::before{content:"";position:absolute;left:0;top:0;right:0;height:2px;background:linear-gradient(90deg,transparent,var(--accent),transparent);opacity:.85}
.kpi{position:relative;padding:2px 4px;border-radius:10px;transition:background var(--dur-fast) var(--ease)}
.kpi:hover{background:var(--surface-3)}
.kpi .l{font-size:11px;color:var(--muted);font-weight:600;letter-spacing:.05em}
.kpi .v{font-family:var(--mono);font-size:24px;font-weight:800;margin-top:6px;line-height:1.1;font-variant-numeric:tabular-nums;letter-spacing:-.02em;color:var(--text)}
.kpi .s{font-size:11px;color:var(--muted);margin-top:5px}
.glow-red{text-shadow:0 0 16px rgba(214,63,71,.22)}
.glow-green{text-shadow:0 0 16px rgba(18,138,75,.22)}
/* KPI 盈亏按红/绿语义着色（cls 驱动，不在此处反转） */
.kpi .v.up{color:var(--up)}.kpi .v.down{color:var(--down)}.kpi .v.accent{color:var(--accent)}
/* 今日盈亏 = 首屏唯一主数字（视觉最大）；金色仅描当前选中态 */
.kpi-strip .kpi-hero{background:linear-gradient(180deg,rgba(185,130,42,.09),transparent 78%);border:1px solid rgba(185,130,42,.28);border-radius:12px}
.kpi-strip .kpi-hero .v{font-size:31px}
.kpi-strip .kpi-hero .l{color:#8a6a26;font-weight:700}
/* 首屏行情时间 / 数据状态行（区别于计算时间） */
.kpi-meta{font-size:12px;color:var(--muted);margin:-2px 4px 6px;display:flex;gap:6px;flex-wrap:wrap}
.kpi-meta .ds-tag{display:inline-flex;align-items:center;gap:5px}
.kpi-meta .ds-tag.delayed{color:#b36a12}
.kpi-meta .ds-tag.bad{color:var(--up)}
.kpi-meta .src{color:var(--faint)}

/* 工具箱折叠（总览页次级工具，默认收起不抢首屏） */
.tools-sec .section-title{cursor:pointer;user-select:none;margin-bottom:12px}
.tools-sec .section-title .chev{display:inline-block;transition:transform .18s ease;color:var(--faint);font-size:11px}
.tools-sec .section-title:hover{color:var(--accent)}
.tools-sec.collapsed .section-title .chev{transform:rotate(-90deg)}
.tools-sec.collapsed #mktToolsBody{display:none}

/* 风险与提醒区：摘要条目（内容由总览数据渲染） */
.risk-rows{display:flex;flex-direction:column;gap:8px}
.risk-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:10px;background:var(--surface-2);border:1px solid var(--border);font-size:13px;cursor:pointer;transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease)}
.risk-row:hover{border-color:var(--border-2);background:var(--surface)}
.risk-row .rk{flex-shrink:0;min-width:76px;text-align:center;border-radius:999px;padding:2px 10px;font-size:11.5px;font-weight:700}
.risk-row .rk.danger{background:var(--danger-bg);color:var(--up)}
.risk-row .rk.warn{background:rgba(179,106,18,.12);color:#b36a12}
.risk-row .rk.info{background:var(--accent-soft);color:var(--accent)}
.risk-row .rm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.risk-row .rm small{color:var(--faint);font-size:11px;margin-left:6px}
.risk-row .rg{color:var(--faint);font-size:11px;flex-shrink:0}
.risk-row .rg b{color:var(--accent)}
.risk-empty{color:var(--faint);font-size:12.5px;padding:6px 2px}

/* ===== ⑨ 表格 ===== */
table{width:100%;border-collapse:collapse;font-size:13px}
th{position:sticky;top:0;z-index:1;background:var(--surface-2);color:var(--muted);font-weight:650;text-align:left;padding:8px 9px;border-bottom:1px solid var(--border);white-space:nowrap;font-size:11px;letter-spacing:.05em}
td{padding:7px 9px;border-bottom:1px solid var(--border);font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--text)}
tr:nth-child(even) td{background:rgba(185,130,42,.025)}
tr:hover td{background:var(--accent-soft)}
th.num,td.num{text-align:right;font-family:var(--mono)}

/* ===== ⑩ 组件类（替代内联重复样式：抽屉/清单行/标签/表单） ===== */
.field{display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--muted)}
.field > .input,.field > input,.field > select{width:100%}
.input,.select{background:var(--surface-2);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:7px 10px;font-size:13px;transition:border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}
.select{padding-right:26px;appearance:auto}
.chip,.tag{display:inline-block;padding:1px 8px;border-radius:6px;font-size:11px;font-weight:600;background:var(--surface-3);color:var(--muted);margin:0 6px 0 0;vertical-align:1px;white-space:nowrap}
.chip.up{background:var(--up-bg);color:var(--up)}
.chip.down{background:var(--down-bg);color:var(--down)}
.chip.gold,.tag.gold{background:var(--accent-soft);color:var(--accent)}

/* 快捷入口/链接卡（今日指挥台 §2-§4 入口，不引业务逻辑变化） */
.jumpcard{display:flex;align-items:center;gap:14px;padding:16px 18px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);cursor:pointer;transition:border-color var(--dur-fast) var(--ease),box-shadow var(--dur) var(--ease),transform var(--dur-fast) var(--ease)}
.jumpcard:hover{border-color:var(--border-2);box-shadow:var(--shadow),var(--glow-accent);transform:translateY(-2px)}
.jumpcard:active{transform:translateY(0) scale(.995)}
.jumpcard .jc-ico{font-size:20px}
.jumpcard .jc-main{flex:1;min-width:0}
.jumpcard .jc-t{font-size:15px;font-weight:700}
.jumpcard .jc-d{font-size:12px;color:var(--muted);margin-top:3px}
.jumpcard .jc-go{color:var(--accent);font-size:13px;font-weight:700;white-space:nowrap}

/* master-detail：持仓列表 + 详情（P2 使用的布局脚手架，业务待下轮接线） */
/* round-9 ISS-128：`1fr` = `minmax(auto,1fr)`，其 auto 下限取网格项的 min-content；
 * .detail-pane 的 min-content 被内部宽表撑到 785.8px ⇒ 1280/1440 下右栏整块超出 .content
 * （右边界 978/1138），被 .content{overflow-x:hidden} 硬裁 ⇒ 副标题「…仓位 99.0」无省略号地断掉。
 * 改成 minmax(0,1fr)（网格项最小宽度不再由内容决定）后，右栏宽 = 容器可用宽，
 * 副标题回到 ㉞-4 已声明的 nowrap+ellipsis 口径：超长时出现可见省略号，且不再溢出容器。 */
.md{display:grid;grid-template-columns:304px minmax(0,1fr);gap:16px;align-items:start}
@media(max-width:960px){.md{grid-template-columns:1fr}}
.list-pane{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:14px;box-shadow:var(--shadow-sm)}
.list-pane h4{font-size:13px;color:var(--muted);margin-bottom:10px;font-weight:600;letter-spacing:.04em}
.listrow{display:flex;align-items:center;gap:12px;padding:10px 12px;border-radius:8px;cursor:pointer;border-left:2px solid transparent;transition:background var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),transform var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}
.listrow:hover{background:var(--surface-2);transform:translateX(2px)}
.listrow:active{transform:scale(.99)}
.listrow.on{background:var(--accent-soft);border-left-color:var(--accent)}
.listrow .nm{font-weight:650;font-size:13.5px;color:var(--text)}
.listrow .cd{font-size:11px;color:var(--faint);margin-top:1px;font-family:var(--mono)}
.listrow .mm{margin-left:auto;text-align:right}
.listrow .mm .p{font-size:13px;font-weight:700;font-family:var(--mono)}
.listrow .mm .d{font-size:11px;font-family:var(--mono)}
.detail-pane{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:20px;box-shadow:var(--shadow);min-height:320px;animation:slideIn var(--dur) var(--ease)}
.detail-pane .dh{display:flex;align-items:center;gap:12px;margin-bottom:14px}
.detail-pane .dh .nm{font-size:17px;font-weight:700}
.detail-pane .dh .st{margin-left:auto;font-family:var(--mono);font-size:15px;font-weight:700}
.detail-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px}
.dtab{padding:5px 13px;border-radius:999px;font-size:12px;color:var(--muted);background:var(--surface-2);cursor:pointer;border:1px solid var(--border);transition:background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease)}
.dtab:hover{color:var(--text)}
.dtab.on{background:var(--accent-grad);color:#2a1f0d;font-weight:700;border-color:transparent}

/* 抽屉（右滑详情/个股档案共用；P2 接线） */
.drawer{position:fixed;top:0;right:0;bottom:0;width:min(620px,94vw);z-index:950;background:var(--surface);border-left:1px solid var(--border-2);box-shadow:-18px 0 46px rgba(92,70,30,.18);transform:translateX(102%);transition:transform .26s var(--ease);display:flex;flex-direction:column}
.drawer.open{transform:translateX(0)}
.drawer-head{display:flex;align-items:center;gap:10px;padding:14px 18px;border-bottom:1px solid var(--border);font-weight:700;font-size:15px;background:var(--surface-2)}
.drawer-head .dr-close{margin-left:auto;cursor:pointer;color:var(--faint);font-size:18px;line-height:1;padding:4px}
.drawer-head .dr-close:hover{color:var(--up)}
.drawer-body{flex:1;overflow-y:auto;padding:18px}
.drawer-mask{position:fixed;inset:0;background:rgba(44,32,17,.36);z-index:949;opacity:0;pointer-events:none;transition:opacity .22s var(--ease)}
.drawer-mask.open{opacity:1;pointer-events:auto}

/* ===== ⑪ 告警 / 资讯 / 日程 / 复盘中心 ===== */
.alert-item{display:flex;gap:8px;align-items:flex-start;padding:8px 10px;border:1px solid var(--border);border-radius:8px;margin-bottom:6px;font-size:13px;background:var(--surface-2)}
.alert-item:last-child{margin-bottom:0}
.alert-item .t{color:var(--faint);white-space:nowrap;font-family:var(--mono);font-size:11px}
.alert-item .msg{flex:1;min-width:0}
.alert-item.high{border-color:rgba(214,63,71,.32);background:var(--danger-bg)}
.alert-item.high .msg{color:var(--up)}
.stock-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}
.stock-tab{padding:4px 12px;border-radius:999px;cursor:pointer;font-size:12.5px;background:var(--surface-2);border:1px solid var(--border);color:var(--muted);transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),transform var(--dur-fast) var(--ease)}
.stock-tab:hover{color:var(--text);border-color:var(--border-2)}
.stock-tab:active{transform:scale(.96)}
.stock-tab.active{background:var(--accent-grad);color:#2a1f0d;font-weight:800;border-color:transparent;box-shadow:0 2px 8px rgba(185,130,42,.2)}
.news-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}
.news-tab{padding:4px 12px;border-radius:999px;cursor:pointer;font-size:12.5px;background:var(--surface-2);border:1px solid var(--border);color:var(--muted);transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),transform var(--dur-fast) var(--ease)}
.news-tab:hover{color:var(--text);border-color:var(--border-2)}
.news-tab:active{transform:scale(.96)}
.news-tab.active{background:var(--accent-grad);color:#2a1f0d;font-weight:800;border-color:transparent}
.news-list{display:flex;flex-direction:column;gap:6px;font-size:13px}
.news-item{display:flex;gap:8px;align-items:flex-start;padding:8px 10px;border-radius:8px;background:var(--surface-2);border:1px solid var(--border)}
.news-item .n-type{flex-shrink:0;font-size:11px;padding:1px 6px;border-radius:5px;font-weight:700}
.news-item .n-type.news{background:var(--accent-soft);color:var(--accent)}
.news-item .n-type.notice{background:rgba(60,110,170,.12);color:#3b6ea5}
.news-item .n-body{flex:1;min-width:0}
.news-item .n-title{color:var(--text);text-decoration:none;line-height:1.45;display:block}
.news-item .n-title:hover{color:var(--accent)}
.news-item .n-meta{color:var(--faint);font-size:11px;margin-top:2px}
.news-item .n-link{flex-shrink:0;color:var(--accent);text-decoration:none;font-size:12px;white-space:nowrap}
.news-item .n-link:hover{text-decoration:underline}
.news-item.key{border-color:var(--accent);background:var(--accent-soft)}
.news-item.key .n-title{color:var(--accent)}
.news-item.key .n-type{background:var(--accent);color:#fff}
.news-toggle{margin-top:8px;text-align:center;font-size:12px;color:var(--accent);cursor:pointer;padding:6px 10px;border:1px dashed var(--border-2);border-radius:8px;user-select:none}
.news-toggle:hover{background:var(--accent-soft);border-color:var(--accent)}

.briefing-box{background:var(--surface-2);border-left:3px solid var(--accent);padding:12px 14px;border-radius:8px;white-space:pre-wrap;font-size:13px;line-height:1.65;max-height:400px;overflow-y:auto}

.cal-filters{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px}
.cal-filter{padding:4px 12px;border-radius:999px;cursor:pointer;font-size:12px;background:var(--surface-2);border:1px solid var(--border);color:var(--muted);transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease),color var(--dur-fast) var(--ease),transform var(--dur-fast) var(--ease)}
.cal-filter:hover{color:var(--text);border-color:var(--border-2)}
.cal-filter:active{transform:scale(.96)}
.cal-filter.active{background:var(--accent-grad);color:#2a1f0d;font-weight:800;border-color:transparent}
.cal-day{display:flex;gap:10px;margin-bottom:8px}
.cal-day .cal-date{flex-shrink:0;width:82px;text-align:center;background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-lg);padding:6px 4px;align-self:flex-start}
.cal-day .cal-date .d1{font-size:15px;font-weight:800;font-family:var(--mono);color:var(--text)}
.cal-day .cal-date .d2{font-size:11px;color:var(--muted)}
.cal-day .cal-date.today{border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}
.cal-day .cal-date.past{opacity:.5}
.cal-events{flex:1;display:flex;flex-direction:column;gap:6px;min-width:0}
.cal-evt{display:flex;gap:8px;align-items:flex-start;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:8px 10px;font-size:13px}
.cal-evt .c-type{flex-shrink:0;font-size:11px;padding:1px 8px;border-radius:5px;font-weight:700;margin-top:1px}
.cal-evt .c-name{color:var(--text);text-decoration:none;font-weight:600}
.cal-evt .c-name:hover{color:var(--accent)}
.cal-evt .c-desc{color:var(--muted);font-size:11px;margin-top:2px}
.cal-evt.past{opacity:.5}
.cal-evt.sev-high{border-left:3px solid var(--up)}
.cal-evt.sev-mid{border-left:3px solid var(--accent)}
.cal-evt.sev-low{border-left:3px solid var(--border)}
.c-type.holding{background:rgba(60,110,170,.12);color:#3b6ea5}
.c-type.market{background:var(--accent-soft);color:var(--accent)}
.c-type.fed{background:var(--up-bg);color:var(--up)}
.c-type.cn{background:var(--down-bg);color:var(--down)}
.cal-empty{padding:30px;text-align:center;color:var(--faint)}

/* ===== ⑫ 指标 / 搜索 / 作战室 ===== */
.metric-row{display:flex;justify-content:space-between;border-bottom:1px dashed var(--border);padding:5px 0;font-size:13px}
.n-int{cursor:pointer;color:var(--accent)}
.n-int:hover{text-decoration:underline}
#ovBar .m-card{cursor:pointer}
#ovBar .m-card:hover{border-color:var(--accent);background:var(--surface-2)}
#searchDrop{position:absolute;top:44px;left:8px;right:8px;background:var(--surface);border:1px solid var(--border-2);border-radius:10px;z-index:60;max-height:280px;overflow-y:auto;box-shadow:var(--shadow-lg)}
#searchDrop .s-item{padding:7px 10px;cursor:pointer;font-size:13px;display:flex;justify-content:space-between;gap:8px}
#searchDrop .s-item:hover{background:var(--accent-soft);color:var(--accent)}

.wr-card .wr-cell{background:var(--surface-2);border:1px solid var(--border);border-radius:8px;padding:8px 10px}
.wr-card .wr-k{font-size:11px;color:var(--faint);margin-bottom:2px}
.wr-card .wr-v{font-weight:700;font-variant-numeric:tabular-nums;font-family:var(--mono);color:var(--text)}
.wr-card .tag{display:inline-block;background:var(--surface-2);border:1px solid var(--border);border-radius:6px;padding:1px 7px;margin:2px 4px 2px 0;font-size:11px;color:var(--text)}
.wr-state{display:inline-block;padding:2px 10px;border-radius:999px;font-size:12px;font-weight:800;line-height:1.4;font-family:var(--font);border:1px solid transparent}
.wr-reason{color:var(--muted);font-size:12px;line-height:1.65}

/* 图表：融入面板（去灰底边框；尺寸/内边距保持） */
.chart{width:100%;height:300px;background:transparent;overflow:hidden}
.chart.sm{height:240px}
#thChart{height:150px}

/* ===== ⑬ 移动端侧栏与底部导航 ===== */
@media(max-width:820px){
  #menuBtn{display:inline-flex}
  .sidebar{position:fixed;left:0;top:56px;bottom:0;z-index:900;box-shadow:4px 0 22px rgba(92,70,30,.18);transform:translateX(-105%);transition:transform .22s ease;width:252px;min-width:0;max-width:82vw;background:var(--surface)}
  .sidebar.open{transform:translateX(0)}
  body.nav-open .content{margin-left:0}
}
#mNav{display:none;position:fixed;left:0;right:0;bottom:0;z-index:800;background:var(--surface);border-top:1px solid var(--border);box-shadow:0 -6px 18px rgba(92,70,30,.08);padding:0 2px env(safe-area-inset-bottom)}
#mNav .mn-row{display:flex;max-width:520px;margin:0 auto}
.mn-item{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:9px 2px 8px;cursor:pointer;color:var(--muted);font-size:11px;letter-spacing:.05em;border-top:2px solid transparent;-webkit-tap-highlight-color:transparent;user-select:none;transition:color var(--dur-fast) var(--ease),border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease)}
.mn-item .mn-ic{font-size:15px;line-height:1}
.mn-item.active{color:var(--accent);font-weight:700;border-top-color:var(--accent)}
.mn-item .mn-t{white-space:nowrap;letter-spacing:.02em}
.mn-item:active{background:var(--accent-soft)}
@media(max-width:760px){
  #mNav{display:block}
  .content{padding-bottom:calc(58px + env(safe-area-inset-bottom))}
  body.nav-open #mNav{display:none}
}

/* 移动端打磨 */
@media(max-width:640px){
  header{flex-wrap:nowrap;gap:6px;padding:0 10px;min-height:54px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:none}
  header::-webkit-scrollbar{display:none}
  header > *{flex:0 0 auto}
  header .spacer{flex:1 1 8px;min-width:8px}
  .logo{font-size:15px}
  #schedTag,#extChip{display:none!important}
  #dashNav .btn{padding:4px 6px;font-size:11px}
  #aiToggle{font-size:11px}
  #genBtn,#refreshBtn{font-size:11px;padding:6px 8px}
  .btn{padding:7px 10px;font-size:12px}
  .date-label{min-width:80px;font-size:13px}
  .m-cards{grid-template-columns:repeat(2,1fr)!important;gap:8px}
  .panel,.pod{padding:12px 14px;margin-bottom:12px}
  .chart{height:240px}
  .chart.sm{height:200px}
  .briefing-box{font-size:12px;max-height:300px}
  table{font-size:12px}
  .news-item{flex-wrap:wrap}
  .grid3,.grid2{grid-template-columns:1fr!important}
  .cal-day{flex-direction:column}
  .cal-day .cal-date{width:100%;display:flex;justify-content:space-between;align-items:center;padding:4px 10px}
  .metric-row{font-size:12px}
  #view-dash{min-height:0}
  .side-nav .nav-item{padding:8px 9px;font-size:12px}
  .side-nav #moreToolsWrap .nav-item{padding-left:22px}
  .tab{padding:7px 12px}
  .side-item{padding:10px 8px}
  .mn-item{padding:9px 2px 8px}
  th,td{padding:6px 7px}
  .btn{min-height:32px}
  .stock-tab,.news-tab{min-height:30px;display:inline-flex;align-items:center}
  .cal-filter{min-height:30px;display:inline-flex;align-items:center}
  .side-nav .nav-item{min-height:36px}
  .panel h3,.pod h3{font-size:13px}
  input:not([type=checkbox]):not([type=radio]),select,textarea{font-size:16px!important}
  body{overflow-x:hidden}
  #userChip{flex-wrap:wrap;gap:4px;max-width:100%}
  #userChip .btn{white-space:nowrap;margin:1px 0}
  .m-card{padding:10px 12px}
  .kpi-strip{grid-template-columns:repeat(2,1fr);padding:12px;gap:8px;margin-top:12px}
  .kpi .v{font-size:20px}
  #ovBar .m-cards{gap:6px}
  #ovBar .m-card .v{font-size:14px}
  /* 移动端总览条压成单行横滑，把空间让给复盘报告（iframe 不再被挤成小条） */
  #ovBar .m-cards{display:flex;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;grid-template-columns:none}
  #ovBar .m-cards::-webkit-scrollbar{display:none}
  #ovBar .m-card{flex:0 0 120px;min-width:120px}
}

/* 移动端顶栏优先级：菜单+复盘日期导航优先可见；生成/刷新/开关/AI 依次，其余可横滑 */
@media(max-width:640px){
  header .spacer{display:none}
  #menuBtn{order:1}
  #dashNav{order:2}        /* 复盘视图下「前一天/后一天」无需横滑即可点 */
  #genBtn{order:3}
  #refreshBtn{order:4}
  .toggle{order:5}
  #userChip{order:6}
  #viewAsBar{order:6}
}

@media(max-width:420px){
  .logo{font-size:14px}
  header{gap:4px;padding:0 6px}
  #dashNav .btn{padding:3px 4px;font-size:11px}
  .date-label{min-width:58px;font-size:12px}
  #genBtn,#refreshBtn{font-size:11px;padding:5px 7px}
  .toggle{font-size:11px}
  #userChip{font-size:11px}
  .briefing-box{max-height:260px}
  .chart{height:210px}
}

/* ============================================================================
 * P2/P3（round-2）新增组件：个股档案抽屉化 / 持仓 master-detail / 研究漏斗 /
 * 复盘时间轴 / 系统页聚合 / 右侧情境栏 / 表格阶梯入场 / 移动端退化
 * 原则：全部为增量视觉/布局层；旧 id/onclick/路由/红涨绿跌语义不动。
 * ========================================================================== */

/* ===== ⑭ 个股档案 = 右滑抽屉（#view-stock 原位改造：保留旧 id/onclick） ===== */
#view-stock.ds-drawer{
  position:fixed;top:0;right:0;bottom:0;left:auto;width:min(780px,96vw);
  z-index:952;display:flex;flex-direction:column;padding:0;min-height:0;
  background:var(--surface);border-left:1px solid var(--border-2);
  box-shadow:-18px 0 46px rgba(92,70,30,.18);
  transform:translateX(102%);pointer-events:none;
  transition:transform .26s var(--ease);
}
#view-stock.ds-drawer.open{transform:translateX(0);pointer-events:auto}
.ds-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:12px 16px;background:var(--surface-2);border-bottom:1px solid var(--border)}
.ds-head .ds-close{font-weight:700}
.ds-head .stock-tabs{margin:0}
.ds-code{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-left:auto}
.ds-body{flex:1;min-height:0;overflow-y:auto;padding:16px 18px;background:var(--bg)}
#stMask{z-index:951}
@media(max-width:640px){
  #view-stock.ds-drawer{width:100vw;border-left:none;border-radius:14px 0 0 0}
  .ds-head{padding:10px 12px}
  .ds-code input#stCode{width:170px!important}
  .ds-body{padding:12px 12px 80px}
}

/* ===== ⑮ 持仓 master-detail（左列表 + 右详情，桌面双栏 / 移动端两页式） ===== */
.wr-md{margin:0 0 18px}
.wr-md .list-pane{max-height:640px;overflow-y:auto}
.wr-md .list-pane .lp-head{display:flex;align-items:center;gap:8px;margin:0 2px 8px;
  font-size:13px;font-weight:700;color:var(--text)}
.wr-md .list-pane .nav-mini{font-size:10.5px;color:var(--faint);font-weight:500;letter-spacing:0}
.wr-md .listrow .mm .d{color:var(--muted)}
.wr-md .listrow .dot{width:8px;height:8px;border-radius:50%;background:var(--border-2);flex-shrink:0}
.wr-md .listrow .dot.up{background:var(--up)}
.wr-md .listrow .dot.down{background:var(--down)}
.wr-md .listrow .dot.flat{background:var(--faint)}
.wr-md .detail-pane{max-height:none}
.detail-in{animation:slideIn var(--dur) var(--ease)}
.detail-in .k-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:12px}
.detail-in .k-cell{background:var(--surface-2);border:1px solid var(--border);border-radius:10px;padding:10px 12px}
.detail-in .k-cell .k-l{font-size:11px;color:var(--muted);font-weight:600}
.detail-in .k-cell .k-v{font-family:var(--mono);font-size:16px;font-weight:750;margin-top:3px;font-variant-numeric:tabular-nums}
/* P4a：详情抽屉内「个股完整卡」容器（内容与下方全文卡 wrDetailBlocksHtml 同源同款渲染） */
.detail-in .ds-card-full{background:var(--surface-2);border:1px solid var(--border);border-radius:10px;padding:2px 12px 10px;margin-top:8px}
.detail-in .ds-card-full > div{font-size:12px}
.detail-in .ds-card-full .tag{font-size:11px}
.detail-in .ds-card-full .btn{padding:2px 12px;font-size:12px}
.ds-back{display:none}
@media(max-width:960px){
  /* master-detail 移动端退化：列表 ↔ 详情两页式，带返回箭头 */
  #wrListPane,#wrDetailPane{display:block}
  #view-warroom.wr-detail #wrListPane{display:none}
  #view-warroom.wr-list #wrDetailPane{display:none}
  .ds-back{display:inline-flex}
  .wr-md .list-pane{max-height:none}
}

/* ===== ⑯ 研究漏斗（①选股→②档案→③回测） ===== */
.scr-funnel{display:flex;align-items:stretch;gap:4px;margin:0 0 14px;padding:9px 12px;
  background:linear-gradient(180deg,var(--surface),var(--surface-2));
  border:1px solid var(--border);border-radius:12px;box-shadow:var(--shadow-sm)}
.sf-step{flex:1;display:flex;align-items:center;gap:7px;min-width:0;
  padding:6px 8px;border-radius:8px;border:1px dashed transparent;transition:border-color var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease)}
.sf-step.on{background:var(--accent-soft);border-color:rgba(185,130,42,.5)}
.sf-step.done{opacity:.85}
.sf-i{width:20px;height:20px;border-radius:50%;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;
  background:var(--surface-3);color:var(--muted);font-family:var(--mono);font-size:11px;font-weight:800}
.sf-step.on .sf-i{background:var(--accent-grad);color:#2a1f0d}
.sf-step.done .sf-i{background:var(--down);color:#fff}
.sf-t{font-size:13px;font-weight:700;color:var(--text);white-space:nowrap}
.sf-step .tag{font-size:10.5px;margin:0;padding:0 6px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:none}
.sf-step.on .tag{display:inline-block}
.sf-arr{color:var(--faint);align-self:center;font-size:13px}
@media(max-width:820px){
  .sf-t{font-size:12px}
  .sf-step .tag{display:none!important}
  .sf-arr{display:none}
}

/* ===== ⑰ 复盘时间轴（侧栏历史日期 = 纵向时间轴；节点=红涨/绿亏/金=有报告） ===== */
#dateList{position:relative;margin:2px 6px 6px 18px;padding-left:12px;border-left:1.5px solid var(--border)}
#dateList .side-item{position:relative;padding-left:2px}
#dateList .side-item .dot{position:absolute;left:-22px;top:13px;width:9px;height:9px;margin:0;
  border-radius:50%;background:var(--surface);border:2px solid var(--border-2);box-sizing:border-box}
#dateList .side-item.active .dot{border-color:var(--accent);background:var(--accent);
  box-shadow:0 0 0 3px var(--accent-soft)}
#dateList .side-item .dot.no{border-color:var(--border);background:var(--border)}
#dateList .side-item .dot.pnl-up{border-color:var(--up);background:var(--up)}
#dateList .side-item .dot.pnl-down{border-color:var(--down);background:var(--down)}
#dateList .side-item.active .dot.pnl-up{border-color:var(--up);background:var(--up)}
#dateList .side-item.active .dot.pnl-down{border-color:var(--down);background:var(--down)}
#dateList .side-item .dp{font-size:10px;font-family:var(--mono);margin-left:2px;opacity:.85;display:inline-block;white-space:nowrap}
#dateList .side-item{white-space:nowrap}
#dateList .side-item .wday{margin-left:auto}

/* ===== ⑱ 右侧情境栏（告警 / 日程摘要 / 问AI；≥1200px 常驻，窄屏收起底部抽屉） ===== */
#ctxRail{width:302px;min-width:302px;display:flex;flex-direction:column;gap:12px;
  height:100%;background:var(--surface);border-left:1px solid var(--border);
  padding:12px 12px 16px;overflow-y:auto;overflow-x:hidden}
.ctx-sec{background:var(--surface-2);border:1px solid var(--border);border-radius:12px;
  display:flex;flex-direction:column;min-height:0;box-shadow:var(--shadow-sm)}
.ctx-h{display:flex;align-items:center;gap:6px;padding:9px 12px;border-bottom:1px solid var(--border);
  font-size:12.5px;font-weight:700;color:var(--text);flex-wrap:wrap}
.ctx-ic{font-size:13px}
.ctx-badge{margin-left:auto;font-family:var(--mono);font-size:11px;background:var(--up);color:#fff;
  border-radius:999px;padding:0 8px;font-weight:800}
.ctx-badge.zero{background:var(--surface-3);color:var(--muted)}
.ctx-go{margin-left:auto;font-size:11px;color:var(--accent);cursor:pointer;font-weight:600}
.ctx-go:hover{text-decoration:underline}
.ctx-body{padding:8px 10px;overflow-y:auto;max-height:230px;font-size:12.5px}
.ctx-body .alert-item{margin-bottom:5px}
.ctx-body .alert-item:last-child{margin-bottom:0}
.ctx-empty{color:var(--faint);font-size:12px;padding:10px 4px;text-align:center;line-height:1.7}
.ctx-cal{display:flex;gap:6px;align-items:baseline;padding:4px 2px;border-bottom:1px dashed var(--border)}
.ctx-cal:last-child{border-bottom:none}
.ctx-cal .cd{flex-shrink:0;font-family:var(--mono);font-size:11px;color:var(--muted);min-width:76px}
.ctx-cal .ct{font-weight:600;font-size:12px;flex-shrink:0}
.ctx-cal .cn{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.ctx-cal .cn a{color:var(--accent)}
.ctx-chat{flex:1;min-height:230px}
.ctx-chat #chatBox{flex:1}
@media(min-width:1200px){
  body.ctx-closed #ctxRail{display:none}
}
@media(max-width:1199px){
  /* 窄屏情境栏并入底部抽屉：头部加小开关按钮（仅小屏显示） */
  #ctxRail{position:fixed;left:0;right:0;bottom:0;top:auto;width:100%;min-width:0;height:auto;
    max-height:72vh;z-index:840;flex-direction:column;gap:10px;padding:12px 12px 70px;
    background:var(--surface);border-left:none;border-top:1px solid var(--border-2);
    border-radius:16px 16px 0 0;box-shadow:0 -12px 34px rgba(92,70,30,.22);
    transform:translateY(104%);transition:transform .26s var(--ease);overflow-y:auto}
  body.ctx-open #ctxRail{transform:translateY(0)}
  .ctx-sec{flex:none;max-height:38vh}
  #ctxRail .ctx-chat{max-height:44vh}
  #ctxRailBtn{display:inline-flex!important}
  .ctx-body{max-height:120px}
  #ctxRail .ctx-body{max-height:150px}
}
#ctxRailBtn{display:none}

/* ===== ⑲ 表格行 30ms 阶梯入场（fadeIn + 轻微下移；reduced-motion 自动关闭） ===== */
@keyframes rowIn{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:translateY(0)}}
tr.rowin td{animation:rowIn .32s var(--ease) both}
@media (prefers-reduced-motion: reduce){
  tr.rowin td{animation:none!important}
}

/* ===== ⑳ 今日指挥台 §2-§4 数据 pod / §4 报告预览 ===== */
#todayPlanPanel h3,#todayValidPanel h3{display:flex;align-items:center;gap:8px}
#todayPlanPanel h3 .btn,#todayValidPanel h3 .btn{float:none;margin-left:auto}
.pod h3 .btn{vertical-align:middle}
#mktReviewFrameWrap{position:relative}
.plan-mini{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px dashed var(--border);font-size:12.5px}
.plan-mini:last-child{border-bottom:none}
.plan-mini .pd{font-family:var(--mono);color:var(--faint);min-width:38px;flex-shrink:0}
.plan-mini .pd.buy{color:var(--up)}
.plan-mini .pd.sell{color:var(--down)}
.plan-mini .nm{font-weight:650;min-width:78px}
.plan-mini .pc{min-width:56px;text-align:right;font-family:var(--mono)}
.plan-mini .tg{flex-shrink:0;font-family:var(--mono);font-size:11px}
.plan-mini .why{color:var(--muted);font-size:11.5px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
@media(max-width:760px){
  .plan-mini{flex-wrap:wrap}
  /* round-1 mobile：窄屏把「理由」从单行省略号改为整行折行显示 —— 原 nowrap+ellipsis 在 390 下
     实测裁掉 254/168px 且不可滚、不可展开（信息静默丢失），换行后完整可读（仅移动断点）。 */
  .plan-mini .why{flex-basis:100%;white-space:normal;overflow:visible;text-overflow:clip}
}

/* ===== ㉑ 复盘摘要卡带 ===== */
#recapPanel{border-left:3px solid var(--accent)}
#recapPanel h3::before{content:"";width:3px;height:14px;background:var(--accent-grad);border-radius:2px;margin-right:8px;vertical-align:-2px;display:inline-block}

/* ===== ㉒ 系统页聚合面板 ===== */
#sysSections .sec{margin-top:20px}
.sys-panel-row{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start}
@media(max-width:960px){.sys-panel-row{grid-template-columns:1fr}}
.sys-mini{display:flex;gap:6px;justify-content:space-between;border-bottom:1px dashed var(--border);padding:4px 0;font-size:12.5px}
.sys-mini:last-child{border-bottom:none}
.sys-empty{color:var(--faint);font-size:12px;padding:8px 0}

/* ===== P3 情境栏补充（顶部收起条 / 顶栏开关按钮） ===== */
.ctx-top{display:none;align-items:center;justify-content:center;gap:6px;padding:7px 10px;cursor:pointer;
  color:var(--accent);font-size:12px;font-weight:700;background:var(--surface-2);
  border:1px solid var(--border);border-radius:999px;margin-bottom:2px}
.ctx-top:hover{background:var(--accent-soft);border-color:var(--accent)}
@media(max-width:1199px){
  .ctx-top{display:flex}
  #ctxRail .ctx-top{position:sticky;top:0;z-index:2}
}
@media(min-width:1200px){
  #ctxRailBtn{display:none!important}
}
/* 桌面 <1200 时情境栏整体由 transform 收起，chat 等不再挤占主区 */
@media(max-width:1199px){
  #ctxRail{pointer-events:none}
  body.ctx-open #ctxRail{pointer-events:auto}
}

/* ===== ㉓ 今日指挥台 KPI 条移动端横滑（沿用 ovBar 横滑方案；reduced 不影响布局） ===== */
@media(max-width:820px){
  .kpi-strip{display:flex;flex-wrap:nowrap;overflow-x:auto;gap:10px;padding:12px 14px;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;grid-template-columns:none}
  .kpi-strip::-webkit-scrollbar{display:none}
  .kpi-strip .kpi{flex:0 0 150px;min-width:150px}
}
/* ===== ㉔ 复盘视图：右主区 recap 面板定位（摘要卡带在 iframe 下方，卡片化边距一致） ===== */
#view-dash #recapPanel{box-shadow:var(--shadow-sm)}
@media(max-width:640px){
  #ctxRailBtn{padding:6px 8px;font-size:11px}
}

/* ============================================================================
 * ㉕ 视觉收口（克制 · 专业 · 可信）——统一追加层（可整体裁剪/回退）
 * 原则：红=上涨/盈利/明确风险警报、绿=下跌/亏损；金=当前选择/主按钮/核心重点；
 *       橙(延迟/需留意)、灰(缺失/不可用/辅助)。金色不用于普通边框/标题竖线/卡片。
 * ========================================================================== */
:root{
  --delay:#b36a12;                  /* 数据延迟/降级/需留意 */
  --delay-bg:rgba(179,106,18,.12);
  --rule:rgba(40,31,19,.24);        /* 中性标题竖线/细分隔线（不共用金色） */
}

/* —— 移除大面积装饰性渐变/发光/线性强调（保留白底微暖 + 轻阴影） —— */
.content{background:var(--bg)}
header{box-shadow:0 1px 3px rgba(92,70,30,.05)}
header::after{display:none}
.kpi-strip{background:rgba(255,255,255,.93);box-shadow:0 1px 6px rgba(92,70,30,.08)}
.kpi-strip::before{display:none}
h1.heading .gld{background:none;-webkit-background-clip:initial;background-clip:initial;-webkit-text-fill-color:currentColor;color:var(--accent)}
.logo::before{background:var(--accent);width:3px}
.panel,.pod{border-radius:12px;box-shadow:0 1px 2px rgba(92,70,30,.05);padding:16px 18px}
/* 标题竖线中性化：不再用金 */
.panel h3::before,.pod h3::before,.section-title::before,.sec-h::before{background:var(--rule);width:2px;height:13px}
#recapPanel h3::before{background:var(--rule);width:2px}
/* 首屏盈亏卡：以温和状态条强调，不发光、不渐变竖条 */
#pnlPanel{background:var(--surface);border-color:var(--border);border-top:2px solid rgba(185,130,42,.55);border-left:1px solid var(--border)}
#pnlPanel::after{display:none}
#pnlPanel .m-card{background:var(--surface-2);border-color:var(--border)}
/* 金只保留在：主按钮 / 当前选中态 / 关键数字（数值着色由 JS 的 up/down 语义驱动） */
.btn.primary{background:var(--accent);background-image:none;border-color:transparent;box-shadow:0 1px 4px rgba(185,130,42,.28)}
.btn.primary:hover{background:var(--accent);filter:brightness(1.07);box-shadow:0 2px 8px rgba(185,130,42,.3)}
.tab.active,.stock-tab.active,.news-tab.active,.cal-filter.active,.dtab.on{background:var(--accent);background-image:none;box-shadow:none}
/* hover 降噪：去抬升/去辉光，只换边框/底色 */
.m-card,.jumpcard{box-shadow:none}
.m-card:hover,.jumpcard:hover{border-color:var(--border-2);background:var(--surface);box-shadow:none;transform:none}
.m-card:active,.jumpcard:active{transform:none}
.listrow{border-left:none}
.listrow.on{border-left-color:var(--accent)}
.detail-pane{box-shadow:0 1px 8px rgba(92,70,30,.08)}
/* 次级面板左粗边 → 顶部状态标签/浅底表达（briefing-box/面板收口） */
.briefing-box{border-left:2px solid var(--rule)}
.alert-item.high{border-left:3px solid var(--up)}
/* 日历严重度：红=高风险；中=需留意（延迟橙），不挪用主金 */
.cal-evt.sev-mid{border-left-color:var(--delay)}
/* 状态语义变量帮助后续 JS 复用（不直接改红绿语义） */
.ds-delay{color:var(--delay)}.ds-muted{color:var(--muted)}

/* ===== ㉖ 持仓列表/详情上下文操作样式（shell.js 渲染） ===== */
.wr-md .listrow .cd .st-lbl{margin-left:5px;font-size:10px;color:var(--muted);background:var(--surface-3);border-radius:4px;padding:0 6px;font-weight:600;white-space:nowrap}
.wr-md .listrow .d{color:var(--muted);white-space:nowrap}
.wr-md .listrow .chg.up{color:var(--up);font-family:var(--mono)}
.wr-md .listrow .chg.down{color:var(--down);font-family:var(--mono)}
.wr-md .listrow .wt{color:var(--faint);font-family:var(--mono);margin-left:3px}
.dh-links a{color:var(--accent);font-weight:600;text-decoration:none}
.dh-links a:hover{text-decoration:underline;color:var(--accent)}
@media(max-width:640px){
  .risk-row{flex-wrap:wrap;padding:8px 10px}
  .risk-row .rg{display:none}
  .risk-row .rm{white-space:normal}
  .dh-actions{margin-left:0!important}
}

/* ===== ㉗ 计划中心：状态标签（文字为主 + 辅助底色，不只用颜色）与待办高亮 ===== */
.pl-st{display:inline-block;padding:1px 9px;border-radius:999px;font-size:11px;font-weight:600;line-height:1.7;border:1px solid var(--border);background:var(--surface-3);color:var(--text);white-space:nowrap}
.pl-st.st-dim{opacity:.68}
.pl-st.st-hot{background:rgba(185,130,42,.16);border-color:rgba(185,130,42,.55);color:#8a6a26;font-weight:800}
.stock-tab.pl-hot{background:rgba(185,130,42,.15);border-color:rgba(185,130,42,.5);color:#8a6a26;font-weight:700}
.stock-tab.pl-hot.active{background:var(--accent);border-color:transparent;color:#fff}
#plStateTable tr.pl-row.hot td{background:rgba(185,130,42,.07)}
#plStateTable tr.pl-row.hot td:first-child{border-left:3px solid var(--accent)}
@media(max-width:640px){.pl-st{font-size:10.5px;padding:0 7px}}

/* ===== ㉘ 复盘视图：结构化摘要置顶 + 报告卡（移动端抽屉/弹层底部避让导航） ===== */
#view-dash #recapPanel{max-height:min(46vh,380px)}
.report-wrap{background:var(--surface);border:1px solid var(--border);border-radius:12px;overflow:hidden;box-shadow:0 1px 2px rgba(92,70,30,.05)}
.report-wrap iframe{display:block}
@media(max-width:640px){
  .report-wrap{margin-left:10px!important;margin-right:10px!important;border-radius:10px}
  #view-dash #recapPanel{margin-left:10px!important;margin-right:10px!important}
}
@media(max-width:820px){
  #plExecModal>div,#wlDraftModal>div,#cmpModal>div,#batchModal>div{padding-bottom:calc(16px + env(safe-area-inset-bottom))}
}

/* ===== ㉙ 持仓首屏指标层级（今日盈亏唯一主数字） ===== */
.pnl-hero{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:28px;align-items:center;margin:4px 0 12px}
.ph-cell{display:flex;flex-direction:column;gap:2px}
.ph-l{font-size:11.5px;color:var(--muted);font-weight:600;letter-spacing:.04em}
.ph-v{font-family:var(--mono);font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.ph-main .ph-v{font-size:33px;font-weight:800;line-height:1.15}
.pnl-hero .ph-cell:not(.ph-main) .ph-v{font-size:23px;font-weight:750;line-height:1.2}
.pnl-sub{display:flex;flex-wrap:wrap;gap:4px 22px;border-top:1px dashed var(--border);padding-top:10px;font-size:12px;color:var(--muted);align-items:baseline}
.pnl-sub b{font-family:var(--mono);font-size:14px;color:var(--text);margin-left:4px;font-variant-numeric:tabular-nums}
.pnl-contr{margin-top:14px}
.pnl-contr > div{background:var(--surface-2);border:1px solid var(--border);border-radius:10px;padding:9px 12px;min-width:0}
.pnl-col-t{font-size:12px;margin-bottom:5px;font-weight:700;letter-spacing:.02em}
.pnl-col-t.up{color:var(--up)}
.pnl-col-t.down{color:var(--down)}
.pnl-col-t.risk{color:var(--up)}
@media(max-width:640px){
  .pnl-hero{grid-template-columns:1fr 1fr;gap:12px}
  .ph-main .ph-v{font-size:28px}
  .pnl-hero .ph-cell:not(.ph-main) .ph-v{font-size:20px}
  .pnl-sub{gap:4px 14px}
}

/* ===== ㉚ 移动/宽表通用兜底：复盘摘要等窄容器内表格可横滚不裁切 ===== */
#recapBox{overflow-x:auto}
@media(max-width:760px){
  .content table{max-width:100%}
  #recapBox table{min-width:560px}
}

/* ===== ㉛ 移动端情境栏底部抽屉让出底部导航（不遮挡 5 项主操作） =====
 * round-9 ISS-127（严重回归）在此段收口两处：
 *  ① 让位量 54px → 57px。54 是 round-1 的估算值；实测 #mNav 高 56.8px
 *     （= nav 上边框 1 + .mn-item 55.8，390×844 / Chromium；见 docs/round9_20260915.md §一），
 *     差 2.8px ⇒ 抽屉底边原本会压住导航顶边（展开态同样多压 2.8px，一并收口）。
 *  ② 折叠态不再用 translateY(calc(100% - 58px))（㉞-3 的原修法）。该式只把抽屉相对
 *     **自身底边**上移 58px，叠加 ① 的 bottom 后实际露出 58+54=112px（实测抽屉上沿 y=732，
 *     视口底 844），而 #mNav 顶边在 y=787.2、z-index 仅 800（< 抽屉 840）⇒ 导航 5 项被整块盖住。
 *     改为**盒高收放**：折叠态 max-height:58px（= 上内边距 12 + 把手 44 + 2 余量）+ transform:none
 *     ⇒ 抽屉底边 = 视口底 − 57px = 导航顶边，可见带恰好 58px，与导航重叠 0px。
 *     border-box 下 58 − 1(上边框) − 12(上内边距) = 45 ≥ 把手 44，故 padding-bottom 同时归零
 *     （否则 58 − 1 − 12 − 70 < 0，把手会被 overflow:hidden 裁掉）。
 *     max-height 参与过渡 ⇒ 开合仍是 0.26s 的收放动效（底部贴住导航，视觉上是「贴边滑出/滑回」）。 */
@media(max-width:760px){
  #ctxRail{bottom:calc(57px + env(safe-area-inset-bottom));
    transition:transform .26s var(--ease),max-height .26s var(--ease)}
  #ctxRail .ctx-top{position:static}
  body:not(.ctx-open) #ctxRail{max-height:58px;padding-bottom:0;transform:none;overflow:hidden}
}
@media(min-width:761px) and (max-width:1199px){
  #ctxRail{bottom:0}
}

/* ===== ㉜ round-5：重复内联样式收口为语义类（等值迁移，视觉与红涨绿跌语义不变） ===== */
/* 研究流程分段 chip：原散落 index.html 内联 + setResearchFlow 运行时写内联，现统一由类承载 */
.sf-chip{padding:4px 12px;border-radius:999px;cursor:pointer;font-size:12.5px;line-height:1.5;font-family:inherit;
  background:var(--surface-2);border:1px solid var(--border);color:var(--muted)}
.sf-chip.on{background:var(--accent-grad);border-color:transparent;color:#2a1f0d;font-weight:800}
/* 转计划弹窗族（plExecModal / wlDraftModal）：遮罩/卡片/关闭/表单/按钮排布 */
.modal-mask{display:none;position:fixed;inset:0;z-index:1001;background:rgba(46,33,18,.45);align-items:center;justify-content:center}
.modal-card{max-width:460px;width:92%;padding:22px;background:var(--card);border:1px solid var(--border);border-radius:14px;position:relative}

/* round-6 item6b：把 login/recover/bindMail/pwd/hmPanel/cmp/batch 七个弹窗原本**内联**的遮罩/卡片样式
 * 等值迁移到上面的 .modal-mask/.modal-card 家族。差异（z-index / 遮罩深浅 / 尺寸 / 内边距 / 对齐）
 * 全部用修饰类承载，取值逐字等于迁移前的内联值；计算样式 before/after 零差异的实测证据见
 * docs/ui_round6_modal_style_probe.py 与 docs/ui_round6_modal_styles_{before,after}.json。 */
.modal-mask.z1000{z-index:1000}
.modal-mask.z1002{z-index:1002}
.modal-mask.z1003{z-index:1003}
.modal-mask.z1004{z-index:1004}
.modal-mask.z1005{z-index:1005}
.modal-mask.dim{background:rgba(46,33,18,.55)}
.modal-mask.pad{padding:14px;box-sizing:border-box}
.modal-card.c340c{max-width:340px;width:90%;padding:30px;text-align:center}
.modal-card.c340{max-width:340px;width:90%;padding:26px}
.modal-card.c360{max-width:360px;width:90%;padding:28px;text-align:center;position:static}
.modal-card.c760{max-width:760px;width:94%;max-height:82vh;overflow:auto}
.modal-card.c640{max-width:640px;width:94%;max-height:84vh;overflow:auto}
/* #hmPanel 自带 .panel 语义（padding 16/18、radius 12 与 .modal-card 默认不同）→ 逐项 pin 成等值 */
.modal-card.hmPanel{max-width:820px;width:96%;max-height:86vh;overflow-y:auto;margin:0;box-sizing:border-box;border-radius:12px;padding:16px 18px}
.modal-x{position:absolute;top:10px;right:14px;cursor:pointer;color:var(--muted);font-size:18px}
.modal-h{font-size:16px;font-weight:700;margin-bottom:4px}
.modal-cap{color:var(--muted);font-size:12px;margin-bottom:12px}
.modal-form{display:flex;flex-direction:column;gap:10px}
.modal-lab{font-size:12px;color:var(--muted)}
.modal-in{margin-top:4px;width:100%;box-sizing:border-box;background:var(--bg2);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:8px 10px;font-size:13px}
.modal-foot{display:flex;gap:8px;margin-top:14px;justify-content:flex-end}

/* ============================================================================
 * ㉞ round-7 遗留缺陷修复层（ISS-119 / 120 / 122 / 124 / 125）
 *
 * 位置与优先级：本层**紧接在 ㉝ 层之前**（不是文件末尾）——㉝ 层的静态契约测试
 *       （tests/test_mobile_optimization.py）从「㉝ round-1」标记切到文件末尾，若放在末尾会被
 *       误当作 ㉝ 层规则而误报（M9「㉝ 层规则必须都在媒体查询内」/M12「㉝ 层不得残留 ≤760 块」）。
 *       对本层要覆盖的既有规则：同特异性者靠**文件顺序**（本层写在它们之后）胜出；
 *       对 ㉝ 层内唯一需要覆盖的 ㉝-6 卡片规则，靠**选择器特异性**（多 2~3 个 :not()/:has()）胜出，
 *       因此位置在 ㉝ 之前不影响最终级联结果。
 * 范围：㉞-1/㉞-2 在 ≤820（与 ㉝-2 触控层同断点），㉞-3 在 ≤1199（情境栏为「抽屉」的全部
 *       档位，另给 761–1199 的 .content 补底部内边距），
 *       ㉞-4/㉞-5 为**全宽度**规则（修的是桌面 1280/1440 与卡片化后的可观感问题）。
 * 与 ㉝ 层的关系：**不改动 ㉝ 层任何一条既有规则**（移动端 44px 触控 / 390 卡片化 /
 *       弹层避让的既有结论全部保留）；本层只做「追加 + 定向覆盖」。
 * 回滚：删除本节整段即可（ISS-116 另在 fupan/web/static/centers/research.js 表头一行；
 *       ISS-122 的把手可点语义另在 fupan/web/static/shell.js 的 _ctxClose.onclick）。
 * ========================================================================== */

/* ===== ㉞-1 ISS-119：侧栏 top 跟随顶栏**实际高度**（选项 A，纯布局实现，无 JS/无魔法数） =====
 * 缺陷：641–820 顶栏走基线 flex-wrap 折行（768 实测 offsetHeight 153/207px），390 也已达 99px，
 *       而 .sidebar{top:56px} 是固定值 ⇒ 打开侧栏时覆盖顶栏 97–151px（390 错位 43px）。
 * 选 A 的理由（对比 B「让该区间顶栏不折行」）：
 *   ① 治本且与断点无关——顶栏高度此后无论因折行、字体、触控目标（㉝-2 曾把 768 折行高度
 *      再加 +37/+49px）还是设计内横滑而变化，侧栏都自动贴合，不会再次错位；
 *   ② B 只覆盖 641–820，**390 的 43px 错位仍在**（要么「只改一半」，要么把 390 的横滑方案
 *      上推并重定 390 顶栏，等于改动已验收的 round-1/边界轮结论）；
 *   ③ 本实现不需要 JS 写入 CSS 变量 / ResizeObserver，没有「首帧未写入 → 闪一下」的时序竞态。
 * 实现：.main{position:relative} 且 .main 在文档流中**正好从顶栏（及其后的 #statusBar）下沿开始**，
 *       故把侧栏改成相对 .main 的绝对定位后，top:0 / bottom:0 天然等于「顶栏下沿 → 视口底部」，
 *       与顶栏实际高度严格一致。离开 ≤820 断点时侧栏回到文档流（原静态定位），不受影响。 */
@media(max-width:820px){
  .sidebar{position:absolute;left:0;top:0;bottom:0}
}

/* ===== ㉞-2 ISS-120：#aiToggle / #hmRecordTrade 的 label 热区抬到 44px（严格对齐 §0.3 E2） =====
 * 背景：round-1 依据「wrapped-checkbox-with-label」把这两个勾选项判为豁免，但
 *       docs/mobile_checklist.md §0.3 **E2 的通过口径是「改判 label 的 rect，label ≥44px」**；
 *       实测包裹 <label> 仅 53.5×17.8（390）/ 59.1×21（768），#hmRecordTrade 的 label 151×19.4。
 * 处置：把 label 本体（真正的点按区域）抬到 44px，而不是把 15px 的 input 撑大（视觉不变、
 *       热区达标）。顶栏高度的代价已实测：见 docs/round7_20260915.md §ISS-120（before→after）。
 * 覆盖范围：#aiToggle 的 label.toggle、#hmRecordTrade 所在弹窗内的匿名 label（两条都是
 *       checkbox + 文字 的「wrapped checkbox」，与 .toggle 同类）。 */
@media(max-width:820px){
  label.toggle,
  #hmPanel label:has(> input[type=checkbox]){min-height:44px}
}

/* ===== ㉞-3 ISS-122：折叠态把手上移，标签**始终可见**（不推翻 44px 触控结论） =====
 * 缺陷：round-1 加大底部内边距后，390 底部「情境栏 · 收起」把手在折叠态被推出视口
 *       （before 半可见 → after 文字完全不可见）。
 * 根因（实测推演）：折叠态用 transform:translateY(104%) —— **104% 是抽屉自身高度的百分比**，
 *       抽屉越高移得越多；㉝-2 把 .ctx-top 抬到 min-height:44px 后抽屉变高、把手随之更低，
 *       于是本来「半可见」变成「完全看不见」。
 * 修法（二选一取「标签始终可见」）：改为 translateY(calc(100% - 58px))，即**恒定**留出
 *       58px = 顶部内边距 12 + 把手 44（㉝-2 的 min-height）+ 间距 2 的可见带。
 *       该式只与「把手高度」有关，与抽屉总高无关 ⇒ 抽屉再变高也不会把把手挤出去。
 *       （旧式 104% 与抽屉总高成正比：抽屉越高，把手越低——这正是缺陷的机制。）
 * 适用范围 ≤1199（= 情境栏为「抽屉」的全部档位，含 390/768/1024）：
 *       ISS-123 的判据是「折叠把手下沿 + 标签 rect 是否落在视口内」，若只在 ≤760 生效，
 *       768/1024 仍会判不通过（那里没有底部导航，而把手被整体推出视口）。为了让判据在所有
 *       抽屉档位成立，本修法覆盖整个 ≤1199；同时给 761–1199 的 .content 补 58px 底部内边距，
 *       避免常显把手压住正文最后一行（≤760 的 .content 底部内边距已含 58px，无需重复）。
 * 44px 触控不受影响：.ctx-top 仍命中 ㉝-2 的 min-height:44px，且折叠态可见带正好整块是把手。
 * 可达性：折叠态 #ctxRail 是 pointer-events:none，故单独把把手恢复为可点（否则成了
 *       「看得见点不动」的误导可供性），并在 shell.js 让它 toggle 展开/收起。
 * 不外泄内容：折叠态加 overflow:hidden —— 可见带只有 58px，若把手不足 58px（821–1199 档
 *       未命中 ㉝-2，把手约 35px），剩余几像素必须保证露出的是空白而不是抽屉里的正文。
 *
 * ⚠ round-9 ISS-127 补充（不改本段行为）：≤760 档另有 ㉛ 段的 bottom:57px 导航让位量，
 *   两者叠加会把可见带变成 58+57≈115px（round-7 实测抽屉上沿 y=732，整块盖住 #mNav）。
 *   故 ㉛ 段用 `body:not(.ctx-open) #ctxRail{max-height:58px;transform:none}` **按特异性**覆盖
 *   本段的 transform —— ㉛ 段虽在文件更早位置，但 `body:not(.ctx-open) #ctxRail` 特异性 (1,1,1)
 *   高于本段 `#ctxRail` 的 (1,0,0)。761–1199 档（无底部导航）行为逐字不变。 */
@media(max-width:1199px){
  #ctxRail{transform:translateY(calc(100% - 58px))}
  body:not(.ctx-open) #ctxRail{overflow:hidden}
  body:not(.ctx-open) #ctxRail .ctx-top{pointer-events:auto;margin-bottom:0}
}
@media(min-width:761px) and (max-width:1199px){
  .content{padding-bottom:58px}
}

/* ===== ㉞-4 ISS-124：桌面 1280/1440 布局挤压（标题竖排 / 股票名折行） =====
 * ① wr「组合总览」标题：.detail-pane .dh 是 flex，标题(.nm)无 nowrap 且可被压缩 ⇒ 1280 下被
 *    右侧副标题(.st, nowrap 数字)挤成竖排「组/合/总/览」。修：标题不折行且不参与压缩，
 *    把可压缩权交给副标题（超长时省略号截断，数字仍右对齐；1440 下无截断）。
 * ②「持仓列表」股票名：.listrow 是 flex，名称包裹层带内联 min-width:0 ⇒ 右块(.mm 现价/涨跌/
 *    权重，其中 .d 是 nowrap)放不下时挤压名称 → 「贵州茅台」折成两行。修：名称/代码恒单行，
 *    放不下时让右侧整块换行（flex-wrap），既不折字也不横向溢出。 */
.detail-pane .dh .nm{white-space:nowrap;flex:0 0 auto}
.detail-pane .dh .st{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wr-md .listrow{flex-wrap:wrap}
.wr-md .listrow .nm,.wr-md .listrow .cd{white-space:nowrap}

/* ===== ㉞-5 ISS-125①：卡片化后的 colspan 空态消息「去按钮化」（仅 ≤640） =====
 * 现象：market@390 卡片化后，「确认链计算中…」「全市场情绪：防守（普跌/冰点）」这类整行
 *       colspan 消息被 ㉝-6 的卡片规则套上了「细边框 + 圆角 + 浅底」⇒ 看起来像可点按钮。
 * 修法：只针对「整行没有任何带 data-th 的单元格、且含 colspan 单元格」的行（= 纯说明行，
 *       不是数据行，也不是带控件的操作行），去掉边框/底色/圆角，改为弱化的说明样式
 *       （左对齐、更暗的灰、更紧的内边距）。有标签的数据行与含按钮的行不受影响。 */
@media(max-width:640px){
  table.tbl-labeled tr:not(.tbl-hd):not(:has(td[data-th])):has(td[colspan]){
    border:0;background:transparent;border-radius:0;padding:6px 2px;margin:0 0 4px}
  table.tbl-labeled tr:not(.tbl-hd):not(:has(td[data-th])):has(td[colspan]) td{
    padding:2px 0;font-size:12.5px;color:var(--faint)}
}

/* ============================================================================
 * ㊱ round-10 遗留缺陷收口层（ISS-129 存量 UI 溢出/截断 + ISS-126 红绿语义统一）
 *
 * 位置与优先级：本层紧接在 ㉞ 层之后、㉝ 层之前（与 ㉞ 同策略）——㉝ 层的静态契约测试
 *   （tests/test_mobile_optimization.py）以「㉝ 层起始标记 → 文件末尾」整段作为 ㉝ 层断言
 *   （M9「㉝ 层规则必须都在媒体查询内且无 min-width」/「媒体查询外不得新增未声明规则」）。
 *   本层用了 `min-width:641px` 的区间断点，若放在该标记之后会被误当成 ㉝ 层规则而误报，
 *   故与 ㉞ 层同理前移；⚠ 本注释**刻意不写出该标记的完整字面量**（否则
 *   `CSS.index(标记)` 会在这里提前命中，把 ㉝ 层切片起点挪到本层内部）。
 * 桌面不回归：本层**所有**规则都在媒体查询内，且断点上限 820px（< 桌面最小档 821）。
 *   1440/1280 的实测差异见 docs/round10_diff_desktop.json（非预期差异 0 处）。
 * 回滚：删掉本节整段（㊱-1 / ㊱-2）即可；㉞/㉝ 两层一字未改。
 * ========================================================================== */

/* ===== ㊱-1 ISS-129①②：研究页宽表在 641–820（含 768）装进容器、不裁末列 =====
 * 现象（round-7 独立目视复核 L2/L3，元素图 + 本轮探针复现）：
 *   ① `#sigTable` 16 列在 768 档表宽 **1248px**（真实页面元素图 1451px）、容器 **678px**
 *      ⇒ 溢出 **570px**，末列「换手」与「最佳策略」尾部被面板右边缘切断；
 *   ② `#tTable` 9 列在 768 档表宽 **716.7px** / 容器 **678px** ⇒ 溢出 **38.7px**，
 *      末列「分时尾盘」的说明文字被切断（实测行文本「✓ 通过 14:35 创新高后回踩不破」）。
 * 根因：⑨ 段 `table{width:100%}` + `td{white-space:nowrap}`，而 16 列里 13 列是 nowrap ⇒
 *   表的**最小内容宽**由「每列最长不可断文本 + 18px 内边距」累加决定（实测 1248px），
 *   容器再窄也压不下去，只能靠外包 `div[style*="overflow-x:auto"]` 局部横滚兜住。
 * 修法（任务书三选一取「组合」）：**容器 overflow-x 策略保持不动**（局部横滚仍是最后兜底）
 *   + **表格布局调整**（641–820 允许单元格折行：`white-space:normal` + `overflow-wrap:anywhere`，
 *   把最小内容宽从「整句」降到「单字」）+ **列宽收敛**（内边距 9px→4px、字号 13px→11px）。
 *   ⚠ **不隐藏任何列、不裁内容**：16 列（含「板块」）与「换手」末列全部保留，
 *     表宽改为内容无关地贴合容器（压力 payload 实测：超长文本下仍等于容器宽）。
 * 不退化保证（ISS-116）：表头/数据列仍逐列对齐（同一列的 th/td 同进同出，实测 `left` 偏差 0），
 *   第 3 格仍是「板块」、末格仍是「换手」且 `td.num{text-align:right}` 未动。
 * 断点取 641–820 而不含 ≤640：≤640 已由 ㉝-6 卡片化接管（td 变 flex 键值对），
 *   本层若用 max-width:820 会连带改掉 390 卡片的 padding，故把**几何量**（padding/font-size）
 *   放进 641–820 的区间查询；**折行量**（white-space/overflow-wrap）单独放 `max-width:820`——
 *   它在 ≤640 与 ㉝-6 已声明的取值一致（同为 `white-space:normal`），是**等值**不是覆盖，
 *   且这样写能让既有 `tests/test_mobile_optimization.py::M11` 的「`white-space:normal` 不得
 *   出现在媒体查询之外」继续成立（该断言用的 `_strip_media` 只认单条件 `@media(max-width:N)`）。
 *   ≥821（桌面/大平板）保持既有「宽表局部横滚」形态不变（桌面零回归要求），
 *   已知代价与实测数字写在 docs/mobile_checklist.md §M4 与轮次记录。 */
@media(max-width:820px){
  /* 折行：把最小内容宽从「整句」降到「单字」（与 ㉝-6 卡片值等值） */
  #sigTable th,#sigTable td{white-space:normal;overflow-wrap:anywhere}
  #tTable th,#tTable td{white-space:normal;overflow-wrap:anywhere}
}
@media(min-width:641px) and (max-width:820px){
  /* 列宽收敛（只对表格形态生效，不动 ≤640 的卡片内边距） */
  #sigTable{width:100%}
  #sigTable th,#sigTable td{padding:5px 4px;font-size:11px}
  #tTable{width:100%}
  #tTable th,#tTable td{padding:6px 5px;font-size:11.5px}
}

/* ===== ㊱-2 ISS-126 方案A 的**非颜色兜底**：数字列仍为等宽表格数字 =====
 * 本层只保留「方案A（非红绿色阶）」这一条，不新增文字前缀、不改任何元素盒尺寸；
 * 语义的文字自明性来自既有内容：评分卡本身写着「N星 / M分」、`#chanTable` 列头写着
 * 「止损」「目标」。此处仅声明表格数字仍走 `tabular-nums`（与 ⑨ 段一致，防被本层覆盖）。 */
@media(min-width:641px) and (max-width:820px){
  #sigTable td.num, #tTable td.num{font-variant-numeric:tabular-nums}
}

/* ============================================================================
 * ㉝ round-1 移动端专项（390 / 768 为主；桌面不回归）
 *
 * 范围：除「㉝-1 内联样式收口」这一组基础语义类外，本层规则分两档：
 *       ㉝-2～㉝-5 在 @media(max-width:820px)（边界补齐轮把 760 → 820，820 是本仓库既有的
 *       平板断点、侧栏也在该点收起：触控目标/输入框自适应/弹层避让/动效 token 由此覆盖 768 档），
 *       ㉝-6/㉝-7 在 @media(max-width:640px)。桌面断点(≥821px)的计算样式按构造不变，
 *       before/after 实测 diff 见 docs/mobile_optimization_round1_*.md（P5 探针）与
 *       docs/boundary_finish_round_*.md（本轮的 1440/1280 复跑）。
 *       ㉝-1 的取值逐字等于原 JS/HTML 内联值（原来内联就压过一切类规则），故桌面端同样零变化。
 * 顺序：放在文件末尾 —— 与既有同特异性规则冲突时由本层胜出。
 * 优先级：除「输入框自适应」外不新增 !important；该处必须压过页面内联 width，
 *       是 !important 的正当用法（且只存在于移动断点内）。
 * 回滚：删除本节 + 还原 ㉝-1 涉及的 7 处 JS/HTML 内联样式即可（纯前端层，无数据/接口影响）。
 * ========================================================================== */

/* ===== ㉝-1 内联小尺寸按钮/条目 → 语义类（取值 = 原内联值；桌面端零变化） =====
 * 原因：原内联样式优先级压过一切类规则，移动端断点因此无法把它们抬到 44px 触控目标
 * （计划状态机/观察池/持仓维护/复盘核销的行内动作按钮，含「确认激活/触发/确认执行/删除」等
 * 不可逆操作）。按 round-5「重复内联样式收口为语义类」的既有做法统一收口。 */
.pl-act,.wl-act,.rc-resolve{padding:2px 10px;font-size:12px}
.hm-save,.hm-del{padding:2px 10px;font-size:11px}
.btn-xs-plain{padding:2px 12px;font-size:12px}
.btn-xs-accent{padding:2px 12px;font-size:12px;border-color:var(--accent);color:var(--accent)}
.btn-xs-sm{padding:3px 12px;font-size:12px;border-color:var(--accent);color:var(--accent)}
.s-item{padding:7px 10px;cursor:pointer;font-size:13px;display:flex;justify-content:space-between;gap:8px}
/* 弹层关闭「✕」：#loginClose/#recoverClose/#pwdClose/#hmPanelClose/#cmpClose/#batchClose 原为内联
 * 定位样式（18/20px 字 → 热区仅约 18×18），收口到既有 .modal-x 家族（取值逐字等于原内联值），
 * 桌面端零变化；移动端断点内再抬到 44×44 热区。.lg = 原 #hmPanelClose 的 20px/line-height/z-index。 */
.modal-x.lg{font-size:20px;line-height:1;z-index:3}

/* ===== ㉝-2 触控目标 ≥44px（仅 ≤820；桌面按钮/导航/标签尺寸不变） =====
 * 边界补齐轮：原 ≤760 不含 768 档（实测 .pl-act 70.5×22.8 / .hm-save 44.2×21.4 / #refreshBtn 38.2×32），
 * 现扩到仓库既有的 820 平板断点，把 round-1 在 390 档达成的「高<44 / 宽<44 双双清空」带到 768。
 * 1440/1280 不受影响（≥821px 不命中），实测 diff 见 docs/boundary_after_desktop.json。 */
@media(max-width:820px){
  .btn,.tab,.stock-tab,.news-tab,.cal-filter,.sf-chip,.dtab,
  .pl-act,.wl-act,.hm-save,.hm-del,.rc-resolve,.news-toggle,.s-item,
  #mNav .mn-item,.side-nav .nav-item,#dateList .side-item,
  .modal-x,.ctx-go,.ctx-top{min-height:44px}
  .btn,.tab,.stock-tab,.news-tab,.cal-filter,.sf-chip,.dtab,
  .pl-act,.wl-act,.hm-save,.hm-del,.rc-resolve{display:inline-flex;align-items:center;justify-content:center}
  /* 宽度也抬到 ≥44px（避免"高够、宽不够"）：实测 390 下只剩 #refreshBtn「刷新」38.2 宽、
     a.n-link「原文」36.5 宽，故 .btn / .n-link / .n-title 也一并兜到 44。 */
  .btn,.pl-act,.wl-act,.hm-save,.hm-del,.rc-resolve,.ctx-go,.modal-x,.n-link,.n-title{min-width:44px}
  /* 下拉补全项：条目变高更好点 */
  .s-item{padding:11px 12px}
  .news-toggle{padding:10px 12px}
  /* 弹层关闭「✕」：44×44 热区，视觉仍是小字 */
  .modal-x{display:inline-flex;align-items:center;justify-content:center;
    width:44px;height:44px;padding:0;top:0;right:2px;font-size:20px;line-height:1}
  .ctx-go{display:inline-flex;align-items:center;justify-content:center;padding:0 8px}
  /* 表单控件本身也是触控目标（下拉/输入框统一抬到 44px，与按钮一致） */
  select,input:not([type=checkbox]):not([type=radio]),textarea{min-height:44px}
  /* 新闻条目的标题/「全文」链接是列表里的实际点按目标（非正文内联链接）→ 同样抬到 44px */
  .n-title,.n-link{min-height:44px;display:inline-flex;align-items:center}
  /* 行内动作按钮换行堆叠，避免把卡片/表行撑出横向滚动 */
  .pl-act,.wl-act,.hm-save,.hm-del,.rc-resolve{margin:1px 0;white-space:nowrap}

  /* ===== ㉝-3 固定宽输入框 → 自适应（不溢出、行内可换行） ===== */
  #scCode,#sigCodes,#hmCode,#hmShares,#hmCost,#hmTradePrice,#cmpA,#cmpB,
  #wlCode,#wlName,#hmTrade,#instCode,#kronosCodes,#mailInput,#wlNote{
    width:100%!important;max-width:100%!important;min-width:0!important;box-sizing:border-box}
  /* 持仓新增行：代码占满一行，股数/成本价各占半行（390 下并排也放得下） */
  #hmShares,#hmCost{max-width:calc(50% - 5px)!important}
  /* JS 渲染的行内数值框（持仓维护表卡片内）：限宽，不把卡片撑开 */
  .hm-shares,.hm-cost{width:100%!important;max-width:150px!important;min-width:0!important;box-sizing:border-box}

  /* ===== ㉝-4 弹层避让：主按钮不被底部导航遮挡、不超出视口 =====
   * 弹层 z-index(1000~1005) 本就高于 #mNav(800)，不会被压在下面；这里再保证
   * ① 卡片整体上抬（底部留 70px ≈ 5 项导航实高 + 余量）；② 矮屏下卡片自身可滚，
   * 主按钮仍能滚到可见位置。 */
  .modal-mask{padding:10px;box-sizing:border-box}
  .modal-mask,.modal-mask.pad{padding-bottom:calc(70px + env(safe-area-inset-bottom))}
  .modal-mask .modal-card{max-height:calc(100vh - 96px);overflow-y:auto;overflow-x:hidden;box-sizing:border-box}

  /* ===== ㉝-5 移动端动效 160–240ms（原 150/240/420）+ 键盘焦点可见 =====
   * reduced-motion 仍由文件顶部既有断点统一压制，语义不变。 */
  :root{--dur-fast:160ms;--dur:200ms;--dur-slow:240ms}
  .btn:focus-visible,.tab:focus-visible,.stock-tab:focus-visible,.news-tab:focus-visible,
  .cal-filter:focus-visible,.sf-chip:focus-visible,.dtab:focus-visible,.pl-act:focus-visible,
  .wl-act:focus-visible,.hm-save:focus-visible,.hm-del:focus-visible,.rc-resolve:focus-visible,
  .news-toggle:focus-visible,.s-item:focus-visible,.mn-item:focus-visible,.nav-item:focus-visible,
  .side-item:focus-visible,.ctx-go:focus-visible,.ctx-top:focus-visible,.modal-x:focus-visible{
    outline:2px solid var(--accent);outline-offset:2px}
}

/* ===== ㉝-6 宽表卡片化（≤640）：一卡一行 + 字段竖排键值对 =====
 * 列标签由 core/ui.js 的 labelTables() 把首行 <th> 的**真实文字**盖到 td[data-th]
 * （纯元数据盖章，不改 innerHTML/取数/渲染逻辑；同一张表在不同子 Tab 下列数不同也能自动对齐，
 * 不会像 nth-child 写死标签那样错位）。表格 DOM 结构、id/class/onclick/data-* 契约全部保留，
 * 仅用 CSS 重排。数字仍右对齐、红涨绿跌类名(.up/.down)未动。
 * 复盘报告区 #recapBox 显式豁免（报告表格确需横滚，保持原样）。 */
@media(max-width:640px){
  table.tbl-labeled{display:block;width:100%;min-width:0;border-collapse:separate}
  table.tbl-labeled .tbl-hd{display:none}
  table.tbl-labeled tr:not(.tbl-hd){
    display:block;border:1px solid var(--border);border-radius:10px;background:var(--surface-2);
    padding:8px 11px;margin:0 0 8px}
  table.tbl-labeled tr:not(.tbl-hd):last-child{margin-bottom:0}
  table.tbl-labeled td{
    display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:2px 10px;
    border:0;padding:3px 0;text-align:right;white-space:normal;max-width:none;
    /* 值侧是匿名 flex 项：min-width:auto 会让长串不可断内容把卡片撑宽 → 必须允许任意点断行 */
    overflow-wrap:anywhere;word-break:break-word}
  table.tbl-labeled td::before{
    content:attr(data-th);flex:0 0 auto;color:var(--muted);font-size:11.5px;font-weight:600;
    letter-spacing:.02em;text-align:left}
  table.tbl-labeled td:not([data-th])::before{display:none}
  /* 跨列/无标签的整行表述（空态、成交明细副行）：左对齐占满整卡 */
  table.tbl-labeled td:not([data-th]){justify-content:flex-start;text-align:left;color:var(--muted)}
  /* 卡片内的控件不越界 */
  table.tbl-labeled td > .btn,
  table.tbl-labeled td > input,
  table.tbl-labeled td > .pl-act,
  table.tbl-labeled td > .wl-act,
  table.tbl-labeled td > .hm-save,
  table.tbl-labeled td > .hm-del{max-width:100%}
  table.tbl-labeled td.num{font-variant-numeric:tabular-nums}
  /* 计划状态机：待办高亮从「td 左粗边」搬到「卡片本身」（td 级装饰在卡片布局下错位） */
  #plStateTable tr.pl-row.hot td{background:transparent}
  #plStateTable tr.pl-row.hot td:first-child{border-left:0}
  #plStateTable tr.pl-row.hot{border-color:rgba(185,130,42,.55);background:rgba(185,130,42,.07);
    border-left:3px solid var(--accent)}

  /* ===== ㉝-6b 未盖章 #sigTable 的兜底（≤640） =====
   * 边界补齐轮实测发现：`#sigTable` 的 **0 命中态**由 research.js 直接写成
   * `<tr><td …>暂无触发买入信号的票…</td></tr>`（整表没有 `<th>`），而 labelTables() 按设计
   * `if(!head) continue` 跳过无表头的表 ⇒ 拿不到 `.tbl-labeled` ⇒ 上面的卡片重排不命中 ⇒
   * 该行仍是 `nowrap` 表格，在 390 的 324px 容器里横滚 **132px**（实测：行宽 455.6 / 容器 324，
   * docs/boundary_static_tables_after.json）。同族的 #tTable/#chanTable 的 0 行态**保留表头**，
   * 因此没有这个问题——三者写法不一致，这里只做 CSS 兜底，不动 JS 模板。
   * 选择器用 `:has(tr:only-child)` 精确锁定「只有一行」的空态：有数据时表内 ≥2 行（表头+数据行），
   * 规则不命中，已盖章的 `.tbl-labeled` 卡片规则照旧生效；桌面（≥641）完全不命中。
   * 未实现「末列标签/右对齐」的修复——那需要 JS 侧把表头补齐（另登记 ISS-116，属独立改动）。 */
  #sigTable:not(.tbl-labeled):has(tr:only-child){display:block;width:100%;min-width:0}
  #sigTable:not(.tbl-labeled):has(tr:only-child) tr{
    display:block;border:1px solid var(--border);border-radius:10px;background:var(--surface-2);
    padding:8px 11px;margin:0 0 8px}
  #sigTable:not(.tbl-labeled):has(tr:only-child) td{
    display:flex;justify-content:flex-start;text-align:left;border:0;padding:3px 0;
    white-space:normal;overflow-wrap:anywhere;word-break:break-word;max-width:none}
}

/* ===== ㉝-7 首屏与信息密度（≤640）：并列指标卡同屏 ≤4、页面左右内边距 12–16px ===== */
@media(max-width:640px){
  /* 页面级左右内边距：原 26px → 14px（同时保证横向不溢出） */
  #view-monitor,#view-screen,#view-backtest,#view-warroom,#view-calendar,
  #view-aiusage,#view-fund,#view-market,#view-plan{padding:12px 14px 40px}
  /* 复盘视图：内层 recapPanel/report-wrap 自带 10px 外边距 → 外层补 2px 即为 12px */
  #view-dash{padding:2px 2px 40px}
  /* 并列指标卡：网格恒为 2 列（同屏 ≤4 张）；横滑条单卡按 50% 收敛，不露半张 */
  .m-cards{grid-template-columns:repeat(2,1fr)!important}
  .m-cards > .m-card{min-width:0}
  #ovBar .m-card{flex:0 0 calc(50% - 3px);min-width:0}
  .kpi-strip .kpi{flex:0 0 calc(50% - 5px);min-width:0}
  /* 页面级横向滚动兜底：既有 body{overflow:hidden} + .content{overflow-x:hidden} 已结构性保证
     整页不横滑（探针实测 5 视图 documentElement/body scrollWidth==clientWidth==390，before/after 均如此）。
     这里只再加一条：顶栏自身横滑不把滚动链传递给页面（不写 html{overflow-x:hidden}——按 CSS 规范
     overflow-x:hidden 会把 overflow-y:visible 计算成 auto，反而给 html 造出一个多余的滚动容器）。 */
  header{overscroll-behavior-x:contain}
}
