主题
theme · 主题与排版量
把「颜色名 + 字号」解析成具体值。产出切成两半:排版量给 layout 量文字,调色板给 build 上色。
导出
resolveTheme、resolveToken、ResolvedTheme、ThemeInput、Typography、TokenValue、DEFAULT_TOKENS、DEFAULT_TYPOGRAPHY。
签名
ts
type TokenValue = string | number;
type Typography = { fontFamily: string; fontSize: number; lineHeight: number; captionSize: number };
type ThemeInput = {
tokens?: Record<string, TokenValue>;
typography?: Partial<Typography>;
typeStyles?: Record<string, StyleDecl>;
};
type ResolvedTheme = {
tokens: Record<string, TokenValue>;
typography: Typography;
typeStyles: Record<string, StyleDecl>;
};
function resolveTheme(input?: ThemeInput): Result<ResolvedTheme>;
function resolveToken(
value: TokenValue | { token: string } | undefined,
tokens: Record<string, TokenValue>,
diagnostics: Diagnostic[],
subject?: string,
): TokenValue | undefined;三类产出
| 半边 | 给谁 | 为什么 |
|---|---|---|
typography | layout(度量) | 行高 / 字号参与尺寸计算 |
tokens | build(上色) | 调色板与几何无关 |
typeStyles | build(类型默认外观) | 同一类 shape / edge 共用样式 |
只做:合并输入与默认值,产出具体值。 绝不做:不认识 DrawDocument、不认识节点类型、不量文本。
未知 token 不在这里报
resolveTheme 只收到 ThemeInput,看不到文档引用了哪些 token,物理上无从判断「未知」。 因此 UNKNOWN_TOKEN 由 build 在解析样式时产生。
非法排版量(如 fontSize: 0)是可回落的:默认值永远可用,所以返回 ok: true + TYPOGRAPHY_INVALID 警告,而不是 ok: false。
相关 BDD
C5(换 tokens → 几何不变、只有样式变)· C6(未知 token → 回落 + 诊断)· E1(非法 typography 回落)。