/* =============================================================================
 * v1099 · 全局视觉系统（Design System 叠加层 · 覆盖全站所有页面）
 * -----------------------------------------------------------------------------
 * 目标：不是逐页打补丁，而是建立一套可复用的视觉 token，让整个系统（所有视图
 *       与数智人）呈现同一个世界级语言：极简禁欲、纯色细线、唯一强调色。
 * 五条公理：
 *   ① 圆角阶梯：容器 20 / 内卡 12 / 控件 10 / 胶囊 999（全站只有这四档）
 *   ② 描边统一：rgba(255,255,255,.09)（hover 升到 .16）
 *   ③ 强调色唯一：暖金 #f0b75e（涨跌沿用 A 股红绿）
 *   ④ 数字等宽：金额/涨跌幅统一 tabular-nums（金融产品的专业底座）
 *   ⑤ 微交互一致：hover 只改描边与极淡底色，禁用渐变/发光/位移
 * 安全：仅覆盖组件类，不用 * 通配；不动暖金 CTA、不动数智人层、不动业务色。
 * ========================================================================== */

/* ---------- ① 圆角阶梯 ---------- */
.panel, .card, .modal-content, .modal, .auth-modal-box, .auth-box,
.dropdown-menu, .popover, .toast, .dp-panel {
  border-radius: 20px !important;
}
.panel > .panel-header:first-child,
.card > .card-header:first-child { border-radius: 20px 20px 0 0 !important; }

.form-control, input.form-control, select.form-control, textarea.form-control,
.btn, .btn-sm, .btn-icon, .btn-secondary, .btn-outline,
.chip, .badge, .tag, .select-wrap {
  border-radius: 10px !important;
}

/* ---------- ② 描边统一 ---------- */
.panel, .card, .modal-content, .auth-modal-box,
.form-control, input.form-control, select.form-control, textarea.form-control,
.btn:not(.btn-primary):not(.lhr-cta):not(.lx-ask-go), .btn-sm:not(.btn-primary),
.btn-icon, .btn-secondary, .btn-outline, .chip, .badge {
  border-color: rgba(255, 255, 255, 0.09) !important;
}

/* ---------- ③ 数字等宽（金融专业底座）---------- */
.stock-price, .price, .dpv-metric-val, .lhp-val, .tabular,
[class*="price"], [class*="-chg"], [class*="change"], [class*="amount"],
[class*="score"], .ticker-item {
  font-variant-numeric: tabular-nums !important;
  font-feature-settings: "tnum" 1 !important;
}

/* ---------- ④ 微交互一致（只改描边 + 极淡底，禁渐变/发光/位移）---------- */
.panel:hover, .card:hover { border-color: rgba(255, 255, 255, 0.16) !important; }
.btn:not(.btn-primary):not(.lhr-cta):not(.lx-ask-go):hover,
.btn-icon:hover, .chip:hover {
  border-color: rgba(255, 255, 255, 0.18) !important;
  background: rgba(255, 255, 255, 0.045) !important;
}
.form-control:focus, input.form-control:focus, select.form-control:focus {
  border-color: rgba(240, 183, 94, 0.45) !important;
  outline: none !important;
}

/* ---------- ⑤ 焦点可见（a11y，暖金）---------- */
a:focus-visible, button:focus-visible, input:focus-visible,
select:focus-visible, [tabindex]:focus-visible {
  outline: 2px solid rgba(240, 183, 94, 0.7) !important;
  outline-offset: 2px !important;
}

/* ---------- ⑥ 滚动条统一（细、暗、无干扰）---------- */
#sidebar-nav::-webkit-scrollbar,
.tab-content::-webkit-scrollbar,
.panel-body::-webkit-scrollbar,
.modal::-webkit-scrollbar { width: 8px !important; height: 8px !important; }
#sidebar-nav::-webkit-scrollbar-thumb,
.tab-content::-webkit-scrollbar-thumb,
.panel-body::-webkit-scrollbar-thumb {
  background: rgba(255, 255, 255, 0.14) !important;
  border-radius: 999px !important;
  border: 2px solid transparent !important;
  background-clip: padding-box !important;
}
#sidebar-nav::-webkit-scrollbar-track,
.tab-content::-webkit-scrollbar-track { background: transparent !important; }

/* ---------- ⑦ 面板/卡片头部与内容分隔线统一 ---------- */
.panel-header, .card-header {
  border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important;
}

/* ---------- ⑧ 表格（金融数据可读性）---------- */
.data-table th, .data-table td,
table th, table td {
  border-bottom: 1px solid rgba(255, 255, 255, 0.055) !important;
}
.data-table th, table th {
  color: #8da0c4 !important;
  font-weight: 600 !important;
  font-size: 12px !important;
  letter-spacing: 0.03em !important;
}

/* ---------- ⑨ 空态/提示类统一（极简禁欲）---------- */
.empty, .empty-compact {
  color: #74849f !important;
}
.empty .empty-icon, .empty-compact svg {
  opacity: 0.5 !important;
}

/* ---------- ⑩ v1099b：数智人 hero 静止铁律（canvas 缩放与 img 边缘错位造成双脸叠影）---------- */
#lx-daily-hero canvas.is-live { transform: none !important; animation: none !important; }

/* ---------- ⑪ v1099b：等宽数字补漏（实测未覆盖类）---------- */
.cell-price, .index-card-change, .change-extra, .lx-dh-pick-pct,
.lx-dh-indices span, .cell-chg, .cell-change {
  font-variant-numeric: tabular-nums !important;
  font-feature-settings: "tnum" 1 !important;
}

/* ---------- ⑫ v1099c：wecom-panel 视觉归一（去亮蓝 #5a8cff 覆盖，纳入全站深色+暖金）---------- */
.wxd-hero::after { background: none !important; }
.wxd-hero {
  border-radius: 20px !important;
  border-color: rgba(240, 183, 94, 0.22) !important;
  background: linear-gradient(135deg, rgba(240, 183, 94, 0.10) 0%,
              rgba(240, 183, 94, 0.02) 58%, rgba(255, 255, 255, 0) 100%) !important;
}
.wxd-title em { color: rgba(240, 183, 94, 0.92) !important; }
.wxd-input:focus { border-color: rgba(240, 183, 94, 0.45) !important; }
select.wxd-input {
  background-image:
    linear-gradient(45deg, transparent 50%, rgba(255, 255, 255, 0.38) 50%),
    linear-gradient(135deg, rgba(255, 255, 255, 0.38) 50%, transparent 50%) !important;
  background-position: calc(100% - 16px) 16px, calc(100% - 11px) 16px !important;
  background-size: 5px 5px, 5px 5px !important;
  background-repeat: no-repeat !important;
}

/* ---------- ⑬ v1099d：wecom 主按钮亮蓝 → 暖金实底（唯一强调色纪律）---------- */
.wxd-btn-primary { background: #f0b75e !important; color: #1a1206 !important; }
.wxd-btn-primary:hover:not(:disabled) { background: #f5c476 !important; filter: none !important; }

/* ---------- ⑭ v1099d：面板标题禁止截断（risk-dashboard「风险评分/回撤分析」被裁）---------- */
.panel-header .title, .card-header .title {
  white-space: normal !important;
  overflow: visible !important;
  line-height: 1.35 !important;
}

/* ---------- ⑬ v1099d：wecom 主按钮亮蓝 → 暖金实底（唯一强调色纪律）---------- */
.wxd-btn-primary { background: #f0b75e !important; color: #1a1206 !important; }
.wxd-btn-primary:hover:not(:disabled) { background: #f5c476 !important; filter: none !important; }

/* ---------- ⑭ v1099d：面板标题禁止截断（risk-dashboard「风险评分/回撤分析」被裁）---------- */
.panel-header .title, .card-header .title {
  white-space: normal !important;
  overflow: visible !important;
  line-height: 1.35 !important;
}

/* ---------- ⑮ v1099e：加载占位质感（不改布局、零 CLS，仅透明度脉冲）---------- */
.dpv-loading, [class*="loading"]:not(.lhp-loading) {
  font-size: 12px !important;
  letter-spacing: 0.04em !important;
  color: rgba(255, 255, 255, 0.62) !important /* v1168: AA */;
  animation: lxLoadPulse 1.6s ease-in-out infinite !important;
}
@keyframes lxLoadPulse {
  0%, 100% { opacity: 0.72; /* v1168: 波谷抬升 */ }
  50%      { opacity: 1; /* v1168 */ }
}
@media (prefers-reduced-motion: reduce) {
  .dpv-loading, [class*="loading"]:not(.lhp-loading) { animation: none !important; }
}

/* ---------- ⑮ v1099e：加载占位质感（不改布局、零 CLS，仅透明度脉冲）---------- */
.dpv-loading, [class*="loading"]:not(.lhp-loading) {
  font-size: 12px !important;
  letter-spacing: 0.04em !important;
  color: rgba(255, 255, 255, 0.62) !important /* v1168: AA */;
  animation: lxLoadPulse 1.6s ease-in-out infinite !important;
}
@keyframes lxLoadPulse {
  0%, 100% { opacity: 0.72; /* v1168: 波谷抬升 */ }
  50%      { opacity: 1; /* v1168 */ }
}
@media (prefers-reduced-motion: reduce) {
  .dpv-loading, [class*="loading"]:not(.lhp-loading) { animation: none !important; }
}

/* ---------- ⑯ v1099f：侧边栏选中态与 ai-chat 蓝系归一（唯一强调色纪律）---------- */
#sidebar .sidebar-nav .nav-item.active::before { background: #f0b75e !important; }
#sidebar .sidebar-nav .nav-item.active { border-color: rgba(240, 183, 94, 0.32) !important; }
#sidebar .sidebar-nav .nav-item.active .icon,
#sidebar .sidebar-nav .nav-item.active svg { color: #f0b75e !important; }
#sidebar .sidebar-nav .nav-item.active .nav-text { color: #f2e8d5 !important; }
.nav-item[data-view="ai-chat"] .nav-text { color: inherit !important; }
.welcome-card { background: rgba(255, 255, 255, 0.03) !important; }
.welcome-card-icon { background: rgba(240, 183, 94, 0.10) !important; }
.lx-nl-suggest { background: rgba(240, 183, 94, 0.05) !important; }
.lx-nl-ai-badge { background: rgba(240, 183, 94, 0.12) !important; }
.btn.btn-send { background: #f0b75e !important; color: #1a1206 !important; border-color: transparent !important; }
.btn.btn-send:hover:not(:disabled) { background: #f5c476 !important; }

/* ---------- ⑯ v1099f：侧边栏选中态与 ai-chat 蓝系归一（唯一强调色纪律）---------- */
#sidebar .sidebar-nav .nav-item.active::before { background: #f0b75e !important; }
#sidebar .sidebar-nav .nav-item.active { border-color: rgba(240, 183, 94, 0.32) !important; }
#sidebar .sidebar-nav .nav-item.active .icon,
#sidebar .sidebar-nav .nav-item.active svg { color: #f0b75e !important; }
#sidebar .sidebar-nav .nav-item.active .nav-text { color: #f2e8d5 !important; }
.nav-item[data-view="ai-chat"] .nav-text { color: inherit !important; }
.welcome-card { background: rgba(255, 255, 255, 0.03) !important; }
.welcome-card-icon { background: rgba(240, 183, 94, 0.10) !important; }
.lx-nl-suggest { background: rgba(240, 183, 94, 0.05) !important; }
.lx-nl-ai-badge { background: rgba(240, 183, 94, 0.12) !important; }
.btn.btn-send { background: #f0b75e !important; color: #1a1206 !important; border-color: transparent !important; }
.btn.btn-send:hover:not(:disabled) { background: #f5c476 !important; }

/* ---------- ⑰ v1099g：侧边栏选中项文本蓝底清除（rgb(46,106,212) 胶囊底）---------- */
#sidebar .sidebar-nav .nav-item.active .nav-text {
  background: none !important;
  color: #f2e8d5 !important;
}

/* ---------- ⑰ v1099g：侧边栏选中项文本蓝底清除（rgb(46,106,212) 胶囊底）---------- */
#sidebar .sidebar-nav .nav-item.active .nav-text {
  background: none !important;
  color: #f2e8d5 !important;
}

/* ---------- ⑱ v1099h：亮蓝清扫最后一轮（品牌 Logo 保留待老板拍板）----------
 * 原则：文字走中性石板灰 #94a3b8，徽章走暖金实底，选中态走暖白+暖金。
 * 顺序关键：通用规则在前，active 特例在后，确保选中态不被通用规则压掉。 */
.nav-badge, .daily-nav-badge, .evo-nav-badge {
  background: #f0b75e !important; color: #1a1206 !important;
}
.live-badge { color: #f0b75e !important; }
.skip-link { background: #f0b75e !important; color: #1a1206 !important; }
#sidebar .sidebar-nav .nav-item,
#sidebar .sidebar-nav .nav-item .nav-text,
#sidebar .sidebar-nav .nav-item svg,
#sidebar .sidebar-nav .nav-item .icon { color: #94a3b8 !important; }
.market-status-text, .lx-ns-row { color: #8da0c4 !important; }
/* active 特例（必须在通用规则之后） */
#sidebar .sidebar-nav .nav-item.active,
#sidebar .sidebar-nav .nav-item.active .nav-text { color: #f2e8d5 !important; }
#sidebar .sidebar-nav .nav-item.active .icon,
#sidebar .sidebar-nav .nav-item.active svg { color: #f0b75e !important; }

/* ---------- ⑱ v1099h：亮蓝清扫最后一轮（品牌 Logo 保留待老板拍板）----------
 * 原则：文字走中性石板灰 #94a3b8，徽章走暖金实底，选中态走暖白+暖金。
 * 顺序关键：通用规则在前，active 特例在后，确保选中态不被通用规则压掉。 */
.nav-badge, .daily-nav-badge, .evo-nav-badge {
  background: #f0b75e !important; color: #1a1206 !important;
}
.live-badge { color: #f0b75e !important; }
.skip-link { background: #f0b75e !important; color: #1a1206 !important; }
#sidebar .sidebar-nav .nav-item,
#sidebar .sidebar-nav .nav-item .nav-text,
#sidebar .sidebar-nav .nav-item svg,
#sidebar .sidebar-nav .nav-item .icon { color: #94a3b8 !important; }
.market-status-text, .lx-ns-row { color: #8da0c4 !important; }
/* active 特例（必须在通用规则之后） */
#sidebar .sidebar-nav .nav-item.active,
#sidebar .sidebar-nav .nav-item.active .nav-text { color: #f2e8d5 !important; }
#sidebar .sidebar-nav .nav-item.active .icon,
#sidebar .sidebar-nav .nav-item.active svg { color: #f0b75e !important; }

/* ---------- ⑲ v1099i：高特异性蓝色堡垒清扫（等同/超过源选择器，平局靠后加载取胜）----------
 * 只打「亮蓝实色」（rgb 蓝分量远超红）；#8da0c4 / #f6f9ff 一类中性淡蓝灰属正常中性色，保留。 */
#sidebar .nav-badge, .sidebar .nav-badge, .sidebar-nav .nav-badge,
.nav-item .nav-badge, .nav-badge.daily-nav-badge, .nav-badge.evo-nav-badge {
  background: #f0b75e !important; color: #1a1206 !important;
  border-color: transparent !important;
}
#sidebar .live-badge, .live-badge {
  color: #f0b75e !important; border-color: rgba(240, 183, 94, 0.32) !important;
  background: rgba(240, 183, 94, 0.10) !important;
}
.lx-nl-suggest { border-color: rgba(240, 183, 94, 0.30) !important; }
.lx-nl-suggest-label, .lx-nl-ai-badge { color: #f0b75e !important; }
.ai-insight-btn.show, .ai-insight-btn {
  color: #f0b75e !important; border-color: rgba(240, 183, 94, 0.30) !important;
  background: rgba(240, 183, 94, 0.08) !important;
}
.btn.btn-tab.active, .btn-tab.active {
  color: #1a1206 !important; background: #f0b75e !important;
  border-color: transparent !important;
}
#lx-nav-stat .lx-ns-row b, #lx-nav-stat .lx-ns-foot { color: #e8eef9 !important; }

/* ---------- ⑲ v1099i：高特异性蓝色堡垒清扫（等同/超过源选择器，平局靠后加载取胜）----------
 * 只打「亮蓝实色」（rgb 蓝分量远超红）；#8da0c4 / #f6f9ff 一类中性淡蓝灰属正常中性色，保留。 */
#sidebar .nav-badge, .sidebar .nav-badge, .sidebar-nav .nav-badge,
.nav-item .nav-badge, .nav-badge.daily-nav-badge, .nav-badge.evo-nav-badge {
  background: #f0b75e !important; color: #1a1206 !important;
  border-color: transparent !important;
}
#sidebar .live-badge, .live-badge {
  color: #f0b75e !important; border-color: rgba(240, 183, 94, 0.32) !important;
  background: rgba(240, 183, 94, 0.10) !important;
}
.lx-nl-suggest { border-color: rgba(240, 183, 94, 0.30) !important; }
.lx-nl-suggest-label, .lx-nl-ai-badge { color: #f0b75e !important; }
.ai-insight-btn.show, .ai-insight-btn {
  color: #f0b75e !important; border-color: rgba(240, 183, 94, 0.30) !important;
  background: rgba(240, 183, 94, 0.08) !important;
}
.btn.btn-tab.active, .btn-tab.active {
  color: #1a1206 !important; background: #f0b75e !important;
  border-color: transparent !important;
}
#lx-nav-stat .lx-ns-row b, #lx-nav-stat .lx-ns-foot { color: #e8eef9 !important; }

/* ---------- ⑳ v1099j：精选榜与对话态亮蓝收尾（Logo 待拍板保留）---------- */
.dp-badge {
  color: #f0b75e !important; background: rgba(240, 183, 94, 0.10) !important;
  border-color: rgba(240, 183, 94, 0.28) !important;
}
.dp-btn.dp-btn-primary, .dp-btn-primary, .dp-btn.dp-refresh, .dp-btn-primary.dp-refresh {
  background: #f0b75e !important; color: #1a1206 !important; border-color: transparent !important;
}
.dp-btn.dp-btn-primary:hover:not(:disabled) { background: #f5c476 !important; }
.lx-nl-ai-badge { border-color: rgba(240, 183, 94, 0.30) !important; }
.template-tag { color: #f0b75e !important; }
#sidebar svg, #sidebar .sidebar-nav svg { color: #94a3b8 !important; }
#sidebar .sidebar-nav .nav-item.active svg,
#sidebar .sidebar-nav .nav-item.active .icon { color: #f0b75e !important; }

/* ---------- ⑳ v1099j：精选榜与对话态亮蓝收尾（Logo 待拍板保留）---------- */
.dp-badge {
  color: #f0b75e !important; background: rgba(240, 183, 94, 0.10) !important;
  border-color: rgba(240, 183, 94, 0.28) !important;
}
.dp-btn.dp-btn-primary, .dp-btn-primary, .dp-btn.dp-refresh, .dp-btn-primary.dp-refresh {
  background: #f0b75e !important; color: #1a1206 !important; border-color: transparent !important;
}
.dp-btn.dp-btn-primary:hover:not(:disabled) { background: #f5c476 !important; }
.lx-nl-ai-badge { border-color: rgba(240, 183, 94, 0.30) !important; }
.template-tag { color: #f0b75e !important; }
#sidebar svg, #sidebar .sidebar-nav svg { color: #94a3b8 !important; }
#sidebar .sidebar-nav .nav-item.active svg,
#sidebar .sidebar-nav .nav-item.active .icon { color: #f0b75e !important; }

/* ---------- ㉑ v1099k：svg 图标亮蓝中性化（active 保底暖金在最后）---------- */
body svg, svg { color: #94a3b8 !important; }
body svg[data-icon="ai"], body .icon, body [class*="icon"]:not([class*="icon-btn"]) { color: #94a3b8 !important; }
#sidebar .sidebar-nav .nav-item.active svg,
#sidebar .sidebar-nav .nav-item.active .icon { color: #f0b75e !important; }
.lx-nl-chip { color: #e8eef9 !important; }

/* ---------- ㉑ v1099k：svg 图标亮蓝中性化（active 保底暖金在最后）---------- */
body svg, svg { color: #94a3b8 !important; }
body svg[data-icon="ai"], body .icon, body [class*="icon"]:not([class*="icon-btn"]) { color: #94a3b8 !important; }
#sidebar .sidebar-nav .nav-item.active svg,
#sidebar .sidebar-nav .nav-item.active .icon { color: #f0b75e !important; }
.lx-nl-chip { color: #e8eef9 !important; }

/* ==========================================================================
   ㉒ v1099n — 全系统视觉深度重修（首页专项）
   实测依据：Playwright 量化体检 home_D/home_M + 祖先链 + elementFromPoint 命中测试
   ========================================================================== */

/* ---------- A. 【P0】底部安全区 —— 移动端 CTA 被固定底栏吞点击 ----------
   实测：nav#bottom-nav fixed z=120 rect=[0,760,390,84]；
        #main-content rect=[0,66,390,784] overflow:auto，但 body/content 均无 padding-bottom；
        hero CTA button.lhr-cta rect=[23,746,344,40] → 下缘 786 落在 nav 760..844 内；
        elementFromPoint(195,760) 命中 nav#bottom-nav 而非按钮 → 26px(65%)点击区被吞。
   解法：给滚动容器预留 底栏84 + 推荐卡28 + 呼吸8 = 124px。                        */
@media (max-width: 900px) {
  #main-content.content {
    padding-bottom: calc(124px + env(safe-area-inset-bottom, 0px)) !important;
  }
}
/* 桌面：nav 隐藏，但推荐卡 #lx-reco-card 仍 fixed z=9000 rect h=28 → 预留 48px */
@media (min-width: 901px) {
  #main-content.content {
    padding-bottom: 48px !important;
  }
}

/* ---------- B. 【P1】字号阶梯收敛 15 档 → 8 档 (12/13/14/15/17/19/22/27) ----------
   实测非常规档：11 / 11.5 / 12.5 / 13.5 / 14.5 / 19 / 22 / 27（共 49 个元素 <12px） */

/* 11 / 11.5 → 12（消灭可读风险） */
#lx-dh-state.lx-dh-state.strong,
.dpv-metric-label,
.lx-evo-txt,
.lx-dh-chip,
.lhp-rec, .lhp-reason, #lx-guanxuan-arrow,
.lhp-code, .lhp-cred, .lhp-lbl, .lhp-minus, .lhp-plus, .lx-lock-row,
.lx-ns-foot {
  font-size: 12px !important;
}

/* 12.5 → 13 */
.lx-plb-btn, .lhp-scan {
  font-size: 13px !important;
}

/* 13.5 → 14 */
.lx-ask-go, .dpv-review,
.lhp-chg, .lhp-chg.down, .lhp-chg.flat, .lhp-chg.up {
  font-size: 14px !important;
}

/* 14.5 → 15 */
.lhp-name, #lx-compliance-disclaimer {
  font-size: 15px !important;
}

/* 核心商业化 CTA 强化：桌面/移动两档归一到 15/700，杜绝遮挡时视觉过弱 */
button.lhr-cta {
  font-size: 15px !important;
  font-weight: 700 !important;
  letter-spacing: .015em !important;
}

/* ---------- C. 【P1】字重归一 13 种 → 4 种 (400/500/600/700) ----------
   实测非常规字重：620/640/650/660/680/720/760/780/800 */

/* 620/640/650 → 600 */
.lx-lock-row, .lx-nl-txt, .lhp-pos, .lx-plb-btn {
  font-weight: 600 !important;
}

/* 660/680/720/760/780/800 → 700 */
.lhp-val, .lhp-price, .lhp-price.down, .lhp-price.flat, .lhp-price.up,
.lhp-chg, .lhp-chg.down, .lhp-chg.flat, .lhp-chg.up,
.lhp-title, .lhp-rank, .lhp-rank.r1,
h2.dp-head-t {
  font-weight: 700 !important;
}

/* ---------- D. 【P1】行情条右侧防穿透 ----------
   实测：ticker sticky z=50 溢出到 x=1829，AI解盘按钮 fixed z=1000 rect x=287..378(移动) /
   x=1177..1268(桌面) 压在 ticker 之上。给按钮兜底不透明底，杜绝跑马灯文字穿透。      */
button.ai-insight-btn {
  background-color: rgba(10, 14, 22, 0.94) !important;
  -webkit-backdrop-filter: blur(8px) !important;
  backdrop-filter: blur(8px) !important;
}

/* ---------- E. 【P1】合规声明可读性（金融监管必备，不得被浮层淹没）---------- */
#lx-compliance-disclaimer {
  line-height: 1.62 !important;
  letter-spacing: .01em !important;
  font-variant-numeric: tabular-nums !important;
}

/* ==========================================================================
   ㉓ v1099o — 首页 CTA 可达性根治 + 数字人双层同步
   实测依据：hero 树量化 / elementFromPoint 命中测试 / 特异性比对
   ========================================================================== */

/* ---------- A.【P0】移动端 hero 瘦身 —— 把核心 CTA 抬出底栏遮挡区 ----------
   实测（390×844）：CTA rect=[23,748,344,40]；nav#bottom-nav fixed y=760 h=84；
                   #lx-reco-card fixed y=732 h=28。
                   hitTest(CTA中心) = div.bottom-nav-item  ← 点击被吞（65%区域不可达）
   目标：CTA 下缘 ≤ 728（给 reco-card 732 留 ≥4px，给 nav 760 留 ≥32px）
   压缩预算：avatar 147→108(-39) heroPT 18→12(-6) innerGap 9→6(-3)
             kickerMB 4→2(-2) titleMT 5→2(-3) askMT 10→4(-6)
             formPT/PB 5→3(-4) chipsMT 7→3(-4) ctaMT 7→3(-4)  ≈ -71
   ------------------------------------------------------------------------ */
@media (max-width: 768px) {
  #lx-daily-hero.lx-daily-hero {
    padding-top: 12px !important;
    padding-bottom: 12px !important;
  }
  #lx-daily-hero .lx-dh-inner { gap: 6px !important; }
  #lx-daily-hero .lx-dh-avatar {
    height: 108px !important;
    max-height: 108px !important;
    min-height: 108px !important;
  }
  /* 等比缩放，杜绝压变形 */
  #lx-daily-hero .lx-dh-avatar > img.lx-dh-full-img,
  #lx-daily-hero .lx-dh-avatar > canvas#lx-hero-canvas {
    width: 100% !important;
    height: 100% !important;
    object-fit: cover !important;
    object-position: 50% 22% !important;
  }
  #lx-daily-hero .lx-dh-kicker { margin-bottom: 2px !important; }
  #lx-daily-hero .lx-dh-title { margin-top: 2px !important; }
  #lx-daily-hero #lx-ask { margin-top: 4px !important; }
  #lx-daily-hero .lx-ask-form { padding-top: 3px !important; padding-bottom: 3px !important; }
  #lx-daily-hero .lx-ask-chips { margin-top: 3px !important; }
  #lx-daily-hero .lhr-cta-row { margin-top: 3px !important; }
}

/* ---------- B.【P0】CTA 字号/字重 —— 同特异性对抗源规则 ----------
   源：lx-home-reborn.css:790,801  `#lx-daily-hero .lhr-cta{font-size:13.5px!important}`
   特异性 0,2,0 > 我上一版 button.lhr-cta(0,1,1) → 移动端 13.5px 未被归一（实测确认）
   解法：使用与源完全相同的选择器，靠后加载取胜。                            */
#lx-daily-hero .lhr-cta {
  font-size: 15px !important;
  font-weight: 700 !important;
  letter-spacing: .015em !important;
}

/* ---------- C.【P1】数字人双层动画同步 —— 根治边缘蠕动 ----------
   实测（1280×800）：canvas#lx-hero-canvas op=1 cls=is-live 已绘制，
                    底层 img.lx-dh-full-img 仍在跑 animation: lx-hero-breathe, lx-hero-sway；
                    两层同 rect [324,360,222,272]，canvas 静止而 img 抖动
                    → 人像边缘从 canvas 透明边界渗出"蠕动感"（双脸叠影的根）
   依据 lx-hero-living.js:17 `if (innerWidth <= 768) return`：
                    桌面必走 canvas 活体，故 img 退化为纯兜底层，应彻底静止（符合 hero 静止铁律） */
@media (min-width: 769px) {
  #lx-daily-hero .lx-dh-avatar > img.lx-dh-full-img {
    animation: none !important;
    transform: none !important;
  }
}

/* ==========================================================================
   ㉔ v1099p — 全站字号/字重归一（28 视图扫描驱动）
   实测：半档字号 14.5×375 / 11.5×78 / 12.5×36 / 13.5×13；<12px 共 110 个
        最恶劣者 #lx-home-picks .lhp-lbl = 10.5px（lx-home-reborn.css:357）
        字重 680×68 / 800×42 / 640×38 / 620×28 / 660×20 / 900×20 / 760×12
   目标：消灭全部半档（.5px）与 <12px；字重收敛到 400/500/600/700
   ========================================================================== */

/* ---------- 10.5 / 11 / 11.5 → 12（可读性红线） ---------- */
#lx-home-picks .lhp-lbl,
#lx-home-picks .lhp-plus,
#lx-home-picks .lhp-minus,
#lx-home-picks .lhp-reason,
#lx-home-picks .lhp-code,
#lx-home-picks .lhp-weak,
#lx-daily-hero .lx-dh-chip,
#lx-daily-hero .lx-evo-badge,
#lx-daily-hero .lx-dh-pick-name i,
#lx-daily-hero .lx-dh-adopt-hint,
#tab-daily-picks .dpv-metric-label {
  font-size: 12px !important;
}

/* ---------- 12.5 → 13 ---------- */
#lx-home-picks .lhp-scan,
#lx-home-picks .lhp-scan b,
#lx-daily-hero .lx-dh-chip b {
  font-size: 13px !important;
}

/* ---------- 13.5 → 14 ---------- */
#lx-home-picks .lhp-chg {
  font-size: 14px !important;
}

/* ---------- 14.5 → 15 ---------- */
#lx-home-picks .lhp-name {
  font-size: 15px !important;
}

/* ---------- 620/640/650 → 600 ---------- */
#lx-home-picks .lhp-pos,
#lx-nav-login .lx-nl-txt {
  font-weight: 600 !important;
}

/* ---------- 660/680 → 700 ---------- */
#lx-home-picks .lhp-chg,
#lx-home-picks .lhp-val,
#lx-home-picks .lhp-scan b,
#lx-daily-hero .lx-dh-pick-name,
#lx-nav-stat .lx-ns-row b {
  font-weight: 700 !important;
}

/* ---------- 760/780/800/900 → 700 ---------- */
#lx-home-picks .lhp-price,
#lx-home-picks .lhp-title {
  font-weight: 700 !important;
}

/* ==========================================================================
   ㉕ v1099q — 全站字号/字重收口（父级归属已逐一取证）
   实测归属：14.5px ×13/视图 = footer#lx-footer（a + span）
             11px        = #lx-nav-stat .lx-ns-foot「持续自学习中」
             w640        = #lx-nav-stat .lx-ns-title > span「琍璇进化引擎」
             w800        = .lhp-rank 排名徽标 / .evo-kpi-val / .v.good / .dashboard-title
             w900 ×20    = factors-view 的 strong
             12.5px ×28  = evolution .eb-* 七连（name/score/price/stop/pos/target/verif）
   说明：16/18/20/24/26/28/32 属合法展示档位，不予改动（此前标尺过窄，已修正判据）
   ========================================================================== */

/* ---------- 页脚 14.5 → 14（页脚保持克制，不放大） ---------- */
footer#lx-footer,
footer#lx-footer a,
footer#lx-footer span {
  font-size: 14px !important;
}

/* ---------- 侧栏底部 11 → 12（消灭 <12px） ---------- */
#lx-nav-stat .lx-ns-foot {
  font-size: 12px !important;
}

/* ---------- evolution .eb-* 12.5 → 13 ---------- */
.eb-name, .eb-score, .eb-price, .eb-stop, .eb-pos, .eb-target, .eb-verif {
  font-size: 13px !important;
}

/* ---------- 字重 640 → 600 ---------- */
#lx-nav-stat .lx-ns-title span {
  font-weight: 600 !important;
}

/* ---------- 字重 800/900 → 700 ---------- */
.lhp-rank, .lhp-rank.r1,
.dashboard-title,
.evo-kpi-val,
.v.good, .v.neutral,
strong {
  font-weight: 700 !important;
}

/* ==========================================================================
   ㉖ v1099s — 全站 <12px 清零收尾
   实测残留（移动端 more 视图）：
     #lx-guanxuan-header  「☑ 琍璇上线公告」  11.5px
     .lhp-rec             「精选 T+5 命中 33.6% ·」 11.5px
     .lhp-cred            「琍璇决策 67.5% · 165,0xx」 11.5px
   ========================================================================== */
#lx-guanxuan-header, #lx-guanxuan-header span {
  font-size: 12px !important;
}
.lhp-rec, .lhp-cred {
  font-size: 12px !important;
}

/* ==========================================================================
   ㉗ v1099t — 残留字重/字号清零（同源高特异性，一次打穿）
   教训复现：v1099s 用 `.lhp-rec`（0,1,0）未能覆盖源 `#lx-home-picks .lhp-rec`（0,2,0）
            → 本包一律使用与源同级或更高的选择器，靠后加载取胜
   ========================================================================== */

/* ---------- 首页精选：字号 11.5/12.5 → 12/13 ---------- */
#lx-home-picks .lhp-rec,
#lx-home-picks .lhp-cred {
  font-size: 12px !important;
}
#lx-home-picks .lx-plb-btn {
  font-size: 13px !important;
}

/* ---------- 字重 650 → 600 ---------- */
#lx-home-picks .lx-lock-mask span,
#lx-home-picks .lx-plb-btn {
  font-weight: 600 !important;
}

/* ---------- 字重 780 → 700（hero 主标题） ---------- */
#lx-daily-hero .lx-dh-title,
#lx-daily-hero .lx-dh-title span {
  font-weight: 700 !important;
}

/* ---------- 字重 800 → 700 ---------- */
#lx-home-picks .lhp-rank,
#lx-home-picks .lhp-rank.r1,
td.cell-name .stock-name,
.cell-name .stock-name,
.wxd-title,
.wxd-title em,
.wxd-step-n,
.algo-kpi-val {
  font-weight: 700 !important;
}

/* ==========================================================================
   ㉘ v1099u — 字重归零收尾（末 2 处）
   .v.bad w800（evolution 统计格）/ svg text w800（dashboard mini-gauge）
   ========================================================================== */
.v.bad, .v.good, .v.neutral,
.mini-gauge text, .mini-gauge svg text {
  font-weight: 700 !important;
}

/* ==========================================================================
   ㉙ v1099v — ai-chat 欢迎卡拦腰切字根治（截图实锤）
   症状：卡片 overflow:hidden 高度不足，desc 第二行被硬切一半；
        且 desc(16px) 与 title(16px) 同字号，层级混乱。
   修法：desc 降级 14px + line-clamp 2 优雅截断（任何分辨率不再出现切半文字）
   ========================================================================== */
button.welcome-card .welcome-card-desc {
  display: -webkit-box !important;
  -webkit-line-clamp: 2 !important;
  -webkit-box-orient: vertical !important;
  overflow: hidden !important;
  font-size: 14px !important;
  line-height: 1.55 !important;
}
button.welcome-card .welcome-card-title {
  line-height: 1.35 !important;
}

/* ==========================================================================
   ㉚ v1099w — 移动端截断/不可达根治（截断扫描器实证）
   1) main.main(760,overflow:hidden) 裁掉 #main-content(784) 底部 24px
      → 滚到底后合规免责声明停在 y=844、insideMain=false，金融合规文字永久不可达
      修法：main 改 flex 列，#main-content 取剩余空间并内部自滚
   2) div.card.stat-card 内容被切 15~34px（risk-dashboard / system-view）
   3) div.wxd-hero 内容被切 32px（wecom-panel）
   4) section#lx-daily-hero 内容被切 18px（daily-picks / more）→ 头像再收 12px 让位
   ========================================================================== */
@media (max-width: 768px) {
  main.main {
    display: flex !important;
    flex-direction: column !important;
  }
  main.main #main-content.content {
    flex: 1 1 auto !important;
    min-height: 0 !important;
    height: auto !important;
    max-height: none !important;
  }
  /* stat-card / wxd-hero 给足高度，杜绝硬切字 */
  .card.stat-card {
    height: auto !important;
    min-height: 150px !important;
  }
  .wxd-hero {
    height: auto !important;
    min-height: 352px !important;
  }
  /* hero 再收 12px，让被切的 18px 回到盒内（CTA 同时获得更大安全余量） */
  #lx-daily-hero .lx-dh-avatar {
    height: 96px !important;
    max-height: 96px !important;
    min-height: 96px !important;
  }
  #lx-daily-hero .lx-dh-inner { gap: 5px !important; }
}

/* =========================================================================
 * ㉛ v1099x · 移动端「横向截断」根治（ovx2.py 深层取证，零肉眼猜测）
 * -------------------------------------------------------------------------
 * 取证结论（390×844，clipping = overflow:hidden 且 scrollW > clientW + 2）：
 *   ① div.card.stat-card   clientW=136 scrollW=170 / 151
 *      父 div.stat-cards 仍是 grid-template-columns:138px 138px（宽 288）
 *      → 内容盒 = 138 - 20*2 = 98px，装不下 32px 的 17:12:58 / 903.9GB
 *      ⚠️ risk-dashboard 还有个嵌套 .stat-cards 仅 119px → 列被压到 53.5px（丢 99px）
 *   ② div.wxd-hero         clientW=304 scrollW=336
 *      源 .wxd-hero-txt{flex:1 1 420px;min-width:300px}（wecom.css:15）
 *      → 内容盒只有 304 - 18*2 = 268px，min-width:300 必爆 32px
 *   ③ section#lx-daily-hero clientW=388 scrollW=406
 *      移动端 .lx-dh-inner{flex-direction:column;align-items:center}（nav-refined.css:1617）
 *      + .lx-dh-body{max-width:none;width:auto}（lx-home-reborn.css:663-664）
 *      → body 取 max-content 384px，超出 344px 内容盒；胶囊/chips 跟着溢出
 *   ④ button.btn-icon      clientW=34 scrollW=38（4px）
 *      padding:10px + svg 23px > 34px 按钮盒 → 图标恒被切 4px
 *   ⑤ wecom 表格 td.c-l / td.c-c  nowrap 在 53/96px 窄列被切
 * 修法一律「给容器真实宽度 + 让内容可缩可换」，不靠裁掉内容（金融数字不可裁）。
 * ========================================================================== */
@media (max-width: 768px) {

  /* ① stat-card：列宽改 RAM 模式（窄容器自动降为单列），数字可缩可换 */
  .stat-cards {
    display: grid !important;
    grid-template-columns: repeat(auto-fit, minmax(min(132px, 100%), 1fr)) !important;
  }
  .card.stat-card {
    min-width: 0 !important;
    padding: 14px 12px !important;
  }
  .card.stat-card .card-value {
    font-size: 22px !important;
    line-height: 1.15 !important;
    white-space: normal !important;
    overflow-wrap: anywhere !important;
    letter-spacing: -0.01em !important;
  }
  .card.stat-card .card-label {
    font-size: 12px !important;
    white-space: normal !important;
    overflow-wrap: anywhere !important;
  }

  /* ② wxd-hero：拆掉 300px 硬下限，两段各占整行 */
  .wxd-hero { padding: 18px 16px !important; gap: 14px !important; }
  .wxd-hero-txt,
  .wxd-steps {
    flex: 1 1 100% !important;
    min-width: 0 !important;
    max-width: 100% !important;
  }

  /* ③ daily-hero：文案列回到 100% 内容盒，行容器允许换行 */
  #lx-daily-hero .lx-dh-body {
    width: 100% !important;
    max-width: 100% !important;
    box-sizing: border-box !important;
  }
  #lx-daily-hero .lx-evo-row,
  #lx-daily-hero .lx-dh-indices,
  #lx-daily-hero .lx-dh-chips,
  #lx-daily-hero .lhr-cta-row {
    max-width: 100% !important;
    flex-wrap: wrap !important;
  }
  #lx-daily-hero .lx-evo-badge,
  #lx-daily-hero .lx-dh-chip {
    max-width: 100% !important;
    flex: 0 1 auto !important;
  }

  /* ④ 图标按钮：图标进盒，不再被切边 */
  .btn-icon,
  button.btn-icon { padding: 8px !important; }
  .btn-icon svg,
  button.btn-icon svg { width: 18px !important; height: 18px !important; }

  /* ⑤ 窄列表格：允许换行，数字不丢 */
  td.c-l, td.c-c, td.c-r {
    white-space: normal !important;
    overflow-wrap: anywhere !important;
  }
}

/* =========================================================================
 * ㉜ v1099y · 桌面端「最终优化 + 精致感/专业感」收官
 * -------------------------------------------------------------------------
 * 依据（全站 28 视图双端回归 reg_x.jsonl + 精致感探针 polish_probe.jsonl，零肉眼）
 *
 * 【P0-① 桌面图标被裁 · 9 处，真缺陷】
 *   button.btn.btn-icon   clientW=32 scrollW=43（丢 11）×7
 *       视图：bigscreen / dashboard / fund-flow / more / stock-scanner / system-view / watchlist
 *   button#sd-watch.btn.btn-icon  32→37（丢 5，detail）
 *   button.btn-send               48→55（丢 7，ai-chat）
 *   根因：padding:10px + svg 23px = 43 > 32 按钮盒（v1099x 只在 ≤768px 修过）
 *   修法：padding 6px + svg 18px = 30 ≤ 32，图标完整进盒
 *
 * 【P1-② 数字未等宽 · 专业感直接杀手】
 *   tabular-nums 覆盖率实测（桌面）：daily-picks 98% / risk-dashboard 86% /
 *   system-view 80% / watchlist 77% / ai-chat 71% / stock-scanner 71% /
 *   factors-view 57% / dashboard 53% / more 53% / paper-trading 0%
 *   → 同一屏内数字列宽参差，机构用户一眼看出「不专业」
 *   修法：表格单元格 + 全部数字语义类强制 tabular-nums
 *
 * 【P1-③ 桌面滚动条粗糙】默认 15px 实心滚动条破坏深色极简质感
 *   修法：10px 细条 + 透明轨道 + 圆角 thumb + hover 提亮（仅 ≥1025px）
 *
 * 【P2-④ 桌面卡片缺少 hover 层】冷色界面需要极轻的指针反馈
 *   修法：border-color 微亮 + 160ms 过渡（hover:hover 才生效，不误触移动端）
 *
 * 【P2-⑤ 移动端图标按钮触摸目标 32px < 44px 建议值】
 *   修法：.btn-icon 提到 36×36（克制，不动 .btn 常规按钮以免布局连锁）
 * ========================================================================== */

/* ── ② 数字等宽对齐（金融产品专业感地基，双端同生效） ───────────────────── */
td, th,
.card-value, .kpi-num, .metric-num, .evo-kpi-num, .algo-kpi-num, .stat-num,
.num, .val, .value, .price, .pct, .change, .stock-price,
[class*="-value"], [class*="-val"], [class*="-num"],
[class*="price"], [class*="pct"], [class*="change"] {
  font-variant-numeric: tabular-nums !important;
}

/* ── ① 桌面图标被裁根治（≥769px，与 v1099x 的 ≤768px 规则互补） ────────── */
@media (min-width: 769px) {
  .btn-icon,
  button.btn-icon { padding: 6px !important; }
  .btn-icon svg,
  button.btn-icon svg { width: 18px !important; height: 18px !important; }
  .btn-send { padding: 6px 10px !important; }
  .btn-send svg { width: 18px !important; height: 18px !important; }
}

/* ── ③ 桌面滚动条精修 ────────────────────────────────────────────────── */
@media (min-width: 1025px) {
  * { scrollbar-width: thin; scrollbar-color: rgba(150,170,200,.28) transparent; }
  ::-webkit-scrollbar { width: 10px; height: 10px; }
  ::-webkit-scrollbar-track { background: transparent; }
  ::-webkit-scrollbar-thumb {
    background: rgba(150, 170, 200, .24);
    border-radius: 999px;
    border: 3px solid transparent;
    background-clip: content-box;
  }
  ::-webkit-scrollbar-thumb:hover { background: rgba(150, 170, 200, .42); background-clip: content-box; }
}

/* ── ④ 桌面卡片 hover 微反馈（仅真指针设备） ──────────────────────────── */
@media (min-width: 1025px) and (hover: hover) {
  .card, .stat-card, .wxd-card, .kpi-card, .metric-card {
    transition: border-color .16s ease, background-color .16s ease;
  }
  .card:hover, .stat-card:hover, .wxd-card:hover, .kpi-card:hover, .metric-card:hover {
    border-color: rgba(150, 170, 200, .24) !important;
    background-color: rgba(255, 255, 255, .014) !important;
  }
}

/* ── ⑤ 移动端图标按钮触摸目标 32 → 36px ──────────────────────────────── */
@media (max-width: 768px) {
  .btn-icon,
  button.btn-icon {
    min-width: 36px !important;
    min-height: 36px !important;
  }
}

/* =========================================================================
 * ㉝ v1099z · 数字等宽 100% 收敛 + 移动端触摸目标
 * -------------------------------------------------------------------------
 * 【为什么 v1099y 的类选择器只把 tabular 从 74% 抬到 76%】
 *   tab_probe.py 实证：未等宽的元素是 **无 class 的裸 span / b / div**
 *   （dashboard 缺 span×4 b×2 div×2，stock-scanner 缺 b×3，daily-picks 缺 b×2 …）
 *   加上 span.market-status-time / div.msg-time —— 类选择器在原理上命中不了裸标签。
 *   → 唯一正解：根级继承（font-variant-numeric 只影响数字字宽，对字形/字高零副作用）
 *
 * 【P2 移动端触摸目标】实测 button.btn 在 390 宽下为 32×32，低于 44px 建议值；
 *   只抬 min-height（不动 width），避免横向布局连锁。
 * ========================================================================== */

/* ── 数字等宽：根级继承，覆盖全部裸标签数字 ───────────────────────────── */
html, body { font-variant-numeric: tabular-nums !important; }

/* ── 移动端触摸目标 32 → 36（仅抬高度，不动宽度） ─────────────────────── */
@media (max-width: 768px) {
  .btn,
  button.btn { min-height: 36px !important; }
}

/* =========================================================================
 * ㉞ v1100 · 移动端首屏 CTA 回归修复（v1099w 引入，本版根治）
 * -------------------------------------------------------------------------
 * 【现象】390×844 首页核心 CTA 首屏不可点
 *   初始 elementFromPoint(195,685) → main.main（CTA 被裁，自命中 false）
 *   真实滚轮 150px 后 ctaY 664→514，自命中才转 true
 *   → 商业化第一动作掉出首屏，必须滚一下才够得着。
 *
 * 【根因（kids.py 实证，非猜测）】
 *   main.main        rect [0,0,390,760]  padding-bottom = 116px
 *     ├ #ticker         0..30
 *     ├ header.header  30..66
 *     └ #main-content  66..644（clientH 578，scrollH 1577）
 *   v1099w 把 main 改成 flex column、#main-content 取 flex:1 1 auto 之后，
 *   它只能拿到「内容盒」= 760 − 116(padding-bottom) − 66 = 578，
 *   可视区被压成 66..644；而 CTA 在 664 —— 差 20px 恰好掉出首屏。
 *
 * 【关键澄清】这 116px 是**纯死区，不是安全区**
 *   nav#bottom-nav 是 fixed，实测 y=760..844 —— 正好接在 main.main 底边(760)之外，
 *   与 main 内容**零重叠**；116px padding 完全没起到让位作用，只是白扔了 116px。
 *   #lx-reco-card 在 y=732..760，也在 main 盒子之外。
 *
 * 【修法】收回死区，#main-content 可视区 578 → 694（66..760）
 *   底部安全仍由 v1099n 的「#main-content 自身 padding-bottom 124px」兜底：
 *   滚到底时最后一条内容停在 ~636，远高于 reco-card(732) 与 nav(760)。
 * ========================================================================== */
@media (max-width: 768px) {
  main.main { padding-bottom: 0 !important; }
}

/* =========================================================================
 * ㉟ v1101 · 全站圆角 / 描边 token 收敛（token_probe + token_sel 实证驱动）
 * -------------------------------------------------------------------------
 * 【普查结果（28 视图 × 双端）】
 *   圆角 10 种：50% ×414 · 8px ×395 · 12px ×287 · 10px ×214 · 4px ×199
 *               20px ×177 · 999px ×52 · 16px ×30 · 18px ×1 · 14px ×1
 *   中性描边 13 档（白色 alpha .06/.07/.08/.09/.10/.12/.14/.16/.18
 *                + 灰蓝 rgba(168,182,201,.08/.18)）← 同一「层级」却有 13 个值
 *
 * 【收敛目标】
 *   圆角 10 → 6：4（标签）· 8（控件）· 12（卡片）· 20（面板）· 999（胶囊）· 50%（圆）
 *   中性线 13 → 3：L1 .09（弱）· L2 .14（中）· L3 .18（强）
 *
 * 【红线】语义色一律不动：暖金 rgba(240,183,94,*) / 品牌蓝 rgba(79,141,247,*)
 *       / 涨红 / 跌绿 / 实色 rgb(43,51,64) / 透明 —— 只收敛「中性灰白」族。
 *      表单错误态（.bad/.ok）不碰，避免覆盖校验反馈色。
 * ========================================================================== */

/* ── token 声明（文档用，供后续迭代引用） ─────────────────────────────── */
:root {
  --lx-radius-tag: 4px;
  --lx-radius-ctrl: 8px;
  --lx-radius-card: 12px;
  --lx-radius-panel: 20px;
  --lx-radius-pill: 999px;
  --lx-line-1: rgba(255, 255, 255, .09);   /* 弱：卡片/容器分隔 */
  --lx-line-2: rgba(255, 255, 255, .14);   /* 中：可交互控件边框 */
  --lx-line-3: rgba(255, 255, 255, .18);   /* 强：强调态/选中态 */
}

/* ── ① 圆角：10px → 12px（与卡片同层） ──────────────────────────────── */
button.btn,
span.badge,
input.form-control,
button.btn-icon,
div.lx-em-pkg,
div.lx-em-pack,
select.form-control,
select.model-select {
  border-radius: var(--lx-radius-card) !important;
}

/* ── ② 圆角：16px → 20px（面板层）；18px 的 hero 头像一并归一 ────────── */
div.ai-avatar-panel,
button.auto-refresh-toggle,
div.lx-dh-avatar {
  border-radius: var(--lx-radius-panel) !important;
}

/* ── ③ 中性描边 L1（.09）：收 .06 / .07 / 灰蓝 .08 ──────────────────── */
div.heat-cell,
div.evo-card,
div.evo-brief-stat,
div.evo-brief-row,
div.algo-kpi,
div.algo-card,
div.flw-card,
div.lhb-card,
div.lx-chat-share-bar,
div.header-status,
div.ai-avatar-tooltip,
div.template-card,
div.bt-template-card,
div.pt-stat,
button.welcome-card {
  border-color: var(--lx-line-1) !important;
}

/* ── ④ 中性描边 L2（.14）：收 .12 / .14 ─────────────────────────────── */
div.algo-type-tab,
div.lhb-tab,
button.lx-ask-chip,
button.flw-btn,
button.evo-btn,
form.lx-ask-form {
  border-color: var(--lx-line-2) !important;
}

/* ── ⑤ 中性描边 L3（.18）：收 .16 / 灰蓝 .18（跳过裸 input 以免盖掉校验态）── */
button.dp-fab,
button.dp-btn,
input.wxd-input,
select.wxd-input,
input.gm-search-input,
input.l2-search-input {
  border-color: var(--lx-line-3) !important;
}

/* =========================================================================
 * ㊱ v1102 · token 收敛第二轮：提特异性，把 v1101 未打赢的规则打赢
 * -------------------------------------------------------------------------
 * 【v1101 未收敛的原因（已实证）】不是选择器写错，是**特异性输了**：
 *   源 `lx-home-reborn.css:558  #lx-daily-hero .lx-ask-chip { … }` = (0,2,0)
 *   我 v1101  `button.lx-ask-chip`                            = (0,1,1) → 输
 *   双方都 !important 时比特异性，所以 v1101 的 border 规则部分静默失效。
 *
 * 【修法】对同一批选择器补一套 **#main-content 前缀**版本 = (1,1,1)/(1,1,2)，
 *   压过全部 `.class` 与 `#id .class` 级源规则；同时对已知的 ID 级源规则单独加同名覆盖。
 *   仍然只动「中性灰白」族，语义色（暖金/品牌蓝/涨红/跌绿/实色/校验态）一根不碰。
 * ========================================================================== */

/* ── ① 已知 ID 级源规则：逐个点对点覆盖 ──────────────────────────────── */
#lx-daily-hero .lx-ask-chip { border-color: var(--lx-line-2) !important; }

/* ── ② 圆角：给 v1101 的合并项补 #main-content 高特异性版本 ──────────── */
#main-content button.btn,
#main-content span.badge,
#main-content input.form-control,
#main-content select.form-control,
#main-content select.model-select,
#main-content div.lx-em-pkg,
#main-content div.lx-em-pack {
  border-radius: var(--lx-radius-card) !important;
}
#main-content div.ai-avatar-panel,
#main-content button.auto-refresh-toggle {
  border-radius: var(--lx-radius-panel) !important;
}

/* ── ③ 中性描边 L1（.09）：高特异性覆盖 ──────────────────────────────── */
#main-content div.heat-cell,
#main-content div.evo-card,
#main-content div.evo-brief-stat,
#main-content div.evo-brief-row,
#main-content div.algo-kpi,
#main-content div.algo-card,
#main-content div.flw-card,
#main-content div.lhb-card,
#main-content div.template-card,
#main-content div.bt-template-card,
#main-content div.pt-stat,
#main-content div.ai-avatar-tooltip {
  border-color: var(--lx-line-1) !important;
}

/* ── ④ 中性描边 L2（.14）：高特异性覆盖 ──────────────────────────────── */
#main-content div.algo-type-tab,
#main-content div.lhb-tab,
#main-content button.flw-btn,
#main-content button.evo-btn {
  border-color: var(--lx-line-2) !important;
}

/* ── ⑤ 中性描边 L3（.18）：高特异性覆盖 ──────────────────────────────── */
#main-content button.dp-fab,
#main-content button.dp-btn,
#main-content input.wxd-input:not(.bad):not(.ok),
#main-content select.wxd-input:not(.bad):not(.ok) {
  border-color: var(--lx-line-3) !important;
}

/* =========================================================================
 * ㊲ v1103 · iOS Safari 兼容加固（headless chromium 测不出来的盲区）
 * -------------------------------------------------------------------------
 * 背景：唯一可信 E2E 是 chromium，而 iOS Safari 有两类「静默失效」是本仓库的真实风险。
 * 全部用 @supports 包裹 → **对现代浏览器零影响、零副作用**，只作用于老引擎。
 *
 * 【① :has() 承重回退 —— 会变成「功能性 bug」，不是外观问题】
 *   lx-home-reborn.css:738/748
 *     #main-content:has(.tab-content.active:not(#tab-daily-picks)) #lx-daily-hero,
 *                                              … #lx-home-picks / #lx-guanxuan / #lx-living-status
 *     { display: none !important; }
 *   iOS < 15.4 不支持 :has() → **整条规则被丢弃** → 切到 watchlist/dashboard 时
 *   首页 hero + 精选榜不隐藏，用户要滚过整个首页才看到目标视图内容。
 *   ✅ 好消息（viewclass.py 实证）：应用本身就在 <body> 上写了 data-lx-view
 *      ?view=daily-picks → body[data-lx-view=daily-picks]
 *      ?view=watchlist   → body[data-lx-view=watchlist]
 *      → 根本不需要 :has()，用属性选择器即可等价表达。
 *   ⚠️ 必须写 `body[data-lx-view]`（要求属性存在）而非 `body:not([data-lx-view=x])`：
 *      否则首帧属性尚未写入时会误命中，反把首页模块隐藏掉。
 *
 * 【② 100vh → 100dvh —— iOS 地址栏会让全屏面板底部够不到】
 *   iOS Safari 的 100vh 是「地址栏收起时」的高度；地址栏展开时可视区更小，
 *   导致 tv-mode / fullscreen-mode 的数字人面板底部（关闭/收起按钮）落在屏外。
 *   命中位置（100vh 硬编码）：
 *     dock-geometry.css:171  html body #ai-avatar-fab.fab-ai.ai-dock.fullscreen-mode
 *     dock-geometry.css:489/627  … fullscreen-mode .ai-dock-avatar-area
 *     theme.css:459          .fab-ai.tv-mode
 *   → 用 @supports (height: 100dvh) 精准升级（dvh = dynamic viewport height）。
 * ========================================================================== */

/* ── ① 无 :has() 的浏览器：用 body[data-lx-view] 等价兜底 ─────────────── */
@supports not (selector(:has(*))) {
  /* v1125c: ai-chat 视图放行（数智人不再"一说话就下台"）——形态由 lx-ascetic.css v1125 头像卡接管 */
  body[data-lx-view]:not([data-lx-view="daily-picks"]):not([data-lx-view="ai-chat"]) #lx-daily-hero,
  body[data-lx-view]:not([data-lx-view="daily-picks"]):not([data-lx-view="ai-chat"]) #lx-home-picks,
  body[data-lx-view]:not([data-lx-view="daily-picks"]):not([data-lx-view="ai-chat"]) #lx-guanxuan,
  body[data-lx-view]:not([data-lx-view="daily-picks"]):not([data-lx-view="ai-chat"]) #lx-living-status {
    display: none !important;
  }
}

/* ── ② 支持 dvh 的浏览器：把全屏态的 100vh 换成 100dvh ───────────────── */
@supports (height: 100dvh) {
  html body #ai-avatar-fab.fab-ai.ai-dock.fullscreen-mode {
    height: 100dvh !important;
    max-height: 100dvh !important;
  }
  html body #ai-avatar-fab.fab-ai.ai-dock.fullscreen-mode .ai-dock-avatar-area {
    height: 100dvh !important;
    max-height: 100dvh !important;
  }
  .fab-ai.tv-mode {
    height: 100dvh !important;
    max-height: 100dvh !important;
  }
}

/* =========================================================================
 * ㊳ v1104 · 浮层栈位治理（底部槽位阶梯 + 点击可达性根治）
 * -------------------------------------------------------------------------
 * 【取证方式】VPS Playwright 真实域名 https://lixuanlh.com 双视口
 *            getBoundingClientRect + getComputedStyle +
 *            document.elementFromPoint(中心点) hitTest —— 不是肉眼截图，不是 grep CSS
 *
 * 🔴 P0-1  移动端 Cookie 横幅吞掉底部导航 3/5 项点击（首访即卡死）
 *          #lx-cookie-banner rect=[0,720,390,124]  z=1000000
 *          nav#bottom-nav    rect=[0,760,390,84]   z=120
 *          → 横幅 100% 覆盖 nav（重叠 32760px²）
 *          ⚠️ 关键陷阱：横幅容器自身 pointer-events:none（几何审计易误判为安全），
 *             但其内部可交互子节点仍是 auto：
 *               《隐私政策》      [146,769, 73,14]
 *               《用户协议》      [238,769, 73,14]
 *               《投资风险揭示书》[109,787,110,14] ← 命中「对话」中心(117,797)
 *               label 已知晓并同意 [279,811, 91,19]
 *          ✅ 实测 nav 五项可达：精选✗ 对话✗ 自选✗ 行情✓ 更多✓
 *             且自杀式死循环：不勾选→横幅不消失→导航永不可点
 *
 * 🔴 P0-2  button#dp-fab（决策｜body 直接子元素｜JS 延迟注入）
 *          移动 rect=[16,785,83,43] z=999990 → 命中「精选」中心(39,797)
 *          桌面 rect=[276,741,83,43]          → 被横幅背景覆盖 95%
 *
 * 🟠 P1-1  div#fab-wx 中心(40,736) hitTest 命中 button.rc-fab（推荐卡内）
 *          两者同为 bottom:84px 且 x 相邻（16 / 10），重叠 58% → 微信 fab 点不到
 *
 * 🟠 P1-2  button#ai-insight-btn 压住行情条尾段
 *          桌面 [1177,0,91,36] × div#ticker [300,0,980,34] → 94%（沪深300 被盖）
 *          移动 [ 287,0,91,36] × div#ticker [  0,0,390,30] → 50%
 *
 * 🟡 P1-3  桌面 #lx-stock-tips-entry[972..1008] 与 #lx-video-share-entry[1012..1048]
 *          间距仅 4px，视觉粘连
 *
 * 【修订记录 · v1105】选择器陷阱修正
 *   首版(v1104)写成 #dp-fab，但该按钮实测**只有 class="dp-fab"、无 id**——
 *   探针 MyDump 曾把它误标为 button#dp-fab，属工具误报，据此写出的 CSS 静默失效。
 *   querySelector('#dp-fab') === null 而 elementFromPoint(39,797) === button.dp-fab，
 *   二者矛盾即证据。已改为 button.dp-fab（并冗余保留 #dp-fab 形态防漂移）。
 *
 * 【治理模型 · 底部槽位阶梯 bottom slot ladder（移动 390×844 自底向上）】
 *   S0  z=120      nav#bottom-nav       bottom:0        h=84   ← 主导航，神圣不可侵犯
 *   S1  z=1000000  #lx-cookie-banner    bottom:84       h=124  ← 抬到 nav 之上（本次核心）
 *   ── 横幅在场时由 :has() 感知，其余浮层整体 +132 让位 ──
 *   S2  z=9000     #lx-reco-card        bottom:84       h=28
 *   S3  z=999990   #dp-fab              bottom:96 right:16  h=43
 *   S4  z=90       #fab-wx              bottom:122      h=48
 *   铁律：**任何浮层不得进入 S0 矩形**；横幅勾选后 DOM 移除 → :has() 失效 → 自动回落
 *
 * 【为什么不能简单抬 nav 的 z-index 了事】
 *   若 nav{z-index:2147483000} → nav 反压横幅 → 「已知晓并同意」勾选框[279,811,91,19]
 *   落在 nav 区域内 → 用户永远勾不了 → 横幅永不消失 → 死锁。
 *   必须让横幅整体上移**离开** nav 区域，而不是互相盖。
 * ========================================================================== */

:root {
  --lx-nav-h: 84px;          /* nav#bottom-nav 实测高度（390×844 真机取证） */
  --lx-slot-nav: 84px;       /* 老引擎兜底：纯像素值，不依赖 env() */
}

/* 支持 env() 的引擎再把安全区算进来（不支持则保持 84px 兜底值） */
@supports (padding: env(safe-area-inset-bottom)) {
  :root {
    --lx-slot-nav: calc(84px + env(safe-area-inset-bottom));
  }
}

/* ── ① 移动端 P0-1 根治：横幅抬到底部导航之上 ──────────────────────── */
@media (max-width: 900px) {
  html body #lx-cookie-banner {
    bottom: var(--lx-slot-nav) !important;
    top: auto !important;
  }
}

/* ── ② 移动端 P0-2 / P1-1：底部浮层错槽，互不吞点击 ────────────────── */
@media (max-width: 900px) {
  /* 琍璇推荐卡：贴 nav 上沿（原位保留） */
  html body #lx-reco-card {
    bottom: var(--lx-slot-nav) !important;
  }
  /* 决策 fab：撤出「精选」区，改挂右侧 nav 之上
     ⚠️ 选择器必须是 button.dp-fab —— 实测该按钮**只有 class 无 id**，
        querySelector('#dp-fab') 永远返回 null（写 #dp-fab 会静默失效）。 */
  html body > button.dp-fab:not(#__lx_never__),
  html body > button#dp-fab {
    left: auto !important;
    right: 16px !important;
    bottom: calc(var(--lx-slot-nav) + 12px) !important;
  }
  /* 微信 fab：抬到推荐卡之上 10px（原与推荐卡重叠 58%） */
  html body #fab-wx {
    bottom: calc(var(--lx-slot-nav) + 38px) !important;
  }
  /* AI 解盘按钮：避让行情条（移动 h=30） */
  html body #ai-insight-btn {
    top: 34px !important;
  }
}

/* ── ③ 横幅在场时其余浮层整体上移让位，勾选后自动回落原位 ─────────────
 * ⚠️【第二轮坑 · v1106】不能写 body:has(#lx-cookie-banner) 就完事：
 *    js/lx-cookie-banner.js 的 hide() 是 `b.style.display = 'none'`，
 *    **元素仍留在 DOM** → :has() 永远为真 → 浮层卡死在让位高度、永不回落。
 *    实测证据：勾选后 styleAttr === "display: none;" 而 inDom === true。
 *    ✅ 正确写法：在 :has() 内用属性选择器把「已隐藏」形态排除掉。
 *
 * ⚠️【为什么不用现成的 --lx-banner-h】源系统 v958 syncBannerVar() 确实维护了
 *    这个变量（= banner 高度 + 12，隐藏时为 0），但它有贴底判定：
 *      `r.bottom > window.innerHeight - 4`
 *    而本治理把 banner 抬到了 bottom:84px（不再贴底）→ 判定失败 →
 *    移动端实测 --lx-banner-h === 0px（桌面仍 69px）。改 JS 会破坏「不改源」原则，
 *    故改用纯 CSS 的属性选择器方案，把失效原因留档在此。
 * ==================================================================== */
@supports selector(:has(*)) {
  @media (max-width: 900px) {
    html body:has(#lx-cookie-banner:not([style*="display: none"])):has(#lx-cookie-banner:not([style*="display:none"])) #lx-reco-card {
      bottom: 216px !important;
    }
    html body:has(#lx-cookie-banner:not([style*="display: none"])):has(#lx-cookie-banner:not([style*="display:none"])) #fab-wx {
      bottom: 254px !important;
    }
    html body:has(#lx-cookie-banner:not([style*="display: none"])):has(#lx-cookie-banner:not([style*="display:none"])) > button.dp-fab:not(#__lx_never__),
    html body:has(#lx-cookie-banner:not([style*="display: none"])):has(#lx-cookie-banner:not([style*="display:none"])) > button#dp-fab {
      bottom: 228px !important;
    }
  }
}

/* ── ④ 桌面 P0-2 / P1-2 / P1-3 ────────────────────────────────────── */
@media (min-width: 901px) {
  /* 决策 fab：抬到横幅之上（桌面横幅实测 h=57），并靠左避开推荐卡与数智人 dock */
  html body > button.dp-fab:not(#__lx_never__),
  html body > button#dp-fab {
    left: 16px !important;
    right: auto !important;
    bottom: 70px !important;
  }
  /* AI 解盘按钮：避让行情条（桌面 h=34） */
  html body #ai-insight-btn {
    top: 38px !important;
  }
  /* 分享入口右移，与提示入口间距 4px → 20px */
  html body #lx-video-share-entry {
    right: 216px !important;
  }
}

/* ==========================================================================
 * ⑤ v1109 · 移动端「横幅在场态」浮层净化 —— 首屏叠罗汉根治
 * --------------------------------------------------------------------------
 * 【根因（Playwright 390×844 实测取证）】
 *   ③ 的让位阶梯把三个浮层推上固定像素（reco 216 / dp 228 / wx 254），
 *   该纵向带恰是默认落地视图（daily-picks hero）的 NL 交互区：
 *     button.dp-fab   [291,573,83,43] z=999990 → 完全罩住 .lx-ask-go「问」
 *                     （[309,583,52,30] 整矩形落入 dp-fab）→ 点击劫持 P0
 *     #fab-wx         [~16,542,48,48]          → 压住 lx-dh-title「市场情绪偏多」
 *     #lx-reco-card   [10,600,~,28]            → 压住 lx-ask-input 左端
 *   另：横幅上沿 636 覆盖 .lx-ask-chips[627,656] 下沿 20px。
 *   每一个未勾选 Cookie 的新访客，第一眼看到的就是叠罗汉 —— 违背
 *   「吸引力为首要法则」与 v1107-A「NL 入口默认可见可交互」。
 *
 * 【方案】横幅在场（移动端）→ 四个非必要浮层/次级件整体隐藏；
 *   同意后横幅 DOM display:none → :has() 失效 → 自动回落 ③/② 的原位。
 *   保留：数智人 dock（z=900 不与横幅重叠，核心吸引力资产）、标题、
 *         头像、输入框 + 「问」按钮（NL 主入口全净可见）。
 * ========================================================================== */
@supports selector(:has(*)) {
  @media (max-width: 900px) {
    html body:has(#lx-cookie-banner:not([style*="display: none"])):has(#lx-cookie-banner:not([style*="display:none"])) > button.dp-fab:not(#__lx_never__),
    html body:has(#lx-cookie-banner:not([style*="display: none"])):has(#lx-cookie-banner:not([style*="display:none"])) > button#dp-fab,
    html body:has(#lx-cookie-banner:not([style*="display: none"])):has(#lx-cookie-banner:not([style*="display:none"])) #fab-wx,
    html body:has(#lx-cookie-banner:not([style*="display: none"])):has(#lx-cookie-banner:not([style*="display:none"])) #lx-reco-card,
    html body:has(#lx-cookie-banner:not([style*="display: none"])):has(#lx-cookie-banner:not([style*="display:none"])) .lx-ask-chips {
      display: none !important;
    }
  }
}


/* ============================================================
   ⑥ v1110 · 移动端 CLS 治理（实测驱动，非直觉）
   ------------------------------------------------------------
   实测（Playwright 390x844，三轮均值，注入已验证生效）：
     基线 CLS 0.7357 → 本段生效后 0.3121（-58%），三轮方差
     从 0.33~1.00 收到 0.29~0.32。

   真凶一：hero 的 y 完全由「顶部 dpv 区块底边」决定。
     .dpv-container 是 display:contents，其子节点直接参与
     .content 的 grid 布局：
       加载中  dpv-loading  y66 h115 → 底边 181 = hero.y 181
       数据到  dpv-record(84) + dpv-close(166) → 底边 344
     顶部区块 115 → 278（+163px），把 hero 整块顶下去，
     并同时触发内部重排（hero 391 → 493）。
     修法：给 .dpv-loading 预留最终高度 278px，使加载态与
     最终态几何一致 → 零位移。
     代价：加载期多 163px 留白（约 1~2s），换来消除一次
     163px 的整体跳动 —— 跳动比留白更伤「吸引力」。

   真凶二：.lx-daily-hero::after 幽灵占位 380px → 1px。
     lx-home-picks.css 的
       .lx-daily-hero:not(:has(+ #lx-home-picks))::after{min-height:380px}
     在 #lx-home-picks 尚未插入 DOM 的早期成立 → 撑出 380px；
     等 section.lhp 插入后 :has() 成立，占位瞬间归零。
     最终态本就是 1px，故直接置空 = 零最终态视觉差异。

   真凶三：hero 自身 391 → 493 增高（内部 title/indices 填充）。
     锁 min-height 493px（= 实测最终稳定高度）。
     注：前人 v888/R11c 曾写 `#lx-daily-hero{min-height:361px}`，
     实测计算值 = 0px，已被后续 CSS 覆盖，从未生效；本段
     用 !important 且位于最后加载的设计系统文件中，实测生效。
   ============================================================ */
@media (max-width: 767px) {
  .dpv-loading { min-height: 278px !important; }
  #lx-daily-hero { min-height: 493px !important; }
}
.lx-daily-hero::after {
  display: none !important;
  min-height: 0 !important;
  height: 0 !important;
}

/* ===== ⑦ v1113 · 桌面任务线 order 补全：战绩/收盘复盘归位 =====
 * 根因：daily-picks-view.js 的 buildRecord()->.dpv-record（选后战绩）与
 *       buildReviewCard()->.dpv-close（当日表现·收盘复盘）从未被分配 flex order，
 *       默认 order:0 —— 在 #main-content 任务线（lx-home-flow.css v1093c）中
 *       排到了 order:1 公告 / order:2 数智人 hero 之上。
 * 实证（桌面 1280x800 实测 y）：修复前 record=86 / close=147 / guanxuan=293 / hero=321
 *   （干巴复盘表格占首屏第一眼，数智人被挤到下半屏，hero 被顶下 106px -> CLS 0.2439）；
 *   修复后 guanxuan=72 / hero=100 / record=1717 / close=1778 —— 数智人回归 C 位，
 *   hero 上移 221px，战绩/收盘复盘归位到全部精选列表之后（符合任务线设计意图）。
 * 收益：首屏第一眼 = 数智人琍璇 + AI 结论 + Top1 最强信号（吸引力为首要法则）；
 *   桌面 CLS 0.2439 单跳消失（order A/B 三轮 0.2337 -> 0.1988）。
 * 边界：仅 >=768px 生效 —— 移动端 v1110 给 .dpv-loading 预留的 278px 正是按
 *   record(84)+close(166) 顶部补位实测标定，全局挪走会令移动端 CLS 回退，留待下一棒。
 */
@media (min-width: 768px) {
  #tab-daily-picks .dpv-record { order: 10 !important; }
  #tab-daily-picks .dpv-close  { order: 11 !important; }
}


/* ===== ⑧ v1114 · 桌面 CLS 结构性根治：异步槽位占位锁高 =====
 * 背景：v1111(FOUC) / v1112(移动骨架) / v1113(order 补全) 三棒后桌面仍余 CLS 0.2655，
 *   且单点修复收益递减 —— 每修一处，位移就转移到下一处
 *   （骨架 -> dpv-review/top1 -> #lx-home-picks），实测「仅挪骨架」反而 0.2865（劣化）。
 * 根因：#main-content 是 flex 任务线（lx-home-flow.css v1093c），首屏内容由 JS 按 order
 *   渐进注入：order 3 dpv-review / order 4 dpv-top1 / order 5 #lx-home-picks。
 *   任一槽位迟到，其后全部元素整体下推；推多少取决于该槽位最终高度，
 *   与祖先高度无关（锁父容器高度无效）——这是前几棒收益递减的真正原因。
 * 实证（桌面 1280x800，注入式 A/B 各 5 轮，同一会话）：
 *   G0 基线            AVG 0.2655   每轮必现 hero[y135 -> y72] v=0.1466
 *   G5 仅挪骨架        AVG 0.2865   位移转移到 dpv-loading/dpv-header 移除(0.0831)
 *                                   与 home-picks 塌陷(0.1047~0.1587)，劣于基线
 *   G9 占位锁高        AVG 0.0509   MIN 0.0485 / MAX 0.0597，五轮零大跳(>0.03)
 * 方案：在异步槽位的同 order 位置用伪元素撑出实测最终高度，真实内容到达即"同高度替换"，
 *   位移趋零。#tab-daily-picks 为 display:contents，其 ::before 会被提升为
 *   #main-content 的直接 flex 项，故可精确落位到 order 3 / order 5 槽位。
 * 标定值来源：桌面 1280x800 逐帧实测 —— review 42 + top1 265 = 307px；
 *   #lx-home-picks 稳定态 611px。
 * 边界：
 *   1) 仅 >=768px。移动端已有 v1110 的 278px 方案且已达标（AVG 0.0571），本棒零改动、零回退。
 *   2) API 失败时占位不会永久留白：lx-rsv-collapse 动画 15s 后 min-height 归零
 *      （沿用 v1068 兜底机制，零假状态）。
 *   3) 不支持 :has() 的浏览器两条占位规则自动失效，退回 v1113 现状，渐进增强、零回归。
 *   4) 本棒刻意不动 .lx-daily-hero::after —— 真实内容是 insertAdjacentHTML 进
 *      .dpv-container 内部的，隐藏容器会把全部精选列表一起藏掉。
 * 遗留（结构性，非本棒范围）：治本应把首屏改为 SSR / 骨架屏同构输出，届时全部占位可撤。
 */
@media (min-width: 768px) {
  #tab-daily-picks .dpv-loading { order: 10 !important; }
  #lx-daily-hero { min-height: 349px !important; }
  #tab-daily-picks:not(:has(.dpv-top1))::before {
    content: "" !important;
    display: block !important;
    order: 3 !important;
    min-height: 301px !important;
    animation: lx-rsv-collapse 0s linear 15s forwards !important;
  }
  #main-content:not(:has(#lx-home-picks))::before {
    content: "" !important;
    display: block !important;
    order: 5 !important;
    min-height: 663px !important;
    animation: lx-rsv-collapse 0s linear 15s forwards !important;
  }
}
@keyframes lx-rsv-collapse { to { min-height: 0; } }


/* ===== ⑨ v1168d · 移动端首屏 CLS 收尾：picks 容器迟到占位 =====
 * 背景：v1110 已使加载态=最终态（278px），但 .dpv-loading 本体在 agent 栈
 *   于 ~1.0-1.5s（init 级联晚于 prod）才插入，出现瞬间 hero y66->344 整体下推，
 *   单笔 CLS 0.28（agent mobile 实测）。prod 因 init 早于揭幕（lx-preload
 *   hidden 期）而不入账 —— 时序差异非几何差异，治本（对齐 init 时序）另案。
 * 方案：v1114 桌面同款伪元素占位移植 —— #tab-daily-picks 为 display:contents，
 *   其 ::before 被提升为 #main-content 直接 flex 项；在 .dpv-container 到达前
 *   预占同槽位（默认 order 0，与 .dpv-loading 同槽）等高 278px，真实容器到达
 *   即同高替换，位移趋零。以 .dpv-container 为存续标记（加载态/数据态均在），
 *   不得用 .dpv-loading（数据到达后被 innerHTML 替换移除，会导致伪元素复活双占位）。
 * 边界：仅 <=767px；:has() 不支持时本规则整体失效退回 v1110 现状；
 *   JS 永不执行时 15s 后 lx-rsv-collapse 归零，零永久留白。
 */
@media (max-width: 767px) {
  #tab-daily-picks:not(:has(.dpv-container))::before {
    content: "" !important;
    display: block !important;
    min-height: 278px !important;
    animation: lx-rsv-collapse 0s linear 15s forwards !important;
  }
}

/* ===== ⑩ v1175 · 移动端首屏归位 + 异步槽位占位标定（实测驱动）=====
 * 背景：#main-content 是 flex 任务线（lx-home-flow.css v1093c）。daily-picks-view.js 的
 *   buildRecord()->.dpv-record（选后战绩）与 buildReviewCard()->.dpv-close（当日表现·收盘复盘）
 *   从未被分配 flex order（默认 0），在移动端排到了 order:1 公告 / order:2 数智人 hero 之上
 *   —— 首屏第一眼是两张干巴复盘表格，琍璇数智人被顶到 y=344，Top1 被顶到 y=1018（首屏外）。
 *   v1113 的 order 归位只写了 @media(min-width:768px)，移动端刻意保留（保 CLS），留待本棒。
 * 实测（Playwright 390x844，注入式 A/B，page.route 本地读盘 fulfill，注入用 --ab-marker 回读验证）：
 *   A 现状               CLS AVG 0.0742  hero=[344,575] top1=[1018,386] record=[80,84] close=[178,166]
 *   B 仅归位             CLS AVG 0.2940  hero=[66,528]   ← 归位收益巨大但 CLS 爆表（v1113 注释预言）
 *   C3 归位+槽位锁高     CLS AVG 0.0925 / MAX 0.0929（5 轮出现 0.1493 尖峰，不稳定）
 *   C4 归位+锁高+顶部对齐 CLS AVG 0.0825 / MAX 0.0845（5 轮 0.0795~0.0845，方差极小，达标）
 * B 爆表根因：v1110 给 .dpv-loading 预留的 278px 是按「record(84)+close(166) 在顶部」标定的；
 *   归位后顶部变空，数据到达瞬间 hero 上跳 278px → 单笔 CLS 0.29。故本棒同步撤销该预留。
 * 剩余位移真凶（逐帧实测 t=2182，hero 内部异步填充）：
 *   #lx-dh-indices 2->97 / #lx-dh-title 27->60->112 / .lx-dh-kicker 27->36 / #lx-ask+CTA 0->143
 *   且 lx-home-reborn.css:24 给 hero 设了 justify-content:center —— 内容在锁死高度内上下
 *   对称扩张，已有槽位被顶上去（title 实测上移 203px）→ 本棒改 flex-start，只向下生长。
 * 标定值（390x844 逐帧实测最终态）：kicker 36 / title 112 / indices 97 / top1 386 / hero 575。
 * 边界：
 *   1) 全部规则仅 @media(max-width:767px)；桌面 1280x800 实测几何零变化（hero=[100,351] 一致）。
 *   2) API 失败时 top1 占位 15s 后由 lx-rsv-collapse 归零，零永久留白。
 *   3) 不支持 :has() 时两条占位规则整体失效，退回 v1113/v1114 现状，渐进增强零回归。
 *   4) 被推翻的假设（留档）：theme.css 异步加载不是主因（改为立即返回后 CLS 无改善，实测证伪）。
 * 代价：#lx-dh-title 锁 112px 使 hero 由 575 增至 628（首屏内），换来 title 高度零抖动。
 */
@media (max-width: 767px) {
  #tab-daily-picks .dpv-record  { order: 10 !important; }
  #tab-daily-picks .dpv-close   { order: 11 !important; }
  #tab-daily-picks .dpv-loading { order: 10 !important; }
  #lx-daily-hero { min-height: 575px !important; justify-content: flex-start !important; }
  #lx-dh-indices { min-height: 97px !important; }
  #lx-dh-title   { min-height: 112px !important; }
  .lx-dh-kicker  { min-height: 36px !important; }
  #tab-daily-picks:not(:has(.dpv-container))::before { display: none !important; min-height: 0 !important; }
  #tab-daily-picks:not(:has(.dpv-top1))::before {
    content: "" !important; display: block !important; order: 4 !important;
    min-height: 386px !important;
    animation: lx-rsv-collapse 0s linear 15s forwards !important;
  }
}

/* ===== ⑪ v1176 · 移动端「全部精选」列表恢复可见（实测驱动）=====
 * 症状（几何取证）：移动端 .dpv-list 计算高度 = **2px** 且 overflow:hidden（dpv.css:27），
 *   但其 5 个 .dpv-list-item 各 68px、y 连续排布 —— 即列表被容器裁掉，**5 只精选票完全不可见**。
 *   移动端 #lx-home-picks 又是 v1170 漏斗有意 display:none（lx-funnel-v1170.js 注释明文），
 *   于是移动端「全部精选」唯一展示渠道断掉 —— 直接架空「给用户精选赚钱的股票」核心诉求。
 * 根因：#main-content 是固定高度（移动端 694px）的滚动 flex column 容器，flex 项默认
 *   flex:0 1 auto（shrink=1），内容总高远超容器 -> 按 base size 加权压缩。
 *   hero 有 min-height 保护、top1/record/close 实测未被压缩，**唯独 .dpv-list 无保护** -> 压到 2px。
 * 实测（注入式 A/B，390x844，--ab-marker 回读验证注入生效）：
 *   L0 基线      .dpv-list=[1347,2]   CLS 0.0830
 *   L1 list 不收缩 .dpv-list=[1347,344] CLS 0.0837  ← hero/top1 几何零变化，CLS 零退化
 *   L2 全部不收缩  .dpv-list=[1347,344] CLS 0.0806  ← 与 L1 等效，说明其它项本就未被压缩
 * 决策：采用最小改动 L1，且**仅移动端** —— 桌面 .dpv-list 同样是 2px，但桌面已有
 *   #lx-home-picks（632px 卡片网格）展示同样 5 只票，放开会造成重复展示，维持现状另案。
 * 边界：本规则只解除 flex 压缩，不改任何视觉属性；不支持 flexbox 的场合自然失效，零回归。
 */
@media (max-width: 767px) {
  .dpv-list { flex-shrink: 0 !important; }
}

/* ===== ⑫ v1177 · 移动端 hero 压缩：指数/徽章单行，Top1 更多进首屏（实测驱动）=====
 * 目标：v1176 后移动端 hero=[66,628] → review=[718,63] → top1=[792,386]，
 *   Top1 在 844 首屏内**只露出 52px** —— 「最强信号」几乎看不见，等于没修完。
 * 压缩点（hero 628 的内部构成，逐元素实测）：
 *   avatar 97 + kicker 36 + title 112 + ask 99 + CTA 44 + indices **97** + evo 61 + 间距
 *   —— indices 的 5 个指数 chip 在 390 宽下堆了 3 行（28*3+gap）。
 * 关键坑：只改 flex-wrap **无效** —— lx-ascetic.css:301 有
 *   `#lx-daily-hero #lx-dh-indices { min-height: 97px }`（后人锁的防抖值）把高度顶住。
 *   必须**同时覆盖 min-height**。
 * 实测（注入式 A/B，390x844，--ab-marker 回读验证注入生效）：
 *   H0 基线   hero=[66,628] indices=[510,97]  Top1 露出 52px   CLS AVG 0.0806
 *   H4 本方案 hero=[66,575] indices=[510,30]  Top1 露出 104px  **CLS AVG 0.0700（优于基线）**
 *   H2 顺带试过 title 112->60：露出 104px 但 **CLS 劣化到 0.1113** → 弃（中间态溢出 112 会抖）
 *   H4b 再隐藏 .lx-ask-chips：ask 99->52 但 hero 被 min-height 575 顶住，露出无增益且丢提问入口 → 弃
 * 为何 CLS 反降：nowrap 后 indices 空态与填充态**都是 30px**（原来 0→97），填充抖动被消除。
 * 边界：仅 @media(max-width:767px)；桌面零改动。横向滚动条为移动端常见模式（指数可横滑）。
 * 遗留：#lx-evo-row（61px，2 个满宽徽章堆叠）本棒规则未生效（被更高特异性覆盖），
 *   压到 27px 可再省 34px，留待下一棒（收益有限且有徽章文字换行风险）。
 */
@media (max-width: 767px) {
  #lx-daily-hero #lx-dh-indices {
    min-height: 28px !important; flex-wrap: nowrap !important; overflow-x: auto !important;
  }
  #lx-dh-indices .lx-dh-chip { flex: 0 0 auto !important; }
  #lx-evo-row {
    min-height: 27px !important; flex-direction: row !important; flex-wrap: nowrap !important;
    overflow-x: auto !important;
  }
  #lx-evo-row .lx-evo-badge { flex: 0 0 auto !important; width: auto !important; }
}

/* ===== ⑬ v1178 · 移动端 Top1 紧凑化 + hero min-height 修正（实测驱动）=====
 * 认知纠正（本棒最重要的一条，务必记住）：
 *   Top1 的首屏露出 = 844 - top1.y，**只取决于其上方的 hero，与 Top1 自身高度无关**。
 *   压缩 Top1 高度不会增加露出，只能让下方 .dpv-list 更快出现、并让既有的 104px
 *   里塞进更多 Top1 内容。想增加露出必须动 hero。
 * Top1 386 构成（逐元素实测）：pad 22 + badge 25(mb6) + row 36(m5/5) + score 23(m8/14)
 *   + metrics 130(m0/14) + reason 42(m7/14) + btn 38(m8)
 * 关键发现：v1175 锁的 `#lx-daily-hero{min-height:575}` **高于内容自然高度** ——
 *   诊断变体（min-height:0）实测内容自然高只有 **561px**，575 白白多撑 14px。
 * 实测（注入式 A/B，390x844，--ab-marker 回读验证注入生效）：
 *   U0 基线    hero=575 top1=[740,386] 露出 104px  指标区首屏可见 **-24px**（看不到现价/止损）
 *   U1 仅收间距 hero=575 top1=[740,347] 露出 104px  指标区 **-4px**        CLS 0.0673
 *   U5 minH=0  hero=**561** top1=[725,347] 露出 119px 指标区 **+10px**（进首屏）
 *   U3 minH=560 hero=561 top1=[725,347] 露出 **119px** 指标区 **+10px**    **CLS 0.0692（优于基线 0.0743）** ← 选中
 *   U4 minH=540 同 U3 效果（内容自然高 561 顶住），CLS 0.0703 方差更大 → 不选
 * min-height 取 560（≈自然高 561）：既不浪费 14px，又保留内容变短时的下限防抖。
 * 边界：仅 @media(max-width:767px)；不改结构、不删信息，只收间距；桌面零改动。
 * 未采用（留档）：压缩 #lx-evo-row（61px）—— 其 wrap+满宽是 lx-design-system.css:791
 *   刻意设的**防切边**约束（`#lx-daily-hero .lx-evo-badge{max-width:100%}`），硬压会挤压文字。
 */
@media (max-width: 767px) {
  #tab-daily-picks .dpv-top1 { padding: 8px 12px !important; }
  #tab-daily-picks .dpv-top1-badge { margin-bottom: 2px !important; }
  #tab-daily-picks .dpv-top1-row { margin-top: 2px !important; margin-bottom: 2px !important; }
  #tab-daily-picks .dpv-top1-score { margin-top: 4px !important; margin-bottom: 8px !important; }
  #tab-daily-picks .dpv-top1-metrics { margin-top: 0 !important; margin-bottom: 8px !important; }
  #tab-daily-picks .dpv-top1-reason { margin-top: 4px !important; margin-bottom: 8px !important; }
  #tab-daily-picks .dpv-chat-btn { margin-top: 4px !important; }
  #lx-daily-hero { min-height: 560px !important; }
}

/* ===== ⑭ v1179 · 移动端 hero 标题单行化 + min-height 490（实测驱动）=====
 * 背景：#lx-dh-title 是 CLS 的**最大单一来源** —— 逐帧实测其高度序列
 *   27（1 行占位）→ 60/112（填充中 2 行 + <br> 占 25px）→ 反复抖动。
 *   v1175 曾锁 min-height:112 止血，代价是 hero 被撑到 561（内容自然高只有 525）。
 * 方案：title 固定单行（nowrap + ellipsis）+ min-height 30px —— 空态与填充态同为 30px，
 *   **填充抖动被彻底消灭**（这是本棒 CLS 大幅下降的唯一原因）。
 * 信息完整性核对（重要，勿省略）：title 文案「主要指数全线承压，避险情绪升温。」
 *   在下方 .dpv-review（大盘定调）**有完整版**，且附带具体指数
 *   「上证指数 -1.22% / 创业板指 -2.68%」→ 单行截断**不造成实质信息损失**。
 * 另一关键点：title 压矮后 hero **不会自动变矮** —— v1178 的 min-height:560 会把
 *   省下的空间吃掉（W1/W2 单独跑实测 hero 仍 560、露出仍 119px）。
 *   **必须同步下调 min-height**，否则压缩收益为零。
 * 实测（注入式 A/B，390x844，--ab-marker 回读验证注入生效）：
 *   U0 线上现状(v1178)  hero=561 top1=[725,347] 露出 119px 指标区可见 10px  CLS 0.0714
 *   W1/W2 仅改 title    hero=560 露出 119px（被 min-height 吃掉！）        CLS 0.0918 / 0.0364
 *   W3 W2+minH=0 诊断    hero=**525**（内容自然高）露出 154px 指标区 46px   CLS 0.0514
 *   **W4 W2+minH=490**   hero=525 露出 **154px** 指标区 **46px**            **CLS 0.0466** ← 选中
 *   W5 W1+minH=490(不丢字) 几何同 W4                                        CLS 0.0857（劣，2 行仍抖）
 * 为何选截断(W4)而非不丢字(W5)：几何收益完全相同，但 CLS 0.0466 vs 0.0857 ——
 *   单行固定高度消灭抖动，2 行版本仍会抖；且信息在 review 有完整冗余。
 * min-height 490 < 内容自然高 525 → 不撑高，仅作内容变短时的下限防抖。
 * 边界：仅 @media(max-width:767px)；桌面零改动。
 */
@media (max-width: 767px) {
  #lx-dh-title {
    font-size: 19px !important; line-height: 1.25 !important; min-height: 30px !important;
    white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important;
  }
  #lx-dh-title br { display: none !important; }
  #lx-dh-title span { display: inline !important; }
  #lx-daily-hero { min-height: 490px !important; }
}
