@aviala-design/color 0.3.0 → 0.4.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.
package/dist/linear.d.ts CHANGED
@@ -73,7 +73,7 @@ export function generateGrayLinear(options?: {
73
73
  * 基于一个基础颜色,生成从浅到深的渐变
74
74
  *
75
75
  * @param {string} baseColor - 基础颜色
76
- * @param {{steps?: number, format?: string, lightnessRange?: number, minLightness?: number, maxLightness?: number}} options - 配置选项
76
+ * @param {{steps?: number, format?: string, lightnessRange?: number, minLightness?: number, maxLightness?: number, preserveChroma?: boolean}} options - 配置选项
77
77
  * @returns {string[]} 单色调颜色数组
78
78
  *
79
79
  * @example
@@ -100,6 +100,13 @@ export function generateGrayLinear(options?: {
100
100
  * // 推荐用于需要接近纯白/纯黑的场景
101
101
  *
102
102
  * @example
103
+ * // 保持感知色度(推荐用于鲜艳的颜色)
104
+ * const vibrantShades = generateMonochromeLinear('#FF0000', {
105
+ * steps: 10,
106
+ * preserveChroma: true // 在 Lab 空间保持色度,避免灰蒙蒙
107
+ * });
108
+ *
109
+ * @example
103
110
  * // 生成HSL格式
104
111
  * const hslShades = generateMonochromeLinear('#00b894', {
105
112
  * format: 'hsl',
@@ -112,6 +119,7 @@ export function generateMonochromeLinear(baseColor: string, options?: {
112
119
  lightnessRange?: number;
113
120
  minLightness?: number;
114
121
  maxLightness?: number;
122
+ preserveChroma?: boolean;
115
123
  }): string[];
116
124
  /**
117
125
  * 在HSL空间进行线性插值
@@ -1 +1 @@
1
- {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../src/linear.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,2CA5BW,MAAM,YACN,MAAM,YACN;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAC,GACtD,MAAM,EAAE,CA4DpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,6CAtBW;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAC,GACrE,MAAM,EAAE,CA8BpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,oDAlCW,MAAM,YACN;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAC,GACtG,MAAM,EAAE,CAyEpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,8CA3BW,MAAM,YACN,MAAM,YACN;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAC,GACtD,MAAM,EAAE,CAkFpB"}
1
+ {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../src/linear.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,2CA5BW,MAAM,YACN,MAAM,YACN;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAC,GACtD,MAAM,EAAE,CA4DpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,6CAtBW;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAC,GACrE,MAAM,EAAE,CA8BpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,oDAzCW,MAAM,YACN;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAC,GAChI,MAAM,EAAE,CAsFpB;AAoED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,8CA3BW,MAAM,YACN,MAAM,YACN;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAC,GACtD,MAAM,EAAE,CAkFpB"}
@@ -1,12 +1,19 @@
1
1
  /**
2
2
  * @typedef {Object} HCT
3
3
  * @property {number} h - 色相 (0-360)
4
- * @property {number} c - 色度 (0-200+)
5
- * @property {number} t - 色调/亮度 (0-100)
4
+ * @property {number} c - 色度 (0-150+)
5
+ * @property {number} t - 色调/亮度 (0-100),对应 CIE L*
6
+ */
7
+ /**
8
+ * @typedef {Object} LabColor
9
+ * @property {number} l - L* 亮度 (0-100)
10
+ * @property {number} a - a* 红绿轴 (-128 to 128)
11
+ * @property {number} b - b* 黄蓝轴 (-128 to 128)
6
12
  */
7
13
  /**
8
14
  * 将 RGB 颜色转换为 HCT 颜色空间
9
- * 这是一个简化的实现,实际的 HCT 转换需要复杂的 CAM16 计算
15
+ * 使用 CIE Lab 颜色空间实现准确的感知一致性
16
+ *
10
17
  * @param {string} rgb - RGB 颜色值,格式如 "#ff0000"
11
18
  * @returns {HCT} HCT 颜色对象 {h, c, t}
12
19
  *
@@ -15,7 +22,7 @@
15
22
  *
16
23
  * // 转换品牌色到 HCT 空间
17
24
  * const hct = rgbToHct('#3491FA');
18
- * console.log(hct); // { h: 210, c: 45, t: 60 }
25
+ * console.log(hct); // { h: 278.7, c: 60.7, t: 59.8 }
19
26
  *
20
27
  * @example
21
28
  * // 用于颜色分析和处理
@@ -27,16 +34,18 @@
27
34
  export function rgbToHct(rgb: string): HCT;
28
35
  /**
29
36
  * 将 HCT 颜色转换为 RGB
37
+ * 使用 CIE Lab 颜色空间作为中间转换
38
+ *
30
39
  * @param {HCT} hct - HCT 颜色对象 {h, c, t}
31
- * @param {{maxChroma?: number}} [options] - 配置选项
40
+ * @param {{gamutMapping?: 'clamp' | 'reduce-chroma'}} [options] - 配置选项
32
41
  * @returns {string} RGB 颜色值,格式如 "#ff0000"
33
42
  *
34
43
  * @example
35
44
  * import { hctToRgb } from '@aviala-design/color';
36
45
  *
37
46
  * // 从 HCT 颜色空间转回 RGB
38
- * const rgb = hctToRgb({ h: 210, c: 45, t: 60 });
39
- * console.log(rgb); // '#3491FA'
47
+ * const rgb = hctToRgb({ h: 278.7, c: 60.7, t: 59.8 });
48
+ * console.log(rgb); // '#3491fa'
40
49
  *
41
50
  * @example
42
51
  * // 在 HCT 空间调整颜色后转换
@@ -45,31 +54,164 @@ export function rgbToHct(rgb: string): HCT;
45
54
  * document.body.style.backgroundColor = rgb;
46
55
  */
47
56
  export function hctToRgb(hct: HCT, options?: {
48
- maxChroma?: number;
57
+ gamutMapping?: "clamp" | "reduce-chroma";
49
58
  }): string;
50
59
  /**
51
60
  * 在 HCT 颜色空间中混合两种颜色
61
+ * 支持多种混合模式:Lab 空间混合(默认)、HCT 线性混合、色相混合
62
+ *
52
63
  * @param {string} color1 - 第一种颜色 (RGB)
53
64
  * @param {string} color2 - 第二种颜色 (RGB)
54
65
  * @param {number} ratio - 混合比例,0-1,0表示完全是color1,1表示完全是color2
66
+ * @param {{mode?: 'lab' | 'hct' | 'hue-only'}} [options] - 混合选项
55
67
  * @returns {string} 混合后的颜色 (RGB)
56
68
  *
57
69
  * @example
58
70
  * import { blendInHct } from '@aviala-design/color';
59
71
  *
60
- * // 混合品牌色和背景色
72
+ * // 混合品牌色和背景色(默认 Lab 空间混合)
61
73
  * const blended = blendInHct('#3491FA', '#FFFFFF', 0.3);
62
- * // 30% 白色,70% 品牌色
63
74
  *
64
75
  * @example
65
- * // 创建悬停效果颜色
66
- * const primaryColor = '#FF5722';
67
- * const hoverColor = blendInHct(primaryColor, '#000000', 0.1);
68
- * // 混入 10% 黑色使颜色变深
76
+ * // 使用 HCT 线性混合
77
+ * const blended = blendInHct('#FF0000', '#0000FF', 0.5, { mode: 'hct' });
78
+ *
79
+ * @example
80
+ * // 只混合色相,保持第一个颜色的色度和明度
81
+ * const blended = blendInHct('#FF0000', '#0000FF', 0.5, { mode: 'hue-only' });
82
+ */
83
+ export function blendInHct(color1: string, color2: string, ratio?: number, options?: {
84
+ mode?: "lab" | "hct" | "hue-only";
85
+ }): string;
86
+ /**
87
+ * 计算两个颜色在 Lab 空间中的感知色差 (Delta E)
88
+ * 值越小表示颜色越接近,一般认为 < 2 为几乎不可察觉的差异
89
+ *
90
+ * @param {string} color1 - 第一种颜色 (RGB)
91
+ * @param {string} color2 - 第二种颜色 (RGB)
92
+ * @returns {number} Delta E 值
93
+ *
94
+ * @example
95
+ * import { colorDifference } from '@aviala-design/color';
96
+ *
97
+ * const diff = colorDifference('#FF0000', '#FF0001');
98
+ * console.log(diff); // 很小的值,几乎相同
99
+ */
100
+ export function colorDifference(color1: string, color2: string): number;
101
+ /**
102
+ * 调整颜色的明度(Tone)
103
+ *
104
+ * @param {string} color - 输入颜色 (RGB)
105
+ * @param {number} tone - 目标明度 (0-100)
106
+ * @returns {string} 调整后的颜色 (RGB)
107
+ *
108
+ * @example
109
+ * import { adjustTone } from '@aviala-design/color';
110
+ *
111
+ * // 将颜色调整到 80% 明度
112
+ * const lighter = adjustTone('#3491FA', 80);
113
+ */
114
+ export function adjustTone(color: string, tone: number): string;
115
+ /**
116
+ * 调整颜色的色度(Chroma)
117
+ *
118
+ * @param {string} color - 输入颜色 (RGB)
119
+ * @param {number} chroma - 目标色度
120
+ * @returns {string} 调整后的颜色 (RGB)
121
+ *
122
+ * @example
123
+ * import { adjustChroma } from '@aviala-design/color';
124
+ *
125
+ * // 降低颜色鲜艳度
126
+ * const muted = adjustChroma('#FF0000', 30);
127
+ */
128
+ export function adjustChroma(color: string, chroma: number): string;
129
+ /**
130
+ * 调整颜色的色相(Hue)
131
+ *
132
+ * @param {string} color - 输入颜色 (RGB)
133
+ * @param {number} hue - 目标色相 (0-360)
134
+ * @returns {string} 调整后的颜色 (RGB)
135
+ *
136
+ * @example
137
+ * import { adjustHue } from '@aviala-design/color';
138
+ *
139
+ * // 将色相旋转到 120 度(绿色区域)
140
+ * const green = adjustHue('#FF0000', 120);
141
+ */
142
+ export function adjustHue(color: string, hue: number): string;
143
+ /**
144
+ * 旋转颜色的色相
145
+ *
146
+ * @param {string} color - 输入颜色 (RGB)
147
+ * @param {number} degrees - 旋转角度(可正可负)
148
+ * @returns {string} 旋转后的颜色 (RGB)
149
+ *
150
+ * @example
151
+ * import { rotateHue } from '@aviala-design/color';
152
+ *
153
+ * // 色相顺时针旋转 30 度
154
+ * const rotated = rotateHue('#FF0000', 30);
155
+ *
156
+ * // 色相逆时针旋转 45 度
157
+ * const rotatedBack = rotateHue('#FF0000', -45);
158
+ */
159
+ export function rotateHue(color: string, degrees: number): string;
160
+ /**
161
+ * 获取颜色的互补色
162
+ *
163
+ * @param {string} color - 输入颜色 (RGB)
164
+ * @returns {string} 互补色 (RGB)
165
+ *
166
+ * @example
167
+ * import { getComplementary } from '@aviala-design/color';
168
+ *
169
+ * const complement = getComplementary('#FF0000'); // 青色
170
+ */
171
+ export function getComplementary(color: string): string;
172
+ /**
173
+ * 获取颜色的三角配色
174
+ *
175
+ * @param {string} color - 输入颜色 (RGB)
176
+ * @returns {[string, string, string]} 三个颜色的数组
177
+ *
178
+ * @example
179
+ * import { getTriadic } from '@aviala-design/color';
180
+ *
181
+ * const [c1, c2, c3] = getTriadic('#FF0000');
69
182
  */
70
- export function blendInHct(color1: string, color2: string, ratio?: number): string;
183
+ export function getTriadic(color: string): [string, string, string];
184
+ /**
185
+ * 获取颜色的分裂互补色
186
+ *
187
+ * @param {string} color - 输入颜色 (RGB)
188
+ * @param {number} [angle=30] - 分裂角度
189
+ * @returns {[string, string, string]} 三个颜色的数组
190
+ *
191
+ * @example
192
+ * import { getSplitComplementary } from '@aviala-design/color';
193
+ *
194
+ * const [c1, c2, c3] = getSplitComplementary('#FF0000');
195
+ */
196
+ export function getSplitComplementary(color: string, angle?: number): [string, string, string];
197
+ /**
198
+ * 获取颜色的类似色
199
+ *
200
+ * @param {string} color - 输入颜色 (RGB)
201
+ * @param {number} [count=3] - 颜色数量
202
+ * @param {number} [angle=30] - 每个颜色之间的角度
203
+ * @returns {string[]} 类似色数组
204
+ *
205
+ * @example
206
+ * import { getAnalogous } from '@aviala-design/color';
207
+ *
208
+ * const analogous = getAnalogous('#FF0000', 5, 15);
209
+ */
210
+ export function getAnalogous(color: string, count?: number, angle?: number): string[];
71
211
  /**
72
212
  * 颜色调和 - 让目标颜色向主题色的色相靠拢
213
+ * 使用 Lab 空间计算,保持感知一致性
214
+ *
73
215
  * @param {string} themeColor - 主题色 (RGB)
74
216
  * @param {string} targetColor - 目标颜色 (RGB)
75
217
  * @param {number} harmonizeRatio - 调和强度,0-1,0表示不调和,1表示完全采用主题色的色相
@@ -205,10 +347,80 @@ export function generateControlColors(themeColor: string, options?: {
205
347
  }): {
206
348
  [key: string]: string;
207
349
  };
350
+ /**
351
+ * 生成浅灰度颜色系列(neutral colors)
352
+ * 专门用于生成浅色背景、卡片、分割线等 UI 元素的灰度色系
353
+ * 与 generateControlColors 的区别:
354
+ * - 亮度范围更窄,集中在浅色区域(默认 92-100)
355
+ * - 更适合作为背景色、hover 状态、边框等
356
+ * - 产生更细腻的浅色梯度变化
357
+ *
358
+ * @param {string} themeColor - 主题颜色
359
+ * @param {{baseGray?: string, blendRatio?: number, steps?: number, minLightness?: number, maxLightness?: number, prefix?: string}} [options] - 配置选项
360
+ * @returns {{[key: string]: string}} 浅灰度颜色对象
361
+ *
362
+ * @example
363
+ * import { generateNeutralColors } from '@aviala-design/color';
364
+ *
365
+ * // 生成默认的浅灰度色系(6个等级)
366
+ * const neutrals = generateNeutralColors('#3491FA');
367
+ * console.log(neutrals);
368
+ * // {
369
+ * // 'neutral-1': '#fafbfc', // 最浅,接近白色
370
+ * // 'neutral-2': '#f5f7f9',
371
+ * // 'neutral-3': '#f0f2f5',
372
+ * // 'neutral-4': '#ebeef2',
373
+ * // 'neutral-5': '#e6e9ee',
374
+ * // 'neutral-6': '#e1e5eb' // 最深的浅灰
375
+ * // }
376
+ *
377
+ * @example
378
+ * // 用于不同 UI 场景
379
+ * const neutrals = generateNeutralColors('#3491FA');
380
+ * // neutrals['neutral-1'] -> 页面背景
381
+ * // neutrals['neutral-2'] -> 卡片背景
382
+ * // neutrals['neutral-3'] -> hover 状态背景
383
+ * // neutrals['neutral-4'] -> 分割线
384
+ * // neutrals['neutral-5'] -> 边框
385
+ * // neutrals['neutral-6'] -> 禁用状态背景
386
+ *
387
+ * @example
388
+ * // 自定义亮度范围,生成更多等级
389
+ * const fineNeutrals = generateNeutralColors('#3491FA', {
390
+ * steps: 10,
391
+ * minLightness: 88,
392
+ * maxLightness: 100
393
+ * });
394
+ *
395
+ * @example
396
+ * // 增加主题色混合比例,让浅灰更有品牌感
397
+ * const brandedNeutrals = generateNeutralColors('#6200EE', {
398
+ * blendRatio: 0.06, // 增加主题色影响
399
+ * steps: 8
400
+ * });
401
+ *
402
+ * @example
403
+ * // 自定义前缀
404
+ * const bgColors = generateNeutralColors('#3491FA', {
405
+ * prefix: 'bg',
406
+ * steps: 4
407
+ * });
408
+ * // { 'bg-1': '...', 'bg-2': '...', 'bg-3': '...', 'bg-4': '...' }
409
+ */
410
+ export function generateNeutralColors(themeColor: string, options?: {
411
+ baseGray?: string;
412
+ blendRatio?: number;
413
+ steps?: number;
414
+ minLightness?: number;
415
+ maxLightness?: number;
416
+ prefix?: string;
417
+ }): {
418
+ [key: string]: string;
419
+ };
208
420
  /**
209
421
  * 生成表意色(1-10)
210
422
  * @param {string} themeColor - 主题颜色
211
- * @param {{semanticColors?: {[key: string]: string}, blendRatio?: number, isDark?: boolean}} [options] - 配置选项
423
+ * @param {{semanticColors?: {[key: string]: string}, blendRatio?: number, isDark?: boolean, steps?: number, lightnessRange?: number, minLightness?: number, maxLightness?: number, preserveChroma?: boolean}} [options] - 配置选项
212
424
  * @returns {{[key: string]: string}} 表意色对象
213
425
  *
214
426
  * @example
@@ -230,6 +442,22 @@ export function generateControlColors(themeColor: string, options?: {
230
442
  * },
231
443
  * blendRatio: 0.1
232
444
  * });
445
+ *
446
+ * @example
447
+ * // 保持鲜艳的色度(推荐:避免灰蒙蒙)
448
+ * const vibrant = generateSemanticColors('#3491FA', {
449
+ * preserveChroma: true, // 在 Lab 空间保持色度
450
+ * minLightness: 25,
451
+ * maxLightness: 95
452
+ * });
453
+ *
454
+ * @example
455
+ * // 使用固定端点模式获得更广的亮度范围
456
+ * const wideRange = generateSemanticColors('#3491FA', {
457
+ * minLightness: 10,
458
+ * maxLightness: 95,
459
+ * steps: 10
460
+ * });
233
461
  */
234
462
  export function generateSemanticColors(themeColor: string, options?: {
235
463
  semanticColors?: {
@@ -237,13 +465,18 @@ export function generateSemanticColors(themeColor: string, options?: {
237
465
  };
238
466
  blendRatio?: number;
239
467
  isDark?: boolean;
468
+ steps?: number;
469
+ lightnessRange?: number;
470
+ minLightness?: number;
471
+ maxLightness?: number;
472
+ preserveChroma?: boolean;
240
473
  }): {
241
474
  [key: string]: string;
242
475
  };
243
476
  /**
244
477
  * 生成主题色(1-10)
245
478
  * @param {string} themeColor - 主题颜色
246
- * @param {{isDark?: boolean}} [options] - 配置选项
479
+ * @param {{isDark?: boolean, steps?: number, lightnessRange?: number, minLightness?: number, maxLightness?: number, preserveChroma?: boolean}} [options] - 配置选项
247
480
  * @returns {{[key: string]: string}} 主题色对象
248
481
  *
249
482
  * @example
@@ -258,9 +491,30 @@ export function generateSemanticColors(themeColor: string, options?: {
258
491
  * @example
259
492
  * // 深色模式主题色
260
493
  * const darkTheme = generateThemeColors('#FF5722', { isDark: true });
494
+ *
495
+ * @example
496
+ * // 保持鲜艳色度
497
+ * const vibrant = generateThemeColors('#3491FA', {
498
+ * preserveChroma: true,
499
+ * minLightness: 20,
500
+ * maxLightness: 95
501
+ * });
502
+ *
503
+ * @example
504
+ * // 使用固定端点模式
505
+ * const wideRange = generateThemeColors('#3491FA', {
506
+ * minLightness: 15,
507
+ * maxLightness: 95,
508
+ * steps: 10
509
+ * });
261
510
  */
262
511
  export function generateThemeColors(themeColor: string, options?: {
263
512
  isDark?: boolean;
513
+ steps?: number;
514
+ lightnessRange?: number;
515
+ minLightness?: number;
516
+ maxLightness?: number;
517
+ preserveChroma?: boolean;
264
518
  }): {
265
519
  [key: string]: string;
266
520
  };
@@ -268,14 +522,16 @@ export function generateThemeColors(themeColor: string, options?: {
268
522
  * 生成完整的界面色彩系统
269
523
  * @param {string} themeColor - 主题颜色
270
524
  * @param {*} [options] - 配置选项
271
- * @returns {{controls: object, semantic: object, theme: object}} 包含三个部分的完整色彩系统
525
+ * @returns {{controls: object, neutrals: object, semantic: object, theme: object}} 包含四个部分的完整色彩系统
272
526
  *
527
+ /**
273
528
  * @example
274
529
  * import { generateInterfaceColorSystem } from '@aviala-design/color';
275
530
  *
276
531
  * // 生成完整色彩系统
277
532
  * const colorSystem = generateInterfaceColorSystem('#3491FA');
278
533
  * console.log(colorSystem.controls); // 灰色系 1-12
534
+ * console.log(colorSystem.neutrals); // 浅灰度色系(背景、卡片用)
279
535
  * console.log(colorSystem.semantic); // 语义色系
280
536
  * console.log(colorSystem.theme); // 主题色系
281
537
  *
@@ -288,11 +544,10 @@ export function generateThemeColors(themeColor: string, options?: {
288
544
  * });
289
545
  *
290
546
  * @example
291
- * // 使用 lightnessRange(中心扩展模式)
292
- * const customSystem = generateInterfaceColorSystem('#3491FA', {
293
- * controlSteps: 24, // 24 级灰度
294
- * controlLightnessRange: 90, // 更接近纯白/纯黑
295
- * controlBlendRatio: 0.1
547
+ * // 保持鲜艳色度(推荐:避免灰蒙蒙)
548
+ * const vibrantSystem = generateInterfaceColorSystem('#3491FA', {
549
+ * semanticPreserveChroma: true, // 语义色保持色度
550
+ * themePreserveChroma: true // 主题色保持色度
296
551
  * });
297
552
  *
298
553
  * @example
@@ -300,12 +555,17 @@ export function generateThemeColors(themeColor: string, options?: {
300
555
  * const preciseSystem = generateInterfaceColorSystem('#3491FA', {
301
556
  * controlSteps: 12,
302
557
  * controlMinLightness: 10, // 最深色接近纯黑
303
- * controlMaxLightness: 98 // 最浅色接近纯白
558
+ * controlMaxLightness: 98, // 最浅色接近纯白
559
+ * semanticMinLightness: 15, // 语义色最深
560
+ * semanticMaxLightness: 95, // 语义色最浅
561
+ * themeMinLightness: 15, // 主题色最深
562
+ * themeMaxLightness: 95 // 主题色最浅
304
563
  * });
305
564
  * // 生成接近纯白到纯黑的灰度系统
306
565
  */
307
566
  export function generateInterfaceColorSystem(themeColor: string, options?: any): {
308
567
  controls: object;
568
+ neutrals: object;
309
569
  semantic: object;
310
570
  theme: object;
311
571
  };
@@ -348,12 +608,26 @@ export type HCT = {
348
608
  */
349
609
  h: number;
350
610
  /**
351
- * - 色度 (0-200+)
611
+ * - 色度 (0-150+)
352
612
  */
353
613
  c: number;
354
614
  /**
355
- * - 色调/亮度 (0-100)
615
+ * - 色调/亮度 (0-100),对应 CIE L*
356
616
  */
357
617
  t: number;
358
618
  };
619
+ export type LabColor = {
620
+ /**
621
+ * - L* 亮度 (0-100)
622
+ */
623
+ l: number;
624
+ /**
625
+ * - a* 红绿轴 (-128 to 128)
626
+ */
627
+ a: number;
628
+ /**
629
+ * - b* 黄蓝轴 (-128 to 128)
630
+ */
631
+ b: number;
632
+ };
359
633
  //# sourceMappingURL=theme-blend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-blend.d.ts","sourceRoot":"","sources":["../src/theme-blend.js"],"names":[],"mappings":"AAYA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,8BAjBW,MAAM,GACJ,GAAG,CA4Ef;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAjBW,GAAG,YACH;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,GAClB,MAAM,CAmElB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,mCAlBW,MAAM,UACN,MAAM,UACN,MAAM,GACJ,MAAM,CAmDlB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,2CArBW,MAAM,eACN,MAAM,mBACN,MAAM,GACJ,MAAM,CAoDlB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,kDArBW,MAAM,YACN,MAAM,EAAE,GAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,GACzB,MAAM,EAAE,CA2DpB;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,0CA1BW,MAAM,YACN;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,eACvB,MAAM,GACJ;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CAkDnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,kDAzCW,MAAM,YACN;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAC,GAC/I;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CA6FnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,mDAxBW,MAAM,YACN;IAAC,cAAc,CAAC,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAC,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAC,GAC/E;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CAgFnC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,gDAjBW,MAAM,YACN;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAC,GAChB;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CAsCnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,yDAtCW,MAAM,YACN,GAAC,GACC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAwF/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iDAzBW,MAAM,YACN,GAAC,GACC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,CAwF3E;;;;;OAhzBa,MAAM;;;;OACN,MAAM;;;;OACN,MAAM"}
1
+ {"version":3,"file":"theme-blend.d.ts","sourceRoot":"","sources":["../src/theme-blend.js"],"names":[],"mappings":"AAeA;;;;;GAKG;AAEH;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,8BAjBW,MAAM,GACJ,GAAG,CAkDf;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,8BAjBW,GAAG,YACH;IAAC,YAAY,CAAC,EAAE,OAAO,GAAG,eAAe,CAAA;CAAC,GACxC,MAAM,CAkElB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,mCApBW,MAAM,UACN,MAAM,UACN,MAAM,YACN;IAAC,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,UAAU,CAAA;CAAC,GACjC,MAAM,CAqClB;AAkGD;;;;;;;;;;;;;GAaG;AACH,wCAVW,MAAM,UACN,MAAM,GACJ,MAAM,CAqBlB;AAED;;;;;;;;;;;;GAYG;AACH,kCAVW,MAAM,QACN,MAAM,GACJ,MAAM,CAelB;AAED;;;;;;;;;;;;GAYG;AACH,oCAVW,MAAM,UACN,MAAM,GACJ,MAAM,CAelB;AAED;;;;;;;;;;;;GAYG;AACH,iCAVW,MAAM,OACN,MAAM,GACJ,MAAM,CAelB;AAED;;;;;;;;;;;;;;;GAeG;AACH,iCAbW,MAAM,WACN,MAAM,GACJ,MAAM,CAoBlB;AAED;;;;;;;;;;GAUG;AACH,wCARW,MAAM,GACJ,MAAM,CASlB;AAED;;;;;;;;;;GAUG;AACH,kCARW,MAAM,GACJ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAapC;AAED;;;;;;;;;;;GAWG;AACH,6CATW,MAAM,UACN,MAAM,GACJ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAapC;AAED;;;;;;;;;;;;GAYG;AACH,oCAVW,MAAM,UACN,MAAM,UACN,MAAM,GACJ,MAAM,EAAE,CAgBpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,2CArBW,MAAM,eACN,MAAM,mBACN,MAAM,GACJ,MAAM,CA6BlB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,kDArBW,MAAM,YACN,MAAM,EAAE,GAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,GACzB,MAAM,EAAE,CA2DpB;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,0CA1BW,MAAM,YACN;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,eACvB,MAAM,GACJ;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CAkDnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,kDAzCW,MAAM,YACN;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAC,GAC/I;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CA6FnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,kDApDW,MAAM,YACN;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAC,GACrH;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CA6FnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,mDAxCW,MAAM,YACN;IAAC,cAAc,CAAC,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAC,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAC,GAChM;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CAsHnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,gDAjCW,MAAM,YACN;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAC,GACjI;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAC,CA+EnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,yDA3CW,MAAM,YACN,GAAC,GACC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CA8IjF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iDAzBW,MAAM,YACN,GAAC,GACC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,CAwF3E;;;;;OArxCa,MAAM;;;;OACN,MAAM;;;;OACN,MAAM;;;;;;OAKN,MAAM;;;;OACN,MAAM;;;;OACN,MAAM"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aviala-design/color",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "description": "Aviala Design color utils",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",