Files
ycode/docs/统一字体与间距-2026-10-15.md
T

59 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 统一字体与间距
WorkBuddy 有统一的字体与间距处理。本轮将已核实的全局字号机制和标准 token 接入 YCode,修复原先只改两个变量、静态字号消费者不随档位变化的问题。本轮完成的是公共基础层,不是每个组件最终外观的像素验收。
## REA 证据
- 字号行为来自既有 REA runtime Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb` 的 `app-core-DN1jMv6r.js`,SHA-256 `e19055ad9feca6a9ccc2e60d00b191afac90c4cd3948113a81cb72196e66c260`。六档表约在 UTF-16 offset 21817;覆盖函数 `[23603,26434)`;应用与事件 `[26434,27496)`;快捷键 `[27703,28465)`;WB token 覆盖表 `[29292,30500)`。
- 快捷键避让逻辑来自同一 REA 导出的 `browser-zoom-hotkeys-CInnb_kx.js`,SHA-256 `20c206bc9a675bfbf2d45818b35e94cb8539e42169dcb47cd030a208447d92b8`。它避让已注册且聚焦的浏览器预览缩放目标,并非排除输入框。
- 通过 REA `extract_artifact` 重新读取本地历史资源 ZIP,Evidence `ev_267e2188e816796acee76650153ab5a1c1f902e3a761d686979d2fe9926eed07`。本轮只读取 REA 新输出目录中的文件,没有直接读取原版安装目录或旧手工提取目录。
- 对当前 WorkBuddy 5.8.2 ASAR 重新执行 REA inventory,Evidence `ev_97959691fb7cabf7c41f948b08332196924fec1fa8cb71e34dbafd65d912e637`;ASAR SHA-256 `035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918`。三份 CSS 的 artifact ID 与 ZIP 提取结果完全一致,原包 occurrence 均为 `hash_status: verified`。因此使用的 CSS 不仅有旧文件名依据,还有当前安装包的身份匹配。
本轮产品实际使用 `tokens-Df-i-zsO.css`,SHA-256 `13f2bf82c96e5167a7d7098e36950c6c22c475b3337dbb8bb29ad2fe79cde696`,artifact `art_a0886b61c79588910cdbcd7819dd236f5cc318b81430b31eabde93158982fc7d`。匹配的另外两份是 `contexts-BkjwYSZT.css`(SHA `50cbd673f7f35fc7f966bdddc6c9f5677fdfe944cb904888d214619fca259380`)和 `agent-chat-pane-F5lfde1Z.css`(SHA `a09e1806f1b3dbed21432858357c876ebb6b878ed499069361e7b42ef557421c`)。它们不包含当前 `cr-*` 对话组件全部样式,不能冒充完整组件 CSS。
## 公共机制
| 层 | 已确认的行为 |
| --- | --- |
| 基础 token | 字号、字重、行高、等宽字体、标准 spacing、控件字号/尺寸等统一定义 |
| 六档字号 | Markdown 根字号为 16、17.143、18.286、20.571、22.857、26.286px;原始偏移为 -1、0、1、2、3、4 |
| 控件偏移 | 消费时使用 `clamp(-1, globalOffset, 2)`;高档位继续放大正文,普通控件封顶 +2px |
| 静态字号 | 扫描可读 CSSOM 的 px 与带 px fallback 的 `var()`,以 fallback 数值为基准生成 `max(8px, base + offset)`;保留原版 media 分支与去重语义 |
| 固定区域 | `.cb-font-size-fixed` 及后代跳过静态字号覆盖,并还原 WB 语义 token 基准值 |
| 动态样式 | 监听 head/body 直接新增的 style/stylesheet link,100ms 后重新构建覆盖;offset=0 移除覆盖 |
| 标准间距 | 0、2、4、5、8、12、16、20、24、32、40、48、64px;它们不跟随字号缩放 |
## 工程变化
- `workbuddy/typography/tokens.css` 保留 115 个经 REA 验证的原版 root 声明,由 `scripts/rea/recover-typography-reference.mjs` 生成;脚本核对 REA 提取摘要及当前 ASAR artifact 身份后才读输入。
- `styles/tokens.css` 中 59 个本地字号、字重、行高和间距定义改成原版 WB token 的别名,通用语义体例不再自行叠加第二份偏移。固定区域重新声明语义别名,避免 CSS 自定义属性在 root 提前求值后继承,导致固定区域仍放大。
- `workbuddy/typography/font-size.ts` 恢复 px/fallback 扫描、原版 WB token override、固定例外、观察器和快捷键解析;`fontSize.ts` 保留 YCode 的存储与事件合同,同时补齐 CB/WB 兼容变量与事件。输入框聚焦时快捷键有效。
- 现有静态字号消费者增加明确的 px fallback,让统一扫描器处理用户气泡、代码、菜单和资源预览等;根字号和已经动态处理的语义 token 使用无 fallback 的变量,避免重复调整。
YCode 存储键、初始化清理和兼容事件接线是本地适配。没有访问或迁移 WorkBuddy 用户偏好,也没有接入尚不存在的 WorkBuddy host preference、快捷键录制状态或浏览器预览目标。普通界面的 sans 字体回退链仍是当前实现;本轮原版 token 能直接证明等宽字体定义,不能证明当前机器最终选中的中文字体与原版一致。
## 验证
`npm run test:font-size`:57 项检查通过,覆盖六档映射、原版 fallback 数字解析、media 去重、静态字号下限、固定区域 token、注入/清理、后加载样式重建与快捷键。`npm run build`:类型检查和实际产物构建通过。
通过自有构建产物 `?fixture=typography` 在 Chromium 内实际按快捷键切换六档并读取计算样式。输入框保持焦点,检查非零档仅有两份 override,重复切档不累积;最大档刷新后仍为 6,Ctrl+0 回到标准档并移除 override;未出现页面横向溢出或控制台错误。
| 档位 | 正文 px(约值) | 用户气泡 px | 代码 px | 通用 body token px | 固定 body token px | 当前段落下边距 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| 1 | 14 | 12 | 11.857 | 13 | 14 | 12px |
| 2 | 15 | 13 | 12.857 | 14 | 14 | 12px |
| 3 | 16 | 14 | 13.857 | 15 | 14 | 12px |
| 4 | 18 | 15 | 14.857 | 16 | 14 | 12px |
| 5 | 20 | 15 | 14.857 | 16 | 14 | 12px |
| 6 | 23 | 15 | 14.857 | 16 | 14 | 12px |
表中是 YCode 现有组件基准值接入统一机制后的实测,不是新采集的 WorkBuddy 计算样式。正文 root/比例及代码基准仍需组件 CSS 对照;本轮没有将所有字号和行高强行等比缩放。
样本 `scripts/fixtures/typography.mjs`,测量 `.tmp/typography-browser-measurements-2026-10-15.json`,截图 `.tmp/typography-default-2026-10-15.png`、`.tmp/typography-level-6-2026-10-15.png`。只使用离线假会话,未向模型发送消息;浏览器字号已恢复标准档。
## 剩余边界
标准 token 已统一;每个组件实际选用的 margin/padding/gap、正文嵌套样式、头像与正文距离、字体实际回退和逐像素布局仍需 REA 的组件样式/运行时证据。当前段落下边距 12px 只是已有组件选择,本轮验证了其来自标准 token,不等于完成原版段距验收。保留的本地间距 56px 和行高 26px 等扩展也不应声称是已核实的同名原版 token。
REA 原版截图仍有上一轮 `target_not_allowed` 限制。本轮没有绕过它,也未重启原版或正在运行的 YCode 原生窗口。