
/* A股惯例：涨/正/多 = 红(#de3a2c)，跌/负/空 = 绿(#16a34a) */
:root{--bg:#f5f5f7;--card:#ffffff;--line:#e6e8ec;--txt:#1d1d1f;--mut:#3a3a3c;--up:#de3a2c;--down:#16a34a;--warn:#d08700}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);color:var(--txt);font-family:-apple-system,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;line-height:1.6;padding:18px 14px}
.wrap{max-width:1100px;margin:0 auto}
h1{font-size:21px;font-weight:700}
.sub{color:var(--mut);font-size:12px;margin-bottom:12px}
.card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px}
h3{font-size:14px;margin-bottom:8px;color:#c9d4df}
.verdict{border:1px solid var(--down);border-radius:12px;padding:14px 16px;background:linear-gradient(135deg,#ffffff,#ffffff)}
.vh{font-size:16px;font-weight:700;color:var(--down)}
.pbar{display:flex;height:26px;border-radius:7px;overflow:hidden;margin:10px 0 4px;border:1px solid var(--line)}
.pbar span{display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:#f5f5f7}
.meta{font-size:12px;color:var(--mut);margin-top:6px}
/* 数据降级警示：行情取不到时用醒目红条明示，避免访客把基线默认值当成真实推算结果 */
.degw{display:none;margin:0 0 10px;padding:9px 12px;border-radius:9px;background:#fdecea;border:1px solid #de3a2c;color:#ffb3ae;font-size:12px;line-height:1.6;font-weight:600}
.warn{border-left:4px solid var(--warn);padding-left:10px;font-size:12px;color:#c9d4df}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.ctrl label{display:block;font-size:12px;color:var(--mut);margin:8px 0 2px}
/* 手机误触防护：垂直方向的滑动一律先给页面滚动（pan-y），
   只有水平拖动才被滑块消费；图表同理，避免 Plotly 的拖拽/缩放吃掉竖向滑动 */
.ctrl input[type=range]{width:100%;touch-action:pan-y}
/* 锁定态（默认）：滑块置灰并禁用，明确告诉用户"当前不可拖动" */
body.slock .ctrl input[type=range]{opacity:.45}
body.slock .ctrl input[type=range]:disabled{cursor:not-allowed}
body.slock .ctrl input[type=range]::-webkit-slider-thumb{background:#6e7681}
body.slock .ctrl input[type=range]::-moz-range-thumb{background:#6e7681}
.js-plotly-plot,.js-plotly-plot .plot-container,.js-plotly-plot svg{touch-action:pan-y}
.ctrl .val{float:right;color:var(--up);font-weight:700}
textarea,button,select{font-family:inherit}
textarea{width:100%;height:70px;background:#f5f5f7;color:var(--txt);border:1px solid var(--line);border-radius:8px;padding:8px;resize:vertical}
.btn{background:#16a34a;color:#fff;border:none;border-radius:8px;padding:9px 16px;font-weight:700;cursor:pointer;margin-right:8px;margin-top:10px}
.btn.sec{background:#e9ebef}
.btn:hover{opacity:.9}
.row{display:flex;gap:14px;flex-wrap:wrap}
.col{flex:1;min-width:300px}
.tick{font-variant-numeric:tabular-nums}
.topbar{position:sticky;top:0;z-index:30;display:flex;justify-content:space-between;align-items:center;gap:12px;background:#ffffff;border:1px solid var(--line);border-radius:12px;padding:10px 16px;margin-bottom:14px;box-shadow:0 2px 10px rgba(0,0,0,.45)}
.topbar .t-left{font-size:13px;color:var(--mut)}
.topbar .t-right{display:flex;gap:22px;align-items:center}
.topbar .t-item{font-size:12px;color:var(--mut);text-align:right;line-height:1.3}
.topbar .t-val{font-size:19px;font-weight:700;color:var(--txt);font-variant-numeric:tabular-nums}
.topbar .pulse{color:#0071e3}
.searchbar{display:flex;gap:8px;margin:10px 0 2px}
.searchbar input[type=search]{flex:1;background:#f5f5f7;color:var(--txt);border:1px solid var(--line);border-radius:8px;padding:9px 12px;font-size:13px}
.searchbar input:focus{outline:none;border-color:#0071e3}
.vresults{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;margin-top:10px}
.vcard{background:#f5f5f7;border:1px solid var(--line);border-radius:10px;padding:10px 12px}
.vcard .vn{font-weight:700;font-size:14px}
.vcard .vc{color:#0071e3;font-size:12px;font-weight:700;margin-left:6px}
.vcard .vm{color:var(--mut);font-size:11px;margin-top:4px}
.vcard .vnote{color:#c9d4df;font-size:11px;margin-top:4px;line-height:1.45}
.vhint{color:var(--mut);font-size:12px;margin-top:8px}
.banner{position:sticky;top:8px;z-index:60;background:#fff8ec;color:#f0d68a;border:1px solid var(--warn);border-radius:10px;padding:9px 14px;font-size:13px;margin-bottom:12px}
.btn[disabled]{opacity:.6;cursor:wait}
/* 搜索/计算中的全局加载提示（可视化小转圈） */
.loadchip{position:fixed;top:14px;left:50%;transform:translateX(-50%);z-index:9999;
  background:#ffffff;border:1px solid #2f81f7;color:#1d1d1f;padding:8px 18px;border-radius:22px;
  font-size:13px;display:none;align-items:center;gap:9px;box-shadow:0 4px 18px rgba(0,0,0,.45);white-space:nowrap}
.loadchip .spin{width:14px;height:14px;border:2px solid #0071e3;border-top-color:transparent;
  border-radius:50%;animation:chipsp .8s linear infinite;flex:0 0 auto}
@keyframes chipsp{to{transform:rotate(360deg)}}
.btstat{font-size:13px;line-height:2;margin-top:6px}
.btstat b{color:var(--txt)}
.facwrap{overflow-x:auto;-webkit-overflow-scrolling:touch}

/* 回测配置区 / 指标卡 */
.btcfg{display:flex;gap:10px;flex-wrap:wrap;align-items:center;font-size:12px;color:var(--mut);margin:6px 0 10px}
.btcfg label{display:inline-flex;align-items:center;gap:5px}
.btcfg select{background:#f5f5f7;color:var(--txt);border:1px solid var(--line);border-radius:8px;padding:6px 8px;font-family:inherit;font-size:13px}
.btcfg .btn{margin-top:0;padding:8px 16px}
.kpi{display:grid;grid-template-columns:repeat(auto-fit,minmax(122px,1fr));gap:8px;margin:12px 0}
#macroBoard .card{margin-top:12px}
#macroGroups .kpi{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}
#macroGroups .kpi > div{min-height:138px}
#macroGroups svg{background:#f5f5f7;border:1px solid var(--line);border-radius:6px;margin-top:6px}
#macroWin button{background:#f5f5f7;color:var(--mut);border:1px solid var(--line);border-radius:8px;padding:5px 11px;font-family:inherit;font-size:12px;cursor:pointer}
#macroWin button:hover{color:var(--txt);border-color:#e6e8ec}
#macroWin button.on{background:#1f6feb;border-color:#1f6feb;color:#fff}
#macroGroups .kpi .v{font-size:16px}
/* ---- 实时新闻列表 ---- */
.newsgrid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.newscol{display:flex;flex-direction:column;min-width:0}
.ncolh{font-size:12px;color:#3a3a3c;border-bottom:1px solid var(--line);padding-bottom:4px;margin-bottom:4px}
.ncolh b{color:#1d1d1f;font-weight:600;font-size:11px;margin-left:2px}
/* 新闻列表：独立滚动区。touch-action:pan-y 只响应竖向手势；
   overscroll-behavior:auto 保留滚动链——列表滚到顶/底后，继续滑才把滚动交给页面 */
.newslist{max-height:300px;overflow-y:auto;touch-action:pan-y;overscroll-behavior:auto;
  -webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:#e6e8ec transparent}
.newslist::-webkit-scrollbar{width:5px}
.newslist::-webkit-scrollbar-thumb{background:#e6e8ec;border-radius:3px}
.newslist::-webkit-scrollbar-track{background:transparent}
.newslist .nitem{display:flex;gap:8px;padding:5px 2px;border-bottom:1px dashed #fbfbfd;font-size:12.5px;line-height:1.55}
.newslist .nitem:last-child{border-bottom:none}
.newslist .ntime{flex:0 0 auto;color:#3a3a3c;font-size:11px;white-space:nowrap;padding-top:2px}
.newslist .ntxt{color:#1d1d1f;word-break:break-all}
.newslist a.ntxt{color:#0071e3;text-decoration:none}
.newslist a.ntxt:active{color:#3a3a3c}
.newslist .ntag{flex:0 0 auto;font-size:10px;color:#de3a2c;border:1px solid rgba(248,81,73,.6);border-radius:3px;padding:0 4px;height:16px;line-height:15px;margin-top:2px;white-space:nowrap}
.newslist .ntag.hd{color:#d08700;border-color:rgba(210,153,34,.6)}
/* ---- 模型页：新闻栏与右侧因子列等高对齐 ---- */
#newsBox{display:flex;flex-direction:column}
#newsBox textarea{min-height:92px;flex:0 0 auto}
#stkNews{flex:1 1 auto;min-height:130px;max-height:none;border:1px solid var(--line);border-radius:6px;padding:4px 8px;overflow-y:auto;margin-bottom:8px;
  touch-action:pan-y;overscroll-behavior:auto;-webkit-overflow-scrolling:touch}
.col.ctrl{display:flex;flex-direction:column}
.btnrow{display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap;margin-top:auto;padding-top:12px}
.btnrow .btn{margin-top:0;flex:0 0 auto}
/* ---- 实时行情闪动（变价时红/绿脉冲一次） ---- */
@keyframes rtup{0%{background:rgba(248,81,73,.32)}100%{background:transparent}}
@keyframes rtdn{0%{background:rgba(63,185,80,.32)}100%{background:transparent}}
.rtup{animation:rtup 1.2s ease-out}
.rtdn{animation:rtdn 1.2s ease-out}
#macroGroups .kpi > div{transition:none}
.kpi > div{background:#f5f5f7;border:1px solid var(--line);border-radius:10px;padding:9px 11px}
.kpi .k{font-size:11px;color:var(--mut);line-height:1.4}
.kpi .v{font-size:18px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.5}
.kpi .s{font-size:11px;color:var(--mut)}
.btverdict{border:1px solid var(--line);border-left:4px solid var(--warn);border-radius:8px;padding:10px 12px;font-size:13px;line-height:1.7;background:#ffffff}
#backBtn{padding:5px 12px;font-size:12px;margin:0 0 0 auto;vertical-align:middle}
.mtitle-row{display:flex;align-items:center;flex-wrap:wrap;gap:4px}
.mtitle-row h3{margin-bottom:0}

/* ===================== 手机 / 窄屏适配 ===================== */
@media (max-width:780px){
  body{padding:12px 10px}
  h1{font-size:18px}
  .sub{font-size:11px;margin-bottom:10px}
  .card{padding:12px 12px;border-radius:10px}
  .grid2{grid-template-columns:1fr;gap:10px}          /* 图表改为单列 */
  .row{flex-direction:column;gap:0}
  .col{min-width:0;width:100%}                        /* 去掉 300px 最小宽度 */
  .topbar{flex-wrap:wrap;gap:6px;padding:8px 12px}
  .topbar .t-left{font-size:11px}
  .topbar .t-right{gap:14px}
  .topbar .t-item{font-size:10px}
  .topbar .t-val{font-size:15px}
  .vresults{grid-template-columns:1fr}
  .vh{font-size:14px;line-height:1.5}
  .pbar{height:24px}
  .pbar span{font-size:11px}
  .meta{font-size:11px}
  #facTable{font-size:11px}
  .btn{padding:10px 14px;font-size:14px;width:100%;margin-right:0}
  .btn.sec{margin-top:8px}
  /* iOS 聚焦时若字号 <16px 会自动放大页面 */
  .searchbar input[type=search],textarea{font-size:16px}
  .searchbar{flex-wrap:wrap}
  /* 触摸目标：浏览器默认滑块只有 16px 高，手指很难精确拖动 → 放大到 32px 轨道 + 26px 滑块 */
  .ctrl input[type=range]{-webkit-appearance:none;appearance:none;height:32px;background:transparent;margin:2px 0}
  .ctrl input[type=range]::-webkit-slider-runnable-track{height:6px;border-radius:3px;background:#e6e8ec}
  .ctrl input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:26px;height:26px;margin-top:-10px;border-radius:50%;background:#0071e3;border:2px solid #f5f5f7;cursor:pointer}
  .ctrl input[type=range]::-moz-range-track{height:6px;border-radius:3px;background:#e6e8ec}
  .ctrl input[type=range]::-moz-range-thumb{width:26px;height:26px;border:2px solid #f5f5f7;border-radius:50%;background:#0071e3;cursor:pointer}
  .ctrl label{margin-top:10px}
  /* 首页快讯：仍保持左右两栏，只是收紧字号与间距 */
  .newsgrid{gap:10px}
  .ncolh{font-size:11px}
  .newslist{max-height:260px}
  .newslist .nitem{font-size:11.5px;gap:6px;padding:4px 0}
  .newslist .ntime{font-size:10px}
  #stkNews{min-height:170px}
  /* 模型页按钮：手机下在右侧列纵向铺满 */
  .btnrow{flex-direction:column;align-items:stretch;padding-top:10px}
  .btnrow .btn{width:100%}
  #backBtn{width:auto;flex:0 0 auto}   /* 标题行重置按钮保持内容宽、贴右，不被铺满 */
  .fab{display:none}
}
/* 桌面端不需要回顶浮标 */
@media (min-width:781px){ .fab{display:none !important} }
.fab{position:fixed;right:14px;bottom:20px;z-index:80;width:46px;height:46px;border-radius:50%;
  background:#16a34a;color:#fff;border:1px solid rgba(0,0,0,.10);font-size:19px;line-height:1;
  box-shadow:0 4px 14px rgba(0,0,0,.55);cursor:pointer}
@media (max-width:400px){
  .topbar .t-right{gap:10px}
  .topbar .t-val{font-size:14px}
}

  /* ---- 个股题材：申万行业 + 概念题材 ---- */
  #themeBox{margin:8px 0 10px;padding:8px 10px;border:1px solid var(--line);border-radius:6px;background:rgba(88,166,255,.05)}
  /* 每行 = 固定宽度右对齐的标签列 + 可换行的标签容器：
     标签换行后仍与首行对齐（不会顶回最左边），三行的标签列互相严格对齐 */
  .themeRow{display:flex;align-items:flex-start;gap:6px;margin-bottom:6px}
  .themeRow:last-child{margin-bottom:0}
  .tLabel{flex:0 0 52px;text-align:right;font-size:11px;color:var(--mut);line-height:20px;margin-right:2px;white-space:nowrap}
  .themeTags{flex:1 1 auto;display:flex;flex-wrap:wrap;gap:5px;align-items:center;min-width:0}
  /* 标签统一为定高 inline-flex：主文字/排名徽章/涨跌数字垂直居中一致，标签高度恒定 */
  .tag{display:inline-flex;align-items:center;font-size:11px;line-height:18px;height:18px;padding:0 8px;border-radius:9px;border:1px solid #e9ebef;background:#f1f2f5;color:#c9d1d9;white-space:nowrap}
  .tag.ind{border-color:#d08700;color:#f0d68a;background:rgba(208,135,0,.10);font-weight:600}
  .tag.top1{border-color:#de3a2c;color:#ffa198;background:rgba(248,81,73,.14)}
  .tag.top2{border-color:#db6d28;color:#ffab70;background:rgba(219,109,40,.12)}
  .tag.top3{border-color:#d08700;color:#f0d68a;background:rgba(210,153,34,.10)}
  /* 排名做成小徽章：与名称明显分离，避免「漂亮100 3」连读；随 flex 垂直居中不再错位 */
  .tag .rk{font-size:9px;opacity:.9;margin-left:5px;min-width:14px;height:13px;line-height:13px;text-align:center;padding:0 3px;border-radius:7px;background:#e9ebef}
  .themeBiz{font-size:11px;color:var(--mut);line-height:1.55;margin-top:2px}
  /* 经营范围行：与上面「申万行业/概念题材」同一套「标签列 + 内容列」结构，
     文字起点与其他行严格对齐（52px 标签列 + 6px 间距） */
  .bizRow{display:none;align-items:flex-start;gap:6px;font-size:11px;color:var(--mut);line-height:1.55;margin-top:2px}
  .bizRow .tLabel{flex:0 0 52px;line-height:1.55}
  .bizRow .bizTxt{flex:1 1 auto;min-width:0;word-break:break-word}

  .tag .cg{font-size:10px;margin-left:5px;font-weight:500;font-variant-numeric:tabular-nums}
  .tag .cg.up,.cg.up{color:#de3a2c}
  .tag .cg.down,.cg.down{color:#16a34a}
  .tag.heat.up{border-color:#de3a2c;color:#ffa198;background:rgba(248,81,73,.12);font-weight:600}
  .tag.heat.down{border-color:#16a34a;color:#7ee787;background:rgba(63,185,80,.12);font-weight:600}
  /* 控制台列头：说明文字与「解锁滑块」按钮同一行，按钮固定右上不被拉伸 */
  .ctrlhd{display:flex;align-items:flex-start;gap:8px}
  .ctrlhd label{flex:1 1 auto;min-width:0}
  #lockBtn{flex:0 0 auto;float:none;width:auto;padding:3px 10px;margin:0;font-size:12px;color:#d08700}
  /* ---- 应用内新闻阅读器：不跳出站点，顶部常驻关闭按钮 ---- */
  #reader{position:fixed;left:0;top:0;right:0;bottom:0;z-index:300;display:none;flex-direction:column;background:#f5f5f7}
  #reader.on{display:flex}
  #reader .rbar{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid #e9ebef;background:#ffffff}
  #reader .rtitle{flex:1 1 0;min-width:0;font-size:12.5px;color:#c9d1d9;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  #reader .rbtn{flex:0 0 auto;font-size:12px;padding:7px 12px;border-radius:6px;border:1px solid #e9ebef;background:#f1f2f5;color:#c9d1d9;cursor:pointer;text-decoration:none;line-height:1.2}
  #reader .rclose{background:#b3261e;border-color:#b3261e;color:#fff;font-size:13px;padding:8px 14px}
  #reader .rbody{flex:1 1 auto;position:relative;background:#fff;overflow:hidden}
  #reader iframe{width:100%;height:100%;border:0;display:block}
  #reader .rload{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;font-size:13px;color:#3a3a3c;background:#f5f5f7}
  /* 正文容器必须绝对定位铺满 rbody：rbody 是 overflow:hidden 的块级容器，
     若正文用 flex:1（父级非 flex 不生效）或 height:auto，超出部分会被 rbody 裁掉且无法滚动，
     表现就是「新闻只显示一屏、要点『原文』才看得到后面」。absolute + inset:0 后由自身滚动。 */
  #reader .rart{position:absolute;left:0;top:0;right:0;bottom:0;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:14px 14px 40px;background:#f5f5f7;color:#c9d1d9;font-size:16px;line-height:1.85;display:none}
  #reader .rart h1{font-size:19px;line-height:1.45;color:#1d1d1f;margin:2px 0 8px;font-weight:600}
  #reader .rart .rmeta{font-size:12px;color:#8b949e;margin-bottom:12px;padding-bottom:10px;border-bottom:1px solid #f1f2f5}
  #reader .rart p{margin:0 0 14px}
  #reader .rart img{max-width:100%!important;height:auto!important;display:block;margin:10px auto;border-radius:6px}
  #reader .rart a{color:#0071e3;text-decoration:none;border-bottom:1px solid #1f6feb44}
  #reader .rart div{margin:0 0 12px}
  #reader .rart span{color:#8b949e}
  /* 正文末尾的版权与来源声明：全文转载场景下必须显著标注权利人 */
  #reader .rcr{margin:20px 0 6px;padding:10px 12px;border:1px dashed #e9ebef;border-radius:8px;
    background:#ffffff;font-size:12px;color:#3a3a3c;line-height:1.75}
  #reader .rcr a{color:#0071e3;text-decoration:none}
  #reader .rretry{margin-top:2px}
  .sitefoot{display:flex;flex-wrap:wrap;align-items:center;gap:14px;margin:18px 0 4px;padding-top:12px;
    border-top:1px solid #e6e8ec;font-size:12px;color:#3a3a3c}
  .sitefoot a{color:#0071e3;text-decoration:none}
  .sitefoot a:hover{text-decoration:underline}
  .introbar{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0 4px}
  .introbar .it{background:#ffffff;border:1px solid #e6e8ec;border-radius:7px;padding:5px 11px;
    font-size:11.5px;color:#3a3a3c;line-height:1.5}
  .introbar .it b{color:#1d1d1f;margin-right:6px;font-weight:600}
  #reader .rfail{position:absolute;left:0;top:0;right:0;bottom:0;display:none;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:24px;text-align:center;font-size:13px;color:#3a3a3c;background:#f5f5f7;line-height:1.6}
/* APP 内（壳 UA 带 PVCApp）不再提示下载 APP —— class 由 body 首行脚本打在 <html> 上 */
.inapp #btnApp{display:none !important}
