ph-utils 0.20.1 → 1.0.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.
- package/lib/browser.d.ts +416 -0
- package/lib/browser.js +858 -0
- package/lib/color-CUZrwrjD.js +206 -0
- package/lib/index.d.ts +615 -61
- package/lib/index.js +1539 -235
- package/lib/node.d.ts +115 -0
- package/lib/node.js +213 -0
- package/package.json +10 -64
- package/lib/array.d.ts +0 -79
- package/lib/array.js +0 -212
- package/lib/color.d.ts +0 -55
- package/lib/color.js +0 -294
- package/lib/config.d.ts +0 -33
- package/lib/config.js +0 -99
- package/lib/copy.d.ts +0 -11
- package/lib/copy.js +0 -101
- package/lib/crypto.d.ts +0 -74
- package/lib/crypto.js +0 -261
- package/lib/crypto_node.d.ts +0 -61
- package/lib/crypto_node.js +0 -133
- package/lib/date.d.ts +0 -66
- package/lib/date.js +0 -202
- package/lib/dom.d.ts +0 -265
- package/lib/dom.js +0 -645
- package/lib/file.d.ts +0 -29
- package/lib/file.js +0 -54
- package/lib/id.d.ts +0 -68
- package/lib/id.js +0 -170
- package/lib/logger.d.ts +0 -62
- package/lib/logger.js +0 -122
- package/lib/server.d.ts +0 -33
- package/lib/server.js +0 -65
- package/lib/src/array.d.ts +0 -79
- package/lib/src/array.js +0 -212
- package/lib/src/color.d.ts +0 -55
- package/lib/src/color.js +0 -294
- package/lib/src/config.d.ts +0 -33
- package/lib/src/config.js +0 -99
- package/lib/src/copy.d.ts +0 -11
- package/lib/src/copy.js +0 -101
- package/lib/src/crypto.d.ts +0 -74
- package/lib/src/crypto.js +0 -261
- package/lib/src/crypto_node.d.ts +0 -61
- package/lib/src/crypto_node.js +0 -133
- package/lib/src/date.d.ts +0 -66
- package/lib/src/date.js +0 -202
- package/lib/src/dom.d.ts +0 -265
- package/lib/src/dom.js +0 -635
- package/lib/src/file.d.ts +0 -29
- package/lib/src/file.js +0 -54
- package/lib/src/id.d.ts +0 -68
- package/lib/src/id.js +0 -170
- package/lib/src/index.d.ts +0 -154
- package/lib/src/index.js +0 -239
- package/lib/src/logger.d.ts +0 -62
- package/lib/src/logger.js +0 -122
- package/lib/src/server.d.ts +0 -33
- package/lib/src/server.js +0 -65
- package/lib/src/storage.d.ts +0 -51
- package/lib/src/storage.js +0 -73
- package/lib/src/theme.d.ts +0 -44
- package/lib/src/theme.js +0 -156
- package/lib/src/validator.d.ts +0 -71
- package/lib/src/validator.js +0 -238
- package/lib/src/web.d.ts +0 -30
- package/lib/src/web.js +0 -100
- package/lib/storage.d.ts +0 -51
- package/lib/storage.js +0 -73
- package/lib/theme.d.ts +0 -44
- package/lib/theme.js +0 -156
- package/lib/validator.d.ts +0 -71
- package/lib/validator.js +0 -248
- package/lib/web.d.ts +0 -30
- package/lib/web.js +0 -100
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
//#region src/color.ts
|
|
2
|
+
const hueStep = 2;
|
|
3
|
+
const saturationStep = .16;
|
|
4
|
+
const saturationStep2 = .05;
|
|
5
|
+
const brightnessStep1 = .05;
|
|
6
|
+
const brightnessStep2 = .15;
|
|
7
|
+
const rgbRegex = /^\s*rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d*\.?\d+)\s*)?\)\s*$/;
|
|
8
|
+
const hexRegex = /^#(?:([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})|([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f]))$/;
|
|
9
|
+
const clamp = (value, min, max) => value < min ? min : value > max ? max : value;
|
|
10
|
+
const clamp01 = (value) => clamp(value, 0, 1);
|
|
11
|
+
const round2 = (value) => Math.round(value * 100) / 100;
|
|
12
|
+
function isRgb(color) {
|
|
13
|
+
return color?.r != null && color?.g != null && color?.b != null;
|
|
14
|
+
}
|
|
15
|
+
function isHsv(color) {
|
|
16
|
+
return color?.h != null && color?.s != null && color?.v != null;
|
|
17
|
+
}
|
|
18
|
+
function parseRgbString(color) {
|
|
19
|
+
const colorValue = color.match(rgbRegex);
|
|
20
|
+
if (colorValue == null) return;
|
|
21
|
+
const r = parseInt(colorValue[1], 10);
|
|
22
|
+
const g = parseInt(colorValue[2], 10);
|
|
23
|
+
const b = parseInt(colorValue[3], 10);
|
|
24
|
+
if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) throw new Error("Invalid RGB color.");
|
|
25
|
+
let a = 1;
|
|
26
|
+
if (colorValue[4] != null) {
|
|
27
|
+
a = parseFloat(colorValue[4]);
|
|
28
|
+
if (Number.isNaN(a)) a = 1;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
r,
|
|
32
|
+
g,
|
|
33
|
+
b,
|
|
34
|
+
a
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function parseHexString(color) {
|
|
38
|
+
const colorMatch = color.match(hexRegex);
|
|
39
|
+
if (colorMatch == null) return;
|
|
40
|
+
const isShortForm = colorMatch[4] !== void 0;
|
|
41
|
+
const r = parseInt(isShortForm ? colorMatch[4] + colorMatch[4] : colorMatch[1], 16);
|
|
42
|
+
const g = parseInt(isShortForm ? colorMatch[5] + colorMatch[5] : colorMatch[2], 16);
|
|
43
|
+
const b = parseInt(isShortForm ? colorMatch[6] + colorMatch[6] : colorMatch[3], 16);
|
|
44
|
+
if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) throw new Error("Invalid HEX color.");
|
|
45
|
+
return {
|
|
46
|
+
r,
|
|
47
|
+
g,
|
|
48
|
+
b
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 将输入的颜色值转换为RGB对象格式。
|
|
53
|
+
* @param color 可以是字符串, 也可以是一个 HSV 对象[一个包含 h、s、v 属性的对象]
|
|
54
|
+
* @returns 返回一个包含r、g、b和a(透明度)属性的RGB对象。
|
|
55
|
+
* @throws 如果输入的字符串不是有效的颜色表示,则抛出错误。
|
|
56
|
+
*/
|
|
57
|
+
function toRgb(color) {
|
|
58
|
+
if (typeof color === "string") {
|
|
59
|
+
const rgb = parseHexString(color) ?? parseRgbString(color);
|
|
60
|
+
if (rgb != null) return rgb;
|
|
61
|
+
throw new Error("Invalid color string");
|
|
62
|
+
}
|
|
63
|
+
if (isRgb(color)) return color;
|
|
64
|
+
if (isHsv(color)) return hsvToRgb(color);
|
|
65
|
+
throw new Error("Invalid color");
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 将颜色转换为HSV颜色模型。
|
|
69
|
+
* @param color - 字符串或者RGB对象
|
|
70
|
+
* @returns 返回一个包含h、s、v属性的对象,代表HSV颜色值,其中h是色相(取值范围0到360),s是饱和度(取值范围0到1),v是明度(取值范围0到1)。
|
|
71
|
+
*/
|
|
72
|
+
function toHsv(color) {
|
|
73
|
+
if (isHsv(color)) return color;
|
|
74
|
+
const rgbColor = toRgb(color);
|
|
75
|
+
const r = rgbColor.r / 255;
|
|
76
|
+
const g = rgbColor.g / 255;
|
|
77
|
+
const b = rgbColor.b / 255;
|
|
78
|
+
const max = Math.max(r, g, b);
|
|
79
|
+
const delta = max - Math.min(r, g, b);
|
|
80
|
+
const v = max;
|
|
81
|
+
const s = max === 0 ? 0 : delta / max;
|
|
82
|
+
if (delta === 0) return {
|
|
83
|
+
h: 0,
|
|
84
|
+
s,
|
|
85
|
+
v
|
|
86
|
+
};
|
|
87
|
+
let h = 0;
|
|
88
|
+
switch (max) {
|
|
89
|
+
case r:
|
|
90
|
+
h = ((g - b) / delta + (g < b ? 6 : 0)) / 6;
|
|
91
|
+
break;
|
|
92
|
+
case g:
|
|
93
|
+
h = ((b - r) / delta + 2) / 6;
|
|
94
|
+
break;
|
|
95
|
+
case b: h = ((r - g) / delta + 4) / 6;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
h: h * 360,
|
|
99
|
+
s,
|
|
100
|
+
v
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 将HSV颜色模型转换为RGB颜色模型。
|
|
105
|
+
* @param hsv 包含色相(h)、饱和度(s)和明度(v)的对象。s 和 v 可以是 0~1之间的小数, 也可以是 0~100 直接的整数, 推荐为小数,结果更精准
|
|
106
|
+
* @returns 返回一个包含红色(r)、绿色(g)和蓝色(b)值的对象,范围为0-255。
|
|
107
|
+
*/
|
|
108
|
+
function hsvToRgb(hsv) {
|
|
109
|
+
const s = hsv.s > 1 ? hsv.s / 100 : hsv.s;
|
|
110
|
+
const v = hsv.v > 1 ? hsv.v / 100 : hsv.v;
|
|
111
|
+
const hh = (hsv.h % 360 + 360) % 360 / 60;
|
|
112
|
+
const hi = Math.floor(hh);
|
|
113
|
+
const f = hh - hi;
|
|
114
|
+
const p = v * (1 - s);
|
|
115
|
+
const q = v * (1 - f * s);
|
|
116
|
+
const t = v * (1 - (1 - f) * s);
|
|
117
|
+
let r = 0;
|
|
118
|
+
let g = 0;
|
|
119
|
+
let b = 0;
|
|
120
|
+
switch (hi) {
|
|
121
|
+
case 0:
|
|
122
|
+
r = v;
|
|
123
|
+
g = t;
|
|
124
|
+
b = p;
|
|
125
|
+
break;
|
|
126
|
+
case 1:
|
|
127
|
+
r = q;
|
|
128
|
+
g = v;
|
|
129
|
+
b = p;
|
|
130
|
+
break;
|
|
131
|
+
case 2:
|
|
132
|
+
r = p;
|
|
133
|
+
g = v;
|
|
134
|
+
b = t;
|
|
135
|
+
break;
|
|
136
|
+
case 3:
|
|
137
|
+
r = p;
|
|
138
|
+
g = q;
|
|
139
|
+
b = v;
|
|
140
|
+
break;
|
|
141
|
+
case 4:
|
|
142
|
+
r = t;
|
|
143
|
+
g = p;
|
|
144
|
+
b = v;
|
|
145
|
+
break;
|
|
146
|
+
case 5:
|
|
147
|
+
r = v;
|
|
148
|
+
g = p;
|
|
149
|
+
b = q;
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
r: Math.round(r * 255),
|
|
153
|
+
g: Math.round(g * 255),
|
|
154
|
+
b: Math.round(b * 255)
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function getHue(hsv, i, light) {
|
|
158
|
+
const h = Math.round(hsv.h);
|
|
159
|
+
return ((h >= 60 && h <= 240 ? light ? h - hueStep * i : h + hueStep * i : light ? h + hueStep * i : h - hueStep * i) % 360 + 360) % 360;
|
|
160
|
+
}
|
|
161
|
+
function getSaturation(hsv, i, light) {
|
|
162
|
+
if (hsv.h === 0 && hsv.s === 0) return hsv.s;
|
|
163
|
+
const saturation = light ? hsv.s - saturationStep * i : hsv.s + saturationStep2 * i;
|
|
164
|
+
return round2(clamp(saturation, .06, 1));
|
|
165
|
+
}
|
|
166
|
+
function getValue(hsv, i, light) {
|
|
167
|
+
const value = light ? hsv.v + brightnessStep1 * i : hsv.v - brightnessStep2 * i;
|
|
168
|
+
return round2(clamp01(value));
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* 将RGB颜色对象转换为十六进制颜色字符串。
|
|
172
|
+
* @param rgb - 包含红色(r), 绿色(g), 蓝色(b)成分的对象。
|
|
173
|
+
* @returns 返回一个表示RGB颜色的十六进制字符串,例如"#FF0000"。
|
|
174
|
+
*/
|
|
175
|
+
function rgbToHex(rgb) {
|
|
176
|
+
const toHex = (n) => n.toString(16).padStart(2, "0");
|
|
177
|
+
return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`.toUpperCase();
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 将颜色转换为 16 进制字符串
|
|
181
|
+
* @param color - 颜色, 可以 rgb(0,0,0),rgba(0,0,0,0)字符串, 也可以是 rgb、hsv对象
|
|
182
|
+
* @returns 返回颜色的十六进制字符串,例如"#FF0000"
|
|
183
|
+
*/
|
|
184
|
+
function toHex(color) {
|
|
185
|
+
if (typeof color === "string" && hexRegex.test(color)) return color;
|
|
186
|
+
return rgbToHex(toRgb(color));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 调整给定颜色深[darken]浅[lighten]
|
|
190
|
+
* @param color - 输入的颜色,可以是任意颜色表示方式
|
|
191
|
+
* @param level - 调整深浅级别, 可以是小数。默认: 1
|
|
192
|
+
* @param light - 控制调整的方向。如果为true,[lighten] 变浅,如果为false,[darken] 变深。默认: true
|
|
193
|
+
* 1. 颜色变浅
|
|
194
|
+
* adjust('#4998f4', 3, true)
|
|
195
|
+
* @returns 返回调整后颜色的十六进制字符串表示。
|
|
196
|
+
*/
|
|
197
|
+
function adjust(color, level = 1, light = true) {
|
|
198
|
+
const hsv = toHsv(color);
|
|
199
|
+
return toHex({
|
|
200
|
+
h: getHue(hsv, level, light),
|
|
201
|
+
s: getSaturation(hsv, level, light),
|
|
202
|
+
v: getValue(hsv, level, light)
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//#endregion
|
|
206
|
+
export { toRgb as a, toHsv as i, rgbToHex as n, toHex as r, adjust as t };
|