/* 字体策略 (2026-09-15 定, 别再改回去)
   只保留「大标题」用的 Noto Serif SC 900 子集 —— 页面里 var(--serif) 的地方
   全部是 font-weight:900, 所以 600/700 两档已经删掉。
   正文/按钮/标签走系统字体栈(见 tokens.css 的 --sans), 不再打包 sans 子集。

   子集字符集 = 「衬线元素实际渲染到的字」, 不是全站用字:
     · 审计脚本 _serif-audit.mjs (工作区) 跑 9 条路由 × 2 视口, 导航页翻遍分页,
       逐张打开 16 个致谢弹窗 + 首页 5 个飞轮弹窗, 并让三个工具页各"用一次"
       (指标数字是输入之后才渲染的, 空着扫不到; 序号切换页还要真喂一份 docx,
        它的标题树/预览/警示条全是拖进文件之后才存在)
     · 命中 .hero-title/.sec-title/.wheel-center/.evidence-num/.finale-title/
       .wheel-panel-title + 导航页 7 个选择器 + 工具页 .navhero-title/.toolpanel-title/
       .toolmetric-value / .numscheme-name
     · 再加上一档「缓冲常用字」, 换文案时不至于立刻掉字
   v10 = 371 字形 / 77.6 KB, 给「序号切换」补了 18 个字
   (切别后序把拖标的章第节览论识这里预 —— 全是新工具页的用字)。
   v9 = 327 字形 / 66 KB。v8 是 298 字形 / 58 KB, 但它漏掉两个工具页 ——
   「目录解析 引号转换 粘贴 结果 输入 文本」这 16 个字不在库里, 浏览器逐字回退
   系统宋体, 于是工具页标题看起来"字体不对、比别人细一档"。
   ⚠ 路由清单漏一个页面类型 = 那个页面的标题字全掉回系统字体, 且不会有任何报错。
     _serif-audit.mjs 的 ROUTES 必须覆盖「所有会用 var(--serif) 的页面类型」,
     而且**动态生成的内容要在扫描前先触发出来**(拖文件/点示例/翻分页)。

   少任何一个字都会让那个字掉回系统字体、看起来"突然变细"。

   ⚠ 维护规则: 凡是改动 var(--serif) 元素里的文字(标题/飞轮节点/分类名首字/工具页标题),
     都要重跑一次 _serif-audit.mjs → 用 font-subset-fix 技能的
     subset_from_charset.py 裁新版本(换版本号)、删旧文件(排除本次输出)、
     把本文件的 .v10 与所有 html 里的 fonts.css?v= 一起升级。
     用 font-subset-fix 技能可走同一套流程。

   font-display 用 block 而不是 swap:
     本子集只覆盖标题字, 一旦某字不在库里, swap 会先把该字用系统宋体画出来、
     子集到了再换掉 —— 表现就是"标题先细后粗闪一下"。
     block 在那段极短窗口里不画标题字(配 <head> 里的 preload, 本地/快网毫秒级),
     宁可晚一帧, 也不给用户看两次不同字形。 */
@font-face{font-family:"Noto Serif SC";src:url(../assets/fonts/noto-serif-sc-900.v10.woff2) format("woff2");font-weight:900;font-style:normal;font-display:block}
