@cloudcome/utils-core 1.19.1 → 1.20.0

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