/* ═════════════════════════════════════
   optimizer-ui.css — 优化器交互 UI（B21B-2 自 app.css 原子拆分）
   职责：优化入口 / 标的 Tag 编辑器 / 折叠组件 / MV 篮子 / 摘要 / 方法论述 / 参数与设置 / 权重明细。
   变量只消费 app.css :root 定义；级联顺序 app → optimizer-ui → optimizer → landing。
   ═══════════════════════════════════ */
/* 阶段 K1D：第五张操作卡片——更新组合估值（汇总区最右侧，与四张数据卡片协调；
   状态播报仍走下方独立 #sumNoteRow → #sumNote，绝不插入卡片之间） */
.sum-action {
  border-color: rgba(200, 162, 94, 0.45);
  background: linear-gradient(180deg, rgba(200, 162, 94, 0.10), rgba(200, 162, 94, 0.04) 55%, transparent);
  min-width: 190px;
}
.sum-action::before { opacity: 0.9; }
.sum-sub {
  font-size: 11px; color: var(--ink-3); line-height: 1.45;
  margin: -4px 0 12px; min-width: 0;
}
.sum-action .btn-calc-value {
  width: 100%; margin-top: auto; min-height: 42px;
  background: rgba(200, 162, 94, 0.14);
}
.sum-action .btn-calc-value:hover { background: rgba(200, 162, 94, 0.24); transform: none; }
/* 第三部分优化入口（开始优化）：金色主按钮，与第一部分的市值描边按钮明确区分 */
.optimize-entry-row {
  display: flex; flex-wrap: wrap; align-items: center; gap: 12px 16px;
  margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--hairline);
  /* L2.11：与下方「总览 · 计算说明」卡片的区块级间距（桌面 22px / ≤640px 移动 16px）——
     实测 1280px/390px 修复前两区块 gap=0 粘连，不设按钮本身、不用 spacer/br/绝对定位/固定高度 */
  margin-bottom: 22px;
}
.btn-calc-optimize { flex: 0 0 auto; min-width: 170px; }
.optimize-entry-hint { font-size: 12px; color: var(--ink-3); line-height: 1.5; min-width: 0; }
/* 资产散点与二级优化器可聚焦时的清晰焦点环（无障碍） */
.ad-g:focus-visible, g[role="button"]:focus-visible {
  outline: 2px solid var(--gold, #c8a25e); outline-offset: 2px; border-radius: 4px;
}
/* ── 阶段 J4B1：有效前沿视图切换（查看全部资产 / 聚焦前沿）── */
/* L2.14: ① 设置块（含个股篮子 / 按标的调整 / 经典 MV 设置与诊断）→ 有效前沿 净间距统一 ≥22px。
   原 4px 过密；统一后落在「主要内容区 20-32px」目标区间。 */
.frontier-viewbar { margin: 24px 0 10px; }
.frontier-view-head {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px;
}
.frontier-viewbar-title {
  /* L2.14: 一级目录标题 16/650（与 ① .opt-params-head / ② .opt-settings-title 同级） */
  font-size: 16px; font-weight: 650; color: var(--ink-1, #ece9e2); letter-spacing: 0.04em;
}
.frontier-view-toggle { display: inline-flex; flex-wrap: wrap; gap: 8px; }
.fv-btn {
  background: transparent; color: var(--ink-2, #c9c4ba);
  border: 1px solid var(--hairline-strong, #3a3a3a); border-radius: 10px;
  padding: 9px 16px; font-size: 13px; font-weight: 600; cursor: pointer;
  font-family: inherit; letter-spacing: 0.03em; min-height: 42px; /* 移动端 tap 命中 ≥ 42px */
  transition: all 0.16s; white-space: nowrap;
}
.fv-btn:hover { border-color: var(--gold, #c8a25e); color: var(--gold-hi, #dcbc7f); }
.fv-btn-active {
  background: rgba(200,162,94,0.16); color: var(--gold-hi, #dcbc7f);
  border-color: var(--gold, #c8a25e);
}
.fv-btn:focus-visible { outline: 2px solid var(--gold, #c8a25e); outline-offset: 2px; }
.frontier-view-hint {
  margin: 8px 0 0; font-size: 12px; color: var(--ink-3, #8f8b81); line-height: 1.5;
}
@media (max-width: 640px) {
  .frontier-view-toggle { width: 100%; }
  .fv-btn { flex: 1 1 auto; text-align: center; }
}
@media (max-width: 640px) {
  .sum-action { flex-basis: 100%; min-width: 100%; }
  .sum-action .btn-calc-value { width: 100%; }
  .optimize-entry-row { flex-direction: column; align-items: stretch; margin-bottom: 16px; }
  .btn-calc-optimize { width: 100%; min-width: 0; }
  .optimize-entry-hint { text-align: center; }
}
/* 阶段 J2：移动端（约 390px）验证反馈紧凑性 */
@media (max-width: 640px) {
  .opt-input-slot { flex-basis: 100%; }
  .opt-suggest-btn { flex: 1 1 auto; }
  .opt-yahoo-link { flex: 0 0 auto; }
}
/* 阶段 I：本次优化标的 Tag 编辑器（外层仅作折叠容器，不做卡片；卡片感来自内部 opt-pool-content） */
.opt-pool-block { margin-top: 16px; }
.opt-pool-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; margin-bottom: 10px; }
.opt-pool-title { font-size: 14px; font-weight: 600; color: var(--ink, #f4f1ea); letter-spacing: 0.03em; }
.opt-pool-sub { font-size: 12px; color: var(--ink-3, #a3a099); line-height: 1.5; }
.opt-tag-list { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 4px; }
.opt-tag-empty { font-size: 12px; color: var(--ink-3, #a3a099); }
.opt-tag {
  display: inline-flex; align-items: center; gap: 8px; padding: 5px 8px 5px 10px;
  border-radius: 999px; font-size: 12.5px; color: var(--ink, #f4f1ea); max-width: 100%;
  background: rgba(200,162,94,0.12); border: 1px solid rgba(200,162,94,0.35);
}
.opt-tag-extra { background: rgba(120,170,220,0.12); border-color: rgba(120,170,220,0.4); }
.opt-tag-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
.opt-tag-source { font-size: 11px; color: var(--ink-3, #a3a099); }
.opt-tag-del {
  border: none; background: transparent; color: var(--ink-3, #a3a099); cursor: pointer;
  font-size: 16px; line-height: 1; padding: 0 2px; border-radius: 50%;
}
.opt-tag-del:hover { color: #ef9a9a; }
.opt-tag-del:focus { outline: none; color: #ef9a9a; }
.opt-pool-input-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-top: 12px; }
/* 阶段 J2：额外优化标的验证反馈（输入 + 右侧固定宽度指示区：spinner / ✓） */
.opt-input-slot {
  display: flex; align-items: center; gap: 8px;
  flex: 1 1 240px; min-width: 180px;
}
.opt-input-slot .opt-pool-input { flex: 1 1 auto; min-width: 0; width: auto; }
.opt-input-status {
  flex: 0 0 16px; width: 16px; height: 16px;
  display: flex; align-items: center; justify-content: center;
  font-size: 13px; line-height: 1; color: #5fae7e;
}
.opt-input-slot.is-validating .opt-input-status::before {
  content: ''; width: 12px; height: 12px; border-radius: 50%;
  border: 2px solid rgba(200,162,94,0.35); border-top-color: var(--gold, #c8a25e);
  animation: opt-spin 0.8s linear infinite;
}
.opt-input-slot.is-success .opt-input-status::before { content: '✓'; }
@keyframes opt-spin { to { transform: rotate(360deg); } }
.opt-input-live {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.opt-pool-input {
  flex: 1 1 240px; min-width: 180px; padding: 9px 12px; border-radius: 9px;
  border: 1px solid var(--hairline-strong, rgba(255,255,255,0.16));
  background: var(--panel, #14130f); color: var(--ink, #f4f1ea);
  font-size: 13.5px; font-family: inherit; letter-spacing: 0.02em;
}
.opt-pool-input:focus { outline: none; border-color: var(--gold, #c8a25e); box-shadow: 0 0 0 3px rgba(200,162,94,0.14); }
.opt-pool-hint { font-size: 12px; color: var(--ink-3, #a3a099); letter-spacing: 0.02em; }
.opt-pool-hint.ok { color: #8fd6a0; }
.opt-pool-hint.warn { color: #e7c879; }
.opt-pool-hint.error { color: #ef9a9a; }
/* 建议代码按钮与 Yahoo 轻量查询入口：小尺寸，不形成大卡片，不依赖 hover */
.opt-suggest-btn {
  background: var(--panel, #14130f); color: var(--ink, #f4f1ea);
  border: 1px dashed var(--gold, #c8a25e); border-radius: 8px;
  padding: 7px 12px; font-size: 12px; cursor: pointer; font-family: inherit; line-height: 1.3;
}
.opt-suggest-btn:hover { border-color: var(--gold-hi, #e0c089); color: var(--gold-hi, #e0c089); }
.opt-suggest-btn:focus-visible { outline: 2px solid var(--gold, #c8a25e); outline-offset: 2px; }
.opt-suggest-btn[hidden], .opt-yahoo-link[hidden] { display: none; }
.opt-yahoo-link {
  color: #8fb4e0; font-size: 12px; text-decoration: underline; text-underline-offset: 2px;
  padding: 4px 2px; border-radius: 6px;
}
.opt-yahoo-link:focus-visible { outline: 2px solid var(--gold, #c8a25e); outline-offset: 2px; }
/* ── L2/L2.1/L2.2：统一折叠组件 —— 与「按标的调整预期收益」同款 .mv-collapse-head。
   外层 .mv-collapse 仅负责标题按钮 + 展开/隐藏 + 展开内容布局，本身不是卡片
   （无 border 圆角 / 阴影 / 卡片背景 / 大 padding）。所有折叠标题
   （本次优化标的 / 个股篮子 / 经典 MV 设置与诊断 / 计算底稿 / 优化器权重明细）
   统一复用以下 class：.mv-collapse-head / .mv-caret / .mv-collapse-title / .mv-collapse-count，
   不近似仿制新 class。原生 button 作触发器：aria-expanded / aria-controls 精确；
   Enter / Space 可操作；focus-visible 清晰；命中高度 ≥ 44px；折叠态不保留大块空白。 */
.mv-collapse { margin-top: 14px; }
.mv-collapse-head {
  display: flex; align-items: center; flex-wrap: wrap; gap: 4px 10px;
  width: 100%; min-height: 44px; padding: 8px 0;
  background: none; border: 0; border-bottom: 1px solid var(--hairline, rgba(255,255,255,0.12));
  color: var(--ink, #f4f1ea); font: inherit; font-size: 13px; font-weight: 600;
  text-align: left; cursor: pointer;
}
.mv-collapse-head:focus-visible { outline: 2px solid var(--gold, #c8a25e); outline-offset: -2px; }
.mv-collapse-head:hover { color: var(--gold-hi, #e0c089); }
.mv-caret {
  flex: 0 0 auto; font-size: 11px; line-height: 1; color: var(--gold, #c8a25e);
  transition: transform .15s ease; display: inline-block;
}
.mv-collapse-head[aria-expanded="true"] .mv-caret { transform: rotate(90deg); }
.mv-collapse-title { font-size: 13px; font-weight: 600; color: var(--ink, #f4f1ea); letter-spacing: 0.01em; }
.mv-collapse-label { font-size: 13px; font-weight: 600; color: var(--ink, #f4f1ea); letter-spacing: 0.01em; min-width: 0; }
.mv-collapse-count { font-size: 12px; font-weight: 500; color: var(--ink-3, #a3a099); margin-left: 6px; min-width: 0; }
.mv-collapse-sub {
  flex-basis: 100%; font-size: 11.5px; color: var(--ink-3, #a3a099);
  line-height: 1.45; margin-top: 2px;
}
/* 七个锁定折叠标题统一：三角形 → 锁 → 主标题 →（状态摘要）。
   锁前置后不再位于标题文字后方；间距由折叠头 flex/grid gap 统一控制，
   锁自身 margin-left 归零，保证七个区域锁位置/尺寸/间距一致。 */
.mv-title-stack .mv-lock { margin-left: 0; }
/* 移动端（≤640px，沿用项目既有断点）：七个锁定折叠标题统一 Grid 三列模型——
   三角形(col1) → 锁(col2) → 主标题(col3) 第一行同行垂直居中；仅四个长摘要区域
   （按标的调整收益 / 个股篮子 / 经典 MV 设置与诊断 / 因子预期收益调整）的状态摘要
   为 col3 第二行，只从主标题文字起始位置对齐。Grid 中 align-items 仅作用于各自
   grid 区域，三角形/锁只对第一行单元格居中（不会对整个两行块居中），且 grid 不参与
   换行 → 锁不会掉到第二/第三行。桌面端（>640px）维持既有单行布局不变。 */
@media (max-width: 640px) {
  .mv-collapse-head.mv-title-stack {
    display: grid;
    grid-template-columns: auto auto minmax(0, 1fr);
    align-items: center;
    gap: 4px 10px;
  }
  .mv-title-stack > .mv-caret { grid-column: 1; grid-row: 1; }
  .mv-title-stack > .mv-lock { grid-column: 2; grid-row: 1; }
  .mv-title-stack > .mv-collapse-label { grid-column: 3; grid-row: 1; min-width: 0; }
  .mv-title-stack > .mv-collapse-count {
    grid-column: 3; grid-row: 2; margin-left: 0; margin-top: 2px;
    width: 100%; white-space: normal; overflow-wrap: anywhere;
  }
  .mv-title-stack > .mv-collapse-sub { grid-column: 1 / -1; }
}
.mv-collapse-body { padding: 12px 0 2px; }
.mv-collapse-body[hidden] { display: none; }
/* L2：计算底稿内的「优化器权重明细」二级折叠（结构重组，不重算、不改内容；标题统一 .mv-collapse-head） */
.report-weight-secondary {
  margin: 12px 0;
  border: 1px solid var(--hairline-strong, rgba(255,255,255,0.1));
  border-radius: 10px;
  background: rgba(255,255,255,0.02);
  overflow: hidden;
}
.report-weight-panel { padding: 4px 14px 14px; }
.report-weight-panel[hidden] { display: none; }
/* L2：当前 MV 设置（含「当前/上一次设置」对比）与经典 MV 诊断桌面端并排 */
.mv-diag-compare {
  display: grid; grid-template-columns: 1fr; gap: 14px; margin-top: 12px;
}
.mv-diag-compare > * { min-width: 0; }
@media (min-width: 900px) {
  /* 安全两列：minmax(0,1fr) 防止内容把列撑破；align-items:stretch 使两张卡片等高、
     顶部与底部视觉对齐；卡片 height:100% 填满整行，内容较长时整行一起增长，不产生横向滚动。 */
  .mv-diag-compare { grid-template-columns: minmax(0,1fr) minmax(0,1fr); align-items: stretch; }
}
/* L2.1：折叠展开后两张卡片等高（不固定像素高度、不缩小诊断字体、不产生内部横向滚动） */
.mv-diag-compare > .mv-compare,
.mv-diag-compare > .mv-diagnostics { margin-top: 0; height: 100%; }
/* 经典 MV 个股篮子（可选）：外层仅作折叠容器，不做卡片；卡片感来自内部 zone */
.mv-basket-block { margin-top: 16px; }
.mv-basket-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; margin-bottom: 10px; }
.mv-basket-title { font-size: 14px; font-weight: 600; color: var(--ink, #f4f1ea); letter-spacing: 0.03em; }
.mv-basket-sub { font-size: 12px; color: var(--ink-3, #a3a099); line-height: 1.5; }
/* 阶段 I（补充）：轻量启用开关 + 状态提示 */
.mv-basket-toggle { display: inline-flex; align-items: center; gap: 6px; margin-left: auto; font-size: 12.5px; color: var(--ink-2); cursor: pointer; user-select: none; }
.mv-basket-toggle input { width: 15px; height: 15px; accent-color: var(--gold-hi, #e0c089); cursor: pointer; }
.mv-basket-toggle-label { font-weight: 500; }
.mv-basket-msg { display: block; margin: 8px 0 10px; font-size: 12px; line-height: 1.5; border-radius: 8px; padding: 7px 10px; }
.mv-basket-msg-off { color: var(--ink-3, #a3a099); background: rgba(255,255,255,0.03); border: 1px solid var(--hairline-strong, rgba(255,255,255,0.1)); }
.mv-basket-msg-hint { color: var(--gold-hi, #e0c089); background: rgba(200,162,94,0.08); border: 1px solid rgba(200,162,94,0.22); }
.mv-basket-msg-on { color: var(--ink-2); background: rgba(120,170,220,0.08); border: 1px solid rgba(120,170,220,0.24); }
.mv-basket-zones { display: flex; flex-wrap: wrap; gap: 14px; }
.mv-zone { flex: 1 1 240px; min-width: 200px; }
.mv-zone-label { font-size: 12px; color: var(--ink-2); margin-bottom: 6px; letter-spacing: 0.03em; }
.mv-zone-list {
  display: flex; flex-wrap: wrap; gap: 8px; min-height: 44px; padding: 8px;
  border: 1px dashed var(--hairline-strong, rgba(255,255,255,0.16)); border-radius: 10px;
  background: rgba(255,255,255,0.02);
}
.mv-zone-empty { font-size: 12px; color: var(--ink-3, #a3a099); }
.mv-item {
  display: inline-flex; align-items: center; gap: 8px; padding: 6px 10px;
  border-radius: 999px; font-size: 12.5px; color: var(--ink, #f4f1ea);
  background: rgba(200,162,94,0.10); border: 1px solid rgba(200,162,94,0.3);
  user-select: none;
}
.mv-item-in { background: rgba(120,170,220,0.10); border-color: rgba(120,170,220,0.38); cursor: grab; }
.mv-item-in:active { cursor: grabbing; }
.mv-item-label { font-weight: 600; }
/* 左侧可选：整枚原生 button，点击 / Enter / Space 加入篮子（移动端命中高度 ≥ 42px） */
.mv-item-add {
  cursor: pointer; min-height: 42px; padding: 8px 14px;
  border: 1px solid rgba(200,162,94,0.4); background: rgba(200,162,94,0.10);
  transition: background .15s ease, border-color .15s ease;
}
.mv-item-add:hover { background: rgba(200,162,94,0.20); border-color: rgba(200,162,94,0.6); }
.mv-item-add:focus-visible { outline: 2px solid var(--gold, #c8a25e); outline-offset: 2px; }
.mv-item-add.mv-item-disabled { opacity: 0.5; cursor: not-allowed; }
/* 轻量加号图标（装饰，aria-hidden） */
.mv-item-plus {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px; border-radius: 50%;
  border: 1px solid rgba(200,162,94,0.6); color: var(--gold-hi, #e0c089);
  font-size: 13px; line-height: 1; font-weight: 700;
}
/* 右侧成员移除按钮（×）：与优化池叉号可访问文本不同。
   视觉叉号保持 16px；命中区域扩至 36×36px 以满足移动端可靠点按（≥32px）。 */
.mv-item-x {
  border: none; background: transparent; color: var(--ink-3, #a3a099); cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 16px; line-height: 1; padding: 0 4px; min-width: 36px; min-height: 36px;
  border-radius: 50%;
}
.mv-item-x:hover { color: #ef9a9a; }
.mv-item-x:focus-visible { outline: 2px solid var(--gold, #c8a25e); outline-offset: 2px; color: #ef9a9a; }
/* Proxy 下拉中区分额外标的（不显示为真实持仓） */
.rep-opt-additional { font-style: italic; color: var(--gold-hi, #e0c089); }
@media (max-width: 640px) {
  .opt-input-slot { flex-basis: 100%; }
  .mv-zone { flex-basis: 100%; }
}
/* 阶段 C：组合市值独立额度提示（游客 3 / 登录 10，每小时） */
.value-quota-hint {
  align-self: center; font-size: 12px; color: var(--ink-2);
  letter-spacing: 0.03em; white-space: nowrap;
}
/* ── 摘要 ── */
.summary-row { display: flex; gap: 16px; margin-bottom: 6px; flex-wrap: wrap; }
.sum-card {
  flex: 1; min-width: 170px; background: var(--panel); border: 1px solid var(--hairline);
  border-radius: 14px; padding: 18px 22px; display: flex; flex-direction: column;
  position: relative; overflow: hidden;
}
.sum-card::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 2px;
  background: linear-gradient(90deg, var(--gold), transparent 70%);
}
.sum-label { font-size: 11px; color: var(--ink-3); margin-bottom: 6px; letter-spacing: 0.2em; text-transform: uppercase; }
.sum-val {
  font-size: 24px; font-weight: 600; font-family: var(--font-serif);
  font-variant-numeric: tabular-nums; letter-spacing: 0.01em;
  min-width: 0; overflow-wrap: anywhere; word-break: break-word; /* 长金额安全换行，禁止右侧裁切 */
}
/* K1D：组合市值计算状态独立行——置于四张汇总卡片之后，整行展示；
   不作为卡片插入卡片区；空态 display:none 不占空白；文案自然换行。 */
.sum-note-row { width: 100%; margin: 0 0 22px; min-height: 0; }
.sum-note {
  font-size: 12px; line-height: 1.6; color: var(--warn-amber, #e0b25a);
  overflow-wrap: anywhere; word-break: break-word; min-height: 0;
}
.sum-note:empty { display: none; }
/* ── 方法论述 ── */
.methodology {
  background: rgba(200,162,94,0.05); border: 1px solid rgba(200,162,94,0.16);
  border-left: 2px solid var(--gold);
  border-radius: 8px; padding: 14px 18px; margin-bottom: 16px;
  font-size: 12px; line-height: 1.75; color: #b8b4aa;
}
.methodology strong, .methodology b { color: var(--ink); }
.methodology strong { color: var(--gold-hi); letter-spacing: 0.04em; }
/* ── 优化器分区「原理 + 参数」合并块 ──
   参数区属于所在优化器分区内部，不再是独立顶级 .card。
   .opt-brief 承担原 .methodology 的外观，内部 methodology 去边框，与参数区用发丝线分隔。 */
.opt-brief {
  background: rgba(200,162,94,0.05); border: 1px solid rgba(200,162,94,0.16);
  border-left: 2px solid var(--gold); border-radius: 8px;
  margin-bottom: 16px; overflow: hidden;
}
.opt-brief > .methodology {
  background: transparent; border: none; border-left: none;
  border-radius: 0; margin: 0;
}
.opt-settings { border-top: 1px solid rgba(200,162,94,0.18); padding: 13px 18px 15px; }
/* L2.9：左侧金黄色强调线（纯视觉共用 class，复用 var(--gold)，与 .opt-brief/.methodology 一致 2px） */
.accent-left-gold { border-left: 2px solid var(--gold); }
/* L2.9：① 经典 MV 动态设置容器去掉 .opt-settings 的左右内边距/顶边框，
   使「个股篮子 / 按标的调整预期收益 / 经典 MV 设置与诊断」三个折叠标题左边界与可用宽度一致；
   保留 .opt-settings class 以维持 is-guest 登录锁与 .opt-settings .mv-* 内容样式。 */
#mvSettingsCard { padding: 0; border-top: 0; }
.opt-settings-head {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; flex-wrap: wrap; margin-bottom: 10px;
}
/* L2.14: ②-⑤「参数与设置」与「全局约束」一级目录标题 15/700/gold/letter-spacing/uppercase；
   层级 > .mv-collapse-title (13/600) 与 .opt-settings-guest (13/400)。 */
.opt-settings-title {
  font-size: 15px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--gold-hi); font-weight: 700;
}
.opt-settings-guest { display: none; font-size: 13px; color: var(--ink-3); letter-spacing: 0.04em; }
.opt-settings.is-guest .opt-settings-guest { display: inline; }
/* 受限设置组的小锁：仅游客态显示，小尺寸、跟随文字颜色，不抢主视觉 */
.mv-lock { display: none; margin-left: 6px; color: var(--ink-3); line-height: 0; vertical-align: -1px; }
.opt-settings.is-guest .mv-lock { display: inline-block; }
/* 通用：任意带 is-guest 的祖先内，小锁均显示（本次优化标的 / 经典 MV 个股篮子等非 .opt-settings 区域复用同一 .mv-lock 组件） */
.is-guest .mv-lock { display: inline-block; }
/* 「单资产权重上限」行：锁前置到标题文字前方；margin-left 归零避免首行缩进，
   margin-right:6px 维持锁与标题文字的小间距（与折叠标题「锁 → 标题」规则协调）；
   垂直对齐沿用 .mv-lock 基类 vertical-align，桌面/移动端同一顺序。 */
.opt-settings .mv-row-label .mv-lock { margin-left: 0; margin-right: 6px; }
/* ── 优化器分区与卡片 ── */
/* L2.14: ① (mvOptSec) 是首优化器，紧跟 globalConstraint（卡片 → 独立卡片 16-24px 目标）。
   用 margin-top 22px 制造顶部外边距，避免与上一区块边界重合。 */
#mvOptSec { margin-top: 22px; padding-top: 0; }
/* L2.14: ② ③ ④ ⑤（非首个 opt-sec）：用 padding-top 28 制造顶部内边距（替代原 margin-top:6），
   避免与上一区块 .opt-row margin-bottom 发生 collapse；同时确保 ①→② / ②→③ / ③→④ / ④→⑤
   优化器方法区之间的净间距稳定落在 28-40px 目标区间。 */
.opt-sec { margin: 0; padding-top: 28px; }
/* L2.14: 优化器正式标题（A 级）— 18/700（serif），与 ①-⑤ 一致。层级高于「一级目录标题」(.opt-params-head / .opt-settings-title / .frontier-viewbar-title)。 */
.opt-sec-title {
  font-family: var(--font-serif); font-size: 18px; font-weight: 700;
  margin: 0 0 12px; color: var(--ink); letter-spacing: 0.02em;
  border-top: 1px solid var(--hairline);
  padding-top: 18px;
}
/* L2.8：① 经典 MV「参数与设置」轻量分组标题（非大卡片/非折叠开关，仅内容分类） */
/* L2.14: ① 一级目录标题 15/700/gold/letter-spacing；层级 > .mv-collapse-title (13/600)。 */
.opt-params-head {
  font-size: 15px; font-weight: 700; color: var(--gold-hi); letter-spacing: 0.14em;
  margin: 0 0 10px;
}
/* L2.14: ②-⑤ + 全局约束 卡片头：① → 结果卡 与 ②→③/③→④/④→⑤ 优化器方法区之间 净间距 ≥28px。
   ①→② 等价于 mvOptSec.opt-row 底 → optGridCompare.②.opt-sec 顶；
   通过 opt-sec padding-top 28 制造上边距（不与上一区块 margin-bottom 发生 collapse），
   同时 .opt-row margin-bottom 归零避免重复叠加；总净间距 = 28px，落 28-40 目标区间。 */
.opt-row { display: flex; gap: 16px; margin: 0; flex-wrap: wrap; }
/* L2.14: ② 因子设置块→结果卡 净间距 24px（桌面+移动均生效；原 0px 粘连）。 */
#factorSettingsCard + .opt-row { margin-top: 24px; }
.opt-card {
  flex: 1; min-width: 290px; background: var(--panel-2);
  border: 1px solid var(--hairline); border-radius: 12px; padding: 18px;
}
.opt-card h3 { font-size: 13px; font-weight: 600; margin-bottom: 10px; letter-spacing: 0.03em; color: var(--ink); }
.opt-stats { display: flex; gap: 14px; font-size: 11px; color: var(--ink-3); flex-wrap: wrap; letter-spacing: 0.04em; }
.opt-stats b { color: var(--ink); font-size: 15px; font-variant-numeric: tabular-nums; font-weight: 600; }

.opt-table-wrap { margin-top: 12px; }
.opt-wt-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.opt-wt-table th {
  text-align: left; padding: 8px 10px 6px; border-bottom: 1px solid var(--hairline-strong);
  font-weight: 500; font-size: 10px; color: var(--ink-3); letter-spacing: 0.14em; text-transform: uppercase;
}
.opt-wt-table td { padding: 5px 10px; border-bottom: 1px solid var(--hairline); color: var(--ink-2); }
.opt-wt-table tr:hover td { background: rgba(236,233,226,0.025); }
.opt-bar { display: inline-block; height: 8px; border-radius: 2px; vertical-align: middle; opacity: 0.9; }
.opt-wt-inner { margin-top: 10px; }
.opt-wt-inner .opt-wt-table { font-size: 11px; }
.opt-wt-inner .opt-wt-table th { font-size: 10px; padding: 4px 8px; }
.opt-wt-inner .opt-wt-table td { padding: 3px 8px; }
.muted { color: var(--ink-3); font-size: 12px; }
.num { text-align: right; font-variant-numeric: tabular-nums; font-feature-settings: "tnum"; }
.num.pos { color: var(--sage); }
.num.neg { color: var(--terra); }
/* ── 768px：随职责迁出的摘要 / opt-row 布局 ── */
@media (max-width: 768px) {
  .summary-row { gap: 10px; }
  .sum-val { font-size: 20px; } /* 窄屏总市值安全缩小，配合 overflow-wrap 避免右侧裁切 */
  .sum-note-row { margin-bottom: 16px; }
  .opt-row { flex-direction: column; }
}

/* ═════════════════════════════════════
   结果分析区域（计算底稿 + AI 提问）：内部不画横向分隔线
   —— 两个区块标题共用 .opt-sec-title（自带 border-top:hairline + padding-top:18px）：
      ·「计算底稿」(#analysisDraftTitle) 的上边线承担与 HRP 分区的视觉边界 ⇒ 原样保留；
      ·「AI 提问」(.analysis-ai-title) 不开启新分区 ⇒ 只去掉这一条 border-top，
        区块之间仅保留正常垂直留白（padding-top 与其它标题一致，不额外加减）。
   只覆盖 border-top：font-family / font-size / font-weight / color / letter-spacing /
   line-height / margin / padding 全部沿用全局 .opt-sec-title，不复制整套标题样式。
   同文件同 specificity、位于 .opt-sec-title 规则之后 ⇒ 按源顺序生效，无需依赖兄弟 /
   父级结构的伪类选择器、伪元素或内联 style，也不引入背景、阴影、圆角或卡片包装。
   ═══════════════════════════════════ */
.analysis-ai-title { border-top: none; }
