/* ============================================================================
 * fonts.css · 自托管字体（LEGAL-02）
 *
 * 这两个字族以前从 fonts.googleapis.com 加载。那一行 <link> 会让**每一个**读者
 * 的浏览器在打开页面时向 Google 发一次请求，带 IP 与 User-Agent —— 慕尼黑地方法院
 * 2022 年判过这件事（LG München, 3 O 17493/20）：把 IP 传给 Google Fonts 是个人
 * 数据处理，没有法律依据就是侵犯 GDPR。审计里这条是 P1 上线前。
 *
 * 文件与描述符的来源，逐项可核：
 *
 *   · 9 个 woff2 从 fonts.gstatic.com 原样下载（2026-11-11），sha256 记在
 *     handover.md 的本批记录里，字节与读者此前从 Google 拿到的一致 —— 所以
 *     渲染不可能变，变的只是请求去了哪里。
 *   · 每个 @font-face 的描述符（font-weight / font-stretch / font-display /
 *     unicode-range）逐字抄自 Google css2 的响应，只把 url() 改成本地路径。
 *     改一个字都可能让排版漂一点，所以这里没有"顺手优化"。
 *   · 许可：两个字族都是 SIL OFL 1.1，全文在 app/fonts/OFL-*.txt。
 *
 * 两件容易被"精简"掉、但精简了就会出错的事：
 *
 *   1. **9 个子集一个都不能删**。unicode-range 决定浏览器只下载用得到的那几个，
 *      所以全带上不等于全加载；而删掉 cyrillic / vietnamese 之后，一个俄语或
 *      越南语的关键词（keywords.language_code 就是为这件事存在的）会静默退回
 *      Helvetica —— 屏上没有任何报错，只有字变丑了一点。
 *   2. **Archivo 的 font-stretch 必须留着**。`font-variation-settings:"wdth"` 在
 *      app.css 里出现五处：.brand(85, wdth 96)、.h-page(154, 94)、.h-sec(160, 96)、
 *      .auth-h(972, 94)、.auth-claim(991, 92)——后两处是登录页，也就是读者见到
 *      的第一屏。靠的是可变字体的宽度轴；换成静态实例之后这五处会安静地按
 *      wdth 100 渲染，标题的紧凑感就没了，而任何一条测试都不会红。
 *      （现在会红了：e2e 测试 13 查 stretch 声明，测试 14 的变异 M3 验过。）
 *
 * 刷新方式：重新请求 css2（**要带现代浏览器的 User-Agent**，旧 UA 拿到的是
 * ttf），比对 sha256；变了就换文件并在 handover 记一行。
 *
 * CSP：_headers 的 font-src 只有 'self'，所以就算有人把 CDN 链接加回来，浏览器
 * 也会拦掉 —— 但拦截的表现是"字没了"，不是"测试红了"，e2e 里有一条守着这件事。
 * ========================================================================== */

/* vietnamese */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 400 800;
  font-stretch: 75% 110%;
  font-display: swap;
  src: url('../fonts/archivo-vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 400 800;
  font-stretch: 75% 110%;
  font-display: swap;
  src: url('../fonts/archivo-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 400 800;
  font-stretch: 75% 110%;
  font-display: swap;
  src: url('../fonts/archivo-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Geist Mono';
  font-style: normal;
  font-weight: 300 600;
  font-display: swap;
  src: url('../fonts/geist-mono-cyrillic-ext.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Geist Mono';
  font-style: normal;
  font-weight: 300 600;
  font-display: swap;
  src: url('../fonts/geist-mono-cyrillic.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* symbols2 */
@font-face {
  font-family: 'Geist Mono';
  font-style: normal;
  font-weight: 300 600;
  font-display: swap;
  src: url('../fonts/geist-mono-symbols2.woff2') format('woff2');
  unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;
}
/* vietnamese */
@font-face {
  font-family: 'Geist Mono';
  font-style: normal;
  font-weight: 300 600;
  font-display: swap;
  src: url('../fonts/geist-mono-vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Geist Mono';
  font-style: normal;
  font-weight: 300 600;
  font-display: swap;
  src: url('../fonts/geist-mono-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Geist Mono';
  font-style: normal;
  font-weight: 300 600;
  font-display: swap;
  src: url('../fonts/geist-mono-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
