/* FinPal 暗色交易终端。国内约定：红=多/涨，绿=空/跌。色板取自线框设计。 */
:root{
  --bg:#0d1117; --panel:#161b22; --panel2:#1c2230; --line:#2a3140;
  --txt:#e6edf3; --dim:#8b949e; --faint:#5b636e;
  --long:#f0524b;   /* 红=多/涨 */
  --short:#2ea043;  /* 绿=空/跌 */
  --accent:#e3b341;
}
*{box-sizing:border-box;margin:0;padding:0}
/* hidden 属性必须压过任何 class 的 display(否则 display:flex 会让浮层关不掉) */
[hidden]{display:none!important}
body{
  background:var(--bg);color:var(--txt);
  font:14px/1.5 -apple-system,"PingFang SC","Microsoft YaHei",sans-serif;
  max-width:430px;margin:0 auto;min-height:100vh;
  padding-bottom:env(safe-area-inset-bottom);
}
/* 导航 */
.nav{
  height:48px;display:flex;align-items:center;gap:10px;padding:0 14px;
  border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--bg);z-index:10;
}
.nav .title{font-weight:600;font-size:15px;min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nav-icon{margin-left:auto;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;background:transparent;border:0;border-radius:8px;color:var(--dim);cursor:pointer}
.nav-icon svg{width:18px;height:18px;stroke:currentColor}
.nav-icon:active{color:var(--txt);background:var(--panel2)}
.share-toast{position:fixed;left:50%;bottom:calc(76px + env(safe-area-inset-bottom));transform:translateX(-50%);background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:7px 12px;color:var(--txt);font-size:12px;box-shadow:0 8px 24px rgba(0,0,0,.28);z-index:30}
.nav-link{margin-left:auto;background:none;border:0;color:var(--dim);font-size:12px;cursor:pointer}
/* 主体 */
.feed{padding:12px 14px}
/* ws 状态 */
.ws-status{display:flex;align-items:center;gap:6px;font-size:11px;margin-bottom:10px}
.ws-status .dot{width:7px;height:7px;border-radius:50%}
.ws-status.connected{color:var(--short)}
.ws-status.connected .dot{background:var(--short);box-shadow:0 0 6px var(--short)}
.ws-status.disconnected{color:var(--faint)}
.ws-status.disconnected .dot{background:var(--faint);animation:pulse 1.2s infinite}
@keyframes pulse{0%,100%{opacity:.3}50%{opacity:1}}
/* 状态行右侧图标(声音/清理) */
.snd-icon,.clear-icon,.set-icon{display:inline-flex;align-items:center;justify-content:center;
  padding:3px;background:none;border:0;color:var(--dim);cursor:pointer;border-radius:6px}
.snd-icon{margin-left:auto} /* 声音图标常驻,负责把右侧图标组推到最右 */
.snd-icon:active,.clear-icon:active,.set-icon:active{color:var(--txt)}
.clear-icon.on{color:var(--long);background:rgba(240,82,75,.12)}
/* 声音开:图标点亮;静音:变暗并切到禁用图标 */
.snd-icon .snd-off{display:none}
.snd-icon.muted .snd-on{display:none}
.snd-icon.muted .snd-off{display:inline}
.snd-icon:not(.muted){color:var(--accent)}
/* 断线补发条 */
.resend-bar{
  background:rgba(227,179,65,.12);border:1px solid rgba(227,179,65,.4);
  border-radius:8px;padding:8px 10px;font-size:12px;color:var(--accent);margin-bottom:10px;
}
/* 清理模式工具条 */
.clear-bar{
  display:flex;align-items:center;gap:8px;position:sticky;top:48px;z-index:9;
  background:var(--panel2);border:1px solid var(--line);
  border-radius:8px;padding:8px 10px;font-size:12px;margin-bottom:10px;
}
.clear-bar .cb-tip{color:var(--dim);margin-right:auto}
.clear-bar .cb-btn{
  background:transparent;border:1px solid var(--line);color:var(--txt);
  font-size:12px;padding:5px 12px;border-radius:7px;cursor:pointer;
}
.clear-bar .cb-btn.danger{color:var(--long);border-color:rgba(240,82,75,.4)}
/* 清理模式下卡片的行内操作按钮 */
.signal-card .sc-actions{display:none;gap:6px;margin-top:9px}
.feed.clearing .signal-card{cursor:default}
.feed.clearing .signal-card .sc-actions{display:flex}
.sc-actions .act{
  flex:1;text-align:center;background:var(--panel2);border:1px solid var(--line);
  color:var(--txt);font-size:12px;padding:6px 8px;border-radius:7px;cursor:pointer;
}
.sc-actions .act.act-one{color:var(--long);border-color:rgba(240,82,75,.35)}
/* 徽章 */
.badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;padding:2px 8px;border-radius:5px}
.b-long{background:rgba(240,82,75,.16);color:var(--long)}
.b-short{background:rgba(46,160,67,.16);color:var(--short)}
.b-neutral{background:rgba(139,148,158,.14);color:var(--faint)}
.muted{color:var(--dim)}
/* 信号卡 */
.signal-list{display:flex;flex-direction:column;gap:9px}
.signal-card{
  background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:11px;
  cursor:pointer;transition:border-color .15s;
}
.signal-card:active{border-color:var(--dim)}
.signal-card.long{border-left:3px solid var(--long)}
.signal-card.short{border-left:3px solid var(--short)}
.signal-card.feed{opacity:.85}
/* 命中提醒规则:左侧描金 + 星标 */
.signal-card.alert{border-color:var(--accent);box-shadow:0 0 0 1px rgba(227,179,65,.35) inset}
.sc-star{color:var(--accent);font-size:12px}
.signal-card.pending{opacity:.75;cursor:default}
.sc-subjects{display:flex;align-items:center;flex-wrap:wrap;gap:6px;font-size:18px;font-weight:700;color:var(--txt);line-height:1.3;margin-bottom:2px}
.sc-head{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--dim);margin-top:4px}
.sc-head .score{margin-left:auto}
.sc-title{font-weight:600;margin-top:5px;font-size:14px}
.sc-sub{margin-top:5px;font-size:13px;color:var(--dim)}
/* 报告生成中 spinner */
.spinner{
  width:12px;height:12px;border:2px solid var(--faint);border-top-color:var(--txt);
  border-radius:50%;display:inline-block;animation:spin .8s linear infinite;vertical-align:middle;
}
@keyframes spin{to{transform:rotate(360deg)}}
/* 状态块 */
.state-block{text-align:center;color:var(--dim);padding:24px 16px;font-size:13px}
.state-block.empty{border:1px dashed var(--line);border-radius:10px;margin-top:6px}
.state-block .emoji{font-size:26px}
.empty-title{font-weight:600;margin-top:4px;color:var(--txt)}
.empty-sub{font-size:12px;margin-top:3px}
/* 按钮 */
.btn{display:block;width:100%;text-align:center;padding:12px;border-radius:10px;font-weight:600;font-size:14px;border:0;margin-top:12px;cursor:pointer}
.btn-primary{background:var(--long);color:#fff}
.btn-ghost{background:transparent;border:1px solid var(--line);color:var(--txt)}
.note{font-size:11px;color:var(--faint);margin-top:14px;line-height:1.7;text-align:center}
.nav .back{background:none;border:0;color:var(--dim);font-size:22px;cursor:pointer;line-height:1;padding:0 4px}
/* —— 导航右上角用户区(头像+昵称,点开菜单含退出登录) —— */
.user-wrap{margin-left:auto;position:relative}
.user-chip{
  display:flex;align-items:center;gap:6px;max-width:130px;
  background:none;border:0;color:var(--dim);font-size:12px;cursor:pointer;padding:4px 2px;
}
.user-chip .avatar{
  width:22px;height:22px;border-radius:50%;flex:0 0 22px;
  background:var(--panel2);border:1px solid var(--line);color:var(--dim);
  display:flex;align-items:center;justify-content:center;font-size:11px;
}
.user-chip .uname{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.user-menu{
  position:absolute;top:34px;right:0;min-width:170px;z-index:20;
  background:var(--panel);border:1px solid var(--line);border-radius:10px;
  padding:6px;box-shadow:0 8px 24px rgba(0,0,0,.45);
}
.user-menu .um-head{padding:8px 10px 10px;border-bottom:1px solid var(--line);margin-bottom:6px}
.user-menu .um-name{font-size:13px;color:var(--txt);font-weight:600;word-break:break-all}
.user-menu .um-sub{font-size:11px;color:var(--faint);margin-top:2px}
.user-menu .um-item{
  display:block;width:100%;text-align:left;background:none;border:0;
  color:var(--txt);font-size:13px;padding:9px 10px;border-radius:6px;cursor:pointer;
}
.user-menu .um-item:hover{background:var(--panel2)}
.user-menu .um-item.danger{color:var(--long)}
/* —— 三面报告页 —— */
.verdict{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px;margin-bottom:14px}
.verdict.long{border-left:3px solid var(--long)}
.verdict.short{border-left:3px solid var(--short)}
.verdict-head{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:11px}
.verdict-title{font-size:18px;font-weight:700;line-height:1.35}
.tabs{display:flex;gap:6px;margin:0 0 12px}
/* 未选中态收敛成描边,选中态实心高亮。JS 用 .on 标记当前面(见 showFace),
   缺这条规则时两个 tab 长得一样,看不出选中哪个 —— 视觉上等于没分 tab。 */
.tab{flex:1;text-align:center;padding:8px;border-radius:8px;font-size:13px;font-weight:600;
  background:transparent;color:var(--dim);border:1px solid var(--line);cursor:pointer}
.tab.on{background:var(--panel2);color:var(--txt);border-color:var(--accent)}
.tab.inactive{background:transparent;color:var(--faint);font-weight:400;cursor:not-allowed}
.tab.inactive .badge{margin-left:4px}
.report-body{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:14px;font-size:14px;line-height:1.75;overflow-wrap:break-word}
.report-body h2,.report-body h3{font-size:15px;margin:14px 0 6px;color:var(--accent)}
.report-body h2:first-child,.report-body h3:first-child{margin-top:0}
.report-body ul,.report-body ol{padding-left:20px;margin:6px 0}
.report-body table{width:100%;border-collapse:collapse;margin:8px 0;font-size:13px}
.report-body th,.report-body td{border:1px solid var(--line);padding:6px 8px;text-align:left}
.report-body th{background:var(--panel2)}
/* —— 关注管理台 —— */
.quota-bar{margin-bottom:14px}
#quotaLabel{font-size:12px;color:var(--dim)}
.quota-track{height:6px;background:var(--panel2);border-radius:3px;margin-top:6px;overflow:hidden}
.quota-fill{height:100%;background:var(--accent);border-radius:3px;transition:width .3s}
.quota-fill.full{background:var(--long)}
.follow-list{display:flex;flex-direction:column;gap:9px}
.follow-item{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:11px 12px;display:flex;align-items:center;gap:10px}
.fi-type{font-size:10px;padding:2px 6px;border-radius:4px;background:var(--panel2);color:var(--dim);flex-shrink:0}
.fi-name{font-weight:600;font-size:14px}
.fi-tags{font-size:11px;color:var(--faint);margin-top:2px}
.fi-del{margin-left:auto;background:none;border:0;color:var(--faint);font-size:18px;cursor:pointer;padding:0 4px;flex-shrink:0}
.fi-del:active{color:var(--long)}
/* 选择器浮层 */
.picker-overlay{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:flex-end;justify-content:center;z-index:100}
.picker-sheet{width:100%;max-width:430px;height:80vh;background:var(--bg);border-radius:16px 16px 0 0;border:1px solid var(--line);display:flex;flex-direction:column;overflow:hidden}
.picker-head{display:flex;align-items:center;justify-content:space-between;padding:14px;border-bottom:1px solid var(--line);font-weight:600}
.picker-close{background:none;border:0;color:var(--dim);font-size:16px;cursor:pointer}
.picker-tabs{display:flex;gap:4px;padding:10px 14px 0;flex-wrap:wrap}
.picker-tab{padding:6px 12px;border-radius:16px;font-size:12px;background:var(--panel2);color:var(--dim);border:0;cursor:pointer}
.picker-tab.on{background:var(--accent);color:#000;font-weight:600}
.picker-search{margin:10px 14px;padding:9px 12px;background:var(--panel);border:1px solid var(--line);border-radius:8px;color:var(--txt);font-size:14px;width:calc(100% - 28px)}
.picker-list{flex:1;overflow-y:auto;padding:0 14px 20px}
/* 加载态占满剩余高度,避免切到期货tab瞬间面板塌成小条露出背景 */
.picker-sheet #pickerLoading{flex:1}
.pick-item{padding:11px 12px;border-radius:8px;background:var(--panel);border:1px solid var(--line);margin-bottom:8px;cursor:pointer;display:flex;align-items:center;gap:8px}
.pick-item:active{border-color:var(--accent)}
.pick-item.added{opacity:.5;cursor:default}
.pick-code{font-size:11px;color:var(--faint)}
.pick-hint{font-size:12px;color:var(--faint);padding:8px 2px;line-height:1.6}
/* —— tag 多选面板(自定义/股票关注)—— */
.tag-panel{flex:1;overflow-y:auto;padding:0 14px 20px;display:flex;flex-direction:column}
.tp-name{font-size:13px;color:var(--dim);padding:4px 2px 0}
.tp-name b{color:var(--txt)}
.tp-selected{display:flex;flex-wrap:wrap;gap:6px;padding:8px 0;min-height:24px}
.tp-cats{display:flex;gap:6px;padding:2px 0 6px}
.tp-cat{padding:5px 12px;border-radius:14px;font-size:12px;background:var(--panel2);color:var(--dim);border:0;cursor:pointer}
.tp-cat.on{background:var(--accent);color:#000;font-weight:600}
/* —— 新闻详情(消息面:全文 + 传播链)—— */
.news-detail{margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}
/* 裸链游客:全文/传播链需登录,此处只给一句引导(不空发请求) */
.guest-tip{color:var(--dim);font-size:12px}
.nd-title{font-weight:600;font-size:15px;line-height:1.4;margin-bottom:6px}
.nd-content{font-size:13px;color:var(--dim);line-height:1.7;white-space:normal}
.nd-chain-sum{margin-top:12px;font-size:12px;color:var(--txt);background:var(--panel2);padding:8px 10px;border-radius:6px}
.nd-chain-nodes{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.nd-node{font-size:12px;padding:3px 9px;border-radius:12px;background:var(--panel);border:1px solid var(--line);color:var(--dim)}
.nd-node.d0{border-color:var(--accent);color:var(--txt);font-weight:600}
.nd-node.d1{opacity:.9}
.nd-node.d2{opacity:.7}
.nd-more{margin-top:12px;text-align:center}
.nd-more .btn{display:inline-block}
.tp-vocab{display:flex;flex-wrap:wrap;gap:6px;flex:1;overflow-y:auto;align-content:flex-start}
.tp-chip{padding:5px 10px;border-radius:14px;font-size:12px;background:var(--panel2);color:var(--dim);border:1px solid var(--line);cursor:pointer;user-select:none}
.tp-chip.on{background:var(--accent);color:#000;font-weight:600;border-color:var(--accent)}
/* 本股所属板块:虚边框提示"这词跟该标的直接相关",置顶显示 */
.tp-chip.own{border-color:var(--accent);color:var(--text)}
/* 已达上限:置灰但仍可见(让用户知道有哪些词可换) */
.tp-chip.disabled{opacity:.45;cursor:not-allowed}
.tp-vocab .pick-hint{width:100%}
.tag-panel .btn{margin-top:10px}
/* —— 底部常驻导航 —— */
body.has-tabbar{padding-bottom:calc(58px + env(safe-area-inset-bottom))}
.finpal-tabbar{
  position:fixed;left:50%;transform:translateX(-50%);bottom:0;width:100%;max-width:430px;
  display:flex;background:var(--panel);border-top:1px solid var(--line);z-index:50;
  padding-bottom:env(safe-area-inset-bottom);
}
.ft-tab{
  flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;
  padding:8px 0 7px;text-decoration:none;color:var(--faint);font-size:11px;
}
.ft-tab .ft-icon{font-size:19px;line-height:1}
.ft-tab.on{color:var(--accent)}
.ft-tab:active{opacity:.7}
/* —— 信号说明页 —— */
.help-intro{font-size:13px;color:var(--dim);line-height:1.7;margin-bottom:14px}
.help-sec{font-size:12px;color:var(--accent);font-weight:600;margin:18px 0 8px}
.help-card{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:12px;margin-bottom:9px}
.help-card .hc-head{display:flex;align-items:center;gap:8px;margin-bottom:5px}
.help-card .hc-name{font-weight:600;font-size:14px}
.help-card .hc-desc{font-size:13px;color:var(--dim);line-height:1.6}
.dir-legend{display:flex;gap:16px;margin:10px 0;font-size:13px}
.dir-legend span{display:inline-flex;align-items:center;gap:5px}
/* 提醒设置页 */
.al-sec{font-size:12px;color:var(--dim);margin:16px 2px 8px}
.al-hint{color:var(--faint)}
.al-row{display:flex;align-items:center;gap:10px;background:var(--panel);
  border:1px solid var(--line);border-radius:10px;padding:11px;margin-bottom:8px}
.al-row.al-master{background:var(--panel2)}
.al-row .al-name{font-size:14px;font-weight:600}
.al-row .al-sub{font-size:11px;color:var(--faint);margin-top:2px}
.al-lvl{margin-left:auto;background:var(--bg);color:var(--txt);border:1px solid var(--line);
  border-radius:7px;padding:5px 8px;font-size:12px}
.al-lvl:disabled{opacity:.4}
.al-row .switch{margin-left:8px}
.al-master .switch{margin-left:auto}
/* 开关 */
.switch{position:relative;display:inline-block;width:40px;height:22px;flex:none}
.switch input{opacity:0;width:0;height:0}
.switch .sl{position:absolute;inset:0;background:var(--line);border-radius:22px;transition:.2s;cursor:pointer}
.switch .sl:before{content:"";position:absolute;width:16px;height:16px;left:3px;top:3px;
  background:#fff;border-radius:50%;transition:.2s}
.switch input:checked + .sl{background:var(--accent)}
.switch input:checked + .sl:before{transform:translateX(18px)}
/* 关键词 */
.al-kw-input{display:flex;gap:8px;margin-bottom:8px}
.al-kw-input input{flex:1;background:var(--panel);border:1px solid var(--line);color:var(--txt);
  border-radius:8px;padding:9px 10px;font-size:13px}
.btn-mini{background:var(--accent);color:#1a1a1a;border:0;border-radius:8px;
  padding:0 14px;font-size:13px;font-weight:600;cursor:pointer}
.al-kw-list{display:flex;flex-wrap:wrap;gap:8px}
.al-tag{display:inline-flex;align-items:center;gap:6px;background:var(--panel2);
  border:1px solid var(--line);border-radius:16px;padding:5px 10px;font-size:12px}
.al-tag-x{color:var(--faint);cursor:pointer;font-style:normal}
.al-kw-empty{font-size:12px;color:var(--faint)}
/* —— 关注历史页 —— */
/* 对象选择条:多关注对象自动换行，选中高亮 */
.obj-bar{display:flex;flex-wrap:wrap;gap:8px;overflow:visible;padding:2px 0 10px}
.obj-chip{flex:0 1 auto;max-width:100%;display:inline-flex;align-items:center;gap:6px;cursor:pointer;
  background:var(--panel);border:1px solid var(--line);border-radius:18px;padding:6px 11px;
  color:var(--dim);font-size:12px;white-space:nowrap}
.obj-chip.on{border-color:var(--accent);color:var(--txt);background:var(--panel2)}
.obj-chip .oc-type{font-size:10px;color:var(--faint)}
.obj-chip .oc-name{font-weight:600;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.obj-chip .oc-count{background:var(--accent);color:#1a1a1a;border-radius:9px;
  padding:0 6px;font-size:10px;font-weight:700;line-height:16px}
/* 历史页:信号 / 新闻 / 基本面 三面 tab。
   原两栏并排(.hist-cols/.hist-col)已改为单面全宽 —— 信号卡不再挤在窄栏里,
   基本面 markdown 也需要整宽才好读。 */
.hist-pane{min-width:0}
/* tab 上的计数徽标。0 条时 JS 不输出内容,避免显示"(0)"这种噪音。 */
.tab-count{margin-left:4px;font-weight:400;color:var(--faint);font-size:12px}
.tab.on .tab-count{color:var(--dim)}
.hc-empty{font-size:12px;color:var(--faint);text-align:center;padding:20px 6px}
/* 页面更新时间戳(SEO 用,让搜索引擎看到真实 HTML 变化) */
.page-updated{font-size:11px;color:var(--faint);text-align:center;padding:8px 0;margin:0}
