@cloudcome/utils-core 1.19.1 → 1.20.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/README.md +72 -73
- package/dist/array.cjs +181 -125
- package/dist/array.cjs.map +1 -1
- package/dist/array.mjs +181 -133
- package/dist/array.mjs.map +1 -1
- package/dist/async.cjs +181 -171
- package/dist/async.cjs.map +1 -1
- package/dist/async.mjs +181 -174
- package/dist/async.mjs.map +1 -1
- package/dist/base64.cjs +16 -12
- package/dist/base64.cjs.map +1 -1
- package/dist/base64.mjs +17 -14
- package/dist/base64.mjs.map +1 -1
- package/dist/cache.cjs +79 -67
- package/dist/cache.cjs.map +1 -1
- package/dist/cache.d.ts +3 -3
- package/dist/cache.mjs +80 -71
- package/dist/cache.mjs.map +1 -1
- package/dist/color.cjs +478 -167
- package/dist/color.cjs.map +1 -1
- package/dist/color.d.ts +3 -3
- package/dist/color.mjs +480 -197
- package/dist/color.mjs.map +1 -1
- package/dist/crypto.cjs +474 -687
- package/dist/crypto.cjs.map +1 -1
- package/dist/crypto.mjs +476 -693
- package/dist/crypto.mjs.map +1 -1
- package/dist/date.cjs +972 -161
- package/dist/date.cjs.map +1 -1
- package/dist/date.d.ts +2 -2
- package/dist/date.mjs +962 -191
- package/dist/date.mjs.map +1 -1
- package/dist/dict.cjs +90 -52
- package/dist/dict.cjs.map +1 -1
- package/dist/dict.d.ts +1 -1
- package/dist/dict.mjs +91 -54
- package/dist/dict.mjs.map +1 -1
- package/dist/easing.cjs +104 -103
- package/dist/easing.cjs.map +1 -1
- package/dist/easing.mjs +105 -133
- package/dist/easing.mjs.map +1 -1
- package/dist/emitter.cjs +101 -96
- package/dist/emitter.cjs.map +1 -1
- package/dist/emitter.mjs +101 -97
- package/dist/emitter.mjs.map +1 -1
- package/dist/env.cjs +43 -9
- package/dist/env.cjs.map +1 -1
- package/dist/env.d.ts +1 -1
- package/dist/env.mjs +43 -15
- package/dist/env.mjs.map +1 -1
- package/dist/error.cjs +26 -5
- package/dist/error.cjs.map +1 -1
- package/dist/error.mjs +26 -7
- package/dist/error.mjs.map +1 -1
- package/dist/exception.cjs +38 -20
- package/dist/exception.cjs.map +1 -1
- package/dist/exception.d.ts +5 -5
- package/dist/exception.mjs +38 -21
- package/dist/exception.mjs.map +1 -1
- package/dist/function.cjs +128 -68
- package/dist/function.cjs.map +1 -1
- package/dist/function.mjs +128 -72
- package/dist/function.mjs.map +1 -1
- package/dist/index.cjs +8 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +9 -5
- package/dist/index.mjs.map +1 -1
- package/dist/number.cjs +10 -14
- package/dist/number.mjs +2 -15
- package/dist/object/get-set.d.ts +2 -2
- package/dist/object/merge.d.ts +2 -2
- package/dist/object.cjs +369 -106
- package/dist/object.cjs.map +1 -1
- package/dist/object.mjs +366 -115
- package/dist/object.mjs.map +1 -1
- package/dist/path.cjs +144 -55
- package/dist/path.cjs.map +1 -1
- package/dist/path.mjs +144 -62
- package/dist/path.mjs.map +1 -1
- package/dist/promise.cjs +84 -43
- package/dist/promise.cjs.map +1 -1
- package/dist/promise.mjs +85 -50
- package/dist/promise.mjs.map +1 -1
- package/dist/qs.cjs +63 -39
- package/dist/qs.cjs.map +1 -1
- package/dist/qs.mjs +64 -42
- package/dist/qs.mjs.map +1 -1
- package/dist/regexp.cjs +118 -35
- package/dist/regexp.cjs.map +1 -1
- package/dist/regexp.mjs +119 -46
- package/dist/regexp.mjs.map +1 -1
- package/dist/string.cjs +12 -15
- package/dist/string.mjs +2 -16
- package/dist/string2.cjs +378 -142
- package/dist/string2.cjs.map +1 -1
- package/dist/string2.mjs +259 -143
- package/dist/string2.mjs.map +1 -1
- package/dist/time.cjs +136 -59
- package/dist/time.cjs.map +1 -1
- package/dist/time.mjs +136 -65
- package/dist/time.mjs.map +1 -1
- package/dist/timer.cjs +122 -112
- package/dist/timer.cjs.map +1 -1
- package/dist/timer.mjs +123 -115
- package/dist/timer.mjs.map +1 -1
- package/dist/tree.cjs +207 -112
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.mjs +207 -116
- package/dist/tree.mjs.map +1 -1
- package/dist/try/curry.d.ts +1 -1
- package/dist/try.cjs +36 -37
- package/dist/try.cjs.map +1 -1
- package/dist/try.mjs +35 -37
- package/dist/try.mjs.map +1 -1
- package/dist/type.cjs +126 -24
- package/dist/type.cjs.map +1 -1
- package/dist/type.d.ts +2 -2
- package/dist/type.mjs +128 -45
- package/dist/type.mjs.map +1 -1
- package/dist/types.cjs +0 -2
- package/dist/types.d.ts +1 -1
- package/dist/types.mjs +0 -2
- package/dist/unique.cjs +41 -38
- package/dist/unique.cjs.map +1 -1
- package/dist/unique.mjs +42 -41
- package/dist/unique.mjs.map +1 -1
- package/dist/url.cjs +39 -30
- package/dist/url.cjs.map +1 -1
- package/dist/url.mjs +40 -33
- package/dist/url.mjs.map +1 -1
- package/dist/version.cjs +51 -33
- package/dist/version.cjs.map +1 -1
- package/dist/version.mjs +51 -35
- package/dist/version.mjs.map +1 -1
- package/package.json +109 -110
- package/dist/const.cjs +0 -14
- package/dist/const.cjs.map +0 -1
- package/dist/const.mjs +0 -15
- package/dist/const.mjs.map +0 -1
- package/dist/core.cjs +0 -362
- package/dist/core.cjs.map +0 -1
- package/dist/core.mjs +0 -363
- package/dist/core.mjs.map +0 -1
- package/dist/crypto/md5.d.mts +0 -1
- package/dist/crypto/sha1.d.mts +0 -1
- package/dist/crypto/sha256.d.mts +0 -1
- package/dist/crypto/sha512.d.mts +0 -1
- package/dist/each.cjs +0 -18
- package/dist/each.cjs.map +0 -1
- package/dist/each.mjs +0 -19
- package/dist/each.mjs.map +0 -1
- package/dist/merge.cjs +0 -87
- package/dist/merge.cjs.map +0 -1
- package/dist/merge.mjs +0 -88
- package/dist/merge.mjs.map +0 -1
- package/dist/number.cjs.map +0 -1
- package/dist/number.mjs.map +0 -1
- package/dist/string.cjs.map +0 -1
- package/dist/string.mjs.map +0 -1
- package/dist/types.cjs.map +0 -1
- package/dist/types.mjs.map +0 -1
package/dist/color.cjs
CHANGED
|
@@ -1,224 +1,534 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/color/luminance.ts
|
|
3
|
+
/**
|
|
4
|
+
* 计算RGB颜色的相对亮度(符合WCAG 2.1标准)
|
|
5
|
+
* @param rgb RGB颜色对象(分量范围0-255)
|
|
6
|
+
* @returns {number} 相对亮度值(0-1之间)
|
|
7
|
+
* @see https://www.w3.org/TR/WCAG21/#dfn-relative-luminance
|
|
8
|
+
* @example
|
|
9
|
+
* luminance({r: 255, g: 255, b: 255}) // 返回1
|
|
10
|
+
*/
|
|
3
11
|
function luminance({ r, g, b }) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
12
|
+
const a = [
|
|
13
|
+
r,
|
|
14
|
+
g,
|
|
15
|
+
b
|
|
16
|
+
].map((v) => {
|
|
17
|
+
const vFinal = v / 255;
|
|
18
|
+
return vFinal <= .03928 ? vFinal / 12.92 : ((vFinal + .055) / 1.055) ** 2.4;
|
|
19
|
+
});
|
|
20
|
+
return a[0] * .2126 + a[1] * .7152 + a[2] * .0722;
|
|
9
21
|
}
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/color/contrast.ts
|
|
24
|
+
/**
|
|
25
|
+
* 计算两个颜色之间的对比度比率(符合WCAG 2.1标准)
|
|
26
|
+
* @param rgb1 第一个RGB颜色对象(分量范围0-255)
|
|
27
|
+
* @param rgb2 第二个RGB颜色对象(分量范围0-255)
|
|
28
|
+
* @returns {number} 对比度比率,范围1-21(1:1 到 21:1)
|
|
29
|
+
* @example
|
|
30
|
+
* contrast({r: 0, g: 0, b: 0}, {r: 255, g: 255, b: 255}) // 返回21
|
|
31
|
+
*/
|
|
10
32
|
function contrast(rgb1, rgb2) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
33
|
+
const lum1 = luminance(rgb1);
|
|
34
|
+
const lum2 = luminance(rgb2);
|
|
35
|
+
const brightest = Math.max(lum1, lum2);
|
|
36
|
+
const darkest = Math.min(lum1, lum2);
|
|
37
|
+
return (brightest + .05) / (darkest + .05);
|
|
16
38
|
}
|
|
39
|
+
//#endregion
|
|
40
|
+
//#region src/color/distance.ts
|
|
41
|
+
/**
|
|
42
|
+
* 计算两个颜色之间的距离(距离越小相似度越高),值范围 [0, 1]
|
|
43
|
+
* @param {LAB} labA
|
|
44
|
+
* @param {LAB} labB
|
|
45
|
+
* @returns {number}
|
|
46
|
+
*/
|
|
17
47
|
function distance(labA, labB) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return (i < 0 ? 0 : Math.sqrt(i)) / 100;
|
|
48
|
+
const deltaL = labA.l - labB.l;
|
|
49
|
+
const deltaA = labA.a - labB.a;
|
|
50
|
+
const deltaB = labA.b - labB.b;
|
|
51
|
+
const c1 = Math.sqrt(labA.a * labA.a + labA.b * labA.b);
|
|
52
|
+
const deltaC = c1 - Math.sqrt(labB.a * labB.a + labB.b * labB.b);
|
|
53
|
+
let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;
|
|
54
|
+
deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);
|
|
55
|
+
const sc = 1 + .045 * c1;
|
|
56
|
+
const sh = 1 + .015 * c1;
|
|
57
|
+
const deltaLKlsl = deltaL / 1;
|
|
58
|
+
const deltaCkcsc = deltaC / sc;
|
|
59
|
+
const deltaHkhsh = deltaH / sh;
|
|
60
|
+
const i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;
|
|
61
|
+
return (i < 0 ? 0 : Math.sqrt(i)) / 100;
|
|
33
62
|
}
|
|
63
|
+
//#endregion
|
|
64
|
+
//#region src/color/helpers.ts
|
|
65
|
+
var { min: min$2, max: max$2 } = Math;
|
|
66
|
+
function rgbToHue({ r, g, b }) {
|
|
67
|
+
r /= 255;
|
|
68
|
+
g /= 255;
|
|
69
|
+
b /= 255;
|
|
70
|
+
const rgbMax = max$2(r, g, b);
|
|
71
|
+
const rgbMin = min$2(r, g, b);
|
|
72
|
+
const rgbDiff = rgbMax - rgbMin;
|
|
73
|
+
const h = rgbDiff === 0 ? 0 : rgbDiff && rgbMax === r ? (g - b) / rgbDiff : rgbMax === g ? 2 + (b - r) / rgbDiff : 4 + (r - g) / rgbDiff;
|
|
74
|
+
return [
|
|
75
|
+
60 * (h < 0 ? h + 6 : h),
|
|
76
|
+
rgbMax,
|
|
77
|
+
rgbMin,
|
|
78
|
+
rgbDiff
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
//#region src/color/hex-rgb.ts
|
|
83
|
+
/**
|
|
84
|
+
* 将HEX颜色字符串转换为RGB颜色对象
|
|
85
|
+
* @param hex HEX颜色字符串,支持3位或6位格式(例如#f00或#ff0000)
|
|
86
|
+
* @returns {RGB} 对应的RGB颜色对象
|
|
87
|
+
* @throws {SyntaxError} 当颜色格式不符合规范时抛出
|
|
88
|
+
* @example
|
|
89
|
+
* hexToRgb('#f00') // returns {r: 255, g: 0, b: 0}
|
|
90
|
+
*/
|
|
34
91
|
function hexToRgb(hex) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
};
|
|
92
|
+
const result = (hex.length === 4 ? /^#(.)(.)(.)$/ : /^#(.{2})(.{2})(.{2})$/).exec(hex);
|
|
93
|
+
if (!result) throw new SyntaxError(`颜色(${hex})表达式有误`);
|
|
94
|
+
const [_, r, g, b] = result;
|
|
95
|
+
return {
|
|
96
|
+
r: Number.parseInt(r.padEnd(2, r), 16),
|
|
97
|
+
g: Number.parseInt(g.padEnd(2, g), 16),
|
|
98
|
+
b: Number.parseInt(b.padEnd(2, b), 16)
|
|
99
|
+
};
|
|
44
100
|
}
|
|
45
101
|
function to16(n) {
|
|
46
|
-
|
|
102
|
+
return Math.round(n).toString(16).padStart(2, "0");
|
|
47
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* 将RGB颜色对象转换为HEX颜色字符串
|
|
106
|
+
* @param rgb RGB颜色对象
|
|
107
|
+
* @returns {HEX} 6位HEX颜色字符串(带#前缀)
|
|
108
|
+
* @example
|
|
109
|
+
* rgbToHex({r: 255, g: 0, b: 0}) // returns '#ff0000'
|
|
110
|
+
*/
|
|
48
111
|
function rgbToHex(rgb) {
|
|
49
|
-
|
|
112
|
+
return `#${to16(rgb.r)}${to16(rgb.g)}${to16(rgb.b)}`;
|
|
50
113
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
114
|
+
//#endregion
|
|
115
|
+
//#region src/color/rgb-hsl.ts
|
|
116
|
+
var { min: min$1, max: max$1 } = Math;
|
|
117
|
+
/**
|
|
118
|
+
* 将RGB颜色转换为HSL颜色空间
|
|
119
|
+
* @param rgb RGB颜色对象(分量范围0-255)
|
|
120
|
+
* @returns {HSL} HSL颜色对象,其中:
|
|
121
|
+
* h: 色相(0-360度)
|
|
122
|
+
* s: 饱和度(0-100%)
|
|
123
|
+
* l: 亮度(0-100%)
|
|
124
|
+
* @example
|
|
125
|
+
* rgbToHsl({r: 255, g: 0, b: 0}) // returns {h: 0, s: 100, l: 50}
|
|
126
|
+
*/
|
|
63
127
|
function rgbToHsl(rgb) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
};
|
|
128
|
+
const [hue, max, min, diff] = rgbToHue(rgb);
|
|
129
|
+
const l = (2 * max - diff) / 2;
|
|
130
|
+
return {
|
|
131
|
+
h: hue,
|
|
132
|
+
s: (min === max ? 0 : l < .5 ? (max - min) / (max + min) : (max - min) / (2 - max - min)) * 100,
|
|
133
|
+
l: l * 100
|
|
134
|
+
};
|
|
72
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* 将HSL颜色转换回RGB颜色空间
|
|
138
|
+
* @param hsl HSL颜色对象
|
|
139
|
+
* @param hsl.h 色相(0-360度)
|
|
140
|
+
* @param hsl.s 饱和度(0-100%)
|
|
141
|
+
* @param hsl.l 亮度(0-100%)
|
|
142
|
+
* @returns {RGB} RGB颜色对象(分量范围0-255)
|
|
143
|
+
* @example
|
|
144
|
+
* hslToRgb({h: 0, s: 100, l: 50}) // returns {r: 255, g: 0, b: 0}
|
|
145
|
+
*/
|
|
73
146
|
function hslToRgb({ h, s, l }) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
147
|
+
s /= 100;
|
|
148
|
+
l /= 100;
|
|
149
|
+
const a = s * min$1(l, 1 - l);
|
|
150
|
+
const k = (n) => (n + h / 30) % 12;
|
|
151
|
+
const f = (n) => l - a * max$1(-1, min$1(k(n) - 3, min$1(9 - k(n), 1)));
|
|
152
|
+
return {
|
|
153
|
+
r: 255 * f(0),
|
|
154
|
+
g: 255 * f(8),
|
|
155
|
+
b: 255 * f(4)
|
|
156
|
+
};
|
|
84
157
|
}
|
|
158
|
+
//#endregion
|
|
159
|
+
//#region src/color/hex-hsl.ts
|
|
85
160
|
function hslToHex(hsl) {
|
|
86
|
-
|
|
161
|
+
return rgbToHex(hslToRgb(hsl));
|
|
87
162
|
}
|
|
88
163
|
function hexToHsl(hex) {
|
|
89
|
-
|
|
164
|
+
return rgbToHsl(hexToRgb(hex));
|
|
90
165
|
}
|
|
91
|
-
|
|
166
|
+
//#endregion
|
|
167
|
+
//#region src/color/rgb-hsv.ts
|
|
168
|
+
var { min, max } = Math;
|
|
169
|
+
/**
|
|
170
|
+
* 将RGB颜色转换为HSV颜色空间
|
|
171
|
+
* @param rgb RGB颜色对象(分量范围0-255)
|
|
172
|
+
* @returns {HSV} HSV颜色对象:
|
|
173
|
+
* h: 色相(0-360度)
|
|
174
|
+
* s: 饱和度(0-100%)
|
|
175
|
+
* v: 明度(0-100%)
|
|
176
|
+
* @see https://en.wikipedia.org/wiki/HSL_and_HSV
|
|
177
|
+
* @example
|
|
178
|
+
* rgbToHsv({r: 255, g: 0, b: 0}) // {h: 0, s: 100, v: 100}
|
|
179
|
+
*/
|
|
92
180
|
function rgbToHsv(rgb) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
181
|
+
const [hue, max, _min, diff] = rgbToHue(rgb);
|
|
182
|
+
return {
|
|
183
|
+
h: hue,
|
|
184
|
+
s: max && diff / max * 100,
|
|
185
|
+
v: max * 100
|
|
186
|
+
};
|
|
99
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* 将HSV颜色转换回RGB颜色空间
|
|
190
|
+
* @param hsv HSV颜色对象
|
|
191
|
+
* @param hsv.h 色相(0-360度)
|
|
192
|
+
* @param hsv.s 饱和度(0-100%)
|
|
193
|
+
* @param hsv.v 明度(0-100%)
|
|
194
|
+
* @returns {RGB} RGB颜色对象(分量范围0-255)
|
|
195
|
+
* @see https://www.rapidtables.com/convert/color/hsv-to-rgb.html
|
|
196
|
+
* @example
|
|
197
|
+
* hsvToRgb({h: 0, s: 100, v: 100}) // {r: 255, g: 0, b: 0}
|
|
198
|
+
*/
|
|
100
199
|
function hsvToRgb({ h, s, v }) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
200
|
+
s /= 100;
|
|
201
|
+
v /= 100;
|
|
202
|
+
const k = (n) => (n + h / 60) % 6;
|
|
203
|
+
const f = (n) => v * (1 - s * max(0, min(k(n), 4 - k(n), 1)));
|
|
204
|
+
return {
|
|
205
|
+
r: 255 * f(5),
|
|
206
|
+
g: 255 * f(3),
|
|
207
|
+
b: 255 * f(1)
|
|
208
|
+
};
|
|
110
209
|
}
|
|
210
|
+
//#endregion
|
|
211
|
+
//#region src/color/hex-hsv.ts
|
|
212
|
+
/**
|
|
213
|
+
* 将HEX颜色转换为HSV颜色空间
|
|
214
|
+
* @param hex HEX颜色字符串(支持3位或6位格式)
|
|
215
|
+
* @returns {HSV} HSV颜色对象,包含:
|
|
216
|
+
* h: 色相(0-360度)
|
|
217
|
+
* s: 饱和度(0-100%)
|
|
218
|
+
* v: 明度(0-100%)
|
|
219
|
+
* @example
|
|
220
|
+
* hexToHsv('#ff0000') // returns {h: 0, s: 100, v: 100}
|
|
221
|
+
*/
|
|
111
222
|
function hexToHsv(hex) {
|
|
112
|
-
|
|
223
|
+
return rgbToHsv(hexToRgb(hex));
|
|
113
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* 将HSV颜色转换回HEX字符串
|
|
227
|
+
* @param hsv HSV颜色对象
|
|
228
|
+
* @returns {HEX} 6位HEX颜色字符串(带#前缀)
|
|
229
|
+
* @example
|
|
230
|
+
* hsvToHex({h: 0, s: 100, v: 100}) // returns '#ff0000'
|
|
231
|
+
*/
|
|
114
232
|
function hsvToHex(hsv) {
|
|
115
|
-
|
|
233
|
+
return rgbToHex(hsvToRgb(hsv));
|
|
116
234
|
}
|
|
235
|
+
//#endregion
|
|
236
|
+
//#region src/color/rgb-hwb.ts
|
|
237
|
+
/**
|
|
238
|
+
* 将RGB颜色转换为HWB颜色空间
|
|
239
|
+
* @param rgb RGB颜色对象(分量范围0-255)
|
|
240
|
+
* @returns {HWB} HWB颜色对象:
|
|
241
|
+
* h: 色相(0-360度)
|
|
242
|
+
* w: 白度(0-100%)
|
|
243
|
+
* b: 黑度(0-100%)
|
|
244
|
+
* @see https://www.w3.org/TR/css-color-4/#hwb-to-rgb
|
|
245
|
+
* @example
|
|
246
|
+
* rgbToHwb({r: 255, g: 0, b: 0}) // {h: 0, w: 0, b: 0}
|
|
247
|
+
*/
|
|
117
248
|
function rgbToHwb(rgb) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
249
|
+
const [hue, max, min, _diff] = rgbToHue(rgb);
|
|
250
|
+
return {
|
|
251
|
+
h: hue,
|
|
252
|
+
w: min * 100,
|
|
253
|
+
b: (1 - max) * 100
|
|
254
|
+
};
|
|
124
255
|
}
|
|
256
|
+
/**
|
|
257
|
+
* 将HWB颜色转换回RGB颜色空间
|
|
258
|
+
* @param hwb HWB颜色对象
|
|
259
|
+
* @param hwb.h 色相(0-360度)
|
|
260
|
+
* @param hwb.w 白度(0-100%)
|
|
261
|
+
* @param hwb.b 黑度(0-100%)
|
|
262
|
+
* @returns {RGB} RGB颜色对象(分量范围0-255)
|
|
263
|
+
* @see https://en.wikipedia.org/wiki/HWB_color_model
|
|
264
|
+
* @example
|
|
265
|
+
* hwbToRgb({h: 0, w: 0, b: 0}) // {r: 255, g: 0, b: 0}
|
|
266
|
+
*/
|
|
125
267
|
function hwbToRgb({ h, w: white, b: black }) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
268
|
+
white /= 100;
|
|
269
|
+
black /= 100;
|
|
270
|
+
const { r, g, b } = hslToRgb({
|
|
271
|
+
h,
|
|
272
|
+
s: 100,
|
|
273
|
+
l: 50
|
|
274
|
+
});
|
|
275
|
+
const tot = white + black;
|
|
276
|
+
if (tot > 1) {
|
|
277
|
+
white = white / tot;
|
|
278
|
+
black = black / tot;
|
|
279
|
+
}
|
|
280
|
+
const f = (n) => (n / 255 * (1 - white - black) + white) * 255;
|
|
281
|
+
return {
|
|
282
|
+
r: f(r),
|
|
283
|
+
g: f(g),
|
|
284
|
+
b: f(b)
|
|
285
|
+
};
|
|
140
286
|
}
|
|
287
|
+
//#endregion
|
|
288
|
+
//#region src/color/hex-hwb.ts
|
|
289
|
+
/**
|
|
290
|
+
* 将HWB颜色转换为HEX字符串
|
|
291
|
+
* @param hwb HWB颜色对象
|
|
292
|
+
* @param hwb.h 色相(0-360度)
|
|
293
|
+
* @param hwb.w 白度(0-100%)
|
|
294
|
+
* @param hwb.b 黑度(0-100%)
|
|
295
|
+
* @returns {HEX} 6位HEX颜色字符串(带#前缀)
|
|
296
|
+
* @example
|
|
297
|
+
* hwbToHex({h: 0, w: 0, b: 0}) // returns '#ff0000'
|
|
298
|
+
*/
|
|
141
299
|
function hwbToHex(hwb) {
|
|
142
|
-
|
|
300
|
+
return rgbToHex(hwbToRgb(hwb));
|
|
143
301
|
}
|
|
302
|
+
/**
|
|
303
|
+
* 将HEX颜色转换为HWB颜色空间
|
|
304
|
+
* @param hex HEX颜色字符串(支持3位或6位格式)
|
|
305
|
+
* @returns {HWB} HWB颜色对象,包含:
|
|
306
|
+
* h: 色相(0-360度)
|
|
307
|
+
* w: 白度(0-100%)
|
|
308
|
+
* b: 黑度(0-100%)
|
|
309
|
+
* @example
|
|
310
|
+
* hexToHwb('#ff0000') // returns {h: 0, w: 0, b: 0}
|
|
311
|
+
*/
|
|
144
312
|
function hexToHwb(hex) {
|
|
145
|
-
|
|
313
|
+
return rgbToHwb(hexToRgb(hex));
|
|
146
314
|
}
|
|
315
|
+
//#endregion
|
|
316
|
+
//#region src/color/hsl-lighten.ts
|
|
317
|
+
/**
|
|
318
|
+
* 通过HSL颜色空间调整颜色亮度
|
|
319
|
+
* @param hsl 原始 HSL 颜色
|
|
320
|
+
* @param value 亮度调整系数(0-1之间,0.1表示增加10%亮度)
|
|
321
|
+
* @returns {HSL} 调整后的 HSL 颜色
|
|
322
|
+
* @example
|
|
323
|
+
* hslLighten({h: 300, s: 33, l: 44}, 0.2) // 返回亮度增加20%后的颜色
|
|
324
|
+
*/
|
|
147
325
|
function hslLighten(hsl, value) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
326
|
+
const hslFinal = { ...hsl };
|
|
327
|
+
hslFinal.l = hslFinal.l * (1 + value);
|
|
328
|
+
return hslFinal;
|
|
151
329
|
}
|
|
330
|
+
//#endregion
|
|
331
|
+
//#region src/color/hsv-brighten.ts
|
|
332
|
+
/**
|
|
333
|
+
* 通过HSV颜色空间调整颜色明度
|
|
334
|
+
* @param hsv 原始HSV颜色对象
|
|
335
|
+
* @param value 明度调整系数(-1到1之间):
|
|
336
|
+
* - 正值增加明度(如0.2表示+20%)
|
|
337
|
+
* - 负值降低明度(如-0.1表示-10%)
|
|
338
|
+
* @returns {HSV} 调整后的HSV颜色对象(v值范围0-100%)
|
|
339
|
+
* @example
|
|
340
|
+
* hsvBrighten({h: 0, s: 100, v: 50}, 0.3) // 返回{h: 0, s: 100, v: 65}
|
|
341
|
+
*/
|
|
152
342
|
function hsvBrighten(hsv, value) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
343
|
+
const hsvFinal = { ...hsv };
|
|
344
|
+
hsvFinal.v = hsvFinal.v * (1 + value);
|
|
345
|
+
return hsvFinal;
|
|
156
346
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
347
|
+
//#endregion
|
|
348
|
+
//#region src/color/mix.ts
|
|
349
|
+
/**
|
|
350
|
+
* 颜色混合函数(支持RGB/HSL/HSV色彩模型)
|
|
351
|
+
* @template T 颜色类型,支持RGB、HSL或HSV对象
|
|
352
|
+
* @param {T} a 第一个颜色对象
|
|
353
|
+
* @param {T} b 第二个颜色对象
|
|
354
|
+
* @param {number} [weight=0.5] 混合权重(0-1之间):
|
|
355
|
+
* - 0 表示完全使用第一个颜色
|
|
356
|
+
* - 1 表示完全使用第二个颜色
|
|
357
|
+
* @returns {T} 线性混合后的新颜色对象
|
|
358
|
+
* @example
|
|
359
|
+
* // RGB混合示例
|
|
360
|
+
* mix({r: 255, g: 0, b: 0}, {r: 0, g: 0, b: 255}, 0.5) // 返回紫色
|
|
361
|
+
*
|
|
362
|
+
* // HSL混合示例
|
|
363
|
+
* mix({h: 0, s: 100, l: 50}, {h: 120, s: 100, l: 50}, 0.3)
|
|
364
|
+
*/
|
|
365
|
+
function mix(a, b, weight = .5) {
|
|
366
|
+
return Object.keys(a).reduce((acc, key) => {
|
|
367
|
+
acc[key] = (b[key] - a[key]) * weight + a[key];
|
|
368
|
+
return acc;
|
|
369
|
+
}, {});
|
|
162
370
|
}
|
|
371
|
+
//#endregion
|
|
372
|
+
//#region src/color/rgb-xyz.ts
|
|
373
|
+
/**
|
|
374
|
+
* 将RGB颜色转换为CIE 1931 XYZ颜色空间(D65白点,2°观察者)
|
|
375
|
+
* @param rgb RGB颜色对象(分量范围0-255)
|
|
376
|
+
* @returns {XYZ} XYZ颜色对象:
|
|
377
|
+
* x: 约0-95.047
|
|
378
|
+
* y: 约0-100.0
|
|
379
|
+
* z: 约0-108.883
|
|
380
|
+
* @see https://en.wikipedia.org/wiki/CIE_1931_color_space
|
|
381
|
+
* @example
|
|
382
|
+
* rgbToXyz({r: 255, g: 255, b: 255}) // {x: 95.047, y: 100.0, z: 108.883}
|
|
383
|
+
*/
|
|
163
384
|
function rgbToXyz(rgb) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
385
|
+
const { r, g, b } = rgb;
|
|
386
|
+
const [var_R, var_G, var_B] = [
|
|
387
|
+
r,
|
|
388
|
+
g,
|
|
389
|
+
b
|
|
390
|
+
].map((x) => x / 255).map((x) => x > .04045 ? ((x + .055) / 1.055) ** 2.4 : x / 12.92).map((x) => x * 100);
|
|
391
|
+
return {
|
|
392
|
+
x: var_R * .4124 + var_G * .3576 + var_B * .1805,
|
|
393
|
+
y: var_R * .2126 + var_G * .7152 + var_B * .0722,
|
|
394
|
+
z: var_R * .0193 + var_G * .1192 + var_B * .9505
|
|
395
|
+
};
|
|
172
396
|
}
|
|
397
|
+
/**
|
|
398
|
+
* 将XYZ颜色转换回RGB颜色空间(可能超出常规范围)
|
|
399
|
+
* @param xyz XYZ颜色对象
|
|
400
|
+
* @returns {RGB} RGB颜色对象(分量可能超出0-255范围)
|
|
401
|
+
* @see https://www.brucelindbloom.com/index.html?Eqn_XYZ_to_RGB.html
|
|
402
|
+
* @example
|
|
403
|
+
* xyzToRgb({x: 95.047, y: 100.0, z: 108.883}) // {r: 255, g: 255, b: 255}
|
|
404
|
+
*/
|
|
173
405
|
function xyzToRgb(xyz) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
406
|
+
const { x, y, z } = xyz;
|
|
407
|
+
const var_X = x / 100;
|
|
408
|
+
const var_Y = y / 100;
|
|
409
|
+
const var_Z = z / 100;
|
|
410
|
+
const [r, g, b] = [
|
|
411
|
+
var_X * 3.2406 + var_Y * -1.5372 + var_Z * -.4986,
|
|
412
|
+
var_X * -.9689 + var_Y * 1.8758 + var_Z * .0415,
|
|
413
|
+
var_X * .0557 + var_Y * -.204 + var_Z * 1.057
|
|
414
|
+
].map((n) => n > .0031308 ? 1.055 * n ** (1 / 2.4) - .055 : 12.92 * n).map((n) => n * 255);
|
|
415
|
+
return {
|
|
416
|
+
r,
|
|
417
|
+
g,
|
|
418
|
+
b
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
//#endregion
|
|
422
|
+
//#region src/color/xyz-lab.ts
|
|
423
|
+
var ref_X = 95.047;
|
|
424
|
+
var ref_Y = 100;
|
|
425
|
+
var ref_Z = 108.883;
|
|
426
|
+
/**
|
|
427
|
+
* 将XYZ颜色转换为Lab颜色空间(CIE 1976 L*a*b*,D65白点)
|
|
428
|
+
* @param xyz XYZ颜色对象(参考值:D65白点X=95.047,Y=100,Z=108.883)
|
|
429
|
+
* @returns {LAB} Lab颜色对象:
|
|
430
|
+
* l: 明度(0-100)
|
|
431
|
+
* a: 绿-红分量(典型范围-128到127)
|
|
432
|
+
* b: 蓝-黄分量(典型范围-128到127)
|
|
433
|
+
* @see https://en.wikipedia.org/wiki/CIELAB_color_space
|
|
434
|
+
* @example
|
|
435
|
+
* xyzToLab({x: 95.047, y: 100.0, z: 108.883}) // {l: 100, a: 0, b: 0}
|
|
436
|
+
*/
|
|
191
437
|
function xyzToLab(xyz) {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
438
|
+
const { x, y, z } = xyz;
|
|
439
|
+
const [var_X, var_Y, var_Z] = [
|
|
440
|
+
x / ref_X,
|
|
441
|
+
y / ref_Y,
|
|
442
|
+
z / ref_Z
|
|
443
|
+
].map((a) => a > .008856 ? a ** (1 / 3) : 7.787 * a + 16 / 116);
|
|
444
|
+
return {
|
|
445
|
+
l: 116 * var_Y - 16,
|
|
446
|
+
a: 500 * (var_X - var_Y),
|
|
447
|
+
b: 200 * (var_Y - var_Z)
|
|
448
|
+
};
|
|
200
449
|
}
|
|
450
|
+
/**
|
|
451
|
+
* 将Lab颜色转换回XYZ颜色空间
|
|
452
|
+
* @param lab Lab颜色对象
|
|
453
|
+
* @param lab.l 明度(0-100)
|
|
454
|
+
* @param lab.a 绿-红分量(典型范围-128到127)
|
|
455
|
+
* @param lab.b 蓝-黄分量(典型范围-128到127)
|
|
456
|
+
* @returns {XYZ} XYZ颜色对象(基于D65白点)
|
|
457
|
+
* @see https://www.easyrgb.com/en/math.php
|
|
458
|
+
* @example
|
|
459
|
+
* labToXyz({l: 100, a: 0, b: 0}) // {x: 95.047, y: 100.0, z: 108.883}
|
|
460
|
+
*/
|
|
201
461
|
function labToXyz(lab) {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
462
|
+
const { l, a, b } = lab;
|
|
463
|
+
const var_Y = (l + 16) / 116;
|
|
464
|
+
const [X, Y, Z] = [
|
|
465
|
+
a / 500 + var_Y,
|
|
466
|
+
var_Y,
|
|
467
|
+
var_Y - b / 200
|
|
468
|
+
].map((n) => n ** 3 > .008856 ? n ** 3 : (n - 16 / 116) / 7.787);
|
|
469
|
+
return {
|
|
470
|
+
x: X * ref_X,
|
|
471
|
+
y: Y * ref_Y,
|
|
472
|
+
z: Z * ref_Z
|
|
473
|
+
};
|
|
208
474
|
}
|
|
475
|
+
//#endregion
|
|
476
|
+
//#region src/color/rgb-lab.ts
|
|
477
|
+
/**
|
|
478
|
+
* 将RGB颜色转换为Lab颜色空间(CIE 1976标准)
|
|
479
|
+
* @param rgb RGB颜色对象(分量范围0-255)
|
|
480
|
+
* @returns {LAB} Lab颜色对象:
|
|
481
|
+
* l: 明度(0-100)
|
|
482
|
+
* a: 绿-红分量(-128到127)
|
|
483
|
+
* b: 蓝-黄分量(-128到127)
|
|
484
|
+
* @see https://en.wikipedia.org/wiki/CIELAB_color_space
|
|
485
|
+
* @example
|
|
486
|
+
* rgbToLab({r: 255, g: 0, b: 0}) // {l: 53.24, a: 80.09, b: 67.20}
|
|
487
|
+
*/
|
|
209
488
|
function rgbToLab(rgb) {
|
|
210
|
-
|
|
489
|
+
return xyzToLab(rgbToXyz(rgb));
|
|
211
490
|
}
|
|
491
|
+
/**
|
|
492
|
+
* 将Lab颜色转换回RGB颜色空间
|
|
493
|
+
* @param lab Lab颜色对象
|
|
494
|
+
* @param lab.l 明度(0-100)
|
|
495
|
+
* @param lab.a 绿-红分量(-128到127)
|
|
496
|
+
* @param lab.b 蓝-黄分量(-128到127)
|
|
497
|
+
* @returns {RGB} RGB颜色对象(分量可能超出0-255范围)
|
|
498
|
+
* @see https://www.easyrgb.com/en/math.php
|
|
499
|
+
* @example
|
|
500
|
+
* labToRgb({l: 53.24, a: 80.09, b: 67.20}) // {r: 255, g: 0, b: 0}
|
|
501
|
+
*/
|
|
212
502
|
function labToRgb(lab) {
|
|
213
|
-
|
|
503
|
+
return xyzToRgb(labToXyz(lab));
|
|
214
504
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
505
|
+
//#endregion
|
|
506
|
+
//#region src/color/rgb-whiter.ts
|
|
507
|
+
var { abs } = Math;
|
|
508
|
+
var whiteRGB = {
|
|
509
|
+
r: 0,
|
|
510
|
+
g: 0,
|
|
511
|
+
b: 0
|
|
512
|
+
};
|
|
513
|
+
var blackRGB = {
|
|
514
|
+
r: 255,
|
|
515
|
+
g: 255,
|
|
516
|
+
b: 255
|
|
517
|
+
};
|
|
518
|
+
/**
|
|
519
|
+
* 通过混合颜色调整明暗度
|
|
520
|
+
* @param rgb 原始RGB颜色对象
|
|
521
|
+
* @param value 调整强度(-1到1之间):
|
|
522
|
+
* - 正值时与黑色混合(增加暗度)
|
|
523
|
+
* - 负值时与白色混合(增加亮度)
|
|
524
|
+
* @returns {RGB} 调整后的RGB颜色对象
|
|
525
|
+
* @example
|
|
526
|
+
* rgbDarken({r: 100, g: 150, b: 200}, 0.2) // 变暗20%
|
|
527
|
+
*/
|
|
218
528
|
function rgbWhiter(rgb, value) {
|
|
219
|
-
|
|
220
|
-
return mix(rgb, rgb2, abs(value));
|
|
529
|
+
return mix(rgb, value > 0 ? whiteRGB : blackRGB, abs(value));
|
|
221
530
|
}
|
|
531
|
+
//#endregion
|
|
222
532
|
exports.contrast = contrast;
|
|
223
533
|
exports.distance = distance;
|
|
224
534
|
exports.hexToHsl = hexToHsl;
|
|
@@ -247,4 +557,5 @@ exports.rgbToXyz = rgbToXyz;
|
|
|
247
557
|
exports.rgbWhiter = rgbWhiter;
|
|
248
558
|
exports.xyzToLab = xyzToLab;
|
|
249
559
|
exports.xyzToRgb = xyzToRgb;
|
|
250
|
-
|
|
560
|
+
|
|
561
|
+
//# sourceMappingURL=color.cjs.map
|