Files
AtomUI/docs/modules/fonts
chinboy 4391e14155 docs(Typography): define font subsystem architecture
新增 `docs/architecture/systems/typography/`,记录字体子系统的当前架构。此前字体只有
`docs/modules/fonts/overview.md` 一页概览,跨模块的契约、派生算法和边界没有正式所有者。

字体跨 `AtomUI.Core`、两个 `AtomUI.Fonts.*` 包、`AtomUI.Controls` 和消费控件,按文档分类规范
属于 `architecture/systems/`。核心结论是它由两条互不相干的轴组成:字体资源注册进 Avalonia
`FontManager`,与主题编译字号行高 Token,两者只在解析 `FontFamily` 字符串时汇合,没有任何代码
把它们对账。

按职责拆成六篇:overview 定位与两轴架构;font-packages 讲 `FontCollection` 与注册入口;
font-family-resolution 讲回退链、覆盖路径与注入时序;tokens-and-derivation 讲 23 个 Token 的
分级与 `e^(i/5)` 阶梯算法;consumption 讲 AXAML 与 C# 消费面和相对行高换算;verification 讲
AOT、兼容性、验证要求与已知不一致。

记录三处已确认的实现问题,均经源码核对:

- Compact 算法不压缩字号。`CalculateFontMapTokenValues` 以 `FontSize` 而非 `FontSizeSM` 为基数,
  且第 1 档强制等于基数使重算幂等,因此 Compact 与 Default 的字体 Token 完全相同。上游 antd
  compact 取 `fontSizeSM`,`FontSize = 14` 时应得 12 而非 14。共享派生函数里还留着上游那句
  `// Smaller size font-size as base` 注释,位置已使其不再成立。
- 默认字体族首项 `fonts:AlibabaSans` 是前向引用。`AtomUI.Core` 不依赖字体包,`AtomUI.Controls`
  的项目引用也不含 `AddFontCollection`;未注册时 Avalonia 静默回退,全程无诊断信号。
- 相对行高到绝对行高的换算在五个控件中各写一遍,无共享 helper,且必须同时监听行高与字号两个
  属性才不会在字号变化后失配。

同步在 `docs/overview.md`、Architecture 与 systems 导航、主题系统导航和 Fonts 模块接入入口。
2026-08-10 14:25:44 +08:00
..