/* ---------------------------------------------------------------------------
   代码字体：Cascadia Code（自托管）

   选它的理由：Windows Terminal 和 VSCode 的默认等宽字体就是它，学生对这个
   字形有亲切感，看着文档里的代码和自己在编辑器里看到的是一回事。

   只打包 latin 子集——代码块内容是纯 ASCII 的 C 代码，不需要中文字形，
   体积因此从 3 MB 降到 100 KB。

   授权 SIL OFL 1.1，允许自由分发与自托管。
   --------------------------------------------------------------------------- */

@font-face {
  font-family: "Cascadia Code";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../fonts/cascadia-code-latin-400-normal.woff2") format("woff2");
}

@font-face {
  font-family: "Cascadia Code";
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url("../fonts/cascadia-code-latin-400-italic.woff2") format("woff2");
}

@font-face {
  font-family: "Cascadia Code";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("../fonts/cascadia-code-latin-700-normal.woff2") format("woff2");
}

/* ---------------------------------------------------------------------------
   代码块的完整字体栈

   分两段：前半段管 ASCII，后半段管中文。

     1. Cascadia Code —— 代码主字体。只打包了 latin 子集，没有汉字
     2. 等宽兜底 —— Cascadia 加载失败时顶上，同样只管 ASCII
     3. 正文那一套 —— 本站展开就是
        Roboto, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif

   第 3 组也没有汉字，中文最终由浏览器交给系统中文字体去接 —— 而这正是正文
   走的那条路，所以代码块里的中文和正文里的中文是同一个字体。

   第 3 组写成 var(--md-text-font-family) 而不是把 Roboto 那串抄一遍：正文以后
   换字体时这里自动跟着换，不会漏改。Material 把 --md-text-font-family 定义在
   body 上，和下面这条挂在同一个元素，引用同元素的自定义属性没有先后问题。

   顺序仍然是「先等宽、再正文」：第 1、2 组没有汉字，中文不会在这里停下，所以
   这个顺序不影响中文；但反过来把正文那套插到前面，一旦 Cascadia 加载失败，
   ASCII 就会用上比例字体，代码块会歪掉。

   末尾特意不再补一个通用 monospace。通用 monospace 是含汉字的（Windows 上是
   宋体），排在正文那套之后的话，中文会停在它那里，就又不是正文的字体了。

   代价：中文注释不再等宽，和上下行 ASCII 的列对不齐。这是刻意的取舍 —— 换来
   的是「代码里的中文和正文看起来是一套字」。
   --------------------------------------------------------------------------- */

/* 选择器必须是 body，不能写 :root —— 这是个很容易踩的坑。

   Material 自己就是把 --md-code-font-family 定义在 body 上的：
       body{ ...--md-code-font-family:var(--md-code-font,_),SFMono-Regular,
             Consolas,Menlo,monospace }
   自定义属性同样遵循层叠，而「元素自己声明的值」永远压过「从父元素继承来的
   值」。写在 :root 上只是给了 html 一个值，body 会用自己的声明把它盖掉，
   等于整段白写 —— 浏览器就退回 SFMono-Regular / Consolas，看起来「字体没
   生效」。

   写成 body 后靠加载顺序取胜：mkdocs 把 extra_css 排在主题样式之后，同为
   body 选择器（优先级 0,0,1）时后加载的赢。
   --------------------------------------------------------------------------- */

body {
  --md-code-font-family:
    /* 1. 代码主字体（latin 子集） */
    "Cascadia Code",
    /* 2. 等宽兜底，只管 ASCII */
    SFMono-Regular, Consolas, Menlo,
    /* 3. 中文跟着正文走 */
    var(--md-text-font-family);
}

/* ---------------------------------------------------------------------------
   关闭编程连字

   Cascadia Code 默认把 != 渲染成 ≠、>= 渲染成 ≥、=> 渲染成箭头。这些连字
   在 VSCode 里看着舒服，但文档是给学生「照着抄」用的：一年级学生看到 ≠
   很可能直接去输入 ≠，而键盘上根本没有这个字符。所以这里全局关掉，让代码
   显示成它本来的样子。

   三个属性都要写：
     font-variant-ligatures 是高层属性，管标准连字（liga / clig）
     font-feature-settings 是底层开关，coding ligature 主要靠 calt
       （contextual alternates），只关前者不足以生效
   --------------------------------------------------------------------------- */

.md-typeset code,
.md-typeset pre,
.md-typeset kbd,
.highlight {
  font-variant-ligatures: none;
  font-feature-settings: "liga" 0, "clig" 0, "calt" 0;
}
