/* ===== 股票买卖指示器 — 暗色主题 v4.0 (UI 精修) =====
   主题系统：:root 为暗色(默认)；html[data-theme="light"] 覆盖为浅紫蓝。
   语义色同时提供 RGB 三元组变量(--*-rgb)，供散落的 rgba() 带透明度用法随主题切换。 */
:root {
    /* 背景层次：深 → 浅 */
    --bg-primary: #0b0b18;
    --bg-secondary: #15152a;
    --bg-tertiary: #1c1c36;
    --bg-elevated: #20203e;
    --border-color: #2a2a48;
    --border-light: #353556;

    /* 文字层次（v3.79.4 收敛两档：secondary 正文辅 / muted 提示小字；tertiary 为 muted 别名，历史引用兼容） */
    --text-primary: #e8e8f5;
    --text-secondary: #a8a8c8;
    --text-muted: #8b8bb0;
    --text-tertiary: #8b8bb0;

    /* 语义色（暗色默认） */
    --accent: #f39c12;
    --accent-2: #e67e22;          /* 渐变末端/次要橙 */
    --accent-glow: rgba(var(--accent-rgb), 0.15);
    --accent-rgb: 243, 156, 18;   /* 供 rgba(var(--accent-rgb),a) 随主题 */
    --accent-2-rgb: 230, 126, 34;
    --up: #e74c3c;
    --up-rgb: 231, 76, 60;
    --up-glow: rgba(231, 76, 60, 0.12);
    --down: #26a69a;
    --down-rgb: 38, 166, 154;
    --down-glow: rgba(38, 166, 154, 0.12);
    --signal: #f1c40f;
    --signal-rgb: 241, 196, 15;
    --signal-glow: rgba(241, 196, 15, 0.10);
    --purple: #9b59b6;
    --purple-rgb: 155, 89, 182;
    --purple-glow: rgba(155, 89, 182, 0.10);
    /* 信息蓝（板块/周期徽章） */
    --info: #3498db;
    --info-rgb: 52, 152, 219;
    /* 图表专用底色（随主题切换，chart.js 读取） */
    --chart-bg: #1a1a2e;
    --chart-grid: #2a2a3e;
    --crosshair: rgba(255, 255, 255, 0.28);
    --tooltip-bg: rgba(20, 20, 40, 0.95);
    /* v3.54: 均线色相分离（白/粉/青）—— 彼此高对比，且与 BOLL 的黄/蓝/紫不混淆 */
    --ma5-color: #FFFFFF;
    --ma10-color: #FF4081;
    --ma60-color: #00BCD4;

    /* 阴影系统 */
    --shadow-sm: 0 1px 3px rgba(0,0,0,0.25);
    --shadow: 0 2px 8px rgba(0,0,0,0.3);
    --shadow-lg: 0 4px 16px rgba(0,0,0,0.4);
    --shadow-xl: 0 8px 32px rgba(0,0,0,0.45);
    --shadow-glow: 0 0 20px rgba(var(--accent-rgb), 0.08);

    /* 圆角令牌 */
    --radius-sm: 4px;
    --radius-md: 6px;
    --radius-lg: 8px;
    --radius-xl: 12px;
    --radius-pill: 999px;

    /* 过渡 */
    --t-fast: 0.15s ease;
    --t-mid: 0.25s ease;
    --t-slow: 0.4s ease;
}

/* ===== 浅紫蓝主题（仿用户参考图：白卡片 + 大圆角 + 浅阴影 + 靛蓝主色） ===== */
html[data-theme="light"] {
    --bg-primary: #F4F6FB;        /* 页面极浅蓝灰 */
    --bg-secondary: #FFFFFF;      /* 卡片纯白 */
    --bg-tertiary: #EEF1F8;       /* 顶栏/分组底色 */
    --bg-elevated: #FFFFFF;
    --border-color: #E3E8F5;
    --border-light: #EDF0F8;

    --text-primary: #1F2540;      /* 深藏蓝 */
    --text-secondary: #5A6485;    /* 深一档保证白底可读 */
    --text-muted: #8A93B0;
    --text-tertiary: #8A93B0;

    --accent: #5B6CFF;            /* 靛蓝紫主色（参考图） */
    --accent-2: #7B8CFF;          /* 渐变末端浅靛蓝 */
    --accent-glow: rgba(91, 108, 255, 0.10);
    --accent-rgb: 91, 108, 255;
    --accent-2-rgb: 123, 140, 255;
    --up: #F5484D;                /* 红涨（参考图原色·A股习惯） */
    --up-rgb: 245, 72, 77;
    --up-glow: rgba(245, 72, 77, 0.06);   /* 填充底砍半：白底上彩斑降为轻晕 */
    --down: #3DBE7B;              /* 绿跌（参考图原色·A股习惯） */
    --down-rgb: 61, 190, 123;
    --down-glow: rgba(61, 190, 123, 0.06); /* 填充底砍半 */
    --signal: #C29B27;            /* 琥珀降饱和：参考图无琥珀，退为辅助色避免撞靛蓝 */
    --signal-rgb: 194, 155, 39;
    --signal-glow: rgba(194, 155, 39, 0.06);
    --purple: #A99FEF;            /* 紫降饱和：参考图无紫，退为辅助色 */
    --purple-rgb: 169, 159, 239;
    --purple-glow: rgba(169, 159, 239, 0.06);
    --info: #5B9BD5;              /* 蓝降饱和：参考图无蓝，退为辅助色 */
    --info-rgb: 91, 155, 213;
    --chart-bg: #FFFFFF;
    --chart-grid: #EDF0F8;
    --crosshair: rgba(31, 37, 64, 0.22);
    --tooltip-bg: rgba(31, 37, 64, 0.92);
    --ma5-color: #263238;
    --ma10-color: #D81B60;
    --ma60-color: #00838F;

    --shadow-sm: 0 1px 3px rgba(31, 37, 64, 0.08);
    --shadow: 0 2px 8px rgba(31, 37, 64, 0.10);
    --shadow-lg: 0 4px 16px rgba(31, 37, 64, 0.12);
    --shadow-xl: 0 8px 32px rgba(31, 37, 64, 0.14);
    --shadow-glow: 0 0 20px rgba(91, 108, 255, 0.10);

    --radius-lg: 10px;
    --radius-xl: 14px;
}

/* 浅色主题：body 装饰光晕改为靛蓝，避免橙光残留 */
html[data-theme="light"] body {
    background-image:
        radial-gradient(ellipse 80% 50% at 50% -20%, rgba(91, 108, 255, 0.04), transparent),
        radial-gradient(ellipse 60% 50% at 100% 100%, rgba(169, 159, 239, 0.03), transparent);
}

/* ===== 浅色主题降噪：警示块去黄底、黄字转中性，只留细边条作色彩线索 ===== */
/* 底色统一回中性，边框走常规灰；琥珀只保留在边条上 */
html[data-theme="light"] .bp-gate.warn,
html[data-theme="light"] .bp-surge,
html[data-theme="light"] .bp-ambush,
html[data-theme="light"] .bp-spacing.warn,
html[data-theme="light"] .addon-verdict.watch,
html[data-theme="light"] .chase-conclusion.warn,
html[data-theme="light"] .verdict-box.watch,
html[data-theme="light"] .sig-card.watch,
html[data-theme="light"] .tr-chase,
html[data-theme="light"] .vp-note.vp-warn {
    background: var(--bg-tertiary);
    border-color: var(--border-color);
}
/* 黄字全部转中性深色，信息不丢失、色彩退位 */
html[data-theme="light"] .bp-gate.warn .bp-gate-main,
html[data-theme="light"] .bp-surge,
html[data-theme="light"] .bp-ambush-title,
html[data-theme="light"] .bp-formula td:last-child,
html[data-theme="light"] .addon-verdict.watch,
html[data-theme="light"] .chase-conclusion.warn .cc-title,
html[data-theme="light"] .cc-chip.warn,
html[data-theme="light"] .verdict-box.watch .verdict-action,
html[data-theme="light"] .chase-rec.ambush,
html[data-theme="light"] .signal-type-tianyan,
html[data-theme="light"] .tr-chase td:first-child,
html[data-theme="light"] .td-ref-list i,
html[data-theme="light"] .td-ref-table td.td-warn,
html[data-theme="light"] .vp-val.vp-warn,
html[data-theme="light"] .vp-note.vp-warn,
html[data-theme="light"] .vp-note.vp-warn b,
html[data-theme="light"] .vp-val.vp-sub-val.vp-warn {
    color: var(--text-primary);
}
/* 指标卡：非涨跌语义的值统一中性，只有涨/跌数字保留红绿 */
html[data-theme="light"] .vp-val.vp-entry { color: var(--accent); }
/* 自选列表 建仓/年月 徽标降饱和（由 --purple/--up 变量自动跟随，此处仅压底色透明度） */
html[data-theme="light"] .wl-hold-badge,
html[data-theme="light"] .wl-period-badge,
html[data-theme="light"] .bp-mode-badge.mode-risk {
    background: var(--bg-tertiary);
    color: var(--text-secondary);
    border-color: var(--border-color);
}
/* 信号卡(主力成本/紫柱买等)去整卡彩底，保留彩边条作分类线索 */
html[data-theme="light"] .sig-card.buy,
html[data-theme="light"] .sig-card.sell,
html[data-theme="light"] .sig-card.none {
    background: var(--bg-secondary);
}
/* 仓位状态段：JS 内联 style="color:var(--signal)"，需 !important 精确命中转中性 */
html[data-theme="light"] .verdict-box .vp-val[style*="--signal"],
html[data-theme="light"] .verdict-box .vp-val[style*="signal"] {
    color: var(--text-primary) !important;
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

html, body {
    width: 100%;
    height: 100%;
}

body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
    background: var(--bg-primary);
    background-image:
        radial-gradient(ellipse 80% 50% at 50% -20%, rgba(var(--accent-rgb), 0.04), transparent),
        radial-gradient(ellipse 60% 50% at 100% 100%, rgba(155, 89, 182, 0.03), transparent);
    background-attachment: fixed;
    color: var(--text-primary);
    font-size: 13px;
    overflow-x: hidden;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

/* ===== 应用主布局 ===== */
.app-layout {
    display: flex;
    width: 100%;
    min-width: 0;
    height: 100vh;
    overflow: hidden;
    gap: 1px;
    background: var(--border-color);
}

/* ===== 左侧自选列表 ===== */
.watchlist-sidebar {
    width: 220px;
    flex-shrink: 0;
    background: var(--bg-secondary);
    display: flex;
    flex-direction: column;
    height: 100vh;
    overflow: hidden;
}

.wl-header {
    padding: 14px 16px;
    background: linear-gradient(180deg, var(--bg-tertiary) 0%, var(--bg-secondary) 100%);
    border-bottom: 1px solid var(--border-color);
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-shrink: 0;
}

.wl-search {
    padding: 10px 12px 8px;
    border-bottom: 1px solid var(--border-color);
    flex-shrink: 0;
}
.wl-search-input {
    width: 100%;
    padding: 8px 12px 8px 34px;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-pill);
    font-size: 13px;
    background-color: var(--bg-primary);
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%237d86a0' stroke-width='2.4' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cline x1='16.6' y1='16.6' x2='21' y2='21'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: 12px center;
    color: var(--text-primary);
    outline: none;
    box-sizing: border-box;
    transition: border-color var(--t-fast), box-shadow var(--t-fast), background-color var(--t-fast);
}
.wl-search-input:hover {
    border-color: var(--text-muted);
}
.wl-search-input:focus {
    border-color: var(--accent);
    box-shadow: 0 0 0 3px var(--accent-glow);
    background-color: var(--bg-elevated);
}
.wl-search-input::placeholder {
    color: var(--text-muted);
}
html[data-theme="light"] .wl-search-input {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%239aa0b5' stroke-width='2.4' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cline x1='16.6' y1='16.6' x2='21' y2='21'/%3E%3C/svg%3E");
}

.wl-title {
    font-weight: 700;
    color: var(--text-primary);
    font-size: 14px;
    letter-spacing: 0.5px;
}

.wl-count {
    background: var(--bg-elevated);
    color: var(--text-secondary);
    font-size: 11px;
    padding: 2px 8px;
    border-radius: var(--radius-pill);
    border: 1px solid var(--border-color);
}

.wl-add {
    padding: 10px 12px 12px;
    display: flex;
    flex-direction: column;
    gap: 8px;
    flex-shrink: 0;
    border-bottom: 1px solid var(--border-color);
    background: var(--bg-tertiary);
    position: relative;
}
.wl-add::before {
    content: '添加自选';
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 1px;
    color: var(--text-muted);
    margin-bottom: -2px;
}

.wl-add-row {
    display: flex;
    gap: 6px;
    align-items: center;
}

.wl-code-input { width: 68px; flex-shrink: 0; }
.wl-name-input { flex: 1; min-width: 0; }

.wl-hold-label {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: 12px;
    color: var(--text-secondary);
    cursor: pointer;
    white-space: nowrap;
    flex-shrink: 0;
}

.wl-cost-input { flex: 1; min-width: 0; }

.wl-period-label {
    font-size: 12px;
    color: var(--text-secondary);
    white-space: nowrap;
    flex-shrink: 0;
}
.wl-period-opt {
    display: flex;
    align-items: center;
    gap: 3px;
    font-size: 12px;
    color: var(--text-primary);
    cursor: pointer;
    user-select: none;
}
.wl-period-badge {
    display: inline-block;
    margin-left: 4px;
    padding: 0 5px;
    font-size: 11px;
    line-height: 15px;
    border-radius: var(--radius-sm);
    background: var(--up-glow);
    color: var(--up);
    border: 1px solid var(--up);
}

.wl-add-actions { display: flex; gap: 8px; }
.wl-add-btn {
    width: 100%;
    border-radius: var(--radius-md);
    font-weight: 600;
    letter-spacing: 4px;
    text-indent: 4px;   /* 平衡字间距造成的偏移 */
    transition: transform var(--t-fast), box-shadow var(--t-fast), filter var(--t-fast);
}
.wl-add-btn:hover { filter: brightness(1.06); }
.wl-add-btn:active { transform: translateY(1px); }

.pos-checkbox {
    accent-color: var(--accent);
    width: 14px;
    height: 14px;
    cursor: pointer;
}

.wl-input {
    flex: 1;
    background: var(--bg-primary);
    color: var(--text-primary);
    border: 1px solid var(--border-color);
    padding: 6px 8px;
    border-radius: var(--radius-md);
    font-size: 12px;
    font-family: 'Consolas', monospace;
    transition: border-color var(--t-fast), box-shadow var(--t-fast);
}

.wl-input:focus {
    outline: none;
    border-color: var(--accent);
    box-shadow: 0 0 0 2px var(--accent-glow);
}

.wl-input:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}

.wl-items {
    flex: 1;
    overflow-y: auto;
    padding: 4px 0;
}

.wl-empty {
    text-align: center;
    color: var(--text-muted);
    font-size: 12px;
    padding: 30px 10px;
    line-height: 1.6;
}

.wl-item {
    display: flex;
    align-items: center;
    padding: 9px 12px;
    border-bottom: 1px solid var(--border-color);
    cursor: pointer;
    transition: background var(--t-fast), border-color var(--t-fast);
    position: relative;
}

.wl-item:hover {
    background: var(--bg-tertiary);
}

/* 建仓项：紫色底 */
.wl-item.is-holding {
    background: rgba(var(--purple-rgb), 0.08);
    border-bottom-color: rgba(var(--purple-rgb), 0.12);
}

.wl-item.is-holding:hover {
    background: rgba(var(--purple-rgb), 0.16);
}

/* 选中项：高亮 + 左边框（v3.124：旧版 accent-glow 10% / purple-glow 6% 在白底上几乎看不见） */
.wl-item.active {
    background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.20) 0%, rgba(var(--accent-rgb), 0.06) 55%, transparent 100%);
    border-left: 3px solid var(--accent);
    padding-left: 9px;
}

.wl-item.active .wl-name {
    color: var(--accent);
    font-weight: 700;
}

/* 持仓 + 选中：紫色左边框 + 更实的紫底，与未选中持仓项（8% 紫底）明显区分 */
.wl-item.active.is-holding {
    background: linear-gradient(90deg, rgba(var(--purple-rgb), 0.34) 0%, rgba(var(--purple-rgb), 0.10) 55%, transparent 100%);
    border-left: 3px solid var(--purple);
    padding-left: 9px;
}

.wl-item.active.is-holding .wl-name {
    color: var(--text-primary);   /* #A99FEF 在白底对比不足，改用深色保可读 */
    font-weight: 700;
}

.wl-item-main {
    flex: 1;
    min-width: 0;
}

.wl-name {
    display: flex;              /* v3.85.0: 改为 flex，容纳名字后面挂的「每日结论」小字 */
    align-items: baseline;
    gap: 6px;
    min-width: 0;
    font-size: 13px;
    font-weight: 600;
    color: var(--text-primary);
}

/* v3.85.0: 名字本体（长名仍省略号，不被小字挤掉） */
.wl-name-txt {
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* v3.85.0: 自选列表「每日买卖结论」小字
   v3.123: 用户要求删除该结论 → 相关样式（.wl-verdict / .wl-v-*）一并移除，避免留死规则。 */

.wl-code {
    font-size: 11px;
    color: var(--text-muted);
    font-family: 'Consolas', monospace;
    margin-top: 1px;
    display: flex;
    align-items: center;
    gap: 6px;
}

.wl-hold-badge {
    background: rgba(var(--purple-rgb), 0.25);
    color: #c39bd3;
    font-size: 11px;
    padding: 1px 5px;
    border-radius: var(--radius-sm);
    white-space: nowrap;
}

.wl-remove {
    background: none;
    border: none;
    color: var(--text-muted);
    font-size: 18px;
    cursor: pointer;
    padding: 0 4px;
    line-height: 1;
    flex-shrink: 0;
    opacity: 0.4;
    transition: opacity var(--t-fast), color var(--t-fast);
}

.wl-item:hover .wl-remove { opacity: 1; }
.wl-remove:hover { color: var(--up); }

/* 自选列表分组标签（v3.65：个股 / ETF 分组；v3.66 放大加粗 + 数量角标；v3.67 背景色 var(--accent)；v3.68 取消 sticky 固定）*/
.wl-group-label {
    padding: 9px 12px 7px;
    font-size: 14px;
    font-weight: 800;
    letter-spacing: 0.5px;
    color: #1a1a2e;
    background: var(--accent);
    border-bottom: 1px solid var(--border-color);
}

.wl-item-actions {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2px;
    flex-shrink: 0;
}

.wl-edit {
    background: none;
    border: none;
    color: var(--text-muted);
    font-size: 15px;
    cursor: pointer;
    padding: 0 4px;
    line-height: 1;
    flex-shrink: 0;
    opacity: 0.4;
    transition: opacity var(--t-fast), color var(--t-fast);
}

.wl-item:hover .wl-edit { opacity: 1; }
.wl-edit:hover { color: var(--accent); }
/* v4.6.1: 触屏设备无 hover → 编辑按钮常显（否则移动端看不到编辑入口） */
@media (hover: none) {
    .wl-edit { opacity: 0.75; }
    .wl-edit:active { color: var(--accent); opacity: 1; }
}

.wl-add-actions {
    display: flex;
    gap: 6px;
    margin-top: 2px;
}

.wl-add-actions .wl-add-btn { flex: 1; }

.wl-cancel-btn {
    flex: 0 0 auto;
    background: var(--bg-tertiary);
    border: 1px solid var(--border-color);
    color: var(--text-secondary);
}

.wl-cancel-btn:hover {
    background: var(--bg-elevated);
    color: var(--text-primary);
}

/* ===== 右侧主内容 ===== */
.main-content {
    flex: 1;
    height: 100vh;
    overflow-y: auto;
    min-width: 0;
    background: var(--bg-primary);
}

/* 顶部工具栏 */
.toolbar {
    background: linear-gradient(180deg, var(--bg-secondary) 0%, var(--bg-tertiary) 100%);
    border-bottom: 1px solid var(--border-color);
    padding: 10px 20px;
    display: flex;
    align-items: center;
    gap: 15px;
    flex-wrap: wrap;
    position: sticky;
    top: 0;
    z-index: 100;
    box-shadow: var(--shadow-sm);
}

.toolbar-title {
    font-size: 16px;
    font-weight: 700;
    color: var(--text-primary);
    white-space: nowrap;
    letter-spacing: 0.3px;
}

.toolbar-group {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 0 14px;
    border-right: 1px solid var(--border-color);
}

.toolbar-group:last-child { border-right: none; }

.toolbar-group label {
    color: var(--text-secondary);
    font-size: 12px;
    white-space: nowrap;
}

/* 买卖图例 */
.toolbar-group .legend {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: 12px;
    color: var(--text-secondary);
}
.legend .lg-buy { color: #e74c3c; font-weight: bold; }
.legend .lg-sell { color: #2ecc71; font-weight: bold; }

.btn {
    background: var(--bg-elevated);
    color: var(--text-primary);
    border: 1px solid var(--border-color);
    padding: 6px 14px;
    border-radius: var(--radius-md);
    cursor: pointer;
    font-size: 12px;
    transition: all var(--t-fast);
    white-space: nowrap;
}

.btn:hover {
    background: var(--border-color);
    border-color: var(--border-light);
    transform: translateY(-1px);
    box-shadow: var(--shadow-sm);
}

.btn:active { transform: translateY(0); }

.code-input {
    background: var(--bg-primary);
    color: var(--text-primary);
    border: 1px solid var(--border-color);
    padding: 6px 10px;
    border-radius: var(--radius-md);
    font-size: 12px;
    width: 110px;
    font-family: 'Consolas', monospace;
    transition: border-color var(--t-fast), box-shadow var(--t-fast);
}

.code-input:focus {
    outline: none;
    border-color: var(--accent);
    box-shadow: 0 0 0 2px var(--accent-glow);
}

/* 建仓控件 */
.pos-checkbox {
    width: 16px;
    height: 16px;
    cursor: pointer;
    accent-color: var(--accent);
}

.cost-input { width: 90px; }
.cost-input:disabled { opacity: 0.4; cursor: not-allowed; }
.cost-input:not(:disabled):focus {
    outline: none;
    border-color: var(--accent);
}

.stock-name {
    color: var(--text-primary);
    font-weight: 600;
    font-size: 13px;
    margin-left: 4px;
}

.btn-primary {
    background: linear-gradient(135deg, var(--accent) 0%, var(--accent-2) 100%);
    color: #000;
    border-color: transparent;
    font-weight: 600;
    box-shadow: 0 2px 8px rgba(var(--accent-rgb), 0.2);
}

.btn-primary:hover {
    background: linear-gradient(135deg, var(--accent) 0%, var(--accent) 100%);
    border-color: transparent;
    box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.3);
}

.btn-sm { padding: 4px 10px; font-size: 11px; }
.file-input { display: none; }

/* 主布局 */
.main-layout {
    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 10px;
}

/* 图表区域 */
.chart-area {
    height: clamp(520px, 70vh, 820px);
    min-height: 520px;
    position: relative;
    min-width: 0;
    background: var(--bg-primary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-lg);
    overflow: hidden;
}

.chart-area canvas {
    display: block;
    width: 100%;
    height: 100%;
}

/* v3.126: 主图标题模式切换按钮（右上角悬浮小胶囊） */
.chart-title-mode {
    position: absolute;
    top: 6px;
    right: 8px;
    z-index: 5;
    padding: 2px 9px;
    font-size: 11px;
    line-height: 1.5;
    color: var(--text-muted);
    background: var(--bg-elevated, rgba(128,128,128,0.12));
    border: 1px solid var(--border-color);
    border-radius: var(--radius-pill, 999px);
    cursor: pointer;
    user-select: none;
    opacity: 0.75;
    transition: opacity 0.15s, color 0.15s;
}
.chart-title-mode:hover { opacity: 1; color: var(--text-primary); }

/* v3.127: 指标选择面板（底部弹出，移动端贴底；桌面居中卡片） */
.ind-picker-modal {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 1000;
    background: rgba(0, 0, 0, 0.45);
}
.ind-picker-modal.open { display: flex; align-items: flex-end; justify-content: center; }
.ind-picker-sheet {
    width: 100%;
    max-width: 560px;
    max-height: 80vh;
    overflow-y: auto;
    background: var(--bg-primary, var(--bg-elevated, #fff));
    border: 1px solid var(--border-color);
    border-radius: var(--radius-lg, 12px) var(--radius-lg, 12px) 0 0;
    padding: 12px 14px calc(14px + env(safe-area-inset-bottom, 0px));
}
.ind-picker-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 10px;
}
.ind-picker-title { font-size: 14px; font-weight: 600; color: var(--text-primary); }
.ind-picker-cancel {
    font-size: 12px;
    color: var(--text-muted);
    background: none;
    border: none;
    cursor: pointer;
    padding: 4px 6px;
}
.ind-picker-group { margin-bottom: 10px; }
.ind-picker-group:last-child { margin-bottom: 0; }
.ind-picker-label { font-size: 11px; color: var(--text-muted); margin-bottom: 6px; }
.ind-picker-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 8px;
}
.ind-opt {
    font-size: 13px;
    padding: 9px 8px;
    text-align: center;
    color: var(--text-primary);
    background: var(--bg-elevated, rgba(128,128,128,0.10));
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md, 8px);
    cursor: pointer;
    transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.ind-opt.active {
    color: var(--up, #e74c3c);
    border-color: var(--up, #e74c3c);
    background: color-mix(in srgb, var(--up, #e74c3c) 10%, transparent);
}
@media (min-width: 769px) {
    .ind-picker-modal.open { align-items: center; }
    .ind-picker-sheet { border-radius: var(--radius-lg, 12px); }
}

/* 今日分时 */
.intraday-area {
    border: 1px solid var(--border-color);
    border-radius: var(--radius-lg);
    padding: 8px 4px 4px;
    min-width: 0;
    background: var(--bg-primary);
}
.panel-title-row {
    display: flex;
    align-items: baseline;
    gap: 10px;
    padding: 0 8px 4px;
}
.panel-title {
    font-size: 13px;
    font-weight: 600;
    color: var(--text-primary);
    letter-spacing: 0.3px;
}
.panel-sub { font-size: 11px; color: var(--text-muted); }

/* v3.40: 分时自动刷新 开关 + 实时指示点 */
.intraday-tools { display: inline-flex; align-items: center; gap: 12px; margin-left: auto; }
.intraday-live { width: 8px; height: 8px; border-radius: 50%; background: var(--text-muted); display: inline-block; flex: none; transition: background .2s; }
.intraday-live.live { background: var(--down); box-shadow: 0 0 6px var(--down); animation: intradayPulse 1.6s ease-in-out infinite; }
@keyframes intradayPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } }
.intraday-refresh-toggle { font-size: 12px; color: var(--text-dim); cursor: pointer; display: inline-flex; align-items: center; gap: 4px; user-select: none; flex-wrap: wrap; }
.intraday-refresh-toggle input { cursor: pointer; accent-color: var(--down); }
.intraday-refresh-toggle input:disabled { cursor: not-allowed; accent-color: var(--text-muted); }
.intraday-refresh-toggle input:disabled + .intraday-refresh-locked { } /* 占位，避免误删 */
/* v3.43: 自动刷新被入场闸门锁定时给出的提示 */
.intraday-refresh-locked {
    font-size: 11px;
    color: var(--text-muted);
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: 10px;
    padding: 1px 7px;
    margin-left: 2px;
    white-space: nowrap;
}

#intradayCanvas {
    width: 100%;
    height: clamp(220px, 28vh, 320px);
    display: block;
    cursor: crosshair;
    touch-action: pan-y;
    -webkit-user-select: none;
    user-select: none;
    -webkit-tap-highlight-color: transparent;
}

/* v3.42: 做T 视图（方向状态标签 + 今日分时主图；去掉缩略日K，节省空间） */
.tk-view {
    display: flex;
    flex-direction: column;
    gap: 4px;               /* v3.139: 从 8px 缩到 4px，用户要求间距紧凑 */
    border: 1px solid var(--border-color);
    border-radius: var(--radius-lg);
    padding: 6px 4px 4px;   /* v3.139: 上 padding 8→6 */
    min-width: 0;
    background: var(--bg-primary);
}
.tk-intraday { min-width: 0; }

/* 顶部方向状态标签（文字代替图形）：T+1 入场闸门 */
.td-direction-bar {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px 14px;
    padding: 6px 12px;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-sm);
    background: var(--bg-tertiary);
}
.td-dir-title {
    font-size: 12px;
    font-weight: 700;
    color: var(--text-secondary);
    letter-spacing: 1px;
}
.td-dir-chips { display: inline-flex; flex-wrap: wrap; gap: 8px 14px; }
.td-dir-chip {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: 14px;
    font-weight: 600;
    color: var(--text-primary);
    padding: 2px 8px;
    border-radius: 999px;
    background: transparent;
    border: 1px solid transparent;
}
.td-dir-chip.dir-up   { color: var(--down); border-color: color-mix(in srgb, var(--down) 40%, transparent); background: color-mix(in srgb, var(--down) 12%, transparent); }
.td-dir-chip.dir-down { color: var(--up);   border-color: color-mix(in srgb, var(--up)   40%, transparent); background: color-mix(in srgb, var(--up)   12%, transparent); }
.td-dir-dot { font-size: 12px; line-height: 1; }
.td-dir-chip b { font-weight: 800; }

/* 入场闸门提示条 */
.td-gate {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 7px 12px;
    border-radius: var(--radius-sm);
    font-size: 13px;
    font-weight: 600;
    border: 1px solid var(--border-color);
    background: var(--bg-tertiary);
    color: var(--text-secondary);
}
.td-gate.allow {
    color: var(--down);
    border-color: color-mix(in srgb, var(--down) 55%, transparent);
    background: color-mix(in srgb, var(--down) 14%, transparent);
}
.td-gate.deny {
    color: var(--up);
    border-color: color-mix(in srgb, var(--up) 55%, transparent);
    background: color-mix(in srgb, var(--up) 14%, transparent);
}
.td-gate-icon { font-size: 15px; line-height: 1; }
.td-gate-text { line-height: 1.35; }


#mainCanvas {
    width: 100%;
    height: 100%;
    display: block;
    cursor: crosshair;
    touch-action: pan-y;
    -webkit-user-select: none;
    user-select: none;
    -webkit-tap-highlight-color: transparent;
}

/* 信号面板 — 独立卡片 */
.signal-panel {
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-lg);
    overflow: hidden;
}

/* v3.7: 所有模块独立一行，不再并排 */

/* v3.8: T+1 模块专用 5 列网格，10 项=2 行×5、5 项=1 行×5，整齐对齐 */

/* v3.8.1: T+1 内容区内边距，与其他面板一致 */
#chaseJudgeContent {
    padding: 12px 20px;
}

.td-grid {
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    gap: 8px;
    margin-bottom: 10px;
    text-align: center;
}
.td-grid .vp-item { align-items: center; }
.td-grid .vp-label, .td-grid .vp-val, .td-grid .vp-sub { text-align: center; }
@media (max-width: 768px) {
    .td-grid { grid-template-columns: repeat(2, 1fr); }
}

.signal-panel-auto {
    max-height: none;
    overflow-y: visible;
}

.signal-panel-scroll {
    max-height: 200px;
    overflow-y: auto;
}

.signal-panel-header {
    padding: 10px 20px;
    background: linear-gradient(180deg, var(--bg-tertiary) 0%, var(--bg-secondary) 100%);
    border-bottom: 1px solid var(--border-color);
    display: flex;
    align-items: center;
    justify-content: space-between;
    position: sticky;
    top: 0;
    z-index: 10;
}

/* 结论优先：可折叠面板 + 操作结论卡放大 */
.signal-panel.collapsible > .signal-panel-header { cursor: pointer; user-select: none; }
.signal-panel.collapsed > *:not(.signal-panel-header) { display: none; }
.panel-collapse-icon { margin-left: 8px; font-size: 12px; color: var(--text-secondary); display: inline-block; transition: transform .2s ease; }
.signal-panel.collapsed > .signal-panel-header .panel-collapse-icon { transform: rotate(-90deg); }
.op-card-panel { border-color: var(--accent, #4a9eff); box-shadow: 0 0 0 1px rgba(var(--info-rgb),.25); }
.op-card-panel .verdict-action { font-size: 26px; font-weight: 800; }
.op-card-panel .verdict-box { padding: 20px 22px; }
.op-card-panel .verdict-plain { font-size: 15px; line-height: 1.65; }

.signal-panel-title {
    font-weight: 600;
    color: var(--text-primary);
    font-size: 13px;
    letter-spacing: 0.3px;
}

.signal-count {
    color: var(--text-secondary);
    font-size: 11px;
    background: var(--bg-elevated);
    padding: 2px 8px;
    border-radius: var(--radius-pill);
    border: 1px solid var(--border-color);
}

/* ===== 加仓决策助手 ===== */
.addon-panel { padding: 0; }
.addon-inputs {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 8px 14px;
    padding: 12px 20px;
}
.addon-row { display: flex; flex-direction: column; gap: 3px; }
.addon-row label { font-size: 11px; color: var(--text-tertiary); }
.addon-input {
    background: var(--bg-primary);
    border: 1px solid var(--border-color);
    color: var(--text-primary);
    border-radius: var(--radius-md);
    padding: 6px 8px;
    font-size: 12px;
    width: 100%;
    box-sizing: border-box;
    transition: border-color var(--t-fast), box-shadow var(--t-fast);
}
.addon-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-glow); }

/* 信号门控 */
.bp-signal-gate {
    font-size: 12px; line-height: 1.5;
    padding: 8px 12px; border-radius: var(--radius-md);
    margin-bottom: 10px; text-align: left;
    background: var(--bg-secondary); border: 1px solid var(--border-color);
    color: var(--text-secondary);
}
.bp-signal-gate.blocked {
    background: var(--down-glow); color: var(--down);
    border-color: var(--down); font-weight: 600;
}
.bp-signal-gate.active {
    background: var(--up-glow); color: var(--up);
    border-color: var(--up); font-weight: 600;
}

/* v3.15: 长期加仓计划面板 */
.bp-longadd-plan {
    border-radius: var(--radius-lg); padding: 12px; margin: 8px 0;
}
.bp-longadd-plan.waiting {
    background: var(--bg-secondary); border: 1px solid var(--border-color);
}
.bp-longadd-plan.triggered {
    background: var(--up-glow); border: 1px solid var(--up);
}
.bp-longadd-header {
    font-size: 14px; font-weight: 700; margin-bottom: 6px;
    color: var(--text-primary);
}
.bp-longadd-plan.triggered .bp-longadd-header { color: var(--up); }
.bp-longadd-status {
    font-size: 13px; color: var(--text-secondary); margin-bottom: 8px;
}
.bp-longadd-target {
    font-size: 12px; color: var(--text-secondary); margin-bottom: 6px;
}
.bp-longadd-summary {
    display: flex; gap: 16px; font-size: 12px; margin: 8px 0;
    color: var(--text-secondary);
}
.bp-longadd-summary b { color: var(--text-primary); }
.bp-longadd-stop {
    font-size: 12px; color: var(--down); margin-top: 6px;
}
/* v3.79.50: 长期计划里 ATR 止损与生效风控线的关系说明（避免同屏两条"止损"打架） */
.bp-longadd-note {
    font-size: 12px; color: var(--text-tertiary); margin-top: 4px; line-height: 1.5;
}
.bp-tranches .bp-pos { font-weight: 600; color: var(--text-primary); white-space: nowrap; }

/* v3.14: 建仓模式标签（续） */
.bp-mode-badge {
    font-size: 12px; font-weight: 600;
    padding: 6px 12px; border-radius: var(--radius-md);
    margin-bottom: 8px; display: flex; align-items: center; gap: 8px;
}

/* bp-mode-badge 与 bp-gate 并排一行，居左；徽章保留现有样式，右侧由 gap 留出间距 */
.bp-gate-row {
    display: flex; align-items: center; justify-content: flex-start;
    flex-wrap: wrap; gap: 10px;
}
.bp-gate-row .bp-mode-badge { margin-bottom: 0; align-self: stretch; }
.bp-gate-row .bp-gate { margin-bottom: 0; flex: 1 1 auto; }

.bp-mode-badge .bp-mode-desc { font-weight: 400; font-size: 11px; opacity: 0.8; }
.bp-mode-badge.mode-pullback { background: var(--up-glow); color: var(--up); border: 1px solid var(--up); }
.bp-mode-badge.mode-ambush   { background: var(--down-glow); color: var(--down); border: 1px solid var(--down); }
.bp-mode-badge.mode-grid     { background: rgba(var(--info-rgb),0.12); color: var(--info); border: 1px solid var(--info); }
.bp-mode-badge.mode-normal   { background: var(--bg-secondary); color: var(--text-secondary); border: 1px solid var(--border-color); }

/* v3.26: ETF 模式标签 */
.bp-mode-badge.mode-trend    { background: var(--up-glow); color: var(--up); border: 1px solid var(--up); }
.bp-mode-badge.mode-scalping { background: rgba(var(--info-rgb),0.12); color: var(--info); border: 1px solid var(--info); }
.bp-mode-badge.mode-bearish  { background: var(--down-glow); color: var(--down); border: 1px solid var(--down); }
.bp-mode-badge.mode-risk     { background: rgba(var(--signal-rgb),0.12); color: var(--signal); border: 1px solid var(--signal); }
.bp-mode-badge.mode-mixed    { background: var(--bg-secondary); color: var(--text-secondary); border: 1px solid var(--border-color); }

.addon-result { padding: 0 20px 16px; }
.addon-verdict {
    font-size: 15px; font-weight: 700;
    padding: 10px 12px; border-radius: var(--radius-lg);
    margin-bottom: 10px; text-align: center;
}
.addon-verdict.add { background: var(--up-glow); color: var(--up); border: 1px solid var(--up); }
.addon-verdict.no  { background: var(--down-glow); color: var(--down); border: 1px solid var(--down); }
.addon-verdict.watch { background: var(--signal-glow); color: var(--signal); border: 1px solid var(--signal); }

.addon-route { font-size: 12px; line-height: 1.55; padding: 6px 10px; border-radius: var(--radius-md); margin: 0 0 8px; background: var(--bg-primary); border-left: 3px solid var(--border-color); color: var(--text-secondary); }
.addon-route.right { border-left-color: var(--up); }
.addon-route.right b { color: var(--up); }
.addon-route.left { border-left-color: var(--accent); }
.addon-route.left b { color: var(--accent); }
.addon-route.none { border-left-color: var(--text-tertiary); }
.addon-route.none b { color: var(--text-secondary); }

.addon-iron { list-style: none; margin: 0 0 6px; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.addon-iron li { display: flex; align-items: center; flex-wrap: wrap; gap: 3px 8px; font-size: 12px; padding: 4px 8px; border-radius: var(--radius-md); background: var(--bg-primary); }
.addon-iron li.ok { color: var(--up); }
.addon-iron li.no { color: var(--down); }
.iron-mark { font-weight: 700; width: 14px; text-align: center; }
.iron-title { font-weight: 600; white-space: nowrap; }
.iron-detail { color: var(--text-tertiary); margin-left: auto; font-size: 11px; line-height: 1.5; }
@media (max-width: 768px) {
    .iron-detail { margin-left: 22px; width: 100%; }
}

.addon-mode { font-size: 12px; color: var(--text-secondary); margin-bottom: 8px; padding: 0 4px; }
.addon-mode b { color: var(--accent); }

.addon-signals { display: flex; flex-direction: column; gap: 4px; margin-bottom: 10px; }
.addon-sig { display: flex; gap: 8px; font-size: 12px; padding: 5px 8px; border-radius: var(--radius-md); background: var(--bg-primary); }
.addon-sig.ok { border-left: 3px solid var(--up); }
.addon-sig.no { border-left: 3px solid var(--down); }
.sig-mark { font-weight: 700; }
.addon-sig.ok .sig-mark { color: var(--up); }
.addon-sig.no .sig-mark { color: var(--down); }
.sig-body { flex: 1; }
.sig-line { color: var(--text-secondary); }
.sig-note { color: var(--text-tertiary); font-size: 11px; margin-top: 2px; }

.addon-linkage { display: flex; flex-direction: column; gap: 4px; margin-bottom: 10px; padding: 8px; border-radius: var(--radius-lg); background: var(--bg-tertiary); }
.addon-capital { display: flex; flex-direction: column; gap: 4px; margin-bottom: 10px; padding: 8px; border-radius: var(--radius-lg); background: var(--bg-primary); border: 1px dashed var(--text-tertiary); }
.ln-items { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.ln-item > span:first-child { color: var(--text-tertiary); }
.ln-item b { color: var(--text-primary); font-size: 13px; }
.ln-sub { color: var(--text-tertiary); font-size: 11px; margin-left: auto; }
.ln-hard b { color: var(--down); }
.ln-hard.warn { background: rgba(var(--down-rgb),0.18); border-radius: var(--radius-md); padding: 4px 6px; }

.addon-reasons { display: flex; flex-direction: column; gap: 4px; }
.reason-item { font-size: 12px; color: var(--down); padding: 4px 6px; }
.reason-item.ok { color: var(--up); }

/* ===== 建仓决策助手 ===== */
.build-panel { padding: 0; }
.build-inputs { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px 14px; padding: 12px 20px; }
.build-gate { padding: 12px 20px 0; }
.build-result { padding: 0 20px 16px; }

.bp-gate { border-radius: var(--radius-lg); padding: 10px 12px; margin-bottom: 10px; }
.bp-gate.ok  { background: var(--up-glow); border: 1px solid var(--up); }
.bp-gate.warn { background: var(--signal-glow); border: 1px solid var(--signal); }
.bp-gate-main { font-size: 14px; font-weight: 700; color: var(--text-primary); }
.bp-gate.ok .bp-gate-main { color: var(--up); }
.bp-gate.warn .bp-gate-main { color: var(--signal); }
.bp-gate.bad { background: var(--down-glow); border: 1px solid var(--down); }
.bp-gate.bad .bp-gate-main { color: var(--down); }
.bp-gate-note { font-size: 11px; color: var(--text-tertiary); margin-top: 3px; line-height: 1.5; }

.bp-entry { text-align: center; padding: 14px 10px; border-radius: var(--radius-xl); background: var(--bg-tertiary); margin-bottom: 12px; }
.bp-entry-label { font-size: 12px; color: var(--text-tertiary); }
.bp-entry-price { font-size: 28px; font-weight: 800; color: var(--up); line-height: 1.2; }
.bp-entry-sub { font-size: 11px; color: var(--text-tertiary); margin-top: 2px; }

.bp-section-title { font-size: 12px; font-weight: 600; color: var(--text-secondary); margin: 10px 0 6px; }

.bp-tranches { width: 100%; border-collapse: collapse; font-size: 12px; }
.bp-tranches th { background: var(--bg-tertiary); color: var(--text-secondary); padding: 5px 8px; text-align: left; font-weight: 500; border-bottom: 1px solid var(--border-color); }
.bp-tranches td { padding: 5px 8px; border-bottom: 1px solid var(--border-color); color: var(--text-secondary); }
.bp-tranches .bp-price { font-weight: 700; color: var(--text-primary); }
.bp-tranches .tr-first { background: rgba(var(--up-rgb),0.05); }
.bp-tranches .tr-add { background: rgba(var(--down-rgb),0.04); }
.bp-tranches .tr-add .bp-price { color: var(--down); }
.bp-trigger { color: var(--text-tertiary); font-size: 11px; }
.bp-triggered { color: var(--down); font-weight: 600; }

.bp-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 6px 0; }
.bp-tranches { min-width: 520px; }
.bp-tranches .bp-amt { font-weight: 700; color: var(--up); white-space: nowrap; }
.bp-tranches .bp-shares { font-weight: 600; color: var(--text-primary); white-space: nowrap; }

.bp-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 6px; margin: 8px 0; }
.bp-sum-item { background: var(--bg-tertiary); border-radius: var(--radius-lg); padding: 7px 10px; display: flex; flex-direction: column; gap: 2px; }
.bp-sum-item > span { font-size: 11px; color: var(--text-tertiary); }
.bp-sum-item > b { font-size: 12px; color: var(--text-primary); }
.bp-fee-sub { font-size: 10px; color: var(--text-tertiary); margin-top: 2px; }
.bp-smallfund-note { font-size: 12px; color: var(--accent-2); background: rgba(var(--accent-2-rgb),0.08); border: 1px solid rgba(var(--accent-2-rgb),0.25); border-radius: var(--radius-md); padding: 8px 12px; margin: 6px 0; }

@media (max-width: 480px) {
    .bp-tranches { font-size: 11px; }
    .bp-tranches th, .bp-tranches td { padding: 4px 6px; }
    .bp-summary { grid-template-columns: repeat(2, 1fr); }
}

.bp-spacing { font-size: 12px; padding: 6px 10px; border-radius: var(--radius-md); margin: 8px 0; }
.bp-spacing.ok { background: var(--up-glow); color: var(--up); border: 1px solid var(--up); }
.bp-spacing.warn { background: var(--signal-glow); color: var(--signal); border: 1px solid var(--signal); }

.bp-stop { display: flex; flex-direction: column; gap: 4px; padding: 8px 10px; border-radius: var(--radius-lg); background: var(--bg-tertiary); margin-bottom: 8px; }
.bp-stop-row { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.bp-stop-row > span:first-child { color: var(--text-tertiary); }
.bp-stop-row b { color: var(--text-primary); font-size: 13px; margin-left: auto; }
.bp-stop-row.bp-recommend { border-top: 1px dashed var(--border-color); padding-top: 4px; }
.bp-stop-row.bp-recommend b { color: var(--down); }
.bp-stop-note { font-size: 11px; color: var(--text-tertiary); margin-top: 2px; line-height: 1.5; }
.bp-term-note { font-size: 11px; color: var(--text-tertiary); background: var(--bg-tertiary); border-left: 3px solid var(--border-color); padding: 4px 8px; border-radius: var(--radius-sm); margin: 4px 0 8px; line-height: 1.5; }

.bp-targets { display: flex; gap: 10px; font-size: 12px; color: var(--text-secondary); margin-bottom: 6px; }

.bp-asof { font-size: 11px; color: var(--text-tertiary); margin-bottom: 6px; }
.bp-surge { font-size: 12px; color: var(--signal); background: var(--signal-glow); border: 1px solid var(--signal); border-radius: var(--radius-md); padding: 6px 10px; margin: 8px 0; line-height: 1.5; }
.bp-flash { font-size: 12px; color: var(--down); background: var(--down-glow); border: 1px solid var(--down); border-radius: var(--radius-md); padding: 6px 10px; margin: 8px 0; line-height: 1.5; }
.tr-chase { background: rgba(var(--signal-rgb),0.06); }

.bp-reject {
    font-size: 12px; color: var(--down); background: rgba(var(--down-rgb),0.12);
    border: 1px solid var(--down); border-radius: var(--radius-md); padding: 8px 10px;
    margin: 8px 0; line-height: 1.55;
}

.tr-chase td:first-child { font-weight: 600; color: var(--signal); }
.bp-targets span { background: var(--bg-tertiary); padding: 4px 10px; border-radius: var(--radius-md); }

.bp-ambush { border: 1px solid var(--signal); border-radius: var(--radius-lg); padding: 8px 10px; margin: 8px 0; background: var(--signal-glow); }
.bp-ambush-title { font-size: 13px; font-weight: 700; color: var(--signal); margin-bottom: 4px; }
.bp-ambush-note { font-size: 11px; color: var(--text-secondary); line-height: 1.55; margin: 4px 0; }
.bp-formula { width: 100%; border-collapse: collapse; margin: 6px 0; font-size: 11px; }
.bp-formula th, .bp-formula td { border: 1px solid var(--border-color); padding: 3px 6px; text-align: left; }
.bp-formula th { background: var(--bg-tertiary); color: var(--text-tertiary); font-weight: 600; }
.bp-formula td:last-child { color: var(--signal); font-weight: 600; text-align: right; white-space: nowrap; }

.bp-src { font-size: 11px; color: var(--text-tertiary); margin-top: 2px; line-height: 1.4; }
.bp-stop-sub { font-size: 11px; color: var(--down); margin-top: 1px; }

.bp-rr { font-size: 11px; color: var(--text-secondary); margin-top: 6px; line-height: 1.6; background: var(--bg-tertiary); border-radius: var(--radius-md); padding: 6px 8px; }
.bp-rr b { color: var(--text-primary); }
.bp-rr-note { color: var(--text-tertiary); }

.bp-check { margin-top: 6px; }
.bp-check-item { font-size: 11px; color: var(--text-tertiary); padding: 2px 4px; }

.bp-universal { margin: 8px 0; padding: 8px 10px; border-radius: var(--radius-lg); background: rgba(var(--info-rgb),0.06); border: 1px solid rgba(var(--info-rgb),0.2); }
.bp-universal .bp-section-title { color: var(--info); }
.bp-rule { font-size: 11px; color: var(--text-secondary); line-height: 1.55; padding: 1px 0; }

/* 信号表格 */
.signal-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 12px;
}

.signal-table th {
    background: var(--bg-tertiary);
    color: var(--text-secondary);
    padding: 6px 12px;
    text-align: left;
    font-weight: 500;
    border-bottom: 1px solid var(--border-color);
    position: sticky;
    top: 0;
}

.signal-table td {
    padding: 5px 12px;
    border-bottom: 1px solid var(--border-color);
}

.signal-table tr {
    transition: background var(--t-fast);
}

.signal-table tr:hover {
    background: var(--bg-tertiary);
    cursor: pointer;
}

.signal-type-buy { color: var(--up); font-weight: 600; }
.signal-type-sell { color: var(--down); font-weight: 600; }
.signal-type-tianyan { color: var(--signal); font-weight: 600; }
.signal-type-zizhu { color: var(--purple); font-weight: 600; }

/* 最新信号面板 */
.latest-signals {
    padding: 12px 16px;
}

.sig-advice {
    padding: 10px 14px;
    border-radius: var(--radius-lg);
    font-size: 14px;
    font-weight: 700;
    margin-bottom: 10px;
    text-align: center;
}
.sig-advice.buy { background: var(--up-glow); color: var(--up); border: 1px solid rgba(var(--up-rgb),0.3); }
.sig-advice.sell { background: var(--down-glow); color: var(--down); border: 1px solid rgba(var(--down-rgb),0.3); }
.sig-advice.watch { background: var(--signal-glow); color: var(--text-secondary); border: 1px solid var(--border-color); }

/* 买卖结论卡 */
.verdict-box {
    padding: 14px 16px;
    border-radius: var(--radius-xl);
    margin-bottom: 10px;
    border: 1px solid var(--border-color);
    background: var(--bg-primary);
    transition: box-shadow var(--t-mid);
}
.verdict-box:hover {
    box-shadow: var(--shadow-lg);
}
.verdict-box.buy { background: rgba(var(--up-rgb),0.08); border-color: rgba(var(--up-rgb),0.35); }
.verdict-box.add { background: var(--up-glow); border-color: rgba(var(--up-rgb),0.35); }
.verdict-box.watch { background: var(--signal-glow); border-color: rgba(var(--signal-rgb),0.3); }
.verdict-box.build { background: var(--up-glow); border-color: rgba(var(--up-rgb),0.35); }
.verdict-box.sell { background: var(--down-glow); border-color: rgba(var(--down-rgb),0.35); }
.verdict-box.neutral { background: var(--bg-tertiary); border-color: var(--border-color); }

.verdict-main {
    display: flex;
    align-items: center;
    flex-wrap: wrap;          /* v5.8 防线：空间不足时换行，绝不压缩子项（压窄会让「持有等待撞线」折成两行、「买卖结论」变竖排）。这一行只放「标签 + 唯一动词」 */
    gap: 12px;
    margin-bottom: 6px;
}
.verdict-label { font-size: 12px; color: var(--text-muted); font-weight: 600; }
.verdict-action { font-size: 22px; font-weight: 800; letter-spacing: 2px; }
.verdict-box.buy .verdict-action { color: var(--up); }
.verdict-box.add .verdict-action { color: var(--up); }
.verdict-box.watch .verdict-action { color: var(--signal); }
.verdict-box.build .verdict-action { color: var(--up); }
.verdict-box.sell .verdict-action { color: var(--down); }
.verdict-box.neutral .verdict-action { color: var(--text-secondary); }
.verdict-reason { font-size: 12px; color: var(--text-secondary); margin-bottom: 10px; line-height: 1.5; }
.verdict-plain {
    font-size: 13px; color: var(--text-primary); line-height: 1.7;
    margin-bottom: 10px; padding: 8px 10px; border-radius: var(--radius-md);
    background: var(--bg-secondary); border-left: 3px solid var(--signal);
}
.verdict-sellreason {
    font-size: 11px; color: var(--text-tertiary); margin-bottom: 8px;
    padding: 5px 8px; background: rgba(244, 67, 54, 0.06);
    border-left: 3px solid var(--down); border-radius: var(--radius-sm); line-height: 1.5;
}
.verdict-hint {
    width: 100%; margin-top: 8px; font-size: 11px; line-height: 1.4;
    color: var(--accent); background: rgba(var(--accent-rgb), 0.10);
    border-left: 3px solid var(--accent); border-radius: var(--radius-sm); padding: 6px 8px;
}
.verdict-takeprofit {
    width: 100%; margin-top: 8px; font-size: 11px; line-height: 1.4;
    color: #c0392b; background: rgba(var(--up-rgb), 0.10);
    border-left: 3px solid var(--up); border-radius: var(--radius-sm); padding: 6px 8px;
}
.verdict-prices { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 12px; }
.verdict-box > .vp-item { margin-bottom: 10px; }
/* v3.30: 持仓个股「主结论速览」横幅——统一长期/短线/加仓/T+1 口径，避免结论打架 */
.unified-verdict {
    width: 100%; margin: 2px 0 10px; font-size: 12.5px; line-height: 1.5; font-weight: 600;
    color: var(--text-primary); background: linear-gradient(90deg, rgba(var(--accent-rgb),0.14), rgba(var(--accent-rgb),0.04));
    border: 1px solid rgba(var(--accent-rgb),0.5); border-left: 4px solid var(--accent);
    border-radius: var(--radius-md); padding: 8px 12px;
}
.unified-verdict b { color: var(--accent); }
/* 未持仓版主结论：用偏冷的蓝灰色调，与持仓版(橙)区分 */
.unified-verdict.unheld {
    background: linear-gradient(90deg, rgba(var(--info-rgb),0.14), rgba(var(--info-rgb),0.04));
    border: 1px solid rgba(var(--info-rgb),0.5); border-left: 4px solid var(--info);
}
.unified-verdict.unheld b { color: var(--info); }
/* T+1 不参与时的关键价位标记 */
.td-muted-tag { font-size: 11px; color: var(--text-muted); font-weight: 400; }
/* 止损层级说明 */
.bp-stop-hierarchy {
    font-size: 12px; line-height: 1.6; color: var(--text-secondary);
    background: rgba(var(--up-rgb),0.07); border: 1px dashed rgba(var(--up-rgb),0.4);
    border-radius: var(--radius-md); padding: 8px 12px; margin: 10px 0;
}

/* 指标/价位网格 */
.vp-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(92px, 1fr));
    gap: 8px;
    margin-bottom: 10px;
}
.vp-item {
    flex: 1;
    min-width: 90px;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    padding: 7px 10px;
    text-align: center;
    transition: border-color var(--t-fast), background var(--t-fast);
}
.vp-item:hover {
    /* 对齐 .sig-card.none：仅降透明度，背景/边框不变 */
    opacity: 0.5;
}
.vp-label { display: block; font-size: 11px; color: var(--text-muted); margin-bottom: 2px; }
.vp-val { display: block; font-size: 15px; font-weight: 700; color: var(--text-primary); font-family: 'Consolas', monospace; }
/* v3.123: .vp-sub（指标术语的大白话注解）此前**无任何 CSS 定义** → 在 flex + monospace 环境下
   被压成一列竖排字（ADX 模块截图可见）。补上：块级 + 12px + 正常中文换行 + 左对齐。 */
.vp-sub {
    display: block;
    font-size: 12px;
    line-height: 1.45;
    font-weight: 400;
    font-family: inherit;
    color: var(--text-muted);
    text-align: left;
    margin-top: 3px;
    white-space: normal;
    word-break: break-word;
    overflow-wrap: anywhere;
}
/* v3.123: .vp-sub 上的涨跌/警示色（与 .vp-val 同语义，供 T+1 面板等复用） */
.vp-sub.vp-up { color: var(--up); }
.vp-sub.vp-down { color: var(--down); }
.vp-sub.vp-warn { color: var(--signal); }
.vp-val.vp-up { color: var(--up); }
.vp-val.vp-down { color: var(--down); }
.vp-val.vp-warn { color: var(--signal); }
.verdict-conds { display: flex; gap: 8px; margin-top: 8px; }
.verdict-conds .vp-item { flex: 1; min-width: 0; text-align: center; }
.verdict-conds .vp-val { font-size: 12px; font-weight: 400; font-family: inherit; line-height: 1.5; }

.vp-note {
    width: 100%; font-size: 11px; line-height: 1.4; color: var(--down);
    padding: 4px 2px 0; word-break: break-all;
}
.verdict-plain .vp-note {
    border-top: 1px dashed var(--border-color);
    margin-top: 8px; padding-top: 8px; padding-left: 0; padding-right: 0;
}
.vp-val.vp-entry { color: var(--accent); }
.vp-asof { font-size: 11px; color: var(--text-tertiary); margin-bottom: 4px; }
.vp-note.vp-warn { color: var(--signal); background: var(--signal-glow); border: 1px solid var(--signal); border-radius: var(--radius-md); padding: 6px 8px; }
.vp-note.vp-warn b { color: var(--down); }

.feature-card {
    margin: 10px 0;
    padding: 10px 12px;
    border-radius: var(--radius-lg);
    border: 1px dashed var(--border-color);
    background: var(--bg-secondary);
    font-size: 12px;
    line-height: 1.5;
}
.feature-card .fc-head {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
    margin-bottom: 6px;
}
.feature-card .fc-title {
    font-weight: 700;
    color: var(--text-secondary);
    letter-spacing: 1px;
}
.feature-card .fc-bucket {
    font-weight: 600;
    color: var(--text-primary);
    background: var(--bg-tertiary);
    border-radius: 6px;
    padding: 1px 8px;
}
.feature-card .fc-verb {
    font-weight: 800;
    letter-spacing: 1px;
    margin-left: auto;
}
.feature-card .fc-verb-hold { color: var(--signal); }
.feature-card .fc-verb-down { color: var(--down); }
.feature-card .fc-verb-out { color: var(--down); }
.feature-card .fc-verb-watch { color: var(--text-secondary); }
.feature-card .fc-tags {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
    margin-bottom: 4px;
}
.feature-card .fc-tag {
    padding: 1px 8px;
    border-radius: 999px;
    font-size: 11px;
    background: var(--bg-tertiary);
    color: var(--text-primary);
    border: 1px solid var(--border-light);
}
.feature-card .fc-meta-row {
    color: var(--text-muted);
    font-size: 11px;
}

.sig-cards-row {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
}

.sig-card {
    flex: 1;
    min-width: 140px;
    padding: 11px 14px;
    border-radius: var(--radius-lg);
    border: 1px solid var(--border-color);
    background: var(--bg-primary);
    transition: transform var(--t-fast), box-shadow var(--t-fast), border-color var(--t-fast);
}
.sig-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-lg);
}
.sig-card.buy { border-color: rgba(var(--up-rgb),0.35); background: rgba(var(--up-rgb),0.04); }
.sig-card.sell { border-color: rgba(var(--down-rgb),0.35); background: rgba(var(--down-rgb),0.04); }
.sig-card.watch { border-color: rgba(var(--signal-rgb),0.25); background: rgba(var(--signal-rgb),0.03); }
.sig-card.none { opacity: 0.5; }

.sig-card-title { font-size: 12px; font-weight: 700; color: var(--text-primary); margin-bottom: 4px; }
.sig-card-date { font-size: 11px; color: var(--text-muted); margin-bottom: 2px; }
.sig-card-price { font-size: 13px; font-weight: 600; color: var(--accent); margin-bottom: 2px; }
.sig-card-desc { font-size: 11px; color: var(--text-muted); line-height: 1.4; }

/* 评分展示 */
.score-bar { display: flex; gap: 8px; flex-wrap: wrap; padding: 6px 0; margin-top: 4px; }
.score-tag { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: var(--radius-md); font-size: 11px; font-weight: 600; }
.score-tag.score-buy { background: rgba(var(--up-rgb), 0.10); color: var(--up); }
.score-tag.score-sell { background: rgba(39, 174, 96, 0.10); color: var(--down); }
.score-tag.score-conf-vp-up { background: rgba(var(--up-rgb), 0.12); color: var(--up); border: 1px solid rgba(var(--up-rgb),0.3); }
.score-tag.score-conf-vp-warn { background: rgba(var(--accent-rgb), 0.12); color: var(--accent-2); border: 1px solid rgba(var(--accent-rgb),0.3); }
.score-tag.score-conf-vp-down { background: rgba(149, 165, 166, 0.12); color: var(--text-muted); border: 1px solid rgba(149,165,166,0.3); }
.sig-score { font-size: 10px; letter-spacing: -1px; }

/* ===== ETF 信号面板专用样式 v3.27 ===== */

/* 周期档位徽章 */
.etf-period-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 8px;
    border-radius: 4px;
    font-size: 11px;
    font-weight: 700;
    margin-left: 8px;
    vertical-align: middle;
}
.etf-period-badge.week  { background: var(--info)15; color: var(--info); border: 1px solid var(--info)40; }
.etf-period-badge.month { background: rgba(var(--accent-2-rgb), 0.08); color: var(--accent-2); border: 1px solid rgba(var(--accent-2-rgb), 0.25); }
.etf-period-badge.year  { background: #8e44ad15; color: #8e44ad; border: 1px solid #8e44ad40; }

/* 信号汇总网格 */
.etf-sig-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
    gap: 8px;
    padding: 10px 12px;
    background: var(--bg-tertiary);
    border-radius: var(--radius-md);
    margin-top: 8px;
}

/* 信号卡片（统一尺寸） */
.etf-sig-card {
    background: var(--bg-primary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    padding: 8px 10px;
    transition: transform 0.15s, box-shadow 0.15s;
    min-height: 60px;
    display: flex;
    flex-direction: column;
    justify-content: center;
}
.etf-sig-card:hover {
    transform: translateY(-1px);
    box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}

/* 方向色带 */
.etf-sig-card.up   { border-left: 3px solid var(--up);   }
.etf-sig-card.down { border-left: 3px solid var(--down); }
.etf-sig-card.neutral { border-left: 3px solid var(--signal); }
.etf-sig-card.dim { opacity: 0.55; }

/* 信号标签 + 值 */
.etf-sig-label {
    font-size: 11px;
    color: var(--text-muted);
    font-weight: 500;
    margin-bottom: 4px;
}
.etf-sig-val {
    font-size: 12px;
    font-weight: 700;
    color: var(--text-primary);
    line-height: 1.3;
}

/* 综合评分条 */
.etf-score-strip {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 12px;
    margin-top: 8px;
    margin-bottom: 8px;
    background: var(--bg-tertiary);
    border-radius: var(--radius-md);
    font-size: 12px;
}
.etf-score-strip .bar-track {
    flex: 1;
    height: 6px;
    background: var(--bg-primary);
    border-radius: 3px;
    overflow: hidden;
    position: relative;
}
.etf-score-strip .bar-fill {
    height: 100%;
    border-radius: 3px;
    transition: width 0.3s ease;
}
.etf-score-strip .bar-fill.buy  { background: linear-gradient(90deg, var(--up-glow), var(--up)); }
.etf-score-strip .bar-fill.sell { background: linear-gradient(90deg, var(--down-glow), var(--down)); }
.etf-score-strip .score-num {
    font-weight: 700;
    min-width: 32px;
    text-align: right;
}
.etf-score-strip .score-num.buy  { color: var(--up); }
.etf-score-strip .score-num.sell { color: var(--down); }

/* 档位切换提示 */
.etf-switch-hint {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 12px;
    margin-top: 8px;
    background: rgba(var(--signal-rgb),0.06);
    border: 1px solid rgba(var(--signal-rgb),0.25);
    border-radius: var(--radius-md);
    font-size: 12px;
    color: var(--signal);
}
.etf-switch-hint .sw-icon { font-size: 14px; }

/* 核心指标横排 */
.etf-core-metrics {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    padding: 8px 0;
    margin-top: 4px;
    font-size: 12px;
}
.etf-core-metrics .metric {
    display: flex;
    align-items: center;
    gap: 4px;
}
.etf-core-metrics .metric-label { color: var(--text-muted); }
.etf-core-metrics .metric-val  { font-weight: 700; }

/* 参数速查小卡 */
.etf-params-card {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 6px;
    padding: 8px 10px;
    background: var(--bg-tertiary);
    border-radius: var(--radius-md);
    margin-top: 6px;
    font-size: 11px;
}
.etf-params-card .param-row {
    display: flex;
    justify-content: space-between;
    gap: 6px;
}
.etf-params-card .param-key { color: var(--text-muted); }
.etf-params-card .param-val { font-weight: 600; color: var(--text-primary); }

/* 响应式：手机单列 */
@media (max-width: 640px) {
    .etf-sig-grid { grid-template-columns: repeat(2, 1fr); }
    .etf-params-card { grid-template-columns: 1fr; }
}

/* ===== ETF 动态总结卡片 ===== */
.etf-summary-card {
    background: var(--bg-primary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    padding: 12px 14px;
    margin-top: 8px;
    transition: box-shadow 0.2s;
}
.etf-summary-card:hover {
    box-shadow: 0 2px 12px rgba(0,0,0,0.06);
}

/* ===== 公式说明区 ===== */
.formula-section {
    padding: 15px 20px;
    background: var(--bg-tertiary);
    border-top: 1px solid var(--border-color);
    max-height: 220px;
    overflow-y: auto;
}

.formula-section summary {
    cursor: pointer;
    color: var(--text-secondary);
    font-weight: 600;
    font-size: 13px;
    padding: 4px 0;
}

.formula-block {
    margin: 10px 0;
    padding: 12px;
    background: var(--bg-primary);
    border-radius: var(--radius-sm);
    border-left: 3px solid var(--accent);
}

.formula-block h4 { color: var(--accent); margin-bottom: 6px; font-size: 13px; }
.formula-block pre { color: var(--text-secondary); font-family: 'Consolas', 'Monaco', monospace; font-size: 11px; white-space: pre-wrap; line-height: 1.5; }
.formula-block .note { color: var(--text-muted); font-size: 11px; margin-top: 6px; font-style: italic; }

.opt-tag { display: inline-block; background: rgba(var(--down-rgb),0.15); color: #2ecc71; font-size: 11px; padding: 1px 6px; border-radius: var(--radius-sm); margin-left: 6px; vertical-align: middle; }

/* 加载提示 */
.loading {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    color: var(--text-secondary);
    font-size: 14px;
}

/* 滚动条 */
* {
    scrollbar-width: thin;
    scrollbar-color: var(--border-color) transparent;
}

::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: var(--radius-pill); }
::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }

/* Toast */
.toast {
    position: fixed;
    bottom: 20px;
    right: 20px;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    color: var(--text-primary);
    padding: 10px 20px;
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-xl);
    z-index: 200;
    animation: slideIn 0.3s ease;
    backdrop-filter: blur(12px);
}

.toast.success { border-color: var(--down); }
.toast.error { border-color: var(--up); }

@keyframes slideIn {
    from { transform: translateX(100%); opacity: 0; }
    to { transform: translateX(0); opacity: 1; }
}

/* ===== 登录 / 注册弹窗 ===== */
.auth-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.75);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 1000;
    backdrop-filter: blur(8px);
}

.auth-box {
    width: 320px;
    max-width: 90vw;
    background: var(--bg-secondary);
    border: 1px solid var(--border-light);
    border-radius: var(--radius-xl);
    padding: 28px;
    box-shadow: var(--shadow-xl);
}

.auth-logo {
    font-size: 16px;
    font-weight: 700;
    color: var(--text-primary);
    text-align: center;
    margin-bottom: 18px;
    letter-spacing: 0.5px;
}

.auth-tabs { display: flex; gap: 8px; margin-bottom: 16px; }

.auth-tab {
    flex: 1;
    padding: 8px;
    border: 1px solid var(--border-color);
    background: var(--bg-tertiary);
    color: var(--text-secondary);
    border-radius: var(--radius-md);
    cursor: pointer;
    font-size: 13px;
    transition: all var(--t-fast);
}

.auth-tab.active {
    background: linear-gradient(135deg, var(--accent) 0%, var(--accent-2) 100%);
    color: #000;
    border-color: transparent;
    font-weight: 700;
}

.auth-form { display: flex; flex-direction: column; gap: 10px; }

.auth-input {
    background: var(--bg-primary);
    color: var(--text-primary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    padding: 10px 12px;
    font-size: 14px;
    font-family: inherit;
    transition: border-color var(--t-fast), box-shadow var(--t-fast);
}

.auth-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-glow); }

.auth-submit { padding: 10px; font-size: 14px; margin-top: 4px; }

.auth-hint { font-size: 12px; min-height: 16px; color: var(--text-muted); text-align: center; }
.auth-hint.err { color: var(--up); }

/* 顶栏用户区 */
.user-area {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: 10px;
}

.user-phone { color: var(--text-secondary); font-size: 12px; font-weight: 600; }

/* ===== 移动端顶部栏 / 蒙版 ===== */
.mobile-header { display: none; }
.sidebar-overlay { display: none; }

/* ===== 移动端自适应 ===== */
@media (max-width: 768px) {
    .app-layout {
        flex-direction: column;
        height: 100vh;
        min-height: 100vh;
        overflow: hidden;
        gap: 0;
    }

    .mobile-header {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 10px 14px;
        background: var(--bg-secondary);
        border-bottom: 1px solid var(--border-color);
        position: relative;
        flex-shrink: 0;
        z-index: 100;
        box-shadow: var(--shadow-sm);
    }

    .mobile-menu-btn {
        background: none;
        border: none;
        color: var(--accent);
        font-size: 22px;
        cursor: pointer;
        padding: 8px 12px;
        min-height: 44px;
        line-height: 1;
    }

    .mobile-title {
        font-size: 14px;
        font-weight: 700;
        color: var(--accent);
        flex: 1;
        text-align: left;
    }

    .mobile-user-area { margin-left: 0; flex-shrink: 0; }

    .watchlist-sidebar {
        position: fixed;
        top: 0;
        left: -260px;
        width: 240px;
        height: 100vh;
        z-index: 1001;
        transition: left 0.3s ease;
        box-shadow: var(--shadow-xl);
        border-right: 1px solid var(--border-color);
    }

    .watchlist-sidebar.open { left: 0; }

    .sidebar-overlay {
        display: none;
        position: fixed;
        inset: 0;
        background: rgba(0,0,0,0.6);
        z-index: 1000;
        backdrop-filter: blur(4px);
    }

    .sidebar-overlay.active { display: block; }

    .wl-items { max-height: none; flex: 1; }
    .toolbar .user-area { display: none !important; }

    /* 移动端禁止整块内容左右滑动（2026-09-28 修）
       ⚠ 病根：只写 overflow-y:auto 时，另一轴 visible 会被规范提升为 auto →
         .main-content 自己变成「横向滚动容器」。工具栏那一行
         （股票代码: + 输入框110px + 股票名称:xxx + 拉取K线）是单行不换行 flex，
         在 360px 手机上总宽 ≈378px > 屏幕宽 → 整块内容可左右滑、左边缘被齐头切。
       → 两处一起治：① 这里显式掐掉横向滚动；② 下方 .toolbar-group 允许换行+输入框可缩。 */
    html, body { overflow-x: hidden; max-width: 100%; }
    .main-content {
        height: auto;
        min-height: 0;
        overflow-x: hidden;
        overflow-x: clip;      /* 新浏览器：不产生滚动容器，也不影响 .toolbar 的 sticky */
        overflow-y: auto;
        max-width: 100vw;
    }
    .toolbar { gap: 8px; padding: 8px 12px; }
    .toolbar-title { display: none; }
    .toolbar-hint { display: none; }
    /* 代码/名称行：允许换行 + 输入框可伸缩，保证单行内容永远不宽于屏幕 */
    .toolbar-group { padding: 0; border-right: none; flex-wrap: wrap; row-gap: 6px; max-width: 100%; }
    .toolbar-group > label:first-child { flex: 0 0 auto; }
    #gpmc { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
    .code-input { flex: 1 1 96px; width: auto; min-width: 88px; }
    .chart-area { min-height: 440px; height: 64vh; }
    .verdict-prices .vp-item { min-width: 70px; }
}

@media (max-width: 480px) {
    .chart-area { min-height: 410px; height: 60vh; }
    .wl-add-row { flex-wrap: wrap; }
    .wl-code-input { width: 80px; }
    .verdict-action { font-size: 18px; }
    .sig-card { min-width: 100%; }
    .toolbar-title { width: 100%; }
}

/* ===== 短线·做T 辅助决策模块 ===== */
.td-sub-h {
    font-size: 12px; font-weight: 700; color: var(--text-secondary);
    margin: 12px 0 6px; padding-left: 8px; border-left: 3px solid var(--accent);
    text-align: center;
}
.bp-gate-tag {
    font-size: 11px; font-weight: 400; opacity: .7; margin-left: 4px;
    background: rgba(127,127,127,.14); padding: 1px 6px; border-radius: var(--radius-pill);
}
.td-ref { padding: 4px 2px; font-size: 12px; }
.td-ref-sec { margin-bottom: 14px; }
.td-ref-h {
    font-size: 12px; font-weight: 700; color: var(--text-secondary);
    margin-bottom: 6px; padding-left: 8px; border-left: 3px solid var(--signal);
}
.td-ref-table { width: 100%; border-collapse: collapse; font-size: 11px; }
.td-ref-table th, .td-ref-table td {
    border: 1px solid var(--border-color); padding: 4px 6px; text-align: left; vertical-align: top;
}
.td-ref-table th { background: var(--bg-tertiary); color: var(--text-tertiary); font-weight: 600; }
.td-ref-table td.td-bad { color: var(--down); font-weight: 600; }
.td-ref-table td.td-warn { color: var(--signal); font-weight: 600; }
.td-ref-table td.td-good { color: var(--up); font-weight: 600; }
.td-ref-list { margin: 0; padding-left: 18px; line-height: 1.7; }
.td-ref-list b { color: var(--text-primary); }
.td-ref-list i { color: var(--signal); font-style: normal; font-size: 11px; }

/* 短线·做T 直接结论横幅 */
.chase-conclusion { border-radius: var(--radius-xl); padding: 14px 16px; margin-bottom: 12px; border: 1px solid; }
.chase-conclusion.ok   { background: var(--up-glow);  border-color: var(--up); }
.chase-conclusion.warn { background: var(--signal-glow); border-color: var(--signal); }
.chase-conclusion.bad  { background: var(--down-glow);  border-color: var(--down); }
.cc-title { font-size: 13px; font-weight: 800; letter-spacing: 1px; margin-bottom: 8px; color: var(--text-primary); }
.chase-conclusion.ok   .cc-title { color: var(--up); }
.chase-conclusion.warn .cc-title { color: var(--signal); }
.chase-conclusion.bad  .cc-title { color: var(--down); }
.cc-chips { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.cc-chip { font-size: 14px; font-weight: 800; padding: 5px 12px; border-radius: var(--radius-pill); border: 1px solid; }
.cc-chip.ok   { color: var(--up);      background: rgba(var(--up-rgb),0.14);  border-color: var(--up); }
.cc-chip.warn { color: var(--signal);  background: rgba(var(--signal-rgb),0.14); border-color: var(--signal); }
.cc-chip.bad  { color: var(--down);     background: rgba(var(--down-rgb),0.10); border-color: var(--down); }
.cc-action { font-size: 12.5px; line-height: 1.6; color: var(--text-secondary); }

/* ===== UI Audit Fixes ===== */

/* prefers-reduced-motion */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

/* focus-visible */
:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 1px;
    border-radius: inherit;
}

.wl-input:focus-visible,
.code-input:focus-visible,
.cost-input:focus-visible,
.addon-input:focus-visible,
.auth-input:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 1px;
}

/* bp-triggered 标注（v3.5.2） */
.bp-triggered {
    color: var(--down);
    font-weight: 600;
}

/* 版本号标签 */
.version-tag {
    display: inline-block;
    background: rgba(var(--accent-rgb), 0.15);
    color: var(--accent);
    font-size: 10px;
    font-weight: 700;
    padding: 1px 6px;
    border-radius: var(--radius-pill);
    margin-left: 6px;
    vertical-align: middle;
    border: 1px solid rgba(var(--accent-rgb), 0.3);
}

/* v3.9: 追涨替代价 vs 回望建仓价 并列对比 */
.bp-entry-compare {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
    margin-bottom: 12px;
}
@media (max-width: 600px) {
    .bp-entry-compare { grid-template-columns: 1fr; }
}
.bp-entry-card {
    text-align: center;
    padding: 14px 10px;
    border-radius: var(--radius-xl);
    background: var(--bg-tertiary);
    border: 1px solid var(--border-color);
}
.bp-entry-card.pullback { border-color: rgba(var(--accent-rgb),0.3); }
.bp-entry-card.chase { border-color: rgba(var(--up-rgb),0.3); background: rgba(var(--up-rgb),0.05); }
.bp-entry-card .bp-entry-stats {
    display: flex;
    justify-content: center;
    gap: 12px;
    margin: 6px 0;
    font-size: 12px;
    color: var(--text-secondary);
}
.bp-entry-card.chase .bp-entry-price { color: var(--up); }
.bp-entry-card .bp-entry-note { font-size: 11px; color: var(--text-tertiary); margin-top: 4px; line-height: 1.4; }

/* v3.79.45: 不可动手的档位——不摆进场方案，只给状态词 + 转可动手的条件 */
.bp-entry-card.is-idle { border-style: dashed; background: var(--bg-tertiary); }
.bp-entry-card.chase.is-idle { background: var(--bg-tertiary); }
.bp-entry-idle {
    font-size: 17px; font-weight: 700; color: var(--text-tertiary);
    line-height: 1.5; padding: 3px 0;
}
.bp-entry-need {
    font-size: 11px; color: var(--text-secondary); text-align: left;
    margin-top: 6px; padding: 5px 8px; border-radius: var(--radius-sm);
    background: var(--bg-secondary, var(--bg-tertiary)); line-height: 1.5;
}
/* v3.79.48: 与主表同源的去重提示（伏击价 = 建议建仓价时，不再重复列止损/目标/盈亏比） */
.bp-entry-shared {
    font-size: 10.5px; color: var(--text-tertiary); text-align: center;
    margin-top: 4px; line-height: 1.5;
}

/* v3.79.9: 个股「伏击 vs 追高」双轨决策块（嵌入买卖结论卡片） */
.chase-decision { margin: 12px 0 4px; }
.chase-decision .bp-section-title { margin-bottom: 8px; }
/* v3.79.9: 追高信号清单（非跳空 · 多重过滤） */
.chase-detail { margin-top: 10px; padding: 8px 10px; border: 1px dashed var(--border-tertiary, #555); border-radius: 8px; background: var(--background-secondary, rgba(0,0,0,0.06)); }
.chase-detail-title { font-size: 12px; font-weight: 600; color: var(--text-secondary); margin-bottom: 6px; }
.chase-signal-grid { display: flex; flex-wrap: wrap; gap: 4px 6px; }
.chase-sig { font-size: 10.5px; padding: 2px 7px; border-radius: 10px; line-height: 1.4; white-space: nowrap; }
.chase-sig.on { color: var(--up, #e23); background: color-mix(in srgb, var(--up, #e23) 14%, transparent); }
.chase-sig.off { color: var(--text-tertiary); background: color-mix(in srgb, var(--text-tertiary) 12%, transparent); }
.chase-confirm { font-size: 11px; margin-top: 6px; color: var(--up, #e23); }
.chase-confirm.dim { color: var(--text-tertiary); }
.chase-rec {
    padding: 8px 12px; border-radius: var(--radius-md); background: var(--bg-tertiary);
    font-size: 13px; font-weight: 600; margin-bottom: 10px; line-height: 1.5;
}
.chase-rec.ambush { color: var(--signal); }
.chase-rec.chase { color: var(--up); }
.chase-rec.neutral { color: var(--text-secondary); }
.chase-decision .bp-term-note { margin-top: 8px; }
@media (max-width: 600px) {
    .chase-decision .bp-entry-compare { grid-template-columns: 1fr; }
}

/* ===== v3.11: 板块环境摘要（极简版）===== */
.sector-panel .signal-panel-header { margin-bottom: 0; }
.sector-industry-tag {
    padding: 6px 14px; background: var(--bg-tertiary); border-radius: 6px;
    font-size: 13px; color: var(--text-secondary); margin-bottom: 8px;
}
.sector-industry-tag b { color: var(--accent); }
.sector-verdict {
    padding: 8px 14px; border-radius: 6px; font-size: 14px; font-weight: 600; margin-bottom: 8px;
}
.sector-tone-up { background: rgba(34,197,94,0.12); color: var(--up); }
.sector-tone-down { background: rgba(239,68,68,0.12); color: var(--down); }
.sector-tone-neutral { background: var(--bg-tertiary); color: var(--text-secondary); }
.sector-details { display: flex; flex-direction: column; gap: 4px; padding: 0 14px 8px; }
.sector-detail-row {
    display: flex; align-items: center; gap: 8px; font-size: 12px;
    padding: 4px 0; border-bottom: 1px solid rgba(255,255,255,0.04);
}
.sector-detail-row:last-child { border-bottom: none; }
.sector-detail-label {
    min-width: 48px; color: var(--text-muted); font-weight: 500; font-size: 11px;
}
.sector-detail-text { color: var(--text-secondary); flex: 1; }
.tone-up .sector-detail-text { color: var(--up); }
.tone-down .sector-detail-text { color: var(--down); }
.tone-neutral .sector-detail-text { color: var(--text-secondary); }
.sector-errors { font-size: 11px; color: var(--text-muted); margin-top: 6px; padding: 4px 14px; }
/* v3.30: 板块环境「统一解读」——点明局部催化/资金流/整体风险的层级关系，化解表面矛盾 */
.sector-reconcile {
    font-size: 11.5px; line-height: 1.55; color: var(--text-secondary);
    background: var(--bg-tertiary); border-left: 3px solid var(--text-muted);
    border-radius: var(--radius-sm); padding: 7px 12px; margin: 4px 14px 10px;
}

/* ============ v3.42: 做T 视图已改为「方向状态标签 + 分时主图」，原缩略日K(.tk-wrap/#tKlineCanvas)已移除 ============ */

/* ============ v3.69: 宽基 regime 徽章（大盘环境，决策偏置来源） ============ */
.regime-badge {
    display: inline-flex; align-items: center;
    font-size: 12px; font-weight: 700; letter-spacing: .3px;
    padding: 3px 10px; border-radius: 10px; margin-left: 6px;
    border: 1px solid transparent; white-space: nowrap;
}
.regime-badge.regime-bull { background: rgba(214,48,49,.16); color: #ff6b6b; border-color: rgba(214,48,49,.45); }
.regime-badge.regime-bear { background: rgba(0,184,148,.16); color: #2ecc9b; border-color: rgba(0,184,148,.45); }
.regime-badge.regime-neutral { background: rgba(var(--accent-rgb),.16); color: var(--accent); border-color: rgba(var(--accent-rgb),.45); }

/* ===== v3.76 持仓面板 mainLayout1（账户资产视图） ===== */
.main-layout-portfolio { padding: 10px; display: flex; flex-direction: column; gap: 10px; }
.portfolio-header { background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-lg); padding: 10px 14px; }
.portfolio-title-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.portfolio-title { font-size: 15px; font-weight: 700; color: var(--text-primary); }
.portfolio-tools { margin-left: auto; }

.portfolio-summary { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.pf-summary-card { background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-lg); padding: 10px 14px; }
.pf-sum-label { font-size: 12px; color: var(--text-muted); margin-bottom: 4px; }
.pf-sum-value { font-size: 20px; font-weight: 700; color: var(--text-primary); font-family: 'Consolas', monospace; }
.pf-sum-sub { font-size: 11px; color: var(--text-muted); margin-top: 2px; }

.portfolio-table-wrap { background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-lg); overflow-x: auto; }
.portfolio-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.portfolio-table thead th { padding: 9px 12px; font-size: 12px; font-weight: 600; color: var(--text-muted); text-align: right; border-bottom: 1px solid var(--border-color); white-space: nowrap; }
.portfolio-table thead th.pf-col-stock { text-align: left; }
.portfolio-table tbody td { padding: 10px 12px; text-align: right; border-bottom: 1px solid var(--border-light); vertical-align: middle; }
.portfolio-table tbody td:first-child { text-align: left; }
.portfolio-table tbody tr:last-child td { border-bottom: none; }
.pf-row { cursor: pointer; transition: background var(--t-fast); }
.pf-row:hover { background: var(--bg-tertiary); }
.pf-row-fill { cursor: default; }
.pf-row-fill:hover { background: transparent; }
.pf-stock-name { font-weight: 700; color: var(--text-primary); font-size: 14px; }
.pf-etf-tag { display: inline-block; margin-left: 6px; padding: 0 6px; font-size: 10px; font-weight: 600; color: var(--accent); border: 1px solid var(--accent); border-radius: var(--radius-pill); vertical-align: 1px; }
.pf-stock-meta { font-size: 11px; color: var(--text-muted); margin-top: 3px; }
.pf-num { font-family: 'Consolas', monospace; font-weight: 600; font-size: 14px; color: var(--text-primary); }
.pf-sub { font-size: 11px; color: var(--text-muted); margin-top: 2px; font-family: 'Consolas', monospace; }
.pf-up { color: var(--up) !important; }
.pf-down { color: var(--down) !important; }
.pf-empty, .pf-loading, .pf-row-err { text-align: center; color: var(--text-muted); padding: 24px 12px !important; }
.pf-row-err { color: var(--down); }
.pf-fill-box { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: 12px; color: var(--text-secondary); }
.pf-fill-box label { display: flex; align-items: center; gap: 5px; white-space: nowrap; }
.pf-input { width: 90px; padding: 5px 8px; background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: var(--radius-md); color: var(--text-primary); font-family: 'Consolas', monospace; font-size: 12px; }
.pf-input:focus { outline: none; border-color: var(--accent); }
.portfolio-hint { font-size: 11px; color: var(--text-muted); padding: 0 4px; }
/* v3.82.5: T+1 出场参考提醒（红色，与微信推送同口径；不加粗以贴近提示行体感） */
.pf-exit-ref { color: #d5422e; font-weight: 600; margin-top: 4px; }

/* 左侧表单：持仓股数输入行 */
.wl-shares-row { gap: 6px; }
.wl-shares-input { flex: 1; }
@media (max-width: 768px) {
    .portfolio-summary { grid-template-columns: repeat(2, 1fr); } /* v3.127: 移动端恢复两卡一行 */
    .pf-sum-value { font-size: 16px; }
}

/* ===== v3.79.2: 做T推送设置（mainLayout1 内，按用户 SendKey + 开关） ===== */
/* v3.79.40: v3.79.38 的 hidden 属性被下面 display:flex 压掉（作者样式 > UA 样式表），PC 端仍显示 → !important 防御（v3.79.41 PC 已弃用此模块，接口保留给小程序） */
.pf-push-settings[hidden] { display: none !important; }
.pf-push-settings { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 10px 12px; margin: 4px 0 0; background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-lg); }
/* v3.151: PC 端隐藏「技术信号推送」面板。此规则比 UA 的 [hidden]{display:none} 特异性高，
   单靠 index.html 的 hidden 属性压不住 display:flex —— 必须显式收口，否则 JS 未跑完之前会闪一下。 */
.pf-push-settings[hidden] { display: none !important; }
.pf-push-title { font-size: 12px; font-weight: 600; color: var(--text-primary); white-space: nowrap; }
.pf-push-switch { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--text-secondary); white-space: nowrap; cursor: pointer; }
.pf-push-switch input { accent-color: var(--accent); cursor: pointer; }
.pf-push-input { flex: 1; min-width: 200px; max-width: 320px; padding: 6px 10px; background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: var(--radius-md); color: var(--text-primary); font-family: 'Consolas', monospace; font-size: 12px; }
.pf-push-input:focus { outline: none; border-color: var(--accent); }
.pf-push-note { font-size: 11px; color: var(--text-muted); }
.pf-push-hint { flex: 1 1 100%; font-size: 11px; color: var(--text-muted); line-height: 1.7; }
.pf-push-hint a { color: var(--accent); }
.pf-push-hint b { color: var(--text-primary); }
.pf-cyc-rules { margin: 4px 0 4px 18px; padding: 0; list-style: none; }
.pf-cyc-rules li { position: relative; padding-left: 14px; margin: 2px 0; line-height: 1.65; }
.pf-cyc-rules li::before { content: '•'; position: absolute; left: 0; color: var(--accent); }
.pf-cyc-rules li ul { margin: 2px 0 2px 6px; padding: 0; list-style: none; }
.pf-cyc-rules li ul li { padding-left: 14px; }
.pf-cyc-rules li ul li::before { content: '◦'; color: var(--text-muted); }
/* v3.79.30: 推送资格时效展示（剩余天数 + 状态徽章 + 续期按钮） */
.pf-push-quota { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; flex: 1 1 100%; }
.pf-push-days { font-size: 12px; font-weight: 600; color: var(--text-primary); white-space: nowrap; }
.pf-push-badge { font-size: 11px; padding: 2px 9px; border-radius: 999px; font-weight: 600; white-space: nowrap; }
.pf-push-badge.badge-ok { color: #1a7f3c; background: rgba(36, 161, 86, 0.14); }
.pf-push-badge.badge-warn { color: var(--accent); background: rgba(184, 134, 11, 0.14); }
.pf-push-badge.badge-exp { color: #c0392b; background: rgba(192, 57, 43, 0.14); }
@media (max-width: 768px) {
    .pf-push-settings { flex-wrap: wrap; }
    .pf-push-input { flex: 1 1 100%; max-width: none; }
}
/* v3.79.31: CYC 闸门周期配置行 */
.pf-push-cyc { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; flex: 1 1 100%; font-size: 12px; color: var(--text-muted); }
.pf-push-cyc label { color: var(--text-primary); font-weight: 600; }
.pf-push-cyc-input { width: 64px; padding: 4px 7px; border: 1px solid var(--border-color); border-radius: 6px; background: var(--bg-primary); color: var(--text-primary); font-size: 12px; }
.pf-push-cyc-unit { color: var(--text-muted); }
.pf-push-cyc-note { font-size: 11px; color: var(--accent); }

/* v3.79.32: 看广告续期弹窗（小程序二维码） */
.modal-mask { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.55); display: flex; align-items: center; justify-content: center; z-index: 1000; padding: 18px; }
.modal-box { position: relative; background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: 14px; padding: 22px 22px 18px; max-width: 340px; width: 100%; box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35); }
.modal-close { position: absolute; top: 8px; right: 10px; width: 28px; height: 28px; border: none; background: transparent; color: var(--text-muted); font-size: 22px; line-height: 1; cursor: pointer; border-radius: 8px; }
.modal-close:hover { background: var(--bg-primary); color: var(--text-primary); }
.pf-qr-modal { text-align: center; }
.pf-qr-title { font-size: 15px; font-weight: 700; color: var(--text-primary); margin-bottom: 8px; }
.pf-qr-sub { font-size: 12px; color: var(--text-muted); line-height: 1.6; margin-bottom: 14px; }
.pf-qr-sub b { color: var(--accent); }
.pf-qr-img { width: 200px; height: 200px; object-fit: contain; border-radius: 10px; background: #fff; border: 1px solid var(--border-color); margin: 0 auto 12px; display: block; }
.pf-qr-tip { font-size: 11px; color: var(--text-muted); min-height: 14px; margin-bottom: 12px; line-height: 1.5; }
.pf-qr-tip:empty { margin-bottom: 4px; }
#pfQrRefresh { width: 100%; }

/* ===== v3.79.50: 登录后可见的小程序配置引导区 ===== */
.pf-miniprogram { margin: 12px 0; border: 1px solid var(--border-color); border-radius: var(--radius-lg); overflow: hidden; background: var(--bg-card); }
.pf-mini-banner { background: #e11d2e; color: #fff; font-weight: 700; font-size: 15px; padding: 10px 14px; text-align: center; letter-spacing: .5px; }
.pf-mini-body { display: flex; gap: 14px; padding: 14px; align-items: center; }
.pf-mini-qr { flex: 0 0 auto; }
.pf-mini-qr-img { width: 116px; height: 116px; object-fit: contain; border-radius: 8px; background: #fff; border: 1px solid var(--border-color); display: block; }
.pf-mini-info { flex: 1 1 auto; min-width: 0; }
.pf-mini-days { font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 6px; }
.pf-mini-tip { font-size: 13px; line-height: 1.5; margin: 4px 0 8px; }
.pf-mini-tip-warn { color: #b45309; font-weight: 600; }
.pf-mini-tip-alert { color: #e11d2e; font-weight: 700; }
.pf-mini-hint { font-size: 12px; color: var(--text-muted); line-height: 1.5; margin: 4px 0 10px; }
@media (max-width: 768px) {
    .pf-mini-body { flex-direction: column; align-items: stretch; }
    .pf-mini-qr { align-self: center; }
}

/* ===== v3.79.5: 移动端「全部信号列表」卡片式布局 ===== */
/* 桌面表格 4 列固定宽(110+120+80=310px)，手机上"说明"列只剩 ~40px 竖着挤；
   移动端改为卡片两行：第一行 日期+类型+收盘价，第二行 说明独占全宽 */
@media (max-width: 768px) {
    .signal-panel-scroll { max-height: 55vh; }              /* 手机屏高，给列表更多可视行数 */
    .signal-panel-header { padding: 9px 12px; }
    .signal-table thead { display: none; }                  /* 卡片化后表头无意义 */
    .signal-table tbody { display: block; }
    .signal-table tr {
        display: flex; flex-wrap: wrap; align-items: baseline;
        padding: 8px 12px;
        border-bottom: 1px solid var(--border-color);
    }
    .signal-table tr:last-child { border-bottom: none; }
    .signal-table tr:hover { background: transparent; }     /* 触屏无 hover，避免点按残留高亮 */
    .signal-table td { display: block; border-bottom: none; padding: 1px 0; }
    .signal-table td:nth-child(1) { order: 1; flex: 0 0 76px; font-size: 11px; font-family: 'Consolas', monospace; }
    .signal-table td:nth-child(2) { order: 2; flex: 1 1 auto; min-width: 0; }
    .signal-table td:nth-child(3) { order: 3; flex: 0 0 auto; padding-left: 10px; font-family: 'Consolas', monospace; font-weight: 600; color: var(--text-primary); }
    .signal-table td:nth-child(4) { order: 4; flex: 1 1 100%; margin-top: 4px; padding-left: 76px; font-size: 11px; line-height: 1.55; }
    /* 空状态/占位行（colspan=4）在 flex 行里恢复正常居中 */
    .signal-table td[colspan] { flex: 1 1 100%; order: 0; width: auto !important; padding: 14px 0; text-align: center; }
    /* 触屏点击目标：按钮不低于 32px 高 */
    .btn { min-height: 32px; }
    .btn-sm { padding: 6px 12px; }
}

/* ===== v3.79.6: 移动端全模块第二波优化 ===== */
@media (max-width: 768px) {
    /* 面板内边距统一收紧：20px 侧距在小屏两侧空旷 */
    #chaseJudgeContent,
    .build-inputs,
    .addon-inputs,
    .build-gate,
    .build-result,
    .latest-signals { padding-left: 12px; padding-right: 12px; }
    .sector-reconcile { margin: 4px 12px 10px; }
    .sector-details, .sector-errors { padding-left: 12px; padding-right: 12px; }
    .sector-details { padding-bottom: 8px; }

    /* 做T 方向标签：字号/间距收紧，降低换行高度 */
    .td-dir-chip { font-size: 12.5px; }
    .td-dir-chips { gap: 6px 10px; }
    .td-direction-bar { gap: 6px 10px; padding: 6px 10px; }
    .td-gate { padding: 8px 10px; }

    /* 自动刷新锁定提示允许换行，避免横向溢出 */
    .intraday-refresh-locked { white-space: normal; line-height: 1.4; }

    /* 持仓表紧凑化：减少横向滚动，补填框流式全宽 */
    .portfolio-table { font-size: 12px; }
    .portfolio-table thead th { padding: 7px 8px; }
    .portfolio-table tbody td { padding: 7px 8px; }
    .pf-stock-name { font-size: 13px; }
    .pf-num { font-size: 12.5px; }
    .pf-fill-box { width: 100%; }
    .pf-fill-box .pf-input { flex: 1 1 90px; width: auto; }

    /* Toast 贴底通栏居中 */
    .toast { left: 12px; right: 12px; bottom: 12px; text-align: center; }

    /* iOS 聚焦防缩放：输入字号提到 16px（<16px 时 Safari 会自动放大页面） */
    .wl-input, .code-input, .addon-input, .pf-input, .pf-push-input, .auth-input { font-size: 16px; }
}
@media (max-width: 640px) {
    /* 加仓输入 3 列在 360px 每列 ~110px 挤爆 → 单列 */
    .addon-inputs { grid-template-columns: 1fr; }
}
@media (max-width: 480px) {
    /* 顶栏手机号腾空间：360px 屏 手机号+💼+退出 过挤 */
    .user-phone { display: none; }
}

/* ===== v3.79.7: 买卖结论卡指标网格整齐化 ===== */
/* 旧版 flex+min-width：每行卡片数/宽度不定，「目标1(减仓)」等标签被截断 */
.verdict-prices { display: grid; grid-template-columns: repeat(auto-fill, minmax(118px, 1fr)); gap: 8px; }
.verdict-prices .vp-item { min-width: 0; }
/* vp-note 警告条跨列显示 */
.verdict-prices .vp-note { grid-column: 1 / -1; width: auto; }
/* 文字型长条目（时间止损/最大亏损/盈亏比等）：桌面等分一行，手机单列通栏，格子等高居中 */
.verdict-conds .vp-item { display: flex; flex-direction: column; justify-content: center; align-items: center; }
.verdict-conds .vp-val { text-align: center; }
@media (max-width: 768px) {
    .verdict-conds { flex-direction: column; }
    .verdict-conds .vp-item { width: 100%; }
}

/* ===== v3.79.8: signal-card 系列样式补全 + 做T分时头移动端排版 ===== */
/* 根因修复：signal-card/bp-state/bp-note 此前在 CSS 中完全无定义（历史遗漏），
   建仓/加仓助手"当前信号：观望"长文案渲染成无间距裸文本 */
.signal-card {
    display: block;
    padding: 12px 14px;
    background: var(--bg-secondary);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-lg);
    font-size: 13px;
    color: var(--text-secondary);
}
.signal-card.neutral { background: var(--bg-tertiary); }
.bp-state { font-size: 14px; font-weight: 700; color: var(--text-primary); }
.bp-note { margin-top: 6px; font-size: 12.5px; line-height: 1.75; color: var(--text-secondary); }

@media (max-width: 768px) {
    /* 面板头：标题一行，副标题换行到第二行左对齐，不再挤在同一行 */
    .signal-panel-header { flex-wrap: wrap; row-gap: 2px; padding-top: 8px; padding-bottom: 8px; }
    .signal-panel-header .panel-sub { flex: 1 1 100%; text-align: left; }

    /* 做T分时标题行：标题独占一行不折行；刷新开关/日期换行到第二行 */
    .panel-title-row { flex-wrap: wrap; row-gap: 5px; }
    .panel-title { flex: 0 0 auto; white-space: nowrap; }
    .intraday-tools { margin-left: 0; flex: 1 1 100%; flex-wrap: wrap; gap: 6px 10px; }
    /* 锁定提示独占整行，与复选框文字左对齐，不再折成两行高矮不齐 */
    .intraday-refresh-locked {
        display: block; flex: 1 1 100%;
        white-space: normal; line-height: 1.5;
        padding: 3px 9px; margin-left: 22px;
    }

    /* 输入标签 11px→12px，移动端可读性 */
    .addon-row label { font-size: 12px; }
}

/* ===== v3.79.9: 做T分时头两行紧凑排版（覆盖 v3.79.8 的多行堆叠） ===== */
/* 日期紧跟工具组同侧：标题 …… 交易日xxxx ● 自动刷新(30s) */
.panel-title-row > .panel-sub { margin-left: auto; }
.panel-title-row .intraday-tools { margin-left: 12px; }
@media (max-width: 768px) {
    .panel-title-row { row-gap: 4px; }
    /* 第1行：标题 + 交易日（右对齐）；第2行：实时点 + 刷新开关 + 锁定提示，单行紧凑 */
    .intraday-tools { margin-left: 0; flex: 1 1 100%; flex-wrap: nowrap; gap: 8px; }
    .intraday-refresh-toggle { flex: 1 1 auto; min-width: 0; flex-wrap: nowrap; }
    .intraday-refresh-locked {
        display: inline-block; flex: 1 1 auto; min-width: 0;
        white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
        margin-left: 0; padding: 2px 8px; font-size: 10.5px; line-height: 1.6;
    }
}

/* ===== v3.79.10: PC 端 bp-summary 固定 5 列（全桌面端，不依赖宽度）===== */
.bp-summary { display: grid !important; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)) !important; gap: 8px !important; margin: 8px 0 !important; }
.bp-sum-item { padding: 8px 12px; }
.bp-sum-item > span { font-size: 11px; }
.bp-sum-item > b { font-size: 13px; }
.bp-term-note { font-size: 11.5px; padding: 5px 10px; }
.bp-section-title { margin: 12px 0 8px; }

/* ============ v3.79.17 最新信号面板 · PC 排版重构（专业大气版） ============ */
/* 1) 结论 hero：大字结论 + 间距 */
.verdict-box { padding: 18px 20px 16px; }
.verdict-main { gap: 14px; margin-bottom: 10px; }
.verdict-label { font-size: 13px; letter-spacing: 2px; }
.verdict-action { font-size: 26px; letter-spacing: 3px; }

/* 2) verdict-box 直接子 vp-item（场景条/建仓信号等级）→ 左对齐横带，替代全宽居中堆字 */
.verdict-box > .vp-item {
    display: flex; align-items: center; justify-content: flex-start; gap: 14px;
    text-align: left; padding: 8px 14px; margin-bottom: 8px;
    border-left: 3px solid var(--accent); border-radius: var(--radius-sm);
}
.verdict-box > .vp-item .vp-label { margin-bottom: 0; flex: 0 0 auto; font-size: 12px; }
.verdict-box > .vp-item .vp-val { font-size: 13px; font-weight: 600; font-family: inherit; line-height: 1.5; flex: 1 1 auto; }

/* 3) 结论理由：左竖线分层，行距放松 */
.verdict-reason { font-size: 12px; line-height: 1.7; padding: 2px 0 2px 10px; border-left: 2px solid var(--border-light); }

/* 4) 价格卡网格：auto-fit 折叠空轨道 → 卡片拉满整行不留白；统一卡高 */
.verdict-prices { grid-template-columns: repeat(auto-fit, minmax(128px, 1fr)); gap: 10px; margin-top: 14px; padding-top: 14px; border-top: 1px dashed var(--border-color); }
.verdict-prices .vp-item { min-height: 66px; display: flex; flex-direction: column; justify-content: center; gap: 3px; }
.verdict-prices .vp-label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* 5) 长文案数值卡（时间止损/最大亏损/盈亏比）：等线小字，防三行撑爆 */
.vp-val.vp-sub-val { font-size: 12px; font-weight: 600; font-family: inherit; line-height: 1.45; letter-spacing: 0; }

/* 5b) v3.79.51: 原「跌到止损亏 / 赚赔比」通栏合并行（v3.79.49 新增）已整块移除，
      其专用样式 .vp-item.is-wide / .vp-plain 一并删除，避免留下死规则。 */

/* 6) 移动端回退 */
@media (max-width: 768px) {
    .verdict-box > .vp-item { flex-direction: column; align-items: flex-start; gap: 2px; }
    .verdict-action { font-size: 20px; }
}

/* ================= v3.79.25 平仓账本 / 4位小数 / 盈亏对调（券商APP标准口径） ================= */
/* v3.79.29: 与其他汇总卡完全一致（不另设底色/描边/左边条） */
.pf-summary-card.pf-sum-total { background: var(--bg-secondary); border: 1px solid var(--border-color); }
.pf-row-closed { opacity: .82; }
.pf-row-closed .pf-num { color: var(--text-muted); }
.pf-closed-tag { display: inline-block; margin-left: 6px; padding: 1px 6px; font-size: 11px; border-radius: 4px; background: var(--bg-tertiary); color: var(--text-muted); border: 1px solid var(--border-color); }
.pf-col-act { width: 88px; text-align: center; }
/* v3.81.8: 「止盈/止损」列——上行 tp1（红）、下行 stopLoss（绿），带相对成本百分比 */
.portfolio-table thead th.pf-col-plan { text-align: center; }
.pf-col-plan { width: 140px; text-align: center; }
.pf-col-plan .pf-num { font-size: 13px; font-weight: 600; line-height: 1.35; white-space: nowrap; }
.pf-col-plan .pf-sub { font-size: 11px; font-weight: 400; margin-left: 4px; opacity: .85; color: inherit; }
.pf-act-sell { padding: 3px 10px; font-size: 12px; margin-bottom: 5px;}
.pf-act-undo { padding: 3px 8px; font-size: 12px; color: var(--text-muted); }
.pf-muted { color: var(--text-muted) !important; }

/* ================= v3.83.1 「止盈/止损参考」列语义标签 ================= */
/* 周期(周/月/年) · 锁利 · 移动 · 已达/已破 —— 让数字自解释，避免「正确的值看起来像 bug」 */
.pf-tag {
    display: inline-block;
    vertical-align: 1px;
    font-family: -apple-system, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
    font-size: 10px;
    font-weight: 600;
    line-height: 1;
    letter-spacing: .5px;
    padding: 2px 4px;
    border-radius: 4px;
    white-space: nowrap;
}
/* 周期标记：置于上行数值左侧（灰色=T+1口径，青绿=周期口径月/年仓） */
.pf-tag-cyc { margin-right: 5px; color: var(--text-muted); background: var(--bg-tertiary); }
.pf-tag-cyc.period { color: #1f7a6d; background: rgba(47, 158, 143, .15); }
/* 状态标记：置于行尾（橙=需处理，青绿=锁利，灰=纯跟随） */
.pf-tag.warn { margin-left: 5px; color: #fff; background: var(--accent); }
.pf-tag.lock { margin-left: 5px; color: #1f7a6d; background: rgba(47, 158, 143, .16); }
.pf-tag.ghost { margin-left: 5px; color: var(--text-muted); background: var(--bg-tertiary); font-weight: 500; }
/* 周期口径单元格：左侧一道青绿细线做整列视觉分组 */
.pf-col-plan.pf-plan-period { box-shadow: inset 3px 0 0 -1px rgba(47, 158, 143, .45); }
/* 已达标/已破位：价格本身已不可挂单，降透明度把注意力让给状态标签 */
.pf-col-plan.pf-plan-hit .pf-num { opacity: .68; }

/* ================= v3.79.26 持仓表单元格内间距 ================= */
/* 盈亏/价格单元格：金额 与 百分比小标 之间留白，避免黏成 -181.50-3.70% */
.pf-num .pf-pl-pct {
    display: inline-block;
    margin-left: 7px;
    font-size: 12px;
    font-weight: 500;
    font-family: 'Consolas', monospace;
    opacity: .9;
    letter-spacing: .2px;
}
/* 主数值 与 下方小字（今日盈亏 / 成本 / 可用）之间拉开一点 */
.pf-num + .pf-sub { margin-top: 5px; }
.pf-sub { line-height: 1.35; }

/* ================= v3.79.28 平仓明细面板（点「已实现盈亏」卡展开） ================= */
.pf-closed-panel { margin-top: 12px; background: var(--bg-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-lg); overflow-x: auto; }
.pf-closed-head { padding: 9px 12px; font-size: 12px; font-weight: 600; color: var(--text-secondary); border-bottom: 1px solid var(--border-color); }
.pf-closed-tip { font-weight: 400; color: var(--text-muted); margin-left: 6px; }
.pf-closed-panel .portfolio-table { font-size: 12px; }
.pf-closed-panel .pf-stock-name { font-size: 13px; }

/* ================= v5.2 账本面板：双页签（平仓明细 / 全部流水） ================= */
/* 起因：GET /api/trades（买+卖合并流水）端点早已存在，但前端 0 次调用 —— 买入流水无处可查，
   每笔做T买回只有弹窗 toast，事后无法核对「买了多少、什么价」。此处接上页签消费该端点。 */
.pf-ledger-tabs { display: flex; align-items: center; gap: 6px; padding: 8px 12px; border-bottom: 1px solid var(--border-color); }
.pf-ledger-tab { padding: 4px 12px; font-size: 12px; font-weight: 600; color: var(--text-secondary); background: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: var(--radius-md); cursor: pointer; }
.pf-ledger-tab:hover { color: var(--text-primary); }
.pf-ledger-tab.active { color: var(--bg-primary); background: var(--accent); border-color: var(--accent); }
.pf-ledger-tip { font-weight: 400; font-size: 11px; color: var(--text-muted); margin-left: auto; }
/* 方向标签：买红 / 卖绿（A股口径），调整灰 */
.pf-side { display: inline-block; padding: 1px 7px; font-size: 11px; font-weight: 600; border-radius: 4px; border: 1px solid var(--border-color); }
.pf-side-buy { color: var(--up); border-color: currentColor; }
.pf-side-sell { color: var(--down); border-color: currentColor; }
.pf-side-adj { color: var(--text-muted); }
.pf-row-adj .pf-stock-name { opacity: .75; }
/* 备注列：长文案折行，别把表格撑破（adj 行的「旧值→新值」说明就在这里读） */
.pf-adj-note { max-width: 260px; white-space: normal; font-size: 11px; line-height: 1.45; color: var(--text-muted); font-family: inherit; }
/* 网格卡片内的登记按钮：比面板按钮更紧凑，避免挤坏档位表 */
.rc-act-btn { padding: 3px 9px; font-size: 12px; white-space: nowrap; }

/* 扁平化单色标题图标（SVG，跟随主题色） */
.tico {
    width: 14px;
    height: 14px;
    vertical-align: -2px;
    margin-right: 6px;
    color: var(--accent);
    flex-shrink: 0;
}

/* v3.52: 图标按钮（菜单/持仓/改密/刷新）扁平化内联 SVG —— 与 .tico 同一 currentColor 线描风格 */
.mobile-menu-btn svg,
.btn svg {
    width: 20px;
    height: 20px;
    vertical-align: middle;
    margin: 0;
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
}
.mobile-menu-btn svg { width: 22px; height: 22px; }

/* ================= v3.124 解套决策助手（持仓表下方自动展开） ================= */
/* 面板：仅「浮亏达阈值」的持仓才渲染，未达阈值整块 display:none 不占位 */
.rescue-global {
    display: flex; align-items: center; flex-wrap: wrap; gap: 8px 10px;
    padding: 8px 12px; margin-bottom: 10px;
    background: var(--bg-tertiary); border: 1px solid var(--border-color);
    border-radius: var(--radius-md); font-size: 12px;
}
.rescue-g-title { font-size: 13px; font-weight: 700; color: var(--text-primary); }
.rescue-g-label { color: var(--text-secondary); }
.rescue-th-input {
    width: 62px; padding: 3px 7px; font-size: 12px; font-family: 'Consolas', monospace;
    background: var(--bg-secondary); color: var(--text-primary);
    border: 1px solid var(--border-color); border-radius: var(--radius-md);
}
.rescue-th-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-glow); }
.rescue-g-hint { color: var(--text-muted); font-size: 11.5px; }

.rescue-card {
    padding: 12px 14px; margin-bottom: 12px;
    background: var(--bg-secondary); border: 1px solid var(--border-color);
    border-left: 3px solid var(--up);
    border-radius: var(--radius-lg);
}
.rescue-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px 10px; margin-bottom: 6px; }
.rescue-name { font-size: 15px; font-weight: 700; color: var(--text-primary); }
.rescue-pl { font-size: 14px; font-weight: 700; font-family: 'Consolas', monospace; }
.rescue-stage {
    padding: 1px 8px; font-size: 11px; font-weight: 600; color: var(--accent);
    border: 1px solid var(--accent); border-radius: var(--radius-pill);
    background: var(--accent-glow);
}
.rescue-meta { font-size: 12.5px; color: var(--text-secondary); line-height: 1.6; margin-bottom: 8px; }
.rescue-meta b { color: var(--text-primary); font-family: 'Consolas', monospace; }
.rescue-tag { color: var(--text-muted); font-size: 11px; }

/* 已执行卖出记录表 */
.rescue-sold {
    margin-bottom: 8px; padding: 8px 10px;
    background: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: var(--radius-md);
}
.rescue-sold-title { font-size: 12px; font-weight: 600; color: var(--text-primary); margin-bottom: 5px; }
.rescue-sold-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.rescue-sold-table th {
    text-align: left; padding: 3px 6px; color: var(--text-muted); font-weight: 500;
    border-bottom: 1px solid var(--border-color);
}
.rescue-sold-table td { padding: 3px 6px; color: var(--text-secondary); font-family: 'Consolas', monospace; }

/* 登记卖出输入框 */
.rescue-sell-box {
    display: flex; align-items: center; flex-wrap: wrap; gap: 8px 10px;
    padding: 8px 10px; margin-bottom: 8px;
    background: var(--bg-tertiary); border: 1px dashed var(--border-color); border-radius: var(--radius-md);
}
.rescue-sell-title { font-size: 12px; font-weight: 600; color: var(--text-secondary); }
.rescue-sell-box label { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--text-muted); }
.rescue-in-shares, .rescue-in-price {
    width: 92px; padding: 3px 7px; font-size: 12px; font-family: 'Consolas', monospace;
    background: var(--bg-secondary); color: var(--text-primary);
    border: 1px solid var(--border-color); border-radius: var(--radius-md);
}
.rescue-in-shares:focus, .rescue-in-price:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-glow); }

/* 计划步骤卡 */
.rescue-card .signal-card { margin-bottom: 7px; padding: 9px 12px; font-size: 12.5px; }
.rescue-card .signal-card.risk { border-left: 3px solid var(--up); }
.rescue-card .signal-card.buy { border-left: 3px solid var(--down); }
.rescue-card .signal-card.done { border-left: 3px solid var(--text-muted); background: var(--bg-tertiary); }
.rescue-card .signal-card.note { border-left: 3px solid var(--accent); }
.rescue-step-main { color: var(--text-primary); line-height: 1.55; }
.rescue-step-main b { font-family: 'Consolas', monospace; }
.rescue-step-desc { margin-top: 3px; font-size: 12px; line-height: 1.65; color: var(--text-secondary); }
.rescue-badge {
    margin-left: 6px; padding: 0 7px; font-size: 10.5px; font-weight: 600;
    color: var(--text-muted); border: 1px solid var(--border-color); border-radius: var(--radius-pill);
    vertical-align: 1px;
}

/* 执行时机提示条 */
.rescue-exec { margin-top: 5px; font-size: 12px; padding: 4px 8px; border-radius: var(--radius-md); }
.rescue-exec.exec-good { color: var(--down); background: rgba(var(--down-rgb), .10); border: 1px solid rgba(var(--down-rgb), .35); }
.rescue-exec.exec-ok { color: var(--accent); background: var(--accent-glow); border: 1px solid rgba(var(--accent-rgb), .35); }
.rescue-exec.exec-bad { color: var(--up); background: rgba(var(--up-rgb), .10); border: 1px solid rgba(var(--up-rgb), .35); }

/* 计划汇总 */
.rescue-summary {
    margin-top: 4px; padding: 9px 12px; font-size: 12.5px; line-height: 1.8;
    color: var(--text-secondary); background: var(--bg-tertiary);
    border: 1px solid var(--border-color); border-radius: var(--radius-md);
}
.rescue-summary b { color: var(--text-primary); font-family: 'Consolas', monospace; }
.rescue-be { margin-top: 2px; padding-top: 4px; border-top: 1px dashed var(--border-color); color: var(--text-secondary); }

/* 股数流：当前 − 减仓 + 接回 = 末态（v3.126 修正末态只加不减的 bug，明确区分减仓/接回） */
.rescue-flow { font-size: 13px; }
.rescue-flow .rf-ar { color: var(--text-muted); font-weight: 700; margin: 0 3px; }
.rescue-flow .rf-final { color: var(--accent); font-size: 14px; }
/* 现金流：减仓回笼 → 接回支出 → 备用金 */
.rescue-cashflow { margin-top: 3px; padding: 3px 0; border-top: 1px dashed var(--border-color); border-bottom: 1px dashed var(--border-color); }
.rescue-cashflow b.rf-in { color: var(--accent); }
.rescue-cashflow b.rf-out { color: var(--text-primary); }

/* v3.127: 解套面板迁入「个股详情」（signal-panel 外壳）后的内边距 */
.rescue-panel .rescue-global { margin: 10px 12px 0; }
.rescue-panel .rescue-result { padding: 10px 12px 12px; }
.rescue-panel #rescueResult { padding: 10px 12px 12px; }
.rescue-panel .rescue-g-title { font-size: 13px; }

/* 风险场景 */
.rescue-risk { margin-top: 8px; padding: 8px 12px; font-size: 12px; color: var(--text-muted);
    border: 1px solid rgba(var(--up-rgb), .25); border-radius: var(--radius-md);
    background: rgba(var(--up-rgb), .05); }
.rescue-risk-title { font-weight: 600; color: var(--up); margin-bottom: 4px; }
.rescue-risk ul { margin: 0; padding-left: 18px; }
.rescue-risk li { line-height: 1.7; margin-top: 2px; }

@media (max-width: 768px) {
    .rescue-card { padding: 10px; }
    .rescue-name { font-size: 14px; }
    .rescue-meta { font-size: 12px; }
    .rescue-sell-box { gap: 7px 8px; }
    .rescue-in-shares, .rescue-in-price { width: 82px; }
    .rescue-exec { font-size: 11.5px; }
}

/* v3.130: 网格做T计划生成器 —— 今日决策 / 买档卖档表 / 资金 / 风险 */
.rescue-today { margin: 10px 0 6px; padding: 10px 12px; border-radius: var(--radius-md);
    background: rgba(var(--accent-rgb), .08); border: 1px solid rgba(var(--accent-rgb), .3); }
.rescue-today-title { font-size: 12px; font-weight: 700; color: var(--accent); margin-bottom: 8px; text-align: center; }
.rescue-today-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.rt-buy, .rt-sell { text-align: center; padding: 8px 6px; border-radius: var(--radius-sm);
    background: var(--bg-secondary); border: 1px solid var(--border-color); }
.rt-buy { border-color: rgba(var(--down-rgb), .5); }
.rt-sell { border-color: rgba(var(--up-rgb), .5); }
.rt-label { font-size: 11px; color: var(--text-tertiary); }
.rt-price { font-size: 20px; font-weight: 800; margin: 2px 0; }
.rt-buy .rt-price { color: var(--down); }
.rt-sell .rt-price { color: var(--up); }
.rt-sub { font-size: 11px; color: var(--text-secondary); }

.rescue-summary { margin: 8px 0; padding: 8px 12px; font-size: 12px; line-height: 1.7;
    background: var(--bg-secondary); border-radius: var(--radius-md); }
.rescue-summary b { color: var(--text-primary); }

.rescue-grid-block { margin-top: 10px; }
.rescue-g-title2 { font-size: 12px; font-weight: 700; color: var(--text-secondary);
    margin-bottom: 5px; padding-left: 8px; border-left: 3px solid var(--accent); }
.rescue-grid-table { font-size: 11.5px; }
.rescue-grid-table td.rescue-hint { font-size: 10.5px; color: var(--text-muted); line-height: 1.4; }
.rescue-grid-table td.exec-good { color: var(--up); }
.rescue-grid-table td.exec-bad { color: var(--down); }
.rescue-grid-table td.exec-ok { color: var(--text-secondary); }

/* 面板顶部参数输入紧凑排布 */
.rescue-global { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; }
.rescue-g-label { font-size: 11px; color: var(--text-tertiary); }
.rescue-global .rescue-th-input { width: 46px; padding: 2px 4px; font-size: 11px; }
.rescue-g-title { font-weight: 700; margin-right: 4px; }

/* v4.0 四步滚动解T 叙事 */
.rescue-steps { margin: 10px 0 4px; padding: 4px 12px 8px; }
.rs-title { font-size: 12px; font-weight: 700; color: var(--accent); text-align: center; margin: 4px 0 10px; }
.rs-step { display: flex; gap: 10px; align-items: flex-start; margin-bottom: 12px; }
.rs-step-no { flex: 0 0 26px; width: 26px; height: 26px; line-height: 26px; text-align: center;
    border-radius: 50%; background: var(--accent); color: #fff; font-weight: 700; font-size: 13px; }
.rs-step-body { flex: 1 1 auto; }
.rs-step-h { font-size: 13px; font-weight: 700; color: var(--text-primary); margin-bottom: 3px; }
.rs-step-d { font-size: 12px; line-height: 1.65; color: var(--text-secondary); }
.rs-step-d b { color: var(--text-primary); font-family: 'Consolas', monospace; }
.rescue-mini { font-size: 10px; color: var(--up); display: block; margin-top: 1px; }

/* ===== v5.5：解套面板「分步执行」+ 移动端排版 =====
   背景：原来 ①②③④ 全铺开 + 7 列买档表 + 风险长文一起显示，手机上既挤又看不出「现在该做哪步」。
   改法：① 顶部步骤条 + 只放大当前步；② 7 列表在窄屏转卡片（沿用 .signal-table 的既有做法）；
        ③ 风险/经济账折叠；④ 操作按钮窄屏全宽。 */

/* 步骤条 */
.rescue-flowbar { margin: 10px 0 2px; padding: 8px 10px; border-radius: var(--radius-md);
    background: var(--bg-secondary); border: 1px solid var(--border-color); }
.rs-dots { display: flex; align-items: center; justify-content: center; margin-bottom: 6px; }
.rs-dot { flex: 0 0 auto; width: 24px; height: 24px; line-height: 24px; text-align: center;
    border-radius: 50%; font-size: 12px; font-weight: 700;
    background: var(--bg-tertiary); color: var(--text-muted); border: 1px solid var(--border-color); }
.rs-dot.done { background: var(--bg-tertiary); color: var(--text-secondary); border-color: var(--text-muted); }
.rs-dot.cur { background: var(--accent); color: #fff; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }
.rs-dot-line { flex: 1 1 auto; height: 1px; min-width: 10px; background: var(--border-color); font-style: normal; }
.rs-flowtitle { font-size: 12.5px; color: var(--text-secondary); text-align: center; line-height: 1.5; }
.rs-flowtitle b { color: var(--text-primary); }
.rs-snaptag { margin-left: 6px; font-size: 10.5px; color: var(--text-muted); }

/* 分步：当前=展开高亮 / 已完成=折叠 / 未到=锁定不显示明细
   ⚠ 已完成用中性灰（沿用本项目 .signal-card.done 既有约定），不用 --down：
     交易语境里绿色=跌，拿绿勾表示"已完成"容易被误读。 */
.rs-step.is-done { opacity: .75; margin-bottom: 8px; }
.rs-step.is-done .rs-step-no { background: var(--bg-tertiary); color: var(--text-secondary); border-color: var(--text-muted); }
.rs-step.is-current { background: rgba(var(--accent-rgb), .06); border: 1px solid rgba(var(--accent-rgb), .28);
    border-radius: var(--radius-md); padding: 8px 10px 6px; margin: 0 -2px 10px; }
.rs-step.is-locked { opacity: .5; margin-bottom: 8px; }
.rs-step.is-locked .rs-step-no { background: var(--bg-tertiary); color: var(--text-muted); }
.rs-lock { margin-left: 6px; font-size: 11px; font-weight: 400; color: var(--text-muted); }
.rs-donetag { margin-left: 6px; font-size: 11px; font-weight: 400; color: var(--text-secondary); }
.rs-step-act { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 7px; }
.btn.ghost { background: transparent; color: var(--text-secondary); border: 1px solid var(--border-color); }
.btn.ghost:hover { background: var(--bg-tertiary); }

/* 今日决策：只放大当前这一步（单列） */
.rescue-today-grid.one { grid-template-columns: 1fr; gap: 6px; }
.rt-buy.is-cur, .rt-sell.is-cur, .rt-cycle.is-cur { padding: 12px 10px; }
.rt-cycle.is-cur { border: 1px solid rgba(var(--accent-rgb), .5); background: var(--bg-secondary);
    text-align: center; border-radius: var(--radius-sm); }
.rt-cycle .rt-price { font-size: 20px; font-weight: 800; color: var(--accent); margin: 2px 0 6px; }
.rt-lockline { font-size: 11.5px; color: var(--text-muted); line-height: 1.6;
    background: var(--bg-tertiary); border-radius: var(--radius-sm); padding: 6px 8px; }
.rt-lockline.ok { color: var(--text-secondary); background: var(--bg-tertiary); }
.rescue-today .btn { margin-top: 7px; }

/* 表格：窄屏可横滑（宽屏保持原 7 列表） */
.rescue-grid-scroll { width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
.rescue-grid-scroll .rescue-grid-table { min-width: 520px; }

/* 折叠区块（经济账 / 风险纪律） */
.rescue-fold { margin: 8px 0; border: 1px solid var(--border-color); border-radius: var(--radius-md); background: var(--bg-secondary); }
.rescue-fold > summary { cursor: pointer; padding: 8px 12px; font-size: 12.5px; font-weight: 600;
    color: var(--text-secondary); list-style: none; }
.rescue-fold > summary::-webkit-details-marker { display: none; }
.rescue-fold > summary::before { content: '▸ '; color: var(--text-muted); }
.rescue-fold[open] > summary::before { content: '▾ '; }
.rescue-fold .rs-step { padding: 0 12px 8px; margin-bottom: 4px; }
.rescue-risk-fold ul { margin: 0; padding: 0 14px 10px 30px; }
.rescue-risk-fold li { font-size: 12px; line-height: 1.7; color: var(--text-muted); margin-top: 2px; }

/* 杂项文本行 */
.rescue-note-line { color: var(--text-tertiary, #888); font-size: 12px; }
.rescue-warn-line { color: #b26a00; font-size: 12px; background: rgba(178,106,0,.08);
    padding: 6px 8px; border-radius: 6px; margin-top: 4px; }
.rescue-mini-line { font-size: 12px; color: var(--text-tertiary, #888); }
/* 裸类涨跌色：.vp-up/.vp-down 此前只定义在复合选择器（.vp-sub/.vp-val）里，裸类无颜色 */
.rescue-card .vp-up { color: var(--up); }
.rescue-card .vp-down { color: var(--down); }
.signal-card.good { border-left: 3px solid var(--up); background: rgba(var(--up-rgb), .07); }

/* ===== v3.NEW: 周线定趋势起爆点 展示面板 ===== */
.week-trend-chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 4px; }
.wt-chip { font-size: 12px; line-height: 1.4; padding: 3px 9px; border-radius: 11px; border: 1px solid var(--border); white-space: nowrap; }
.wt-chip.on { color: #1a7f3c; background: rgba(36, 161, 86, .14); border-color: rgba(36, 161, 86, .4); }
.wt-chip.off { color: var(--text-muted); background: var(--bg-tertiary); }
.wt-summary { font-size: 12.5px; margin: 6px 0 2px; }
.wt-summary.ok { color: var(--down); }
.wt-summary.warn { color: var(--accent); }
.wt-breakout { font-size: 13.5px; font-weight: 600; color: #1a7f3c; background: rgba(36, 161, 86, .14); border: 1px solid rgba(36, 161, 86, .4); border-radius: 8px; padding: 7px 10px; margin: 6px 0 2px; }
.wt-kv { font-size: 12px; color: var(--text-muted); margin-top: 4px; }

/* ===== v5.5 移动端（≤640px）===== */
@media (max-width: 640px) {
    .rescue-card { padding: 9px; }
    .rescue-flowbar { padding: 7px 8px; }
    .rs-dot { width: 21px; height: 21px; line-height: 21px; font-size: 11px; }
    .rs-flowtitle { font-size: 12px; }
    .rs-step.is-current { padding: 7px 8px 5px; }
    .rs-step-d { font-size: 11.5px; }
    .rt-price { font-size: 19px; }

    /* 7 列表 → 每行一块卡片，td 用 data-th 当左侧标签 */
    .rescue-grid-scroll { overflow: visible; }
    .rescue-grid-scroll .rescue-grid-table { min-width: 0; display: block; }
    .rescue-grid-table thead { display: none; }
    .rescue-grid-table tbody, .rescue-grid-table tr, .rescue-grid-table td { display: block; width: auto; }
    .rescue-grid-table tr { border: 1px solid var(--border-color); border-radius: var(--radius-md);
        padding: 6px 8px; margin-bottom: 7px; background: var(--bg-secondary); }
    .rescue-grid-table td { display: flex; align-items: baseline; justify-content: space-between;
        gap: 10px; padding: 2px 0; border: none !important; text-align: left !important; min-width: 0; }
    .rescue-grid-table td::before { content: attr(data-th); flex: 0 0 auto; font-size: 11px; color: var(--text-muted); }
    /* 数值裹在 .rs-v 里当「唯一 flex 子项」；否则 <br>/<span> 会被拆成多个子项 → 该行横向溢出被裁 */
    .rescue-grid-table td > .rs-v { flex: 1 1 auto; min-width: 0; text-align: right; overflow-wrap: anywhere; }
    .rescue-grid-table td:last-child { padding-top: 6px; margin-top: 4px;
        border-top: 1px dashed var(--border-color) !important; justify-content: flex-end; }
    .rescue-grid-table td:last-child::before { content: none; }
    .rescue-grid-table td:last-child > .rs-v { flex: 0 1 auto; }
    .rescue-grid-table td.rescue-hint { display: block; text-align: left !important; }
    .rescue-grid-table td.rescue-hint::before { content: none; }

    /* 触屏点击目标：操作按钮铺满，避免小按钮点不中/溢出 */
    .rc-act-btn { width: 100%; min-height: 30px; }
    .rs-step-act .btn { flex: 1 1 auto; min-width: 96px; }
    .rescue-today .btn { width: 100%; }
}

/* ===== v_rescue_stop_split：主卡「⚠ 计划止损已破」独立警示块（不改动主卡动词，只加显眼提示） ===== */
.risk-stop-warn {
    margin-top: 8px; padding: 10px 12px;
    background: var(--signal-glow, rgba(231,76,60,0.10));
    border: 1px solid var(--signal, #e74c3c);
    border-left: 4px solid var(--down, #e74c3c);
    border-radius: var(--radius-md, 8px);
}
.risk-stop-warn .rsw-title { font-size: 13px; font-weight: 700; color: var(--down, #e74c3c); margin-bottom: 4px; }
.risk-stop-warn .rsw-body { font-size: 12.5px; line-height: 1.65; color: var(--text-secondary); }
.risk-stop-warn .rsw-body b { color: var(--down, #e74c3c); font-family: 'Consolas', monospace; }

/* ===== v_rescue_stop_split：解套面板「回本计划」独立模块（与倒T网格互不干扰） ===== */
.rescue-recovery { border-left: 3px solid var(--accent, #3498db); background: var(--bg-secondary); }
.rescue-recovery .signal-card { margin-top: 4px; }
.rr-zone { font-size: 13px; line-height: 1.6; margin: 6px 0 4px; color: var(--text-secondary); }
.rr-zone b { color: var(--text-primary); font-family: 'Consolas', monospace; }
.rr-signal { font-size: 12.5px; line-height: 1.6; padding: 6px 9px; margin: 6px 0;
    background: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: var(--radius-md, 6px); color: var(--text-secondary); }
.rr-signal.rr-hit { background: var(--up-glow, rgba(46,204,113,0.12)); border-color: var(--up, #2ecc71); color: var(--text-primary); font-weight: 600; }
.rr-signal b { font-family: 'Consolas', monospace; color: var(--up, #2ecc71); }
.rr-note { font-size: 11.5px; color: var(--text-muted); line-height: 1.55; margin-top: 6px; }
.rc-recovery-btn {
    margin-top: 8px; padding: 6px 14px; font-size: 12.5px; font-weight: 600; cursor: pointer;
    color: #fff; background: var(--down, #e74c3c); border: 1px solid var(--down, #e74c3c); border-radius: var(--radius-md, 6px);
}
.rc-recovery-btn:hover { filter: brightness(1.08); }
.rc-recovery-reset { margin-top: 8px; padding: 5px 12px; font-size: 12px; cursor: pointer;
    color: var(--text-secondary); background: transparent; border: 1px solid var(--border-color); border-radius: var(--radius-md, 6px); }
.rc-recovery-reset:hover { color: var(--text-primary); border-color: var(--text-muted); }

/* ============ v3.139 五档盘口（分时右侧列 · 证券 APP 风格 · 移动端保持一行） ============ */
.tk-main-row {
    display: flex;
    gap: 6px;
    align-items: stretch;
    min-width: 0;
}
.tk-intraday { flex: 1 1 0; min-width: 0; }
.quote-board {
    flex: 0 0 158px;
    min-height: 232px;   /* v3.158: 兜底，手机端分时图变矮时盘口也至少容得下 标题+价格+10行，不裁切 */
    display: flex; flex-direction: column;
    padding: 5px 6px 4px;
    background: var(--bg-secondary, rgba(127,127,127,0.05));
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md, 6px);
    font-family: 'Consolas', 'SF Mono', monospace;
    font-size: 11.5px;
    min-width: 0;
    overflow: hidden;
}
.qb-header {
    display: flex; justify-content: center; align-items: baseline;
    margin-bottom: 2px; padding: 0 2px 2px;   /* v3.157: 收紧 */
    color: var(--text-muted);
    font-family: var(--font-sans, inherit);
    border-bottom: 1px dashed var(--border-color);
}
.qb-title { font-weight: 600; color: var(--text-primary); font-size: 12px; }
.qb-price-box {
    display: flex; flex-direction: column; align-items: center;
    padding: 3px 0 3px;   /* v3.157: 5px→3px，给十行盘口腾高度 */
    border-bottom: 1px dashed var(--border-color);
    margin-bottom: 2px;   /* v3.157: 4px→2px */
}
/* 价格 + 涨跌幅并排（用户要求） */
.qb-price-line {
    display: flex; align-items: baseline; justify-content: center; gap: 7px;
}
.qb-current {
    font-size: 15px; font-weight: 700; color: var(--up);
    line-height: 1.15;
}
.qb-change { font-size: 11px; color: var(--text-muted); font-weight: 600; }
.qb-change.qb-up { color: var(--up); }
.qb-change.qb-dn { color: var(--down); }
.qb-spread { font-size: 9.5px; color: var(--text-muted); margin-top: 2px; }
/* v3.158: 彻底修通盘口 flex 链。
   原 bug：结构里 .quote-board → .qb-main → (.qb-price-box + .qb-grid)，
   但 .qb-main 没有任何 CSS 规则（默认 block），导致 .qb-grid 的 flex:1 失效、
   半区高度被父链压瘪；v3.157 又给 .qb-row 加了 min-height:15px，手机端盘口跟着
   分时图变矮时 5行×15px 硬塞进更矮的半区 → 溢出叠压（越改越乱）。
   修复：①给 .qb-main 补 flex:1 + min-height:0，让 flex 链连续；
        ②.qb-grid 两个半区各 flex:1（卖盘上半、买盘下半 = 居上居下）；
        ③行用自然高度 + 半区内 space-evenly 均匀分布，绝不强制压扁 → 物理上不可能叠字；
        ④最坏情况 .qb-main overflow:hidden 优雅裁切而非叠压。 */
.qb-main {
    flex: 1 1 0; min-height: 0;
    display: flex; flex-direction: column;
    overflow: hidden;
}
.qb-grid {
    flex: 1 1 0; display: flex; flex-direction: column;
    min-height: 0;
}
/* 卖盘占上半区、买盘占下半区，各自半区内五行均匀分布（居上居下、分布均匀） */
.qb-side {
    flex: 1 1 0; min-height: 0;
    display: flex; flex-direction: column;
    justify-content: space-evenly;
}
/* 行用自然高度，靠半区 space-evenly 撑开；不强制 flex 高度，绝不叠字 */
.qb-side .qb-row { min-height: 14px; }
/* 买卖分区之间的视觉分隔线 */
.qb-divider { height: 0; margin: 4px 0; border-top: 1px dashed var(--border-color); opacity: 0.6; }
.qb-row {
    display: flex; align-items: center;
    padding: 0 4px;         /* v3.157: 垂直间距改由 flex 等分控制，不再叠 padding */
    font-size: 11px;
    line-height: 1.3;
    white-space: nowrap;
    gap: 8px;               /* 价格与成交量之间的间距 */
}
.qb-tag { color: var(--text-muted); flex: 0 0 24px; text-align: left; }
.qb-p { flex: 1; text-align: right; font-weight: 600; }
.qb-v { flex: 0 0 46px; text-align: right; color: var(--text-muted); font-size: 10px; }
/* 卖盘绿色（跌色语义），买盘红色（涨色语义）—— 中文惯例 */
.qb-side-asks .qb-p { color: var(--down); }
.qb-side-bids .qb-p { color: var(--up); }
/* 卖一 / 买一：加底色，突出即时盘口 */
.qb-row.qb-side-1 {
    background: rgba(127,127,127,0.10);
    border-radius: 2px;
    padding: 2px 4px;
}
.qb-row.qb-side-1 .qb-p { font-weight: 700; font-size: 11.5px; }
.qb-row.qb-side-1 .qb-tag { color: var(--text-primary); font-weight: 600; }
/* 移动端：盘口列变窄，分时列让位；保持 flex-row 一行布局 */
@media (max-width: 640px) {
    .quote-board { flex: 0 0 142px; padding: 4px 5px 3px; font-size: 10.5px; }
    .qb-current { font-size: 13.5px; }
    .qb-price-line { gap: 6px; }
    .qb-v { flex: 0 0 40px; font-size: 9.5px; }
    .qb-tag { flex: 0 0 20px; font-size: 10.5px; }
    .qb-p { font-size: 10.5px; }
    .qb-row { gap: 7px; padding: 1px 3px; }
    .qb-row.qb-side-1 .qb-p { font-size: 11px; }
    .qb-title { font-size: 11px; }
    .qb-change { font-size: 10px; }
    .qb-spread { font-size: 9px; }
}
@media (max-width: 420px) {
    .quote-board { flex: 0 0 126px; padding: 3px 4px 3px; }
    .qb-current { font-size: 12.5px; }
    .qb-v { flex: 0 0 34px; }
    .qb-tag { flex: 0 0 18px; }
}

