nhanh-pure-function 4.4.0 → 4.6.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.
@@ -10,11 +10,11 @@ export declare function _Animate_Schedule(callback: (schedule: number) => void,
10
10
  * @param initialMin - 振荡器初始最小值
11
11
  * @param initialMax - 振荡器初始最大值
12
12
  * @param initialSteps - 从最小值到最大值所需的动画步数
13
- * @param callback - 每帧更新时的回调函数,接收当前振荡值
13
+ * @param callback - 每帧回调 `(value, direction)`:`value` 为经 `precision` 处理后的当前值;`direction` 为本帧步进方向(`1` 朝向 `max`,`-1` 朝向 `min`),触边翻转后传入
14
14
  * @param precision - 数值精度(保留小数位数,默认4位)
15
15
  * @returns 振荡器控制对象,包含播放/暂停/参数更新等方法
16
16
  */
17
- export declare function _Animate_CreateOscillator(initialMin: number, initialMax: number, initialSteps: number, callback: (value: number) => void, precision?: number): {
17
+ export declare function _Animate_CreateOscillator(initialMin: number, initialMax: number, initialSteps: number, callback: (value: number, direction: 1 | -1) => void, precision?: number): {
18
18
  /** 启动/继续动画 */
19
19
  play(target?: number): void;
20
20
  /** 暂停动画 */
@@ -1,5 +1,5 @@
1
1
  import { PaperType, WindowTarget } from '../Constant';
2
- export * from './Runtime';
2
+ export * from './modules';
3
3
  /**
4
4
  * 获取帧率
5
5
  * @param {(fps , frameTime)=>void} callback callback( 帧率 , 每帧时间 )
@@ -1,5 +1,5 @@
1
1
  import { DragOption, LocalDragOptions, UiLibrary } from './type';
2
- export * from './Runtime';
2
+ export * from './modules';
3
3
  /**
4
4
  * 滚动结束监听器
5
5
  * @param {(trigger: "vertical" | "horizontal") => void} callback
@@ -0,0 +1,45 @@
1
+ /** 自定义拖拽校验与提取器 */
2
+ export interface CustomDropValidator {
3
+ /**
4
+ * 悬停拦截:拖拽进入/悬停时触发。
5
+ * 此时出于安全策略无法读取文件内容,仅能通过暴露的 types 判断是否允许拖入。
6
+ */
7
+ matchTypes: (types: readonly string[]) => boolean;
8
+ /**
9
+ * 精确提取:拖拽放下(drop)时触发。
10
+ * 遍历 dataTransfer.items 的每一项,返回 true 代表将该项提取并交由回调处理。
11
+ */
12
+ matchItem: (item: DataTransferItem) => boolean;
13
+ }
14
+ /** 拖放区接受的拖拽数据类型 */
15
+ export type DropTargetType = "text" | "file" | "image" | "video" | "audio" | "application" | `.${string}` | `${string}/${string}` | (string & {}) | CustomDropValidator;
16
+ /** 单一拖放规则配置 */
17
+ export interface DropZoneRule {
18
+ /** 允许传入单一类型或多种类型组合的数组 */
19
+ targetType?: DropTargetType | DropTargetType[];
20
+ /** 拖放回调 */
21
+ dropCallback: (data: any[]) => void;
22
+ /** 当前规则匹配成功时的激活回调 */
23
+ activeCallback?: (active: boolean) => void;
24
+ }
25
+ /** 注册拖放区时的配置 */
26
+ export type DropZoneOption = {
27
+ /** 拖放区元素 */
28
+ dom: HTMLElement | string;
29
+ /** 拖放区全局激活回调(只要有任意规则匹配就会触发) */
30
+ activeCallback?: (active: boolean) => void;
31
+ } & (DropZoneRule | {
32
+ /** 多规则配置(允许对不同类型独立处理) */
33
+ rules: DropZoneRule[];
34
+ });
35
+ export declare class _Element_DropZoneManager {
36
+ private entries;
37
+ private extractRules;
38
+ add(config: DropZoneOption): void;
39
+ delete(dom: HTMLElement | string): void;
40
+ destroy(): void;
41
+ private onDragEnter;
42
+ private onDragLeave;
43
+ private onDragOver;
44
+ private onDrop;
45
+ }
@@ -1,2 +1,3 @@
1
- /** Element 模块内依赖 DOM / 运行时的工具集合(全屏等);新文件在此 `export *` 即可。 */
1
+ /** Element 模块内依赖 DOM / 运行时的工具集合(全屏、拖放等);新文件在此 `export *` 即可。 */
2
+ export * from './drop';
2
3
  export * from './fullscreen';
@@ -32,6 +32,19 @@ export declare function _Math_PointToLineDistance(point: [number, number], lineS
32
32
  * @returns [起点坐标[x,y], 终点坐标[x,y]]
33
33
  */
34
34
  export declare function _Math_GetArcPoints(x: number, y: number, radius: number, startAngle: number, endAngle: number, axisX?: number, axisY?: number): [[number, number], [number, number]];
35
+ /**
36
+ * 计算两个经纬度坐标之间的直线距离(单位:米)。
37
+ *
38
+ * 先将经纬度通过 Mercator 投影转换为平面坐标(米),
39
+ * 再计算二维平面欧几里得距离,适用于短距离近似计算。
40
+ *
41
+ * @param lng1 第一个点的经度(度),范围 [-180, 180]
42
+ * @param lat1 第一个点的纬度(度),范围 [-85.05, 85.05]
43
+ * @param lng2 第二个点的经度(度),范围 [-180, 180]
44
+ * @param lat2 第二个点的纬度(度),范围 [-85.05, 85.05]
45
+ * @returns 两点间的距离(米)
46
+ */
47
+ export declare function _Math_CalculateDistanceLngLat(lng1: number, lat1: number, lng2: number, lat2: number): number;
35
48
  /** 计算平面直角坐标系中两点的距离 */
36
49
  export declare function _Math_CalculateDistance2D(x1: number, y1: number, x2: number, y2: number): number;
37
50
  /** 获取两点的中点 */
@@ -55,12 +68,18 @@ export declare function _Math_GetBoundaryIntersection(startPoint: [number, numbe
55
68
  */
56
69
  export declare const _Math_Degree: Math;
57
70
  /**
58
- * 根据控制点与参数 t,用 De Casteljau 计算 Bézier 曲线上的点。
71
+ * 根据控制点与参数 t,用 De Casteljau 计算 Bézier 曲线上的点和方向弧度。
72
+ *
73
+ * 【为什么可以这样获取方向】
74
+ * 根据 De Casteljau 算法的特性,当循环降维到倒数第二层(只剩最后 2 个点)时,
75
+ * 这两点连线的方向 [p1 - p0] 刚好就是曲线在该点处的切线向量。
76
+ * 此时使用 Math.atan2 即可直接换算出切线方向的弧度,无需单独执行求导公式。
77
+ *
59
78
  * @param nodes 控制点
60
79
  * @param progress 曲线参数,通常取 [0, 1]
61
- * @returns 曲线上的点
80
+ * @returns 曲线上的点和方向 [x, y, radian]
62
81
  */
63
- export declare function _Math_GetBezierCurveNodes(nodes: [number, number][], progress: number): [number, number];
82
+ export declare function _Math_GetBezierCurveNodes(nodes: [number, number][], progress: number): [number, number, number];
64
83
  /**
65
84
  * 根据宽高比与参数 progress,计算椭圆上的点(中心在原点)。
66
85
  * @param aspectRatio 宽高比(width / height),即 X 半轴与 Y 半轴之比
@@ -69,3 +88,77 @@ export declare function _Math_GetBezierCurveNodes(nodes: [number, number][], pro
69
88
  * @returns 椭圆上的点 [x, y]
70
89
  */
71
90
  export declare function _Math_GetEllipsePoints(aspectRatio: number, progress: number, normalizeToUnitSquare?: boolean): [number, number];
91
+ /**
92
+ * 将数值钳制在指定区间内。
93
+ * @param value 输入值
94
+ * @param min 下限
95
+ * @param max 上限
96
+ * @returns 钳制后的值
97
+ */
98
+ export declare function _Math_Clamp(value: number, min: number, max: number): number;
99
+ /**
100
+ * 线性插值。
101
+ * @param a 起始值
102
+ * @param b 结束值
103
+ * @param t 插值参数,[0, 1]
104
+ * @returns 插值结果
105
+ */
106
+ export declare function _Math_Lerp(a: number, b: number, t: number): number;
107
+ /**
108
+ * 逆线性插值:计算 value 在 [a, b] 区间的位置比例。
109
+ * @param a 区间下限
110
+ * @param b 区间上限
111
+ * @param value 当前值
112
+ * @returns 比例 t,0 表示在 a,1 表示在 b
113
+ */
114
+ export declare function _Math_InverseLerp(a: number, b: number, value: number): number;
115
+ /**
116
+ * 将 value 从 [fromMin, fromMax] 区间映射到 [toMin, toMax] 区间。
117
+ * @param value 输入值
118
+ * @param fromMin 源区间下限
119
+ * @param fromMax 源区间上限
120
+ * @param toMin 目标区间下限
121
+ * @param toMax 目标区间上限
122
+ * @returns 映射后的值
123
+ */
124
+ export declare function _Math_Remap(value: number, fromMin: number, fromMax: number, toMin: number, toMax: number): number;
125
+ /**
126
+ * 角度转弧度。
127
+ * @param deg 角度(度)
128
+ * @returns 弧度
129
+ */
130
+ export declare function _Math_DegToRad(deg: number): number;
131
+ /**
132
+ * 弧度转角度。
133
+ * @param rad 弧度
134
+ * @returns 角度(度)
135
+ */
136
+ export declare function _Math_RadToDeg(rad: number): number;
137
+ /**
138
+ * 将角度归一化到指定范围。
139
+ * @param angle 输入角度(度)
140
+ * @param signed 为 true 时归一化到 [-180, 180),默认 false 归一化到 [0, 360)
141
+ * @returns 归一化后的角度
142
+ */
143
+ export declare function _Math_NormalizeAngle(angle: number, signed?: boolean): number;
144
+ /**
145
+ * 判断点是否在矩形内(含边界)。
146
+ * @param px 点 X 坐标
147
+ * @param py 点 Y 坐标
148
+ * @param rx 矩形左上角 X
149
+ * @param ry 矩形左上角 Y
150
+ * @param rw 矩形宽度
151
+ * @param rh 矩形高度
152
+ * @returns true 表示点在矩形内
153
+ */
154
+ export declare function _Math_IsPointInRect(px: number, py: number, rx: number, ry: number, rw: number, rh: number): boolean;
155
+ /**
156
+ * 判断点是否在圆形内(含边界)。
157
+ * @param px 点 X 坐标
158
+ * @param py 点 Y 坐标
159
+ * @param cx 圆心 X
160
+ * @param cy 圆心 Y
161
+ * @param radius 圆半径
162
+ * @returns true 表示点在圆内
163
+ */
164
+ export declare function _Math_IsPointInCircle(px: number, py: number, cx: number, cy: number, radius: number): boolean;
@@ -37,3 +37,12 @@ export type _Type_DeepPartial<T> = {
37
37
  export type _Type_Mutable<T> = {
38
38
  -readonly [P in keyof T]: T[P];
39
39
  };
40
+ /**
41
+ * 递归地将类型中的所有只读(readonly)属性转换为可写(writable)属性
42
+ * @template T - 要处理的基础类型
43
+ * @description 与TypeScript内置的Writable不同,DeepWritable会对嵌套对象进行递归处理,
44
+ * 使所有层级的属性都变为可写。适用于需要修改对象属性的场景,但需要确保对象不会被其他地方引用。
45
+ */
46
+ export type _Type_DeepWritable<T> = {
47
+ -readonly [P in keyof T]: _Type_DeepWritable<T[P]>;
48
+ };
@@ -1,4 +1,5 @@
1
- export * from './Runtime';
1
+ import { _Type_DeepWritable } from '../Types';
2
+ export * from './modules';
2
3
  /**
3
4
  * 寻找空闲时机执行传入方法
4
5
  * @param callback 需执行的方法
@@ -73,7 +74,7 @@ export declare function _Utility_RotateList<T>(list: T[]): T[][];
73
74
  * @param {any} val - 需要克隆的值
74
75
  * @returns {any} - 克隆后的值
75
76
  */
76
- export declare function _Utility_Clone<T>(val: T): T;
77
+ export declare function _Utility_Clone<T>(val: T): _Type_DeepWritable<T>;
77
78
  /**
78
79
  * 函数装饰器:精准测量并记录目标函数的执行耗时(单位:毫秒)
79
80
  *
@@ -100,86 +101,3 @@ export declare function _Utility_TimeConsumption<T extends Function>(func: T, co
100
101
  * @returns 实际暂停的毫秒数
101
102
  */
102
103
  export declare function _Utility_Sleep(ms: number): number;
103
- /**
104
- * 颜色转换工具。
105
- * 支持输入:hex/rgb/hsl/hsv,统一解析后输出指定格式。
106
- */
107
- export declare class _Utility_ColorConverter {
108
- private constructor();
109
- private static readonly DEFAULT_ALPHA;
110
- /**
111
- * 数值钳制,确保在合法区间内。
112
- */
113
- private static clamp;
114
- private static normalizeHue;
115
- /**
116
- * 根据色相分段与色度参数生成 RGB(0-255)。
117
- */
118
- private static chromaToRgb;
119
- private static resolveAlpha;
120
- private static toRoundedRgbString;
121
- /**
122
- * HSL 转 RGB。
123
- * h: 0-360, s/l: 0-100
124
- */
125
- private static hslToRgb;
126
- /**
127
- * HSV 转 RGB。
128
- * h: 0-360, s/v: 0-100
129
- */
130
- private static hsvToRgb;
131
- /**
132
- * 解析任意受支持的颜色格式并标准化为 RGBA。
133
- */
134
- private static parseColor;
135
- /**
136
- * 十进制颜色分量转两位十六进制字符串。
137
- */
138
- private static toHexPart;
139
- /**
140
- * RGB 转 HSL。
141
- * 返回 h:0-360, s/l:0-100
142
- */
143
- private static rgbToHsl;
144
- /**
145
- * RGB 转 HSV。
146
- * 返回 h:0-360, s/v:0-100
147
- */
148
- private static rgbToHsv;
149
- /**
150
- * 转换为 HEX(#RRGGBB)。
151
- */
152
- static toHex(color: string): string;
153
- /**
154
- * 转换为 HEXA(#RRGGBBAA)。
155
- * alpha 不传时保留输入颜色中的透明度(默认 1)。
156
- */
157
- static toHexa(color: string, alpha?: number): string;
158
- /**
159
- * 转换为 RGB(rgb(r, g, b))。
160
- */
161
- static toRgb(color: string): string;
162
- /**
163
- * 转换为 RGBA(rgba(r, g, b, a))。
164
- * alpha 不传时保留输入颜色中的透明度(默认 1)。
165
- */
166
- static toRgba(color: string, alpha?: number): string;
167
- /**
168
- * 转换为 HSL(hsl(h, s%, l%))。
169
- */
170
- static toHsl(color: string): string;
171
- /**
172
- * 转换为 HSLA(hsla(h, s%, l%, a))。
173
- * alpha 不传时保留输入颜色中的透明度(默认 1)。
174
- */
175
- static toHsla(color: string, alpha?: number): string;
176
- /**
177
- * 转换为 HSV(hsv(h, s%, v%))。
178
- */
179
- static toHsv(color: string): string;
180
- /**
181
- * 转换为 HSVA(hsva(h, s%, v%, a))。
182
- * alpha 不传时保留输入颜色中的透明度(默认 1)。
183
- */
184
- static toHsva(color: string, alpha?: number): string;
185
- }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * 颜色转换工具。
3
+ * 支持输入:hex/rgb/hsl/hsv,统一解析后输出指定格式。
4
+ */
5
+ export declare class _Utility_ColorConverter {
6
+ private constructor();
7
+ private static readonly DEFAULT_ALPHA;
8
+ /**
9
+ * 数值钳制,确保在合法区间内。
10
+ */
11
+ private static clamp;
12
+ private static normalizeHue;
13
+ /**
14
+ * 根据色相分段与色度参数生成 RGB(0-255)。
15
+ */
16
+ private static chromaToRgb;
17
+ private static resolveAlpha;
18
+ private static toRoundedRgbString;
19
+ /**
20
+ * HSL 转 RGB。
21
+ * h: 0-360, s/l: 0-100
22
+ */
23
+ private static hslToRgb;
24
+ /**
25
+ * HSV 转 RGB。
26
+ * h: 0-360, s/v: 0-100
27
+ */
28
+ private static hsvToRgb;
29
+ /**
30
+ * 解析任意受支持的颜色格式并标准化为 RGBA。
31
+ */
32
+ private static parseColor;
33
+ /**
34
+ * 十进制颜色分量转两位十六进制字符串。
35
+ */
36
+ private static toHexPart;
37
+ /**
38
+ * RGB 转 HSL。
39
+ * 返回 h:0-360, s/l:0-100
40
+ */
41
+ private static rgbToHsl;
42
+ /**
43
+ * RGB 转 HSV。
44
+ * 返回 h:0-360, s/v:0-100
45
+ */
46
+ private static rgbToHsv;
47
+ /**
48
+ * 转换为 HEX(#RRGGBB)。
49
+ */
50
+ static toHex(color: string): string;
51
+ /**
52
+ * 转换为 HEXA(#RRGGBBAA)。
53
+ * alpha 不传时保留输入颜色中的透明度(默认 1)。
54
+ */
55
+ static toHexa(color: string, alpha?: number): string;
56
+ /**
57
+ * 转换为 RGB(rgb(r, g, b))。
58
+ */
59
+ static toRgb(color: string): string;
60
+ /**
61
+ * 转换为 RGBA(rgba(r, g, b, a))。
62
+ * alpha 不传时保留输入颜色中的透明度(默认 1)。
63
+ */
64
+ static toRgba(color: string, alpha?: number): string;
65
+ /**
66
+ * 转换为 HSL(hsl(h, s%, l%))。
67
+ */
68
+ static toHsl(color: string): string;
69
+ /**
70
+ * 转换为 HSLA(hsla(h, s%, l%, a))。
71
+ * alpha 不传时保留输入颜色中的透明度(默认 1)。
72
+ */
73
+ static toHsla(color: string, alpha?: number): string;
74
+ /**
75
+ * 转换为 HSV(hsv(h, s%, v%))。
76
+ */
77
+ static toHsv(color: string): string;
78
+ /**
79
+ * 转换为 HSVA(hsva(h, s%, v%, a))。
80
+ * alpha 不传时保留输入颜色中的透明度(默认 1)。
81
+ */
82
+ static toHsva(color: string, alpha?: number): string;
83
+ /**
84
+ * 返回解析后的 RGBA 对象。
85
+ * @param color 任意受支持的颜色字符串(hex/rgb/hsl/hsv)
86
+ * @returns {{ r: number; g: number; b: number; a: number }} RGBA 分量,r/g/b 范围 0-255,a 范围 0-1
87
+ */
88
+ static toRgbaObject(color: string): {
89
+ r: number;
90
+ g: number;
91
+ b: number;
92
+ a: number;
93
+ };
94
+ /**
95
+ * 判断两个颜色是否在允许的色差范围内(基于 RGB 欧几里得距离)。
96
+ * @param colorA 第一个颜色字符串
97
+ * @param colorB 第二个颜色字符串
98
+ * @param threshold 允许的最大色差值,范围约 0(完全相同)到 442(黑白最大距离),含 alpha 时上限约 510
99
+ * @param includeAlpha 是否将 alpha 差值纳入计算,默认 true;启用时 alpha 差值会缩放到 0-255 参与距离
100
+ * @returns true 表示在允许色差内
101
+ */
102
+ static isWithinColorDifference(colorA: string, colorB: string, threshold: number, includeAlpha?: boolean): boolean;
103
+ /**
104
+ * 混合两个颜色(在 RGBA 空间线性插值)。
105
+ * @param colorA 起始颜色
106
+ * @param colorB 终点颜色
107
+ * @param ratio 混合比例,0 = 完全 A,1 = 完全 B
108
+ * @returns 混合后的 rgba 字符串
109
+ */
110
+ static mix(colorA: string, colorB: string, ratio: number): string;
111
+ /**
112
+ * 转换为灰度(基于 ITU-R BT.709 权重)。
113
+ * @param color 任意受支持的颜色字符串
114
+ * @returns 灰度 rgb 字符串
115
+ */
116
+ static toGrayscale(color: string): string;
117
+ /**
118
+ * 计算 WCAG 2.0 相对亮度。
119
+ * @param color 任意受支持的颜色字符串
120
+ * @returns 相对亮度值,范围 [0, 1]
121
+ */
122
+ static luminance(color: string): number;
123
+ /**
124
+ * 计算 WCAG 2.0 对比度。
125
+ * @param colorA 第一个颜色
126
+ * @param colorB 第二个颜色
127
+ * @returns 对比度值,范围 [1, 21]
128
+ */
129
+ static contrastRatio(colorA: string, colorB: string): number;
130
+ /**
131
+ * 设置透明度并返回 rgba 字符串。
132
+ * @param color 任意受支持的颜色字符串
133
+ * @param alpha 目标透明度,范围 [0, 1]
134
+ * @returns rgba 字符串
135
+ */
136
+ static withAlpha(color: string, alpha: number): string;
137
+ }
@@ -1,2 +1,3 @@
1
1
  export * from './undoRedoHistory';
2
2
  export * from './shortcutKey';
3
+ export * from './colorConverter';
@@ -1,16 +1,3 @@
1
- /**
2
- * 全局快捷键管理:支持组合键、多步序列、作用域与输入框上下文过滤。
3
- *
4
- * @example
5
- * ```ts
6
- * const shortcuts = new _Utility_ShortcutManager();
7
- * shortcuts.bind("control+s,control+shift+s", {
8
- * callback: (e) => { e.preventDefault(); save(); },
9
- * sequenceDelimiter: ",",
10
- * chordDelimiter: "+",
11
- * });
12
- * ```
13
- */
14
1
  /** `bind` 时传入的配置项 */
15
2
  interface ShortcutOptions {
16
3
  /** 匹配成功后的回调 */
@@ -27,11 +14,30 @@ interface ShortcutOptions {
27
14
  timeout?: number;
28
15
  /** 为 `true` 时,在 input / textarea / contentEditable 内也响应快捷键 */
29
16
  enableInInput?: boolean;
17
+ /**
18
+ * 是否允许长按按键时重复触发回调,默认 `false`。
19
+ * 适用于如 `+`、`-`、方向键等需要连续操作的场景。
20
+ */
21
+ allowRepeat?: boolean;
22
+ /**
23
+ * 允许重复触发时的最小时间间隔(毫秒)。
24
+ * 由于操作系统的原生长按触发频率不可控且通常极高,利用该属性对重复事件进行节流。
25
+ */
26
+ repeatInterval?: number;
30
27
  }
31
28
  /**
32
- * 在 `window` 上监听键盘与鼠标事件,按配置触发快捷键回调。
29
+ * 全局快捷键管理器
30
+ *
31
+ * ⚠️ **注意**:本组件会在全局 `window` 上绑定多个事件监听器。
32
+ * 为了防止内存泄漏及非预期的快捷键触发,**在组件卸载或页面关闭时,必须显式调用 `.destroy()` 方法**。
33
+ *
34
+ * @example
35
+ * const manager = new _Utility_ShortcutManager();
36
+ * // 离开页面时
37
+ * manager.destroy();
33
38
  */
34
39
  export declare class _Utility_ShortcutManager {
40
+ private static activeInstances;
35
41
  /** 最近一次 `mousedown` 的目标,供 `scopeType: "click"` 使用 */
36
42
  private lastClickDom?;
37
43
  /** 最近一次 `mouseover` 的目标,供 `scopeType: "hover"` 使用 */
@@ -51,7 +57,11 @@ export declare class _Utility_ShortcutManager {
51
57
  bind(key: string | string[], options: ShortcutOptions): void;
52
58
  /** 移除指定 `key` 的绑定并清理其超时定时器 */
53
59
  unbind(key: string): void;
54
- /** 移除所有监听、清空状态,实例不可再使用 */
60
+ /**
61
+ * 彻底销毁当前实例,清空所有快捷键绑定,并移除全局 window 事件监听器。
62
+ *
63
+ * ⚠️ **调用时机**:在单页应用(如 Vue/React 组件卸载)或不需要快捷键时**务必调用**。
64
+ */
55
65
  destroy(): void;
56
66
  private handleMouseOver;
57
67
  private handleMouseDown;