/* 配色对齐 Finviz 深色主题（站主 2026-08-17：「他的色号更亮更清爽，
   我希望我们所有的颜色都跟他一致」）。只对齐色值，代码/版式/品牌均为自建。

   下面每个值都是**在 finviz.com 上实测的计算色**（不是肉眼估的，也不是
   从截图取的 —— 截图会被压缩改色）：遍历 DOM 取 getComputedStyle，
   按面积/字数统计出各角色的主色。原始归属记在注释里，将来要核对能对得上。

   与我们原来那套墨蓝（--bg:#0f0f17）的差别就是站主说的两点：整体**更亮**
   （#0f0f17 → #1d2028），且色相从紫偏蓝灰，于是更**清爽**。 */
:root{
  --bg:#1d2028;            /* Finviz 斑马纹底：#22262f 叠 rgba(1,0,0,.15) 的实算值 */
  --panel:#22262f;         /* Finviz 全站主色（419 个容器都用它）*/
  --panel2:#363a46;        /* Finviz table.header —— 我们拿来做输入框底与悬停 */
  --panel3:#4c5261;        /* Finviz table.navbar */
  --line:#353945;          /* Finviz 细线（全站 78 处）*/
  --line2:#4c5263;         /* Finviz 强线 / 输入框边框（47 处）*/
  /* 站主 2026-08-17：「他们的白色比我们的更白」。量下来他是对的，但差别不在
     白的色号上 —— Finviz 的**表格数据也是 #f3f3f5**，和我们原来一样；
     差在**用量**：他整页 17 万字里只有 535 个字用次级灰(只给表头)，
     其余全是 #ffffff / #f3f3f5；我们首页有一多半的字是次级灰。
     所以主文字提到纯白（= Finviz 导航与标题的色），导航链接也一并放白。 */
  --fg:#ffffff; --muted:#c3c6d0; --faint:#868ea5;
  --link:#57aefb;          /* Finviz 链接与股票代码 */
  /* A股红涨绿跌：--up=涨=红，--down=跌=绿（与欧美相反，务必别做反）。
     ⚠ 色值取自 Finviz，但**角色是反的**：他那边绿=涨、红=跌，
     所以他的红(#fd8487)是特意调淡的「弱色」。搬到 A 股后落在「涨」上，
     涨会比跌淡一档。站主 2026-08-17 要求色号一致，照办；
     若日后觉得涨该更抢眼，只需把这两个值对调强弱，其余不用动。 */
  --up:#fd8487; --down:#34c062;
  --accent:#2f91ef;        /* Finviz 按钮蓝 */
  /* ⚠ 这一支不是 Finviz 的色。他的暖色只有 #fc8955，而那个与「涨」的
     珊瑚红 #fd8487 只差一个蓝通道（85 vs 135），12px 下读起来是同一个颜色
     （站主 2026-08-17 指出「突破观察价的颜色和上涨的颜色太相近了」）。
     Finviz 深色界面里**没有黄色**（翻遍首页与筛选器，唯一的黄来自第三方广告），
     所以这里自己取一支同亮度带的琥珀，与红/绿/蓝都拉得开。 */
  --accent2:#fbbf24;
  /* PASS/FAIL 是语义色（通过/未过），与涨跌无关，保持绿=通过红=未过 */
  --pass:#34c062; --fail:#fd8487; --unknown:#868ea5;
  --row:#22262f; --row-alt:#1d2028;
  --row-hover:#404553;     /* Finviz dark 主题的行悬停实测值 */
  --head:#363a46;          /* Finviz 表头 */
  --ink:#14161d;           /* Finviz 最深一档（导航条）：顶栏、页脚、色块上的深字 */
  /* ── K 线图专用色：**不跟 UI 调色板走** ───────────────────────────────
     站主 2026-08-17：「K线图的颜色不能改啊，改回去」。这两支是我方原来的
     红涨绿跌，换 Finviz 配色时被顺手带走了 —— 那次换的是**文字**的色,
     而 K 线是**填充的图形**：同一支珊瑚红当字很清爽，涂成实体阴线就成了
     褪色的粉，一眼看不出强弱。所以图表色从此单开一套，UI 调色板再怎么动
     都不碰它。均线色同理（MA_STYLE 在 app.js，一并复原）。 */
  --k-up:#ef4d54; --k-down:#22b06a;
}
*{box-sizing:border-box}
/* body 用 min-height 而非 height：height:100% + border-box 会把 body 钉死成一屏高，
   其 padding-bottom 被关在盒内、对溢出内容无效 —— 页尾会被固定免责条压住。 */
/* iOS Safari 会对它认为「排版过窄/溢出」的块自动放大字号（text autosizing），
   实测能把提示框里的题材文字放大近一倍并撑破边框。全站关掉，字号一律听 CSS 的。 */
html{margin:0;height:100%;-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{margin:0;min-height:100%}
body{background:var(--bg);color:var(--fg);
  font:13px/1.45 -apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",Segoe UI,Roboto,sans-serif;
  -webkit-font-smoothing:antialiased}
a{color:var(--link);text-decoration:none}
/* 悬停不划线,全站一条(站主 2026-09-02:「什么都不划线,这种设计太难看了」)。
   此前 a:hover 全站划线,十三处各自写一句 text-decoration:none 去压它,漏掉的整卡链接
   (首页今日越线卡)一悬停满卡横线。根删了,那十三句也一起删了 —— 别再加回来。 */
/* 页面左右留白随视口走：18px（窄屏）→ 4vw → 封顶 64px。此前全站只有 18px，
   桌面上内容贴着窗口两侧、看着像没排过版（站主 2026-08-16 指出「上下左右都靠边线太近」）。
   顶栏与正文共用同一条 .wrap，品牌/账号位与正文左右边线始终对齐。 */
/* ── 全站页宽:三档,按「这一页是干什么的」分,不按页名分 ─────────────────
   站主 2026-09-12:「目前的 djyyhub 网站页面的宽度有好多不同的规格呢,为什么会这样」
   —— 因为从来没有一处定义过「一页该有多宽」,每加一页就在当时最顺手的文件里现写一遍。
   实测 1819 宽的窗口上有五种:首页 1200 / 筛选器 1600 / 交易台满宽 / 运营台 900 / 训练台满宽,
   边距四种:64 / 72 / 16 / 18。这里收成三档:

     读的  --page-read  900   运营台、以后的说明页。一行太长就读不下去。
     看的  --page-grid 1600   首页、筛选器、环境风向、个股详情。卡片网格太宽会散。
     操作的  不封顶            交易台、训练台。宽度全给表格和 K 线。

   边距同理两档:读/看用 --gutter(和顶栏同一个值,所以 1600 以内顶栏与正文天然对齐),
   操作用 --gutter-app(小,因为那两页要宽度)。
   ⚠ **--gutter 只给「不封顶」的盒子用**(顶栏、操作档)。封顶又居中的盒子(读的那一档)
      不能拿它当左右内边距 —— 盒子从 900 就不再变宽,而 clamp 里的 4vw 会一直长到窗口 1800,
      于是窗口越拉宽正文反而越窄(2026-09-12 实测:1819 时只剩 756,比改动前的 868 还少 112)。
      那种盒子用一个小常数就够:居中之后两侧本来就有大片留白,内边距只在窗口窄到撑不下时才起作用。
   ⚠ **同一份定义在 web/sitebar.js 里还有一处**(子页面不加载 styles.css)。改一边必须改另一边。 */
:root{--gutter:clamp(20px,4vw,72px);--gutter-app:18px;--page-read:900px;--page-grid:1600px}
.wrap{max-width:var(--page-grid);margin:0 auto;padding:0 var(--gutter)}
/* 正文上下也留出呼吸：顶部与顶栏之间、底部与固定免责条之间各留一段，
   不让第一块内容顶着顶栏、最后一块压在免责条上。 */
main.wrap{padding-top:18px;padding-bottom:44px}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}

/* 顶栏 */
header.top{background:var(--ink);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:40}   /* 2026-09-07 站主:「顶部的这个条固定住」*/
/* ⚠ 顶栏**不跟正文共用宽度**,它贴着窗口走 —— 这是 2026-09-12 站主定的:
     「顶栏我觉得要固定,否则每次换个页面就跳。我都点不到。」
   实测 1819 宽的窗口:主站的「训练台」在 520~586,子页面(交易台/运营台/训练台,
   顶栏由 sitebar.js 画)在 423~489,每个链接横向差 95px —— 从主站那个位置点过去
   是空白,点回来会点到「收藏」。根子是两份实现:主站这条被 .wrap 的 max-width:1600
   居中收口,sitebar 那条 2026-09-08 为了挡宿主样式泄漏写死了 max-width:none。
   统一成**贴边**那一种:数值与 sitebar.js 逐条相同(高 50 / gap 16 / padding clamp(20,4vw,72)),
   两边改一处必须改另一处。
   代价说明白:这部分**取代**了上面那段 2026-08-16 的「顶栏与正文共用同一条 .wrap,
   品牌/账号位与正文左右边线始终对齐」—— 窗口 ≤1600 时两者仍然对齐(max-width 没到,
   两条 clamp 在 4vw 区间取同一个值);只有超过 1600、正文被居中收口之后,
   顶栏才会比正文宽。那一档上顶栏是「窗口的边框」,正文是「居中的内容」。 */
.top .wrap{display:flex;align-items:center;gap:16px;height:50px;
  max-width:none;margin:0;padding:0 var(--gutter)}
/* 站标(2026-09-07 站主:「/auth/admin 那个 logo 最好看,全站都改成这个」):纯文字,DJYY 白、趋势 链接蓝,
   与 djyyauth pages.py 的 .brand 同一组数值(19px / 800 / -.3px / gap .28em),不再画那个折线图标。 */
.brand{display:inline-flex;align-items:center;text-decoration:none;flex:none;line-height:1.2}
.brand b{font-size:19px;font-weight:800;color:#fff;letter-spacing:-.3px;white-space:nowrap;display:inline-flex;gap:.28em}
.brand b span{color:var(--link)}
.grow{flex:1}
.nav{display:flex;gap:2px;margin-left:10px;flex:none}
/* 中文短标签禁止字符级断行（窄屏下「首页」被拆成两行的根因） */
.nav a{color:var(--fg);padding:6px 13px;font-size:13.5px;font-weight:600;
  border-bottom:2px solid transparent;white-space:nowrap;flex:none}
.nav a:hover{color:var(--fg)}
.nav a.on{color:#fff;border-bottom-color:var(--link)}
/* 顶栏账号位：一个按钮 + 下拉菜单。平铺「用户名 管理 退出」在窄屏必溢出。 */
.acct{position:relative;flex:none;display:flex;align-items:center}
.acctbtn{display:flex;align-items:center;gap:6px;background:transparent;
  border:1px solid var(--line2);border-radius:16px;color:var(--muted);
  padding:5px 11px 5px 9px;font-size:12.5px;cursor:pointer;max-width:11em}
.acctbtn:hover{color:var(--fg);border-color:var(--faint)}
.acctbtn .an{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acctmenu{position:absolute;right:0;top:calc(100% + 7px);z-index:60;min-width:172px;
  background:var(--panel);border:1px solid var(--line2);border-radius:9px;
  box-shadow:0 10px 28px rgba(0,0,0,.5);overflow:hidden;padding:4px}
.acctmenu[hidden]{display:none}
.am-who{padding:8px 11px 9px;font-size:13px;font-weight:700;color:var(--fg);
  border-bottom:1px solid var(--line);margin-bottom:4px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.am-who span{display:block;font-size:11.5px;font-weight:500;color:var(--faint);margin-top:2px}
.acctmenu a,.acctmenu button{display:block;width:100%;text-align:left;background:transparent;
  border:0;color:var(--fg);font-size:13px;padding:9px 11px;border-radius:6px;
  cursor:pointer;white-space:nowrap;font-family:inherit}
.acctmenu a:hover,.acctmenu button:hover{background:var(--panel2)}
.acctmenu button#logout{color:var(--muted)}
.acctmenu button#logout:hover{color:var(--up)}
/* 使用期提醒条(会员系统 2026-08-19):顶栏下面一条,≤14 天出现、≤7 天加重;每天最多一次,可关。
   不是 fixed:它是当天要读一眼的一句话,不该一直压着内容。 */
.expbar{background:#2b2612;border-bottom:1px solid #6b5a1c;color:var(--accent2);font-size:13px}
.expbar.hot{background:#33201a;border-bottom-color:#7a3d33;color:#ffb3a8}
/* 它是**全站壳**的一部分(黄条通栏铺满窗口),得跟顶栏同一条边线,不跟正文那条。
   2026-09-12 顶栏改成 max-width:none 之后,这里若还继承 .wrap 的 1600 居中,
   >1600 的窗口上文字会比正上方的站标往里缩 (W−1600)/2 像素。 */
.expbar .wrap{display:flex;align-items:center;gap:12px;min-height:36px;padding-top:6px;padding-bottom:6px;
  max-width:none;margin:0;padding-left:var(--gutter);padding-right:var(--gutter)}
.expbar span{flex:1;line-height:1.45}
.expbar .x{flex:none;background:transparent;border:0;color:inherit;opacity:.75;font-size:18px;line-height:1;
  width:32px;height:32px;border-radius:6px;cursor:pointer;padding:0}
.expbar .x:hover{opacity:1;background:rgba(255,255,255,.08)}
.fam{font-size:12px;color:var(--muted)}
.fam select{background:var(--panel2);color:var(--fg);border:1px solid var(--line2);
  border-radius:4px;padding:3px 6px;font-size:12px;margin-left:4px}
.fam .soon{color:var(--faint);font-size:11px;margin-left:6px}
.meta{color:var(--muted);font-size:12px}

/* ── 首页「大盘环境」带 ──────────────────────────────────────────────
   两栏 = 两个数据来源，**必须分开**：左栏全部出自沪深300 指数自身，右栏出自
   全市场 5000+ 只 A 股的统计。原先八项混排，站主当场就问「这些都是沪深300 的吗，
   那不能写全市场」——来源混在一起，标签写得再对也会被读错（2026-08-17）。
   位置在搜索框与形态家族之间：大盘方向是看个股形态的前提，但它是背景信息，
   密度和字号都压在形态卡片之下。 */
.mband{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;
  margin-bottom:26px}
/* 两栏等高、指标贴底对齐：左栏多一条走势线，不这样右栏的指标会浮在上半截，
   两边的行错开一大截（站主要的「整齐」不只是每栏内部整齐）。 */
.mband{align-items:stretch}
.mband .bcol{padding:15px 20px 17px;min-width:0;display:flex;flex-direction:column;
  background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:hidden}
/* 2026-09-02 站主:「把右边这张卡放到左边这张卡的下面,沪深300热力图放在右边,和两张卡高度总和等高」
   左栏两张卡叠放(行 1、行 2),右栏小热力图跨两行 —— 高度由网格给,图在里面 flex:1 撑满。 */
.mband .ixcard{grid-column:1;grid-row:1}
.mband .brcard{grid-column:1;grid-row:2}
.mband .heatcard{grid-column:2;grid-row:1/3;color:inherit;padding-bottom:15px}
.mband .heatcard:hover{border-color:var(--line2)}
.heat.mini{flex:1;height:auto;min-height:0;border-radius:8px}
/* 常用指数条(东财实时):八格,手机四格两行 */
.idxhead{display:flex;justify-content:space-between;align-items:baseline;font-size:12px;color:var(--muted);margin-bottom:8px}
.idxhead em{font-style:normal;font-size:11px;color:var(--faint)}
/* 站主 09-02:「把常用指数的方块做大一点,总宽度和下面的对齐」—— 撑满 .mband 同一宽度。
   ⚠ 列数**必须等于指数个数**,写死 9 而实际只有 8 个(北证50 随「北交所不交易」一起清掉,
   数据侧 gen_quotes.py 的 INDEXES 从 09-05 起就是 8 个),第 9 列恒空 ——
   指数条的右边线比正下方那张热力图卡短一整格,正好是他当初点名要对齐的那条线。
   2026-09-12 实测洞宽:1280 档 130px、1920 档 163px。 */
.idxstrip{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:10px;margin-bottom:20px}
.idxstrip .ic{display:flex;flex-direction:column;gap:4px;padding:13px 15px 12px;min-width:0;background:var(--panel);border:1px solid var(--line);border-radius:12px}
.idxstrip .ic i{font-style:normal;font-size:12.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.idxstrip .ic b{font-size:18px;font-weight:800;font-variant-numeric:tabular-nums;color:var(--fg);letter-spacing:-.2px}
.idxstrip .ic em{font-style:normal;font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--muted)}
.idxstrip .ic .up{color:var(--up)} .idxstrip .ic .down{color:var(--down)}
.mband .bcol .bmetrics{margin-top:auto}
@media (max-width:900px){
  .mband{grid-template-columns:1fr;gap:16px}      /* 与 famgrid 同一个断点、同一个缝 */
  .mband .ixcard,.mband .brcard,.mband .heatcard{grid-column:1;grid-row:auto}
  .heat.mini{flex:none;height:280px}
  .idxstrip{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-bottom:16px}
}
@media (max-width:720px){
  .mband .bcol{padding:13px 15px 15px}
}
/* 来源标题：谁算的、算了多少只，写在最前面 */
.mband .bch{margin:0 0 9px;font-size:12px;font-weight:700;color:var(--fg);
  display:flex;align-items:baseline;gap:7px;flex-wrap:wrap}
.mband .bch em{font-style:normal;font-size:11px;font-weight:500;color:var(--faint)}
.mband .bhd{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.mband .bpx{font-size:21px;font-weight:800;font-variant-numeric:tabular-nums;letter-spacing:-.3px}
.mband .bchg{font-size:13px;font-weight:700;font-variant-numeric:tabular-nums}
.mband .bpx{color:var(--fg)}
.mband .bpx.up,.mband .bchg.up{color:var(--up)} .mband .bpx.down,.mband .bchg.down{color:var(--down)}
.mband .bchg{color:var(--muted)}
.mband .bchg.up{color:var(--up)} .mband .bchg.down{color:var(--down)}
.mband .bsub{margin-left:auto;font-size:10.5px;color:var(--faint)}
/* 走势线铺满栏宽（高度固定），不再是左边一小截 */
.mband .bspark{display:block;width:100%;height:36px;margin:5px 0 11px}
/* 指标网格固定两列 —— auto-fit 会在 1200px 宽下排成 6+2 那种参差的样子（站主指出）。
   两栏各两列，左右两组的行基线天然对齐。 */
.mband .bmetrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:11px 16px;min-width:0}
.mband .bm{display:flex;flex-direction:column;gap:2px;min-width:0}
.mband .bm i{font-style:normal;font-size:11px;color:var(--muted);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.mband .bm b{font-size:15px;font-weight:700;color:var(--fg);font-variant-numeric:tabular-nums}
/* 位置词跟在数值后面。原来写「14 分位」—— 统计术语，中文里不好懂（站主指出），
   改成「偏低 / 中等 / 偏高」这类大白话；精确的百分比留在悬停说明里。 */
.mband .bm b em,.mband .brh em{font-style:normal;font-size:11px;font-weight:600;
  color:var(--faint);margin-left:7px}
.mband .bm b em.warn,.mband .brh em.warn{color:var(--accent2)}
.mband .bm b em.hot,.mband .brh em.hot{color:var(--up)}
/* 成分股那栏：一行标题+数值+位置词，下面紧跟一条近一年曲线。
   站主 2026-08-17：「站上MA50 和 MA200 都做成迷你曲线，这样更直观」——
   曲线自己就说明了「现在是高还是低」，不需要任何术语。 */
.mband .brow{margin-bottom:12px;cursor:help}
.mband .brow:last-of-type{margin-bottom:10px}
.mband .brh{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.mband .brh i{font-style:normal;font-size:11px;color:var(--muted);
  border-bottom:1px dotted var(--line2);padding-bottom:1px}
.mband .brh b{font-size:17px;font-weight:800;color:var(--fg);font-variant-numeric:tabular-nums;
  letter-spacing:-.3px}
.mband .bspark.sm{height:26px;margin:3px 0 0}
/* 广度曲线比指数线高一倍多：站主 2026-08-17「太平滑了，完全看不出什么」——
   71 个百分点的变化压在 20px 里，每个百分点 0.28px，日常波动直接消失。
   56px 才装得下形状。 */
.mband .bspark.bw{height:56px;width:100%;margin:4px 0 0;display:block}
@media (max-width:720px){.mband .bspark.bw{height:60px}}
.mband .bmetrics.one{grid-template-columns:1fr}
.mband .bm b .up{color:var(--up)} .mband .bm b .down{color:var(--down)}
/* 分布日着色的档位由 app.js 的 ddTone 定：≤4 常态、5-6 琥珀、7+ 红
   （M-31 按 A 股自己的分位重标定过，不是照搬美股那套 3-4/5+）。
   颜色只说明落在刻度哪一档，页面上不写「警戒」这类判断词 —— 刻度说明在 hover 里。 */
.mband .bm.warn b{color:var(--accent2)}
.mband .bm.bad b{color:var(--up)}
.mband .bm[data-pop]{cursor:help}
.mband .bm[data-pop] i{border-bottom:1px dotted var(--line2);padding-bottom:1px;
  display:inline-block;max-width:100%}

/* ── 首页：全市场搜索 + 形态家族 ── */
/* 首页是一块居中的窄栏（1200px），不跟着 .wrap 铺到 1600：
   两张家族卡片左右并排，各占一半；铺满整幅时每张卡 1400px 宽、
   示意曲线被横向拉成一条扁线、三个数字隔半屏才见一个（站主：「太宽了，都变形了」）。 */
/* 首页原来在 1600 的框里又套了一层 1200,于是首页比筛选器窄一截,来回切内容会缩一下。
   它和筛选器是同一档(看的),归到 --page-grid,这层多余的收口去掉。 */
.home{margin:22px 0 20px}
.hsearch{position:relative;margin-bottom:36px}
.hsearch .hlb{font-size:12px;color:var(--muted);font-weight:600;margin:0 0 9px 2px}
.sbox{display:flex;align-items:center;gap:12px;background:var(--panel);border:1px solid var(--line2);border-radius:11px;padding:14px 18px;color:var(--muted)}
.sbox:focus-within{border-color:var(--link);box-shadow:0 0 0 4px rgba(87,174,251,.1)}
.sbox input{flex:1;background:transparent;border:0;outline:0;color:var(--fg);font-size:15px}
.sbox input::placeholder{color:var(--faint)}
.sugg{position:absolute;left:0;right:0;top:100%;margin-top:8px;background:var(--panel);border:1px solid var(--line2);border-radius:10px;overflow:hidden;z-index:20;display:none;box-shadow:0 12px 30px rgba(0,0,0,.4)}
.sugg.show{display:block}
.srow{display:flex;align-items:center;gap:12px;padding:10px 15px;border-bottom:1px solid var(--line);text-decoration:none;color:var(--fg)}
.srow:last-child{border-bottom:0}
.srow:hover{background:var(--panel2)}
.srow .tk{color:var(--link);font-weight:700;font-family:ui-monospace,Menlo,monospace;min-width:90px}
.srow .nm{font-weight:600}
.srow .ind{color:var(--muted);font-size:12px}
.srow .sb2{margin-left:auto;font-size:10.5px;font-weight:600;padding:2px 9px;border-radius:10px}
.srow .sb2.cup{background:#7c51e733;color:#a98bff} .srow .sb2.plain{background:var(--panel3);color:var(--muted)}
.famsec .kick{font-size:10.5px;letter-spacing:2px;color:var(--down);text-transform:uppercase;font-weight:700}
.famsec .fhd{display:flex;align-items:center;gap:12px;margin:5px 0 18px}
.famsec .fhd h2{margin:0;font-size:20px;font-weight:800;color:#fff}
/* 新鲜度三态。绿=按时更新过；琥珀=过了该更新的点还没换包；灰=拿不到判据（不装作没事）。
   ⚠ 这里的绿不是装饰：它由 health.json 的 stale_after 决定，引擎停了就会自己变琥珀。 */
.famsec .health{margin-left:auto;display:flex;align-items:center;gap:7px;color:var(--muted);font-size:12px}
.famsec .health i{width:7px;height:7px;border-radius:50%;flex:none;background:var(--faint)}
.famsec .health.ok i{background:var(--down);box-shadow:0 0 0 3px rgba(52,192,98,.18)}
.famsec .health.stale{color:var(--accent2);font-weight:600}
.famsec .health.stale i{background:var(--accent2);box-shadow:0 0 0 3px rgba(251,191,36,.18)}
.famsec .health.warn{color:var(--accent2)}
.famsec .health.warn i{background:var(--accent2);box-shadow:0 0 0 3px rgba(251,191,36,.18)}
/* 两张家族卡片并排；≤900px（平板竖屏/手机）退成一列。
   卡片自身不设宽度，全靠栅格分配，将来加第三个家族只是多一格。 */
/* auto-fit 而不是写死两列：只剩一个家族在册时（某家族被下架、或池子空了），
   写死两列会让那张卡缩在左半边、右边空掉一大片（1440 下实测空 610px）。
   auto-fit 在只有一张时让它铺满，两张时并排，将来第三个家族自动换行。 */
/* ⚠ 这里**不能用 auto-fit**。家族卡是固定的 4 张,auto-fit 会按窗口宽度自己决定列数,
   一旦算成 3 列就是 3 + 1,右边空出两格(站主 2026-09-12 截图指出)。
   2026-09-12 之前没暴露,是因为首页外面还套着一层 max-width:1200 —— 1200 宽下
   (1200+20)/(420+20)=2.77 恰好落进 2 列。那天把首页归到「看的」那一档(1600)之后,
   1536 的窗口算出 3 列,洞就出来了。**这是我那次改动带出来的,不是老账。**
   固定 4 张卡就该固定列数:桌面 2 列(4 张 = 2×2),窄屏 1 列。
   事件卡靠 grid-column:1/-1 横跨,固定列数下照样成立。 */
.famgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;align-items:stretch}
@media (max-width:900px){.famgrid{grid-template-columns:1fr;gap:16px}}
.famcard2{background:var(--panel);border:1px solid var(--line);border-radius:14px;overflow:hidden;cursor:pointer;
  display:flex;flex-direction:column;transition:border-color .12s,box-shadow .12s}
.famcard2:hover{border-color:var(--line2);box-shadow:0 8px 28px rgba(0,0,0,.28)}
.famcard2 .fch{display:flex;align-items:center;gap:13px;padding:18px 22px 6px}
.famcard2 .fno{font-family:ui-monospace,Menlo,monospace;color:var(--faint);font-size:13px;font-weight:700}
.famcard2 .fch h3{margin:0;font-size:19px;font-weight:800;color:#fff}
.famcard2 .run{margin-left:auto;font-size:11px;font-weight:700;color:var(--down);background:rgba(52,192,98,.14);border:1px solid rgba(52,192,98,.32);border-radius:12px;padding:3px 12px}
.famcard2 .run.bad{color:var(--accent2);background:rgba(251,191,36,.13);border-color:rgba(251,191,36,.34)}
/* 示意曲线按 viewBox 等比缩放（宽度定高度），绝不 preserveAspectRatio="none" 拉伸——
   那正是曲线在宽屏上被拉扁的原因。封顶高度只在单列极宽（平板横放）时起作用。 */
.famcard2 .fplot{padding:2px 14px 0;flex:1;display:flex;align-items:flex-end}
/* ⚠ max-height 一旦顶到,svg 不是收窄盒子,而是按 meet 把画面缩小居中 —— 盒子两边留白,
   而底下那行刻度(.evax)是按盒子整宽排的,于是刻度和曲线对不上。
   卡片最宽出现在「看的」那一档封顶时:1600 − 2×72 = 1456,两列减去 20 的缝 → 718,
   图区 718 − 2×22(padding) = 674,自然高 674×170/600 = 191 —— 正好压线。
   2026-09-12 站主把首页从 1200 放宽之后就够得着了(改前卡片恒 590、自然高 159,永远碰不到)。
   抬到 210 留出余量:--page-grid 不变的话卡片再宽不过 718,这条就不会再被顶到。 */
.famcard2 .fplot svg{width:100%;height:auto;max-height:210px;display:block}
.fstats{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--line)}
/* 三格全部可点（各自带条件进筛选器），可点就必须**看得出**可点：
   手型 + 悬停变底。此前只有 .hot 那格有反馈，另外两格绑了点击却像死的。 */
/* 三个格子是真 <a>（Tab 可达、能中键在新标签打开），但要长得像格子不像链接：
   去掉下划线、颜色不继承链接蓝，内部三行改回块级堆叠。 */
.fstats .fs{display:block;color:inherit;text-decoration:none;
  padding:15px 22px 16px;border-right:1px solid var(--line);min-width:0;
  cursor:pointer;transition:background .12s}
.fstats .fs .l,.fstats .fs .n,.fstats .fs .sub{display:block}
.fstats .fs:focus-visible{outline:2px solid var(--link);outline-offset:-2px}
.fstats .fs:hover{background:var(--panel2)}
.fstats .fs:hover .sub{color:var(--link)}
.fstats .fs:last-child{border-right:0}
.fstats .fs .l{font-size:12px;color:var(--muted)}
.fstats .fs .n{font-size:30px;font-weight:800;color:#fff;line-height:1.15;margin-top:3px;font-variant-numeric:tabular-nums}
.fstats .fs .sub{font-size:11.5px;color:var(--faint);margin-top:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 可点的统计格（点进筛选器看具体标的） */
.fstats .fs.a .n{color:var(--up)} .fstats .fs.c .n{color:var(--link)}
/* 页脚一行：统计串 + 入口。卡片变窄（并排/手机）时统计串在自己的盒子里折行，
   入口链接始终停在右侧同一行，不掉到下一行去孤零零地占一整行。 */
.ffoot{display:flex;align-items:center;gap:8px 16px;padding:13px 22px;border-top:1px solid var(--line);font-size:12px;color:var(--muted)}
/* keep-all：只在空格/「·」处折行，不把「今日新成形」这种词从中间掰开 */
.ffoot .mono{flex:1 1 auto;min-width:0;line-height:1.55;word-break:keep-all}
.ffoot .go{margin-left:auto;flex:none;color:var(--link);font-weight:700;white-space:nowrap;text-decoration:none}
.ffoot .go:focus-visible{outline:2px solid var(--link);outline-offset:3px;border-radius:3px}
@media (max-width:560px){
  .famcard2 .fch{padding:15px 16px 4px}
  .famcard2 .fplot{padding:0 10px}
  .fstats .fs{padding:12px 14px 13px}
  .fstats .fs .n{font-size:25px}
  .fstats .fs .sub{white-space:normal;line-height:1.4;word-break:keep-all}
  .ffoot{padding:11px 16px}
}
/* 非候选轻量页提示 */
.quotenote{background:var(--panel2);border:1px solid var(--line2);border-radius:8px;padding:10px 14px;color:var(--muted);font-size:12.5px;margin:2px 0 14px;line-height:1.6}

/* 首页仪表盘 */
.dash{display:flex;flex-direction:column;gap:14px;margin:14px 0}
.dhead{display:flex;align-items:center;gap:8px;margin:2px 0}
.dhead h3{margin:0;font-size:13px;font-weight:700;color:var(--fg)}
.dhead .more{margin-left:auto;font-size:12px}
.tiles{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
@media (max-width:820px){.tiles{grid-template-columns:repeat(2,1fr)}}
.tile{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:12px 14px}
.tile .n{font-size:26px;font-weight:800;color:#fff;line-height:1.1}
.tile .l{color:var(--muted);font-size:12px;margin-top:3px}
.tile .n.up{color:var(--up)} .tile .n.down{color:var(--down)}
.breadth{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:12px 14px}
.bar{display:flex;height:26px;border-radius:4px;overflow:hidden;margin-bottom:9px}
.bar span{display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--ink);font-weight:700;min-width:0}
.blegend{display:flex;flex-wrap:wrap;gap:12px;font-size:12px;color:var(--muted)}
.blegend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px;vertical-align:middle}
.cols4{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
@media (max-width:900px){.cols4{grid-template-columns:repeat(2,1fr)}}
.mini{background:var(--panel);border:1px solid var(--line);border-radius:6px;overflow:hidden}
.mini h4{margin:0;padding:9px 12px;font-size:12px;font-weight:700;border-bottom:1px solid var(--line);
  display:flex;align-items:center;gap:6px}
.mini h4 .d{width:8px;height:8px;border-radius:50%}
.mini table{width:100%;border-collapse:collapse;font-size:12px}
.mini td{padding:5px 12px;border-bottom:1px solid var(--line);white-space:nowrap}
.mini tr:last-child td{border-bottom:0}
.mini tr:hover{background:var(--row-hover);cursor:pointer}
.mini .tk{color:var(--link);font-weight:700}
.mini .empty2{padding:16px 12px;color:var(--faint);font-size:12px;text-align:center}
/* 等宽栅格：每格同宽、跨行对齐，避免 flex 按内容宽排出的歪斜 */
.heat{display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:6px}
.hcell{border-radius:4px;padding:8px 11px;color:#fff;min-width:0;overflow:hidden}
.hcell .hi{font-weight:700;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hcell .hn{font-size:11px;opacity:.85;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.famboard{display:flex;gap:10px;flex-wrap:wrap}
.famcard{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:12px 16px;min-width:150px}
.famcard.active{border-color:var(--link)}
.famcard .ft{font-weight:700;color:#fff}
.famcard .fm{font-size:12px;color:var(--muted);margin-top:3px}
.famcard.soon{border-style:dashed;color:var(--faint)}

/* 一键筛选（预置屏，借鉴 MarketSmith） */
.presets{display:flex;align-items:center;flex-wrap:wrap;gap:7px;margin:14px 0 0}
.presets .plabel{color:var(--muted);font-size:12px;font-weight:700;margin-right:2px;white-space:nowrap;flex:none}
.preset{border:1px solid var(--line2);background:var(--panel2);color:var(--fg);
  padding:5px 12px;border-radius:14px;cursor:pointer;font-size:12px;font-weight:600;white-space:nowrap}
.preset:hover{border-color:var(--link);color:#fff}
.preset.on{background:var(--link);border-color:var(--link);color:var(--ink)}

/* ══ 筛选器：左侧常驻面板 + 右侧结果（站主 2026-08-17 选的形态）══════════
   桌面左右分栏；窄屏由 IS_NARROW 走抽屉，**同一段 HTML**，不做两套。 */
.scrlayout{display:grid;grid-template-columns:288px minmax(0,1fr);gap:20px;align-items:start;
  margin-top:14px}
@media (max-width:1080px){.scrlayout{grid-template-columns:250px minmax(0,1fr);gap:14px}}
/* 折叠：侧栏整列消失，表格吃掉全部宽度（站主：展开时列表太窄）。
   切换只 toggle 这个类，不重绘列表 —— 滚动位置和排序都保持原样。 */
.scrlayout.collapsed{grid-template-columns:minmax(0,1fr);gap:0}
.scrlayout.collapsed .scrside{display:none}
.fptoggle{width:100%;background:var(--panel2);border:1px solid var(--line2);color:var(--muted);
  border-radius:7px;padding:6px 10px;font-size:12px;font-weight:600;cursor:pointer;
  margin-bottom:10px;text-align:center}
.fptoggle:hover{color:var(--fg);border-color:var(--faint)}
/* 展开按钮：只在折叠态出现，贴在结果区左上 */
.fpopen{display:none}
.scrlayout.collapsed .fpopen{display:inline-flex;align-items:center;gap:7px;
  background:var(--panel2);border:1px solid var(--line2);color:var(--fg);
  border-radius:7px;padding:0 12px;font-size:12.5px;font-weight:600;cursor:pointer;
  /* 与旁边的切换条同高;行距由 .lthead 给,不用 margin-bottom —— 那会把按钮在行里顶上去 */
  height:36px;box-sizing:border-box}
.scrlayout.collapsed .lthead{margin-bottom:10px}
.scrlayout.collapsed .fpopen:hover{border-color:var(--link);color:var(--link)}
/* 折叠状态下条件数必须看得见 —— 藏起来的筛选最容易让人误判「这就是全部」 */
.fpopen i{font-style:normal;background:var(--link);color:var(--ink);border-radius:9px;
  min-width:17px;height:17px;padding:0 5px;font-size:10.5px;font-weight:800;
  display:inline-flex;align-items:center;justify-content:center}
.fpopen i[hidden]{display:none}
.fpopen .fpa{color:var(--muted)}   /* --faint 在 --panel2 上只有 3.47,读不清 */
/* 侧栏比屏幕高时照常能滚(滚轮/触控板/键盘都行),但**不显示滚动条**。
   站主 2026-08-17:「我确实不喜欢这个」—— 原先是特意做过样式的 8px 圆角条,
   在一个本来就很干净的面板里,那道竖杠是全页最扎眼的东西。
   代价说清楚:没有滚动条就少了「下面还有」的视觉提示。这里可接受 ——
   面板底部总有一个被切掉一半的分组标题在暗示还有内容,而且分组是可折叠的。 */
.scrside{position:sticky;top:14px;max-height:calc(100vh - 90px);overflow-y:auto;
  overscroll-behavior:contain;scrollbar-width:none;-ms-overflow-style:none}
.scrside::-webkit-scrollbar{width:0;height:0;display:none}
.scrmain{min-width:0}
/* 面板整体 */
.scrside .filters{margin:0;padding:0;background:transparent;border:0}
/* 侧栏里这些内容行统一缩进 12px,与 .fgbody 同一个数 —— 让「我的方案 / 保存 /
   搜索框 / 清空」和下面的筛选控件对齐在同一条竖线。
   ⚠ 这两条是 .scrside 前缀的**更具体规则**,改基础的 .fsearch/.filter-foot 不起作用:
   我第一次就改错了地方,量出来还是贴边 0px 才发现(2026-08-17)。 */
.scrside .fsearch{width:calc(100% - 24px);margin:0 12px 10px;box-sizing:border-box}
/* 分组：常用组默认展开，其余点开。收起时若组内有生效条件，标一个数字 —— 
   不然条件藏在收起的组里，人会以为自己没设过（这正是「用不明白」的一种）。 */
.fgroups{display:flex;flex-direction:column;gap:6px}
.fgrp{background:var(--panel);border:1px solid var(--line);border-radius:8px;overflow:hidden}
.fgh{width:100%;display:flex;align-items:center;gap:8px;background:transparent;border:0;
  color:var(--fg);font:600 12.5px/1 inherit;padding:10px 12px;cursor:pointer;text-align:left}
.fgh:hover{background:var(--panel2)}
.fgn{flex:1}
.fgb{font-style:normal;font-size:10.5px;font-weight:800;background:var(--link);color:var(--ink);
  border-radius:9px;min-width:17px;height:17px;padding:0 5px;display:inline-flex;
  align-items:center;justify-content:center}
.fgx{color:var(--faint);font-size:14px;line-height:1;width:12px;text-align:center}
.fgbody{display:none;padding:2px 12px 11px;flex-direction:column;gap:2px}
.fgrp.open .fgbody{display:flex}
.fgrp.open .fgh{border-bottom:1px solid var(--line)}
/* 面板里的字段改成竖排：左侧只有 288px，标签和控件并排会把控件挤成一条缝 */
.scrside .fld,.drawer .fld{display:block;padding:5px 0}
.scrside .fld label,.drawer .fld label{display:block;width:auto;text-align:left;
  margin-bottom:3px;font-size:11.5px}
/* 「这一项在问什么」的入口。原来是标签底下一条点线 —— 站主 2026-08-17
   逐项点名「没有解释」：说明其实一直都在（发布包的判据原文 + 手写 hint），
   只是没人看得出那里能点。换成一个看得见的 ⓘ，占位极小（页面上仍然
   不长出说明段落，保持极简），但一眼知道可点，手机上也点得到。 */
.fld .fq{display:inline-flex;align-items:center;justify-content:center;
  width:13px;height:13px;margin-left:5px;vertical-align:1px;
  border:1px solid var(--line2);border-radius:50%;
  color:var(--faint);font-size:9px;font-style:normal;font-weight:700;line-height:1;
  cursor:help;user-select:none}
.fld .fq:hover,.fld .fq:focus{border-color:var(--link);color:var(--link);outline:none}
.scrside .fld select,.scrside .fld .numrange,
.drawer .fld select,.drawer .fld .numrange{width:100%}
/* 已选条件与计数 */
.scrside .chips2{padding:9px 0 0}
.scrside .filter-foot{padding:9px 12px 0;border-top:1px solid var(--line);margin-top:9px}
.scrside .filter-foot .meta{margin-left:8px}

/* 我的方案：替代被砍掉的内置「一键筛选」 */
/* 面板内容行统一留 12px 左右内边距 —— 与 .fgbody 同一个数,让「我的方案 / 保存 /
   搜索框 / 清空」和下面的筛选控件对齐在同一条竖线上。
   (2026-08-17 站主:「保存这两个字直接粘在右边了」。实测当时它离面板右边 0px,
    而同一面板里的筛选控件都是 13px。) 
   .fgrp 那几条分组横杠仍然通栏 —— 它们是分隔行,内容在 .fgbody 里已经缩进过了。 */
.screenbar{margin-bottom:11px;padding:0 12px}
.sbhd{display:flex;align-items:center;gap:8px;margin-bottom:7px}
.sbt{font-size:11.5px;font-weight:700;color:var(--muted);flex:1}
.sbsave{background:var(--panel2);border:1px solid var(--line2);color:var(--fg);
  border-radius:6px;padding:4px 12px;font-size:12px;font-weight:600;cursor:pointer}
.sbsave:hover{border-color:var(--link);color:var(--link)}
.sblist{display:flex;flex-wrap:wrap;gap:6px}
.sbi{display:inline-flex;align-items:center;gap:5px;background:var(--panel);
  border:1px solid var(--line2);border-radius:14px;padding:3px 4px 3px 11px;
  font-size:12px;cursor:pointer;max-width:100%}
.sbi:hover{border-color:var(--link)}
.sbi.on{background:var(--link);border-color:var(--link)}
.sbi.on b,.sbi.on em{color:#fff}
.sbi b{font-weight:600;color:var(--fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sbi em{font-style:normal;font-size:10.5px;color:var(--accent2)}
.sbx{background:transparent;border:0;color:var(--faint);cursor:pointer;font-size:11px;
  padding:0 4px;line-height:1}
.sbi.on .sbx{color:#ffffffaa}
.sbx:hover{color:var(--fail)}
.sbempty{font-size:11.5px;color:var(--faint);line-height:1.5}
/* 当前条件下会筛出 0 条的选项：灰掉。它还在列表里（说明这个值存在），
   但点不了 —— 让人选一个必然空的条件只会白跑一趟。 */
.scrside select option:disabled,.drawer select option:disabled{color:var(--faint)}

/* 筛选栅格（Finviz 风） */
.filters{background:var(--panel);border:1px solid var(--line);border-radius:6px;margin:10px 0 10px}
.filter-tabs{display:flex;gap:0;border-bottom:1px solid var(--line);padding:0 6px}
.filter-tabs button{border:0;background:transparent;color:var(--muted);padding:8px 14px;
  cursor:pointer;font-size:12.5px;font-weight:600;border-bottom:2px solid transparent;margin-bottom:-1px;
  white-space:nowrap;flex:none}
.filter-tabs button.on{color:var(--link);border-bottom-color:var(--link)}
.filter-tabs .grow{flex:1}
.fsearch{align-self:center;background:var(--panel2);color:var(--fg);border:1px solid var(--line2);
  border-radius:4px;padding:4px 9px;font-size:12px;width:180px;margin:0 8px;outline:none}
.fsearch:focus{border-color:var(--link)}
.chips2{display:flex;flex-wrap:wrap;gap:6px;padding:0 14px 10px}
.chips2:empty{display:none}
.fchip{background:var(--panel2);border:1px solid var(--line2);border-radius:4px;
  padding:2px 8px;font-size:12px;color:var(--fg);cursor:pointer;white-space:nowrap}
.fchip:hover{border-color:var(--down);color:var(--down)}
.pager{display:flex;align-items:center;gap:4px;flex-wrap:wrap;padding:12px 2px 6px;font-size:12px}
.pager .prange{color:var(--muted)}
.pg{min-width:28px;height:28px;padding:0 8px;border:1px solid var(--line2);background:var(--panel);
  color:var(--fg);border-radius:4px;cursor:pointer;font-size:12px}
.pg:hover:not([disabled]):not(.on){border-color:var(--link)}
.pg.on{background:var(--link);border-color:var(--link);color:var(--ink);font-weight:700}
.pg[disabled]{opacity:.4;cursor:default}
.pgap{padding:0 3px;color:var(--faint)}
.filter-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:2px 14px;padding:12px 14px}
@media (max-width:900px){.filter-grid{grid-template-columns:repeat(2,1fr)}}
.fld{display:flex;align-items:center;gap:8px;padding:3px 0}
.fld label{color:var(--muted);font-size:12px;width:74px;text-align:right;flex:none;white-space:nowrap}
.fld select,.fld input{flex:1;background:var(--panel2);color:var(--fg);border:1px solid var(--line2);
  border-radius:4px;padding:4px 7px;font-size:12px;outline:none;min-width:0}
.fld select:focus,.fld input:focus{border-color:var(--link)}
/* 自填数值筛选：价格/涨跌幅=区间(min~max)，RS/流动性=单端(≥) */
.fld .numrange{flex:1;display:flex;align-items:center;gap:6px;min-width:0}
.fld .numin{flex:1;width:100%;background:var(--panel2);color:var(--fg);border:1px solid var(--line2);
  border-radius:4px;padding:4px 7px;font-size:12px;outline:none;min-width:0}
.fld .numin:focus{border-color:var(--link)}
.fld .numin.nummin{flex:none;width:88px}
.fld .ndash{color:var(--faint);flex:none}
/* 去掉数字输入的上下微调箭头，界面更干净 */
.fld .numin::-webkit-outer-spin-button,.fld .numin::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.fld .numin[type=number]{-moz-appearance:textfield;appearance:textfield}
/* 行业/题材:可搜索的多选清单(2026-09-02,换掉一百到三百多项的单选下拉)。
   列表自己滚,不让它把整个筛选栏撑长 —— 手风琴一次只开一组,一组要装得下。 */
.fld .multi{display:flex;flex-direction:column;gap:5px;min-width:0}
.fld .msearch{width:100%;background:var(--panel2);color:var(--fg);border:1px solid var(--line2);
  border-radius:4px;padding:4px 7px;font-size:12px;outline:none;min-width:0}
.fld .msearch:focus{border-color:var(--link)}
.fld .mlist{max-height:196px;overflow-y:auto;-webkit-overflow-scrolling:touch;
  border:1px solid var(--line2);border-radius:4px;background:var(--panel2)}
/* ⚠ 选择器要带 .scrside/.drawer:清单里的行**本身就是 <label>**,而上面那条
   `.scrside .fld label{display:block}` 特异性更高,不跟上就会把 flex 盖掉 ——
   数字会紧贴在名字后面(「汽车零部件28」),第一版预览就是这样。 */
.scrside .fld .mrow,.drawer .fld .mrow{display:flex;align-items:center;gap:6px;
  padding:4px 7px;font-size:12px;cursor:pointer;line-height:1.35;margin-bottom:0}
/* ⚠ 作者写的 display 会**压过** UA 样式表里的 `[hidden]{display:none}` ——
   搜索时 JS 把 r.hidden 置真、DOM 里也确实是 hidden,而屏幕上一行没少。
   (2026-09-02 预览实测:量 DOM 说过滤对了,眼睛看列表没动。) */
.scrside .fld .mrow[hidden],.drawer .fld .mrow[hidden]{display:none}
.fld .mrow:hover{background:var(--line)}
.fld .mrow .mchk{flex:none;margin:0;accent-color:var(--link)}
.fld .mrow .mnm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fld .mrow .mn{flex:none;color:var(--faint);font-weight:600;font-variant-numeric:tabular-nums}
/* 0 条的**禁用但不隐藏**:摊开的清单里藏行会让长度一直变、行在指头底下跳走 */
.fld .mrow.zero{opacity:.42}
.fld .mrow.zero:hover{background:transparent}
.fld .mnone{padding:8px 7px;font-size:12px;color:var(--faint)}
.filter-foot{display:flex;align-items:center;gap:12px;padding:8px 14px;border-top:1px solid var(--line);
  color:var(--muted);font-size:12px}
.filter-foot .reset{color:var(--link);cursor:pointer}
.filter-foot .cnt b{color:var(--fg)}
/* 数据导出（借鉴 DJYYLab「数据导出」，导出当前筛选为各平台代码串） */
/* 导出条。站主 2026-08-17：「这个位置，贴的太近了，分开一点」——
   原来上下只有 10px/0，夹在收起按钮和表格之间像被挤扁了；标签与第一个按钮
   之间也只有 8+2px，读起来是连着的一串。上下给足、标签后单独拉开一段。 */
.exportbar{display:flex;align-items:center;gap:10px;margin:16px 0 14px;font-size:12px;flex-wrap:wrap}
.exportbar .xlab{color:var(--muted);font-weight:700;margin-right:8px;white-space:nowrap;flex:none}
.exportbar button{display:inline-flex;align-items:center;gap:6px;
  border:1px solid var(--line2);background:var(--panel2);color:var(--fg);
  padding:0 13px;height:30px;box-sizing:border-box;border-radius:5px;cursor:pointer;font-size:12px;font-weight:600;
  white-space:nowrap;flex:none}   /* 显式同高:带 svg 的那颗原先 26、纯字的 29,并排不齐 */
.exportbar button svg{opacity:.65;flex:none}
.exportbar button:hover{border-color:var(--link);color:#fff}
.exportbar button:hover svg{opacity:1}
.exportbar .xhint{color:var(--down);font-size:11.5px;margin-left:4px}
.exportbar .xhint.bad{color:var(--up)}

/* 数据表（紧凑，Finviz 风） */
/* overflow-y **必须显式写 hidden**:CSS 规范规定一个轴非 visible 时,另一轴的 visible
   会被计算成 auto —— 于是底部横条占掉 15px,内容比剩下的可视区高 2px,右边就冒出一条
   竖滚动条(2026-08-17 站主截图指出「明明有翻页」)。那 2px 与数据多少无关,翻页也治不了。
   表格确实比容器宽,横向那条是要的;竖向不要。 */
.tablewrap{background:var(--panel);border:1px solid var(--line);border-radius:6px;
  overflow-x:auto;overflow-y:hidden}
table.scr{width:100%;border-collapse:collapse;font-size:12.5px}
table.scr thead th{position:sticky;top:0;background:var(--head);color:var(--muted);
  font-weight:600;text-align:left;padding:8px 10px;border-bottom:1px solid var(--line2);
  white-space:nowrap;cursor:pointer;user-select:none}
table.scr thead th:hover{color:var(--fg)}
table.scr thead th.num,table.scr td.num{text-align:right}
table.scr thead th .ar{color:var(--link);font-size:10px;margin-left:3px}
table.scr tbody td{padding:6px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
table.scr tbody tr:nth-child(even){background:var(--row-alt)}
table.scr tbody tr:hover{background:var(--row-hover);cursor:pointer}
table.scr .tk{color:var(--link);font-weight:700}
/* 代码列在横向滚动时固定，移动端不丢股票对应关系 */
table.scr th.stickycol,table.scr td.stickycol{position:sticky;left:0;z-index:3}
table.scr thead th.stickycol{background:var(--head)}
table.scr tbody td.stickycol{background:var(--row)}
table.scr tbody tr:nth-child(even) td.stickycol{background:var(--row-alt)}
table.scr tbody tr:hover td.stickycol{background:var(--row-hover)}
table.scr .nm{color:var(--fg)}
table.scr td.industry,table.scr td.theme{color:var(--muted)}
.chg.up{color:var(--up)} .chg.down{color:var(--down)}
.stagepill{display:inline-block;padding:1px 7px;border-radius:3px;font-size:11px;font-weight:600}
.rs{font-weight:700}
/* 列表内 CANSLIM 七格记分条（借鉴 DJYYLab）：通过=实心亮，未过=实心暗，证据不足=虚线空心
   ⚠ 三态必须在 13×15px 上一眼可分，且不能只靠颜色。
   V16 之前 canslim 从来没出过 UNKNOWN（实测 -001 是 0 次），所以「未过」与「证据不足」
   长期都是暗灰小方块、只差一圈几乎看不见的 1px 描边，没人发现。V16 修好空值语义后
   UNKNOWN 一次性来了 250 格（光 C 项就 167 只 = 全表 27%），再不分开，
   DJYYLab 在数据侧把「不合格」改成「数据不足」的成果会在显示层原样丢回去。
   分开的手段是**换字形**（该格显示 ? 而非字母，见 app.js canslimStrip），不是换配色：
   13×15px 上虚线描边／加深底色／改透明度实测全部与「未过」糊成一片，
   只有字形改变能在一眼之内读出来。这里的虚线只是辅助。 */
td.cansl{padding-top:4px;padding-bottom:4px}
.csstrip{display:inline-flex;gap:2px}
.csstrip i{width:13px;height:15px;border-radius:2px;font-style:normal;font-size:9px;font-weight:800;
  line-height:1;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box}
.csstrip i.p{background:var(--pass);color:var(--ink)}
.csstrip i.f{background:var(--bg);color:var(--faint)}
.csstrip i.u{background:transparent;color:var(--faint);opacity:.62;
  border:1px dashed var(--line2)}
/* 突破观察价旁：未触发=还需上涨%；已触发=现价相对观察价（站上/回踩） */
.distrig{color:var(--faint);font-size:10.5px;margin-left:6px;font-weight:400;white-space:nowrap}
.distrig.up{color:var(--up)} .distrig.down{color:var(--down)}

/* 详情页（沿用变量，换皮即可） */
/* ── 详情页头部（三行：主行 / 状态行 / 标签行）── */
.dtop{margin:14px 0 12px}
.dh1{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.dh1 .code{border:1px solid var(--line2);border-radius:8px;padding:0 12px;height:34px;box-sizing:border-box;
  display:inline-flex;align-items:center;
  color:var(--muted);font-size:13px;font-weight:600;flex:none}   /* 与左边 34px 的星标同高 */
.dh1 .nm{font-size:32px;font-weight:800;color:#fff;letter-spacing:.5px;line-height:1.1}
.dh1 .px{font-size:32px;font-weight:800;line-height:1.1;font-variant-numeric:tabular-nums}
.dh1 .chgv{font-size:15px;font-weight:700;font-variant-numeric:tabular-nums}
.dh1 .px.up,.dh1 .chgv.up{color:var(--up)} .dh1 .px.down,.dh1 .chgv.down{color:var(--down)}
.dh1 .vsep{width:1px;height:26px;background:var(--line2);flex:none}
.dh1 .quote{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:13px;color:var(--muted)}
.dh1 .quote i{font-style:normal;color:var(--faint)}
.dh1 .quote b{color:var(--fg);font-weight:600;margin-right:7px}
.dh1 .quote b.up{color:var(--up)} .dh1 .quote b.down{color:var(--down)}
.dh2{display:flex;align-items:center;gap:8px;margin-top:9px;font-size:12.5px;color:var(--muted);flex-wrap:wrap}
.dh2 .dot2{width:7px;height:7px;border-radius:50%;flex:none}
.dh2 .sep{color:var(--faint)}
/* 详情页事件行：前瞻风险(⚠解禁/财报) + 公告类别按钮。没有就整行不渲染 */
.riskline{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:8px;
  font-size:12.5px;font-weight:600;color:var(--accent2)}
.dh3{display:flex;align-items:center;gap:7px;margin-top:10px;flex-wrap:wrap}
.dh3 .tag{border:1px solid var(--line2);border-radius:5px;padding:3px 10px;font-size:12px;color:var(--muted);white-space:nowrap}
.dh3 .tag.ind{color:var(--accent2);border-color:rgba(251,191,36,.35)}
.dh3 .tag.more{color:var(--faint);cursor:pointer;background:transparent;font-family:inherit;font-size:12px;line-height:inherit}
.dh3 .tag.more[aria-expanded="true"]{color:var(--fg)}
/* 非候选轻量页仍用旧头部 */
.detail-head{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin:16px 0 12px}
.detail-head .nm{font-size:26px;font-weight:800;color:#fff}
.detail-head .cd{color:var(--muted)}
.detail-head .px{font-size:24px;font-weight:800;margin-left:auto}
.badge{display:inline-block;padding:2px 9px;border-radius:4px;font-size:11px;font-weight:700}
.pill{font-size:11px;color:var(--muted);border:1px solid var(--line2);border-radius:4px;padding:1px 7px}
.chart-wrap{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:10px 6px 6px;position:relative}
/* 十字光标 OHLC 读数（Finviz 式，浮于图左上） */
.ohlc{position:absolute;left:14px;top:36px;z-index:3;pointer-events:none;font-size:12px;color:var(--muted);
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-variant-numeric:tabular-nums;
  background:linear-gradient(90deg,var(--panel) 70%,transparent);padding:2px 8px 2px 0;border-radius:3px;white-space:nowrap;max-width:calc(100% - 20px);overflow:hidden}
.ohlc .d{color:var(--fg);font-weight:600;margin-right:8px}
.ohlc i{font-style:normal;color:var(--faint);margin:0 3px 0 8px}
.ohlc b{color:var(--fg);font-weight:600}
.ohlc .up{color:var(--up)} .ohlc .down{color:var(--down)}
/* 相关个股（Finviz peers） */
.peers{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:12px;font-size:12px}
.peers .pk{color:var(--muted);font-weight:700;margin-right:2px}
.peers a{display:inline-flex;align-items:center;gap:6px;background:var(--panel);border:1px solid var(--line2);
  border-radius:4px;padding:2px 9px;color:var(--link);font-weight:600;text-decoration:none;white-space:nowrap}
.peers a:hover{border-color:var(--link)}
.peers a .pc{font-size:11px;font-weight:600}
.peers a .pc.up{color:var(--up)} .peers a .pc.down{color:var(--down)}
.tf{display:flex;gap:3px;margin:0 8px 6px}
.tf button{border:1px solid var(--line2);background:transparent;color:var(--muted);
  padding:3px 12px;border-radius:4px;cursor:pointer;font-size:12px;font-weight:600;white-space:nowrap;flex:none}
.tf button.on{background:var(--panel3);color:#fff;border-color:var(--link)}
.tf .tfsep{width:10px;flex:none}
/* 锚定 AVWAP */
.tf .avb{border-color:var(--line2);color:var(--muted)}
.tf .avb:hover{color:var(--fg);border-color:var(--link)}
.tf .avb.armed{color:#26c6da;border-color:#26c6da;background:rgba(38,198,218,.12)}
#chart.picking{cursor:crosshair}
.chartbox{position:relative}
/* 高度由 JS 按视口给（窄屏 46vh，钳在 260–380px）；这里只兜底，
   写死 560px 在 390px 宽的手机上会变成又高又窄、K 线挤成一团 */
#chart{height:560px;width:100%}
@media (max-width:640px){#chart{height:auto;min-height:260px}}
/* 概率锥的渐变色带层：盖在图上、不吃鼠标事件 */
.conelay{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:2}
/* 滚轮提示：仅在用户想滚页面时短暂浮现，不常驻 */
.zoomhint{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:5;
  pointer-events:none;opacity:0;transition:opacity .18s;
  background:rgba(11,11,18,.86);border:1px solid var(--line2);border-radius:20px;
  padding:7px 16px;font-size:12.5px;color:var(--fg);white-space:nowrap}
.zoomhint.show{opacity:1}
/* 图例里有两种东西:**能点的**(均线、新値)与**只是说明**(K线/量、AVWAP、ADR%)。
   原先两者长得一模一样 —— 都是「一条色块 + 一个词」,于是没人知道哪些能点
   (站主 2026-08-18:「用户也不知道是不是能点击,很不明显」)。
   现在能点的做成**药丸按钮**(有边框、有底、hover 会亮、按下有 aria-pressed),
   不能点的保持纯文字。差别不靠说明文字,靠外形本身。
   所有子项统一 26px 显式高度,别靠 padding 凑 —— 混排时上下边才齐。 */
.legend{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;
  padding:8px 12px 4px;font-size:12px;color:var(--muted)}
.legend>span{display:inline-flex;align-items:center;height:26px;box-sizing:border-box}
.legend .sw{display:inline-block;width:16px;height:3px;border-radius:2px;margin-right:5px;
  vertical-align:middle;flex:none}
/* 图例上可点选的均线：默认只开 MA150，点一下开/关 */
/* 药丸按钮。--mac 是这条均线自己的颜色,由内联样式带进来 ——
   开着的时候用它染边框和底,一眼看出「亮着的这个就是图上那条线」。 */
.legend .ma-tog{cursor:pointer;user-select:none;color:var(--faint);
  padding:0 9px;border-radius:13px;border:1px solid var(--line2);background:transparent;
  transition:background .12s,border-color .12s,color .12s}
.legend .ma-tog:hover{color:var(--fg);background:var(--panel2);border-color:var(--muted)}
.legend .ma-tog.on{color:var(--fg);border-color:var(--mac,var(--muted));
  background:color-mix(in srgb,var(--mac,transparent) 14%,transparent)}
/* 键盘焦点必须看得见 —— 这是按钮,不是装饰 */
.legend .ma-tog:focus-visible{outline:2px solid var(--link);outline-offset:2px}
@media (prefers-reduced-motion:reduce){.legend .ma-tog{transition:none}}
/* 触屏热区。药丸看着 26px 高就够了(再高会把图例撑成一大块),但**手指够不着 26px** ——
   用伪元素把可点范围上下各撑 8px 到 42px,视觉一点不变。
   与收藏星标同一个做法(.favb::after)。position:relative 是伪元素定位的前提。 */
.legend .ma-tog{position:relative}
.legend .ma-tog::after{content:'';position:absolute;inset:-8px -2px}
/* 详情页标签（形态识别 ↔ 概率风扇）+ 面板按视图切换 */
.dtabs{display:flex;gap:2px;margin:12px 0 0;border-bottom:1px solid var(--line)}
.dtabs button{border:0;background:transparent;color:var(--muted);padding:8px 15px;cursor:pointer;
  font-size:13.5px;font-weight:600;border-bottom:2px solid transparent;margin-bottom:-1px;display:flex;gap:7px;align-items:center;
  white-space:nowrap;flex:none}
.dtabs button .dot{width:7px;height:7px;border-radius:50%}
.dtabs button.on{color:#fff;border-bottom-color:var(--link)}
/* 视图切换：范围覆盖指标表 / 成长与质量 / 各面板，切到风扇时形态侧整体让位 */
#dbody[data-view="fan"] .only-pattern{display:none}
#dbody[data-view="pattern"] .only-fan{display:none}
#dbody[data-view="fund"] .only-pattern{display:none}
#dbody[data-view="pattern"] .only-fund{display:none}
#dbody[data-view="fan"] .only-fund{display:none}
#dbody[data-view="fund"] .only-fan{display:none}
/* 详情页第二版(?dv2=1):多一档「技术面」。第一版没有 .only-tech 元素,这些规则空转 */
#dbody[data-view="pattern"] .only-tech,
#dbody[data-view="fan"] .only-tech,
#dbody[data-view="fund"] .only-tech{display:none}
#dbody[data-view="tech"] .only-pattern,
#dbody[data-view="tech"] .only-fan,
#dbody[data-view="tech"] .only-fund{display:none}
/* ⚠ 下面这七条是 2026-08-31 下午被我误删又找回来的。
   起因:重写指标矩阵样式时用「两个锚点之间整段替换」,而区间里**顺带装着**
   全站共用的 .frow 与折叠三角 —— 删了没有任何报错,只是详情页的键值从并排
   变成上下堆(每行 38px)、折叠标题的 ▸ 消失。站主截图里那个光秃秃的「▶ 形态历史」
   和形态块里堆成两行的「周期 / 12周…」就是这么来的。
   教训:按锚点整段替换之前,先看清区间里还有谁。 */
details.fold>summary{cursor:pointer;list-style:none}
details.fold>summary::-webkit-details-marker{display:none}
details.fold>summary h4{display:inline-flex;align-items:center;gap:7px;margin:0}
details.fold>summary h4::before{content:'▸';color:var(--faint);font-size:11px;transition:transform .15s}
details.fold[open]>summary h4::before{transform:rotate(90deg)}
details.fold[open]>summary{margin-bottom:8px}
.frow{display:flex;gap:10px;padding:3px 0;font-size:13px}
.frow .fk{color:var(--faint);min-width:96px;flex:none}
.frow .fv{overflow-wrap:anywhere}

/* ── 指标矩阵(第二版,2026-08-31 下午重做)──────────────────────────────────
   站主:「这个位置能不能不要这么浪费,太大太宽了,就这么一点数字」
        「冲击成本这里,框都没画完整」

   前一版用等宽网格,两个毛病一起来:
     · 每格被拉到 190px 去装「2.94」四个字符 —— 空得离谱
     · 最后一行填不满时,容器画了外框、格子却没有 → 框画一半(他截图里那处)
   改成**按内容宽度排的紧凑行**:每对键值多宽算多宽,自然换行,没有空格子,
   也就不可能出现画不完整的框。组名从「占一整行的标题」改成**左侧窄栏**,
   五个组各省一行。

   ⚠ 选择器写成 `.statgrid.statgrid2`(0,2,0):比 `.statgrid`(0,1,0) 权重高,
   不再依赖谁写在后面 —— 上一版就是插在 .statgrid 之前被整段盖掉的。 */
.statsec{display:flex;align-items:flex-start;gap:10px;margin-bottom:6px}
.statsec-h{flex:0 0 66px;font-size:11px;font-weight:600;color:var(--faint);
  line-height:1.5;padding-top:5px;text-align:right}
.statgrid.statgrid2{display:flex;flex-wrap:wrap;align-items:baseline;
  gap:0;margin:0;padding:2px 4px;
  border:1px solid var(--line);border-radius:6px;background:var(--panel);min-width:0;
  /* 框跟着内容走,不撑满 —— 「规模与其他」只有市值/交易所两项,
     拉满整行等于三分之二是空框(站主 2026-08-31:「就这么一点数字」)。 */
  flex:0 1 auto;width:fit-content;max-width:100%}
/* 一对键值 = 一个不可拆的小块。**对内 5px、对间 22px** —— 上一版键值等距,
   「距52周高 −8.55% 距52周低 +83.63%」才会读串行。靠间距分组,不靠分隔线:
   分隔线在换行处会掉到行首,更难看。 */
.statgrid.statgrid2 .stat{display:inline-flex;align-items:baseline;gap:5px;
  padding:3px 11px;border:0;font-size:12px;white-space:nowrap;min-width:0}
.statgrid.statgrid2 .stat .k{font-size:11px;color:var(--faint);flex:none}
.statgrid.statgrid2 .stat .v{font-size:12.5px;font-weight:600;text-align:left;
  color:var(--fg);font-variant-numeric:tabular-nums}
.statgrid.statgrid2 .stat.wide{white-space:normal}
@media (max-width:640px){
  /* 窄屏:组名回到上方一行(66px 的左栏在 375px 里太占) */
  .statsec{display:block;margin-bottom:10px}
  .statsec-h{text-align:left;padding:0 0 3px 2px}
  .statgrid.statgrid2 .stat{padding:3px 8px}
}

/* ── 指标矩阵第二版:一组一张的并列卡(2026-08-31 晚)──────────────────
   走到这版之前试过两种,都被站主否掉,记下来别再回去:
     ① 等宽网格:把「2.94」四个字撑进 190px 的格子;最后一行填不满时容器
        画了外框、格子却没有 →「框都没画完整」
     ② 按内容宽度排的紧凑横行:省地方了,但一行铺六七对,「距52周高 −8.55%
        距52周低 +83.63%」肩并肩 →「分不清哪个值属于哪个键」
   现在:一组一张卡横向并列,**卡内一行一项**(键左值右);标题在卡外,
   与股性画像/筛选证据同一条规矩,卡的上边缘才对得齐。 */
.statcards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:var(--dgap);margin:14px 0 4px;align-items:stretch}
.statcol{display:flex;flex-direction:column;min-width:0}
.statcol>.panel{flex:1;margin:0;padding:8px 12px 10px}
.statlist .stat{display:flex;justify-content:space-between;align-items:baseline;
  gap:10px;padding:3px 0;border:0;font-size:12px;min-width:0}
.statlist .stat .k{color:var(--faint);font-size:11.5px;white-space:nowrap;flex:none}
.statlist .stat .v{color:var(--fg);font-weight:600;font-size:12.5px;text-align:right;
  font-variant-numeric:tabular-nums;min-width:0;overflow-wrap:anywhere}
.statlist .stat.wide{display:block}
.statlist .stat.wide .v{text-align:left;margin-top:1px}
@media (max-width:1100px){.statcards{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:560px){.statcards{grid-template-columns:minmax(0,1fr)}}

.statgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(188px,1fr));gap:0;
  border:1px solid var(--line);border-top:0;border-left:0;border-radius:6px;overflow:hidden;background:var(--panel);margin-top:14px}
/* 手机:188px 的下限在 346px 内容宽里只放得下**一列**,29 格排成 29 行 885px,
   整页要滚 5.6 屏(2026-08-18 站主审计详情页实测)。两列各 173px,
   减去 .stat 自己的 22px 内边距还剩 151px —— 最长的一组「RS 相对强度 + 25」
   量下来 96px,装得下。行业/题材那两格已经撤掉,不再有超长值需要这个宽度。 */
@media (max-width:560px){
  .statgrid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .stat{padding:6px 9px;gap:6px}
}
.stat{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:6px 11px;
  border-top:1px solid var(--line);border-left:1px solid var(--line);font-size:12px;min-width:0}
.stat .k{color:var(--muted);white-space:nowrap;flex:none}
/* 酒田新值那一格文案长(本数·分位·本票最长),它是最后一格,占两列 —— 桌面 6 列布局的最后一行
   本就空着两格;手机 2 列时正好独占一行(2026-08-18) */
.stat.wide{grid-column:span 2}
.stat .v{color:var(--fg);font-weight:600;text-align:right;font-variant-numeric:tabular-nums;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.stat .v .meta{font-family:-apple-system,"PingFang SC",sans-serif;font-weight:400}
/* 成长与质量小标题 + 成长柱图（Finviz 风，动量口径） */
.refhead{margin:16px 0 6px;font-size:12px;font-weight:700;color:var(--muted);letter-spacing:.3px}
/* 并排的卡片,标题一律在卡**外**(站主 2026-08-31:「把筛选证据这四个字放到
   卡片上面,就能对齐了吧」——对)。标题在卡内的那张,上边缘会低一个标题的高度。 */
.cardwrap{display:flex;flex-direction:column;min-width:0}
.cardwrap>.panel{flex:1;margin:0}
.statcol>.refhead,.cardwrap>.refhead{margin-top:0}
.fcharts{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:10px;margin-top:12px}
.fchart{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:10px 12px 4px}
.fchart .ft{font-size:12px;color:var(--fg);font-weight:600;margin-bottom:4px}
.fchart svg{width:100%;height:auto;display:block}
.grid2{display:grid;grid-template-columns:1.25fr 1fr;gap:14px;margin-top:14px}
@media (max-width:820px){.grid2{grid-template-columns:1fr}}
/* 详情底部：扁平网格，成对面板按行等高对齐（修此前左右列各自独立堆叠导致的错位） */
/* align-items:start(原先是 stretch)—— 折叠着的面板会被拉到与同行最高者等高,
   「形态历史 29 个 · 十年」一行字撑出 160px 的空框(站主 2026-08-31 截图里那处)。
   面板多高由它自己的内容决定,不由邻居决定。 */
:root{--dcols:1.25fr 1fr;--dgap:14px}   /* 详情页的列定义:筹码行与 .dgrid 共用 */
/* 并排卡片**等高**(站主 2026-08-31:「我要的是整齐」)。配套规矩:并排的槽位
   不放折叠面板 —— 折起来一行、旁边满的,stretch 撑空框、start 变参差,两头堵。
   形态历史/筛选证据都已改成默认展开;卡片**内部**的折叠不受此限。 */
.dgrid{display:grid;grid-template-columns:var(--dcols);gap:var(--dgap);margin-top:14px;align-items:stretch}
/* ⚠ :not([hidden]) 不能省:作者样式压过浏览器给 [hidden] 的 display:none,
   少了它,本该藏着的面板(突破回顾、风扇那几块)会变成一排空框。 */
.dgrid>.panel:not([hidden]),.dgrid>.cardwrap>.panel{display:flex;flex-direction:column}
.dgrid .span-all{grid-column:1 / -1}
/* 技术面那一行:股性画像与形态历史(没形态的票)并排,框外标题 + 框;让两个框一样高,底边也对齐(2026-09-08) */
#charbox,#histpanel.only-tech{display:flex;flex-direction:column}
#charbox>.charpanel,#histpanel.only-tech>.panel{flex:1}   /* 股性画像的框叫 .charpanel 不是 .panel(第一版写成 .panel,左框没撑开,底边差 25px) */
/* 窄屏单列:改**变量**而不是改 .dgrid —— 筹码行读同一个变量,一起单列 */
@media (max-width:980px){:root{--dcols:minmax(0,1fr)}}
/* 详情头部右侧：翻页 + 外链（按钮式，与截图一致） */
.dnav{display:flex;align-items:center;gap:10px;flex:none;font-size:12.5px}
.dnav a,.dnav .pos,.dlinks a{white-space:nowrap}
.dnav a{color:var(--fg);font-weight:600;border:1px solid var(--line2);border-radius:6px;padding:5px 11px}
.dnav a:hover{border-color:var(--link);color:var(--link)}
.dnav a.off{color:var(--faint);border-color:var(--line);pointer-events:none}
.dnav .pos{color:var(--muted);font-variant-numeric:tabular-nums;margin-right:2px}
.dlinks{display:flex;gap:10px;font-size:12.5px}
.dlinks a{color:var(--muted);font-weight:600;border:1px solid var(--line2);border-radius:6px;padding:5px 11px}
.dlinks a:hover{color:var(--link);border-color:var(--link)}
.panel{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:14px 16px}
/* 检测器换版时的分位免责：不报分位，说明为什么 */
.mktpage .warnpct{color:var(--accent2);font-size:12px;font-weight:600}
/* 公告类别按钮：进头部 .riskline，一类一枚，点开公告原文。琥珀=注意 */
.annchip{flex:none;font-size:11px;font-weight:700;color:var(--accent2);
  border:1px solid rgba(251,191,36,.35);border-radius:4px;padding:1px 7px;
  white-space:nowrap;text-decoration:none;cursor:pointer;transition:background .12s}
a.annchip:hover{background:rgba(251,191,36,.12)}
.panel h4{margin:0 0 10px;font-size:12px;color:var(--muted);font-weight:700;
  text-transform:uppercase;letter-spacing:.5px}
/* 风扇区间校准（名义 vs 样本外实测覆盖率） */
.calib{display:flex;align-items:center;gap:9px;flex-wrap:wrap;font-size:13px;color:var(--muted);margin-bottom:8px}
.calib b{color:var(--fg);font-weight:700}
.calib .cb{width:16px;height:16px;border-radius:4px;flex:none;display:inline-flex;align-items:center;
  justify-content:center;font-size:10px;font-weight:800;color:var(--ink)}
.calib .cb.ok{background:var(--pass)} .calib .cb.no{background:var(--accent2)}
/* 已触发后「现价 vs 观察价」的实际关系（避免与「距突破价」口径混淆） */
.trigline{margin-top:10px;padding-top:9px;border-top:1px solid var(--line);font-size:12.5px;color:var(--muted)}
.trigline b{font-weight:700}
.trigline.up b{color:var(--up)} .trigline.down b{color:var(--down)}
/* 搜索空态里的全市场出口 */
.mkthit{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:center;margin-top:14px}
.mkthit .mk{color:var(--faint);font-size:10.5px;font-weight:700;margin-right:7px}
.mkthit a{background:var(--panel2);border:1px solid var(--line2);border-radius:5px;padding:4px 11px;
  font-size:12.5px;font-weight:600;white-space:nowrap}
.mkthit a:hover{border-color:var(--link)}
.trigger-box{display:flex;gap:20px;flex-wrap:wrap}
.trigger-box .t{font-size:12px;color:var(--muted)}
.trigger-box .t b{display:block;font-size:18px;color:var(--fg);margin-top:2px}
.trigger-box .t.tp b{color:var(--accent2)}
/* 筛选证据(2026-08-31 重排,站主:「完全不整齐」)。
   原先 auto-fill+minmax(150px):每格硬撑 150px,而标签从 3 字到 6 字不等,
   右边参差一片空;通过与未过还是交错的,扫不出「这只票过了几条」。
   改成按内容宽度排的 chip + 通过在前(排序在 screensHTML 里)。 */
.scrsum{font-size:11.5px;margin:-2px 0 7px 1px}
.scrsum .pass{color:var(--pass)} .scrsum .fail{color:var(--fail)}
.screens{display:flex;flex-wrap:wrap;gap:4px 6px}
.screen{display:inline-flex;align-items:center;gap:6px;font-size:12px;
  padding:3px 9px 3px 6px;border-radius:5px;background:var(--panel);white-space:nowrap}
/* 状态标记带字形（✓/✗/?），不只靠红绿——绿色盲下也可分辨 */
.st{width:15px;height:15px;border-radius:3px;flex:none;display:inline-flex;background:var(--unknown);
  align-items:center;justify-content:center;font-size:10px;font-weight:800;color:var(--ink)}
.st.PASS{background:var(--pass)} .st.FAIL{background:var(--fail)} .st.UNKNOWN{background:var(--unknown)}

/* 逐条口径提示：阈值来自发布包 evidence。自绘而非原生 title —— 原生提示
   在触屏上无 hover 完全不可达，且不能排版数值行。 */
[data-pop]{cursor:help}
[data-pop]:focus-visible{outline:1px solid var(--link);outline-offset:2px}
/* width:max-content —— fixed 定位的收缩包裹会把 .pe 的 1fr 列压到最小宽度，
   提示框会莫名其妙变窄并疯狂折行；显式取内容宽再由 max-width 收口。 */
/* max-width 取 290px 与视口的较小值：写死 290 时，在比它更窄的视口（分屏、小屏、
   浏览器面板）上提示框会整体溢出右边 —— 定位代码里的 Math.max(8,…) 兜不住。 */
#pop{position:fixed;z-index:80;width:max-content;max-width:min(290px,calc(100vw - 16px));display:none;
  background:var(--panel2);border:1px solid var(--line2);border-radius:8px;
  padding:9px 11px;box-shadow:0 10px 28px rgba(0,0,0,.5);font-size:12px;line-height:1.5}
#pop.show{display:block}
#pop .pt{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--fg)}
#pop .pl{color:var(--muted);margin-top:5px}
/* min-width:0 必不可少：栅格项默认 min-width:auto，内容再长也不肯收缩，
   于是长值会顶破 max-width 把整框撑开。 */
#pop .pe{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px 14px;margin-top:7px;
  padding-top:7px;border-top:1px solid var(--line)}
/* align-self:start —— 值折成两行时，左边的标签要停在第一行，
   默认拉伸会让人读不出标签和哪一行是一对的。 */
#pop .pe .k{color:var(--muted);white-space:nowrap;min-width:0;align-self:start}
#pop .pe .v{text-align:right;color:var(--fg);white-space:nowrap;min-width:0;overflow-wrap:anywhere}
/* 长中文值（行业/题材/整句）必须能折行；沿用数值行的 nowrap 会把框撑爆。
   word-break 用 normal 而不是 break-word：中文本来就能逐字断行，
   break-word 反而会在不该断的地方硬切（实测把「跑赢大盘的成分占比」切成两截）。
   真正断不开的长串（英文/URL）由 overflow-wrap 兜底。 */
#pop .pe .v.wrap{white-space:normal;text-align:left;word-break:normal;
  overflow-wrap:break-word;line-height:1.6}
.lifecycle{list-style:none;margin:0;padding:0}
.lifecycle li{display:flex;gap:10px;padding:5px 0 5px 12px;border-left:2px solid var(--line2);
  margin-left:4px;font-size:13px}
.lifecycle .dt{color:var(--muted);font-size:12px}
/* 突破回顾(档案个案):一段=一次突破,复用 .anch 表 */
.bkcase{margin-bottom:12px}
.bkcase:last-child{margin-bottom:0}
.bkhead{display:flex;flex-wrap:wrap;gap:10px;align-items:baseline;
        font-size:13px;margin-bottom:6px}
table.anch{width:100%;border-collapse:collapse;font-size:12.5px}
table.anch td{padding:5px 4px;border-bottom:1px solid var(--line)}
table.anch td.k{color:var(--muted)} table.anch td.p{text-align:right}
/* 形态历史(2026-08-30):十年里这只票走过的每一个形态。点一行 = 把那个已封存的
   形状换到 K 线上。选中行给一条左边线 + 一层极淡的底,不用另加文字说明。 */
table.hist{margin-top:2px}
table.hist tr.hrow{cursor:pointer}
table.hist tr.hrow:hover td{background:var(--hover,rgba(255,255,255,.035))}
table.hist tr.hrow.on td{background:rgba(240,81,138,.10)}
table.hist tr.hrow.on td:first-child{box-shadow:inset 2px 0 0 #f0518a}
table.hist td{white-space:nowrap}
table.hist td.meta{color:var(--muted)}
.hmore{margin-top:8px;cursor:pointer}
/* 窄屏:突破日那一列收起来。它被挤出屏幕外(375px 装不下四列 nowrap),
   而「结局」那一栏本来就说了突破没突破,确切日期点进去图上就看得到 ——
   全站纪律:宽内容要么自己滚,要么砍列,页面主体绝不横向滚动。 */
@media (max-width:640px){
  /* 按**列序号**藏,不能用 :last-child ——「当下」那行只有两格,
     它的说明文字正好是最后一格,会被一起藏掉 */
  table.hist td:nth-child(4){display:none}
  table.hist td{padding:6px 3px;font-size:12px}
}
/* 筛选证据里那几条量能:把实测比值摆在标签后面(打标不当门) */
.screen em.sv{font-style:normal;color:var(--muted);margin-left:4px;font-size:11.5px}
/* 高紧旗徽章:全市场一天只出一两只,给它一个显眼但不喧宾夺主的小牌 */
.htfbadge{margin-left:6px;padding:1px 6px;border-radius:4px;font-size:11.5px;font-weight:700;
  color:#0e1116;background:linear-gradient(90deg,#f0b429,#f08c29)}
.hmore{cursor:pointer;padding:5px 2px 1px;font-size:11.5px;user-select:none}
.hmore:hover{color:var(--fg)}
/* 形态历史 2026-08-31 起不是折叠面板了(折起来只剩一行标题,人以为就这点东西) */
#histpanel h4{margin-bottom:6px}
.fan-card{border-style:dashed;text-align:center;color:var(--muted)}
.fan-card a{font-weight:600}
.empty{color:var(--muted);text-align:center;padding:60px 0}
.disclaimer{color:var(--faint);font-size:11px;margin:22px 0 40px;line-height:1.6}
.chips{display:flex;gap:6px;flex-wrap:wrap}
/* ── 窄屏（手机）：短标签一律不断字，容纳不下就整体横向滚动，绝不字符级换行 ── */
/* ══ 窄屏（≤640px）：筛选器换形态 ══════════════════════════════════════
   表格 → 卡片列表，筛选条件 → 抽屉。信息一项不少，只是换一种排布。 */
/* ⚠ **必须能换行**。这一行上有 5 个控件(筛选 / 结果·Top33 / 排序 / 升降 / 匹配数),
   375px 的手机装不下 —— 不换行就整页可横滚,正是站主 2026-08-17 报的
   「最上面一行完全溢出」。加 Top33 那个 tab 之后实测 499px > 375px。
   `.grow` 保留:宽一点的手机上匹配数仍然靠右,窄屏才折到第二行。 */
.mbar{display:flex;align-items:center;gap:8px;margin:10px 0 9px;flex-wrap:wrap}
/* 这一行里的四个控件(筛选 / 筛选结果·Top33 / 排序 / 方向)原先各长各的高
   (37 / 34 / 36 / 33):各自的 padding + 字号 + line-height 凑出来的,居中对齐也遮不住
   上下边不齐(站主 2026-08-17 截图)。统一 36px 高、盒模型算边框,谁也不许自己长。 */
.mbar .mfbtn,.mbar .ltabs,.mbar .msortwrap,.mbar .mdir{height:36px;box-sizing:border-box}
.mbar .msortwrap .msort{height:100%}
/* 排序下拉是这行里唯一能压缩的:给它一个上限,别让「CANSLIM 项数」把行撑开 */
.mbar .msortwrap{max-width:44vw}
.mfbtn{display:inline-flex;align-items:center;gap:6px;background:var(--panel2);
  border:1px solid var(--line2);color:var(--fg);border-radius:7px;
  padding:8px 14px;font-size:13.5px;font-weight:700;cursor:pointer;flex:none}
.mfbtn i{font-style:normal;background:var(--link);color:var(--ink);border-radius:9px;
  min-width:17px;height:17px;padding:0 5px;font-size:11px;font-weight:800;
  display:inline-flex;align-items:center;justify-content:center}
.mfbtn i[hidden]{display:none}
/* 排序控件带一个 ⇅ 前缀：不加的话它光秃秃写着「阶段」，
   紧挨在「筛选」旁边，看起来就是第二个筛选框，没人会去点。 */
.msortwrap{display:inline-flex;align-items:center;gap:2px;background:var(--panel2);
  border:1px solid var(--line2);border-radius:7px;padding-left:9px;flex:none;min-width:0}
.msortwrap .si{color:var(--faint);font-size:13px;line-height:1;flex:none}
.msort{background:transparent;color:var(--fg);border:0;outline:0;
  padding:8px 6px 8px 4px;font-size:13px;font-family:inherit;min-width:0}
.mdir{background:var(--panel2);color:var(--fg);border:1px solid var(--line2);
  border-radius:7px;padding:8px 9px;font-size:13px;width:34px;cursor:pointer;font-weight:700;flex:none}
.mcnt{font-size:12.5px;color:var(--muted);white-space:nowrap}
.mcnt b{color:var(--fg);font-size:14px}

.mcards{display:flex;flex-direction:column;gap:7px}
.mcard{display:block;background:var(--panel);border:1px solid var(--line);
  border-radius:9px;padding:11px 12px 10px;color:var(--fg);text-decoration:none}
.mcard:active{background:var(--panel2)}
/* 只让三行信息行排成 flex。写成 .mcard>div 会把后来加的展开面板 .mexp
   也变成 flex 行——图、关键数、按钮会并排挤在一行里，图还被压成半宽。 */
.mcard>.c1,.mcard>.c2,.mcard>.c3{display:flex;align-items:center;gap:7px}
.mcard .c1{margin-bottom:7px}
.mcard .c1 .tk{font-family:ui-monospace,Menlo,monospace;font-size:14px;color:var(--link);letter-spacing:-.2px}
.mcard .c1 .nm{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mcard .c2{margin-bottom:8px}
.mcard .c2 .px{font-size:19px;letter-spacing:-.3px}
.mcard .c2 .chg{font-size:13px;font-weight:700}
.mcard .c2 .tw{font-size:12px;color:var(--muted);white-space:nowrap}
.mcard .c2 .tw b{color:var(--accent2);font-size:14px;margin-left:3px}
.mcard .c2 .distrig{font-size:11.5px;color:var(--muted);white-space:nowrap}
.mcard .c2 .distrig.up{color:var(--up)} .mcard .c2 .distrig.down{color:var(--down)}
.mcard .c3{font-size:12px;color:var(--muted);gap:11px}
/* 数值不许在中间断行 —— 手机上「周期 13周」会断成「周期 13」/「周」两行
   (CJK 任意位置可断)。整条 c3 不设 nowrap:那样在窄屏会顶出去,只锁数值本身。 */
.mcard .c3 b{color:var(--fg);font-weight:700;white-space:nowrap}
.mcard .c3 .tg{font-size:11.5px;color:var(--faint);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;max-width:9em;text-align:right}
/* 截断处给一条虚线，示意「这里还有内容，点得开」——否则用户只会以为是显示不全 */
.mcard .c3 .tg[data-pop]{border-bottom:1px dotted var(--line2);padding-bottom:1px}

/* 卡片就地展开：一张不响应手势的静态图 + 一行关键数 + 两个出口。
   多数情况看一眼形态就能判断要不要细看，不必跳进详情页再退回来。 */
.mcard{cursor:pointer;-webkit-tap-highlight-color:transparent}
.mcard.open{border-color:var(--line2);background:var(--panel2)}
.mexp{margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}
.mchart{width:100%;min-height:240px;position:relative}
.mchart .empty{padding:96px 0;text-align:center;color:var(--faint);font-size:12.5px}
.mkey{display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  margin:9px 1px 0;font-size:12.5px;color:var(--muted)}
.mkey b{color:var(--fg);font-size:14px;margin-left:2px}
.mkey b.up{color:var(--up)} .mkey b.down{color:var(--down)}
/* 展开面板只留一个小出口：看完形态要么继续往下扫，要么进详情。
   放大看那一档实测没有价值——静态图放大后信息量并没有增加。 */
.mact{display:flex;justify-content:flex-end;margin-top:10px}
.mact a{font-size:12.5px;font-weight:600;color:var(--link);padding:5px 2px}

/* 抽屉：全屏盖住，避免手指滑到边界时误触底下的列表 */
body.noscroll{overflow:hidden}
.drawer{position:fixed;inset:0;z-index:70;background:var(--bg);
  display:flex;flex-direction:column;
  transform:translateY(100%);transition:transform .2s ease-out}
.drawer.show{transform:none}
.dwbar{display:flex;align-items:center;gap:10px;padding:14px 16px;
  border-bottom:1px solid var(--line);font-size:15px;flex:none}
/* 原先是 19px 的「✕」字形;改成「完成」两个字后按文字尺寸走 */
.dwx{background:transparent;border:0;color:var(--link);font-size:14.5px;font-weight:600;
  cursor:pointer;padding:4px 2px;line-height:1}
.dwbody{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:0 16px 16px}
.dwbody .presets{margin-top:12px}
.dwfoot{display:flex;gap:10px;padding:12px 16px;border-top:1px solid var(--line);
  flex:none;padding-bottom:calc(12px + env(safe-area-inset-bottom))}
.dwreset{flex:none;background:var(--panel2);border:1px solid var(--line2);color:var(--fg);
  border-radius:8px;padding:12px 20px;font-size:14px;cursor:pointer}
.dwok{flex:1;background:var(--link);border:0;color:var(--ink);border-radius:8px;
  padding:12px;font-size:14.5px;font-weight:700;cursor:pointer}
/* 抽屉里筛选面板本身不再需要外框和自己的滚动 */
.drawer .filters{border:0;background:transparent;margin:0}
.drawer .filter-foot{display:none}          /* 数量已在底部按钮上 */

@media (max-width:560px){
  .wrap{padding:0 14px}
  main.wrap{padding-top:10px;padding-bottom:28px}
  .top .wrap{gap:8px}
  .brand b{font-size:17px}
  .nav{margin-left:2px}
  .nav a{padding:6px 9px;font-size:13px}
  #asof{display:none}                       /* 顶栏空间优先给品牌+导航 */
  /* 账号按钮只剩图标：用户名移进下拉菜单，长名字不再把顶栏挤爆 */
  .acctbtn{padding:6px 8px;border-radius:50%}
  .acctbtn .an{display:none}
  /* 筛选子标签：放不下就横滑，不挤压。
     横滑容器不能留负外边距（overflow 会把选中标签的下划线裁掉并产生 1px 纵向滚动），
     故分隔线改用不占布局的 inset 阴影，按钮负边距归零。 */
  .filter-tabs{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;
    border-bottom:0;box-shadow:inset 0 -1px 0 var(--line)}
  .filter-tabs::-webkit-scrollbar{display:none}
  .filter-tabs button{padding:8px 11px;margin-bottom:0}
  .filter-tabs .grow{display:none}
  .fsearch{width:130px;margin:0 4px}
  .filter-grid{grid-template-columns:1fr;gap:0 10px}
  .fld label{width:66px}
  /* 详情页图表周期/标签同理 */
  .tf,.dtabs{overflow-x:auto;scrollbar-width:none}
  .tf::-webkit-scrollbar,.dtabs::-webkit-scrollbar{display:none}
  .dtabs{border-bottom:0;box-shadow:inset 0 -1px 0 var(--line)}
  .dtabs button{margin-bottom:0}
  .detail-head .nm{font-size:20px}
  .detail-head .px{font-size:18px}
  /* 详情头部窄屏：字号收一档，OHLC 条与导航各自换行 */
  .dh1{gap:10px}
  .dh1 .nm,.dh1 .px{font-size:24px}
  .dh1 .code{padding:0 9px;height:28px;font-size:12px}
  .dh1 .vsep{display:none}
  .dh1 .grow{display:none}
  .dh1 .quote{width:100%;gap:6px;font-size:12px}
  .dh1 .dnav,.dh1 .dlinks{font-size:12px}
}
/* 常驻不可关闭的合规免责条：任何页面、无需滚动即可见。
   实际留白由 syncDiscbar() 按其真实高度设定（会折行）；这里的值只是 JS 执行前的兜底。 */
.discbar{position:fixed;left:0;right:0;bottom:0;z-index:50;background:var(--ink);
  border-top:1px solid var(--line2);color:var(--muted);font-size:11.5px;
  text-align:center;padding:6px 14px;line-height:1.4}
body{padding-bottom:56px}

/* ══ 窄屏详情页头部：三行以内 ══════════════════════════════════════════
   原来在 390px 宽的手机上会折成 8 行（返回/代码名称价格/涨跌/OHLC/翻页/
   外链/日期阶段/标签），图表被挤到第二屏。这里用 order + flex-basis:100%
   的占位元素把 DOM 顺序重排成三行，不改宽屏结构、也不做两套 HTML。 */
.brk{display:none}
@media (max-width:640px){
  .dh1{gap:7px 9px;align-items:baseline}
  .dh1 .code{order:1;padding:0 8px;height:28px;font-size:11.5px}
  .dh1 .nm{order:2;font-size:20px}
  .dh1 .grow{order:3;display:block}
  /* 翻页压成两个箭头：带文字的「← 上一只 / 下一只 →」约 190px，
     和代码、名称挤在同一行必然折行，翻页就白占一整行。 */
  .dh1 .dnav{order:4;font-size:11.5px;gap:6px}
  .dh1 .dnav a{font-size:0;padding:3px 10px;line-height:1}
  .dh1 .dnav a::before{font-size:15px;line-height:1;color:var(--fg)}
  .dh1 .dnav a:first-of-type::before{content:'‹'}
  .dh1 .dnav a:last-of-type::before{content:'›'}
  .dh1 .dnav a.off::before{color:var(--faint)}
  .dh1 .brk:first-of-type{order:5}
  .dh1 .px{order:6;font-size:26px}
  .dh1 .chgv{order:7;font-size:14px}
  .dh1 .brk:last-of-type{order:8}
  .dh1 .quote{order:9;gap:5px 9px;font-size:11px;margin-top:1px;flex-wrap:wrap}
  .dh1 .brk{display:block;flex-basis:100%;height:0;margin:0}
  .dh1 .vsep{display:none}
  .dh1 .dnav .pos{color:var(--faint)}
  /* 外链移到图表下方：它们是离站入口，不该挤在正文之前 */
  .dlinks.narrow{display:flex;gap:14px;font-size:12.5px;margin:10px 2px 2px}
  .dh2{font-size:12px;margin-top:9px}
  .dh3{margin-top:8px}
}

/* 轻量页（非候选股）的 RS：与 OHLC 条同排，样式对齐 quote 条里的项 */
.dh1 .qrs{font-size:12px;color:var(--muted);white-space:nowrap}
.dh1 .qrs b{color:var(--fg);font-size:14px;margin-left:3px;
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
@media (max-width:640px){.dh1 .qrs{order:9;font-size:11px}}

/* OHLC 条：每组标签+数值不可拆开断行（四位数价格会把整条撑到换行） */
.quote .qi{display:inline-flex;align-items:baseline;gap:3px;white-space:nowrap}

/* ══ iOS：输入框聚焦时页面自动放大 ══════════════════════════════════════
   iOS Safari 在聚焦「计算字号 < 16px」的表单控件时会自动放大页面，
   而且**只放大不还原**——这是它的可读性策略，不是 bug，也没有开关。
   两种常见「解法」都不能用：
     · maximum-scale=1 / user-scalable=no —— 会连带禁掉双指缩放（伤可访问性），
       且 iOS 10 起 Safari 直接忽略这两个参数，根本不生效；
     · 靠 JS 在 blur 时把 scale 改回去 —— 打断输入，且各系统版本行为不一。
   唯一可靠的做法就是把控件字号提到 16px。桌面端不受影响（下面只在窄屏生效）。
   选择器要写得和原规则一样具体，否则 .fld select 这种会压过裸 input。 */
@media (max-width:640px){
  input,select,textarea,
  .sbox input,.fsearch,.fld select,.fld input,.fld .numin,.msort,.fam select{
    font-size:16px}
  /* 字号变大后重新收一下内边距，避免控件整体变胖 */
  .fld select,.fld input,.fld .numin{padding:8px 9px}
  .msort{padding:7px 6px 7px 4px}
  .fsearch{padding:6px 9px}
  /* 字号提到 16px 后搜索框变宽，和四个标签挤一行会被推出可视区。
     抽屉里给它单独一行——那里本来就有纵向空间。 */
  .drawer .filter-tabs{flex-wrap:wrap;overflow-x:visible}
  .drawer .fsearch{width:100%;margin:9px 0 0;order:9}
}

/* ══ 收藏 ══════════════════════════════════════════════════════════════
   星标长在可点的行/卡片里，所以给足触摸靶面（≥28px）并把点击在捕获阶段
   截住（见 app.js），否则点星会连带跳进详情页。 */
.favb{background:transparent;border:0;padding:0;cursor:pointer;flex:none;
  color:var(--faint);font-size:15px;line-height:1;width:28px;height:28px;
  display:inline-flex;align-items:center;justify-content:center;border-radius:6px;
  -webkit-tap-highlight-color:transparent}
.favb:hover{color:var(--accent2)}
.favb.on{color:var(--accent2)}
.favb:active{transform:scale(.88)}
.favb:focus-visible{outline:2px solid var(--link);outline-offset:-2px}
/* 触控热区扩到 ≥44px,**视觉尺寸一点不变**(iOS 建议 44×44,实测星标只有 24~28px)。
   星标长在整行可点的行/卡片里,手指点偏了不是没反应,而是直接跳进详情页 ——
   错得比没反应更烦人,所以让星标赢过行。代价是紧挨星标 8px 的一圈不再能开详情页,
   相比之下星标才是那个小目标。 */
.favb{position:relative}
.favb::after{content:'';position:absolute;inset:-8px}
table.scr td.favcol .favb::after{inset:-11px -8px}   /* 表格里 24×22,要多补一点 */
/* 表格里的星标列：只占一个字宽，别把代码列推走 */
table.scr th.favcol,table.scr td.favcol{width:30px;padding-left:4px;padding-right:0;cursor:default}
table.scr td.favcol .favb{width:24px;height:22px;font-size:14px}
/* 详情页头部：和 32px 的名称/价格同排，稍大一点才不显得是个误触的小点 */
.favb.big{font-size:22px;width:34px;height:34px}
/* 收藏页的颜色标与置顶(2026-09-02)。五种颜色避开涨跌红绿(--up/--down),
   含义由用户自己定,站上不给它们起名。c0 = 空心 = 没标。 */
.flagb{width:14px;height:14px;border-radius:50%;border:1.5px solid var(--muted);background:transparent;padding:0;cursor:pointer;flex:none;position:relative;vertical-align:middle}
.flagb::after{content:'';position:absolute;inset:-8px}
.flagb.c1{background:#f0b429;border-color:#f0b429}
.flagb.c2{background:#3b82f6;border-color:#3b82f6}
.flagb.c3{background:#9b5cf6;border-color:#9b5cf6}
.flagb.c4{background:#14b8a6;border-color:#14b8a6}
.flagb.c5{background:#ec4899;border-color:#ec4899}
.pinb{background:transparent;border:1px solid var(--line);border-radius:4px;color:var(--faint);font-size:11px;line-height:1;padding:2px 4px;cursor:pointer;flex:none;position:relative;vertical-align:middle}
.pinb::after{content:'';position:absolute;inset:-6px}
.pinb.on{color:var(--accent2);border-color:var(--accent2)}
.flagb:focus-visible,.pinb:focus-visible{outline:2px solid var(--link);outline-offset:2px}
td.flagcol{white-space:nowrap;width:1%}
td.flagcol .pinb{margin-left:6px}
/* 置顶行的底色要盖到冻结的代码列 —— 那一格自带不透明底(.stickycol 三条规则),半透明叠不上去,
   所以按行/隔行/悬停三种底各调一份不透明的混色。 */
table.scr tbody tr.pinned td,table.scr tbody tr.pinned td.stickycol{background:color-mix(in srgb,#fbbf24 8%,var(--row))}
table.scr tbody tr.pinned:nth-child(even) td,table.scr tbody tr.pinned:nth-child(even) td.stickycol{background:color-mix(in srgb,#fbbf24 8%,var(--row-alt))}
table.scr tbody tr.pinned:hover td,table.scr tbody tr.pinned:hover td.stickycol{background:color-mix(in srgb,#fbbf24 8%,var(--row-hover))}
tr.fl1 td.stickycol{box-shadow:inset 3px 0 0 #f0b429}
tr.fl2 td.stickycol{box-shadow:inset 3px 0 0 #3b82f6}
tr.fl3 td.stickycol{box-shadow:inset 3px 0 0 #9b5cf6}
tr.fl4 td.stickycol{box-shadow:inset 3px 0 0 #14b8a6}
tr.fl5 td.stickycol{box-shadow:inset 3px 0 0 #ec4899}
.mcard.pinned{background:rgba(251,191,36,.07)}
.mcard.fl1{border-left:3px solid #f0b429}
.mcard.fl2{border-left:3px solid #3b82f6}
.mcard.fl3{border-left:3px solid #9b5cf6}
.mcard.fl4{border-left:3px solid #14b8a6}
.mcard.fl5{border-left:3px solid #ec4899}
@media (max-width:640px){.favb.big{font-size:19px;width:28px;height:28px}}
/* 卡片里的星标顶到最左：和代码之间用它自身的内边距留白，不再额外加 gap */
.mcard .c1 .favb{margin-left:-4px}

/* 顶栏「收藏」上的数量角标 */
/* .botnav 也要吃这条 —— 它的标签是 <nav class="botnav">,不是 .nav,
   所以窄屏底栏上「收藏」的数字一直是个斜体裸数字,没有那个圆角底。 */
.nav a .navn,.botnav a .navn{font-style:normal;margin-left:5px;background:var(--panel3);
  color:var(--muted);border-radius:9px;min-width:16px;height:16px;padding:0 5px;
  font-size:10.5px;font-weight:800;display:inline-flex;align-items:center;
  justify-content:center;vertical-align:1px}
.nav a.on .navn{background:var(--link);color:var(--ink)}
/* ⚠ [hidden] 规则的选择器必须 ≥ 显示规则的优先级:hidden 属性的 UA 默认
   display:none 会被上面那条显式 display:inline-flex 盖掉,这里必须自己写回去。
   (2026-08-17 撤事件概率时,这条规则上面留下了一段**没有选择器的孤儿声明**,
    它的 prelude 一路吃到下一个 `{`,把这条规则整个吞掉 —— 收藏数为 0 时角标
    照样露出来。删块要连选择器一起删,只删选择器留下的花括号会咬到后面。) */
.nav a .navn[hidden]{display:none}

/* 已收藏但已不在跟踪池：置灰、排在列表末尾。
   「它掉出去了」本身是信息（形态走完或失效），不静默丢掉。 */
/* 收藏页里没有形态的那些票:阶段那一格明说「无形态」。
   低对比的中性色 —— 它是一个事实,不是一个状态标签,别和阶段药丸抢注意力。 */
.nopat{font-size:11.5px;color:var(--faint);background:var(--panel2);
  border:1px solid var(--line);border-radius:4px;padding:2px 6px;white-space:nowrap}
a.nopatcard{text-decoration:none;color:inherit;display:block}
.lnkb{background:none;border:0;padding:0 2px;margin-left:6px;font:inherit;
  color:var(--link);cursor:pointer}
.lnkb:hover{color:var(--accent2)}
.lnkb:focus-visible{outline:2px solid var(--link);outline-offset:2px;border-radius:3px}
/* 名册补上的名称/收盘/涨跌:名称回到正文字体,数字维持等宽;整条仍是一个链接 */

/* 提示条：只在「乐观更新失败、已回滚」时出现——静默失败会让人带着
   「已经收藏了」的错误认知离开。放顶部，不和底部固定免责条打架。 */
#toast{position:fixed;left:50%;top:14px;transform:translate(-50%,-14px);
  z-index:200;background:var(--panel3);color:var(--fg);border:1px solid var(--line2);
  border-radius:8px;padding:9px 15px;font-size:13px;max-width:min(92vw,420px);
  box-shadow:0 10px 28px rgba(0,0,0,.45);opacity:0;pointer-events:none;
  transition:opacity .18s ease,transform .18s ease}
#toast.show{opacity:1;transform:translate(-50%,0)}

/* 窄屏隐藏图上的 OHLC 读数行。
   它本来是**十字光标的读数**，而窄屏已经关掉了十字光标（见 drawChart），
   于是它永远只显示最后一根，内容全部与页头那条 开/高/低/前收/量 重复；
   更糟的是它横贯整行，右端正好压在价格轴最高价标签上（实测 27.39 压 32.00）。
   同一条理由已经用在十字光标、缩放、锚定 AVWAP 上：读数是研究动作，回电脑做。 */
@media (max-width:640px){ .ohlc{display:none} }

/* 申万二级行业强度标签(详情页标签行末尾)。
   排名进前 20% 时点亮 —— 用红色而不是绿色:本站 A 股口径红涨绿跌,
   「行业在走强」和「股价在涨」是同一种含义,不能在同一个页面里用两套色系。 */
.dh3 .tag.swi{display:inline-flex;align-items:center;gap:6px;cursor:default;
  border-color:var(--line2);color:var(--muted)}
.dh3 .tag.swi b{color:var(--fg);font-weight:700;
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px}
.dh3 .tag.swi i{font-style:normal;font-size:11px;font-weight:700;color:var(--faint);
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.dh3 .tag.swi i.up{color:var(--up)} .dh3 .tag.swi i.down{color:var(--down)}
.dh3 .tag.swi.on{border-color:rgba(253,132,135,.4);background:rgba(253,132,135,.07)}
.dh3 .tag.swi.on b{color:var(--up)}
.dh3 .tag.swi em{font-style:normal;font-size:10.5px;color:var(--faint);
  border-right:1px solid var(--line2);padding-right:6px;margin-right:-1px}

/* ══ 市场页 ═══════════════════════════════════════════════════════════
   ⚠ 全部收在 .mktpage 作用域内。这一块用了 .tile / .ind / .kv 这类通用短名,
     而且**类名不许和站内已有的撞** —— 区块本来叫 .mband,结果那是首页「大盘环境」带
     早就占着的名字(见 121 行),市场页白吃它一条 margin-bottom:26px,块间距变成
     gap 26 + margin 26 = 52,肉眼看着「怎么这么松」却查不出是谁给的。改叫 .mblk。
     裸着放进全站样式表会打到别处 —— 实测 .ind 会把搜索结果里的行业名变成
     带边框的 flex 块。选择作用域而不是改类名,是为了让本地样稿与线上共用
     同一份 HTML 结构。

   ── 版面(站主 2026-08-17:「重新排序、排列,一定要合理、整齐」)──────────
   全页只有**一种**结构单元:`区块小标题 + 一组卡片`。广度、酒田、隔夜、形态库、
   共振五块全按这一套走,读者的眼睛只需要学一次。

   为什么放弃原先的三栏 .mgrid:
     ① 事件块撤掉后第三栏空着,1440 宽下白白占掉 426×745;
     ② 三栏里每栏宽度不同,同样是 KPI 的「广度」和「酒田」画出来一大一小;
     ③ 列高对不齐,只能靠 `:last-child{flex:1}` 硬撑,底边永远差十几像素。
   通栏顺排没有这些问题,而且**天然适配手机** —— 手机上三栏本来就得塌成一栏,
   等于宽屏和窄屏是两套版面;现在是同一套,只有列数在变。

   为什么卡片之间用 gap 而不是 1px 分隔线:
     旧的 grid4 用 `gap:1px + 容器底色` 画分隔线,列数写死 8 格。可广度只有 7 个数、
     酒田只有 4 个 —— 空出来的格子会露出容器底色,变成一块灰方块杵在右边。
     改成「每格自己是一张带边框的卡」之后,格数不足的那一行只是留白,怎么排都干净,
     列数也就可以跟着项目数走(--n)。 */
.mktpage{padding:6px 0 10px;display:flex;flex-direction:column;gap:26px}

/* 页头:整页唯一不带框的一块 —— 它是标题,不是内容。
   给足上下留白让它和第一张卡拉开层级(站主:「四周留足空白」)。 */
.mktpage .mhead{padding:2px 2px 0}
.mktpage .mhead h1{margin:0;font-size:22px;font-weight:800;color:#fff;
  letter-spacing:.5px;line-height:1.35;text-wrap:balance}
.mktpage .mhead p{margin:7px 0 0;font-size:13px;color:var(--faint);line-height:1.6;text-wrap:pretty}

/* 区块 = 小标题 + 内容。间距由 gap 统一给,块内不再各写各的 margin
   —— 老版本就是每块自己写 margin,漏一处就贴死(.mgrid 曾实测 margin-top:0)。 */
.mktpage .mblk{display:flex;flex-direction:column;gap:10px}
.mktpage .mblk>h2{margin:0 0 0 2px;font-size:12px;font-weight:700;
  color:var(--muted);letter-spacing:.5px;line-height:1.5}

/* 卡片通用:四周内边距一次定死,页面上所有卡都用它,不许各写各的。 */
.mktpage .tile,.mktpage .fcard,.mktpage .mbody{
  background:var(--panel);border:1px solid var(--line);border-radius:10px}
.mktpage .tile{padding:14px 16px;min-width:0}

/* KPI 网格:列数由内联 --n 给(见 renderMarket 的 cols()),窄屏逐级降档。
   minmax(0,1fr) 里的 0 不能省 —— 不写的话格内的 nowrap 数字会把整行撑破。 */
.mktpage .mtiles{display:grid;gap:10px;
  grid-template-columns:repeat(var(--n,4),minmax(0,1fr))}
@media (max-width:1200px){.mktpage .mtiles{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media (max-width:820px){.mktpage .mtiles{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:560px){.mktpage .mtiles{grid-template-columns:repeat(2,minmax(0,1fr))}}
.mktpage .tile>b{display:block;font-size:19px;font-weight:800;letter-spacing:-.3px;
  font-variant-numeric:tabular-nums;line-height:1.2}
.mktpage .tile>span{display:block;margin-top:5px;font-size:11.5px;color:var(--muted);
  line-height:1.45}

/* 隔夜格:名称 / 现价+涨跌 / 映射。三行都在,格与格才等高。
   ⚠ 名称与映射都可能超长(「ナスダック100先物」「半导体·电子」),
     一律省略号截断,绝不让它把网格撑歪。 */
.mktpage .ovt{display:flex;flex-direction:column;gap:5px}
.mktpage .ovt .ovn{display:flex;align-items:center;gap:6px;min-width:0;
  font-size:12px;color:var(--fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mktpage .ovt .st{width:7px;height:7px;border-radius:50%;flex:none}
.mktpage .ovt .st.live{background:var(--up);box-shadow:0 0 0 3px rgba(253,132,135,.16)}
.mktpage .ovt .st.closed{background:var(--faint)}
.mktpage .ovt .ovr{display:flex;align-items:baseline;justify-content:space-between;gap:8px}
.mktpage .ovt .ovr b{font-size:17px;font-weight:800;letter-spacing:-.3px;
  font-variant-numeric:tabular-nums}
.mktpage .ovt .ovr em{flex:none;font-style:normal;font-size:12.5px;font-weight:700;
  font-variant-numeric:tabular-nums}
.mktpage .ovt .ovm{font-size:11px;color:var(--faint);min-height:16px;line-height:1.45;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 形态库:两个家族并排等高。这是全页唯一的并排 —— 它们是一对,并排才比得出来。
   auto-fit + 320px 下限:窄到装不下两栏就自动变一栏,不用再写一条媒体查询。 */
.mktpage .mpair{display:grid;gap:14px;
  grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}
.mktpage .fcard{padding:4px 18px 8px}
.mktpage .fcard h3{margin:0;padding:12px 0 2px;font-size:14.5px;font-weight:800;color:#fff}
.mktpage .fcard .kv{display:flex;align-items:baseline;justify-content:space-between;
  gap:14px;padding:12px 0;border-top:1px solid var(--line)}
.mktpage .fcard .kv:first-child{border-top:0}
.mktpage .fcard .k{flex:none;font-size:12.5px;color:var(--muted)}
/* 数值与注解共一列右对齐:注解长短不一,跟着数值走会把基线拉得参差。 */
.mktpage .fcard .rv{display:flex;flex-direction:column;align-items:flex-end;gap:3px;
  min-width:0;text-align:right}
.mktpage .fcard .rv b{font-size:18px;font-weight:800;letter-spacing:-.3px;
  font-variant-numeric:tabular-nums;line-height:1.15}
.mktpage .fcard .rv em{font-style:normal;font-size:11.5px;color:var(--faint);line-height:1.45}

/* 列表型卡片(酒田曲线 / 共振行业)。左右 18px 与卡片系统一致,
   行分隔线因此比卡片边框内缩 18px —— 这是有意的,贴边的横线会和边框粘成一坨。 */
.mktpage .mbody{padding:4px 18px 8px}
.mktpage .mbody .fanload{padding:14px 0;color:var(--faint);font-size:12.5px}
.mktpage .mbody .meta{padding:8px 0 4px;font-size:11px;color:var(--faint);line-height:1.5}
.mktpage .mbody>svg{display:block;width:100%;margin-top:10px}

.mktpage .resohd{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;
  padding:14px 0 12px;border-bottom:1px solid var(--line)}
.mktpage .resohd b{font-size:22px;font-weight:800;letter-spacing:-.4px;
  font-variant-numeric:tabular-nums}
.mktpage .resohd span{font-size:12px;color:var(--faint);line-height:1.5}
.mktpage .ind{display:flex;align-items:center;gap:10px;padding:9px 0;
  border-top:1px solid var(--line);font-size:13px}
.mktpage .ind:first-child{border-top:0}
/* 表头行。这两列讲的是**两批不同的票**(行业全体 vs 我们的在册),
   不写表头就会被读成一个数的两半 —— 站主看到「跑赢占比 100% · 0 只」
   第一反应就是「这个对吗」。列名不够,再挂一个 ? 说明口径。 */
.mktpage .ind.indhd{font-size:11px;color:var(--faint);padding:4px 0 8px;letter-spacing:.3px}
.mktpage .ind.indhd .nm{color:var(--faint)}
.mktpage .ind.indhd .fq{margin-left:4px}
.mktpage .ind .rk{width:24px;flex:none;text-align:right;color:var(--faint);font-size:12px;
  font-variant-numeric:tabular-nums}
.mktpage .ind .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mktpage .ind .pt{width:78px;flex:none;text-align:right;color:var(--faint);font-size:12px;
  font-variant-numeric:tabular-nums}
.mktpage .ind .ct{width:54px;flex:none;text-align:right;font-variant-numeric:tabular-nums}
.mktpage .ind .ct.zero{color:var(--faint)}

/* 手机:只收内边距和字号,**不换结构** —— 结构一样,才不会出现「宽屏对了窄屏没对」。 */
@media (max-width:560px){
  .mktpage{gap:20px}
  .mktpage .mhead h1{font-size:19px}
  .mktpage .mhead p{font-size:12.5px}
  .mktpage .tile{padding:12px 13px}
  .mktpage .tile>b{font-size:17px}
  .mktpage .fcard,.mktpage .mbody{padding-left:14px;padding-right:14px}
  .mktpage .fcard .rv b{font-size:17px}
  .mktpage .ind .pt{width:66px}
  .mktpage .ind .ct{width:46px}
  /* 两列下项数为奇数时,最后一张会单独占半行、右边空一格。
     让它整行铺满 —— 读起来像「有意收尾」,而不是「少了一块」。
     (只在两列这一档做:三列/四列的补位要分两种情况,补出来反而一行里
      宽窄不一,比留个空更难看。) */
  .mktpage .mtiles>.tile:last-child:nth-child(odd){grid-column:span 2}
}

/* 收藏页现价的变动闪烁（贴值元素通用）：涨红闪、跌绿闪，1.2s 退场 */
@keyframes qvup{0%{background:rgba(253,132,135,.35)}100%{background:transparent}}
@keyframes qvdn{0%{background:rgba(52,192,98,.30)}100%{background:transparent}}
.qfl-up{animation:qvup 1.2s ease-out;border-radius:3px}
.qfl-dn{animation:qvdn 1.2s ease-out;border-radius:3px}
@media (prefers-reduced-motion:reduce){.qfl-up,.qfl-dn{animation:none}}


/* 旗形家族(2026-08-16):行内家族小徽章,与阶段丸并排 */
.famb{display:inline-block;margin-left:5px;font-size:10px;font-weight:700;padding:1px 6px;
  border-radius:9px;background:#8b8bd622;color:#a8a8e8;vertical-align:middle;white-space:nowrap}
.dot2{color:var(--faint);margin:0 2px}

/* 事件时间轴(图下,TradingView 式):息=除息 报=财报披露 */
/* 酒田新值带(2026-08-18):图下方 44px 画布,红/绿块=当前连数,深浅=全市场分位 */
/* 股性画像面板(2026-08-18 A 期):标签行 + 六行「维度 · 分位条 · 分位 · 原值」+ 脚注 */
.charpanel{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:10px 14px 8px}
.ctags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px;min-height:22px;align-items:center}
.ctag{font-size:11px;padding:2px 8px;border-radius:10px;border:1px solid var(--line2);color:var(--fg);background:transparent}
.crow{display:grid;grid-template-columns:78px minmax(90px,140px) 34px 1fr;gap:0 10px;align-items:center;
  padding:5px 0;border-top:1px solid var(--line);font-size:12px;cursor:default}
.crow:first-of-type{border-top:0}
.crow .ck{color:var(--muted);white-space:nowrap}
.crow .cbar{height:6px;border-radius:3px;background:rgba(255,255,255,.06);overflow:hidden}
.crow .cbar i{display:block;height:100%;background:var(--link);border-radius:3px}
.crow.risk .cbar i{background:var(--up)}
.crow.lim .cbar{background:transparent}   /* 涨停行为是计数不是分位,不画空轨 */
.crow .cp{text-align:right;color:var(--fg)}
.crow .craw{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.cfoot{margin-top:6px;font-size:11px}
@media (max-width:820px){
  .crow{grid-template-columns:78px 1fr 34px;row-gap:2px}
  .crow .craw{grid-column:1 / -1;white-space:normal}
}
.shind{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:10px;align-items:baseline}
.shind>span:first-child{color:var(--faint)}
.shind .shi b{font-weight:600;color:var(--fg)}
#shlane{position:relative;height:44px;margin-top:2px}
#shlane canvas{display:block;width:100%;height:44px}
#evlane{position:relative;height:22px;margin-top:2px}
#evlane .evm{position:absolute;top:2px;transform:translateX(-50%);width:16px;height:16px;
  line-height:16px;text-align:center;border-radius:50%;font-size:10px;font-weight:700;cursor:default}
#evlane .evm.d{background:#c9a46822;color:#c9a468;box-shadow:inset 0 0 0 1px #c9a46866}
#evlane .evm.e{background:#7fa8d622;color:#7fa8d6;box-shadow:inset 0 0 0 1px #7fa8d666}
/* 未来那一格（下次财报的预约日）：空心虚线胶囊 + **写出日期**。
   ① 空心虚线区别于已披露的实心标 —— 预约日会改期，画成实心就是把「可能」说成「已定」；
   ② 必须自带日期：横轴刻度只画到最后一根 K 线，未来那段是空白、没有任何刻度可对，
      光一个圆点读不出是哪天（站主 2026-08-16 指出）。已发生的标不加日期 ——
      它们对齐在有刻度的 K 线上，十几个标全带日期只会把这条轴变成一排乱码。 */
#evlane .evm.f{width:auto;height:16px;padding:0 6px;border-radius:9px;
  background:transparent;box-shadow:none;border:1px dashed currentColor;opacity:.9;
  display:inline-flex;align-items:center;gap:3px;line-height:1}
#evlane .evm.f i{font-style:normal;font-size:10px;font-weight:600;
  font-variant-numeric:tabular-nums;letter-spacing:.2px}

/* ── 综合评分榜（33 强）───────────────────────────────────────────────── */
/* 首页入口：只有一行，不把榜搬上来（首页的活是「一眼看今天该看什么」）。 */
.topstrip{display:flex;align-items:center;gap:14px;margin:18px 0 0;padding:11px 16px;
  background:var(--panel);border:1px solid var(--line);border-radius:10px;
  color:var(--fg);text-decoration:none;flex-wrap:wrap}
.topstrip:hover{border-color:var(--link)}
.topstrip .tl{font-size:12px;font-weight:800;color:var(--muted);letter-spacing:.4px;flex:none}
.topstrip .tn{display:flex;gap:16px;flex-wrap:wrap;min-width:0}
.topstrip .tn i{font-style:normal;font-size:12.5px;color:var(--muted);white-space:nowrap}
.topstrip .tn i b{color:var(--accent2);font-variant-numeric:tabular-nums;margin-right:6px}
.topstrip .ta{margin-left:auto;font-size:12px;font-weight:700;color:var(--link);flex:none}

.toppage .lead{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:6px 0 14px}
.toppage .lead .meta{display:flex;align-items:center;gap:4px}
.tsort{display:inline-flex;align-items:center;gap:4px;background:var(--panel2);
  border:1px solid var(--line2);border-radius:7px;padding-left:9px;flex:none;
  height:36px;box-sizing:border-box}   /* 与旁边的 .ltabs 同高 */
.tsort .si{color:var(--faint);font-size:13px;line-height:1}
.tsort select{background:transparent;color:var(--fg);border:0;outline:0;height:100%;
  padding:0 6px 0 4px;font-size:12.5px;font-family:inherit;font-weight:600}

/* ── 33 强卡片 ────────────────────────────────────────────────────────
   站主 2026-08-17 拿 MarketSmith 的卡片来对：小图 + 名字 + 综合分 + 分项。
   他那张卡在 812px 屏上只装得下两张,我压到 ~104px 一张,一屏能扫七八只 ——
   这张榜的活是**快速否掉**,不是逐只细读,行高就是它的成败。
   宽屏自动铺成两列(单列时右边会空掉半个屏)。 */
/* 一行放几张:窄屏 1、平板 2、桌面 3(站主 2026-08-17:「一行放两个太浪费了,很多空白,
   一行放3个比较好,刚好11行」)。33 = 3×11,正好排满不留半行。 */
.tcards{display:grid;grid-template-columns:1fr;gap:8px}
@media (min-width:820px){.tcards{grid-template-columns:1fr 1fr;gap:8px 12px}}
@media (min-width:1240px){.tcards{grid-template-columns:1fr 1fr 1fr;gap:8px 12px}}
/* min-width:0 同样少不得:**网格项**的默认 min-width 也是 auto,卡片会按内容的
   最小宽度撑开、越出自己那一格(实测 375 视口里格子 347、卡片 444,右边一截连同
   分数被推到屏幕外)。这一条与下面 .nm 那条是同一个毛病的两层:外层不让缩,
   内层就没有机会省略号。 */
.tcard{min-width:0;display:flex;gap:12px;padding:10px 12px;background:var(--panel);
  border:1px solid var(--line);border-radius:10px;color:var(--fg);text-decoration:none;
  align-items:center}
.tcard:hover{border-color:var(--link);background:var(--row-hover)}
.tk1{position:relative;flex:none;width:104px}
.tk1 .rk{position:absolute;left:0;top:-2px;font-size:10.5px;font-weight:800;
  color:var(--faint);font-variant-numeric:tabular-nums}
.tspark{display:block;width:104px;height:46px}
/* 三列时每张卡只有约 400px,走势线收窄 20px 让给名称/行业,免得它们提前省略号 */
@media (min-width:1240px){
  .tk1{width:84px}
  .tspark{width:84px}
}
.tk2{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.tcard .r1,.tcard .r2,.tcard .r3{display:flex;align-items:baseline;gap:8px;min-width:0}
/* min-width:0 少不得:flex 子项的默认 min-width 是 auto,**再长也不肯缩**,
   于是名字把后面的「新/登録」徽章和右边那个分数一起顶出卡片(overflow 被裁掉,
   手机上整列分数就此消失)。中文名 2–4 个字碰不到这条线,日本語の社名(「デジタルハーツ
   ホールディングス」)一下就越界 —— 又一个只在日股露头的老毛病(2026-08-20)。 */
.tcard .r1 .nm{font-size:15px;font-weight:800;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;min-width:0;flex:0 1 auto}
.tcard .r1 .isnew,.tcard .r1 .inpool{flex:none}
.tcard .sc{font-size:22px;font-weight:800;color:var(--accent2);line-height:1;
  font-variant-numeric:tabular-nums;flex:none}
.tcard .r2{font-size:12px;color:var(--muted)}
.tcard .r2 .tkc{color:var(--link);font-weight:700;flex:none}
.tcard .r2 .px{color:var(--fg)}
/* 第三行只放「和别的股票一样」的属性：行业 · 市值。
   六个分项(RS/盈利成长/行业强度/销售利润/量能/距52周高)仍在 top.json 里、
   仍参与算分,但不摆到脸上(站主 2026-08-17)。 */
.tcard .r3{gap:10px;margin-top:1px;font-size:11.5px;color:var(--muted)}
.tcard .r3 .ind{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tcard .r3 .mv{flex:none;color:var(--faint);font-variant-numeric:tabular-nums}
.tcard .inpool{flex:none;font-size:10px;font-weight:700;color:var(--down);
  background:rgba(52,192,98,.14);border:1px solid rgba(52,192,98,.3);
  border-radius:9px;padding:1px 7px;white-space:nowrap}
/* 新进榜:与「在册」同一种形状,换成琥珀 —— 两个标常常并排,颜色是唯一的区分 */
.tcard .isnew{flex:none;font-size:10px;font-weight:800;color:var(--ink);
  background:var(--accent2);border-radius:9px;padding:1px 7px;white-space:nowrap}

/* ── 本轮退出 ────────────────────────────────────────────────────────
   榜悄悄换人的话,昨天看过的人第二天找不到那只票,只会以为自己记错了。
   一行摆完,不占版面,但必须在。 */
.dropbar{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:12px 0 0;
  padding:9px 12px;background:var(--panel);border:1px solid var(--line);border-radius:8px}
.dropbar .dl{font-size:11.5px;font-weight:700;color:var(--faint);flex:none}
.dropbar a{font-size:12px;color:var(--muted);text-decoration:none;
  border-bottom:1px dotted var(--line2)}
.dropbar a:hover{color:var(--link)}

/* ── 严选(门槛制)──────────────────────────────────────────────────
   与上面按分排的榜刻意长得不一样:没有名次、没有走势线,第三行摆的是
   三条门槛的实测值 —— 这个榜要回答的是「够不够硬」,不是「排第几」。 */
.elitehd{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin:22px 0 9px}
.elitehd b{font-size:15px;font-weight:800;color:var(--fg)}
.elitehd .n{font-size:15px;font-weight:800;color:var(--accent2);
  font-variant-numeric:tabular-nums}
.elitehd .cond{font-size:11.5px;color:var(--faint)}
/* 十年曲线:满宽一条,高度固定 —— 它是个「形状」不是精读的图,别让它抢版面 */
.ecwrap{margin:2px 0 10px}
.ecurve{display:block;width:100%;height:68px}
/* 年份刻度在 SVG 外面:preserveAspectRatio="none" 会把 <text> 横向拉宽(实测 2.3 倍) */
.ecplot{position:relative}
.ectick{position:absolute;bottom:0;transform:translateX(2px);font-size:8.5px;line-height:1;
  color:var(--faint);pointer-events:none;font-variant-numeric:tabular-nums}
.ecmeta{margin-top:2px;font-size:11.5px;color:var(--faint)}
.ecmeta b{color:var(--accent2);font-variant-numeric:tabular-nums}
.elitezero{padding:16px 12px;background:var(--panel);border:1px solid var(--line);
  border-radius:8px;color:var(--muted);font-size:12.5px}
.tcards.elite .tcard{align-items:stretch}
.tcards.elite .r3 .eg{flex:none;font-size:11.5px;color:var(--muted);
  font-variant-numeric:tabular-nums}

/* ── 「筛选结果 / Top 33」切换条 ────────────────────────────────────────
   站主 2026-08-17：顶栏四个中文标签在手机上会把整行撑破，而这两件事本来
   同属「看名单」，并排放在「筛选」旁边才对。两个页面共用这一条。 */
.ltabs{display:inline-flex;align-items:stretch;gap:2px;background:var(--bg);border:1px solid var(--line2);
  border-radius:8px;padding:2px;flex:none;height:36px;box-sizing:border-box}
/* 每格撑满切换条的高度、文字垂直居中 —— 高度由外框定,不由 padding 凑 */
.ltabs .lt{display:inline-flex;align-items:center;color:var(--muted);font-size:12.5px;font-weight:700;padding:0 12px;
  border-radius:6px;white-space:nowrap;text-decoration:none}
.ltabs .lt:hover{color:var(--fg)}
.ltabs .lt.on{background:var(--panel2);color:var(--fg)}
/* 宽屏：收起按钮与切换条同一行，别各占一行把表格往下推 */
.lthead{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.scrlayout:not(.collapsed) .lthead{margin-bottom:2px}
.toppage .lead{align-items:center}

/* ── 窄屏底部导航(2026-08-17 站主定)─────────────────────────────────────
   为什么不是汉堡:这里是 4 个都常用的主目的地,汉堡把每次切换从 1 次点击变成 2 次,
   而且看不出自己在哪一页。底部栏正好在它的舒适区(3-5 项),拇指够得到,
   而且把「能放几个导航」与「顶栏有多宽」彻底解耦 —— 顶栏 375px 只剩 4px 余量,
   再加一项必溢出(实测:品牌 144 + 导航 173 + 账号 54 = 371/375)。 */
.botnav{display:none;position:fixed;left:0;right:0;bottom:0;z-index:60;
  background:var(--ink);border-top:1px solid var(--line2);
  padding-bottom:env(safe-area-inset-bottom);   /* iOS 底部横条/地址栏 */
  -webkit-tap-highlight-color:transparent}
.botnav a{flex:1;text-align:center;padding:10px 0 9px;font-size:12px;font-weight:600;
  color:var(--muted);text-decoration:none;position:relative;white-space:nowrap}
.botnav a:hover{color:var(--muted)}
.botnav a.on{color:#fff}
/* 当前页用顶边一道短线标出来 —— 与顶栏那份(下边框)同一种语言,只是方向反过来 */
.botnav a.on::before{content:'';position:absolute;top:0;left:24%;right:24%;
  height:2px;background:var(--link);border-radius:0 0 2px 2px}
.botnav .navn{margin-left:3px}

@media (max-width:720px){
  .nav{display:none}                 /* 顶栏导航让位,只留品牌 + 交易日 + 账号 */
  .botnav{display:flex}
  /* 免责声明从固定条改成随内容滚的页脚。**底部只留一条固定栏** ——
     两条叠在一起要吃掉近 100px,在手机上那是整整一行表格的高度;
     而免责声明滚到底照样看得见,不必一直占着。 */
  .discbar{position:static;padding:12px 14px 16px;text-align:center}
  body{padding-bottom:calc(52px + env(safe-area-inset-bottom))}
}

/* ══ 收藏对比(2026-08-19):行首「比」+ 顶部对比条 + 并排表 ══ */
.cmpt{background:transparent;border:1px solid var(--line2);color:var(--faint);border-radius:5px;
  width:22px;height:22px;font-size:11px;line-height:1;cursor:pointer;flex:none;padding:0;
  display:inline-flex;align-items:center;justify-content:center;margin-left:6px;-webkit-tap-highlight-color:transparent;
  position:relative;z-index:1}   /* 星标的 ::after 热区外扩 8px,叠上来会抢点击;这里抬一层 */
.cmpt:hover{border-color:var(--link);color:var(--fg)}
.cmpt.on{background:var(--link);border-color:var(--link);color:#0b1020;font-weight:700}
table.scr th.favcol,table.scr td.favcol{width:auto;white-space:nowrap}
.mcard .c1 .cmpt{margin-right:6px}
.cmpbar{display:flex;align-items:center;gap:8px;margin:14px 0 0;font-size:12px;color:var(--muted)}
.cmpbar .cl{font-weight:700}
.cmpbar b{color:var(--fg)}
.cmpbar button{height:30px;box-sizing:border-box;padding:0 13px;border-radius:5px;font-size:12px;font-weight:600;cursor:pointer;
  border:1px solid var(--line2);background:var(--panel2);color:var(--fg)}
.cmpbar button.cmpgo:not([disabled]){border-color:var(--link);color:var(--link)}
.cmpbar button[disabled]{opacity:.45;cursor:default}
.mbar + .cmpbar{margin:10px 12px 0}
/* 对比页 */
.cmpwrap{padding:18px 24px 40px;max-width:1240px;margin:0 auto}
.cmphd{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin-bottom:14px}
.cmphd h1{font-size:18px;margin:0}
.cmpscroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.cmptbl{border-collapse:separate;border-spacing:0;width:100%;font-size:12.5px;table-layout:fixed}
.cmptbl th,.cmptbl td{padding:7px 10px;border-bottom:1px solid var(--line);vertical-align:top;text-align:left}
.cmptbl thead th{border-bottom:1px solid var(--line2);vertical-align:bottom}
.cmptbl thead th a{color:var(--fg);text-decoration:none;display:flex;flex-direction:column;gap:2px}
.cmptbl thead th a b{font-size:14px}
.cmptbl thead th a .mono{color:var(--link);font-size:11px;font-weight:400}
.cmptbl th[scope=row]{color:var(--muted);font-weight:400;white-space:nowrap;width:150px;position:sticky;left:0;background:var(--bg);z-index:1}
.cmptbl thead tr:first-child th:first-child{position:sticky;left:0;background:var(--bg);z-index:2}
.cmptbl tr.cmpg th{padding-top:14px;color:var(--fg);font-weight:700;font-size:12px;letter-spacing:.02em;border-bottom:0;position:static;background:transparent}
.cmptbl td{color:var(--fg);font-variant-numeric:tabular-nums}
.cmptbl td .mk{font-style:normal;color:var(--faint);font-size:10px;margin-left:4px}
.cmptbl td.hi{font-weight:700}
.cmptbl td.lo{color:var(--muted)}
.cmpsum{display:flex;flex-wrap:wrap;gap:4px}
.cmpsum span{font-size:11px;padding:2px 7px;border-radius:9px;border:1px solid var(--line2);color:var(--muted);white-space:nowrap}
.cmptbl tr.cmpsr th{color:var(--muted);font-weight:400;vertical-align:top}
.cmptbl .ck{font-style:normal;font-weight:700;font-size:11px;display:inline-block;width:14px;height:14px;line-height:14px;text-align:center;border-radius:3px;margin-right:4px;vertical-align:1px}
.cmptbl .ck.ok{background:rgba(52,192,98,.18);color:var(--down)}
.cmptbl .ck.no{background:rgba(253,132,135,.16);color:var(--up)}
.cmptbl tr.cmpcr td{padding-top:6px}
.cmpc{display:block;width:100%;height:60px}
.cmpcv{font-size:11px}
.cmpfoot{margin-top:12px;font-size:11px}
@media (max-width:820px){
  .cmpwrap{padding:12px 10px 32px}
  .cmphd h1{font-size:16px}
  .cmptbl{font-size:12px}
  .cmptbl th,.cmptbl td{padding:6px 6px}
  .cmptbl th[scope=row]{width:96px;white-space:normal}
  .cmpsum span{white-space:normal}
}

/* 财报动态一句(详情页头部,风险行下面):中性色,刚出的加一点亮度 */
.finline{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-top:6px;font-size:12.5px;color:var(--muted)}
.finline .fk{font-size:11px;padding:1px 6px;border-radius:4px;border:1px solid var(--line2);color:var(--faint);white-space:nowrap}
.finline.fresh{color:var(--fg)}
.finline.fresh .fk{color:var(--fg);border-color:var(--link)}

/* 交易台跳转定位高亮(2026-08-23) */

/* 筹码分布图(2026-08-23;08-24 重做:SVG 1 单位 = 1 像素,按容器实际宽度画、变宽重画,绝不拉伸;
   卡片按内容定宽、不撑满整行 —— 站主的排版铁律) */
.chipsbox{margin:14px 0 6px}
.chipsbox .refhead{display:flex;gap:10px;align-items:baseline;flex-wrap:wrap;margin-bottom:8px}
.chipsmeta{font-size:12px;color:var(--faint);font-weight:400;letter-spacing:0}
/* 卡片是普通块、按内容定宽(fit-content):图例不能当卡片的 flex 子项 —— 它的单行长度会被算进
   容器的 max-content,把卡片撑到 1271px(08-24 本地真实 Chrome 量出来的) */
.chipscard{display:block;width:fit-content;max-width:100%;box-sizing:border-box;
  background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:14px 16px 10px}
.chipsrow{display:flex;flex-wrap:wrap;gap:6px 40px;align-items:flex-start}
.chipsplot{flex:0 0 auto;min-width:0}
.chipsvg{display:block;background:transparent;font-family:inherit}
.chipsstats{flex:0 1 auto;min-width:180px;max-width:320px;display:flex;flex-direction:column;gap:14px;padding-top:6px;font-size:12px}
.chipsstats .ck{color:var(--muted);margin-bottom:2px}
.chipsstats .cv{color:var(--fg);font-weight:600;font-size:20px;line-height:1.15;font-variant-numeric:tabular-nums}
.chipsstats .cv.ok{color:var(--pass)} .chipsstats .cv.no{color:var(--fail)}
.chipsstats .cs{color:var(--faint);font-size:11.5px;margin-top:3px}
.chipslegend{display:flex;flex-wrap:wrap;gap:2px 14px;font-size:11px;color:var(--faint);line-height:1.7;margin-top:6px}
.chipslegend i{display:inline-block;width:10px;height:8px;border-radius:1px;margin-right:5px;vertical-align:-1px}
/* 两张卡一行:左卡由 auto 列按内容定宽(≈694px),右卡「筹码走势」吃掉整行剩余 —— 08-24 站主:右边全空页面不完整。
   ≤980px 时上下排:左卡仍按内容定宽,右卡满宽 */
/* 与 .dgrid 共用同一套列定义 —— 两套栅格叠在一起时中缝差 21px,
   站主 2026-08-31:「你看看这四张卡片,都不一样大的」「他们的中间,这么难看」 */
.chipsrow2{display:grid;grid-template-columns:var(--dcols);gap:var(--dgap);align-items:stretch}
.chipsrow2>.chipscard{display:flex;flex-direction:column}
.chipsrow2>.chipscard{width:auto;max-width:none;min-width:0}
.chipsrow2>.chipscard:only-child{width:fit-content;max-width:100%}
.chipscard.hist{display:flex;flex-direction:column}
.chipsplot2{min-width:0;flex:1 1 auto}
@media (max-width:980px){
  .chipsrow2{grid-template-columns:minmax(0,1fr)}
  .chipsrow2>.chipscard{width:fit-content;max-width:100%}
  .chipsrow2>.chipscard.hist{width:auto}
}

/* ── 楔型家族(2026-08-29):第三张卡 + #/wedge 列表页 ─────────────────── */
.famcard2 .fsub{font-size:11px;color:var(--muted);border:1px solid var(--line2);border-radius:10px;padding:2px 9px;white-space:nowrap}
.fstats.f4{grid-template-columns:repeat(4,1fr)}
@media (max-width:640px){.fstats.f4{grid-template-columns:repeat(2,1fr)}.fstats.f4 .fs:nth-child(-n+2){border-bottom:1px solid var(--line)}}
.wedgehd{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin:6px 0 14px}
.wedgehd h2{margin:0;font-size:20px;color:#fff;display:flex;align-items:center;gap:10px}
.wedgehd h2 .meta{font-size:12px;font-weight:400}
.wchips{display:flex;gap:8px;flex-wrap:wrap}
.wchip{background:var(--panel);border:1px solid var(--line);border-radius:16px;color:var(--muted);padding:5px 13px;font-size:12.5px;cursor:pointer;white-space:nowrap;flex:none}
/* 窄屏:标题与两排筹码各占整行,筹码整颗换行不许拆字(站主 2026-08-29:「顶部要修一下」,
   之前 .wedgehd 一行 flex 把 CJK 按钮压成一字一行的竖条)。*/
@media (max-width:640px){
  .wedgehd{gap:10px}
  .wedgehd h2{flex-wrap:wrap;row-gap:2px}
  .wedgehd .wchips{width:100%}
}
.wchip:hover{border-color:var(--line2);color:var(--fg)}
.wchip.on{background:var(--panel2);border-color:var(--accent2);color:var(--fg);font-weight:700}

/* ── 筛选器合并六形态(2026-08-31)──────────────────────────────────────── */
/* 「形态」列:名字不抢戏;「结构」列:一句事实摘要,六种形态各说各的 */
td.patcol{white-space:nowrap;color:var(--muted);font-size:12.5px}
td.structcell{white-space:nowrap;color:var(--muted);font-size:12px}
/* 详情页形态块:标题里带状态小丸,行沿用 .frow */
.patpanel h4{display:flex;align-items:center;gap:8px;margin-bottom:2px}
/* 形态块的行:键栏 64px(最长的键是「突破日」),值与后面的小字同一行。
   全站 .frow 的键栏 96px 是给日股那些长键名用的,这里用不着。 */
.patpanel .frow.patrow{padding:2px 0;font-size:12.5px;align-items:baseline}
.patpanel .frow.patrow .fk{min-width:64px;font-size:11.5px}
.patpanel .frow.patrow .fv{display:flex;gap:7px;align-items:baseline;flex-wrap:wrap}
/* 新值那一行:块内的脚注,不是独立格子(2026-08-31 站主点名它太占地方) */
.patpanel .patnote{margin-top:6px;font-size:11.5px;line-height:1.5}
/* 块内折叠项(生命周期与锚点):比整块的折叠低一级,不抢标题的位 */
.subfold{margin-top:8px;border-top:1px solid var(--line);padding-top:6px}
.subfold>summary{cursor:pointer;list-style:none}
.subfold>summary::-webkit-details-marker{display:none}
.subfold>summary h5{display:inline;margin:0;font-size:12px;font-weight:600;color:var(--faint)}
.subfold>summary::before{content:'▸ ';color:var(--faint);font-size:11px}
.subfold[open]>summary::before{content:'▾ '}

/* ══ 详情页第二版的其余样式(2026-08-31)══════════════════════════════════ */

/* 多出来的一档「技术面」。第一版没有 .only-tech 元素,这些规则空转。 */
#dbody[data-view="pattern"] .only-tech,
#dbody[data-view="fan"] .only-tech,
#dbody[data-view="fund"] .only-tech{display:none}
#dbody[data-view="tech"] .only-pattern,
#dbody[data-view="tech"] .only-fan,
#dbody[data-view="tech"] .only-fund{display:none}

/* 形态块:与楔形/W底/三角同一套排版。键栏 64px(最长的键是「突破日」),
   值与后面的小字同一行 —— 全站 .frow 的 96px 是给日股长键名用的。 */
.patpanel h4{display:flex;align-items:center;gap:8px;margin-bottom:2px}
.patpanel .frow.patrow{padding:2px 0;font-size:12.5px;align-items:baseline}
.patpanel .frow.patrow .fk{min-width:64px;font-size:11.5px}
.patpanel .frow.patrow .fv{display:flex;gap:7px;align-items:baseline;flex-wrap:wrap}
/* 新值那一行:块内的脚注,不是独立格子(它一句话曾占掉 600×233) */
.patpanel .patnote{margin-top:6px;font-size:11.5px;line-height:1.5}
/* 块内的折叠(生命周期与关键锚点)比整块的折叠低一级 */
.subfold{margin-top:8px;border-top:1px solid var(--line);padding-top:6px}
.subfold>summary{cursor:pointer;list-style:none}
.subfold>summary::-webkit-details-marker{display:none}
.subfold>summary h5{display:inline;margin:0;font-size:12px;font-weight:600;color:var(--faint)}
.subfold>summary::before{content:'▸ ';color:var(--faint);font-size:11px}
.subfold[open]>summary::before{content:'▾ '}

/* 形态历史 2026-08-31 起不是折叠面板(折起来只剩一行标题,人以为就这点东西) */
#histpanel h4{margin-bottom:6px}
.hmore{cursor:pointer;padding:5px 2px 1px;font-size:11.5px;user-select:none}

/* 数据表的公共底子。站主:「这完全不是一张表格啊,表头和下面的内容都对不齐」——
   查出来 table.fan 与 .bft **一条样式都没有**,用的是浏览器默认渲染。
   表头与数据走同一套对齐:第一列左(标签)、其余右(数字);列宽由 fixed 统一分配。 */
table.fan,table.bft{width:100%;border-collapse:collapse;font-size:12.5px;
  table-layout:fixed;font-variant-numeric:tabular-nums}
table.fan th,table.bft th{font-weight:500;color:var(--faint);font-size:11.5px;
  padding:4px 8px;border-bottom:1px solid var(--line);white-space:nowrap}
table.fan td,table.bft td{padding:4px 8px;border-top:1px solid var(--line)}
table.fan th:first-child,table.fan td:first-child,
table.bft th:first-child,table.bft td:first-child{text-align:left;color:var(--muted)}
table.fan th:not(:first-child),table.fan td:not(:first-child),
table.bft th:not(:first-child),table.bft td:not(:first-child){text-align:right}
table.fan tr:last-child td{border-bottom:0}

/* 小方块:一格一个,按内容宽度排、自然换行。方块**自己带边框**——
   不靠容器补边框,所以最后一行填不满时也不会出现「画一半的框」。
   指标矩阵的卡内与「成长与质量」共用(渲染走同一个 statBoxes)。 */
/* ⚠ 这里原本叫 .sbox —— 与**首页那个全市场搜索框**(第 204 行)重名,
   我这条写在后面,把搜索框改成了竖排:放大镜和占位文字上下摞、还被截断
   (站主 2026-08-31:「搜索栏怎么变这样了」)。
   改名 .kvbox。教训:加新类名之前先 grep 一遍 styles.css,别撞已有的。 */
.statboxes{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 4px}
.kvbox{display:flex;flex-direction:column;gap:1px;min-width:0;
  background:var(--panel);border:1px solid var(--line);border-radius:6px;
  padding:6px 11px;font-size:12px}
.kvbox .k{color:var(--faint);font-size:11px;white-space:nowrap}
.kvbox .v{color:var(--fg);font-weight:600;font-size:13px;white-space:nowrap;
  font-variant-numeric:tabular-nums}
.kvbox .v .meta{font-family:-apple-system,"PingFang SC",sans-serif;font-weight:400}

/* ── 形态历史·突破后表现(2026-08-31)──────────────────────────────────────
   表里只放「收盘对突破日」三列;最高/最低在选中行的明细里 —— 一行塞九个数
   这张表就没法扫了(它只有半屏宽)。 */
.hist .hhead td{color:var(--faint);font-size:10.5px;font-weight:600;
  padding-bottom:2px;border:0}
.hist td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
/* 选中行的附加行:同一张表里,列宽自动与上面三列对齐(另起一块就会错开)。
   底色比主行浅一档,让人看出它们是挂在上一行下面的。 */
.hist tr.hsub td{border-top:0;padding-top:1px;padding-bottom:1px;
  background:rgba(255,255,255,.025);font-size:11.5px}
.hist tr.hsub:last-child td{padding-bottom:6px}
.hist tr.hsub td.hsubk{color:var(--faint);text-align:right;padding-right:8px}
/* 基准价:并在「基准 2024-09-24 收盘」后面,不单独占列(单独占列时它右对齐
   落在「突破后20日」底下,看着像那一列的值)。 */
.hist tr.hsub .hbase{color:var(--fg);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-variant-numeric:tabular-nums}

/* ── 形态历史·窄屏排布(2026-08-31,真机 iPhone 17 上定的)──────────────────
   六列在手机上塞不下:375px 视口里表格要 416px,浏览器把「突破后5日」整列
   压成 0 宽(不是截断,是整列消失),右边再溢出 72px。

   **窄屏不用表格。** 试过在同一张表里用 colspan 拼两行,不行 —— 表格的自动
   列宽照所有行去算,长区间把整张表撑得比卡片还宽 21px,三个数的横坐标也各行
   各位(实测 179/165/161)。改成块 + 3 等分栅格:列位置由栅格定,与内容无关。
   一个数都不藏 —— 与 app.js 里 NARROW 那套注释同一条规矩。 */
.hlist{display:block}
.hlist .hitem{padding:7px 0;border-top:1px solid var(--line);cursor:pointer}
/* 分隔线画在**上边**:「未突破」那些没有第二行,靠下边线分组会和下一条粘成一块 */
.hlist .hitem:first-child{border-top:0}
/* 选中态与宽屏那张表同色(#f0518a),不另挑一个 —— 同一个「选中」在两种排布下
   长得不一样,人会以为是两回事 */
.hlist .hitem.on{background:rgba(240,81,138,.10);box-shadow:inset 2px 0 0 #f0518a}
.hlist .hitem{padding-left:8px;padding-right:2px}
.hlist .hitem.now .nhead b{color:var(--muted)}
.hlist .nhead{display:flex;align-items:baseline;gap:8px;min-width:0}
.hlist .nhead b{font-weight:600;color:var(--fg);white-space:nowrap}
/* 区间可以缩:它是三段里唯一能让步的(形态名和结局都不能截) */
.hlist .nhead .nspan{color:var(--muted);font-size:11.5px;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.hlist .nhead .nout{margin-left:auto;white-space:nowrap;font-size:12.5px;flex:none}
/* 三个数:等分栅格 —— 各行的 5日/10日/20日 才会在同一条竖线上 */
.hlist .nperf{display:grid;grid-template-columns:repeat(3,1fr);gap:0;margin-top:2px}
.hlist .nperf>span{display:flex;justify-content:space-between;align-items:baseline;gap:5px;
  padding-right:10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-variant-numeric:tabular-nums;font-size:12px;white-space:nowrap}
.hlist .nperf>span:last-child{padding-right:0}
.hlist .nperf>span i{color:var(--faint);font-style:normal;font-size:10.5px;
  font-family:-apple-system,"PingFang SC",sans-serif}
/* 选中时的 3×3:行标一列 + 三个窗口,和上面的 nperf 用同一套等分 */
.hlist .nbase{color:var(--faint);font-size:11px;padding:5px 0 3px}
.hlist .ngrid{display:block}
.hlist .ngrow{display:grid;grid-template-columns:74px repeat(3,1fr);align-items:baseline;
  padding:2px 0}
.hlist .ngrow>i{color:var(--faint);font-style:normal;font-size:11px;
  font-family:-apple-system,"PingFang SC",sans-serif;white-space:nowrap}
.hlist .ngrow>span{text-align:right;padding-right:10px;font-size:12px;
  font-variant-numeric:tabular-nums}
.hlist .ngrow>span:last-child{padding-right:0}
.hlist .ngrow.ngh>span{color:var(--faint);font-size:10.5px}

/* 「成长与质量」那排在手机上必须等宽等列 —— flex-wrap 按内容排,手机上排成
   3/4/4 的参差,每个盒子还都不一样宽(实测 178/178/162 · 176/118/148/158)。
   站主对这个特别敏感:「你看这四张卡片,都不一样大的」。
   窄屏改成两列固定栅格:列数固定、宽度相等,竖着也就对齐了。 */
@media (max-width:640px){
  .statboxes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}
  .statboxes .kvbox{min-width:0}
  .statboxes .kvbox .v{white-space:normal;overflow-wrap:anywhere}
}

/* 收盘后那三小时的横条(2026-08-31)。**缝合上就自己消失**,所以它不必好看到
   要长住 —— 但必须一眼看见:站主原话「有时候没有收藏的票他今天走势很强，
   突破了，我都不知道」。 */
.gapstrip{display:flex;align-items:center;gap:14px;text-decoration:none;color:inherit;
  background:linear-gradient(90deg,rgba(240,81,138,.10),rgba(240,81,138,.03));
  border:1px solid rgba(240,81,138,.30);border-radius:10px;padding:13px 18px;margin:0 0 18px}
.gapstrip:hover{border-color:rgba(240,81,138,.55)}
.gapstrip .gn{font-size:26px;font-weight:800;color:#f0518a;line-height:1;
  font-variant-numeric:tabular-nums}
.gapstrip .gt{display:flex;flex-direction:column;gap:2px;min-width:0}
.gapstrip .gt b{font-size:14px;font-weight:700}
.gapstrip .gt span{font-size:12px;color:var(--muted)}
.gapstrip .garr{margin-left:auto;font-size:12.5px;color:#f0518a;font-weight:600;white-space:nowrap}
@media (max-width:560px){.gapstrip{padding:11px 13px;gap:11px}.gapstrip .garr{display:none}}

/* ── 第四张卡「事件」与事件徽标(2026-09-01)──────────────────────────────
   前三张说「这只票长成什么形状」,这一张说「这只票头上有什么事」。
   一正一负,都不是推荐 —— 只标色,字面仍只陈述发生了什么。 */
.famcard2 .evtplot{align-items:center}
/* 高度交给 .fplot 那条通用规则(height:auto;max-height:190px)—— 写死高度会让
   这张卡的下半截空着,和另外三张不齐。 */
.evb{display:inline-flex;align-items:center;font-size:12px;font-weight:600;
  padding:1px 8px;border-radius:10px;margin-left:6px;white-space:nowrap}
.evb.up{color:#f0518a;background:rgba(240,81,138,.12)}
.evb.down{color:#34c062;background:rgba(52,192,98,.12)}

/* 事件卡横轴的三个刻度 —— 放在 SVG 外面用 HTML 排,SVG 里的 <text> 会被 viewBox
   一起缩放,和另外三张卡的字号对不上(那三张图里根本没有字)。
   ⚠ .fplot 本身是 flex,不改方向的话这一行会变成 SVG 右边的第二列、字竖着排。 */
.famcard2 .fplot.evtplot{flex-direction:column;align-items:stretch;justify-content:flex-end}
/* ⚠ 事件卡那张图被 max-height:118 压扁(见下面 .evtwide 那条):viewBox 是 600×170,
   高度钉在 118 之后画面按 meet 缩到 118/170×600 = 416.5px **居中**,盒子两侧留白
   (1920 档每侧 191px)。而这行刻度原本按盒子整宽排,首尾标签比曲线端点各外扩两百来像素。
   把刻度收到和画面同宽再居中,标签就落回曲线上。416.5 是常数(只跟 viewBox 和 max-height 有关),
   改那两个数的话这里要跟着改。 */
.evax{display:flex;justify-content:space-between;padding:3px 8px 0;
  font-size:11.5px;color:var(--faint);white-space:nowrap}
.evax span:nth-child(2){transform:translateX(-13%)}   /* 解禁日那条竖线不在正中 */

/* 事件卡:通栏 + 扁 —— 站主 2026-09-01「放到最底部,宽度是上面的两张卡之和,
   但可以扁一点」。它不是形态家族,所以不占 01–04 的编号(04 留给阻力支撑)。
   ⚠ .famgrid 是 auto-fit,靠 grid-column:1/-1 才能横跨;必须是最后一个孩子。 */
.famcard2.evtwide{grid-column:1 / -1}
.famcard2.evtwide .evtbody{display:flex;align-items:stretch}
.famcard2.evtwide .fplot.evtplot{flex:1 1 58%;min-width:0;padding:10px 22px 10px;
  justify-content:center}   /* 家族卡让图压在数据上,通栏这里居中 */
.famcard2.evtwide .fplot.evtplot svg{max-height:118px}   /* 家族卡是 190,这里压扁 */
.famcard2.evtwide .fstats{flex:1 1 42%;border-top:0;border-left:1px solid var(--line)}
.famcard2.evtwide .fstats.f2{grid-template-columns:repeat(2,1fr)}
.famcard2.evtwide .fstats .fs{display:flex;flex-direction:column;justify-content:center}
@media (max-width:820px){
  .famcard2.evtwide .evtbody{display:block}
  .famcard2.evtwide .fstats{border-left:0;border-top:1px solid var(--line)}
  .famcard2.evtwide .fplot.evtplot svg{max-height:150px}
}

/* 20 日强度到顶:只染色,不加字(站主 2026-09-01:「我选择标记」「不要写任何文字」)。
   用和「距触发」同一族的暖色,不用红 —— 红在站上是涨,会读反。 */
.c3 .m20h b{color:var(--warn,#c9a14e)}
td.m20h{color:var(--warn,#c9a14e)}

/* 第四张卡「严选」的图 —— 复用严选页那条十年广度曲线,但卡里要压扁一点。
   曲线自己是 preserveAspectRatio="none" 拉伸的,年份刻度和端点在 HTML 层不受影响。 */
.famcard2 .fplot.elplot{padding:14px 18px 6px;align-items:center}
.famcard2 .fplot.elplot .ecwrap{width:100%}
.famcard2 .fplot.elplot .ecmeta{display:none}   /* 那行字卡上不放,格子已经说了 */
.famcard2 .fplot.elplot svg{width:100%;height:auto;max-height:96px}

/* 严选卡的曲线:和另外三张同一套坐标,所以这里只管高度和年份刻度。
   ⚠ .fplot 本身是 flex,不改方向的话年份那一行会变成 SVG 右边的第二列。 */
.famcard2 .fplot.elplot{padding:2px 14px 0;flex-direction:column;
  align-items:stretch;justify-content:flex-end}
.famcard2 .fplot.elplot svg{width:100%;height:auto;max-height:210px}   /* 同上,和 .fplot 那条保持一致 */
.evax.elax{padding:1px 10px 0}
/* ⚠ .evtplot 是 flex column,.evax 是它的**项**;`margin:0 auto` 在交叉轴上会让项
   缩成内容宽再居中(实测缩到 117px)。要的是「固定宽度 + 居中」,得写 width + align-self。
   16 = 上面那条 .evax 自己的左右 padding 之和。 */
.famcard2.evtwide .evax{width:calc(416.5px + 16px);max-width:100%;align-self:center}
/* 严选页的返回键 —— 这一页是从首页卡片进来的,不是导航目的地 */
/* 返回键全站一个样(2026-09-02 站主:「不要让我每次都找怎么返回」):内容区左上角第一行,
   「← 返回{上一级}」。服务端页面(账号管理/运营台/交易记录)用同一组数值。 */
.backlink{display:inline-block;color:var(--muted);text-decoration:none;font-size:13px;
  padding:2px 0 12px}
.backlink:hover{color:var(--link)}
.tcard .eind{color:var(--faint);font-size:11.5px}
.tcard .inpool{white-space:nowrap}
.elitelisthd{color:var(--muted);font-size:13px;margin:18px 0 8px}

/* 打字时页面不许放大(站主 2026-09-01:「我打字的时候页面不能放大,否则很难受」)。
   iOS Safari 的老毛病:聚焦一个字号 <16px 的输入框就自动缩放整页,而且**退出时不会缩回去**。
   正解是把字号提到 16px —— 不用 maximum-scale=1,那会连双指缩放一起禁掉。
   只在窄屏改,桌面不受影响。 */
@media (max-width:900px){
  input, select, textarea, input[type="number"], input[type="date"], input[type="search"] {
    font-size:16px !important;
  }
}

/* 行上的那排小字:加了 RS20 之后,窄屏塞不下 —— 「周期」「流动」被挤成竖排换行
   (2026-09-01 在 iOS 上看出来的,是我加 RS20 那次带出来的回归)。
   ① 每一项自己不换行 ② 整排允许折成两行 ③ 题材那块窄屏不占固定宽度 */
.c3>span{white-space:nowrap}
@media (max-width:640px){
  .c3{flex-wrap:wrap;gap:6px 10px;row-gap:2px}
  .c3 .tg{max-width:none;flex:1 1 100%;text-align:left;white-space:normal;
    overflow:visible;text-overflow:clip;order:9}
  .c3 .grow{display:none}
}
/* 页头开高低那条的「盘中 HH:MM」小标(2026-09-02 实时行情补齐) */
.quote .lvt,#ohlc .lvt{font-style:normal;color:var(--accent2);font-size:11px;margin-left:8px;letter-spacing:.3px}

/* ── 全市场热力图 #/heat(2026-09-02,preview 阶段)── */
.heatpage{padding:14px 0 8px}
.heathead{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:10px}
.heattitle{margin:0;font-size:18px;font-weight:800}
.heatscope{font-size:12px;color:var(--muted);margin-top:4px}
.heatctl{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.heatctl .ltabs .lt{background:transparent;border:0;cursor:pointer;font:inherit;font-size:12.5px;font-weight:700;height:30px}
.heatctl .ltabs .lt.on{color:var(--fg);background:var(--panel2)}
.heatlegend{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--muted);margin-left:6px}
.heatlegend i{display:inline-block;width:120px;height:10px;border-radius:2px;background:linear-gradient(90deg,#30cc5a,#35764e,#414554,#bf4045,#f63538)}
.heat{position:relative;overflow:hidden;height:calc(100vh - 170px);min-height:420px;background:#0d0f14;border:1px solid var(--line);border-radius:8px}
.hg{position:absolute;box-sizing:border-box;border:1px solid rgba(255,255,255,.22);pointer-events:none}
.hgh{position:absolute;box-sizing:border-box;padding:0 5px;font-size:11px;font-weight:700;line-height:16px;color:#d7dbe6;background:#262a35;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}
.ht{position:absolute;box-sizing:border-box;border:1px solid rgba(0,0,0,.5);color:#fff;overflow:hidden;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;line-height:1.1;font-weight:700;cursor:pointer;text-shadow:0 1px 1px rgba(0,0,0,.35)}
.ht span,.ht small{display:block;white-space:nowrap}
.ht small{font-weight:600;opacity:.92;margin-top:1px}
.ht:hover{filter:brightness(1.22);z-index:2}
.htip{position:fixed;z-index:60;pointer-events:none;background:#171a22;border:1px solid var(--line2);border-radius:6px;padding:8px 11px;font-size:12px;line-height:1.5;color:var(--fg);box-shadow:0 8px 24px rgba(0,0,0,.45);white-space:nowrap}
.heatempty{padding:40px;text-align:center;color:var(--muted)}
/* 手机:顶栏 + 标题 + 两行开关 + 图例 + 底栏 ≈ 300px,余下全给图,图不许滚到底栏下面 */
@media (max-width:700px){.heat{height:calc(100vh - 300px);min-height:360px}.heattitle{font-size:16px}}
@media (max-width:560px){.idxstrip{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}.idxstrip .ic{padding:9px 10px 8px}.idxstrip .ic b{font-size:15px}.idxstrip .ic i{font-size:11px}.idxstrip .ic em{font-size:12px}}

/* ── 指数页面 #/i/(2026-09-02)── */
.ipagewrap{padding:14px 0 30px}
.dtop.ipage .dh1{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
.dtop.ipage .nm{font-size:22px;font-weight:800}
.dtop.ipage .tk{font-size:13px;color:var(--muted)}
.dtop.ipage .px{font-size:22px;font-weight:800;font-variant-numeric:tabular-nums}
.dtop.ipage .chgv{font-size:14px;font-weight:700;font-variant-numeric:tabular-nums}
.dtop.ipage .meta{font-size:12px;color:var(--faint)}
.igrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;margin-top:20px}
.icard{padding:15px 20px 17px;min-width:0;background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:hidden}
.icard .bch{margin:0 0 12px;font-size:12px;font-weight:700;color:var(--fg);display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.icard .bch em{font-style:normal;font-size:11px;font-weight:500;color:var(--faint)}
.ikgrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px 16px}
.ik{display:flex;flex-direction:column;gap:3px;min-width:0}
.ik i{font-style:normal;font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ik b{font-size:16px;font-weight:700;color:var(--fg);font-variant-numeric:tabular-nums}
.ik b em{font-style:normal;font-size:11px;font-weight:600;color:var(--muted);margin-left:2px}
.ik b em.warn{color:var(--accent2)}
.ik b .up{color:var(--up)} .ik b .down{color:var(--down)}
.ik.warn b{color:var(--accent2)} .ik.bad b{color:var(--up)}
/* 指数没有「仓位」:多头仓位那两个钮在指数页不出 */
.ipagewrap .tf [data-act="posadd"],.ipagewrap .tf [data-act="posclr"]{display:none}
.imeta{margin-top:10px;font-size:11.5px;color:var(--faint)}
.iflips{margin-top:12px;font-size:12px;color:var(--muted);display:flex;flex-direction:column;gap:4px}
.iflips i{font-style:normal;font-size:11px;color:var(--faint)}
.iflips b{color:var(--fg)}
.ispark{margin-top:12px}
.ispark .bspark{display:block;width:100%;height:44px}
.ictab{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.iccol i{display:block;font-style:normal;font-size:11px;color:var(--faint);margin-bottom:6px}
.icr{display:grid;grid-template-columns:minmax(0,1fr) 52px 60px 52px;gap:8px;align-items:baseline;font-size:12.5px;padding:3px 0;border-bottom:1px solid var(--line)}
.icr a{color:var(--fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.icr .w{color:var(--muted);text-align:right}
.icr span,.icr b{text-align:right;font-variant-numeric:tabular-nums}
.icr .up{color:var(--up)} .icr .down{color:var(--down)}
.ibars{display:flex;flex-direction:column;gap:6px}
.ib{display:grid;grid-template-columns:76px minmax(0,1fr) 52px 60px;gap:8px;align-items:center;font-size:12px}
.ibn{color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ibt{height:8px;background:var(--panel2);border-radius:4px;overflow:hidden}
.ibt i{display:block;height:100%;background:var(--link);border-radius:4px}
.ibw{text-align:right;color:var(--muted)} .ibc{text-align:right}
.ibc.up{color:var(--up)} .ibc.down{color:var(--down)}
.nhtab{width:100%;border-collapse:collapse;font-size:12.5px}
.nhtab th{font-weight:500;color:var(--faint);text-align:right;padding:2px 0 6px;font-size:11px}
.nhtab th:first-child{text-align:left}
.nhtab td{padding:4px 0;border-top:1px solid var(--line);text-align:right;font-variant-numeric:tabular-nums}
.nhtab td:first-child{text-align:left;color:var(--muted)}
.nhtab td.up{color:var(--up)} .nhtab td.down{color:var(--down)}
.rstab{width:100%;border-collapse:collapse;font-size:12.5px}
.rstab th{font-weight:500;color:var(--faint);text-align:right;padding:2px 0 6px;font-size:11px}
.rstab th:first-child{text-align:left}
.rstab td{padding:4px 0;border-top:1px solid var(--line);text-align:right;font-variant-numeric:tabular-nums}
.rstab td:first-child{text-align:left}
.rstab tr.me td{color:var(--fg);font-weight:700;background:rgba(255,255,255,.03)}
.rstab td.up{color:var(--up)} .rstab td.down{color:var(--down)}
.ilink{color:inherit}
.ilink:hover{color:var(--link)}
.idxstrip .ic{color:inherit;text-decoration:none}
.idxstrip .ic:hover{border-color:var(--line2)}
@media (max-width:900px){.igrid{grid-template-columns:1fr;gap:16px}.ikgrid{grid-template-columns:repeat(2,minmax(0,1fr))}.ictab{grid-template-columns:1fr}}
.ihist{margin-top:20px}
.ihist .hrow[data-h="-1"].on{display:none}   /* 指数页:没选中历史行时,「当下」那行没意义 */
.ihist .histpanel,.ihist #histpanel{margin:0}

/* ── 股东户数(2026-09-03,个股页「基本面」)──────────────────────────────
   **有意不着色**:全站红绿是「涨/跌」,而户数**减少**才对应看涨那一侧,
   套上去会读成「绿=坏」。这里只用 +/− 和「减少/增加」四个字。 */
.hnum .hnhead{margin:2px 0 10px;display:flex;gap:12px;align-items:baseline;flex-wrap:wrap}
.hnum .hnhead b{font-size:17px}
.hnum .hntab{width:100%;border-collapse:collapse;font-size:13px}
.hnum .hntab th{text-align:left;font-weight:500;color:var(--faint);padding:3px 8px 5px 0;
  border-bottom:1px solid var(--line2)}
.hnum .hntab th.n,.hnum .hntab td.n{text-align:right;padding-right:0}
.hnum .hntab td{padding:4px 8px 4px 0;border-bottom:1px solid var(--line2)}
.hnum .hntab tr:last-child td{border-bottom:0}
