@incremark/theme 0.2.3
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.
- package/LICENSE +22 -0
- package/README.en.md +133 -0
- package/README.md +187 -0
- package/dist/index.d.ts +375 -0
- package/dist/index.js +440 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +937 -0
- package/dist/styles.css.map +1 -0
- package/package.json +48 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import { generateBrand } from '@incremark/colors';
|
|
2
|
+
|
|
3
|
+
// src/themes/default.ts
|
|
4
|
+
var brandColors = generateBrand("#3b82f6");
|
|
5
|
+
var neutralSeries = {
|
|
6
|
+
1: "#ffffff",
|
|
7
|
+
2: "#f8f9fc",
|
|
8
|
+
// 稍微偏蓝一点
|
|
9
|
+
3: "#f1f3f8",
|
|
10
|
+
// 稍微偏蓝
|
|
11
|
+
4: "#e2e5ec",
|
|
12
|
+
// 稍微调整
|
|
13
|
+
5: "#cdd1da",
|
|
14
|
+
// 稍微调整
|
|
15
|
+
6: "#9ca4b1",
|
|
16
|
+
// 稍微调整
|
|
17
|
+
7: "#677284",
|
|
18
|
+
// 稍微调整
|
|
19
|
+
8: "#34435a",
|
|
20
|
+
// 稍微偏蓝
|
|
21
|
+
9: "#011431",
|
|
22
|
+
// 稍微调整
|
|
23
|
+
10: "#01122d"
|
|
24
|
+
// 稍微调整
|
|
25
|
+
};
|
|
26
|
+
var baseBlue = generateBrand("#3b82f6");
|
|
27
|
+
var basePurple = generateBrand("#a855f7");
|
|
28
|
+
var baseGreen = generateBrand("#10b981");
|
|
29
|
+
var baseRed = generateBrand("#ef4444");
|
|
30
|
+
var baseOrange = generateBrand("#f97316");
|
|
31
|
+
var baseCyan = generateBrand("#06b6d4");
|
|
32
|
+
var defaultTheme = {
|
|
33
|
+
// ============ 基础色系统 ============
|
|
34
|
+
baseColors: {
|
|
35
|
+
blue: {
|
|
36
|
+
1: baseBlue.palette[1],
|
|
37
|
+
2: baseBlue.palette[2],
|
|
38
|
+
3: baseBlue.palette[3],
|
|
39
|
+
4: baseBlue.palette[4],
|
|
40
|
+
5: baseBlue.palette[5],
|
|
41
|
+
6: baseBlue.palette[6],
|
|
42
|
+
// 主色
|
|
43
|
+
7: baseBlue.palette[7],
|
|
44
|
+
8: baseBlue.palette[8],
|
|
45
|
+
9: baseBlue.palette[9],
|
|
46
|
+
10: baseBlue.palette[10]
|
|
47
|
+
},
|
|
48
|
+
purple: {
|
|
49
|
+
1: basePurple.palette[1],
|
|
50
|
+
2: basePurple.palette[2],
|
|
51
|
+
3: basePurple.palette[3],
|
|
52
|
+
4: basePurple.palette[4],
|
|
53
|
+
5: basePurple.palette[5],
|
|
54
|
+
6: basePurple.palette[6],
|
|
55
|
+
// 主色
|
|
56
|
+
7: basePurple.palette[7],
|
|
57
|
+
8: basePurple.palette[8],
|
|
58
|
+
9: basePurple.palette[9],
|
|
59
|
+
10: basePurple.palette[10]
|
|
60
|
+
},
|
|
61
|
+
green: {
|
|
62
|
+
1: baseGreen.palette[1],
|
|
63
|
+
2: baseGreen.palette[2],
|
|
64
|
+
3: baseGreen.palette[3],
|
|
65
|
+
4: baseGreen.palette[4],
|
|
66
|
+
5: baseGreen.palette[5],
|
|
67
|
+
6: baseGreen.palette[6],
|
|
68
|
+
// 主色
|
|
69
|
+
7: baseGreen.palette[7],
|
|
70
|
+
8: baseGreen.palette[8],
|
|
71
|
+
9: baseGreen.palette[9],
|
|
72
|
+
10: baseGreen.palette[10]
|
|
73
|
+
},
|
|
74
|
+
red: {
|
|
75
|
+
1: baseRed.palette[1],
|
|
76
|
+
2: baseRed.palette[2],
|
|
77
|
+
3: baseRed.palette[3],
|
|
78
|
+
4: baseRed.palette[4],
|
|
79
|
+
5: baseRed.palette[5],
|
|
80
|
+
6: baseRed.palette[6],
|
|
81
|
+
// 主色
|
|
82
|
+
7: baseRed.palette[7],
|
|
83
|
+
8: baseRed.palette[8],
|
|
84
|
+
9: baseRed.palette[9],
|
|
85
|
+
10: baseRed.palette[10]
|
|
86
|
+
},
|
|
87
|
+
orange: {
|
|
88
|
+
1: baseOrange.palette[1],
|
|
89
|
+
2: baseOrange.palette[2],
|
|
90
|
+
3: baseOrange.palette[3],
|
|
91
|
+
4: baseOrange.palette[4],
|
|
92
|
+
5: baseOrange.palette[5],
|
|
93
|
+
6: baseOrange.palette[6],
|
|
94
|
+
// 主色
|
|
95
|
+
7: baseOrange.palette[7],
|
|
96
|
+
8: baseOrange.palette[8],
|
|
97
|
+
9: baseOrange.palette[9],
|
|
98
|
+
10: baseOrange.palette[10]
|
|
99
|
+
},
|
|
100
|
+
cyan: {
|
|
101
|
+
1: baseCyan.palette[1],
|
|
102
|
+
2: baseCyan.palette[2],
|
|
103
|
+
3: baseCyan.palette[3],
|
|
104
|
+
4: baseCyan.palette[4],
|
|
105
|
+
5: baseCyan.palette[5],
|
|
106
|
+
6: baseCyan.palette[6],
|
|
107
|
+
// 主色
|
|
108
|
+
7: baseCyan.palette[7],
|
|
109
|
+
8: baseCyan.palette[8],
|
|
110
|
+
9: baseCyan.palette[9],
|
|
111
|
+
10: baseCyan.palette[10]
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
color: {
|
|
115
|
+
// ============ Neutral 中性色系统 ============
|
|
116
|
+
neutral: {
|
|
117
|
+
1: neutralSeries[1],
|
|
118
|
+
2: neutralSeries[2],
|
|
119
|
+
3: neutralSeries[3],
|
|
120
|
+
4: neutralSeries[4],
|
|
121
|
+
5: neutralSeries[5],
|
|
122
|
+
6: neutralSeries[6],
|
|
123
|
+
7: neutralSeries[7],
|
|
124
|
+
8: neutralSeries[8],
|
|
125
|
+
9: neutralSeries[9],
|
|
126
|
+
10: neutralSeries[10]
|
|
127
|
+
},
|
|
128
|
+
// ============ 品牌主题色(自动生成)============
|
|
129
|
+
brand: {
|
|
130
|
+
primary: brandColors.primary,
|
|
131
|
+
primaryHover: brandColors.hover,
|
|
132
|
+
primaryActive: brandColors.active,
|
|
133
|
+
primaryLight: brandColors.light
|
|
134
|
+
},
|
|
135
|
+
// ============ 语义化颜色(基于 neutral) ============
|
|
136
|
+
text: {
|
|
137
|
+
primary: neutralSeries[8],
|
|
138
|
+
// neutral-8
|
|
139
|
+
secondary: neutralSeries[7],
|
|
140
|
+
// neutral-7
|
|
141
|
+
tertiary: neutralSeries[6],
|
|
142
|
+
// neutral-6
|
|
143
|
+
inverse: neutralSeries[1]
|
|
144
|
+
// neutral-1
|
|
145
|
+
},
|
|
146
|
+
background: {
|
|
147
|
+
base: neutralSeries[1],
|
|
148
|
+
// neutral-1
|
|
149
|
+
elevated: neutralSeries[2],
|
|
150
|
+
// neutral-2
|
|
151
|
+
overlay: "rgba(1, 20, 49, 0.6)"
|
|
152
|
+
// neutral-9 with alpha
|
|
153
|
+
},
|
|
154
|
+
border: {
|
|
155
|
+
default: neutralSeries[4],
|
|
156
|
+
// neutral-4 - 浅灰色边框
|
|
157
|
+
subtle: neutralSeries[3],
|
|
158
|
+
// neutral-3 - 极浅边框
|
|
159
|
+
strong: neutralSeries[7]
|
|
160
|
+
// neutral-7 - 深灰色边框
|
|
161
|
+
},
|
|
162
|
+
code: {
|
|
163
|
+
inlineBackground: neutralSeries[3],
|
|
164
|
+
// neutral-3 - 行内代码浅色背景
|
|
165
|
+
inlineText: neutralSeries[8],
|
|
166
|
+
// neutral-8 - 行内代码深色文本
|
|
167
|
+
blockBackground: neutralSeries[9],
|
|
168
|
+
// neutral-9 - 代码块深色背景
|
|
169
|
+
blockText: neutralSeries[2],
|
|
170
|
+
// neutral-2 - 代码块浅色文本
|
|
171
|
+
headerBackground: neutralSeries[10]
|
|
172
|
+
// neutral-10 - 代码块头部更深背景
|
|
173
|
+
// border 使用通用的 border.strong,不单独定义
|
|
174
|
+
},
|
|
175
|
+
status: {
|
|
176
|
+
pending: basePurple.palette[6],
|
|
177
|
+
// 使用紫色系主色
|
|
178
|
+
completed: baseGreen.palette[6]
|
|
179
|
+
// 使用绿色系主色
|
|
180
|
+
},
|
|
181
|
+
// ============ 交互元素颜色 ============
|
|
182
|
+
interactive: {
|
|
183
|
+
link: brandColors.primary,
|
|
184
|
+
// 使用品牌主色
|
|
185
|
+
linkHover: brandColors.hover,
|
|
186
|
+
// 使用 hover 变体
|
|
187
|
+
linkVisited: basePurple.palette[7],
|
|
188
|
+
// 使用紫色系深色表示访问过
|
|
189
|
+
checked: baseGreen.palette[6]
|
|
190
|
+
// 使用绿色系主色表示选中
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
typography: {
|
|
194
|
+
fontFamily: {
|
|
195
|
+
base: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif",
|
|
196
|
+
mono: "'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace"
|
|
197
|
+
},
|
|
198
|
+
fontSize: {
|
|
199
|
+
xs: "11px",
|
|
200
|
+
sm: "12px",
|
|
201
|
+
base: "14px",
|
|
202
|
+
md: "16px",
|
|
203
|
+
lg: "18px",
|
|
204
|
+
heading: {
|
|
205
|
+
h1: "2em",
|
|
206
|
+
h2: "1.5em",
|
|
207
|
+
h3: "1.25em",
|
|
208
|
+
h4: "1em",
|
|
209
|
+
h5: "0.875em",
|
|
210
|
+
h6: "0.85em"
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
fontWeight: {
|
|
214
|
+
normal: 400,
|
|
215
|
+
medium: 500,
|
|
216
|
+
semibold: 600,
|
|
217
|
+
bold: 700
|
|
218
|
+
},
|
|
219
|
+
lineHeight: {
|
|
220
|
+
tight: 1.25,
|
|
221
|
+
normal: 1.5,
|
|
222
|
+
relaxed: 1.75
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
spacing: {
|
|
226
|
+
xs: "4px",
|
|
227
|
+
sm: "8px",
|
|
228
|
+
md: "12px",
|
|
229
|
+
lg: "16px",
|
|
230
|
+
xl: "24px"
|
|
231
|
+
},
|
|
232
|
+
border: {
|
|
233
|
+
radius: {
|
|
234
|
+
sm: "4px",
|
|
235
|
+
md: "8px",
|
|
236
|
+
lg: "12px"
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
shadow: {
|
|
240
|
+
sm: "0 1px 2px rgba(0, 0, 0, 0.05)",
|
|
241
|
+
md: "0 4px 6px rgba(0, 0, 0, 0.1)",
|
|
242
|
+
lg: "0 10px 15px rgba(0, 0, 0, 0.1)"
|
|
243
|
+
},
|
|
244
|
+
animation: {
|
|
245
|
+
duration: {
|
|
246
|
+
fast: "150ms",
|
|
247
|
+
normal: "200ms",
|
|
248
|
+
slow: "300ms"
|
|
249
|
+
},
|
|
250
|
+
easing: {
|
|
251
|
+
easeInOut: "cubic-bezier(0.4, 0, 0.2, 1)",
|
|
252
|
+
easeOut: "cubic-bezier(0, 0, 0.2, 1)"
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
var darkBrandColors = generateBrand("#60a5fa");
|
|
257
|
+
var darkBasePurple = generateBrand("#c084fc");
|
|
258
|
+
var darkBaseGreen = generateBrand("#34d399");
|
|
259
|
+
var darkNeutralSeries = {
|
|
260
|
+
1: "#0a1628",
|
|
261
|
+
2: "#162033",
|
|
262
|
+
3: "#273548",
|
|
263
|
+
4: "#546070",
|
|
264
|
+
5: "#8891a0",
|
|
265
|
+
6: "#cdd1da",
|
|
266
|
+
7: "#e2e5ec",
|
|
267
|
+
8: "#f1f3f8",
|
|
268
|
+
9: "#f8f9fc",
|
|
269
|
+
10: "#ffffff"
|
|
270
|
+
};
|
|
271
|
+
var darkTheme = {
|
|
272
|
+
...defaultTheme,
|
|
273
|
+
// 继承亮色主题的基础色系统(baseColors 保持一致)
|
|
274
|
+
baseColors: defaultTheme.baseColors,
|
|
275
|
+
color: {
|
|
276
|
+
// ============ Neutral 中性色系统(暗色模式反转) ============
|
|
277
|
+
neutral: {
|
|
278
|
+
1: darkNeutralSeries[1],
|
|
279
|
+
2: darkNeutralSeries[2],
|
|
280
|
+
3: darkNeutralSeries[3],
|
|
281
|
+
4: darkNeutralSeries[4],
|
|
282
|
+
5: darkNeutralSeries[5],
|
|
283
|
+
6: darkNeutralSeries[6],
|
|
284
|
+
7: darkNeutralSeries[7],
|
|
285
|
+
8: darkNeutralSeries[8],
|
|
286
|
+
9: darkNeutralSeries[9],
|
|
287
|
+
10: darkNeutralSeries[10]
|
|
288
|
+
},
|
|
289
|
+
// ============ 品牌主题色(暗色模式自动生成)============
|
|
290
|
+
brand: {
|
|
291
|
+
primary: darkBrandColors.primary,
|
|
292
|
+
primaryHover: darkBrandColors.hover,
|
|
293
|
+
primaryActive: darkBrandColors.active,
|
|
294
|
+
primaryLight: darkBrandColors.light
|
|
295
|
+
},
|
|
296
|
+
// ============ 语义化颜色 ============
|
|
297
|
+
text: {
|
|
298
|
+
primary: darkNeutralSeries[8],
|
|
299
|
+
// neutral-8 (dark)
|
|
300
|
+
secondary: darkNeutralSeries[7],
|
|
301
|
+
// neutral-7 (dark)
|
|
302
|
+
tertiary: darkNeutralSeries[6],
|
|
303
|
+
// neutral-6 (dark)
|
|
304
|
+
inverse: darkNeutralSeries[1]
|
|
305
|
+
// neutral-1 (dark)
|
|
306
|
+
},
|
|
307
|
+
background: {
|
|
308
|
+
base: darkNeutralSeries[1],
|
|
309
|
+
// neutral-1 (dark)
|
|
310
|
+
elevated: darkNeutralSeries[2],
|
|
311
|
+
// neutral-2 (dark)
|
|
312
|
+
overlay: "rgba(0, 0, 0, 0.75)"
|
|
313
|
+
},
|
|
314
|
+
border: {
|
|
315
|
+
subtle: darkNeutralSeries[3],
|
|
316
|
+
// neutral-3 (dark) - 极浅边框
|
|
317
|
+
default: darkNeutralSeries[4],
|
|
318
|
+
// neutral-4 (dark) - 浅灰色边框
|
|
319
|
+
strong: darkNeutralSeries[7]
|
|
320
|
+
// neutral-7 (dark) - 深灰色边框
|
|
321
|
+
},
|
|
322
|
+
code: {
|
|
323
|
+
inlineBackground: darkNeutralSeries[3],
|
|
324
|
+
// neutral-3 (dark) - 行内代码适中暗色背景
|
|
325
|
+
inlineText: darkNeutralSeries[8],
|
|
326
|
+
// neutral-8 (dark) - 行内代码浅色文本
|
|
327
|
+
blockBackground: darkNeutralSeries[3],
|
|
328
|
+
// neutral-2 (dark) - 代码块深色背景
|
|
329
|
+
blockText: darkNeutralSeries[9],
|
|
330
|
+
// neutral-9 (dark) - 代码块极浅文本
|
|
331
|
+
headerBackground: darkNeutralSeries[2]
|
|
332
|
+
// neutral-2 (dark) - 代码块头部背景
|
|
333
|
+
// border 使用通用的 border.strong,不单独定义
|
|
334
|
+
},
|
|
335
|
+
status: {
|
|
336
|
+
pending: darkBasePurple.palette[6],
|
|
337
|
+
// 使用暗色紫色系主色
|
|
338
|
+
completed: darkBaseGreen.palette[6]
|
|
339
|
+
// 使用暗色绿色系主色
|
|
340
|
+
},
|
|
341
|
+
// ============ 交互元素颜色 ============
|
|
342
|
+
interactive: {
|
|
343
|
+
link: darkBrandColors.primary,
|
|
344
|
+
// 使用暗色品牌主色
|
|
345
|
+
linkHover: darkBrandColors.hover,
|
|
346
|
+
// 使用 hover 变体
|
|
347
|
+
linkVisited: darkBasePurple.palette[4],
|
|
348
|
+
// 使用暗色紫色系浅色
|
|
349
|
+
checked: darkBaseGreen.palette[6]
|
|
350
|
+
// 使用暗色绿色系主色
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
// 其他 Token 继承自 defaultTheme
|
|
354
|
+
typography: defaultTheme.typography,
|
|
355
|
+
spacing: defaultTheme.spacing,
|
|
356
|
+
border: defaultTheme.border,
|
|
357
|
+
shadow: defaultTheme.shadow,
|
|
358
|
+
animation: defaultTheme.animation
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
// src/utils/generate-css-vars.ts
|
|
362
|
+
function objectToCSSVars(obj, prefix, result = []) {
|
|
363
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
364
|
+
const varName = prefix ? `${prefix}-${key}` : key;
|
|
365
|
+
const kebabKey = varName.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
366
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
367
|
+
objectToCSSVars(value, kebabKey, result);
|
|
368
|
+
} else {
|
|
369
|
+
result.push(` --${kebabKey}: ${value};`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
function generateCSSVars(tokens, options = {}) {
|
|
374
|
+
const { prefix = "incremark", selector = ":root" } = options;
|
|
375
|
+
const vars = [];
|
|
376
|
+
objectToCSSVars(tokens, prefix, vars);
|
|
377
|
+
if (vars.length === 0) {
|
|
378
|
+
return selector ? `${selector} {}` : "";
|
|
379
|
+
}
|
|
380
|
+
if (!selector) {
|
|
381
|
+
return vars.join("\n");
|
|
382
|
+
}
|
|
383
|
+
return `${selector} {
|
|
384
|
+
${vars.join("\n")}
|
|
385
|
+
}`;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// src/utils/merge-theme.ts
|
|
389
|
+
function deepMerge(target, source) {
|
|
390
|
+
const result = { ...target };
|
|
391
|
+
for (const key in source) {
|
|
392
|
+
if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key])) {
|
|
393
|
+
result[key] = deepMerge(
|
|
394
|
+
target[key] || {},
|
|
395
|
+
source[key]
|
|
396
|
+
);
|
|
397
|
+
} else if (source[key] !== void 0) {
|
|
398
|
+
result[key] = source[key];
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return result;
|
|
402
|
+
}
|
|
403
|
+
function mergeTheme(base, override) {
|
|
404
|
+
return deepMerge(base, override);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// src/utils/apply-theme.ts
|
|
408
|
+
function applyTheme(element = document, theme) {
|
|
409
|
+
const target = element === document ? document.documentElement : element;
|
|
410
|
+
if (typeof theme === "string") {
|
|
411
|
+
if (theme === "dark") {
|
|
412
|
+
target.classList.add("theme-dark");
|
|
413
|
+
target.setAttribute("data-theme", "dark");
|
|
414
|
+
} else {
|
|
415
|
+
target.classList.remove("theme-dark");
|
|
416
|
+
target.removeAttribute("data-theme");
|
|
417
|
+
}
|
|
418
|
+
target.style.cssText = "";
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
let finalTheme;
|
|
422
|
+
const isCompleteTheme = theme.color?.text?.primary !== void 0 && theme.typography?.fontFamily?.base !== void 0 && theme.spacing?.sm !== void 0;
|
|
423
|
+
if (isCompleteTheme) {
|
|
424
|
+
finalTheme = theme;
|
|
425
|
+
} else {
|
|
426
|
+
finalTheme = mergeTheme(defaultTheme, theme);
|
|
427
|
+
}
|
|
428
|
+
target.classList.remove("theme-dark");
|
|
429
|
+
target.removeAttribute("data-theme");
|
|
430
|
+
const cssVars = generateCSSVars(finalTheme, {
|
|
431
|
+
prefix: "incremark",
|
|
432
|
+
selector: ""
|
|
433
|
+
// 空选择器,只生成变量声明
|
|
434
|
+
});
|
|
435
|
+
target.style.cssText = cssVars;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
export { applyTheme, darkTheme, defaultTheme, generateCSSVars, mergeTheme };
|
|
439
|
+
//# sourceMappingURL=index.js.map
|
|
440
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/themes/default.ts","../src/themes/dark.ts","../src/utils/generate-css-vars.ts","../src/utils/merge-theme.ts","../src/utils/apply-theme.ts"],"names":["generateBrand"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 默认主题值定义\n */\n\nimport type { DesignTokens } from '../tokens'\nimport { generateBrand } from '@incremark/colors'\n\n// 生成品牌色(蓝色系)\nconst brandColors = generateBrand('#3b82f6')\n\n// 中性色系列(微调后的颜色,与公司颜色有细微差异)\nconst neutralSeries = {\n 1: '#ffffff',\n 2: '#f8f9fc', // 稍微偏蓝一点\n 3: '#f1f3f8', // 稍微偏蓝\n 4: '#e2e5ec', // 稍微调整\n 5: '#cdd1da', // 稍微调整\n 6: '#9ca4b1', // 稍微调整\n 7: '#677284', // 稍微调整\n 8: '#34435a', // 稍微偏蓝\n 9: '#011431', // 稍微调整\n 10: '#01122d' // 稍微调整\n} as const;\n\n// 基础色系统(使用自动生成)\nconst baseBlue = generateBrand('#3b82f6')\nconst basePurple = generateBrand('#a855f7')\nconst baseGreen = generateBrand('#10b981')\nconst baseRed = generateBrand('#ef4444')\nconst baseOrange = generateBrand('#f97316')\nconst baseCyan = generateBrand('#06b6d4')\n\nexport const defaultTheme: DesignTokens = {\n // ============ 基础色系统 ============\n baseColors: {\n blue: {\n 1: baseBlue.palette[1],\n 2: baseBlue.palette[2],\n 3: baseBlue.palette[3],\n 4: baseBlue.palette[4],\n 5: baseBlue.palette[5],\n 6: baseBlue.palette[6], // 主色\n 7: baseBlue.palette[7],\n 8: baseBlue.palette[8],\n 9: baseBlue.palette[9],\n 10: baseBlue.palette[10]\n },\n purple: {\n 1: basePurple.palette[1],\n 2: basePurple.palette[2],\n 3: basePurple.palette[3],\n 4: basePurple.palette[4],\n 5: basePurple.palette[5],\n 6: basePurple.palette[6], // 主色\n 7: basePurple.palette[7],\n 8: basePurple.palette[8],\n 9: basePurple.palette[9],\n 10: basePurple.palette[10]\n },\n green: {\n 1: baseGreen.palette[1],\n 2: baseGreen.palette[2],\n 3: baseGreen.palette[3],\n 4: baseGreen.palette[4],\n 5: baseGreen.palette[5],\n 6: baseGreen.palette[6], // 主色\n 7: baseGreen.palette[7],\n 8: baseGreen.palette[8],\n 9: baseGreen.palette[9],\n 10: baseGreen.palette[10]\n },\n red: {\n 1: baseRed.palette[1],\n 2: baseRed.palette[2],\n 3: baseRed.palette[3],\n 4: baseRed.palette[4],\n 5: baseRed.palette[5],\n 6: baseRed.palette[6], // 主色\n 7: baseRed.palette[7],\n 8: baseRed.palette[8],\n 9: baseRed.palette[9],\n 10: baseRed.palette[10]\n },\n orange: {\n 1: baseOrange.palette[1],\n 2: baseOrange.palette[2],\n 3: baseOrange.palette[3],\n 4: baseOrange.palette[4],\n 5: baseOrange.palette[5],\n 6: baseOrange.palette[6], // 主色\n 7: baseOrange.palette[7],\n 8: baseOrange.palette[8],\n 9: baseOrange.palette[9],\n 10: baseOrange.palette[10]\n },\n cyan: {\n 1: baseCyan.palette[1],\n 2: baseCyan.palette[2],\n 3: baseCyan.palette[3],\n 4: baseCyan.palette[4],\n 5: baseCyan.palette[5],\n 6: baseCyan.palette[6], // 主色\n 7: baseCyan.palette[7],\n 8: baseCyan.palette[8],\n 9: baseCyan.palette[9],\n 10: baseCyan.palette[10]\n }\n },\n color: {\n // ============ Neutral 中性色系统 ============\n neutral: {\n 1: neutralSeries[1],\n 2: neutralSeries[2],\n 3: neutralSeries[3],\n 4: neutralSeries[4],\n 5: neutralSeries[5],\n 6: neutralSeries[6],\n 7: neutralSeries[7],\n 8: neutralSeries[8],\n 9: neutralSeries[9],\n 10: neutralSeries[10]\n },\n // ============ 品牌主题色(自动生成)============\n brand: {\n primary: brandColors.primary,\n primaryHover: brandColors.hover,\n primaryActive: brandColors.active,\n primaryLight: brandColors.light\n },\n // ============ 语义化颜色(基于 neutral) ============\n text: {\n primary: neutralSeries[8], // neutral-8\n secondary: neutralSeries[7], // neutral-7\n tertiary: neutralSeries[6], // neutral-6\n inverse: neutralSeries[1] // neutral-1\n },\n background: {\n base: neutralSeries[1], // neutral-1\n elevated: neutralSeries[2], // neutral-2\n overlay: 'rgba(1, 20, 49, 0.6)' // neutral-9 with alpha\n },\n border: {\n default: neutralSeries[4], // neutral-4 - 浅灰色边框\n subtle: neutralSeries[3], // neutral-3 - 极浅边框\n strong: neutralSeries[7] // neutral-7 - 深灰色边框\n },\n code: {\n inlineBackground: neutralSeries[3], // neutral-3 - 行内代码浅色背景\n inlineText: neutralSeries[8], // neutral-8 - 行内代码深色文本\n blockBackground: neutralSeries[9], // neutral-9 - 代码块深色背景\n blockText: neutralSeries[2], // neutral-2 - 代码块浅色文本\n headerBackground: neutralSeries[10] // neutral-10 - 代码块头部更深背景\n // border 使用通用的 border.strong,不单独定义\n },\n status: {\n pending: basePurple.palette[6], // 使用紫色系主色\n completed: baseGreen.palette[6] // 使用绿色系主色\n },\n // ============ 交互元素颜色 ============\n interactive: {\n link: brandColors.primary, // 使用品牌主色\n linkHover: brandColors.hover, // 使用 hover 变体\n linkVisited: basePurple.palette[7], // 使用紫色系深色表示访问过\n checked: baseGreen.palette[6] // 使用绿色系主色表示选中\n }\n },\n typography: {\n fontFamily: {\n base: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\",\n mono: \"'Fira Code', 'SF Mono', 'Monaco', 'Consolas', monospace\"\n },\n fontSize: {\n xs: '11px',\n sm: '12px',\n base: '14px',\n md: '16px',\n lg: '18px',\n heading: {\n h1: '2em',\n h2: '1.5em',\n h3: '1.25em',\n h4: '1em',\n h5: '0.875em',\n h6: '0.85em'\n }\n },\n fontWeight: {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700\n },\n lineHeight: {\n tight: 1.25,\n normal: 1.5,\n relaxed: 1.75\n }\n },\n spacing: {\n xs: '4px',\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '24px'\n },\n border: {\n radius: {\n sm: '4px',\n md: '8px',\n lg: '12px'\n }\n },\n shadow: {\n sm: '0 1px 2px rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px rgba(0, 0, 0, 0.1)',\n lg: '0 10px 15px rgba(0, 0, 0, 0.1)'\n },\n animation: {\n duration: {\n fast: '150ms',\n normal: '200ms',\n slow: '300ms'\n },\n easing: {\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n easeOut: 'cubic-bezier(0, 0, 0.2, 1)'\n }\n }\n}\n\n","/**\n * 深色主题值定义\n */\n\nimport type { DesignTokens } from '../tokens'\nimport { defaultTheme } from './default'\nimport { generateBrand } from '@incremark/colors'\n\n// 生成暗色模式的品牌色(稍微调亮)\nconst darkBrandColors = generateBrand('#60a5fa')\n\n// 暗色模式基础色系统(稍微调亮)\nconst darkBasePurple = generateBrand('#c084fc')\nconst darkBaseGreen = generateBrand('#34d399')\n\n// 暗色模式中性色系列(反转后的颜色,增强 1-2 对比度)\nconst darkNeutralSeries = {\n 1: '#0a1628',\n 2: '#162033',\n 3: '#273548',\n 4: '#546070',\n 5: '#8891a0',\n 6: '#cdd1da',\n 7: '#e2e5ec',\n 8: '#f1f3f8',\n 9: '#f8f9fc',\n 10: '#ffffff'\n} as const\n\nexport const darkTheme: DesignTokens = {\n ...defaultTheme,\n // 继承亮色主题的基础色系统(baseColors 保持一致)\n baseColors: defaultTheme.baseColors,\n color: {\n // ============ Neutral 中性色系统(暗色模式反转) ============\n neutral: {\n 1: darkNeutralSeries[1],\n 2: darkNeutralSeries[2],\n 3: darkNeutralSeries[3],\n 4: darkNeutralSeries[4],\n 5: darkNeutralSeries[5],\n 6: darkNeutralSeries[6],\n 7: darkNeutralSeries[7],\n 8: darkNeutralSeries[8],\n 9: darkNeutralSeries[9],\n 10: darkNeutralSeries[10]\n },\n // ============ 品牌主题色(暗色模式自动生成)============\n brand: {\n primary: darkBrandColors.primary,\n primaryHover: darkBrandColors.hover,\n primaryActive: darkBrandColors.active,\n primaryLight: darkBrandColors.light\n },\n // ============ 语义化颜色 ============\n text: {\n primary: darkNeutralSeries[8], // neutral-8 (dark)\n secondary: darkNeutralSeries[7], // neutral-7 (dark)\n tertiary: darkNeutralSeries[6], // neutral-6 (dark)\n inverse: darkNeutralSeries[1] // neutral-1 (dark)\n },\n background: {\n base: darkNeutralSeries[1], // neutral-1 (dark)\n elevated: darkNeutralSeries[2], // neutral-2 (dark)\n overlay: 'rgba(0, 0, 0, 0.75)'\n },\n border: {\n subtle: darkNeutralSeries[3], // neutral-3 (dark) - 极浅边框\n default: darkNeutralSeries[4], // neutral-4 (dark) - 浅灰色边框\n strong: darkNeutralSeries[7] // neutral-7 (dark) - 深灰色边框\n },\n code: {\n inlineBackground: darkNeutralSeries[3], // neutral-3 (dark) - 行内代码适中暗色背景\n inlineText: darkNeutralSeries[8], // neutral-8 (dark) - 行内代码浅色文本\n blockBackground: darkNeutralSeries[3], // neutral-2 (dark) - 代码块深色背景\n blockText: darkNeutralSeries[9], // neutral-9 (dark) - 代码块极浅文本\n headerBackground: darkNeutralSeries[2] // neutral-2 (dark) - 代码块头部背景\n // border 使用通用的 border.strong,不单独定义\n },\n status: {\n pending: darkBasePurple.palette[6], // 使用暗色紫色系主色\n completed: darkBaseGreen.palette[6] // 使用暗色绿色系主色\n },\n // ============ 交互元素颜色 ============\n interactive: {\n link: darkBrandColors.primary, // 使用暗色品牌主色\n linkHover: darkBrandColors.hover, // 使用 hover 变体\n linkVisited: darkBasePurple.palette[4], // 使用暗色紫色系浅色\n checked: darkBaseGreen.palette[6] // 使用暗色绿色系主色\n }\n },\n // 其他 Token 继承自 defaultTheme\n typography: defaultTheme.typography,\n spacing: defaultTheme.spacing,\n border: defaultTheme.border,\n shadow: defaultTheme.shadow,\n animation: defaultTheme.animation\n}\n\n\n","/**\n * 从 Token 生成 CSS Variables\n */\n\nimport type { DesignTokens } from '../tokens'\n\nexport interface GenerateCSSVarsOptions {\n /** CSS Variables 前缀,默认 'incremark' */\n prefix?: string\n /** CSS 选择器,默认 ':root' */\n selector?: string\n}\n\n/**\n * 递归将对象转换为 CSS Variables\n */\nfunction objectToCSSVars(\n obj: Record<string, any>,\n prefix: string,\n result: string[] = []\n): void {\n for (const [key, value] of Object.entries(obj)) {\n const varName = prefix ? `${prefix}-${key}` : key\n const kebabKey = varName.replace(/([A-Z])/g, '-$1').toLowerCase()\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // 递归处理嵌套对象\n objectToCSSVars(value, kebabKey, result)\n } else {\n // 叶子节点,生成 CSS Variable\n result.push(` --${kebabKey}: ${value};`)\n }\n }\n}\n\n/**\n * 从 DesignTokens 生成 CSS Variables 字符串\n * \n * @example\n * ```typescript\n * const cssVars = generateCSSVars(defaultTheme, {\n * prefix: 'incremark',\n * selector: ':root'\n * })\n * // 输出:\n * // :root {\n * // --incremark-color-text-primary: #1f2328;\n * // ...\n * // }\n * ```\n */\nexport function generateCSSVars(\n tokens: DesignTokens,\n options: GenerateCSSVarsOptions = {}\n): string {\n const { prefix = 'incremark', selector = ':root' } = options\n\n const vars: string[] = []\n objectToCSSVars(tokens, prefix, vars)\n\n if (vars.length === 0) {\n return selector ? `${selector} {}` : ''\n }\n\n // 如果选择器为空,只返回变量声明(用于 applyTheme)\n if (!selector) {\n return vars.join('\\n')\n }\n\n return `${selector} {\\n${vars.join('\\n')}\\n}`\n}\n\n","/**\n * 深度合并主题,支持部分替换\n */\n\nimport type { DesignTokens } from '../tokens'\n\n/**\n * 深度合并两个对象\n */\nfunction deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target }\n\n for (const key in source) {\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n // 递归合并嵌套对象\n result[key] = deepMerge(\n target[key] || ({} as any),\n source[key] as any\n )\n } else if (source[key] !== undefined) {\n // 直接覆盖\n result[key] = source[key] as any\n }\n }\n\n return result\n}\n\n/**\n * 合并主题,支持部分替换\n * \n * @example\n * ```typescript\n * const customTheme = mergeTheme(defaultTheme, {\n * color: {\n * text: {\n * primary: '#custom-color'\n * }\n * }\n * })\n * // 只替换 text.primary,其他保持默认值\n * ```\n */\nexport function mergeTheme(\n base: DesignTokens,\n override: Partial<DesignTokens>\n): DesignTokens {\n return deepMerge(base, override)\n}\n\n","/**\n * 应用主题到 DOM 元素\n */\n\nimport type { DesignTokens } from '../tokens'\nimport { generateCSSVars } from './generate-css-vars'\nimport { mergeTheme } from './merge-theme'\nimport { defaultTheme } from '../themes/default'\nimport { darkTheme } from '../themes/dark'\n\n/**\n * 应用主题到 DOM 元素\n *\n * @param element - 目标元素,默认为 document.documentElement\n * @param theme - 主题配置,可以是:\n * - 字符串:'default' | 'dark'\n * - 完整主题对象:DesignTokens\n * - 部分主题对象:Partial<DesignTokens>(会合并到默认主题)\n *\n * @example\n * ```typescript\n * // 使用预设主题(通过类名切换)\n * applyTheme(containerElement, 'dark') // 添加 .theme-dark 类\n * applyTheme(containerElement, 'default') // 移除 .theme-dark 类\n *\n * // 使用自定义主题(通过 inline style 设置 CSS 变量)\n * applyTheme(containerElement, {\n * color: {\n * brand: {\n * primary: '#8b5cf6'\n * }\n * }\n * })\n * ```\n */\nexport function applyTheme(\n element: HTMLElement | Document = document,\n theme: 'default' | 'dark' | DesignTokens | Partial<DesignTokens>\n): void {\n const target: HTMLElement = element === document ? document.documentElement : (element as HTMLElement)\n\n // 处理字符串主题名(使用类名切换)\n if (typeof theme === 'string') {\n if (theme === 'dark') {\n // 添加 dark 主题类名\n target.classList.add('theme-dark')\n target.setAttribute('data-theme', 'dark')\n } else {\n // 移除 dark 主题类名(回到默认主题)\n target.classList.remove('theme-dark')\n target.removeAttribute('data-theme')\n }\n target.style.cssText = \"\";\n return\n }\n\n // 处理主题对象(使用 inline style 设置 CSS 变量)\n let finalTheme: DesignTokens\n\n // 检查是否是完整主题(有所有必需字段)还是部分主题\n const isCompleteTheme =\n theme.color?.text?.primary !== undefined &&\n theme.typography?.fontFamily?.base !== undefined &&\n theme.spacing?.sm !== undefined\n\n if (isCompleteTheme) {\n finalTheme = theme as DesignTokens\n } else {\n // 部分主题,合并到默认主题\n finalTheme = mergeTheme(defaultTheme, theme)\n }\n\n // 移除预设主题类名(使用自定义主题时)\n target.classList.remove('theme-dark')\n target.removeAttribute('data-theme')\n\n // 生成 CSS Variables(不包含选择器)\n const cssVars = generateCSSVars(finalTheme, {\n prefix: 'incremark',\n selector: '' // 空选择器,只生成变量声明\n })\n\n target.style.cssText = cssVars;\n}\n"]}
|