ilx1-x-tool 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/README.md +76 -0
- package/dist/index.d.mts +236 -0
- package/dist/index.d.ts +236 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +39 -0
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# x-tool
|
|
2
|
+
|
|
3
|
+
一个实用的 TypeScript 工具函数库,包含各种常用的工具函数。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install x-tool
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 使用
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { unique, capitalize, debounce } from 'x-tool';
|
|
15
|
+
|
|
16
|
+
// 数组去重
|
|
17
|
+
const uniqueArray = unique([1, 2, 2, 3, 3, 3]);
|
|
18
|
+
|
|
19
|
+
// 字符串首字母大写
|
|
20
|
+
const capitalized = capitalize('hello world');
|
|
21
|
+
|
|
22
|
+
// 防抖函数
|
|
23
|
+
const debouncedFn = debounce(() => {
|
|
24
|
+
console.log('防抖执行');
|
|
25
|
+
}, 300);
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## API 文档
|
|
29
|
+
|
|
30
|
+
### 数组工具
|
|
31
|
+
- `unique(arr)` - 数组去重
|
|
32
|
+
- `chunk(arr, size)` - 数组分块
|
|
33
|
+
- `shuffle(arr)` - 数组随机排序
|
|
34
|
+
- `groupBy(arr, key)` - 数组分组
|
|
35
|
+
- `flatten(arr)` - 数组扁平化
|
|
36
|
+
|
|
37
|
+
### 字符串工具
|
|
38
|
+
- `capitalize(str)` - 首字母大写
|
|
39
|
+
- `camelCase(str)` - 驼峰命名
|
|
40
|
+
- `kebabCase(str)` - 短横线命名
|
|
41
|
+
- `randomString(length)` - 随机字符串
|
|
42
|
+
- `truncate(str, length, suffix)` - 字符串截断
|
|
43
|
+
|
|
44
|
+
### 对象工具
|
|
45
|
+
- `deepClone(obj)` - 深拷贝
|
|
46
|
+
- `pick(obj, keys)` - 选择属性
|
|
47
|
+
- `omit(obj, keys)` - 排除属性
|
|
48
|
+
- `isEmpty(obj)` - 判断空对象
|
|
49
|
+
|
|
50
|
+
### 函数工具
|
|
51
|
+
- `debounce(func, wait)` - 防抖
|
|
52
|
+
- `throttle(func, limit)` - 节流
|
|
53
|
+
- `memoize(func)` - 记忆化
|
|
54
|
+
|
|
55
|
+
## 开发
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# 安装依赖
|
|
59
|
+
npm install
|
|
60
|
+
|
|
61
|
+
# 开发模式(监听文件变化)
|
|
62
|
+
npm run dev
|
|
63
|
+
|
|
64
|
+
# 构建
|
|
65
|
+
npm run build
|
|
66
|
+
|
|
67
|
+
# 测试
|
|
68
|
+
npm test
|
|
69
|
+
|
|
70
|
+
# 代码检查
|
|
71
|
+
npm run lint
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 许可证
|
|
75
|
+
|
|
76
|
+
MIT
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* @brief: 统一数据结果接口
|
|
3
|
+
* @return {*}
|
|
4
|
+
********************************************************************************/
|
|
5
|
+
interface Result<T = unknown> {
|
|
6
|
+
/** 操作是否成功 */
|
|
7
|
+
success: boolean;
|
|
8
|
+
/** 错误码(成功时通常为 0,失败时为具体错误编号) */
|
|
9
|
+
code: number;
|
|
10
|
+
/** 错误信息(成功时可为空字符串,失败时为具体描述) */
|
|
11
|
+
message: string;
|
|
12
|
+
/** 业务数据(成功时为具体数据,失败时可能为 null/undefined) */
|
|
13
|
+
data: T;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface ParsedRGB {
|
|
17
|
+
type: 'rgb';
|
|
18
|
+
r: number;
|
|
19
|
+
g: number;
|
|
20
|
+
b: number;
|
|
21
|
+
}
|
|
22
|
+
interface ParsedRGBA {
|
|
23
|
+
type: 'rgba';
|
|
24
|
+
r: number;
|
|
25
|
+
g: number;
|
|
26
|
+
b: number;
|
|
27
|
+
a: number;
|
|
28
|
+
}
|
|
29
|
+
interface ParsedHSV {
|
|
30
|
+
type: 'hsv';
|
|
31
|
+
h: number;
|
|
32
|
+
s: number;
|
|
33
|
+
v: number;
|
|
34
|
+
}
|
|
35
|
+
interface ParsedHSL {
|
|
36
|
+
type: 'hsl';
|
|
37
|
+
h: number;
|
|
38
|
+
s: number;
|
|
39
|
+
l: number;
|
|
40
|
+
}
|
|
41
|
+
interface ParsedHSLA {
|
|
42
|
+
type: 'hsla';
|
|
43
|
+
h: number;
|
|
44
|
+
s: number;
|
|
45
|
+
l: number;
|
|
46
|
+
a: number;
|
|
47
|
+
}
|
|
48
|
+
type ParsedColor = ParsedRGB | ParsedRGBA | ParsedHSV | ParsedHSL | ParsedHSLA;
|
|
49
|
+
type Hex = `#${string}`;
|
|
50
|
+
|
|
51
|
+
declare const hidKeyCode: ({
|
|
52
|
+
key: number;
|
|
53
|
+
word: string;
|
|
54
|
+
dec: string;
|
|
55
|
+
hex: string;
|
|
56
|
+
kind: number;
|
|
57
|
+
value: number;
|
|
58
|
+
aliases: string[];
|
|
59
|
+
} | {
|
|
60
|
+
key: number;
|
|
61
|
+
word: string;
|
|
62
|
+
dec: string;
|
|
63
|
+
hex: string;
|
|
64
|
+
kind: number;
|
|
65
|
+
value: number;
|
|
66
|
+
aliases?: undefined;
|
|
67
|
+
})[];
|
|
68
|
+
/********************************************************************************
|
|
69
|
+
* @brief: 获取 HID 键码映射(主键名 + 别名)
|
|
70
|
+
* @return {*}
|
|
71
|
+
********************************************************************************/
|
|
72
|
+
declare const getHIDCodeMapStr: () => Map<string, {
|
|
73
|
+
key: number;
|
|
74
|
+
word: string;
|
|
75
|
+
dec: string;
|
|
76
|
+
hex: string;
|
|
77
|
+
kind: number;
|
|
78
|
+
value: number;
|
|
79
|
+
aliases: string[];
|
|
80
|
+
} | {
|
|
81
|
+
key: number;
|
|
82
|
+
word: string;
|
|
83
|
+
dec: string;
|
|
84
|
+
hex: string;
|
|
85
|
+
kind: number;
|
|
86
|
+
value: number;
|
|
87
|
+
aliases?: undefined;
|
|
88
|
+
}>;
|
|
89
|
+
/********************************************************************************
|
|
90
|
+
* @brief: 获取 HID 键码映射(value 映射)
|
|
91
|
+
* @return {*}
|
|
92
|
+
********************************************************************************/
|
|
93
|
+
declare const getHIDCodeMapStrNum: () => Map<number, {
|
|
94
|
+
key: number;
|
|
95
|
+
word: string;
|
|
96
|
+
dec: string;
|
|
97
|
+
hex: string;
|
|
98
|
+
kind: number;
|
|
99
|
+
value: number;
|
|
100
|
+
aliases: string[];
|
|
101
|
+
} | {
|
|
102
|
+
key: number;
|
|
103
|
+
word: string;
|
|
104
|
+
dec: string;
|
|
105
|
+
hex: string;
|
|
106
|
+
kind: number;
|
|
107
|
+
value: number;
|
|
108
|
+
aliases?: undefined;
|
|
109
|
+
}>;
|
|
110
|
+
|
|
111
|
+
/********************************************************************************
|
|
112
|
+
* @brief: gzip 压缩 JSON 数据(转成 Blob,适合导出)
|
|
113
|
+
* @param {any} data
|
|
114
|
+
* @return {*}
|
|
115
|
+
********************************************************************************/
|
|
116
|
+
declare const compressJsonGzip: (data: any) => Blob;
|
|
117
|
+
/********************************************************************************
|
|
118
|
+
* @brief: 解压 gzip 格式的 JSON 文件
|
|
119
|
+
* @param {File} file
|
|
120
|
+
* @return {*}
|
|
121
|
+
********************************************************************************/
|
|
122
|
+
declare const decompressJsonGzip: (file: File) => Promise<any>;
|
|
123
|
+
|
|
124
|
+
/********************************************************************************
|
|
125
|
+
* @brief: 判断 popover 是否显示
|
|
126
|
+
* @param {string} popId
|
|
127
|
+
* @return {*}
|
|
128
|
+
********************************************************************************/
|
|
129
|
+
declare function isShowPopover(popId: string): boolean;
|
|
130
|
+
/********************************************************************************
|
|
131
|
+
* @brief: 判断图片是否有效
|
|
132
|
+
* @param {string} src
|
|
133
|
+
* @return {*}
|
|
134
|
+
********************************************************************************/
|
|
135
|
+
declare function isImageValid(src: string | File): Promise<unknown>;
|
|
136
|
+
|
|
137
|
+
/********************************************************************************
|
|
138
|
+
* @brief: 创建成功的结果对象
|
|
139
|
+
* @param {T} data 业务数据(可选,默认 null)
|
|
140
|
+
* @param {string} message 成功信息(可选,默认空字符串)
|
|
141
|
+
* @param {number} code 成功状态码(可选,默认 0)
|
|
142
|
+
* @return {*} 成功的 Result 对象
|
|
143
|
+
********************************************************************************/
|
|
144
|
+
declare function successResult<T = unknown>(data?: T, message?: string, code?: number): Result<T>;
|
|
145
|
+
/********************************************************************************
|
|
146
|
+
* @brief: 创建失败的结果对象
|
|
147
|
+
* @param {string} message 错误信息(必选)
|
|
148
|
+
* @param {number} code 错误码(可选,默认 -1)
|
|
149
|
+
* @param {T} data 错误相关数据(可选,默认 null)
|
|
150
|
+
* @return {*} 失败的 Result 对象
|
|
151
|
+
********************************************************************************/
|
|
152
|
+
declare function errorResult<T = unknown>(message: string, code?: number, data?: T): Result<T>;
|
|
153
|
+
|
|
154
|
+
/********************************************************************************
|
|
155
|
+
* @brief: 字节序枚举(大端/小端)
|
|
156
|
+
* @return {*}
|
|
157
|
+
********************************************************************************/
|
|
158
|
+
declare const Endianness: {
|
|
159
|
+
LITTLE: string;
|
|
160
|
+
BIG: string;
|
|
161
|
+
};
|
|
162
|
+
type Endianness = (typeof Endianness)[keyof typeof Endianness];
|
|
163
|
+
/********************************************************************************
|
|
164
|
+
* @brief: 将数字转换为指定字节序的字节数组
|
|
165
|
+
* @param {number} number 待转换的数字(自动截断为无符号整数)
|
|
166
|
+
* @param {number} byteCount 目标字节长度(必须为正整数)
|
|
167
|
+
* @param {Endianness} endian 字节序(默认小端)
|
|
168
|
+
* @return {*} 字节数组(每个元素为 0-255 的整数)
|
|
169
|
+
********************************************************************************/
|
|
170
|
+
declare const numToBytes: (number: number, byteCount: number, endian?: Endianness) => number[];
|
|
171
|
+
/********************************************************************************
|
|
172
|
+
* @brief: 将任意长度的字节数组转换为数字(支持不同字节序)
|
|
173
|
+
* @param {number[]} bytes 字节数组
|
|
174
|
+
* @param {Endianness} endian 字节序(默认小端)
|
|
175
|
+
* @return {*} 转换后的数字
|
|
176
|
+
********************************************************************************/
|
|
177
|
+
declare const bytesToNum: (bytes: number[], endian?: Endianness) => number;
|
|
178
|
+
/********************************************************************************
|
|
179
|
+
* @brief: 将数字转换为16位无符号整数的指定字节序字节数组(固定2字节)
|
|
180
|
+
* @param {number} number 待转换的数字(自动截断为16位无符号整数范围)
|
|
181
|
+
* @param {Endianness} endian 字节序(默认小端)
|
|
182
|
+
* @return {*} 长度为2的字节数组
|
|
183
|
+
********************************************************************************/
|
|
184
|
+
declare const numToBits16: (number: number, endian?: Endianness) => [number, number];
|
|
185
|
+
/********************************************************************************
|
|
186
|
+
* @brief: 将16位字节数组转换为数字(与numTo16Bits相反功能)
|
|
187
|
+
* @param {[number, number]} bytes 长度为2的字节数组
|
|
188
|
+
* @param {Endianness} endian 字节序(默认小端)
|
|
189
|
+
* @return {*} 转换后的数字
|
|
190
|
+
********************************************************************************/
|
|
191
|
+
declare const bits16ToNum: (bytes: [number, number], endian?: Endianness) => number;
|
|
192
|
+
/********************************************************************************
|
|
193
|
+
* @brief: 将数字转换为ASCII码值数组(每个数字转换为其对应的ASCII码)
|
|
194
|
+
* @param {number} n 待转换的数字(自动取绝对值)
|
|
195
|
+
* @return {*} ASCII码值数组(每个元素为0-255的整数)
|
|
196
|
+
********************************************************************************/
|
|
197
|
+
declare const numToAsciiArr: (n: number) => number[];
|
|
198
|
+
/********************************************************************************
|
|
199
|
+
* @brief: 将ASCII码值数组转换为对应的数字
|
|
200
|
+
* @param {number[]} ascii
|
|
201
|
+
* @return {*}
|
|
202
|
+
********************************************************************************/
|
|
203
|
+
declare const asciiArrToNum: (ascii: number[]) => number;
|
|
204
|
+
|
|
205
|
+
/********************************************************************************
|
|
206
|
+
* @brief: 解析颜色字符串(支持 rgb/rgba/hsv/hsl 格式)
|
|
207
|
+
* @param {string} str 待解析的颜色字符串(如 "hsl(120, 100%, 50%)"、"hsla(240, 50%, 70%, 0.8)")
|
|
208
|
+
* @return {*} 解析后的颜色对象,不匹配任何格式时返回 null
|
|
209
|
+
********************************************************************************/
|
|
210
|
+
declare function parseColorString(str: string): ParsedColor | null;
|
|
211
|
+
/********************************************************************************
|
|
212
|
+
* @brief: HSL 转 RGB 颜色转换
|
|
213
|
+
* @param {ParsedColor} hsl HSL 颜色对象(分量范围 0-255)
|
|
214
|
+
* @return {*} RGB 颜色对象(分量范围 0-255)
|
|
215
|
+
********************************************************************************/
|
|
216
|
+
declare function hslToRgb(hsl: ParsedHSL | ParsedHSLA | null): ParsedColor | null;
|
|
217
|
+
/********************************************************************************
|
|
218
|
+
* @brief: RGB 转 HSL 颜色转换
|
|
219
|
+
* @param {ParsedColor} rgb RGB 颜色对象(分量范围 0-255)
|
|
220
|
+
* @return {*} HSL 颜色对象(h:0-360, s:0-1, l:0-1)
|
|
221
|
+
********************************************************************************/
|
|
222
|
+
declare function rgbToHsl(rgb: ParsedRGB | ParsedRGBA | null): ParsedColor | null;
|
|
223
|
+
/********************************************************************************
|
|
224
|
+
* @brief: HSV 转 HSL 颜色转换
|
|
225
|
+
* @param {ParsedColor} hsv HSV 颜色对象(分量范围 0-255)
|
|
226
|
+
* @return {*} HSL 颜色对象(h:0-360, s:0-1, l:0-1)
|
|
227
|
+
********************************************************************************/
|
|
228
|
+
declare function hsvToHsl(hsv: ParsedHSV): ParsedColor;
|
|
229
|
+
/********************************************************************************
|
|
230
|
+
* @brief: HSL 转 HSV 颜色转换
|
|
231
|
+
* @param {ParsedColor} hsl HSL 颜色对象(分量范围 0-255)
|
|
232
|
+
* @return {*} HSV 颜色对象(h:0-360, s:0-1, v:0-1)
|
|
233
|
+
********************************************************************************/
|
|
234
|
+
declare function hslToHsv(hsl: ParsedHSL): ParsedColor;
|
|
235
|
+
|
|
236
|
+
export { Endianness, type Hex, type ParsedColor, type ParsedHSL, type ParsedHSLA, type ParsedHSV, type ParsedRGB, type ParsedRGBA, type Result, asciiArrToNum, bits16ToNum, bytesToNum, compressJsonGzip, decompressJsonGzip, errorResult, getHIDCodeMapStr, getHIDCodeMapStrNum, hidKeyCode, hslToHsv, hslToRgb, hsvToHsl, isImageValid, isShowPopover, numToAsciiArr, numToBits16, numToBytes, parseColorString, rgbToHsl, successResult };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* @brief: 统一数据结果接口
|
|
3
|
+
* @return {*}
|
|
4
|
+
********************************************************************************/
|
|
5
|
+
interface Result<T = unknown> {
|
|
6
|
+
/** 操作是否成功 */
|
|
7
|
+
success: boolean;
|
|
8
|
+
/** 错误码(成功时通常为 0,失败时为具体错误编号) */
|
|
9
|
+
code: number;
|
|
10
|
+
/** 错误信息(成功时可为空字符串,失败时为具体描述) */
|
|
11
|
+
message: string;
|
|
12
|
+
/** 业务数据(成功时为具体数据,失败时可能为 null/undefined) */
|
|
13
|
+
data: T;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface ParsedRGB {
|
|
17
|
+
type: 'rgb';
|
|
18
|
+
r: number;
|
|
19
|
+
g: number;
|
|
20
|
+
b: number;
|
|
21
|
+
}
|
|
22
|
+
interface ParsedRGBA {
|
|
23
|
+
type: 'rgba';
|
|
24
|
+
r: number;
|
|
25
|
+
g: number;
|
|
26
|
+
b: number;
|
|
27
|
+
a: number;
|
|
28
|
+
}
|
|
29
|
+
interface ParsedHSV {
|
|
30
|
+
type: 'hsv';
|
|
31
|
+
h: number;
|
|
32
|
+
s: number;
|
|
33
|
+
v: number;
|
|
34
|
+
}
|
|
35
|
+
interface ParsedHSL {
|
|
36
|
+
type: 'hsl';
|
|
37
|
+
h: number;
|
|
38
|
+
s: number;
|
|
39
|
+
l: number;
|
|
40
|
+
}
|
|
41
|
+
interface ParsedHSLA {
|
|
42
|
+
type: 'hsla';
|
|
43
|
+
h: number;
|
|
44
|
+
s: number;
|
|
45
|
+
l: number;
|
|
46
|
+
a: number;
|
|
47
|
+
}
|
|
48
|
+
type ParsedColor = ParsedRGB | ParsedRGBA | ParsedHSV | ParsedHSL | ParsedHSLA;
|
|
49
|
+
type Hex = `#${string}`;
|
|
50
|
+
|
|
51
|
+
declare const hidKeyCode: ({
|
|
52
|
+
key: number;
|
|
53
|
+
word: string;
|
|
54
|
+
dec: string;
|
|
55
|
+
hex: string;
|
|
56
|
+
kind: number;
|
|
57
|
+
value: number;
|
|
58
|
+
aliases: string[];
|
|
59
|
+
} | {
|
|
60
|
+
key: number;
|
|
61
|
+
word: string;
|
|
62
|
+
dec: string;
|
|
63
|
+
hex: string;
|
|
64
|
+
kind: number;
|
|
65
|
+
value: number;
|
|
66
|
+
aliases?: undefined;
|
|
67
|
+
})[];
|
|
68
|
+
/********************************************************************************
|
|
69
|
+
* @brief: 获取 HID 键码映射(主键名 + 别名)
|
|
70
|
+
* @return {*}
|
|
71
|
+
********************************************************************************/
|
|
72
|
+
declare const getHIDCodeMapStr: () => Map<string, {
|
|
73
|
+
key: number;
|
|
74
|
+
word: string;
|
|
75
|
+
dec: string;
|
|
76
|
+
hex: string;
|
|
77
|
+
kind: number;
|
|
78
|
+
value: number;
|
|
79
|
+
aliases: string[];
|
|
80
|
+
} | {
|
|
81
|
+
key: number;
|
|
82
|
+
word: string;
|
|
83
|
+
dec: string;
|
|
84
|
+
hex: string;
|
|
85
|
+
kind: number;
|
|
86
|
+
value: number;
|
|
87
|
+
aliases?: undefined;
|
|
88
|
+
}>;
|
|
89
|
+
/********************************************************************************
|
|
90
|
+
* @brief: 获取 HID 键码映射(value 映射)
|
|
91
|
+
* @return {*}
|
|
92
|
+
********************************************************************************/
|
|
93
|
+
declare const getHIDCodeMapStrNum: () => Map<number, {
|
|
94
|
+
key: number;
|
|
95
|
+
word: string;
|
|
96
|
+
dec: string;
|
|
97
|
+
hex: string;
|
|
98
|
+
kind: number;
|
|
99
|
+
value: number;
|
|
100
|
+
aliases: string[];
|
|
101
|
+
} | {
|
|
102
|
+
key: number;
|
|
103
|
+
word: string;
|
|
104
|
+
dec: string;
|
|
105
|
+
hex: string;
|
|
106
|
+
kind: number;
|
|
107
|
+
value: number;
|
|
108
|
+
aliases?: undefined;
|
|
109
|
+
}>;
|
|
110
|
+
|
|
111
|
+
/********************************************************************************
|
|
112
|
+
* @brief: gzip 压缩 JSON 数据(转成 Blob,适合导出)
|
|
113
|
+
* @param {any} data
|
|
114
|
+
* @return {*}
|
|
115
|
+
********************************************************************************/
|
|
116
|
+
declare const compressJsonGzip: (data: any) => Blob;
|
|
117
|
+
/********************************************************************************
|
|
118
|
+
* @brief: 解压 gzip 格式的 JSON 文件
|
|
119
|
+
* @param {File} file
|
|
120
|
+
* @return {*}
|
|
121
|
+
********************************************************************************/
|
|
122
|
+
declare const decompressJsonGzip: (file: File) => Promise<any>;
|
|
123
|
+
|
|
124
|
+
/********************************************************************************
|
|
125
|
+
* @brief: 判断 popover 是否显示
|
|
126
|
+
* @param {string} popId
|
|
127
|
+
* @return {*}
|
|
128
|
+
********************************************************************************/
|
|
129
|
+
declare function isShowPopover(popId: string): boolean;
|
|
130
|
+
/********************************************************************************
|
|
131
|
+
* @brief: 判断图片是否有效
|
|
132
|
+
* @param {string} src
|
|
133
|
+
* @return {*}
|
|
134
|
+
********************************************************************************/
|
|
135
|
+
declare function isImageValid(src: string | File): Promise<unknown>;
|
|
136
|
+
|
|
137
|
+
/********************************************************************************
|
|
138
|
+
* @brief: 创建成功的结果对象
|
|
139
|
+
* @param {T} data 业务数据(可选,默认 null)
|
|
140
|
+
* @param {string} message 成功信息(可选,默认空字符串)
|
|
141
|
+
* @param {number} code 成功状态码(可选,默认 0)
|
|
142
|
+
* @return {*} 成功的 Result 对象
|
|
143
|
+
********************************************************************************/
|
|
144
|
+
declare function successResult<T = unknown>(data?: T, message?: string, code?: number): Result<T>;
|
|
145
|
+
/********************************************************************************
|
|
146
|
+
* @brief: 创建失败的结果对象
|
|
147
|
+
* @param {string} message 错误信息(必选)
|
|
148
|
+
* @param {number} code 错误码(可选,默认 -1)
|
|
149
|
+
* @param {T} data 错误相关数据(可选,默认 null)
|
|
150
|
+
* @return {*} 失败的 Result 对象
|
|
151
|
+
********************************************************************************/
|
|
152
|
+
declare function errorResult<T = unknown>(message: string, code?: number, data?: T): Result<T>;
|
|
153
|
+
|
|
154
|
+
/********************************************************************************
|
|
155
|
+
* @brief: 字节序枚举(大端/小端)
|
|
156
|
+
* @return {*}
|
|
157
|
+
********************************************************************************/
|
|
158
|
+
declare const Endianness: {
|
|
159
|
+
LITTLE: string;
|
|
160
|
+
BIG: string;
|
|
161
|
+
};
|
|
162
|
+
type Endianness = (typeof Endianness)[keyof typeof Endianness];
|
|
163
|
+
/********************************************************************************
|
|
164
|
+
* @brief: 将数字转换为指定字节序的字节数组
|
|
165
|
+
* @param {number} number 待转换的数字(自动截断为无符号整数)
|
|
166
|
+
* @param {number} byteCount 目标字节长度(必须为正整数)
|
|
167
|
+
* @param {Endianness} endian 字节序(默认小端)
|
|
168
|
+
* @return {*} 字节数组(每个元素为 0-255 的整数)
|
|
169
|
+
********************************************************************************/
|
|
170
|
+
declare const numToBytes: (number: number, byteCount: number, endian?: Endianness) => number[];
|
|
171
|
+
/********************************************************************************
|
|
172
|
+
* @brief: 将任意长度的字节数组转换为数字(支持不同字节序)
|
|
173
|
+
* @param {number[]} bytes 字节数组
|
|
174
|
+
* @param {Endianness} endian 字节序(默认小端)
|
|
175
|
+
* @return {*} 转换后的数字
|
|
176
|
+
********************************************************************************/
|
|
177
|
+
declare const bytesToNum: (bytes: number[], endian?: Endianness) => number;
|
|
178
|
+
/********************************************************************************
|
|
179
|
+
* @brief: 将数字转换为16位无符号整数的指定字节序字节数组(固定2字节)
|
|
180
|
+
* @param {number} number 待转换的数字(自动截断为16位无符号整数范围)
|
|
181
|
+
* @param {Endianness} endian 字节序(默认小端)
|
|
182
|
+
* @return {*} 长度为2的字节数组
|
|
183
|
+
********************************************************************************/
|
|
184
|
+
declare const numToBits16: (number: number, endian?: Endianness) => [number, number];
|
|
185
|
+
/********************************************************************************
|
|
186
|
+
* @brief: 将16位字节数组转换为数字(与numTo16Bits相反功能)
|
|
187
|
+
* @param {[number, number]} bytes 长度为2的字节数组
|
|
188
|
+
* @param {Endianness} endian 字节序(默认小端)
|
|
189
|
+
* @return {*} 转换后的数字
|
|
190
|
+
********************************************************************************/
|
|
191
|
+
declare const bits16ToNum: (bytes: [number, number], endian?: Endianness) => number;
|
|
192
|
+
/********************************************************************************
|
|
193
|
+
* @brief: 将数字转换为ASCII码值数组(每个数字转换为其对应的ASCII码)
|
|
194
|
+
* @param {number} n 待转换的数字(自动取绝对值)
|
|
195
|
+
* @return {*} ASCII码值数组(每个元素为0-255的整数)
|
|
196
|
+
********************************************************************************/
|
|
197
|
+
declare const numToAsciiArr: (n: number) => number[];
|
|
198
|
+
/********************************************************************************
|
|
199
|
+
* @brief: 将ASCII码值数组转换为对应的数字
|
|
200
|
+
* @param {number[]} ascii
|
|
201
|
+
* @return {*}
|
|
202
|
+
********************************************************************************/
|
|
203
|
+
declare const asciiArrToNum: (ascii: number[]) => number;
|
|
204
|
+
|
|
205
|
+
/********************************************************************************
|
|
206
|
+
* @brief: 解析颜色字符串(支持 rgb/rgba/hsv/hsl 格式)
|
|
207
|
+
* @param {string} str 待解析的颜色字符串(如 "hsl(120, 100%, 50%)"、"hsla(240, 50%, 70%, 0.8)")
|
|
208
|
+
* @return {*} 解析后的颜色对象,不匹配任何格式时返回 null
|
|
209
|
+
********************************************************************************/
|
|
210
|
+
declare function parseColorString(str: string): ParsedColor | null;
|
|
211
|
+
/********************************************************************************
|
|
212
|
+
* @brief: HSL 转 RGB 颜色转换
|
|
213
|
+
* @param {ParsedColor} hsl HSL 颜色对象(分量范围 0-255)
|
|
214
|
+
* @return {*} RGB 颜色对象(分量范围 0-255)
|
|
215
|
+
********************************************************************************/
|
|
216
|
+
declare function hslToRgb(hsl: ParsedHSL | ParsedHSLA | null): ParsedColor | null;
|
|
217
|
+
/********************************************************************************
|
|
218
|
+
* @brief: RGB 转 HSL 颜色转换
|
|
219
|
+
* @param {ParsedColor} rgb RGB 颜色对象(分量范围 0-255)
|
|
220
|
+
* @return {*} HSL 颜色对象(h:0-360, s:0-1, l:0-1)
|
|
221
|
+
********************************************************************************/
|
|
222
|
+
declare function rgbToHsl(rgb: ParsedRGB | ParsedRGBA | null): ParsedColor | null;
|
|
223
|
+
/********************************************************************************
|
|
224
|
+
* @brief: HSV 转 HSL 颜色转换
|
|
225
|
+
* @param {ParsedColor} hsv HSV 颜色对象(分量范围 0-255)
|
|
226
|
+
* @return {*} HSL 颜色对象(h:0-360, s:0-1, l:0-1)
|
|
227
|
+
********************************************************************************/
|
|
228
|
+
declare function hsvToHsl(hsv: ParsedHSV): ParsedColor;
|
|
229
|
+
/********************************************************************************
|
|
230
|
+
* @brief: HSL 转 HSV 颜色转换
|
|
231
|
+
* @param {ParsedColor} hsl HSL 颜色对象(分量范围 0-255)
|
|
232
|
+
* @return {*} HSV 颜色对象(h:0-360, s:0-1, v:0-1)
|
|
233
|
+
********************************************************************************/
|
|
234
|
+
declare function hslToHsv(hsl: ParsedHSL): ParsedColor;
|
|
235
|
+
|
|
236
|
+
export { Endianness, type Hex, type ParsedColor, type ParsedHSL, type ParsedHSLA, type ParsedHSV, type ParsedRGB, type ParsedRGBA, type Result, asciiArrToNum, bits16ToNum, bytesToNum, compressJsonGzip, decompressJsonGzip, errorResult, getHIDCodeMapStr, getHIDCodeMapStrNum, hidKeyCode, hslToHsv, hslToRgb, hsvToHsl, isImageValid, isShowPopover, numToAsciiArr, numToBits16, numToBytes, parseColorString, rgbToHsl, successResult };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var p=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var T=(r,e)=>{for(var n in e)p(r,n,{get:e[n],enumerable:!0})},F=(r,e,n,d)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of M(e))!E.call(r,s)&&s!==n&&p(r,s,{get:()=>e[s],enumerable:!(d=S(e,s))||d.enumerable});return r};var A=r=>F(p({},"__esModule",{value:!0}),r);var Q={};T(Q,{Endianness:()=>w,asciiArrToNum:()=>J,bits16ToNum:()=>$,bytesToNum:()=>N,compressJsonGzip:()=>B,decompressJsonGzip:()=>C,errorResult:()=>G,getHIDCodeMapStr:()=>P,getHIDCodeMapStrNum:()=>L,hidKeyCode:()=>g,hslToHsv:()=>_,hslToRgb:()=>j,hsvToHsl:()=>W,isImageValid:()=>I,isShowPopover:()=>R,numToAsciiArr:()=>z,numToBits16:()=>U,numToBytes:()=>D,parseColorString:()=>V,rgbToHsl:()=>O,successResult:()=>H});module.exports=A(Q);var g=[{key:0,word:"a",dec:"4",hex:"04",kind:1,value:4,aliases:["A"]},{key:2,word:"b",dec:"5",hex:"05",kind:1,value:5,aliases:["B"]},{key:4,word:"c",dec:"6",hex:"06",kind:1,value:6,aliases:["C"]},{key:6,word:"d",dec:"7",hex:"07",kind:1,value:7,aliases:["D"]},{key:8,word:"e",dec:"8",hex:"08",kind:1,value:8,aliases:["E"]},{key:10,word:"f",dec:"9",hex:"09",kind:1,value:9,aliases:["F"]},{key:12,word:"g",dec:"10",hex:"0A",kind:1,value:10,aliases:["G"]},{key:14,word:"h",dec:"11",hex:"0B",kind:1,value:11,aliases:["H"]},{key:16,word:"i",dec:"12",hex:"0C",kind:1,value:12,aliases:["I"]},{key:18,word:"j",dec:"13",hex:"0D",kind:1,value:13,aliases:["J"]},{key:20,word:"k",dec:"14",hex:"0E",kind:1,value:14,aliases:["K"]},{key:22,word:"l",dec:"15",hex:"0F",kind:1,value:15,aliases:["L"]},{key:24,word:"m",dec:"16",hex:"10",kind:1,value:16,aliases:["M"]},{key:26,word:"n",dec:"17",hex:"11",kind:1,value:17,aliases:["N"]},{key:28,word:"o",dec:"18",hex:"12",kind:1,value:18,aliases:["O"]},{key:30,word:"p",dec:"19",hex:"13",kind:1,value:19,aliases:["P"]},{key:32,word:"q",dec:"20",hex:"14",kind:1,value:20,aliases:["Q"]},{key:34,word:"r",dec:"21",hex:"15",kind:1,value:21,aliases:["R"]},{key:36,word:"s",dec:"22",hex:"16",kind:1,value:22,aliases:["S"]},{key:38,word:"t",dec:"23",hex:"17",kind:1,value:23,aliases:["T"]},{key:40,word:"u",dec:"24",hex:"18",kind:1,value:24,aliases:["U"]},{key:42,word:"v",dec:"25",hex:"19",kind:1,value:25,aliases:["V"]},{key:44,word:"w",dec:"26",hex:"1A",kind:1,value:26,aliases:["W"]},{key:46,word:"x",dec:"27",hex:"1B",kind:1,value:27,aliases:["X"]},{key:48,word:"y",dec:"28",hex:"1C",kind:1,value:28,aliases:["Y"]},{key:50,word:"z",dec:"29",hex:"1D",kind:1,value:29,aliases:["Z"]},{key:52,word:"1",dec:"30",hex:"1E",kind:1,value:30,aliases:["!","1!"]},{key:54,word:"2",dec:"31",hex:"1F",kind:1,value:31,aliases:["@","2@"]},{key:56,word:"3",dec:"32",hex:"20",kind:1,value:32,aliases:["#","3#"]},{key:58,word:"4",dec:"33",hex:"21",kind:1,value:33,aliases:["$","4$"]},{key:60,word:"5",dec:"34",hex:"22",kind:1,value:34,aliases:["%","5%"]},{key:62,word:"6",dec:"35",hex:"23",kind:1,value:35,aliases:["^","6^"]},{key:64,word:"7",dec:"36",hex:"24",kind:1,value:36,aliases:["&","7&"]},{key:66,word:"8",dec:"37",hex:"25",kind:1,value:37,aliases:["*","8*"]},{key:68,word:"9",dec:"38",hex:"26",kind:1,value:38,aliases:["(","9("]},{key:70,word:"0",dec:"39",hex:"27",kind:1,value:39,aliases:[")","0)"]},{key:77,word:"-",dec:"45",hex:"2D",kind:1,value:45,aliases:["_","-_"]},{key:79,word:"=",dec:"46",hex:"2E",kind:1,value:46,aliases:["+","=+"]},{key:81,word:"[",dec:"47",hex:"2F",kind:1,value:47,aliases:["{","[{"]},{key:83,word:"]",dec:"48",hex:"30",kind:1,value:48,aliases:["}","}]"]},{key:85,word:"\\",dec:"49",hex:"31",kind:1,value:49,aliases:["|","\\|"]},{key:87,word:"`",dec:"50",hex:"32",kind:1,value:50,aliases:["~","`~"]},{key:89,word:";",dec:"51",hex:"33",kind:1,value:51,aliases:[":",";:"]},{key:91,word:"'",dec:"52",hex:"34",kind:1,value:52,aliases:['"',`'"`]},{key:95,word:",",dec:"54",hex:"36",kind:1,value:54,aliases:["<",",<"]},{key:97,word:".",dec:"55",hex:"37",kind:1,value:55,aliases:[">",".>"]},{key:99,word:"/",dec:"56",hex:"38",kind:1,value:56,aliases:["?","/?"]},{key:72,word:"Enter",dec:"40",hex:"28",kind:1,value:40},{key:73,word:"Escape",dec:"41",hex:"29",kind:1,value:41},{key:74,word:"Backspace",dec:"42",hex:"2A",kind:1,value:42},{key:75,word:"Tab",dec:"43",hex:"2B",kind:1,value:43},{key:76,word:" ",dec:"44",hex:"2C",kind:1,value:44},{key:101,word:"CapsLock",dec:"57",hex:"39",kind:1,value:57},{key:102,word:"F1",dec:"58",hex:"3A",kind:1,value:58},{key:103,word:"F2",dec:"59",hex:"3B",kind:1,value:59},{key:104,word:"F3",dec:"60",hex:"3C",kind:1,value:60},{key:105,word:"F4",dec:"61",hex:"3D",kind:1,value:61},{key:106,word:"F5",dec:"62",hex:"3E",kind:1,value:62},{key:107,word:"F6",dec:"63",hex:"3F",kind:1,value:63},{key:108,word:"F7",dec:"64",hex:"40",kind:1,value:64},{key:109,word:"F8",dec:"65",hex:"41",kind:1,value:65},{key:110,word:"F9",dec:"66",hex:"42",kind:1,value:66},{key:111,word:"F10",dec:"67",hex:"43",kind:1,value:67},{key:112,word:"F11",dec:"68",hex:"44",kind:1,value:68},{key:113,word:"F12",dec:"69",hex:"45",kind:1,value:69},{key:114,word:"PrintScreen",dec:"70",hex:"46",kind:1,value:70},{key:115,word:"ScrollLock",dec:"71",hex:"47",kind:1,value:71},{key:116,word:"Pause",dec:"72",hex:"48",kind:1,value:72},{key:117,word:"Insert",dec:"73",hex:"49",kind:1,value:73},{key:118,word:"Home",dec:"74",hex:"4A",kind:1,value:74},{key:119,word:"PageUp",dec:"75",hex:"4B",kind:1,value:75},{key:120,word:"DeleteForward",dec:"76",hex:"4C",kind:1,value:76},{key:121,word:"End",dec:"77",hex:"4D",kind:1,value:77},{key:122,word:"PageDown",dec:"78",hex:"4E",kind:1,value:78},{key:123,word:"ArrowRight",dec:"79",hex:"4F",kind:1,value:79},{key:124,word:"ArrowLeft",dec:"80",hex:"50",kind:1,value:80},{key:125,word:"ArrowDown",dec:"81",hex:"51",kind:1,value:81},{key:126,word:"ArrowUp",dec:"82",hex:"52",kind:1,value:82},{key:127,word:"NumLock",dec:"83",hex:"53",kind:1,value:83},{key:128,word:"Clear",dec:"83",hex:"53",kind:1,value:83},{key:160,word:"F13",dec:"104",hex:"68",kind:0,value:104},{key:161,word:"F14",dec:"105",hex:"69",kind:0,value:105},{key:162,word:"F15",dec:"106",hex:"6A",kind:0,value:106},{key:163,word:"F16",dec:"107",hex:"6B",kind:0,value:107},{key:164,word:"LeftControl",dec:"224",hex:"E0",kind:0,value:224},{key:165,word:"LeftShift",dec:"225",hex:"E1",kind:0,value:225},{key:166,word:"LeftAlt",dec:"226",hex:"E2",kind:0,value:226},{key:167,word:"LeftGUI",dec:"227",hex:"E3",kind:0,value:227},{key:168,word:"RightControl",dec:"228",hex:"E4",kind:0,value:228},{key:169,word:"RightShift",dec:"229",hex:"E5",kind:0,value:229},{key:170,word:"RightAlt",dec:"230",hex:"E6",kind:0,value:230},{key:171,word:"RightGUI",dec:"231",hex:"E7",kind:0,value:231}],P=()=>g.reduce((r,e)=>(r.set(e.word,e),e.aliases&&e.aliases.length>0&&e.aliases.forEach(n=>{r.set(n,e)}),r),new Map),L=()=>g.reduce((r,e)=>r.set(e.value,e),new Map);var m=require("fflate"),B=r=>{let e=JSON.stringify(r),n=new TextEncoder().encode(e),d=new Uint8Array((0,m.gzipSync)(n));return new Blob([d],{type:"application/gzip"})},C=async r=>{let e=await r.arrayBuffer(),n=(0,m.gunzipSync)(new Uint8Array(e)),d=new TextDecoder().decode(n);return JSON.parse(d)};function R(r){let e=document.getElementById(r);return e&&window.getComputedStyle(e).display!=="none"&&e.getAttribute("aria-hidden")!=="true"}function I(r){return new Promise(e=>{let n=new Image;n.src=typeof r=="string"?r:URL.createObjectURL(r),n.onload=()=>e(!0),n.onerror=()=>e(!1)})}function H(r=null,e="",n=0){return{success:!0,code:n,message:e,data:r}}function G(r,e=-1,n=null){return{success:!1,code:e,message:r,data:n}}var w={LITTLE:"little",BIG:"big"},D=(r,e,n=w.BIG)=>{if(!Number.isInteger(e)||e<=0)throw new Error("Byte count must be a positive integer.");let d=r>>>0,s=new Array(e);for(let a=0;a<e;a++){let o=n===w.LITTLE?a*8:(e-1-a)*8;s[a]=d>>o&255}return s},N=(r,e=w.BIG)=>{let n=0;if(e===w.LITTLE)for(let d=0;d<r.length;d++)n|=(r[d]&255)<<d*8;else for(let d=0;d<r.length;d++)n|=(r[d]&255)<<(r.length-1-d)*8;return n},U=(r,e=w.BIG)=>{let n=r&65535;return e===w.LITTLE?[n&255,n>>8&255]:[n>>8&255,n&255]},$=(r,e=w.BIG)=>{if(r.length!==2)throw new Error("Input array must have exactly 2 elements");return e===w.LITTLE?r[1]<<8|r[0]:r[0]<<8|r[1]},z=r=>Math.abs(r).toString().split("").map(e=>e.charCodeAt(0)),J=r=>Number(String.fromCharCode(...r));var i=(r,e,n)=>Math.min(Math.max(r,e),n);function V(r){let e=t=>{let u=t.endsWith("%"),c=parseFloat(t.replace("%",""));return u?Math.round(i(c/100,0,1)*255):i(Math.round(c),0,255)},n=t=>{let u=t.endsWith("%"),c=parseFloat(t.replace("%",""));return i(u?c/100:c,0,1)},d=t=>{if(!t.endsWith("%"))return 0;let u=parseFloat(t.replace("%",""));return i(u/100,0,1)},s=/^rgb\(\s*(\d+(\.\d+)?%?)\s*,\s*(\d+(\.\d+)?%?)\s*,\s*(\d+(\.\d+)?%?)\s*\)$/i,a=r.match(s);if(a){let[,t,,u,,c]=a;return{type:"rgb",r:e(t),g:e(u),b:e(c)}}let o=/^rgba\(\s*(\d+(\.\d+)?%?)\s*,\s*(\d+(\.\d+)?%?)\s*,\s*(\d+(\.\d+)?%?)\s*,\s*(\d+(\.\d+)?%?)\s*\)$/i,h=r.match(o);if(h){let[,t,,u,,c,,f]=h;return{type:"rgba",r:e(t),g:e(u),b:e(c),a:n(f)}}let x=/^hsv\(\s*(\d+(\.\d+)?)\s*,\s*(\d+(\.\d+)?%)\s*,\s*(\d+(\.\d+)?%)\s*\)$/i,l=r.match(x);if(l){let[,t,,u,,c]=l;return{type:"hsv",h:i(parseFloat(t),0,360),s:d(u),v:d(c)}}let y=/^hsl\(\s*(\d+(\.\d+)?)\s*,\s*(\d+(\.\d+)?%)\s*,\s*(\d+(\.\d+)?%)\s*\)$/i,v=r.match(y);if(v){let[,t,,u,,c]=v;return{type:"hsl",h:i(parseFloat(t),0,360),s:d(u),l:d(c)}}let k=/^hsla\(\s*(\d+(\.\d+)?)\s*,\s*(\d+(\.\d+)?%)\s*,\s*(\d+(\.\d+)?%)\s*,\s*(\d+(\.\d+)?%?)\s*\)$/i,b=r.match(k);if(b){let[,t,,u,,c,,f]=b;return{type:"hsla",h:i(parseFloat(t),0,360),s:d(u),l:d(c),a:n(f)}}return null}function j(r){let e=i(r.h,0,360)/360,n=i(r.s,0,1),d=i(r.l,0,1),s=0,a=0,o=0;if(n===0)s=a=o=d;else{let h=(y,v,k)=>(k<0&&(k+=1),k>1&&(k-=1),k<.16666666666666666?y+(v-y)*6*k:k<.5?v:k<.6666666666666666?y+(v-y)*(.6666666666666666-k)*6:y),x=d<.5?d*(1+n):d+n-d*n,l=2*d-x;s=h(l,x,e+1/3),a=h(l,x,e),o=h(l,x,e-1/3)}return{type:"rgb",r:Math.round(s*255),g:Math.round(a*255),b:Math.round(o*255)}}function O(r){let e=i(r.r,0,255)/255,n=i(r.g,0,255)/255,d=i(r.b,0,255)/255,s=Math.max(e,n,d),a=Math.min(e,n,d),o=s-a,h=(s+a)/2,x=0;o!==0&&(x=o/(1-Math.abs(2*h-1)));let l=0;if(o!==0){switch(s){case e:l=(n-d)/o%6;break;case n:l=(d-e)/o+2;break;case d:l=(e-n)/o+4;break}l=Math.round(l*60),l<0&&(l+=360)}return{type:"hsl",h:i(l,0,360),s:i(x,0,1),l:i(h,0,1)}}function W(r){let{h:e,s:n,v:d}=r,s;n===0?s=d:s=(2-n)*d/2,s=Math.max(0,Math.min(1,s));let a;return s===0||s===1?a=0:(a=n*d/(1-Math.abs(2*s-1)),a=Math.max(0,Math.min(1,a))),{type:"hsl",h:Math.max(0,Math.min(360,e)),s:a,l:s}}function _(r){let{h:e,s:n,l:d}=r,s=d+n*Math.min(d,1-d),a=Math.max(0,Math.min(1,s)),o;return a===0?o=0:(o=2*(1-d/a),o=Math.max(0,Math.min(1,o))),{type:"hsv",h:Math.max(0,Math.min(360,e)),s:o,v:a}}0&&(module.exports={Endianness,asciiArrToNum,bits16ToNum,bytesToNum,compressJsonGzip,decompressJsonGzip,errorResult,getHIDCodeMapStr,getHIDCodeMapStrNum,hidKeyCode,hslToHsv,hslToRgb,hsvToHsl,isImageValid,isShowPopover,numToAsciiArr,numToBits16,numToBytes,parseColorString,rgbToHsl,successResult});
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/hidKeyCode.ts","../src/utils/gzip.ts","../src/utils/usual.ts","../src/utils/result.ts","../src/utils/data.ts","../src/utils/color.ts"],"sourcesContent":["export * from './utils/interface/result.types'\r\nexport * from './utils/interface/color.types'\r\nexport * from './utils/hidKeyCode'\r\nexport * from './utils/gzip'\r\nexport * from './utils/usual'\r\nexport * from './utils/result'\r\nexport * from './utils/data'\r\nexport * from './utils/color'\r\n","// 类型定义\ninterface HIDKey {\n key: number\n word: string\n dec: string\n hex: string\n kind: number\n value: number\n aliases?: string[] // 可选别名数组\n}\n\nexport const hidKeyCode = [\n // 字母键(合并大小写,无组合形式)\n {\n key: 0,\n word: 'a',\n dec: '4',\n hex: '04',\n kind: 1,\n value: 4,\n aliases: ['A'],\n },\n {\n key: 2,\n word: 'b',\n dec: '5',\n hex: '05',\n kind: 1,\n value: 5,\n aliases: ['B'],\n },\n {\n key: 4,\n word: 'c',\n dec: '6',\n hex: '06',\n kind: 1,\n value: 6,\n aliases: ['C'],\n },\n {\n key: 6,\n word: 'd',\n dec: '7',\n hex: '07',\n kind: 1,\n value: 7,\n aliases: ['D'],\n },\n {\n key: 8,\n word: 'e',\n dec: '8',\n hex: '08',\n kind: 1,\n value: 8,\n aliases: ['E'],\n },\n {\n key: 10,\n word: 'f',\n dec: '9',\n hex: '09',\n kind: 1,\n value: 9,\n aliases: ['F'],\n },\n {\n key: 12,\n word: 'g',\n dec: '10',\n hex: '0A',\n kind: 1,\n value: 10,\n aliases: ['G'],\n },\n {\n key: 14,\n word: 'h',\n dec: '11',\n hex: '0B',\n kind: 1,\n value: 11,\n aliases: ['H'],\n },\n {\n key: 16,\n word: 'i',\n dec: '12',\n hex: '0C',\n kind: 1,\n value: 12,\n aliases: ['I'],\n },\n {\n key: 18,\n word: 'j',\n dec: '13',\n hex: '0D',\n kind: 1,\n value: 13,\n aliases: ['J'],\n },\n {\n key: 20,\n word: 'k',\n dec: '14',\n hex: '0E',\n kind: 1,\n value: 14,\n aliases: ['K'],\n },\n {\n key: 22,\n word: 'l',\n dec: '15',\n hex: '0F',\n kind: 1,\n value: 15,\n aliases: ['L'],\n },\n {\n key: 24,\n word: 'm',\n dec: '16',\n hex: '10',\n kind: 1,\n value: 16,\n aliases: ['M'],\n },\n {\n key: 26,\n word: 'n',\n dec: '17',\n hex: '11',\n kind: 1,\n value: 17,\n aliases: ['N'],\n },\n {\n key: 28,\n word: 'o',\n dec: '18',\n hex: '12',\n kind: 1,\n value: 18,\n aliases: ['O'],\n },\n {\n key: 30,\n word: 'p',\n dec: '19',\n hex: '13',\n kind: 1,\n value: 19,\n aliases: ['P'],\n },\n {\n key: 32,\n word: 'q',\n dec: '20',\n hex: '14',\n kind: 1,\n value: 20,\n aliases: ['Q'],\n },\n {\n key: 34,\n word: 'r',\n dec: '21',\n hex: '15',\n kind: 1,\n value: 21,\n aliases: ['R'],\n },\n {\n key: 36,\n word: 's',\n dec: '22',\n hex: '16',\n kind: 1,\n value: 22,\n aliases: ['S'],\n },\n {\n key: 38,\n word: 't',\n dec: '23',\n hex: '17',\n kind: 1,\n value: 23,\n aliases: ['T'],\n },\n {\n key: 40,\n word: 'u',\n dec: '24',\n hex: '18',\n kind: 1,\n value: 24,\n aliases: ['U'],\n },\n {\n key: 42,\n word: 'v',\n dec: '25',\n hex: '19',\n kind: 1,\n value: 25,\n aliases: ['V'],\n },\n {\n key: 44,\n word: 'w',\n dec: '26',\n hex: '1A',\n kind: 1,\n value: 26,\n aliases: ['W'],\n },\n {\n key: 46,\n word: 'x',\n dec: '27',\n hex: '1B',\n kind: 1,\n value: 27,\n aliases: ['X'],\n },\n {\n key: 48,\n word: 'y',\n dec: '28',\n hex: '1C',\n kind: 1,\n value: 28,\n aliases: ['Y'],\n },\n {\n key: 50,\n word: 'z',\n dec: '29',\n hex: '1D',\n kind: 1,\n value: 29,\n aliases: ['Z'],\n },\n\n // 数字和符号键(添加组合形式别名)\n {\n key: 52,\n word: '1',\n dec: '30',\n hex: '1E',\n kind: 1,\n value: 30,\n aliases: ['!', '1!'],\n },\n {\n key: 54,\n word: '2',\n dec: '31',\n hex: '1F',\n kind: 1,\n value: 31,\n aliases: ['@', '2@'],\n },\n {\n key: 56,\n word: '3',\n dec: '32',\n hex: '20',\n kind: 1,\n value: 32,\n aliases: ['#', '3#'],\n },\n {\n key: 58,\n word: '4',\n dec: '33',\n hex: '21',\n kind: 1,\n value: 33,\n aliases: ['$', '4$'],\n },\n {\n key: 60,\n word: '5',\n dec: '34',\n hex: '22',\n kind: 1,\n value: 34,\n aliases: ['%', '5%'],\n },\n {\n key: 62,\n word: '6',\n dec: '35',\n hex: '23',\n kind: 1,\n value: 35,\n aliases: ['^', '6^'],\n },\n {\n key: 64,\n word: '7',\n dec: '36',\n hex: '24',\n kind: 1,\n value: 36,\n aliases: ['&', '7&'],\n },\n {\n key: 66,\n word: '8',\n dec: '37',\n hex: '25',\n kind: 1,\n value: 37,\n aliases: ['*', '8*'],\n },\n {\n key: 68,\n word: '9',\n dec: '38',\n hex: '26',\n kind: 1,\n value: 38,\n aliases: ['(', '9('],\n },\n {\n key: 70,\n word: '0',\n dec: '39',\n hex: '27',\n kind: 1,\n value: 39,\n aliases: [')', '0)'],\n },\n {\n key: 77,\n word: '-',\n dec: '45',\n hex: '2D',\n kind: 1,\n value: 45,\n aliases: ['_', '-_'],\n },\n {\n key: 79,\n word: '=',\n dec: '46',\n hex: '2E',\n kind: 1,\n value: 46,\n aliases: ['+', '=+'],\n },\n {\n key: 81,\n word: '[',\n dec: '47',\n hex: '2F',\n kind: 1,\n value: 47,\n aliases: ['{', '[{'],\n },\n {\n key: 83,\n word: ']',\n dec: '48',\n hex: '30',\n kind: 1,\n value: 48,\n aliases: ['}', '}]'],\n },\n {\n key: 85,\n word: '\\\\',\n dec: '49',\n hex: '31',\n kind: 1,\n value: 49,\n aliases: ['|', '\\\\|'],\n },\n {\n key: 87,\n word: '`',\n dec: '50',\n hex: '32',\n kind: 1,\n value: 50,\n aliases: ['~', '`~'],\n },\n {\n key: 89,\n word: ';',\n dec: '51',\n hex: '33',\n kind: 1,\n value: 51,\n aliases: [':', ';:'],\n },\n {\n key: 91,\n word: \"'\",\n dec: '52',\n hex: '34',\n kind: 1,\n value: 52,\n aliases: ['\"', '\\'\"'],\n },\n {\n key: 95,\n word: ',',\n dec: '54',\n hex: '36',\n kind: 1,\n value: 54,\n aliases: ['<', ',<'],\n },\n {\n key: 97,\n word: '.',\n dec: '55',\n hex: '37',\n kind: 1,\n value: 55,\n aliases: ['>', '.>'],\n },\n {\n key: 99,\n word: '/',\n dec: '56',\n hex: '38',\n kind: 1,\n value: 56,\n aliases: ['?', '/?'],\n },\n\n // 特殊功能键(无重复,保持原样)\n { key: 72, word: 'Enter', dec: '40', hex: '28', kind: 1, value: 40 },\n { key: 73, word: 'Escape', dec: '41', hex: '29', kind: 1, value: 41 },\n { key: 74, word: 'Backspace', dec: '42', hex: '2A', kind: 1, value: 42 },\n { key: 75, word: 'Tab', dec: '43', hex: '2B', kind: 1, value: 43 },\n { key: 76, word: ' ', dec: '44', hex: '2C', kind: 1, value: 44 },\n { key: 101, word: 'CapsLock', dec: '57', hex: '39', kind: 1, value: 57 },\n { key: 102, word: 'F1', dec: '58', hex: '3A', kind: 1, value: 58 },\n { key: 103, word: 'F2', dec: '59', hex: '3B', kind: 1, value: 59 },\n { key: 104, word: 'F3', dec: '60', hex: '3C', kind: 1, value: 60 },\n { key: 105, word: 'F4', dec: '61', hex: '3D', kind: 1, value: 61 },\n { key: 106, word: 'F5', dec: '62', hex: '3E', kind: 1, value: 62 },\n { key: 107, word: 'F6', dec: '63', hex: '3F', kind: 1, value: 63 },\n { key: 108, word: 'F7', dec: '64', hex: '40', kind: 1, value: 64 },\n { key: 109, word: 'F8', dec: '65', hex: '41', kind: 1, value: 65 },\n { key: 110, word: 'F9', dec: '66', hex: '42', kind: 1, value: 66 },\n { key: 111, word: 'F10', dec: '67', hex: '43', kind: 1, value: 67 },\n { key: 112, word: 'F11', dec: '68', hex: '44', kind: 1, value: 68 },\n { key: 113, word: 'F12', dec: '69', hex: '45', kind: 1, value: 69 },\n { key: 114, word: 'PrintScreen', dec: '70', hex: '46', kind: 1, value: 70 },\n { key: 115, word: 'ScrollLock', dec: '71', hex: '47', kind: 1, value: 71 },\n { key: 116, word: 'Pause', dec: '72', hex: '48', kind: 1, value: 72 },\n { key: 117, word: 'Insert', dec: '73', hex: '49', kind: 1, value: 73 },\n { key: 118, word: 'Home', dec: '74', hex: '4A', kind: 1, value: 74 },\n { key: 119, word: 'PageUp', dec: '75', hex: '4B', kind: 1, value: 75 },\n { key: 120, word: 'DeleteForward', dec: '76', hex: '4C', kind: 1, value: 76 },\n { key: 121, word: 'End', dec: '77', hex: '4D', kind: 1, value: 77 },\n { key: 122, word: 'PageDown', dec: '78', hex: '4E', kind: 1, value: 78 },\n { key: 123, word: 'ArrowRight', dec: '79', hex: '4F', kind: 1, value: 79 },\n { key: 124, word: 'ArrowLeft', dec: '80', hex: '50', kind: 1, value: 80 },\n { key: 125, word: 'ArrowDown', dec: '81', hex: '51', kind: 1, value: 81 },\n { key: 126, word: 'ArrowUp', dec: '82', hex: '52', kind: 1, value: 82 },\n { key: 127, word: 'NumLock', dec: '83', hex: '53', kind: 1, value: 83 },\n { key: 128, word: 'Clear', dec: '83', hex: '53', kind: 1, value: 83 },\n { key: 160, word: 'F13', dec: '104', hex: '68', kind: 0, value: 104 },\n { key: 161, word: 'F14', dec: '105', hex: '69', kind: 0, value: 105 },\n { key: 162, word: 'F15', dec: '106', hex: '6A', kind: 0, value: 106 },\n { key: 163, word: 'F16', dec: '107', hex: '6B', kind: 0, value: 107 },\n { key: 164, word: 'LeftControl', dec: '224', hex: 'E0', kind: 0, value: 224 },\n { key: 165, word: 'LeftShift', dec: '225', hex: 'E1', kind: 0, value: 225 },\n { key: 166, word: 'LeftAlt', dec: '226', hex: 'E2', kind: 0, value: 226 },\n { key: 167, word: 'LeftGUI', dec: '227', hex: 'E3', kind: 0, value: 227 },\n {\n key: 168,\n word: 'RightControl',\n dec: '228',\n hex: 'E4',\n kind: 0,\n value: 228,\n },\n { key: 169, word: 'RightShift', dec: '229', hex: 'E5', kind: 0, value: 229 },\n { key: 170, word: 'RightAlt', dec: '230', hex: 'E6', kind: 0, value: 230 },\n { key: 171, word: 'RightGUI', dec: '231', hex: 'E7', kind: 0, value: 231 },\n]\n\n/********************************************************************************\n * @brief: 获取 HID 键码映射(主键名 + 别名)\n * @return {*}\n ********************************************************************************/\nexport const getHIDCodeMapStr = () => {\n return hidKeyCode.reduce((map, curKey) => {\n // 主键名映射\n map.set(curKey.word, curKey)\n\n // 别名映射(包含组合形式)\n if (curKey.aliases && curKey.aliases.length > 0) {\n curKey.aliases.forEach(alias => {\n map.set(alias, curKey)\n })\n }\n\n return map\n }, new Map<string, (typeof hidKeyCode)[0]>())\n}\n\n/********************************************************************************\n * @brief: 获取 HID 键码映射(value 映射)\n * @return {*}\n ********************************************************************************/\nexport const getHIDCodeMapStrNum = () => {\n return hidKeyCode.reduce(\n (pre, cur) => pre.set(cur.value, cur),\n new Map<number, (typeof hidKeyCode)[0]>()\n )\n}\n","import { gzipSync, gunzipSync } from 'fflate'\r\n\r\n/********************************************************************************\r\n * @brief: gzip 压缩 JSON 数据(转成 Blob,适合导出)\r\n * @param {any} data\r\n * @return {*}\r\n ********************************************************************************/\r\nexport const compressJsonGzip = (data: any): Blob => {\r\n // 1. 紧凑 JSON\r\n const jsonStr = JSON.stringify(data)\r\n // 2. 转 Uint8Array\r\n const uint8Array = new TextEncoder().encode(jsonStr)\r\n // 关键:显式转成 Uint8Array<ArrayBuffer>\r\n const compressedArray = new Uint8Array(gzipSync(uint8Array))\r\n // 4. 转 Blob\r\n return new Blob([compressedArray], { type: 'application/gzip' })\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 解压 gzip 格式的 JSON 文件\r\n * @param {File} file\r\n * @return {*}\r\n ********************************************************************************/\r\nexport const decompressJsonGzip = async (file: File): Promise<any> => {\r\n // 1. 读取文件\r\n const arrayBuffer = await file.arrayBuffer()\r\n // 2. gzip 解压(同步)\r\n const decompressedArray = gunzipSync(new Uint8Array(arrayBuffer))\r\n // 3. 转字符串并解析 JSON\r\n const jsonStr = new TextDecoder().decode(decompressedArray)\r\n return JSON.parse(jsonStr)\r\n}\r\n","\r\n/********************************************************************************\r\n * @brief: 判断 popover 是否显示\r\n * @param {string} popId\r\n * @return {*}\r\n ********************************************************************************/\r\nexport function isShowPopover(popId: string) {\r\n const box = document.getElementById(popId) // 1. 先拿元素\r\n const isShow =\r\n box &&\r\n window.getComputedStyle(box).display !== 'none' &&\r\n box.getAttribute('aria-hidden') !== 'true'\r\n return isShow\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 判断图片是否有效\r\n * @param {string} src\r\n * @return {*}\r\n ********************************************************************************/\r\nexport function isImageValid(src: string | File) {\r\n return new Promise(resolve => {\r\n const img = new Image()\r\n img.src = typeof src === 'string' ? src : URL.createObjectURL(src)\r\n img.onload = () => resolve(true)\r\n img.onerror = () => resolve(false)\r\n })\r\n}\r\n","import type { Result } from './interface/result.types'\r\n\r\n/********************************************************************************\r\n * @brief: 创建成功的结果对象\r\n * @param {T} data 业务数据(可选,默认 null)\r\n * @param {string} message 成功信息(可选,默认空字符串)\r\n * @param {number} code 成功状态码(可选,默认 0)\r\n * @return {*} 成功的 Result 对象\r\n ********************************************************************************/\r\nexport function successResult<T = unknown>(\r\n data: T = null as unknown as T,\r\n message: string = '',\r\n code: number = 0,\r\n): Result<T> {\r\n return {\r\n success: true,\r\n code,\r\n message,\r\n data,\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 创建失败的结果对象\r\n * @param {string} message 错误信息(必选)\r\n * @param {number} code 错误码(可选,默认 -1)\r\n * @param {T} data 错误相关数据(可选,默认 null)\r\n * @return {*} 失败的 Result 对象\r\n ********************************************************************************/\r\nexport function errorResult<T = unknown>(\r\n message: string,\r\n code: number = -1,\r\n data: T = null as unknown as T,\r\n): Result<T> {\r\n return {\r\n success: false,\r\n code,\r\n message,\r\n data,\r\n }\r\n}\r\n","/********************************************************************************\r\n * @brief: 字节序枚举(大端/小端)\r\n * @return {*}\r\n ********************************************************************************/\r\nexport const Endianness = {\r\n LITTLE: 'little', // 小端(低字节在前)\r\n BIG: 'big', // 大端(高字节在前)\r\n}\r\n\r\nexport type Endianness = (typeof Endianness)[keyof typeof Endianness]\r\n\r\n/********************************************************************************\r\n * @brief: 将数字转换为指定字节序的字节数组\r\n * @param {number} number 待转换的数字(自动截断为无符号整数)\r\n * @param {number} byteCount 目标字节长度(必须为正整数)\r\n * @param {Endianness} endian 字节序(默认小端)\r\n * @return {*} 字节数组(每个元素为 0-255 的整数)\r\n ********************************************************************************/\r\nexport const numToBytes = (\r\n number: number,\r\n byteCount: number,\r\n endian: Endianness = Endianness.BIG,\r\n): number[] => {\r\n if (!Number.isInteger(byteCount) || byteCount <= 0) {\r\n throw new Error('Byte count must be a positive integer.')\r\n }\r\n\r\n const unsignedNum = number >>> 0 // 转为无符号整数\r\n const byteArray: number[] = new Array(byteCount)\r\n\r\n for (let i = 0; i < byteCount; i++) {\r\n // 根据字节序计算位移:小端用 i*8,大端用 (byteCount-1 - i)*8\r\n const shift = endian === Endianness.LITTLE ? i * 8 : (byteCount - 1 - i) * 8\r\n byteArray[i] = (unsignedNum >> shift) & 0xff\r\n }\r\n\r\n return byteArray\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 将任意长度的字节数组转换为数字(支持不同字节序)\r\n * @param {number[]} bytes 字节数组\r\n * @param {Endianness} endian 字节序(默认小端)\r\n * @return {*} 转换后的数字\r\n ********************************************************************************/\r\nexport const bytesToNum = (\r\n bytes: number[],\r\n endian: Endianness = Endianness.BIG,\r\n): number => {\r\n let result = 0\r\n\r\n if (endian === Endianness.LITTLE) {\r\n // 小端:从低位到高位\r\n for (let i = 0; i < bytes.length; i++) {\r\n // 根据字节序计算位移:小端用 i*8,大端用 (byteCount-1 - i)*8\r\n result |= (bytes[i] & 0xff) << (i * 8)\r\n }\r\n } else {\r\n // 大端:从高位到低位\r\n for (let i = 0; i < bytes.length; i++) {\r\n result |= (bytes[i] & 0xff) << ((bytes.length - 1 - i) * 8)\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 将数字转换为16位无符号整数的指定字节序字节数组(固定2字节)\r\n * @param {number} number 待转换的数字(自动截断为16位无符号整数范围)\r\n * @param {Endianness} endian 字节序(默认小端)\r\n * @return {*} 长度为2的字节数组\r\n ********************************************************************************/\r\nexport const numToBits16 = (\r\n number: number,\r\n endian: Endianness = Endianness.BIG,\r\n): [number, number] => {\r\n const uint16 = number & 0xffff // 截断为16位无符号整数\r\n\r\n if (endian === Endianness.LITTLE) {\r\n return [uint16 & 0xff, (uint16 >> 8) & 0xff] // 小端:[低8位, 高8位]\r\n } else {\r\n return [(uint16 >> 8) & 0xff, uint16 & 0xff] // 大端:[高8位, 低8位]\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 将16位字节数组转换为数字(与numTo16Bits相反功能)\r\n * @param {[number, number]} bytes 长度为2的字节数组\r\n * @param {Endianness} endian 字节序(默认小端)\r\n * @return {*} 转换后的数字\r\n ********************************************************************************/\r\nexport const bits16ToNum = (\r\n bytes: [number, number],\r\n endian: Endianness = Endianness.BIG,\r\n): number => {\r\n if (bytes.length !== 2) {\r\n throw new Error('Input array must have exactly 2 elements')\r\n }\r\n\r\n if (endian === Endianness.LITTLE) {\r\n // 小端:[低8位, 高8位]\r\n return (bytes[1] << 8) | bytes[0]\r\n } else {\r\n // 大端:[高8位, 低8位]\r\n return (bytes[0] << 8) | bytes[1]\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 将数字转换为ASCII码值数组(每个数字转换为其对应的ASCII码)\r\n * @param {number} n 待转换的数字(自动取绝对值)\r\n * @return {*} ASCII码值数组(每个元素为0-255的整数)\r\n ********************************************************************************/\r\nexport const numToAsciiArr = (n: number): number[] => {\r\n return Math.abs(n) // 去符号\r\n .toString() // 变成 \"12345\"\r\n .split('') // [\"1\",\"2\",\"3\",\"4\",\"5\"]\r\n .map(c => c.charCodeAt(0)) // [49,50,51,52,53]\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 将ASCII码值数组转换为对应的数字\r\n * @param {number[]} ascii\r\n * @return {*}\r\n ********************************************************************************/\r\nexport const asciiArrToNum = (ascii: number[]): number => {\r\n return Number(String.fromCharCode(...ascii))\r\n}\r\n","import type {\r\n ParsedColor,\r\n ParsedHSL,\r\n ParsedHSLA,\r\n ParsedRGB,\r\n ParsedRGBA,\r\n ParsedHSV,\r\n} from './interface/color.types'\r\n\r\n/********************************************************************************\r\n * @brief: 限制数值在指定范围内\r\n * @param {number} value\r\n * @param {number} min\r\n * @param {number} max\r\n * @return {*}\r\n ********************************************************************************/\r\nconst clamp = (value: number, min: number, max: number): number => {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 解析颜色字符串(支持 rgb/rgba/hsv/hsl 格式)\r\n * @param {string} str 待解析的颜色字符串(如 \"hsl(120, 100%, 50%)\"、\"hsla(240, 50%, 70%, 0.8)\")\r\n * @return {*} 解析后的颜色对象,不匹配任何格式时返回 null\r\n ********************************************************************************/\r\nexport function parseColorString(str: string): ParsedColor | null {\r\n /********************************************************************************\r\n * @brief: 工具函数:将百分比/数字转换为 0-255 的 RGB 分量\r\n * @param {string} valueStr\r\n * @return {*}\r\n ********************************************************************************/\r\n const toRgbComponent = (valueStr: string): number => {\r\n const isPercent = valueStr.endsWith('%')\r\n const value = parseFloat(valueStr.replace('%', ''))\r\n\r\n if (isPercent) {\r\n // 百分比转换(0%-100% → 0-255)\r\n return Math.round(clamp(value / 100, 0, 1) * 255)\r\n } else {\r\n // 直接数字(0-255)\r\n return clamp(Math.round(value), 0, 255)\r\n }\r\n }\r\n\r\n /********************************************************************************\r\n * @brief: 工具函数:将百分比/数字转换为 0-1 的 Alpha 分量\r\n * @param {string} valueStr\r\n * @return {*}\r\n ********************************************************************************/\r\n const toAlphaComponent = (valueStr: string): number => {\r\n const isPercent = valueStr.endsWith('%')\r\n const value = parseFloat(valueStr.replace('%', ''))\r\n\r\n if (isPercent) {\r\n return clamp(value / 100, 0, 1)\r\n } else {\r\n return clamp(value, 0, 1)\r\n }\r\n }\r\n\r\n /********************************************************************************\r\n * @brief: 工具函数:将百分比转换为 0-1 的 HSV/HSL 分量(饱和度/明度/亮度)\r\n * @param {string} valueStr\r\n * @return {*}\r\n ********************************************************************************/\r\n const toPercentComponent = (valueStr: string): number => {\r\n if (!valueStr.endsWith('%')) return 0 // 无效格式默认0\r\n const value = parseFloat(valueStr.replace('%', ''))\r\n return clamp(value / 100, 0, 1)\r\n }\r\n\r\n // 1. 匹配 rgb(...) 格式\r\n const rgbRegex =\r\n /^rgb\\(\\s*(\\d+(\\.\\d+)?%?)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*\\)$/i\r\n const rgbMatch = str.match(rgbRegex)\r\n if (rgbMatch) {\r\n const [, rStr, , gStr, , bStr] = rgbMatch\r\n return {\r\n type: 'rgb',\r\n r: toRgbComponent(rStr),\r\n g: toRgbComponent(gStr),\r\n b: toRgbComponent(bStr),\r\n }\r\n }\r\n\r\n // 2. 匹配 rgba(...) 格式\r\n const rgbaRegex =\r\n /^rgba\\(\\s*(\\d+(\\.\\d+)?%?)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*\\)$/i\r\n const rgbaMatch = str.match(rgbaRegex)\r\n if (rgbaMatch) {\r\n const [, rStr, , gStr, , bStr, , aStr] = rgbaMatch\r\n return {\r\n type: 'rgba',\r\n r: toRgbComponent(rStr),\r\n g: toRgbComponent(gStr),\r\n b: toRgbComponent(bStr),\r\n a: toAlphaComponent(aStr),\r\n }\r\n }\r\n\r\n // 3. 匹配 hsv(...) 格式\r\n const hsvRegex =\r\n /^hsv\\(\\s*(\\d+(\\.\\d+)?)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*\\)$/i\r\n const hsvMatch = str.match(hsvRegex)\r\n if (hsvMatch) {\r\n const [, hStr, , sStr, , vStr] = hsvMatch\r\n return {\r\n type: 'hsv',\r\n h: clamp(parseFloat(hStr), 0, 360),\r\n s: toPercentComponent(sStr),\r\n v: toPercentComponent(vStr),\r\n }\r\n }\r\n\r\n // 4. 匹配 hsl(...) 格式(新增)\r\n const hslRegex =\r\n /^hsl\\(\\s*(\\d+(\\.\\d+)?)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*\\)$/i\r\n const hslMatch = str.match(hslRegex)\r\n if (hslMatch) {\r\n const [, hStr, , sStr, , lStr] = hslMatch\r\n return {\r\n type: 'hsl',\r\n h: clamp(parseFloat(hStr), 0, 360), // 色相 0-360\r\n s: toPercentComponent(sStr), // 饱和度 0-1\r\n l: toPercentComponent(lStr), // 明度 0-1\r\n }\r\n }\r\n\r\n // 5. 匹配 hsla(...) 格式(带透明度,新增)\r\n const hslaRegex =\r\n /^hsla\\(\\s*(\\d+(\\.\\d+)?)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*\\)$/i\r\n const hslaMatch = str.match(hslaRegex)\r\n if (hslaMatch) {\r\n const [, hStr, , sStr, , lStr, , aStr] = hslaMatch\r\n return {\r\n type: 'hsla',\r\n h: clamp(parseFloat(hStr), 0, 360),\r\n s: toPercentComponent(sStr),\r\n l: toPercentComponent(lStr),\r\n a: toAlphaComponent(aStr), // 透明度 0-1\r\n }\r\n }\r\n\r\n // 不匹配任何格式\r\n return null\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: HSL 转 RGB 颜色转换\r\n * @param {ParsedColor} hsl HSL 颜色对象(分量范围 0-255)\r\n * @return {*} RGB 颜色对象(分量范围 0-255)\r\n ********************************************************************************/\r\nexport function hslToRgb(\r\n hsl: ParsedHSL | ParsedHSLA | null,\r\n): ParsedColor | null {\r\n // 输入边界处理\r\n const h = clamp(hsl.h, 0, 360) / 360 // 归一化色相到 0-1\r\n const s = clamp(hsl.s, 0, 1)\r\n const l = clamp(hsl.l, 0, 1)\r\n\r\n let r = 0,\r\n g = 0,\r\n b = 0\r\n\r\n if (s === 0) {\r\n // 无饱和度(灰度)\r\n r = g = b = l\r\n } else {\r\n // 辅助函数:计算颜色分量\r\n const hue2rgb = (p: number, q: number, t: number): number => {\r\n if (t < 0) t += 1\r\n if (t > 1) t -= 1\r\n if (t < 1 / 6) return p + (q - p) * 6 * t\r\n if (t < 1 / 2) return q\r\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\r\n return p\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\r\n const p = 2 * l - q\r\n\r\n r = hue2rgb(p, q, h + 1 / 3)\r\n g = hue2rgb(p, q, h)\r\n b = hue2rgb(p, q, h - 1 / 3)\r\n }\r\n\r\n // 转换为 0-255 范围并取整\r\n return {\r\n type: 'rgb',\r\n r: Math.round(r * 255),\r\n g: Math.round(g * 255),\r\n b: Math.round(b * 255),\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: RGB 转 HSL 颜色转换\r\n * @param {ParsedColor} rgb RGB 颜色对象(分量范围 0-255)\r\n * @return {*} HSL 颜色对象(h:0-360, s:0-1, l:0-1)\r\n ********************************************************************************/\r\nexport function rgbToHsl(\r\n rgb: ParsedRGB | ParsedRGBA | null,\r\n): ParsedColor | null {\r\n // 1. 输入处理:将 RGB 分量归一化到 0-1 范围\r\n const r = clamp(rgb.r, 0, 255) / 255\r\n const g = clamp(rgb.g, 0, 255) / 255\r\n const b = clamp(rgb.b, 0, 255) / 255\r\n\r\n // 2. 计算最大/最小分量值\r\n const max = Math.max(r, g, b)\r\n const min = Math.min(r, g, b)\r\n const delta = max - min // 颜色范围(用于计算饱和度)\r\n\r\n // 3. 计算明度(Lightness)\r\n const l = (max + min) / 2\r\n\r\n // 4. 计算饱和度(Saturation)\r\n let s = 0\r\n if (delta !== 0) {\r\n // 饱和度公式:根据明度调整计算方式\r\n s = delta / (1 - Math.abs(2 * l - 1))\r\n }\r\n\r\n // 5. 计算色相(Hue)\r\n let h = 0\r\n if (delta !== 0) {\r\n switch (max) {\r\n case r:\r\n // 红色为最大分量时,色相基于 g - b 计算\r\n h = ((g - b) / delta) % 6\r\n break\r\n case g:\r\n // 绿色为最大分量时,色相基于 b - r 计算\r\n h = (b - r) / delta + 2\r\n break\r\n case b:\r\n // 蓝色为最大分量时,色相基于 r - g 计算\r\n h = (r - g) / delta + 4\r\n break\r\n }\r\n // 转换为 0-360 度(若为负数则加 360 确保在正数范围)\r\n h = Math.round(h * 60)\r\n if (h < 0) h += 360\r\n }\r\n\r\n // 6. 输出处理:确保饱和度和明度在 0-1 范围内\r\n return {\r\n type: 'hsl',\r\n h: clamp(h, 0, 360),\r\n s: clamp(s, 0, 1),\r\n l: clamp(l, 0, 1),\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: HSV 转 HSL 颜色转换\r\n * @param {ParsedColor} hsv HSV 颜色对象(分量范围 0-255)\r\n * @return {*} HSL 颜色对象(h:0-360, s:0-1, l:0-1)\r\n ********************************************************************************/\r\nexport function hsvToHsl(hsv: ParsedHSV): ParsedColor {\r\n const { h, s: sHsv, v } = hsv\r\n\r\n // 计算HSL的亮度(L)\r\n let l: number\r\n if (sHsv === 0) {\r\n // 饱和度为0时,亮度等于明度(灰度)\r\n l = v\r\n } else {\r\n l = ((2 - sHsv) * v) / 2\r\n }\r\n // 确保亮度在0-1范围内\r\n l = Math.max(0, Math.min(1, l))\r\n\r\n // 计算HSL的饱和度(S)\r\n let s: number\r\n if (l === 0 || l === 1) {\r\n // 纯黑或纯白时饱和度为0\r\n s = 0\r\n } else {\r\n s = (sHsv * v) / (1 - Math.abs(2 * l - 1))\r\n // 确保饱和度在0-1范围内\r\n s = Math.max(0, Math.min(1, s))\r\n }\r\n\r\n return {\r\n type: 'hsl',\r\n h: Math.max(0, Math.min(360, h)), // 确保色相在0-360范围内\r\n s,\r\n l,\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: HSL 转 HSV 颜色转换\r\n * @param {ParsedColor} hsl HSL 颜色对象(分量范围 0-255)\r\n * @return {*} HSV 颜色对象(h:0-360, s:0-1, v:0-1)\r\n ********************************************************************************/\r\nexport function hslToHsv(hsl: ParsedHSL): ParsedColor {\r\n const { h, s: sHsl, l } = hsl\r\n\r\n // 计算HSV的明度(V)\r\n const v = l + sHsl * Math.min(l, 1 - l)\r\n // 确保明度在0-1范围内\r\n const clampedV = Math.max(0, Math.min(1, v))\r\n\r\n // 计算HSV的饱和度(S)\r\n let s: number\r\n if (clampedV === 0) {\r\n // 明度为0时饱和度为0(纯黑)\r\n s = 0\r\n } else {\r\n s = 2 * (1 - l / clampedV)\r\n // 确保饱和度在0-1范围内\r\n s = Math.max(0, Math.min(1, s))\r\n }\r\n\r\n return {\r\n type: 'hsv',\r\n h: Math.max(0, Math.min(360, h)), // 确保色相在0-360范围内\r\n s,\r\n v: clampedV,\r\n }\r\n}\r\n"],"mappings":"4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,EAAA,kBAAAC,EAAA,gBAAAC,EAAA,eAAAC,EAAA,qBAAAC,EAAA,uBAAAC,EAAA,gBAAAC,EAAA,qBAAAC,EAAA,wBAAAC,EAAA,eAAAC,EAAA,aAAAC,EAAA,aAAAC,EAAA,aAAAC,EAAA,iBAAAC,EAAA,kBAAAC,EAAA,kBAAAC,EAAA,gBAAAC,EAAA,eAAAC,EAAA,qBAAAC,EAAA,aAAAC,EAAA,kBAAAC,IAAA,eAAAC,EAAAvB,GCWO,IAAMwB,EAAa,CAExB,CACE,IAAK,EACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,EACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,EACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,EACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,EACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EAGA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,I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","names":["index_exports","__export","Endianness","asciiArrToNum","bits16ToNum","bytesToNum","compressJsonGzip","decompressJsonGzip","errorResult","getHIDCodeMapStr","getHIDCodeMapStrNum","hidKeyCode","hslToHsv","hslToRgb","hsvToHsl","isImageValid","isShowPopover","numToAsciiArr","numToBits16","numToBytes","parseColorString","rgbToHsl","successResult","__toCommonJS","hidKeyCode","getHIDCodeMapStr","map","curKey","alias","getHIDCodeMapStrNum","pre","cur","import_fflate","compressJsonGzip","data","jsonStr","uint8Array","compressedArray","decompressJsonGzip","file","arrayBuffer","decompressedArray","isShowPopover","popId","box","isImageValid","src","resolve","img","successResult","data","message","code","errorResult","Endianness","numToBytes","number","byteCount","endian","unsignedNum","byteArray","i","shift","bytesToNum","bytes","result","numToBits16","uint16","bits16ToNum","numToAsciiArr","n","c","asciiArrToNum","ascii","clamp","value","min","max","parseColorString","str","toRgbComponent","valueStr","isPercent","toAlphaComponent","toPercentComponent","rgbRegex","rgbMatch","rStr","gStr","bStr","rgbaRegex","rgbaMatch","aStr","hsvRegex","hsvMatch","hStr","sStr","vStr","hslRegex","hslMatch","lStr","hslaRegex","hslaMatch","hslToRgb","hsl","h","s","l","r","g","b","hue2rgb","p","q","t","rgbToHsl","rgb","delta","hsvToHsl","hsv","sHsv","v","hslToHsv","sHsl","clampedV"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var p=[{key:0,word:"a",dec:"4",hex:"04",kind:1,value:4,aliases:["A"]},{key:2,word:"b",dec:"5",hex:"05",kind:1,value:5,aliases:["B"]},{key:4,word:"c",dec:"6",hex:"06",kind:1,value:6,aliases:["C"]},{key:6,word:"d",dec:"7",hex:"07",kind:1,value:7,aliases:["D"]},{key:8,word:"e",dec:"8",hex:"08",kind:1,value:8,aliases:["E"]},{key:10,word:"f",dec:"9",hex:"09",kind:1,value:9,aliases:["F"]},{key:12,word:"g",dec:"10",hex:"0A",kind:1,value:10,aliases:["G"]},{key:14,word:"h",dec:"11",hex:"0B",kind:1,value:11,aliases:["H"]},{key:16,word:"i",dec:"12",hex:"0C",kind:1,value:12,aliases:["I"]},{key:18,word:"j",dec:"13",hex:"0D",kind:1,value:13,aliases:["J"]},{key:20,word:"k",dec:"14",hex:"0E",kind:1,value:14,aliases:["K"]},{key:22,word:"l",dec:"15",hex:"0F",kind:1,value:15,aliases:["L"]},{key:24,word:"m",dec:"16",hex:"10",kind:1,value:16,aliases:["M"]},{key:26,word:"n",dec:"17",hex:"11",kind:1,value:17,aliases:["N"]},{key:28,word:"o",dec:"18",hex:"12",kind:1,value:18,aliases:["O"]},{key:30,word:"p",dec:"19",hex:"13",kind:1,value:19,aliases:["P"]},{key:32,word:"q",dec:"20",hex:"14",kind:1,value:20,aliases:["Q"]},{key:34,word:"r",dec:"21",hex:"15",kind:1,value:21,aliases:["R"]},{key:36,word:"s",dec:"22",hex:"16",kind:1,value:22,aliases:["S"]},{key:38,word:"t",dec:"23",hex:"17",kind:1,value:23,aliases:["T"]},{key:40,word:"u",dec:"24",hex:"18",kind:1,value:24,aliases:["U"]},{key:42,word:"v",dec:"25",hex:"19",kind:1,value:25,aliases:["V"]},{key:44,word:"w",dec:"26",hex:"1A",kind:1,value:26,aliases:["W"]},{key:46,word:"x",dec:"27",hex:"1B",kind:1,value:27,aliases:["X"]},{key:48,word:"y",dec:"28",hex:"1C",kind:1,value:28,aliases:["Y"]},{key:50,word:"z",dec:"29",hex:"1D",kind:1,value:29,aliases:["Z"]},{key:52,word:"1",dec:"30",hex:"1E",kind:1,value:30,aliases:["!","1!"]},{key:54,word:"2",dec:"31",hex:"1F",kind:1,value:31,aliases:["@","2@"]},{key:56,word:"3",dec:"32",hex:"20",kind:1,value:32,aliases:["#","3#"]},{key:58,word:"4",dec:"33",hex:"21",kind:1,value:33,aliases:["$","4$"]},{key:60,word:"5",dec:"34",hex:"22",kind:1,value:34,aliases:["%","5%"]},{key:62,word:"6",dec:"35",hex:"23",kind:1,value:35,aliases:["^","6^"]},{key:64,word:"7",dec:"36",hex:"24",kind:1,value:36,aliases:["&","7&"]},{key:66,word:"8",dec:"37",hex:"25",kind:1,value:37,aliases:["*","8*"]},{key:68,word:"9",dec:"38",hex:"26",kind:1,value:38,aliases:["(","9("]},{key:70,word:"0",dec:"39",hex:"27",kind:1,value:39,aliases:[")","0)"]},{key:77,word:"-",dec:"45",hex:"2D",kind:1,value:45,aliases:["_","-_"]},{key:79,word:"=",dec:"46",hex:"2E",kind:1,value:46,aliases:["+","=+"]},{key:81,word:"[",dec:"47",hex:"2F",kind:1,value:47,aliases:["{","[{"]},{key:83,word:"]",dec:"48",hex:"30",kind:1,value:48,aliases:["}","}]"]},{key:85,word:"\\",dec:"49",hex:"31",kind:1,value:49,aliases:["|","\\|"]},{key:87,word:"`",dec:"50",hex:"32",kind:1,value:50,aliases:["~","`~"]},{key:89,word:";",dec:"51",hex:"33",kind:1,value:51,aliases:[":",";:"]},{key:91,word:"'",dec:"52",hex:"34",kind:1,value:52,aliases:['"',`'"`]},{key:95,word:",",dec:"54",hex:"36",kind:1,value:54,aliases:["<",",<"]},{key:97,word:".",dec:"55",hex:"37",kind:1,value:55,aliases:[">",".>"]},{key:99,word:"/",dec:"56",hex:"38",kind:1,value:56,aliases:["?","/?"]},{key:72,word:"Enter",dec:"40",hex:"28",kind:1,value:40},{key:73,word:"Escape",dec:"41",hex:"29",kind:1,value:41},{key:74,word:"Backspace",dec:"42",hex:"2A",kind:1,value:42},{key:75,word:"Tab",dec:"43",hex:"2B",kind:1,value:43},{key:76,word:" ",dec:"44",hex:"2C",kind:1,value:44},{key:101,word:"CapsLock",dec:"57",hex:"39",kind:1,value:57},{key:102,word:"F1",dec:"58",hex:"3A",kind:1,value:58},{key:103,word:"F2",dec:"59",hex:"3B",kind:1,value:59},{key:104,word:"F3",dec:"60",hex:"3C",kind:1,value:60},{key:105,word:"F4",dec:"61",hex:"3D",kind:1,value:61},{key:106,word:"F5",dec:"62",hex:"3E",kind:1,value:62},{key:107,word:"F6",dec:"63",hex:"3F",kind:1,value:63},{key:108,word:"F7",dec:"64",hex:"40",kind:1,value:64},{key:109,word:"F8",dec:"65",hex:"41",kind:1,value:65},{key:110,word:"F9",dec:"66",hex:"42",kind:1,value:66},{key:111,word:"F10",dec:"67",hex:"43",kind:1,value:67},{key:112,word:"F11",dec:"68",hex:"44",kind:1,value:68},{key:113,word:"F12",dec:"69",hex:"45",kind:1,value:69},{key:114,word:"PrintScreen",dec:"70",hex:"46",kind:1,value:70},{key:115,word:"ScrollLock",dec:"71",hex:"47",kind:1,value:71},{key:116,word:"Pause",dec:"72",hex:"48",kind:1,value:72},{key:117,word:"Insert",dec:"73",hex:"49",kind:1,value:73},{key:118,word:"Home",dec:"74",hex:"4A",kind:1,value:74},{key:119,word:"PageUp",dec:"75",hex:"4B",kind:1,value:75},{key:120,word:"DeleteForward",dec:"76",hex:"4C",kind:1,value:76},{key:121,word:"End",dec:"77",hex:"4D",kind:1,value:77},{key:122,word:"PageDown",dec:"78",hex:"4E",kind:1,value:78},{key:123,word:"ArrowRight",dec:"79",hex:"4F",kind:1,value:79},{key:124,word:"ArrowLeft",dec:"80",hex:"50",kind:1,value:80},{key:125,word:"ArrowDown",dec:"81",hex:"51",kind:1,value:81},{key:126,word:"ArrowUp",dec:"82",hex:"52",kind:1,value:82},{key:127,word:"NumLock",dec:"83",hex:"53",kind:1,value:83},{key:128,word:"Clear",dec:"83",hex:"53",kind:1,value:83},{key:160,word:"F13",dec:"104",hex:"68",kind:0,value:104},{key:161,word:"F14",dec:"105",hex:"69",kind:0,value:105},{key:162,word:"F15",dec:"106",hex:"6A",kind:0,value:106},{key:163,word:"F16",dec:"107",hex:"6B",kind:0,value:107},{key:164,word:"LeftControl",dec:"224",hex:"E0",kind:0,value:224},{key:165,word:"LeftShift",dec:"225",hex:"E1",kind:0,value:225},{key:166,word:"LeftAlt",dec:"226",hex:"E2",kind:0,value:226},{key:167,word:"LeftGUI",dec:"227",hex:"E3",kind:0,value:227},{key:168,word:"RightControl",dec:"228",hex:"E4",kind:0,value:228},{key:169,word:"RightShift",dec:"229",hex:"E5",kind:0,value:229},{key:170,word:"RightAlt",dec:"230",hex:"E6",kind:0,value:230},{key:171,word:"RightGUI",dec:"231",hex:"E7",kind:0,value:231}],S=()=>p.reduce((r,e)=>(r.set(e.word,e),e.aliases&&e.aliases.length>0&&e.aliases.forEach(n=>{r.set(n,e)}),r),new Map),M=()=>p.reduce((r,e)=>r.set(e.value,e),new Map);import{gzipSync as g,gunzipSync as b}from"fflate";var F=r=>{let e=JSON.stringify(r),n=new TextEncoder().encode(e),d=new Uint8Array(g(n));return new Blob([d],{type:"application/gzip"})},A=async r=>{let e=await r.arrayBuffer(),n=b(new Uint8Array(e)),d=new TextDecoder().decode(n);return JSON.parse(d)};function L(r){let e=document.getElementById(r);return e&&window.getComputedStyle(e).display!=="none"&&e.getAttribute("aria-hidden")!=="true"}function B(r){return new Promise(e=>{let n=new Image;n.src=typeof r=="string"?r:URL.createObjectURL(r),n.onload=()=>e(!0),n.onerror=()=>e(!1)})}function R(r=null,e="",n=0){return{success:!0,code:n,message:e,data:r}}function I(r,e=-1,n=null){return{success:!1,code:e,message:r,data:n}}var w={LITTLE:"little",BIG:"big"},G=(r,e,n=w.BIG)=>{if(!Number.isInteger(e)||e<=0)throw new Error("Byte count must be a positive integer.");let d=r>>>0,a=new Array(e);for(let s=0;s<e;s++){let o=n===w.LITTLE?s*8:(e-1-s)*8;a[s]=d>>o&255}return a},D=(r,e=w.BIG)=>{let n=0;if(e===w.LITTLE)for(let d=0;d<r.length;d++)n|=(r[d]&255)<<d*8;else for(let d=0;d<r.length;d++)n|=(r[d]&255)<<(r.length-1-d)*8;return n},N=(r,e=w.BIG)=>{let n=r&65535;return e===w.LITTLE?[n&255,n>>8&255]:[n>>8&255,n&255]},U=(r,e=w.BIG)=>{if(r.length!==2)throw new Error("Input array must have exactly 2 elements");return e===w.LITTLE?r[1]<<8|r[0]:r[0]<<8|r[1]},$=r=>Math.abs(r).toString().split("").map(e=>e.charCodeAt(0)),z=r=>Number(String.fromCharCode(...r));var i=(r,e,n)=>Math.min(Math.max(r,e),n);function V(r){let e=t=>{let u=t.endsWith("%"),c=parseFloat(t.replace("%",""));return u?Math.round(i(c/100,0,1)*255):i(Math.round(c),0,255)},n=t=>{let u=t.endsWith("%"),c=parseFloat(t.replace("%",""));return i(u?c/100:c,0,1)},d=t=>{if(!t.endsWith("%"))return 0;let u=parseFloat(t.replace("%",""));return i(u/100,0,1)},a=/^rgb\(\s*(\d+(\.\d+)?%?)\s*,\s*(\d+(\.\d+)?%?)\s*,\s*(\d+(\.\d+)?%?)\s*\)$/i,s=r.match(a);if(s){let[,t,,u,,c]=s;return{type:"rgb",r:e(t),g:e(u),b:e(c)}}let o=/^rgba\(\s*(\d+(\.\d+)?%?)\s*,\s*(\d+(\.\d+)?%?)\s*,\s*(\d+(\.\d+)?%?)\s*,\s*(\d+(\.\d+)?%?)\s*\)$/i,h=r.match(o);if(h){let[,t,,u,,c,,m]=h;return{type:"rgba",r:e(t),g:e(u),b:e(c),a:n(m)}}let x=/^hsv\(\s*(\d+(\.\d+)?)\s*,\s*(\d+(\.\d+)?%)\s*,\s*(\d+(\.\d+)?%)\s*\)$/i,l=r.match(x);if(l){let[,t,,u,,c]=l;return{type:"hsv",h:i(parseFloat(t),0,360),s:d(u),v:d(c)}}let y=/^hsl\(\s*(\d+(\.\d+)?)\s*,\s*(\d+(\.\d+)?%)\s*,\s*(\d+(\.\d+)?%)\s*\)$/i,v=r.match(y);if(v){let[,t,,u,,c]=v;return{type:"hsl",h:i(parseFloat(t),0,360),s:d(u),l:d(c)}}let k=/^hsla\(\s*(\d+(\.\d+)?)\s*,\s*(\d+(\.\d+)?%)\s*,\s*(\d+(\.\d+)?%)\s*,\s*(\d+(\.\d+)?%?)\s*\)$/i,f=r.match(k);if(f){let[,t,,u,,c,,m]=f;return{type:"hsla",h:i(parseFloat(t),0,360),s:d(u),l:d(c),a:n(m)}}return null}function j(r){let e=i(r.h,0,360)/360,n=i(r.s,0,1),d=i(r.l,0,1),a=0,s=0,o=0;if(n===0)a=s=o=d;else{let h=(y,v,k)=>(k<0&&(k+=1),k>1&&(k-=1),k<.16666666666666666?y+(v-y)*6*k:k<.5?v:k<.6666666666666666?y+(v-y)*(.6666666666666666-k)*6:y),x=d<.5?d*(1+n):d+n-d*n,l=2*d-x;a=h(l,x,e+1/3),s=h(l,x,e),o=h(l,x,e-1/3)}return{type:"rgb",r:Math.round(a*255),g:Math.round(s*255),b:Math.round(o*255)}}function O(r){let e=i(r.r,0,255)/255,n=i(r.g,0,255)/255,d=i(r.b,0,255)/255,a=Math.max(e,n,d),s=Math.min(e,n,d),o=a-s,h=(a+s)/2,x=0;o!==0&&(x=o/(1-Math.abs(2*h-1)));let l=0;if(o!==0){switch(a){case e:l=(n-d)/o%6;break;case n:l=(d-e)/o+2;break;case d:l=(e-n)/o+4;break}l=Math.round(l*60),l<0&&(l+=360)}return{type:"hsl",h:i(l,0,360),s:i(x,0,1),l:i(h,0,1)}}function W(r){let{h:e,s:n,v:d}=r,a;n===0?a=d:a=(2-n)*d/2,a=Math.max(0,Math.min(1,a));let s;return a===0||a===1?s=0:(s=n*d/(1-Math.abs(2*a-1)),s=Math.max(0,Math.min(1,s))),{type:"hsl",h:Math.max(0,Math.min(360,e)),s,l:a}}function _(r){let{h:e,s:n,l:d}=r,a=d+n*Math.min(d,1-d),s=Math.max(0,Math.min(1,a)),o;return s===0?o=0:(o=2*(1-d/s),o=Math.max(0,Math.min(1,o))),{type:"hsv",h:Math.max(0,Math.min(360,e)),s:o,v:s}}export{w as Endianness,z as asciiArrToNum,U as bits16ToNum,D as bytesToNum,F as compressJsonGzip,A as decompressJsonGzip,I as errorResult,S as getHIDCodeMapStr,M as getHIDCodeMapStrNum,p as hidKeyCode,_ as hslToHsv,j as hslToRgb,W as hsvToHsl,B as isImageValid,L as isShowPopover,$ as numToAsciiArr,N as numToBits16,G as numToBytes,V as parseColorString,O as rgbToHsl,R as successResult};
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/hidKeyCode.ts","../src/utils/gzip.ts","../src/utils/usual.ts","../src/utils/result.ts","../src/utils/data.ts","../src/utils/color.ts"],"sourcesContent":["// 类型定义\ninterface HIDKey {\n key: number\n word: string\n dec: string\n hex: string\n kind: number\n value: number\n aliases?: string[] // 可选别名数组\n}\n\nexport const hidKeyCode = [\n // 字母键(合并大小写,无组合形式)\n {\n key: 0,\n word: 'a',\n dec: '4',\n hex: '04',\n kind: 1,\n value: 4,\n aliases: ['A'],\n },\n {\n key: 2,\n word: 'b',\n dec: '5',\n hex: '05',\n kind: 1,\n value: 5,\n aliases: ['B'],\n },\n {\n key: 4,\n word: 'c',\n dec: '6',\n hex: '06',\n kind: 1,\n value: 6,\n aliases: ['C'],\n },\n {\n key: 6,\n word: 'd',\n dec: '7',\n hex: '07',\n kind: 1,\n value: 7,\n aliases: ['D'],\n },\n {\n key: 8,\n word: 'e',\n dec: '8',\n hex: '08',\n kind: 1,\n value: 8,\n aliases: ['E'],\n },\n {\n key: 10,\n word: 'f',\n dec: '9',\n hex: '09',\n kind: 1,\n value: 9,\n aliases: ['F'],\n },\n {\n key: 12,\n word: 'g',\n dec: '10',\n hex: '0A',\n kind: 1,\n value: 10,\n aliases: ['G'],\n },\n {\n key: 14,\n word: 'h',\n dec: '11',\n hex: '0B',\n kind: 1,\n value: 11,\n aliases: ['H'],\n },\n {\n key: 16,\n word: 'i',\n dec: '12',\n hex: '0C',\n kind: 1,\n value: 12,\n aliases: ['I'],\n },\n {\n key: 18,\n word: 'j',\n dec: '13',\n hex: '0D',\n kind: 1,\n value: 13,\n aliases: ['J'],\n },\n {\n key: 20,\n word: 'k',\n dec: '14',\n hex: '0E',\n kind: 1,\n value: 14,\n aliases: ['K'],\n },\n {\n key: 22,\n word: 'l',\n dec: '15',\n hex: '0F',\n kind: 1,\n value: 15,\n aliases: ['L'],\n },\n {\n key: 24,\n word: 'm',\n dec: '16',\n hex: '10',\n kind: 1,\n value: 16,\n aliases: ['M'],\n },\n {\n key: 26,\n word: 'n',\n dec: '17',\n hex: '11',\n kind: 1,\n value: 17,\n aliases: ['N'],\n },\n {\n key: 28,\n word: 'o',\n dec: '18',\n hex: '12',\n kind: 1,\n value: 18,\n aliases: ['O'],\n },\n {\n key: 30,\n word: 'p',\n dec: '19',\n hex: '13',\n kind: 1,\n value: 19,\n aliases: ['P'],\n },\n {\n key: 32,\n word: 'q',\n dec: '20',\n hex: '14',\n kind: 1,\n value: 20,\n aliases: ['Q'],\n },\n {\n key: 34,\n word: 'r',\n dec: '21',\n hex: '15',\n kind: 1,\n value: 21,\n aliases: ['R'],\n },\n {\n key: 36,\n word: 's',\n dec: '22',\n hex: '16',\n kind: 1,\n value: 22,\n aliases: ['S'],\n },\n {\n key: 38,\n word: 't',\n dec: '23',\n hex: '17',\n kind: 1,\n value: 23,\n aliases: ['T'],\n },\n {\n key: 40,\n word: 'u',\n dec: '24',\n hex: '18',\n kind: 1,\n value: 24,\n aliases: ['U'],\n },\n {\n key: 42,\n word: 'v',\n dec: '25',\n hex: '19',\n kind: 1,\n value: 25,\n aliases: ['V'],\n },\n {\n key: 44,\n word: 'w',\n dec: '26',\n hex: '1A',\n kind: 1,\n value: 26,\n aliases: ['W'],\n },\n {\n key: 46,\n word: 'x',\n dec: '27',\n hex: '1B',\n kind: 1,\n value: 27,\n aliases: ['X'],\n },\n {\n key: 48,\n word: 'y',\n dec: '28',\n hex: '1C',\n kind: 1,\n value: 28,\n aliases: ['Y'],\n },\n {\n key: 50,\n word: 'z',\n dec: '29',\n hex: '1D',\n kind: 1,\n value: 29,\n aliases: ['Z'],\n },\n\n // 数字和符号键(添加组合形式别名)\n {\n key: 52,\n word: '1',\n dec: '30',\n hex: '1E',\n kind: 1,\n value: 30,\n aliases: ['!', '1!'],\n },\n {\n key: 54,\n word: '2',\n dec: '31',\n hex: '1F',\n kind: 1,\n value: 31,\n aliases: ['@', '2@'],\n },\n {\n key: 56,\n word: '3',\n dec: '32',\n hex: '20',\n kind: 1,\n value: 32,\n aliases: ['#', '3#'],\n },\n {\n key: 58,\n word: '4',\n dec: '33',\n hex: '21',\n kind: 1,\n value: 33,\n aliases: ['$', '4$'],\n },\n {\n key: 60,\n word: '5',\n dec: '34',\n hex: '22',\n kind: 1,\n value: 34,\n aliases: ['%', '5%'],\n },\n {\n key: 62,\n word: '6',\n dec: '35',\n hex: '23',\n kind: 1,\n value: 35,\n aliases: ['^', '6^'],\n },\n {\n key: 64,\n word: '7',\n dec: '36',\n hex: '24',\n kind: 1,\n value: 36,\n aliases: ['&', '7&'],\n },\n {\n key: 66,\n word: '8',\n dec: '37',\n hex: '25',\n kind: 1,\n value: 37,\n aliases: ['*', '8*'],\n },\n {\n key: 68,\n word: '9',\n dec: '38',\n hex: '26',\n kind: 1,\n value: 38,\n aliases: ['(', '9('],\n },\n {\n key: 70,\n word: '0',\n dec: '39',\n hex: '27',\n kind: 1,\n value: 39,\n aliases: [')', '0)'],\n },\n {\n key: 77,\n word: '-',\n dec: '45',\n hex: '2D',\n kind: 1,\n value: 45,\n aliases: ['_', '-_'],\n },\n {\n key: 79,\n word: '=',\n dec: '46',\n hex: '2E',\n kind: 1,\n value: 46,\n aliases: ['+', '=+'],\n },\n {\n key: 81,\n word: '[',\n dec: '47',\n hex: '2F',\n kind: 1,\n value: 47,\n aliases: ['{', '[{'],\n },\n {\n key: 83,\n word: ']',\n dec: '48',\n hex: '30',\n kind: 1,\n value: 48,\n aliases: ['}', '}]'],\n },\n {\n key: 85,\n word: '\\\\',\n dec: '49',\n hex: '31',\n kind: 1,\n value: 49,\n aliases: ['|', '\\\\|'],\n },\n {\n key: 87,\n word: '`',\n dec: '50',\n hex: '32',\n kind: 1,\n value: 50,\n aliases: ['~', '`~'],\n },\n {\n key: 89,\n word: ';',\n dec: '51',\n hex: '33',\n kind: 1,\n value: 51,\n aliases: [':', ';:'],\n },\n {\n key: 91,\n word: \"'\",\n dec: '52',\n hex: '34',\n kind: 1,\n value: 52,\n aliases: ['\"', '\\'\"'],\n },\n {\n key: 95,\n word: ',',\n dec: '54',\n hex: '36',\n kind: 1,\n value: 54,\n aliases: ['<', ',<'],\n },\n {\n key: 97,\n word: '.',\n dec: '55',\n hex: '37',\n kind: 1,\n value: 55,\n aliases: ['>', '.>'],\n },\n {\n key: 99,\n word: '/',\n dec: '56',\n hex: '38',\n kind: 1,\n value: 56,\n aliases: ['?', '/?'],\n },\n\n // 特殊功能键(无重复,保持原样)\n { key: 72, word: 'Enter', dec: '40', hex: '28', kind: 1, value: 40 },\n { key: 73, word: 'Escape', dec: '41', hex: '29', kind: 1, value: 41 },\n { key: 74, word: 'Backspace', dec: '42', hex: '2A', kind: 1, value: 42 },\n { key: 75, word: 'Tab', dec: '43', hex: '2B', kind: 1, value: 43 },\n { key: 76, word: ' ', dec: '44', hex: '2C', kind: 1, value: 44 },\n { key: 101, word: 'CapsLock', dec: '57', hex: '39', kind: 1, value: 57 },\n { key: 102, word: 'F1', dec: '58', hex: '3A', kind: 1, value: 58 },\n { key: 103, word: 'F2', dec: '59', hex: '3B', kind: 1, value: 59 },\n { key: 104, word: 'F3', dec: '60', hex: '3C', kind: 1, value: 60 },\n { key: 105, word: 'F4', dec: '61', hex: '3D', kind: 1, value: 61 },\n { key: 106, word: 'F5', dec: '62', hex: '3E', kind: 1, value: 62 },\n { key: 107, word: 'F6', dec: '63', hex: '3F', kind: 1, value: 63 },\n { key: 108, word: 'F7', dec: '64', hex: '40', kind: 1, value: 64 },\n { key: 109, word: 'F8', dec: '65', hex: '41', kind: 1, value: 65 },\n { key: 110, word: 'F9', dec: '66', hex: '42', kind: 1, value: 66 },\n { key: 111, word: 'F10', dec: '67', hex: '43', kind: 1, value: 67 },\n { key: 112, word: 'F11', dec: '68', hex: '44', kind: 1, value: 68 },\n { key: 113, word: 'F12', dec: '69', hex: '45', kind: 1, value: 69 },\n { key: 114, word: 'PrintScreen', dec: '70', hex: '46', kind: 1, value: 70 },\n { key: 115, word: 'ScrollLock', dec: '71', hex: '47', kind: 1, value: 71 },\n { key: 116, word: 'Pause', dec: '72', hex: '48', kind: 1, value: 72 },\n { key: 117, word: 'Insert', dec: '73', hex: '49', kind: 1, value: 73 },\n { key: 118, word: 'Home', dec: '74', hex: '4A', kind: 1, value: 74 },\n { key: 119, word: 'PageUp', dec: '75', hex: '4B', kind: 1, value: 75 },\n { key: 120, word: 'DeleteForward', dec: '76', hex: '4C', kind: 1, value: 76 },\n { key: 121, word: 'End', dec: '77', hex: '4D', kind: 1, value: 77 },\n { key: 122, word: 'PageDown', dec: '78', hex: '4E', kind: 1, value: 78 },\n { key: 123, word: 'ArrowRight', dec: '79', hex: '4F', kind: 1, value: 79 },\n { key: 124, word: 'ArrowLeft', dec: '80', hex: '50', kind: 1, value: 80 },\n { key: 125, word: 'ArrowDown', dec: '81', hex: '51', kind: 1, value: 81 },\n { key: 126, word: 'ArrowUp', dec: '82', hex: '52', kind: 1, value: 82 },\n { key: 127, word: 'NumLock', dec: '83', hex: '53', kind: 1, value: 83 },\n { key: 128, word: 'Clear', dec: '83', hex: '53', kind: 1, value: 83 },\n { key: 160, word: 'F13', dec: '104', hex: '68', kind: 0, value: 104 },\n { key: 161, word: 'F14', dec: '105', hex: '69', kind: 0, value: 105 },\n { key: 162, word: 'F15', dec: '106', hex: '6A', kind: 0, value: 106 },\n { key: 163, word: 'F16', dec: '107', hex: '6B', kind: 0, value: 107 },\n { key: 164, word: 'LeftControl', dec: '224', hex: 'E0', kind: 0, value: 224 },\n { key: 165, word: 'LeftShift', dec: '225', hex: 'E1', kind: 0, value: 225 },\n { key: 166, word: 'LeftAlt', dec: '226', hex: 'E2', kind: 0, value: 226 },\n { key: 167, word: 'LeftGUI', dec: '227', hex: 'E3', kind: 0, value: 227 },\n {\n key: 168,\n word: 'RightControl',\n dec: '228',\n hex: 'E4',\n kind: 0,\n value: 228,\n },\n { key: 169, word: 'RightShift', dec: '229', hex: 'E5', kind: 0, value: 229 },\n { key: 170, word: 'RightAlt', dec: '230', hex: 'E6', kind: 0, value: 230 },\n { key: 171, word: 'RightGUI', dec: '231', hex: 'E7', kind: 0, value: 231 },\n]\n\n/********************************************************************************\n * @brief: 获取 HID 键码映射(主键名 + 别名)\n * @return {*}\n ********************************************************************************/\nexport const getHIDCodeMapStr = () => {\n return hidKeyCode.reduce((map, curKey) => {\n // 主键名映射\n map.set(curKey.word, curKey)\n\n // 别名映射(包含组合形式)\n if (curKey.aliases && curKey.aliases.length > 0) {\n curKey.aliases.forEach(alias => {\n map.set(alias, curKey)\n })\n }\n\n return map\n }, new Map<string, (typeof hidKeyCode)[0]>())\n}\n\n/********************************************************************************\n * @brief: 获取 HID 键码映射(value 映射)\n * @return {*}\n ********************************************************************************/\nexport const getHIDCodeMapStrNum = () => {\n return hidKeyCode.reduce(\n (pre, cur) => pre.set(cur.value, cur),\n new Map<number, (typeof hidKeyCode)[0]>()\n )\n}\n","import { gzipSync, gunzipSync } from 'fflate'\r\n\r\n/********************************************************************************\r\n * @brief: gzip 压缩 JSON 数据(转成 Blob,适合导出)\r\n * @param {any} data\r\n * @return {*}\r\n ********************************************************************************/\r\nexport const compressJsonGzip = (data: any): Blob => {\r\n // 1. 紧凑 JSON\r\n const jsonStr = JSON.stringify(data)\r\n // 2. 转 Uint8Array\r\n const uint8Array = new TextEncoder().encode(jsonStr)\r\n // 关键:显式转成 Uint8Array<ArrayBuffer>\r\n const compressedArray = new Uint8Array(gzipSync(uint8Array))\r\n // 4. 转 Blob\r\n return new Blob([compressedArray], { type: 'application/gzip' })\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 解压 gzip 格式的 JSON 文件\r\n * @param {File} file\r\n * @return {*}\r\n ********************************************************************************/\r\nexport const decompressJsonGzip = async (file: File): Promise<any> => {\r\n // 1. 读取文件\r\n const arrayBuffer = await file.arrayBuffer()\r\n // 2. gzip 解压(同步)\r\n const decompressedArray = gunzipSync(new Uint8Array(arrayBuffer))\r\n // 3. 转字符串并解析 JSON\r\n const jsonStr = new TextDecoder().decode(decompressedArray)\r\n return JSON.parse(jsonStr)\r\n}\r\n","\r\n/********************************************************************************\r\n * @brief: 判断 popover 是否显示\r\n * @param {string} popId\r\n * @return {*}\r\n ********************************************************************************/\r\nexport function isShowPopover(popId: string) {\r\n const box = document.getElementById(popId) // 1. 先拿元素\r\n const isShow =\r\n box &&\r\n window.getComputedStyle(box).display !== 'none' &&\r\n box.getAttribute('aria-hidden') !== 'true'\r\n return isShow\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 判断图片是否有效\r\n * @param {string} src\r\n * @return {*}\r\n ********************************************************************************/\r\nexport function isImageValid(src: string | File) {\r\n return new Promise(resolve => {\r\n const img = new Image()\r\n img.src = typeof src === 'string' ? src : URL.createObjectURL(src)\r\n img.onload = () => resolve(true)\r\n img.onerror = () => resolve(false)\r\n })\r\n}\r\n","import type { Result } from './interface/result.types'\r\n\r\n/********************************************************************************\r\n * @brief: 创建成功的结果对象\r\n * @param {T} data 业务数据(可选,默认 null)\r\n * @param {string} message 成功信息(可选,默认空字符串)\r\n * @param {number} code 成功状态码(可选,默认 0)\r\n * @return {*} 成功的 Result 对象\r\n ********************************************************************************/\r\nexport function successResult<T = unknown>(\r\n data: T = null as unknown as T,\r\n message: string = '',\r\n code: number = 0,\r\n): Result<T> {\r\n return {\r\n success: true,\r\n code,\r\n message,\r\n data,\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 创建失败的结果对象\r\n * @param {string} message 错误信息(必选)\r\n * @param {number} code 错误码(可选,默认 -1)\r\n * @param {T} data 错误相关数据(可选,默认 null)\r\n * @return {*} 失败的 Result 对象\r\n ********************************************************************************/\r\nexport function errorResult<T = unknown>(\r\n message: string,\r\n code: number = -1,\r\n data: T = null as unknown as T,\r\n): Result<T> {\r\n return {\r\n success: false,\r\n code,\r\n message,\r\n data,\r\n }\r\n}\r\n","/********************************************************************************\r\n * @brief: 字节序枚举(大端/小端)\r\n * @return {*}\r\n ********************************************************************************/\r\nexport const Endianness = {\r\n LITTLE: 'little', // 小端(低字节在前)\r\n BIG: 'big', // 大端(高字节在前)\r\n}\r\n\r\nexport type Endianness = (typeof Endianness)[keyof typeof Endianness]\r\n\r\n/********************************************************************************\r\n * @brief: 将数字转换为指定字节序的字节数组\r\n * @param {number} number 待转换的数字(自动截断为无符号整数)\r\n * @param {number} byteCount 目标字节长度(必须为正整数)\r\n * @param {Endianness} endian 字节序(默认小端)\r\n * @return {*} 字节数组(每个元素为 0-255 的整数)\r\n ********************************************************************************/\r\nexport const numToBytes = (\r\n number: number,\r\n byteCount: number,\r\n endian: Endianness = Endianness.BIG,\r\n): number[] => {\r\n if (!Number.isInteger(byteCount) || byteCount <= 0) {\r\n throw new Error('Byte count must be a positive integer.')\r\n }\r\n\r\n const unsignedNum = number >>> 0 // 转为无符号整数\r\n const byteArray: number[] = new Array(byteCount)\r\n\r\n for (let i = 0; i < byteCount; i++) {\r\n // 根据字节序计算位移:小端用 i*8,大端用 (byteCount-1 - i)*8\r\n const shift = endian === Endianness.LITTLE ? i * 8 : (byteCount - 1 - i) * 8\r\n byteArray[i] = (unsignedNum >> shift) & 0xff\r\n }\r\n\r\n return byteArray\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 将任意长度的字节数组转换为数字(支持不同字节序)\r\n * @param {number[]} bytes 字节数组\r\n * @param {Endianness} endian 字节序(默认小端)\r\n * @return {*} 转换后的数字\r\n ********************************************************************************/\r\nexport const bytesToNum = (\r\n bytes: number[],\r\n endian: Endianness = Endianness.BIG,\r\n): number => {\r\n let result = 0\r\n\r\n if (endian === Endianness.LITTLE) {\r\n // 小端:从低位到高位\r\n for (let i = 0; i < bytes.length; i++) {\r\n // 根据字节序计算位移:小端用 i*8,大端用 (byteCount-1 - i)*8\r\n result |= (bytes[i] & 0xff) << (i * 8)\r\n }\r\n } else {\r\n // 大端:从高位到低位\r\n for (let i = 0; i < bytes.length; i++) {\r\n result |= (bytes[i] & 0xff) << ((bytes.length - 1 - i) * 8)\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 将数字转换为16位无符号整数的指定字节序字节数组(固定2字节)\r\n * @param {number} number 待转换的数字(自动截断为16位无符号整数范围)\r\n * @param {Endianness} endian 字节序(默认小端)\r\n * @return {*} 长度为2的字节数组\r\n ********************************************************************************/\r\nexport const numToBits16 = (\r\n number: number,\r\n endian: Endianness = Endianness.BIG,\r\n): [number, number] => {\r\n const uint16 = number & 0xffff // 截断为16位无符号整数\r\n\r\n if (endian === Endianness.LITTLE) {\r\n return [uint16 & 0xff, (uint16 >> 8) & 0xff] // 小端:[低8位, 高8位]\r\n } else {\r\n return [(uint16 >> 8) & 0xff, uint16 & 0xff] // 大端:[高8位, 低8位]\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 将16位字节数组转换为数字(与numTo16Bits相反功能)\r\n * @param {[number, number]} bytes 长度为2的字节数组\r\n * @param {Endianness} endian 字节序(默认小端)\r\n * @return {*} 转换后的数字\r\n ********************************************************************************/\r\nexport const bits16ToNum = (\r\n bytes: [number, number],\r\n endian: Endianness = Endianness.BIG,\r\n): number => {\r\n if (bytes.length !== 2) {\r\n throw new Error('Input array must have exactly 2 elements')\r\n }\r\n\r\n if (endian === Endianness.LITTLE) {\r\n // 小端:[低8位, 高8位]\r\n return (bytes[1] << 8) | bytes[0]\r\n } else {\r\n // 大端:[高8位, 低8位]\r\n return (bytes[0] << 8) | bytes[1]\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 将数字转换为ASCII码值数组(每个数字转换为其对应的ASCII码)\r\n * @param {number} n 待转换的数字(自动取绝对值)\r\n * @return {*} ASCII码值数组(每个元素为0-255的整数)\r\n ********************************************************************************/\r\nexport const numToAsciiArr = (n: number): number[] => {\r\n return Math.abs(n) // 去符号\r\n .toString() // 变成 \"12345\"\r\n .split('') // [\"1\",\"2\",\"3\",\"4\",\"5\"]\r\n .map(c => c.charCodeAt(0)) // [49,50,51,52,53]\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 将ASCII码值数组转换为对应的数字\r\n * @param {number[]} ascii\r\n * @return {*}\r\n ********************************************************************************/\r\nexport const asciiArrToNum = (ascii: number[]): number => {\r\n return Number(String.fromCharCode(...ascii))\r\n}\r\n","import type {\r\n ParsedColor,\r\n ParsedHSL,\r\n ParsedHSLA,\r\n ParsedRGB,\r\n ParsedRGBA,\r\n ParsedHSV,\r\n} from './interface/color.types'\r\n\r\n/********************************************************************************\r\n * @brief: 限制数值在指定范围内\r\n * @param {number} value\r\n * @param {number} min\r\n * @param {number} max\r\n * @return {*}\r\n ********************************************************************************/\r\nconst clamp = (value: number, min: number, max: number): number => {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: 解析颜色字符串(支持 rgb/rgba/hsv/hsl 格式)\r\n * @param {string} str 待解析的颜色字符串(如 \"hsl(120, 100%, 50%)\"、\"hsla(240, 50%, 70%, 0.8)\")\r\n * @return {*} 解析后的颜色对象,不匹配任何格式时返回 null\r\n ********************************************************************************/\r\nexport function parseColorString(str: string): ParsedColor | null {\r\n /********************************************************************************\r\n * @brief: 工具函数:将百分比/数字转换为 0-255 的 RGB 分量\r\n * @param {string} valueStr\r\n * @return {*}\r\n ********************************************************************************/\r\n const toRgbComponent = (valueStr: string): number => {\r\n const isPercent = valueStr.endsWith('%')\r\n const value = parseFloat(valueStr.replace('%', ''))\r\n\r\n if (isPercent) {\r\n // 百分比转换(0%-100% → 0-255)\r\n return Math.round(clamp(value / 100, 0, 1) * 255)\r\n } else {\r\n // 直接数字(0-255)\r\n return clamp(Math.round(value), 0, 255)\r\n }\r\n }\r\n\r\n /********************************************************************************\r\n * @brief: 工具函数:将百分比/数字转换为 0-1 的 Alpha 分量\r\n * @param {string} valueStr\r\n * @return {*}\r\n ********************************************************************************/\r\n const toAlphaComponent = (valueStr: string): number => {\r\n const isPercent = valueStr.endsWith('%')\r\n const value = parseFloat(valueStr.replace('%', ''))\r\n\r\n if (isPercent) {\r\n return clamp(value / 100, 0, 1)\r\n } else {\r\n return clamp(value, 0, 1)\r\n }\r\n }\r\n\r\n /********************************************************************************\r\n * @brief: 工具函数:将百分比转换为 0-1 的 HSV/HSL 分量(饱和度/明度/亮度)\r\n * @param {string} valueStr\r\n * @return {*}\r\n ********************************************************************************/\r\n const toPercentComponent = (valueStr: string): number => {\r\n if (!valueStr.endsWith('%')) return 0 // 无效格式默认0\r\n const value = parseFloat(valueStr.replace('%', ''))\r\n return clamp(value / 100, 0, 1)\r\n }\r\n\r\n // 1. 匹配 rgb(...) 格式\r\n const rgbRegex =\r\n /^rgb\\(\\s*(\\d+(\\.\\d+)?%?)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*\\)$/i\r\n const rgbMatch = str.match(rgbRegex)\r\n if (rgbMatch) {\r\n const [, rStr, , gStr, , bStr] = rgbMatch\r\n return {\r\n type: 'rgb',\r\n r: toRgbComponent(rStr),\r\n g: toRgbComponent(gStr),\r\n b: toRgbComponent(bStr),\r\n }\r\n }\r\n\r\n // 2. 匹配 rgba(...) 格式\r\n const rgbaRegex =\r\n /^rgba\\(\\s*(\\d+(\\.\\d+)?%?)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*\\)$/i\r\n const rgbaMatch = str.match(rgbaRegex)\r\n if (rgbaMatch) {\r\n const [, rStr, , gStr, , bStr, , aStr] = rgbaMatch\r\n return {\r\n type: 'rgba',\r\n r: toRgbComponent(rStr),\r\n g: toRgbComponent(gStr),\r\n b: toRgbComponent(bStr),\r\n a: toAlphaComponent(aStr),\r\n }\r\n }\r\n\r\n // 3. 匹配 hsv(...) 格式\r\n const hsvRegex =\r\n /^hsv\\(\\s*(\\d+(\\.\\d+)?)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*\\)$/i\r\n const hsvMatch = str.match(hsvRegex)\r\n if (hsvMatch) {\r\n const [, hStr, , sStr, , vStr] = hsvMatch\r\n return {\r\n type: 'hsv',\r\n h: clamp(parseFloat(hStr), 0, 360),\r\n s: toPercentComponent(sStr),\r\n v: toPercentComponent(vStr),\r\n }\r\n }\r\n\r\n // 4. 匹配 hsl(...) 格式(新增)\r\n const hslRegex =\r\n /^hsl\\(\\s*(\\d+(\\.\\d+)?)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*\\)$/i\r\n const hslMatch = str.match(hslRegex)\r\n if (hslMatch) {\r\n const [, hStr, , sStr, , lStr] = hslMatch\r\n return {\r\n type: 'hsl',\r\n h: clamp(parseFloat(hStr), 0, 360), // 色相 0-360\r\n s: toPercentComponent(sStr), // 饱和度 0-1\r\n l: toPercentComponent(lStr), // 明度 0-1\r\n }\r\n }\r\n\r\n // 5. 匹配 hsla(...) 格式(带透明度,新增)\r\n const hslaRegex =\r\n /^hsla\\(\\s*(\\d+(\\.\\d+)?)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*,\\s*(\\d+(\\.\\d+)?%)\\s*,\\s*(\\d+(\\.\\d+)?%?)\\s*\\)$/i\r\n const hslaMatch = str.match(hslaRegex)\r\n if (hslaMatch) {\r\n const [, hStr, , sStr, , lStr, , aStr] = hslaMatch\r\n return {\r\n type: 'hsla',\r\n h: clamp(parseFloat(hStr), 0, 360),\r\n s: toPercentComponent(sStr),\r\n l: toPercentComponent(lStr),\r\n a: toAlphaComponent(aStr), // 透明度 0-1\r\n }\r\n }\r\n\r\n // 不匹配任何格式\r\n return null\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: HSL 转 RGB 颜色转换\r\n * @param {ParsedColor} hsl HSL 颜色对象(分量范围 0-255)\r\n * @return {*} RGB 颜色对象(分量范围 0-255)\r\n ********************************************************************************/\r\nexport function hslToRgb(\r\n hsl: ParsedHSL | ParsedHSLA | null,\r\n): ParsedColor | null {\r\n // 输入边界处理\r\n const h = clamp(hsl.h, 0, 360) / 360 // 归一化色相到 0-1\r\n const s = clamp(hsl.s, 0, 1)\r\n const l = clamp(hsl.l, 0, 1)\r\n\r\n let r = 0,\r\n g = 0,\r\n b = 0\r\n\r\n if (s === 0) {\r\n // 无饱和度(灰度)\r\n r = g = b = l\r\n } else {\r\n // 辅助函数:计算颜色分量\r\n const hue2rgb = (p: number, q: number, t: number): number => {\r\n if (t < 0) t += 1\r\n if (t > 1) t -= 1\r\n if (t < 1 / 6) return p + (q - p) * 6 * t\r\n if (t < 1 / 2) return q\r\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\r\n return p\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\r\n const p = 2 * l - q\r\n\r\n r = hue2rgb(p, q, h + 1 / 3)\r\n g = hue2rgb(p, q, h)\r\n b = hue2rgb(p, q, h - 1 / 3)\r\n }\r\n\r\n // 转换为 0-255 范围并取整\r\n return {\r\n type: 'rgb',\r\n r: Math.round(r * 255),\r\n g: Math.round(g * 255),\r\n b: Math.round(b * 255),\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: RGB 转 HSL 颜色转换\r\n * @param {ParsedColor} rgb RGB 颜色对象(分量范围 0-255)\r\n * @return {*} HSL 颜色对象(h:0-360, s:0-1, l:0-1)\r\n ********************************************************************************/\r\nexport function rgbToHsl(\r\n rgb: ParsedRGB | ParsedRGBA | null,\r\n): ParsedColor | null {\r\n // 1. 输入处理:将 RGB 分量归一化到 0-1 范围\r\n const r = clamp(rgb.r, 0, 255) / 255\r\n const g = clamp(rgb.g, 0, 255) / 255\r\n const b = clamp(rgb.b, 0, 255) / 255\r\n\r\n // 2. 计算最大/最小分量值\r\n const max = Math.max(r, g, b)\r\n const min = Math.min(r, g, b)\r\n const delta = max - min // 颜色范围(用于计算饱和度)\r\n\r\n // 3. 计算明度(Lightness)\r\n const l = (max + min) / 2\r\n\r\n // 4. 计算饱和度(Saturation)\r\n let s = 0\r\n if (delta !== 0) {\r\n // 饱和度公式:根据明度调整计算方式\r\n s = delta / (1 - Math.abs(2 * l - 1))\r\n }\r\n\r\n // 5. 计算色相(Hue)\r\n let h = 0\r\n if (delta !== 0) {\r\n switch (max) {\r\n case r:\r\n // 红色为最大分量时,色相基于 g - b 计算\r\n h = ((g - b) / delta) % 6\r\n break\r\n case g:\r\n // 绿色为最大分量时,色相基于 b - r 计算\r\n h = (b - r) / delta + 2\r\n break\r\n case b:\r\n // 蓝色为最大分量时,色相基于 r - g 计算\r\n h = (r - g) / delta + 4\r\n break\r\n }\r\n // 转换为 0-360 度(若为负数则加 360 确保在正数范围)\r\n h = Math.round(h * 60)\r\n if (h < 0) h += 360\r\n }\r\n\r\n // 6. 输出处理:确保饱和度和明度在 0-1 范围内\r\n return {\r\n type: 'hsl',\r\n h: clamp(h, 0, 360),\r\n s: clamp(s, 0, 1),\r\n l: clamp(l, 0, 1),\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: HSV 转 HSL 颜色转换\r\n * @param {ParsedColor} hsv HSV 颜色对象(分量范围 0-255)\r\n * @return {*} HSL 颜色对象(h:0-360, s:0-1, l:0-1)\r\n ********************************************************************************/\r\nexport function hsvToHsl(hsv: ParsedHSV): ParsedColor {\r\n const { h, s: sHsv, v } = hsv\r\n\r\n // 计算HSL的亮度(L)\r\n let l: number\r\n if (sHsv === 0) {\r\n // 饱和度为0时,亮度等于明度(灰度)\r\n l = v\r\n } else {\r\n l = ((2 - sHsv) * v) / 2\r\n }\r\n // 确保亮度在0-1范围内\r\n l = Math.max(0, Math.min(1, l))\r\n\r\n // 计算HSL的饱和度(S)\r\n let s: number\r\n if (l === 0 || l === 1) {\r\n // 纯黑或纯白时饱和度为0\r\n s = 0\r\n } else {\r\n s = (sHsv * v) / (1 - Math.abs(2 * l - 1))\r\n // 确保饱和度在0-1范围内\r\n s = Math.max(0, Math.min(1, s))\r\n }\r\n\r\n return {\r\n type: 'hsl',\r\n h: Math.max(0, Math.min(360, h)), // 确保色相在0-360范围内\r\n s,\r\n l,\r\n }\r\n}\r\n\r\n/********************************************************************************\r\n * @brief: HSL 转 HSV 颜色转换\r\n * @param {ParsedColor} hsl HSL 颜色对象(分量范围 0-255)\r\n * @return {*} HSV 颜色对象(h:0-360, s:0-1, v:0-1)\r\n ********************************************************************************/\r\nexport function hslToHsv(hsl: ParsedHSL): ParsedColor {\r\n const { h, s: sHsl, l } = hsl\r\n\r\n // 计算HSV的明度(V)\r\n const v = l + sHsl * Math.min(l, 1 - l)\r\n // 确保明度在0-1范围内\r\n const clampedV = Math.max(0, Math.min(1, v))\r\n\r\n // 计算HSV的饱和度(S)\r\n let s: number\r\n if (clampedV === 0) {\r\n // 明度为0时饱和度为0(纯黑)\r\n s = 0\r\n } else {\r\n s = 2 * (1 - l / clampedV)\r\n // 确保饱和度在0-1范围内\r\n s = Math.max(0, Math.min(1, s))\r\n }\r\n\r\n return {\r\n type: 'hsv',\r\n h: Math.max(0, Math.min(360, h)), // 确保色相在0-360范围内\r\n s,\r\n v: clampedV,\r\n }\r\n}\r\n"],"mappings":"AAWO,IAAMA,EAAa,CAExB,CACE,IAAK,EACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,EACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,EACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,EACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,EACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,IACL,IAAK,KACL,KAAM,EACN,MAAO,EACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,GAAG,CACf,EAGA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,CACrB,EACA,CACE,IAAK,GACL,KAAM,IACN,IAAK,KACL,IAAK,KACL,KAAM,EACN,MAAO,GACP,QAAS,CAAC,IAAK,IAAI,C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","names":["hidKeyCode","getHIDCodeMapStr","map","curKey","alias","getHIDCodeMapStrNum","pre","cur","gzipSync","gunzipSync","compressJsonGzip","data","jsonStr","uint8Array","compressedArray","decompressJsonGzip","file","arrayBuffer","decompressedArray","isShowPopover","popId","box","isImageValid","src","resolve","img","successResult","data","message","code","errorResult","Endianness","numToBytes","number","byteCount","endian","unsignedNum","byteArray","i","shift","bytesToNum","bytes","result","numToBits16","uint16","bits16ToNum","numToAsciiArr","n","c","asciiArrToNum","ascii","clamp","value","min","max","parseColorString","str","toRgbComponent","valueStr","isPercent","toAlphaComponent","toPercentComponent","rgbRegex","rgbMatch","rStr","gStr","bStr","rgbaRegex","rgbaMatch","aStr","hsvRegex","hsvMatch","hStr","sStr","vStr","hslRegex","hslMatch","lStr","hslaRegex","hslaMatch","hslToRgb","hsl","h","s","l","r","g","b","hue2rgb","p","q","t","rgbToHsl","rgb","delta","hsvToHsl","hsv","sHsv","v","hslToHsv","sHsl","clampedV"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ilx1-x-tool",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "工具库",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsup",
|
|
13
|
+
"dev": "tsup --watch"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"typescript",
|
|
17
|
+
"utilities",
|
|
18
|
+
"tools",
|
|
19
|
+
"functions"
|
|
20
|
+
],
|
|
21
|
+
"author": "iLx1",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^25.0.9",
|
|
25
|
+
"tsup": "^8.5.1",
|
|
26
|
+
"typescript": "^5.9.3"
|
|
27
|
+
},
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/iLx11/x-tool.git"
|
|
31
|
+
},
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/iLx11/x-tool/issues"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/iLx11/x-tool#readme",
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"fflate": "^0.8.2"
|
|
38
|
+
}
|
|
39
|
+
}
|