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 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
@@ -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 };
@@ -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
+ }