@bytechain.cn/colamd-themes 0.3.2 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/.claude/skills/colamd-themes-preview.skill.md +333 -0
  2. package/.claude/skills/colamd-themes.skill.md +10 -0
  3. package/.dsh/skills/colamd-themes/SKILL.md +14 -0
  4. package/.github/supported-topics.yml +17 -0
  5. package/.hermes/skills/tools/colamd-themes/SKILL.md +14 -0
  6. package/.openclaw/skills/colamd-themes/SKILL.md +1 -37
  7. package/.opencode/skills/colamd-themes/SKILL.md +17 -0
  8. package/.trae/rules/colamd-themes.md +0 -36
  9. package/CHANGELOG.md +331 -241
  10. package/DSH_SUPPORT_SUMMARY.md +87 -0
  11. package/README.md +414 -384
  12. package/README_CN.md +412 -384
  13. package/RELEASENOTE.md +541 -389
  14. package/dist/cli.js +36 -55
  15. package/dist/cli.js.map +1 -1
  16. package/dist/color-utils.d.ts +1 -0
  17. package/dist/color-utils.js +25 -6
  18. package/dist/color-utils.js.map +1 -1
  19. package/dist/extractors/pdf-extractor.js +6 -1
  20. package/dist/extractors/pdf-extractor.js.map +1 -1
  21. package/dist/extractors/url-extractor.d.ts +0 -4
  22. package/dist/extractors/url-extractor.js +13 -126
  23. package/dist/extractors/url-extractor.js.map +1 -1
  24. package/dist/generator.d.ts +1 -1
  25. package/dist/generator.js +32 -11
  26. package/dist/generator.js.map +1 -1
  27. package/dist/models.d.ts +5 -4
  28. package/dist/models.js +2 -3
  29. package/dist/models.js.map +1 -1
  30. package/dist/renderer.d.ts +6 -3
  31. package/dist/renderer.js +54 -93
  32. package/dist/renderer.js.map +1 -1
  33. package/dist/templates/template.css +220 -498
  34. package/dist/templates/theme-paradigm.md +530 -658
  35. package/dist/templates/theme-template.hbs +256 -370
  36. package/dist/theme-store.js +19 -3
  37. package/dist/theme-store.js.map +1 -1
  38. package/dist/utils/document-paradigm.d.ts +12 -0
  39. package/dist/utils/document-paradigm.js +109 -0
  40. package/dist/utils/document-paradigm.js.map +1 -0
  41. package/dist/validators.d.ts +4 -1
  42. package/dist/validators.js +115 -1
  43. package/dist/validators.js.map +1 -1
  44. package/mcp-server/dist/index.d.ts +13 -0
  45. package/mcp-server/dist/index.d.ts.map +1 -0
  46. package/mcp-server/dist/index.js +0 -0
  47. package/mcp-server/dist/index.js.map +1 -0
  48. package/mcp-server/package-lock.json +1759 -0
  49. package/mcp-server/package.json +24 -0
  50. package/mcp-server/src/index.ts +0 -0
  51. package/mcp-server/tsconfig.json +19 -0
  52. package/package.json +54 -36
  53. package/skills/build-skills.sh +30 -5
  54. package/skills/colamd-themes/SKILL.md +180 -178
  55. package/src/cli.ts +474 -487
  56. package/src/color-systems.ts +289 -289
  57. package/src/color-utils.ts +137 -120
  58. package/src/contrast.ts +66 -66
  59. package/src/docx-style-paradigm.ts +811 -811
  60. package/src/export-cli.ts +356 -356
  61. package/src/extractors/base.ts +8 -8
  62. package/src/extractors/docx-extractor.ts +417 -417
  63. package/src/extractors/pdf-extractor.ts +533 -527
  64. package/src/extractors/url-extractor.ts +846 -981
  65. package/src/generator.ts +197 -169
  66. package/src/index.ts +29 -29
  67. package/src/models.ts +212 -212
  68. package/src/renderer.ts +310 -359
  69. package/src/templates/template.css +220 -498
  70. package/src/templates/theme-paradigm.md +530 -658
  71. package/src/templates/theme-template.hbs +256 -370
  72. package/src/theme-store.ts +185 -170
  73. package/src/types/pdf-parse.d.ts +12 -12
  74. package/src/utils/cli-utils.ts +84 -84
  75. package/src/utils/document-paradigm.ts +118 -0
  76. package/src/validators.ts +298 -176
  77. package/themes/academic-paper-pt.css +353 -1805
  78. package/themes/academic-paper.css +350 -1099
  79. package/themes/academic-style.css +342 -2430
  80. package/themes/colly.css +256 -370
  81. package/themes/elegant.css +288 -671
  82. package/themes/forest-ink.css +240 -664
  83. package/themes/guizang.css +250 -732
  84. package/themes/hermes-security.css +279 -0
  85. package/themes/meeting-minutes.css +256 -370
  86. package/themes/pixso-design.css +278 -1261
  87. package/themes/salvator-blog.css +256 -370
  88. package/themes/shimo-theme.css +256 -0
  89. package/themes/swiss-design.css +285 -746
  90. package/themes/template.css +220 -498
  91. package/themes/trae-blue.css +280 -737
  92. package/themes/word-contract.css +249 -0
  93. package/themes-preview/demo-content.md +187 -187
  94. package/tsconfig.json +18 -18
  95. package/src/mermaid-presets.ts +0 -142
  96. package/themes/swiss-design copy.css +0 -746
  97. package/themes-preview/colly-preview.html +0 -623
  98. package/themes-preview/meeting-minutes-preview.html +0 -625
  99. package/themes-preview/salvator-blog-preview.html +0 -623
@@ -1,658 +1,530 @@
1
- # ColaMD CSS 主题定义范式 v3.0
2
-
3
- **适用范围**:ColaMD `themes/*.css` 用户主题文件的编写与 AI 辅助生成
4
- **最后更新**:2026-05-23
5
- **关联文件**:`themes/template.css`(范式配套模板)
6
-
7
- ---
8
-
9
- ## 1. 设计目标
10
-
11
- ### 1.1 核心原则
12
-
13
- | 原则 | 说明 |
14
- |------|------|
15
- | **变量化** | 颜色、字体、字号、间距一律通过 CSS 自定义属性定义。选择器规则中禁止出现裸色值(`#xxx`)、裸字号(`12pt`)、裸字体名 |
16
- | **模块化** | 主题文件只定义变量 + 极小量选择器微调。Mermaid 图表、编辑器排版由内置系统 (`base.css` / `variables.css`) 自动承继 |
17
- | **语义化** | 变量名描述用途而非外观。`--color-link` 而非 `--color-blue`;`--font-heading` 而非 `--font-sans` |
18
- | **可推导** | 完整主题可由 5 个种子色 + 3 组字体栈自动推导,AI Agent 修改主题只需改动 SECTION 1 |
19
- | **打印保真** | `@media print` 输出必须与屏幕显示保持视觉一致。打印样式是屏幕样式的**镜像增强版**(同值 + `!important` + `print-color-adjust`),而非独立设计 |
20
-
21
- ### 1.2 与现有体系的关系
22
-
23
- ```
24
- ┌─────────────────────────────────────────────────┐
25
- │ themes/template.css 用户主题 (本范式) │
26
- │ 定义变量值 + 微调选择器 │
27
- ├─────────────────────────────────────────────────┤
28
- │ src/.../base.css 编辑器排版层 │
29
- │ 消费 --bg-color, --text-color 等变量 │
30
- ├─────────────────────────────────────────────────┤
31
- │ src/.../mermaid/variables.css Mermaid 映射层 │
32
- │ 消费 --mermaid-* 变量,自动映射到 22 种图表 │
33
- ├─────────────────────────────────────────────────┤
34
- │ src/.../mermaid-plugin-custom.css 文本偏移基线 │
35
- │ 提供 --mermaid-label-offset-y 等定位变量 │
36
- ├─────────────────────────────────────────────────┤
37
- │ src/.../foundation.css 全局 Reset + 默认值 │
38
- └─────────────────────────────────────────────────┘
39
- ```
40
-
41
- **关键约束**:主题文件通过 `body.theme-custom` 选择器接入系统。内置 `variables.css` 已预置所有 Mermaid SVG 选择器映射,主题**只需定义变量值**,**无需**重复写 SVG 选择器。
42
-
43
- ---
44
-
45
- ## 2. 设计规范 (Design Specification)
46
-
47
- 本节定义可被 AI Agent 程序化验证的强制性设计约束。每条规则包含唯一 ID、约束级别(MUST / MUST NOT / SHOULD / SHOULD NOT)、验证方法和设计理由。
48
-
49
- ### 2.1 色彩空间规范
50
-
51
- #### 2.1.1 对比度约束
52
-
53
- | Rule ID | 级别 | 规则 | 验证方法 |
54
- |---------|------|------|---------|
55
- | **CR-01** | MUST | 正文色 (`--seed-ink`) 与页面底色 (`--seed-surface`) 对比度 ≥ 7:1(WCAG AAA) | `relativeLuminance(ink, surface) ≥ 7.0` |
56
- | **CR-02** | MUST | 次要文字 (`--seed-ink-muted`) 与页面底色对比度 ≥ 4.5:1(WCAG AA) | `relativeLuminance(muted, surface) ≥ 4.5` |
57
- | **CR-03** | MUST | 弱化文字 (`--seed-ink-dim`) 与页面底色对比度 ≥ 3:1(WCAG AA large) | `relativeLuminance(dim, surface) ≥ 3.0` |
58
- | **CR-04** | MUST | 点缀色 (`--seed-accent`) 与页面底色对比度 ≥ 4.5:1(用于链接/强调文字时) | `relativeLuminance(accent, surface) ≥ 4.5` |
59
- | **CR-05** | SHOULD | 内联代码背景 (`--seed-panel`) 与页面底色区分度 ≥ 1.5:1 | `relativeLuminance(panel, surface) ≥ 1.5` 或 `≤ 0.67` |
60
- | **CR-06** | MUST NOT | 禁止正文色与页面底色对比度 < 4.5:1 | `relativeLuminance(ink, surface) ≥ 4.5` |
61
-
62
- **WCAG 相对亮度计算公式**:
63
-
64
- ```
65
- relativeLuminance(hex) = 0.2126 * R + 0.7152 * G + 0.0722 * B
66
- 其中 R/G/B = linearize(channel / 255)
67
- linearize(c) = c ≤ 0.04045 ? c/12.92 : ((c+0.055)/1.055)^2.4
68
-
69
- contrastRatio(L1, L2) = (max(L1,L2) + 0.05) / (min(L1,L2) + 0.05)
70
- ```
71
-
72
- #### 2.1.2 色相协调规则
73
-
74
- | Rule ID | 级别 | 规则 | 验证方法 |
75
- |---------|------|------|---------|
76
- | **HR-01** | SHOULD | 浅色主题中,点缀色优先选用暖色(红/橙/棕)或冷色(蓝/靛/绿),避免中性灰作为点缀色 | 检查 `--seed-accent` 的 HSL 饱和度 S ≥ 0.30 |
77
- | **HR-02** | SHOULD | 深色主题中,点缀色亮度适当提高(HSL 的 L ≥ 0.50),避免深色背景上点缀色不可见 | 检查 accent-L 值 |
78
- | **HR-03** | MUST NOT | 禁止同时使用 ≥ 3 个不同色相的饱和色作为功能色。点缀色应只有 1 个色相族 | 检查色板中饱和度 > 0.3 的色相数量 ≤ 2 |
79
-
80
- #### 2.1.3 饱和度与明度约束
81
-
82
- | Rule ID | 级别 | 规则 | 验证方法 |
83
- |---------|------|------|---------|
84
- | **SL-01** | MUST | 页面底色 (`--seed-surface`) 饱和度 ≤ 0.05(近白或近黑,不偏色) | 检查 HSL S 值 |
85
- | **SL-02** | MUST NOT | 禁止大面积色块(代码区 `--seed-panel`、引用块 `--seed-panel-alt`)饱和度 > 0.10 | 检查 HSL S ≤ 0.10 |
86
- | **SL-03** | SHOULD | 表面色三层 (`surface → panel → panel-alt`) 保持同色相(H 偏差 ≤ 5°),仅明度递减 | 检查 HSL H 差值 ≤ 5° |
87
- | **SL-04** | MUST | 浅色主题:`L(surface) > L(panel) > L(panel-alt)`;深色主题反之 | 检查 L 单调性 |
88
-
89
- #### 2.1.4 点缀色面积约束
90
-
91
- | Rule ID | 级别 | 规则 |
92
- |---------|------|------|
93
- | **AR-01** | SHOULD | 点缀色覆盖面积 ≤ 页面可视面积的 10%(用于链接、Mermaid 节点边框、表头底线、引用块竖线等) |
94
- | **AR-02** | MUST NOT | 禁止将点缀色用作大面积背景色(页面底色、代码块背景、表格全局背景) |
95
-
96
- #### 2.1.5 中性灰轴约束
97
-
98
- | Rule ID | 级别 | 规则 | 验证方法 |
99
- |---------|------|------|---------|
100
- | **NT-01** | MUST | `--seed-ink` / `--seed-ink-muted` / `--seed-ink-dim` 必须位于同一色相轴(HSL H 偏差 ≤ 3°),仅明度变化 | 检查 H 差值 |
101
- | **NT-02** | MUST | `--seed-border` 与 `--seed-panel` 明度差 ≥ 0.08,确保边框可见 | `abs(L(border) - L(panel)) ≥ 0.08` |
102
- | **NT-03** | SHOULD | `--seed-border` 只能使用中性灰(HSL S ≤ 0.05),禁止使用有色边框 | 检查 S ≤ 0.05 |
103
-
104
- ### 2.2 字体搭配规范
105
-
106
- #### 2.2.1 字体数量与分类
107
-
108
- | Rule ID | 级别 | 规则 |
109
- |---------|------|------|
110
- | **FP-01** | MUST | 主题使用的字体家族总数 ≤ 4(正文 1、标题 1、等宽 1、Mermaid 1) |
111
- | **FP-02** | SHOULD | `--font-heading` 与 `--font-body` 须有分类对比:一个无衬线、一个衬线;或同分类但字重/字宽显著不同 |
112
- | **FP-03** | MUST | `--font-code` 必须是等宽字体(monospace),禁止将比例字体用于代码 |
113
- | **FP-04** | SHOULD | `--font-mermaid` 应引用 `var(--font-heading)`,保持图表与文档标题字体一致 |
114
-
115
- #### 2.2.2 字体分类搭配矩阵
116
-
117
- | 正文字体分类 | 推荐标题字体分类 | 搭配效果 |
118
- |-------------|----------------|---------|
119
- | Sans-serif | Sans-serif(更粗字重) | 现代、Swiss、技术文档 |
120
- | Serif | Sans-serif | 经典学术、优雅对比 |
121
- | Serif | Serif(更粗字重) | 传统印刷、书籍风格 |
122
- | Sans-serif | Serif | 少见,通常反直觉 |
123
-
124
- **禁止搭配**:正文与标题使用同一字体的相同字重(无任何区分度)。
125
-
126
- #### 2.2.3 字号倍率约束
127
-
128
- | Rule ID | 级别 | 规则 | 验证方法 |
129
- |---------|------|------|---------|
130
- | **FS-01** | MUST | `--font-scale-h1` ≥ 1.75(主标题至少为正文的 1.75 倍) | 检查倍率值 |
131
- | **FS-02** | MUST | 标题倍率严格递减:`h1 > h2 > h3 > h4 > h5 > h6` | 检查单调性 |
132
- | **FS-03** | SHOULD | 正文字号 `--font-size-root` ∈ [14px, 18px] | 检查范围 |
133
- | **FS-04** | SHOULD | Mermaid 字号 `--font-size-mermaid` ∈ [11px, 14px] | 检查范围 |
134
- | **FS-05** | SHOULD | 标题行高 `--line-height-heading` ∈ [1.15, 1.4],小于正文行高 | `heading < body` |
135
-
136
- #### 2.2.4 字体栈构造规则
137
-
138
- | Rule ID | 级别 | 规则 |
139
- |---------|------|------|
140
- | **FS-06** | MUST | 每个字体栈必须以通用字体族(`serif` / `sans-serif` / `monospace`)结尾 |
141
- | **FS-07** | MUST | 字体栈中至少包含 1 个中文字体(覆盖 CJK 字符)和 1 个西文字体 |
142
- | **FS-08** | SHOULD | 字体栈中同一字体族的不同字重变体(如 "Inter" 和 "Inter Display")只保留 1 个 |
143
-
144
- ### 2.3 表面/背景层次规范
145
-
146
- #### 2.3.1 明度阶梯约束
147
-
148
- 页面视觉层次依赖三层表面的明度差异。
149
-
150
- | Rule ID | 级别 | 规则 | 浅色主题 | 深色主题 |
151
- |---------|------|------|---------|---------|
152
- | **SH-01** | MUST | 相邻表面层明度差 ≥ 0.04 | `L(surface) - L(panel) ≥ 0.04` | `L(panel) - L(surface) ≥ 0.04` |
153
- | **SH-02** | MUST | 代码块底色 (`--code-block-bg` 或 `--seed-panel-alt`) 与页面底色明度差 ≥ 0.06,确保代码区域肉眼可辨 | `abs(L(block) - L(surface)) ≥ 0.06` |
154
- | **SH-03** | SHOULD | 三层表面 `surface → panel → panel-alt` 的明度差均匀(相邻层差值偏差 ≤ 50%) | `ratio(d1,d2) ≤ 1.5` |
155
-
156
- #### 2.3.2 各语义表面最低对比度
157
-
158
- | 语义角色 | 对应变量 | 与页面底色的最低对比度 |
159
- |----------|---------|---------------------|
160
- | 代码块背景 | `--code-block-bg` | 1.2:1(肉眼可辨即可,不宜过强) |
161
- | 内联代码背景 | `--code-bg` | 1.15:1 |
162
- | 引用块背景 | `--blockquote-bg` | 1.15:1 |
163
- | 表头背景 | `--table-header-bg` | 1.5:1(需明显区分) |
164
- | Mermaid 节点填充 | `--mermaid-node-fill` | 1.2:1 |
165
- | Mermaid 聚类填充 | `--mermaid-cluster-fill` | 1.1:1(极浅即可) |
166
-
167
- ### 2.4 线条/边框规范
168
-
169
- #### 2.4.1 边框色与底色关系
170
-
171
- | Rule ID | 级别 | 规则 |
172
- |---------|------|------|
173
- | **BD-01** | MUST | 边框色 (`--seed-border`) 必须比其所在表面色暗:浅色主题 `L(border) < L(surface)`,深色主题反之 |
174
- | **BD-02** | SHOULD | 强调边框 (`--seed-border-strong`) 比普通边框深 ≥ 0.15 明度差 |
175
- | **BD-03** | SHOULD | Mermaid 节点描边 (`--mermaid-node-stroke`) 与节点填充 (`--mermaid-node-fill`) 对比度 ≥ 2:1 |
176
-
177
- #### 2.4.2 边框宽度层级
178
-
179
- | 用途 | 推荐宽度 | 说明 |
180
- |------|---------|------|
181
- | 分割线 (hr) | 1px | 最细,仅起分隔作用 |
182
- | 表格内边框 (td) | 1px | 细线,不抢内容 |
183
- | Mermaid 节点描边 | 1.5px | 略粗,确保图表清晰 |
184
- | 引用块左侧竖线 | 4px | 最粗,视觉锚点 |
185
- | 表头底线 | 2px | 区分表头与表体 |
186
-
187
- ### 2.5 语义色角色映射规范
188
-
189
- #### 2.5.1 强制映射表 (Mandatory)
190
-
191
- 以下映射**必须**成立。变量值必须直接或间接来自种子色板。
192
-
193
- | 语义变量 | 必须映射到 | 说明 |
194
- |----------|-----------|------|
195
- | `--bg-color` | `var(--seed-surface)` | 页面底色 = 最浅表面 |
196
- | `--text-color` | `var(--seed-ink)` | 正文色 = 最深文字 |
197
- | `--heading-color` | `var(--seed-ink)` | 标题色 = 正文色(统一) |
198
- | `--link-color` | `var(--seed-accent)` | 链接色 = 点缀色 |
199
- | `--accent-color` | `var(--seed-accent)` | 全局强调色 = 点缀色 |
200
- | `--border-color` | `var(--seed-border)` | 边框色 = 中性灰 |
201
- | `--code-bg` | `var(--seed-panel)` | 内联代码背景 = 中间表面 |
202
- | `--code-block-bg` | `var(--seed-panel-alt)` | 代码块背景 = 最深表面 |
203
- | `--blockquote-bg` | `var(--seed-panel)` | 引用块背景 = 中间表面 |
204
- | `--blockquote-border` | `var(--seed-ink)` 或 `var(--seed-accent)` | 引用竖线 = 正文色或点缀色 |
205
- | `--table-header-bg` | `var(--seed-panel)` 或 `var(--seed-ink)` | 表头 = 浅底或黑底白字 |
206
- | `--selection-bg` | `accent color + alpha 0.10~0.20` | 选区 = 点缀色半透明 |
207
-
208
- #### 2.5.2 禁止的映射 (Forbidden)
209
-
210
- | Rule ID | 级别 | 禁止项 |
211
- |---------|------|--------|
212
- | **MP-01** | MUST NOT | `--text-color` 映射到 ⾮ `--seed-ink` 或 `--seed-ink-muted` 的其他来源 |
213
- | **MP-02** | MUST NOT | `--bg-color` 映射到 ⾮ `--seed-surface` 的其他来源 |
214
- | **MP-03** | MUST NOT | `--border-color` 映射到有彩色(非中性灰),HSL S > 0.05 |
215
- | **MP-04** | MUST NOT | `--code-bg` 与 `--bg-color` 使用同一值(代码区不可见) |
216
- | **MP-05** | MUST NOT | `--table-header-bg` 同时兼具浅底 + 浅字(表头必须可读) |
217
-
218
- ### 2.6 规则优先级与冲突解决
219
-
220
- 当多条规则冲突时,按以下优先级裁决:
221
-
222
- ```
223
- 1. MUST NOT > 2. MUST > 3. SHOULD NOT > 4. SHOULD
224
- ```
225
-
226
- - 任何 MUST NOT 规则被违反 → 主题**拒绝**(不合规)
227
- - 任何 MUST 规则被违反 → 主题**拒绝**
228
- - SHOULD NOT 被违反 → **警告**,需人工审核
229
- - SHOULD 被违反 → **建议**,不阻止使用
230
-
231
- 示例:若某个点缀色满足 HR-01(SHOULD),但违反 CR-04(MUST),则主题被拒绝。
232
-
233
- ---
234
-
235
- ## 3. 变量体系
236
-
237
- ### 3.1 分层架构
238
-
239
- ```
240
- SECTION 1 设计令牌 (Design Tokens) ← 用户修改
241
- SECTION 2 语义映射 (Semantic Mapping) ← 自动推导
242
- SECTION 3 Mermaid 图表变量 ← 被内置系统消费
243
- SECTION 4 排版微调变量 ← 可选覆盖
244
- ```
245
-
246
- ### 3.2 设计令牌:种子色板
247
-
248
- 主题的视觉基调由 5 个种子色 + 各自深浅变体决定。
249
-
250
- ```
251
- --seed-accent 点缀色(链接、强调、Mermaid 高亮)
252
- ├── --seed-accent-light 浅变体(用作背景)
253
- └── --seed-accent-dark 深变体(用作 hover / 文字)
254
-
255
- --seed-surface 页面底色(最浅层)
256
- --seed-panel 卡片/代码区底色(中间层)
257
- --seed-panel-alt 表头/引用块底色(最深表面层)
258
-
259
- --seed-ink 正文/标题色(最深文字)
260
- --seed-ink-muted 次要文字色
261
- --seed-ink-dim 弱化/禁用文字色
262
-
263
- --seed-border 常规边框色
264
- --seed-border-strong 强调边框色
265
- ```
266
-
267
- **配色约束**:
268
-
269
- | 主题类型 | 表面色关系 | 文字色关系 |
270
- |----------|-----------|-----------|
271
- | 浅色主题 | `surface` < `panel` < `panel-alt` (亮度递减) | `ink` > `muted` > `dim` (亮度递增) |
272
- | 深色主题 | `surface` > `panel` > `panel-alt` (亮度递增) | `ink` < `muted` < `dim` (亮度递减) |
273
- | 点缀色面积 | ≤ 页面 10%(链接 + 强调 + Mermaid 节点边框) | |
274
-
275
- ### 3.3 设计令牌:字体系统
276
-
277
- ```
278
- --font-body 正文字体栈(衬线优先或无衬线)
279
- --font-heading 标题字体栈(与正文形成对比)
280
- --font-code 等宽字体栈(代码/公式)
281
- --font-mermaid Mermaid 图表字体(默认引用 --font-heading)
282
- ```
283
-
284
- **字体栈构造规范**:
285
- 1. 西文字体在前(Windows / macOS / Linux 逐一覆盖)
286
- 2. 中文字体居中(Serif 或 Sans Serif 按主题风格选择)
287
- 3. 通用后备字体在末(`serif` / `sans-serif` / `monospace`)
288
-
289
- ### 3.4 语义映射规则
290
-
291
- 设计令牌通过变量引用自动映射到 ColaMD 内置系统消费的语义变量。
292
-
293
- | 内置变量 | 映射来源 | 消费者 |
294
- |----------|---------|--------|
295
- | `--bg-color` | `--seed-surface` | `base.css` 页面背景 |
296
- | `--text-color` | `--seed-ink` | `base.css` 正文颜色 |
297
- | `--text-muted` | `--seed-ink-muted` | `base.css` 引用/次要文字 |
298
- | `--heading-color` | `--seed-ink` | `base.css` 标题颜色 |
299
- | `--border-color` | `--seed-border` | `base.css` 表格/分割线 |
300
- | `--link-color` | `--seed-accent` | `base.css` 超链接 |
301
- | `--code-bg` | `--seed-panel` | `base.css` 内联代码背景 |
302
- | `--code-block-bg` | `--seed-panel-alt` | `base.css` 代码块背景 |
303
- | `--blockquote-border` | `--seed-accent` | `base.css` 引用块左侧竖线 |
304
- | `--table-header-bg` | `--seed-panel` | `base.css` 表头背景 |
305
- | `--selection-bg` | `accent + 0.15 alpha` | `base.css` 选区高亮 |
306
-
307
- **映射原则**:语义映射仅做变量引用(`var(--seed-*)`),不引入新色值。如需微调某个语义角色(如让 `--code-bg` 比 `--seed-panel` 略深),在映射处加 `color-mix()` 或微调 alpha 值。
308
-
309
- ### 3.5 Mermaid 20 核心变量
310
-
311
- 所有 Mermaid 变量由内置 `variables.css` 自动消费,覆盖 22 种图表类型。
312
-
313
- | 变量 | 作用于 | 映射建议 |
314
- |------|--------|---------|
315
- | `--mermaid-background` | 图表容器背景 | `--seed-panel` |
316
- | `--mermaid-border-color` | 图表容器边框 | `--seed-border` |
317
- | `--mermaid-font-family` | 图表内所有文字 | `--font-mermaid` |
318
- | `--mermaid-font-size` | 图表内所有文字大小 | 独立设置(通常 12-14px) |
319
- | `--mermaid-node-fill` | 节点填充色 | `--seed-panel` |
320
- | `--mermaid-node-stroke` | 节点描边色 | `--seed-accent` |
321
- | `--mermaid-node-stroke-width` | 节点描边宽度 | `1.5px`(固定) |
322
- | `--mermaid-node-text` | 节点内文字色 | `--seed-ink` |
323
- | `--mermaid-edge-stroke` | 连线颜色 | `--seed-ink-muted` |
324
- | `--mermaid-edge-stroke-width` | 连线宽度 | `1.5px`(固定) |
325
- | `--mermaid-cluster-fill` | Subgraph 聚类填充 | `accent + 0.06 alpha` |
326
- | `--mermaid-cluster-stroke` | Subgraph 聚类边框 | `--seed-accent` |
327
- | `--mermaid-label-text` | 标签/节点内文本色 | `--seed-ink` |
328
- | `--mermaid-edge-label-text` | 边标签文字色 | `--seed-ink-muted` |
329
- | `--mermaid-edge-label-bg` | 边标签背景色 | `--seed-surface` |
330
- | `--mermaid-title-text` | 图表标题色 | `--seed-ink` |
331
- | `--mermaid-axis-text` | 坐标轴文字色 | `--seed-ink-muted` |
332
- | `--mermaid-highlight` | 高亮/标记色 | `--seed-accent` |
333
- | `--mermaid-person-stroke` | 人物节点描边 | `--seed-ink` |
334
- | `--mermaid-label-offset-y` | 标签 Y 偏移 | `0px`(无特殊需求时) |
335
-
336
- ---
337
-
338
- ## 4. 模块化规则
339
-
340
- ### 4.1 继承而非重写
341
-
342
- 内置系统已处理的样式,主题文件**禁止**重写其选择器。
343
-
344
- | 内置文件 | 已处理内容 | 主题禁止 |
345
- |----------|-----------|---------|
346
- | `variables.css` | 所有 `body.theme-custom .mermaid-preview svg .*` 选择器 | 写 Mermaid SVG 选择器 |
347
- | `base.css` | `#editor .ProseMirror` 下的 h1-h6/p/code/pre/table/blockquote/ul/ol/hr/img | 重写已被变量覆盖的排版规则 |
348
- | `mermaid-plugin-custom.css` | `.label text`, `.nodeLabel`, `.edgeLabel` 的 `transform/display/position` | 在主题层做定位覆盖(参照 guizang 模式) |
349
-
350
- ### 4.2 允许的微调选择器
351
-
352
- 以下选择器**允许**在主题中定义(内置系统未覆盖或不满足个性化需求):
353
-
354
- | 允许的选择器 | 用途 | 约束 |
355
- |-------------|------|------|
356
- | `body.theme-custom h1-h6` | 标题字号/字体(base.css 使用 em 倍率,可覆盖为 pt) | 值必须引用 `var(--font-*)` |
357
- | `body.theme-custom strong` | 加粗文字颜色 | 引用 `var(--accent-color)` |
358
- | `body.theme-custom code` | 内联代码字体/背景 | 引用 `var(--font-code)`, `var(--code-bg)` |
359
- | `body.theme-custom pre` | 代码块字体/背景 | 引用变量 |
360
- | `body.theme-custom blockquote` | 引用块背景色(base.css 未设背景) | 引用 `var(--blockquote-bg)` |
361
- | `body.theme-custom table th` | 表头强调(双底线等) | 值引用变量 |
362
- | `body.theme-custom .mermaid-block + p` | 图表标题居中 | 字体/字号引用变量 |
363
- | `@media print` | 打印样式 | 用于固定打印色值 |
364
-
365
- ### 4.3 度量指标
366
-
367
- | 指标 | 目标值 | 说明 |
368
- |------|--------|------|
369
- | 主题文件总行数 | ≤ 300 行 | 含注释和空行 |
370
- | 裸色值数量 | 0 | 所有颜色通过 `var(--*)` 引用 |
371
- | 裸字号数量 | 0 | 所有字号通过 `var(--font-*)` 引用 |
372
- | Mermaid SVG 选择器 | 0 | 由内置 `variables.css` 处理 |
373
- | 用户需修改的变量数 | ≤ 20 | 集中在 SECTION 1 |
374
-
375
- ---
376
-
377
- ## 5. 文件结构规范
378
-
379
- ### 5.1 必须的 SECTION
380
-
381
- ```
382
- SECTION 1 设计令牌 — 变量定义块(用户编辑区)
383
- ├── 1.1 种子色板
384
- ├── 1.2 字体系统
385
- ├── 1.3 字号倍率
386
- └── 1.4 圆角/间距/宽度
387
-
388
- SECTION 2 语义映射 — 令牌 → 内置变量的自动映射
389
- ├── 2.1 编辑区表面色
390
- ├── 2.2 编辑区文字色
391
- ├── 2.3 链接/强调
392
- ├── 2.4 边框/分割线
393
- ├── 2.5 内联代码
394
- ├── 2.6 代码块
395
- ├── 2.7 引用块
396
- ├── 2.8 表格
397
- └── 2.9 滚动条
398
-
399
- SECTION 3 Mermaid 图表变量
400
- ├── 3.1 容器
401
- ├── 3.2 字体
402
- ├── 3.3 节点
403
- ├── 3.4 连线
404
- ├── 3.5 聚类
405
- ├── 3.6 标签
406
- ├── 3.7 标题/坐标轴
407
- ├── 3.8 人物节点
408
- └── 3.9 偏移
409
-
410
- SECTION 4 排版微调变量
411
-
412
- SECTION 5 选择器级微调
413
-
414
- SECTION 6 @media print
415
- ```
416
-
417
- ### 5.2 选择器规则
418
-
419
- | 规则 | 说明 |
420
- |------|------|
421
- | 根选择器 | 变量定义在 `body.theme-custom { }` 内 |
422
- | 选择器前缀 | 排版选择器使用 `body.theme-custom <element>` 限定作用域 |
423
- | `!important` | 仅在 `@media print` 中使用。屏幕样式靠选择器优先级解决 |
424
- | 层叠顺序 | 变量定义块在前,选择器规则块在后 |
425
-
426
- ### 5.3 注释规范
427
-
428
- ```css
429
- /* ── X.X 功能描述(中文)── */
430
- /* 用于 xxx 场景的 xxx 变量 */
431
- --variable-name: value;
432
-
433
- /* ═══════════════════ 分隔大节 ═══════════════════ */
434
- ```
435
-
436
- ---
437
-
438
- ## 6. 打印保真规范 (Print Fidelity)
439
-
440
- ### 6.1 核心约束
441
-
442
- ColaMD 通过 Electron `printToPDF()` 生成 PDF,底层为 Chromium 打印引擎。Chromium 打印默认**剥离所有背景色和自定义颜色**。因此 `@media print` 必须主动恢复每个被剥离的样式。
443
-
444
- **铁律**:`@media print` 是屏幕样式的**镜像增强版**——相同的变量值 + `!important` + `print-color-adjust: exact`。禁止在 print 中创造不同的设计。
445
-
446
- ### 6.2 必须覆盖的元素清单
447
-
448
- 以下元素在打印时会被 Chromium 剥离样式,**每个都必须**在 `@media print` 中显式声明:
449
-
450
- | 元素 | 必须声明 | 原因 |
451
- |------|---------|------|
452
- | `html, body` | `background`, `color`, `font-family` | 根元素背景/文字被清除 |
453
- | `h1-h6` | `color`(尤其是有色标题如 Swiss Red h1) | 非纯黑标题色被清除 |
454
- | `code` | `background`, `color` | 内联代码背景被清除 |
455
- | `pre` | `background`, `color`, `border-left`(如有) | 代码块背景/装饰被清除 |
456
- | `blockquote` | `background`, `border-left` | 引用块背景被清除 |
457
- | `table th` | `background`, `color`, `border` | 表头底色被清除 |
458
- | `table td` | `border` | 表格线可能断裂 |
459
- | `a` | `color`, `border-bottom`(如有) | 链接色被清除 |
460
- | `.mermaid-block` | `background`, `border` | 图表容器被清除 |
461
- | `.mermaid-preview svg *` | `print-color-adjust: exact` | SVG 颜色全部被剥离 |
462
- | `.mermaid-block + p` | `color`, `text-align` | 图题样式丢失 |
463
- | `strong` | `color`(如使用非默认色) | 强调色被清除 |
464
-
465
- ### 6.3 打印变量声明块
466
-
467
- `@media print` 开头必须先重新声明关键变量。Chromium 打印可能丢失 `body.theme-custom` 中定义的 CSS 自定义属性,因此在 print 作用域内重新注入:
468
-
469
- ```css
470
- @media print {
471
- body.theme-custom {
472
- /* 将 SECTION 1 的种子色重新声明到 print 作用域 */
473
- --seed-accent: #e30613;
474
- --seed-surface: #ffffff;
475
- --seed-ink: #0d0d0d;
476
- --seed-panel: #f4f4f4;
477
- --seed-panel-alt: #eaeaea;
478
- /* ... 以及所有在 print 选择器中引用的变量 */
479
- }
480
-
481
- /* 之后的选择器引用 var(--seed-*) 确保值一致 */
482
- }
483
- ```
484
-
485
- ### 6.4 打印选择器编写规则
486
-
487
- 1. **先变量,后选择器**:先重声明变量块,再写选择器规则
488
- 2. **`!important` 全部**:print 中每个属性都用 `!important`,因为打印引擎的默认样式表优先级极高
489
- 3. **`print-color-adjust: exact` 精确覆盖**:每个有背景色的元素独立声明(不能依赖继承)
490
- 4. **值与屏幕一致**:print 选择器的值引用 `var(--seed-*)`,保证与屏幕端一致
491
- 5. **禁止在 print 中引入新色值**:即使是 `#ffffff` 也应引用变量(如 `var(--seed-surface)`)
492
-
493
- ### 6.5 完整打印模板
494
-
495
- ```css
496
- @media print {
497
- @page { margin: 20mm; }
498
-
499
- /* —— 变量重声明(确保 Chromium 打印不丢失) —— */
500
- body.theme-custom {
501
- --seed-accent: <同 SECTION 1>;
502
- --seed-accent-dark: <同 SECTION 1>;
503
- --seed-surface: <同 SECTION 1>;
504
- --seed-ink: <同 SECTION 1>;
505
- --seed-ink-muted: <同 SECTION 1>;
506
- --seed-panel: <同 SECTION 1>;
507
- --seed-panel-alt: <同 SECTION 1>;
508
- --seed-border: <同 SECTION 1>;
509
- }
510
-
511
- /* —— 根元素 —— */
512
- html, body, body.theme-custom {
513
- background: var(--seed-surface) !important;
514
- color: var(--seed-ink) !important;
515
- font-family: var(--font-body) !important;
516
- }
517
-
518
- /* —— 标题(尤其是有色标题必须恢复) —— */
519
- body.theme-custom h1 {
520
- color: var(--seed-accent) !important; /* 保留页面中的有色标题 */
521
- -webkit-print-color-adjust: exact !important;
522
- print-color-adjust: exact !important;
523
- }
524
-
525
- /* —— 内联代码 —— */
526
- body.theme-custom code {
527
- background: var(--seed-panel) !important;
528
- color: var(--seed-accent-dark) !important;
529
- -webkit-print-color-adjust: exact !important;
530
- print-color-adjust: exact !important;
531
- }
532
-
533
- /* —— 代码块 —— */
534
- body.theme-custom pre {
535
- background: var(--seed-panel-alt) !important;
536
- color: var(--seed-ink) !important;
537
- -webkit-print-color-adjust: exact !important;
538
- print-color-adjust: exact !important;
539
- }
540
- body.theme-custom pre code {
541
- background: transparent !important;
542
- color: inherit !important;
543
- }
544
-
545
- /* —— 引用块 —— */
546
- body.theme-custom blockquote {
547
- background: var(--seed-panel) !important;
548
- border-left-color: var(--seed-ink) !important;
549
- -webkit-print-color-adjust: exact !important;
550
- print-color-adjust: exact !important;
551
- }
552
-
553
- /* —— 表格表头(有色底必须恢复) —— */
554
- body.theme-custom table th {
555
- background: var(--seed-ink) !important;
556
- color: var(--seed-surface) !important;
557
- -webkit-print-color-adjust: exact !important;
558
- print-color-adjust: exact !important;
559
- }
560
- body.theme-custom table td {
561
- border-color: var(--seed-border) !important;
562
- }
563
-
564
- /* —— 链接 —— */
565
- body.theme-custom a {
566
- color: var(--seed-ink) !important;
567
- -webkit-print-color-adjust: exact !important;
568
- print-color-adjust: exact !important;
569
- }
570
-
571
- /* —— 强调文字 —— */
572
- body.theme-custom strong {
573
- color: var(--seed-accent-dark) !important;
574
- -webkit-print-color-adjust: exact !important;
575
- print-color-adjust: exact !important;
576
- }
577
-
578
- /* —— Mermaid 图表容器 —— */
579
- body.theme-custom .mermaid-block {
580
- background: var(--seed-surface) !important;
581
- border-color: var(--seed-border) !important;
582
- -webkit-print-color-adjust: exact !important;
583
- print-color-adjust: exact !important;
584
- }
585
- body.theme-custom .mermaid-preview svg * {
586
- -webkit-print-color-adjust: exact !important;
587
- print-color-adjust: exact !important;
588
- }
589
-
590
- /* —— 图表标题 —— */
591
- body.theme-custom .mermaid-block + p {
592
- color: var(--seed-ink-muted) !important;
593
- text-align: center !important;
594
- }
595
- }
596
- ```
597
-
598
- ### 6.6 打印验证清单
599
-
600
- 主题开发完成后,逐项确认 PDF 导出效果:
601
-
602
- - [ ] 页面背景色与屏幕一致(非灰色)
603
- - [ ] h1 颜色与屏幕一致(尤其是有色标题如 Swiss Red)
604
- - [ ] 内联代码背景色存在
605
- - [ ] 代码块背景色存在,左侧装饰线(如有)可见
606
- - [ ] 引用块背景色和左侧竖线存在
607
- - [ ] 表格表头底色存在(黑底白字 / 浅灰底等)
608
- - [ ] Mermaid SVG 颜色与屏幕一致
609
- - [ ] 图表标题居中且字号正确
610
- - [ ] 链接文字颜色不为默认蓝
611
-
612
- ---
613
-
614
- ## 7. AI Agent 编写指南
615
-
616
- ### 7.1 创建新主题
617
-
618
- 1. 复制 `themes/template.css` 为基础
619
- 2. 确定配色方向(浅色/深色/暖调/冷调/学术)
620
- 3. 填写 SECTION 1 的 5 个种子色 + 3 组字体栈
621
- 4. 微调 SECTION 5 的选择器(如需)
622
- 5. 保存,导入测试
623
-
624
- ### 7.2 修改现有主题
625
-
626
- 1. 只修改 SECTION 1 中的 `--seed-*` 和 `--font-*` 变量
627
- 2. 其他 SECTION 的映射变量自动跟随
628
- 3. 如某个语义角色需要独立微调,修改对应的 `--var: var(--seed-*)` 映射行
629
-
630
- ### 7.3 禁止操作
631
-
632
- - 在 `body.theme-custom` 块外定义变量
633
- - 在选择器中使用裸色值(`#xxxxxx`)
634
- - 重复定义内置 `variables.css` 已有的 Mermaid SVG 选择器
635
- - 使用 `!important`(`@media print` 除外)
636
- - 为 mermaid 标签添加 `transform` / `display` / `position` / `top` / `left` 覆盖
637
-
638
- ---
639
-
640
- ## 8. 现有主题对标
641
-
642
- | 主题 | 行数 | 范式符合度 | 迁移建议 |
643
- |------|------|-----------|---------|
644
- | `guizang.css` | ~700 | 中(变量驱动,但选择器冗长) | 可精简至 ~200 行 |
645
- | `elegant.css` | ~750 | 中 | 可精简至 ~200 行 |
646
- | `forest-ink.css` | ~750 | 中 | 可精简至 ~200 行 |
647
- | `pixso-design.css` | ~700 | 中 | 可精简至 ~200 行 |
648
- | `academic-paper.css` | ~1300 | 低(大量 GB/T 7713 专用选择器) | 适当保留专用规则 |
649
-
650
- ---
651
-
652
- ## 9. 版本历史
653
-
654
- | 版本 | 日期 | 变更 |
655
- |------|------|------|
656
- | v3.2 | 2026-05-23 | 新增 Section 2「设计规范」:色彩空间、字体搭配、表面层次、线条边框的强制性约束(含 Rule ID、WCAG 对比度公式、色彩协调矩阵),支持 AI Agent 程序化验证 |
657
- | v3.1 | 2026-05-23 | 新增「打印保真」原则与完整 `@media print` 规范(Section 6) |
658
- | v3.0 | 2026-05-23 | 初始范式定义。提出种子色板 + 语义映射 + 内置继承的三层架构 |
1
+ # ColaMD CSS 主题定义范式 v4.0
2
+
3
+ **适用范围**:ColaMD `themes/*.css` 用户主题文件的编写与 AI 辅助生成
4
+ **契约版本**:ColaMD Extend 2.7(CodeMirror 6 编辑器 + Pele 图表引擎)
5
+ **最后更新**:2026-10-23
6
+ **关联文件**:`themes/template.css`(范式配套模板)、`src/templates/theme-template.hbs`(生成器模板)
7
+
8
+ ---
9
+
10
+ ## 1. 设计目标
11
+
12
+ ### 1.1 核心原则
13
+
14
+ | 原则 | 说明 |
15
+ |------|------|
16
+ | **变量化** | 颜色、字体、字号、间距一律通过 CSS 自定义属性定义。选择器规则中禁止出现裸色值(`#xxx`)、裸字号(`12pt`)、裸字体名 |
17
+ | **模块化** | 主题文件只定义变量 + 极小量选择器微调。图表与编辑器排版由内置系统(`base.css` / `editor-preview.css` / Pele 缺省值)自动承继 |
18
+ | **语义化** | 变量名描述用途而非外观。`--color-link` 而非 `--color-blue`;`--font-body` 而非 `--font-sans` |
19
+ | **可推导** | 完整主题可由 11 个种子色 + 3 组字体栈自动推导,AI Agent 修改主题只需改动 SECTION 1 |
20
+ | **打印保真** | 2.7 起导出直接对当前窗口 `printToPDF()`,屏幕规则原样生效;`@media print` 只补 `print-color-adjust`,不再重写整份镜像 |
21
+ | **无死规则** | 选择器必须命中真实 DOM。CodeMirror 6 不产出 `#write` / `.ProseMirror` / `<h1>`,这类规则一律禁止 |
22
+
23
+ ### 1.2 与现有体系的关系
24
+
25
+ ```
26
+ ┌─────────────────────────────────────────────────┐
27
+ │ themes/template.css 用户主题 (本范式) │
28
+ │ :root 变量 + .cm-md-* 微调 │
29
+ ├─────────────────────────────────────────────────┤
30
+ │ base.css 主题变量默认值 │
31
+ │ :root, body.theme-light 定义 14 个活变量 │
32
+ ├─────────────────────────────────────────────────┤
33
+ │ editor-preview.css CM6 排版层 │
34
+ │ 消费活变量;.cm-md-* 行类与装饰类 │
35
+ ├─────────────────────────────────────────────────┤
36
+ │ Pele 图表引擎(SVG 内嵌 var(--pele-*)) │
37
+ │ 主题覆盖 --pele-* 即可换配色,换装即时生效 │
38
+ ├─────────────────────────────────────────────────┤
39
+ │ document.css HTML/PDF 导出样式 │
40
+ │ 作用域 .colamd-document,消费同一批变量 │
41
+ └─────────────────────────────────────────────────┘
42
+ ```
43
+
44
+ **关键约束**:主题文件的根块必须是 `:root`。编辑器 DOM 里没有语义元素,标题是带类的一行、引用与代码块是每行一个 `div`,选择器只能使用 `.cm-md-*` 钩子。图表配色通过 `--pele-*` 变量,不写 SVG 选择器。
45
+
46
+ ---
47
+
48
+ ## 2. 设计规范 (Design Specification)
49
+
50
+ 本节定义可被 AI Agent 程序化验证的强制性设计约束。每条规则包含唯一 ID、约束级别(MUST / MUST NOT / SHOULD / SHOULD NOT)、验证方法和设计理由。
51
+
52
+ > 规则中的 `--seed-*` 是**生成器**的输入令牌。手写主题只写语义变量时,按等价关系校验:`--seed-ink` ↔ `--text-color`、`--seed-surface` ↔ `--bg-color`、`--seed-panel` ↔ `--code-bg`、`--seed-ink-muted` ↔ `--text-secondary`、`--seed-accent` ↔ `--link-color`。
53
+
54
+ ### 2.1 色彩空间规范
55
+
56
+ #### 2.1.1 对比度约束
57
+
58
+ | Rule ID | 级别 | 规则 | 验证方法 |
59
+ |---------|------|------|---------|
60
+ | **CR-01** | MUST | 正文色 (`--seed-ink`) 与页面底色 (`--seed-surface`) 对比度 ≥ 7:1(WCAG AAA) | `relativeLuminance(ink, surface) ≥ 7.0` |
61
+ | **CR-02** | MUST | 次要文字 (`--seed-ink-muted`) 与页面底色对比度 ≥ 4.5:1(WCAG AA) | `relativeLuminance(muted, surface) ≥ 4.5` |
62
+ | **CR-03** | MUST | 弱化文字 (`--seed-ink-dim`) 与页面底色对比度 ≥ 3:1(WCAG AA large) | `relativeLuminance(dim, surface) ≥ 3.0` |
63
+ | **CR-04** | MUST | 点缀色 (`--seed-accent`) 与页面底色对比度 ≥ 4.5:1(用于链接/强调文字时) | `relativeLuminance(accent, surface) ≥ 4.5` |
64
+ | **CR-05** | SHOULD | 内联代码背景 (`--seed-panel`) 与页面底色区分度 ≥ 1.5:1 | `relativeLuminance(panel, surface) ≥ 1.5` 或 `≤ 0.67` |
65
+ | **CR-06** | MUST NOT | 禁止正文色与页面底色对比度 < 4.5:1 | `relativeLuminance(ink, surface) ≥ 4.5` |
66
+
67
+ **WCAG 相对亮度计算公式**:
68
+
69
+ ```
70
+ relativeLuminance(hex) = 0.2126 * R + 0.7152 * G + 0.0722 * B
71
+ 其中 R/G/B = linearize(channel / 255)
72
+ linearize(c) = c ≤ 0.04045 ? c/12.92 : ((c+0.055)/1.055)^2.4
73
+
74
+ contrastRatio(L1, L2) = (max(L1,L2) + 0.05) / (min(L1,L2) + 0.05)
75
+ ```
76
+
77
+ #### 2.1.2 色相协调规则
78
+
79
+ | Rule ID | 级别 | 规则 | 验证方法 |
80
+ |---------|------|------|---------|
81
+ | **HR-01** | SHOULD | 浅色主题中,点缀色优先选用暖色(红/橙/棕)或冷色(蓝/靛/绿),避免中性灰作为点缀色 | 检查 `--seed-accent` 的 HSL 饱和度 S ≥ 0.30 |
82
+ | **HR-02** | SHOULD | 深色主题中,点缀色亮度适当提高(HSL 的 L ≥ 0.50),避免深色背景上点缀色不可见 | 检查 accent-L 值 |
83
+ | **HR-03** | MUST NOT | 禁止同时使用 ≥ 3 个不同色相的饱和色作为功能色。点缀色应只有 1 个色相族 | 检查色板中饱和度 > 0.3 的色相数量 ≤ 2 |
84
+
85
+ #### 2.1.3 饱和度与明度约束
86
+
87
+ | Rule ID | 级别 | 规则 | 验证方法 |
88
+ |---------|------|------|---------|
89
+ | **SL-01** | MUST | 页面底色 (`--seed-surface`) 饱和度 ≤ 0.05(近白或近黑,不偏色) | 检查 HSL S 值 |
90
+ | **SL-02** | MUST NOT | 禁止大面积色块(代码区 `--seed-panel`、引用块 `--seed-panel-alt`)饱和度 > 0.10 | 检查 HSL S ≤ 0.10 |
91
+ | **SL-03** | SHOULD | 表面色三层 (`surface → panel → panel-alt`) 保持同色相(H 偏差 ≤ 5°),仅明度递减 | 检查 HSL H 差值 ≤ 5° |
92
+ | **SL-04** | MUST | 浅色主题:`L(surface) > L(panel) > L(panel-alt)`;深色主题反之 | 检查 L 单调性 |
93
+
94
+ #### 2.1.4 点缀色面积约束
95
+
96
+ | Rule ID | 级别 | 规则 |
97
+ |---------|------|------|
98
+ | **AR-01** | SHOULD | 点缀色覆盖面积 ≤ 页面可视面积的 10%(用于链接、图表节点描边、表头底线、引用块竖线等) |
99
+ | **AR-02** | MUST NOT | 禁止将点缀色用作大面积背景色(页面底色、代码块背景、表格全局背景) |
100
+
101
+ #### 2.1.5 中性灰轴约束
102
+
103
+ | Rule ID | 级别 | 规则 | 验证方法 |
104
+ |---------|------|------|---------|
105
+ | **NT-01** | MUST | `--seed-ink` / `--seed-ink-muted` / `--seed-ink-dim` 必须位于同一色相轴(HSL H 偏差 ≤ 3°),仅明度变化 | 检查 H 差值 |
106
+ | **NT-02** | MUST | `--seed-border` 与 `--seed-panel` 明度差 ≥ 0.08,确保边框可见 | `abs(L(border) - L(panel)) ≥ 0.08` |
107
+ | **NT-03** | SHOULD | `--seed-border` 只能使用中性灰(HSL S ≤ 0.05),禁止使用有色边框 | 检查 S ≤ 0.05 |
108
+
109
+ ### 2.2 字体搭配规范
110
+
111
+ #### 2.2.1 字体数量与分类
112
+
113
+ | Rule ID | 级别 | 规则 |
114
+ |---------|------|------|
115
+ | **FP-01** | MUST | 主题使用的字体家族总数 ≤ 3(正文 1、标题 1、等宽 1) |
116
+ | **FP-02** | SHOULD | 标题字体(写在 `.cm-md-atxheading*` 上)与 `--font-body` 须有分类对比:一个无衬线、一个衬线;或同分类但字重/字宽显著不同 |
117
+ | **FP-03** | MUST | `--font-mono` 必须是等宽字体(monospace),禁止将比例字体用于代码 |
118
+ | **FP-04** | SHOULD | 图表文字默认继承 `--font-body`,需要等宽时继承 `--font-mono`;不再有 `--font-mermaid` |
119
+
120
+ #### 2.2.2 字体分类搭配矩阵
121
+
122
+ | 正文字体分类 | 推荐标题字体分类 | 搭配效果 |
123
+ |-------------|----------------|---------|
124
+ | Sans-serif | Sans-serif(更粗字重) | 现代、Swiss、技术文档 |
125
+ | Serif | Sans-serif | 经典学术、优雅对比 |
126
+ | Serif | Serif(更粗字重) | 传统印刷、书籍风格 |
127
+ | Sans-serif | Serif | 少见,通常反直觉 |
128
+
129
+ **禁止搭配**:正文与标题使用同一字体的相同字重(无任何区分度)。
130
+
131
+ #### 2.2.3 字号倍率约束
132
+
133
+ | Rule ID | 级别 | 规则 | 验证方法 |
134
+ |---------|------|------|---------|
135
+ | **FS-01** | MUST | `--font-scale-h1` ≥ 1.75(主标题至少为正文的 1.75 倍) | 检查倍率值 |
136
+ | **FS-02** | MUST | 标题倍率严格递减:`h1 > h2 > h3 > h4 > h5 > h6` | 检查单调性 |
137
+ | **FS-03** | SHOULD | 正文字号 `--editor-font-size` ∈ [14px, 18px] | 检查范围 |
138
+ | **FS-04** | SHOULD | 图表文字继承正文/等宽字体,不设独立图表字号变量(无 `--font-size-mermaid`) | 检查变量清单 |
139
+ | **FS-05** | SHOULD | 标题行高(写在 `.cm-md-atxheading*` 的 `line-height`)∈ [1.15, 1.4],小于正文行高 | `heading < body` |
140
+
141
+ #### 2.2.4 字体栈构造规则
142
+
143
+ | Rule ID | 级别 | 规则 |
144
+ |---------|------|------|
145
+ | **FS-06** | MUST | 每个字体栈必须以通用字体族(`serif` / `sans-serif` / `monospace`)结尾 |
146
+ | **FS-07** | MUST | 字体栈中至少包含 1 个中文字体(覆盖 CJK 字符)和 1 个西文字体 |
147
+ | **FS-08** | SHOULD | 字体栈中同一字体族的不同字重变体(如 "Inter" 和 "Inter Display")只保留 1 个 |
148
+
149
+ ### 2.3 表面/背景层次规范
150
+
151
+ #### 2.3.1 明度阶梯约束
152
+
153
+ 页面视觉层次依赖三层表面的明度差异。
154
+
155
+ | Rule ID | 级别 | 规则 | 浅色主题 | 深色主题 |
156
+ |---------|------|------|---------|---------|
157
+ | **SH-01** | MUST | 相邻表面层明度差 ≥ 0.04 | `L(surface) - L(panel) ≥ 0.04` | `L(panel) - L(surface) ≥ 0.04` |
158
+ | **SH-02** | MUST | 代码块底色 (`--code-block-bg` 或 `--seed-panel-alt`) 与页面底色明度差 ≥ 0.06,确保代码区域肉眼可辨 | `abs(L(block) - L(surface)) ≥ 0.06` |
159
+ | **SH-03** | SHOULD | 三层表面 `surface → panel → panel-alt` 的明度差均匀(相邻层差值偏差 ≤ 50%) | `ratio(d1,d2) ≤ 1.5` |
160
+
161
+ #### 2.3.2 各语义表面最低对比度
162
+
163
+ | 语义角色 | 对应变量 | 与页面底色的最低对比度 |
164
+ |----------|---------|---------------------|
165
+ | 代码块背景 | `--code-block-bg` | 1.2:1(肉眼可辨即可,不宜过强) |
166
+ | 内联代码背景 | `--code-bg` | 1.15:1 |
167
+ | 引用块背景 | `--blockquote-bg` | 1.15:1 |
168
+ | 表头背景 | `--table-header-bg` | 1.5:1(需明显区分) |
169
+ | 图表节点填充 | `--pele-surface` | 1.2:1 |
170
+ | 图表聚类填充 | `--pele-surface-alt` | 1.1:1(极浅即可) |
171
+
172
+ ### 2.4 线条/边框规范
173
+
174
+ #### 2.4.1 边框色与底色关系
175
+
176
+ | Rule ID | 级别 | 规则 |
177
+ |---------|------|------|
178
+ | **BD-01** | MUST | 边框色 (`--seed-border`) 必须比其所在表面色暗:浅色主题 `L(border) < L(surface)`,深色主题反之 |
179
+ | **BD-02** | SHOULD | 强调边框 (`--seed-border-strong`) 比普通边框深 ≥ 0.15 明度差 |
180
+ | **BD-03** | SHOULD | 图表节点描边 (`--pele-border`) 与节点填充 (`--pele-surface`) 对比度 ≥ 2:1 |
181
+
182
+ #### 2.4.2 边框宽度层级
183
+
184
+ | 用途 | 推荐宽度 | 说明 |
185
+ |------|---------|------|
186
+ | 分割线 (hr) | 1px | 最细,仅起分隔作用 |
187
+ | 表格内边框 (td) | 1px | 细线,不抢内容 |
188
+ | 图表节点描边 | 1.5px | 略粗,确保图表清晰 |
189
+ | 引用块左侧竖线 | 4px | 最粗,视觉锚点 |
190
+ | 表头底线 | 2px | 区分表头与表体 |
191
+
192
+ ### 2.5 语义色角色映射规范
193
+
194
+ #### 2.5.1 强制映射表 (Mandatory)
195
+
196
+ 以下映射**必须**成立。变量值必须直接或间接来自种子色板。
197
+
198
+ | 语义变量 | 必须映射到 | 说明 |
199
+ |----------|-----------|------|
200
+ | `--bg-color` | `var(--seed-surface)` | 页面底色 = 最浅表面 |
201
+ | `--text-color` | `var(--seed-ink)` | 正文色 = 最深文字 |
202
+ | `--text-secondary` | `var(--seed-ink-muted)` | 次级文字 = 弱一档墨色 |
203
+ | `--text-muted` | `var(--seed-ink-dim)` | 弱化文字 = 注释/占位 |
204
+ | `--link-color` | `var(--seed-accent)` | 链接色 = 点缀色 |
205
+ | `--border-color` | `var(--seed-border)` | 边框色 = 中性灰 |
206
+ | `--code-bg` | `var(--seed-panel)` | 内联代码背景 = 中间表面 |
207
+ | `--code-block-bg` | `var(--seed-panel-alt)` | 代码块背景 = 最深表面 |
208
+ | `--code-block-text` | 与 `--code-block-bg` 对比度最高者(白/浅灰/`seed.surface`/`seed.ink`) | 代码块文字 |
209
+ | `--blockquote-bg` | `var(--seed-panel)` | 引用块背景 = 中间表面 |
210
+ | `--blockquote-border` | `var(--seed-ink)` 或 `var(--seed-accent)` | 引用竖线 = 正文色或点缀色 |
211
+ | `--table-header-bg` | `var(--seed-panel)` 或 `var(--seed-ink)` | 表头 = 浅底或黑底白字 |
212
+ | `--selection-bg` | `accent color + alpha 0.10~0.20` | 选区 = 点缀色半透明 |
213
+ | `--highlight-bg` | `accent color + alpha 0.10~0.20` | 高亮 = 点缀色半透明 |
214
+ | `--pele-*` | 由 `--code-block-bg` / `--code-block-text` / `--link-color` 经 `color-mix()` 推导 | 图表 9 变量 |
215
+
216
+ #### 2.5.2 禁止的映射 (Forbidden)
217
+
218
+ | Rule ID | 级别 | 禁止项 |
219
+ |---------|------|--------|
220
+ | **MP-01** | MUST NOT | `--text-color` 映射到 ⾮ `--seed-ink` 或 `--seed-ink-muted` 的其他来源 |
221
+ | **MP-02** | MUST NOT | `--bg-color` 映射到 ⾮ `--seed-surface` 的其他来源 |
222
+ | **MP-03** | MUST NOT | `--border-color` 映射到有彩色(非中性灰),HSL S > 0.05 |
223
+ | **MP-04** | MUST NOT | `--code-bg` 与 `--bg-color` 使用同一值(代码区不可见) |
224
+ | **MP-05** | MUST NOT | `--table-header-bg` 同时兼具浅底 + 浅字(表头必须可读) |
225
+
226
+ ### 2.6 规则优先级与冲突解决
227
+
228
+ 当多条规则冲突时,按以下优先级裁决:
229
+
230
+ ```
231
+ 1. MUST NOT > 2. MUST > 3. SHOULD NOT > 4. SHOULD
232
+ ```
233
+
234
+ - 任何 MUST NOT 规则被违反 → 主题**拒绝**(不合规)
235
+ - 任何 MUST 规则被违反 → 主题**拒绝**
236
+ - SHOULD NOT 被违反 → **警告**,需人工审核
237
+ - SHOULD 被违反 → **建议**,不阻止使用
238
+
239
+ 示例:若某个点缀色满足 HR-01(SHOULD),但违反 CR-04(MUST),则主题被拒绝。
240
+
241
+ ---
242
+
243
+ ## 3. 变量体系
244
+
245
+ ### 3.1 分层架构
246
+
247
+ ```
248
+ SECTION 1 设计令牌 (Design Tokens) ← 用户修改
249
+ SECTION 2 编辑器 DOM 选择器 (.cm-md-*) ← 可选微调
250
+ SECTION 3 导出 HTML (.colamd-document) ← 导出件配色
251
+ SECTION 4 打印 (media print) ← 保真补充
252
+ ```
253
+
254
+ **变量根块必须是 `:root`**,写在 `body.theme-*` 里编辑器继承不到。变量分三层(活 / 死 / 种子):
255
+
256
+ - **活变量**:`--bg-color --text-color --text-secondary --text-muted --border-color --link-color --code-bg --code-block-bg --code-block-text --blockquote-border --blockquote-bg --table-header-bg --selection-bg --highlight-bg --font-body --font-mono --editor-font-size --editor-column-width` + `--pele-*`(9 个)。
257
+ - **死变量(禁止写)**:`--surface-color --surface-alt --text-dim --heading-color --accent-color --accent-dark --accent-light --hr-color --code-color --code-block-color --table-border --scrollbar-thumb* --mermaid-* --radius-* --content-width --font-size-root --font-scale-* --line-height-* --font-heading --font-code --font-mermaid --font-size-mermaid`。
258
+ - **种子令牌**:`--seed-*`(生成器输入,手写主题可不写)。
259
+
260
+ ### 3.2 设计令牌:种子色板
261
+
262
+ 主题的视觉基调由 11 个种子令牌(4 组颜色 + 3 组文字 + 2 组边框)决定。手写主题可跳过这一层,直接写语义变量。
263
+
264
+ ```
265
+ --seed-accent 点缀色(链接、强调、图表高亮)
266
+ ├── --seed-accent-light 浅变体(用作背景)
267
+ └── --seed-accent-dark 深变体(用作 hover / 文字)
268
+
269
+ --seed-surface 页面底色(最浅层)
270
+ --seed-panel 卡片/代码区底色(中间层)
271
+ --seed-panel-alt 表头/引用块底色(最深表面层)
272
+
273
+ --seed-ink 正文/标题色(最深文字)
274
+ --seed-ink-muted 次要文字色
275
+ --seed-ink-dim 弱化/禁用文字色
276
+
277
+ --seed-border 常规边框色
278
+ --seed-border-strong 强调边框色
279
+ ```
280
+
281
+ **配色约束**:
282
+
283
+ | 主题类型 | 表面色关系 | 文字色关系 |
284
+ |----------|-----------|-----------|
285
+ | 浅色主题 | `surface` < `panel` < `panel-alt` (亮度递减) | `ink` > `muted` > `dim` (亮度递增) |
286
+ | 深色主题 | `surface` > `panel` > `panel-alt` (亮度递增) | `ink` < `muted` < `dim` (亮度递减) |
287
+ | 点缀色面积 | ≤ 页面 10%(链接 + 强调 + 图表节点描边) | |
288
+
289
+ ### 3.3 设计令牌:字体系统
290
+
291
+ ```
292
+ --font-body 正文字体栈(活变量,写在 :root)
293
+ --font-mono 等宽字体栈(活变量,代码/公式/图表)
294
+ 标题字体栈 写在 .cm-md-atxheading* 上(--font-heading 已死)
295
+ ```
296
+
297
+ **字体栈构造规范**:
298
+ 1. 西文字体在前(Windows / macOS / Linux 逐一覆盖)
299
+ 2. 中文字体居中(Serif 或 Sans Serif 按主题风格选择)
300
+ 3. 通用后备字体在末(`serif` / `sans-serif` / `monospace`)
301
+
302
+ ### 3.4 语义映射规则
303
+
304
+ 生成器把 11 个种子令牌映射为 2.7 的活变量(语义变量直接引用种子,不引入新色值):
305
+
306
+ | 活变量 | 映射来源 | 消费者 |
307
+ |--------|---------|--------|
308
+ | `--bg-color` | `--seed-surface` | 页面背景 |
309
+ | `--text-color` | `--seed-ink` | 正文颜色 |
310
+ | `--text-secondary` | `--seed-ink-muted` | 次级文字:引用、标签 |
311
+ | `--text-muted` | `--seed-ink-dim` | 压淡文字:行号、链接地址 |
312
+ | `--border-color` | `--seed-border` | 分隔线、表格边框 |
313
+ | `--link-color` | `--seed-accent` | 超链接、PeLe accent |
314
+ | `--code-bg` | `--seed-panel` | 内联代码背景 |
315
+ | `--code-block-bg` | `--seed-panel-alt` | 代码块背景 / Pele 画布底 |
316
+ | `--code-block-text` | 派生(见下) | 代码块文字 / Pele 前景 |
317
+ | `--blockquote-border` | `--seed-accent` | 引用块左竖线 |
318
+ | `--blockquote-bg` | `--seed-panel` | 引用块背景 |
319
+ | `--table-header-bg` | `--seed-panel` | 表头背景 |
320
+ | `--selection-bg` | `accent + 0.18 alpha` | 选区高亮 |
321
+ | `--highlight-bg` | `accent + 0.18 alpha` | `==高亮==` |
322
+ | `--font-body` | `fontBody` | 正文 |
323
+ | `--font-mono` | `fontCode` | 代码 / 图表 |
324
+ | `--editor-font-size` | `fontSizeRoot` | 编辑字号 |
325
+ | `--editor-column-width` | `contentWidth` | 阅读列宽 |
326
+
327
+ **`--code-block-text` 派生规则**:从 `--code-block-bg` 出发,在白、浅灰、`--bg-color`、`--text-color` 四档里挑对比度最高者 —— 深色代码块自动拿浅色文字,浅色代码块拿正文色。不得硬编码一套明暗两套的猜测逻辑。
328
+
329
+ **Pele 图表**:`--pele-*` 九个变量全部可省略,缺省值由 `--code-block-bg` / `--code-block-text` / `--link-color` 经 `color-mix()` 推导(对比度是算出来的)。主题只需在 `:root` 覆盖需要的档位。
330
+
331
+ ### 3.5 Pele 图表 9 变量
332
+
333
+ 上游 2.7.7 起图表引擎换成 Pele:SVG 内嵌 `var(--pele-*)`,在图落进的文档里取值,换主题即时生效,不需要重画。`--mermaid-*` 全部失效。
334
+
335
+ | 变量 | 画的是什么 | 缺省取值 |
336
+ |------|-----------|---------|
337
+ | `--pele-bg` | 画布底色 | `--code-block-bg` |
338
+ | `--pele-fg` | 文字 | `--code-block-text` |
339
+ | `--pele-muted` | 弱化文字 | 文字色与底色 70% 混合 |
340
+ | `--pele-line` | 连线与箭头 | `--code-block-text` |
341
+ | `--pele-surface` | 节点填充 | 文字色 18% 与底色混合 |
342
+ | `--pele-surface-alt` | 次级节点填充 | 文字色 28% 与底色混合 |
343
+ | `--pele-border` | 节点描边 | 文字色 45% 与底色混合 |
344
+ | `--pele-accent` | 强调色 | `--link-color` |
345
+ | `--pele-radius` | 圆角 | `6px` |
346
+
347
+ **规则**:
348
+ - 声明在 `:root` 上,写进别的选择器等于没写。
349
+ - 不必写齐:每个变量独立生效,缺省值本身从代码块底色与字色推导。
350
+ - 图直接画在代码块背景上:配色贴着 `--code-block-bg` 调。
351
+ - Word 导出不走变量(Pele 变量到不了 `<img>` 的 data URL),会内联一套固定浅色值。
352
+
353
+ ---
354
+
355
+ ## 4. 模块化规则
356
+
357
+ ### 4.1 继承而非重写
358
+
359
+ 内置系统已处理的样式,主题文件**禁止**重写其选择器。
360
+
361
+ | 内置文件 | 已处理内容 | 主题禁止 |
362
+ |----------|-----------|---------|
363
+ | `base.css` | 活变量默认值(`:root, body.theme-light`) | 在 `body.theme-*` 里重定义主题变量 |
364
+ | `editor-preview.css` | `.cm-content` / `.cm-line` 的字体、字号、行高、列宽、内边距基线 | 重写已被变量覆盖的排版规则;给 `.cm-line` 之外的元素加行内边距 |
365
+ | `document.css` | `.colamd-document` 下 h1/p/ul/pre/table 的结构排版 | 重写导出件的结构规则(只补配色) |
366
+
367
+ ### 4.2 允许的微调选择器
368
+
369
+ 以下选择器**允许**在主题中定义(内置系统未覆盖或不满足个性化需求):
370
+
371
+ | 允许的选择器 | 用途 | 约束 |
372
+ |-------------|------|------|
373
+ | `#editor .cm-content` | 正文字体、行高 | 引用 `var(--font-body)` |
374
+ | `#editor .cm-content .cm-md-atxheading1..6` | 标题字体/颜色/字号/底线 | 字号用 `em`,不得用 `pt` |
375
+ | `#editor .cm-content .cm-md-strong/.cm-md-em/.cm-md-strike/.cm-md-inlinecode/.cm-md-highlight` | 行内样式 | 引用活变量 |
376
+ | `#editor .cm-content .cm-md-link/.cm-md-url` | 链接文字与地址 | 引用 `var(--link-color)` / `var(--text-muted)` |
377
+ | `#editor .cm-content .cm-md-blockquote` | 引用块底色、左竖线 | **只给左右 padding** |
378
+ | `#editor .cm-content .cm-md-codeblock(-first/-last)` | 代码块底色、文字、首末行圆角 | **只给左右 padding** |
379
+ | `#editor .cm-content .cm-md-table-widget th/td` | 表头底色、单元格边框 | 引用活变量 |
380
+ | `#editor .cm-content .cm-md-hr` | 分隔线颜色 | 引用 `var(--border-color)` |
381
+ | `#editor .cm-content .cm-md-li-0..6` | 列表层级样式 | 不得改纵向间距 |
382
+ | `.colamd-document ...` | 导出件配色 | 只补配色,不重写结构 |
383
+ | `@media print` | 打印保真 | 只补 `print-color-adjust`,不写镜像 |
384
+
385
+ ### 4.3 度量指标
386
+
387
+ | 指标 | 目标值 | 说明 |
388
+ |------|--------|------|
389
+ | 主题文件总行数 | ≤ 300 行 | 含注释和空行 |
390
+ | 死选择器数量 | 0 | `#write` / `.ProseMirror` / `body.theme-custom` / `.mermaid-*` 一律禁止 |
391
+ | 死变量数量 | 0 | `--mermaid-*` / `--radius-*` / `--font-size-root` 等一律禁止 |
392
+ | `pt` 单位数量 | 0 | 统一用 `px` / `em` / `rem` |
393
+ | 根块位置 | `:root` | 变量必须写在 `:root` |
394
+ | 用户需修改的变量数 | ≤ 18 | 集中在 SECTION 1 |
395
+
396
+ ---
397
+
398
+ ## 5. 文件结构规范
399
+
400
+ ### 5.1 必须的 SECTION
401
+
402
+ ```
403
+ SECTION 1 Design Tokens — :root 活变量(用户编辑区)
404
+ ├── 1.1 语义色(14 个)
405
+ ├── 1.2 字体与度量(4 个)
406
+ └── 1.3 Pele 图表(9 个,可选)
407
+
408
+ SECTION 2 编辑器 DOM — #editor .cm-content + .cm-md-*
409
+ ├── 2.1 正文与标题
410
+ ├── 2.2 行内格式
411
+ ├── 2.3 引用块 / 代码块
412
+ ├── 2.4 表格 / 分隔线
413
+ └── 2.5 首行缩进与排除
414
+
415
+ SECTION 3 导出 HTML — .colamd-document(只补配色)
416
+
417
+ SECTION 4 @media print(只补 print-color-adjust)
418
+ ```
419
+
420
+ ### 5.2 选择器规则
421
+
422
+ | 规则 | 说明 |
423
+ |------|------|
424
+ | 根选择器 | 变量定义在 `:root { }` 内 |
425
+ | 编辑器选择器 | 一律 `#editor .cm-content .cm-md-*`(两个类才压得住 CodeMirror baseTheme) |
426
+ | 引用/代码块内边距 | 只允许 `padding-left` / `padding-right`,禁止纵向 padding |
427
+ | `!important` | 禁止使用(`@media print` 里也只用于 `print-color-adjust`) |
428
+ | `pt` 单位 | 禁止使用,统一 `px` / `em` / `rem` |
429
+ | 层叠顺序 | 变量定义块在前,选择器规则块在后 |
430
+ | 导出件 | `.colamd-document` 只补配色;结构排版由 `document.css` 提供 |
431
+
432
+ ### 5.3 注释规范
433
+
434
+ ```css
435
+ /* ── X.X 功能描述(中文)── */
436
+ /* 用于 xxx 场景的 xxx 变量 */
437
+ --variable-name: value;
438
+
439
+ /* ═══════════════════ 分隔大节 ═══════════════════ */
440
+ ```
441
+
442
+ ---
443
+
444
+ ## 6. 打印保真规范 (Print Fidelity)
445
+
446
+ ### 6.1 核心约束
447
+
448
+ 2.7 起 PDF 导出直接对**当前窗口** `printToPDF()`:屏幕上的主题 CSS 原样生效,Chromium 不再拿到一份独立的设计。因此:
449
+
450
+ - **不写镜像**:不再把每条屏幕规则复制到 `@media print` 加 `!important`。
451
+ - **不重声明变量**:`@media print` 里重新注入 `--seed-*` 的旧做法已删除。
452
+ - **只补保真**:`@media print` 里保留 `print-color-adjust: exact`,让背景色与自定义颜色进入 PDF。
453
+
454
+ ### 6.2 打印块
455
+
456
+ ```css
457
+ @media print {
458
+ html,
459
+ body {
460
+ background: var(--bg-color);
461
+ color: var(--text-color);
462
+ -webkit-print-color-adjust: exact;
463
+ print-color-adjust: exact;
464
+ }
465
+ }
466
+ ```
467
+
468
+ 语义标签的导出件(`.colamd-document`)由 `document.css` 提供结构,主题只补配色,打印时同样自动生效。
469
+
470
+ ### 6.3 打印验证清单
471
+
472
+ - [ ] 页面底色与屏幕一致(非灰底)
473
+ - [ ] 标题颜色与屏幕一致
474
+ - [ ] 内联代码、代码块底色存在
475
+ - [ ] 引用块底色与左竖线存在
476
+ - [ ] 表头底色存在
477
+ - [ ] Pele 图表配色与屏幕一致
478
+ - [ ] 链接颜色不是浏览器默认蓝
479
+ - [ ] 导出件中没有 `#write` / `.ProseMirror` 时期的空规则
480
+
481
+ ---
482
+
483
+ ## 7. AI Agent 编写指南
484
+
485
+ ### 7.1 创建新主题
486
+
487
+ 1. 复制 `themes/template.css` 为基础
488
+ 2. 确定配色方向(浅色/深色/暖调/冷调/学术)
489
+ 3. 填写 SECTION 1 的 14 个语义色 + `--font-body` / `--font-mono`
490
+ 4. 需要微调时只改 SECTION 2 的 `.cm-md-*` 规则
491
+ 5. 运行 `colamd-themes validate <file>` 确认 `:root`、死选择器、死变量、`pt` 与纵向 padding 全部通过
492
+ 6. 保存,导入测试
493
+
494
+ ### 7.2 修改现有主题
495
+
496
+ 1. 只修改 `:root` 里的语义变量与 Pele 变量
497
+ 2. 选择器层没有对应变量时才加 `.cm-md-*` 规则
498
+ 3. 主题文件里出现 `--mermaid-*`、`--font-size-root`、`#write`,一律视为未迁移
499
+
500
+ ### 7.3 禁止操作
501
+
502
+ - 在 `:root` 之外定义主题变量
503
+ - 使用死变量(`--surface-color` / `--heading-color` / `--accent-color` / `--hr-color` / `--code-color` / `--font-size-root` / `--content-width` / `--radius-*` / `--mermaid-*` …)
504
+ - 使用死选择器(`#write` / `.ProseMirror` / `body.theme-custom` / `.mermaid-block`)
505
+ - 给 `.cm-md-blockquote` / `.cm-md-codeblock` 加纵向 padding
506
+ - 使用 `pt` 单位
507
+ - 使用 `!important`(`@media print` 的 `print-color-adjust` 除外)
508
+ - 写 Mermaid SVG 选择器或 Pele 内部节点选择器(只覆盖 `--pele-*`)
509
+
510
+ ---
511
+
512
+ ## 8. 现有主题对标
513
+
514
+ | 主题 | 行数 | 范式符合度 | 迁移建议 |
515
+ |------|------|-----------|---------|
516
+ | 上游 `resources/templates/themes/*.css`(5 套) | 50~90 | 高(2.7 已移植范例) | 作为写法基准直接对照 |
517
+ | `academic-paper.css` | ~1300 | 低(v3 选择器全量) | 按 SECTION 重写,保留学术排版规则到 `.cm-md-*` |
518
+ | `guizang.css` / `elegant.css` / `forest-ink.css` / `pixso-design.css` | ~700~750 | 低(`#write` / `.ProseMirror`) | 全量迁移至 `.cm-md-*`,目标 ~200 行 |
519
+ | `word-contract.css` | — | 低(v3 契约) | 全量迁移,保留合同专用规则 |
520
+
521
+ ---
522
+
523
+ ## 9. 版本历史
524
+
525
+ | 版本 | 日期 | 变更 |
526
+ |------|------|------|
527
+ | v4.0 | 2026-10-23 | 对齐 ColaMD Extend 2.7(CodeMirror 6 + Pele):根块改 `:root`;活/死变量清单;`.cm-md-*` 选择器取代 `#write`/`.ProseMirror`;Mermaid 20 变量 → Pele 9 变量;新增 `.colamd-document` 导出段;打印改为「不写镜像、只补保真」;新增死选择器/死变量/`pt`/纵向 padding 校验 |
528
+ | v3.2 | 2026-05-23 | 新增 Section 2「设计规范」:色彩空间、字体搭配、表面层次、线条边框的强制性约束(含 Rule ID、WCAG 对比度公式、色彩协调矩阵),支持 AI Agent 程序化验证 |
529
+ | v3.1 | 2026-05-23 | 新增「打印保真」原则与完整 `@media print` 规范(Section 6) |
530
+ | v3.0 | 2026-05-23 | 初始范式定义。提出种子色板 + 语义映射 + 内置继承的三层架构 |