主题与配色
主题就是一张普通对象:src/theme/ICETheme.ts 里的 ICE_LIGHT_THEME / ICE_DARK_THEME。
iceUIManager(ICEManager 单例)持有"当前用哪套"。
import { iceUIManager } from 'ice-web-components';
iceUIManager.setTheme('dark'); // 'light' | 'dark'
const theme = iceUIManager.getTheme();
theme.colors.primary; // '#0d6efd'
✅ 组件样式槽里放的是"主题引用"(
token('ui.colors.text')),引擎在 paint 时解析 —— 所以setTheme()之后不用重建组件树,下一帧就是新色。见第七节。
token()是引擎(ice-render)的东西,本包不再导出同名的(两边导出集合保持零重叠, 见tests/exports.unique.test.ts)—— 应用里同时装两个包时,从ice-render取:import { token } from 'ice-render';
一、token 分组
1.1 哪个底用哪一档(2026-09-17 立,改主题前先看这张表)
同一支语义色在不同底上有不同的名字,用错档就是"颜色不对"(而且不报错)。这张表由
tests/theme-contrast.test.ts 逐条钉住,五套出厂主题(浅 / 深 / 高对比 / 街机 / XP)全部要过:
| 我要画的东西 | 用哪个 token | 判据(WCAG 2.1) |
|---|---|---|
| 正文 | text | ≥ 4.5:1(对 surface / background / elevated 三种底) |
| 次级正文 | textSecondary | ≥ 4.5:1 |
| 链接 / 数值 / 强调标题 / ✓✕ 这类字形 | link | ≥ 4.5:1 |
| 提示语 / 占位符 / 辅助说明 | textTertiary | ≥ 3:1(不承担正文,但也别低到看不见) |
| 状态实色底(Alert / Tag 实底、进度条填充) | success / warning / … | 与相邻色的边界 ≥ 3:1 |
| 状态浅底上的文字 | successTextEmphasis / … | ≥ 4.5:1(对各自的 *Bg) |
| 主色底上的文字(按钮标签) | primaryText | ≥ 4.5:1 |
| 填充 / 描边(按钮底、选中框、滑块轨道、拖拽指示条) | primary 及状态实色 | 填充不参与文字判据 |
| 聚焦环 / 选中框 | focusRing | ≥ 3:1(非文本 UI 部件) |
| 描边 | border / borderSecondary | 不设阈值:装饰性(要立" |