mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-18 14:37:19 +08:00
4391e14155
新增 `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 模块接入入口。