uiik 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/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "uiik",
3
+ "version": "1.0.0",
4
+ "description": "A UI interaction kit includes draggable, splittable, rotatable, selectable, etc.",
5
+ "main": "index.js",
6
+ "module": "index.esm.js",
7
+ "types": "types/index.d.ts",
8
+ "author": "holyhigh2",
9
+ "license": "MIT",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/holyhigh2/uii"
13
+ },
14
+ "bugs": "https://github.com/holyhigh2/uii/issues/new",
15
+ "keywords": [
16
+ "js",
17
+ "dom",
18
+ "javascript",
19
+ "ui",
20
+ "interactions",
21
+ "draggable",
22
+ "splittable",
23
+ "rotatable",
24
+ "selectable",
25
+ "resizable",
26
+ "detector"
27
+ ],
28
+ "scripts": {
29
+ "build": "rollup --config",
30
+ "test": "rollup --config rollup.config.test.js --watch",
31
+ "doc": "npx typedoc"
32
+ },
33
+ "peerDependencies": {
34
+ "@holyhigh/func.js": ">=2.4"
35
+ },
36
+ "devDependencies": {
37
+ "@babel/core": "^7.12.3",
38
+ "@babel/eslint-parser": "^7.13",
39
+ "@rollup/plugin-babel": "^5.2.1",
40
+ "@rollup/plugin-commonjs": "^16.0.0",
41
+ "@rollup/plugin-eslint": "^8.0.0",
42
+ "@rollup/plugin-json": "^4.1.0",
43
+ "@rollup/plugin-node-resolve": "^10.0.0",
44
+ "@rollup/plugin-terser": "^0.3.0",
45
+ "eslint": "^7.23.0",
46
+ "eslint-config-google": "^0.14.0",
47
+ "rollup": "^2.33",
48
+ "rollup-plugin-banner2": "^1.0.0",
49
+ "rollup-plugin-clear": "2.0.7",
50
+ "rollup-plugin-copy": "^3.4.0",
51
+ "rollup-plugin-livereload": "^2.0.0",
52
+ "rollup-plugin-serve": "^1.1",
53
+ "rollup-plugin-typescript2": "0.34.1",
54
+ "rollup-pluginutils": "^2.8.2",
55
+ "tslib": "^2.4.0",
56
+ "typescript": "^4.8.2",
57
+ "typedoc": "^0.23.28",
58
+ "typedoc-plugin-markdown": "^3.14.0"
59
+ }
60
+ }
@@ -0,0 +1,34 @@
1
+ import { CollisionData, CollisionDetectorOptions } from "./types";
2
+ export declare class CollisionDetector {
3
+ #private;
4
+ targetsData: Array<CollisionData>;
5
+ el: Element;
6
+ elData: CollisionData;
7
+ opts: Record<string, any>;
8
+ constructor(el: string | HTMLElement, targets: (() => Array<HTMLElement>) | string | HTMLElement | Array<HTMLElement> | NodeList | HTMLCollection, opts?: CollisionDetectorOptions);
9
+ /**
10
+ * update targets data if them changed
11
+ */
12
+ update(): void;
13
+ /**
14
+ * detect targets and return overlaps
15
+ * @returns
16
+ */
17
+ getOverlaps(): Array<HTMLElement>;
18
+ getOverlaps(x1: number, y1: number, x2: number, y2: number): Array<HTMLElement>;
19
+ /**
20
+ * detect targets and return inclusions
21
+ * @returns
22
+ */
23
+ getInclusions(): Array<HTMLElement>;
24
+ getInclusions(x1: number, y1: number, x2: number, y2: number): Array<HTMLElement>;
25
+ }
26
+ /**
27
+ * create a detector for the el and return
28
+ * @param el element to be detected
29
+ * @param targets
30
+ * @param opts CollisionDetectorOptions
31
+ * @param opts.container a root element of targets
32
+ * @returns
33
+ */
34
+ export declare function newCollisionDetector(el: string | HTMLElement, targets: (() => Array<HTMLElement>) | string | HTMLElement | Array<HTMLElement> | NodeList | HTMLCollection, opts?: CollisionDetectorOptions): CollisionDetector;
@@ -0,0 +1,25 @@
1
+ import { DraggableOptions, Uii } from "./types";
2
+ /**
3
+ * 用于表示一个或多个可拖动元素的定义
4
+ * > 可用CSS接口
5
+ * - .uii-draggable
6
+ * - .uii-draggable-handle
7
+ * - .uii-draggable-active
8
+ * - .uii-draggable-ghost
9
+ * @public
10
+ */
11
+ export declare class Draggable extends Uii {
12
+ #private;
13
+ constructor(els: string | HTMLElement | Array<string | HTMLElement>, opts?: DraggableOptions);
14
+ /**
15
+ * @internal
16
+ */
17
+ onOptionChanged(opts: Record<string, any>): void;
18
+ }
19
+ /**
20
+ * create a draggable pattern for one or more elements with opts
21
+ * @param els selector string / html element
22
+ * @param opts
23
+ * @returns Draggable instance
24
+ */
25
+ export declare function newDraggable(els: string | HTMLElement | Array<string | HTMLElement>, opts?: DraggableOptions): Draggable;
@@ -0,0 +1,30 @@
1
+ import { DroppableOptions, Uii } from "./types";
2
+ /**
3
+ * 用于表示一个或多个可响应拖动元素的定义
4
+ * > 可用CSS接口
5
+ * - .uii-droppable
6
+ * @public
7
+ */
8
+ export declare class Droppable extends Uii {
9
+ #private;
10
+ constructor(el: string | HTMLElement | Array<string | HTMLElement>, opts?: DroppableOptions);
11
+ /**
12
+ * @internal
13
+ */
14
+ bindEvent(el: HTMLElement, opts: Record<string, any>): void;
15
+ /**
16
+ * @internal
17
+ */
18
+ active(target: HTMLElement): void;
19
+ /**
20
+ * @internal
21
+ */
22
+ deactive(target: HTMLElement): void;
23
+ }
24
+ /**
25
+ * Enable els to response to draggable objects
26
+ * @param els selector string / html element
27
+ * @param opts
28
+ * @returns
29
+ */
30
+ export declare function newDroppable(els: string | HTMLElement | Array<string | HTMLElement>, opts?: DroppableOptions): Droppable;
@@ -0,0 +1,25 @@
1
+ import { newSplittable } from './splittable';
2
+ import { newResizable } from './resizable';
3
+ import { newDraggable } from './draggable';
4
+ import { newDroppable } from './droppable';
5
+ import { newRotatable } from './rotatable';
6
+ import { newSelectable } from './selectable';
7
+ export * from './splittable';
8
+ export * from './resizable';
9
+ export * from './draggable';
10
+ export * from './droppable';
11
+ export * from './rotatable';
12
+ export * from './selectable';
13
+ export * from './detector';
14
+ export * from './types';
15
+ export declare const VERSION: string;
16
+ declare const _default: {
17
+ VERSION: string;
18
+ newSplittable: typeof newSplittable;
19
+ newResizable: typeof newResizable;
20
+ newDraggable: typeof newDraggable;
21
+ newDroppable: typeof newDroppable;
22
+ newRotatable: typeof newRotatable;
23
+ newSelectable: typeof newSelectable;
24
+ };
25
+ export default _default;
@@ -0,0 +1,19 @@
1
+ import { ResizableOptions, Uii } from './types';
2
+ /**
3
+ * 用于表示一个或多个可改变尺寸元素的定义
4
+ * > 可用CSS接口
5
+ * - .uii-resizable-handle
6
+ * - .uii-resizable-handle-[n/s/e/w/ne/nw/se/sw]
7
+ * - .uii-resizable-handle-active
8
+ * @public
9
+ */
10
+ export declare class Resizable extends Uii {
11
+ constructor(els: string | HTMLElement, opts?: ResizableOptions);
12
+ }
13
+ /**
14
+ * Make els resizable
15
+ * @param els selector string / html element
16
+ * @param opts
17
+ * @returns
18
+ */
19
+ export declare function newResizable(els: string | HTMLElement, opts?: ResizableOptions): Resizable;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * dom rotator
3
+ * @author holyhigh2
4
+ */
5
+ import { RotatableOptions, Uii } from './types';
6
+ /**
7
+ * 用于表示一个或多个可旋转元素的定义
8
+ * > 可用CSS接口
9
+ * - .uii-rotatable
10
+ * - .uii-rotatable-handle
11
+ * - .uii-rotatable-active
12
+ * @public
13
+ */
14
+ export declare class Rotatable extends Uii {
15
+ constructor(els: string | HTMLElement, opts?: RotatableOptions);
16
+ }
17
+ /**
18
+ * Make els rotatable
19
+ * @param els selector string / html element
20
+ * @param opts
21
+ * @returns
22
+ */
23
+ export declare function newRotatable(els: string | HTMLElement, opts?: RotatableOptions): Rotatable;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * selector
3
+ * @author holyhigh2
4
+ */
5
+ import { SelectableOptions, Uii } from "./types";
6
+ /**
7
+ * 用于表示一个元素选择器的定义
8
+ * > 可用CSS接口
9
+ * - .uii-selector
10
+ * - .uii-selecting
11
+ * - .uii-selected
12
+ * @public
13
+ */
14
+ export declare class Selectable extends Uii {
15
+ #private;
16
+ constructor(container: string | HTMLElement, opts?: SelectableOptions);
17
+ /**
18
+ * 更新targets
19
+ */
20
+ updateTargets(): void;
21
+ /**
22
+ * @internal
23
+ */
24
+ onOptionChanged(): void;
25
+ }
26
+ /**
27
+ * Add a selector into the container
28
+ * @param container css selector or html element
29
+ * @param opts
30
+ * @returns
31
+ */
32
+ export declare function newSelectable(container: string | HTMLElement, opts?: SelectableOptions): Selectable;
@@ -0,0 +1,23 @@
1
+ import { SplittableOptions, Uii } from './types';
2
+ /**
3
+ * 用于表示一个或多个分割器的定义
4
+ * > 可用CSS接口
5
+ * - .uii-splittable
6
+ * - .uii-splittable-handle
7
+ * - .uii-splittable-handle-ghost
8
+ * - .uii-splittable-handle-active
9
+ * - .uii-splittable-v
10
+ * - .uii-splittable-h
11
+ * @public
12
+ */
13
+ export declare class Splittable extends Uii {
14
+ #private;
15
+ constructor(container: string | HTMLElement, opts?: SplittableOptions);
16
+ }
17
+ /**
18
+ * Add one or more splittors into the container
19
+ * @param container css selector or html element
20
+ * @param opts SplittableOptions
21
+ * @returns
22
+ */
23
+ export declare function newSplittable(container: string | HTMLElement, opts?: SplittableOptions): Splittable;
@@ -0,0 +1,320 @@
1
+ /**
2
+ * A Base class for all Uii classes
3
+ */
4
+ export declare abstract class Uii {
5
+ #private;
6
+ /**
7
+ * 处理过的dom元素数组
8
+ */
9
+ protected ele: Array<HTMLElement>;
10
+ /**
11
+ * 当前uii对象的选项
12
+ */
13
+ protected opts: Record<string, any>;
14
+ protected enabled: boolean;
15
+ constructor(ele: string | HTMLElement | NodeList | HTMLCollection | Array<string | HTMLElement>, opts?: Record<string, any>);
16
+ /**
17
+ * 销毁uii对象,包括卸载事件、清空元素等
18
+ */
19
+ destroy(): void;
20
+ /**
21
+ * 注册事件,以便在{@link destroy}方法中卸载
22
+ * @param el dom元素
23
+ * @param event 事件名
24
+ * @param hook 回调函数
25
+ * @param useCapture 默认false
26
+ */
27
+ protected registerEvent(el: HTMLElement, event: string, hook: Function, useCapture?: boolean): void;
28
+ /**
29
+ * 禁用uii实例,禁用后的dom不会响应事件
30
+ */
31
+ disable(): void;
32
+ /**
33
+ * 启用uii实例
34
+ */
35
+ enable(): void;
36
+ /**
37
+ * 获取uii实例选项对象
38
+ */
39
+ getOption(): Record<string, any>;
40
+ /**
41
+ * 一次设置多个选项值。触发`onOptionChanged`
42
+ * @param options
43
+ */
44
+ setOptions(options?: Record<string, any>): void;
45
+ /**
46
+ * 设置指定name的选项值。触发`onOptionChanged`
47
+ * @param name
48
+ * @param value
49
+ */
50
+ setOption(name: string, value: any): void;
51
+ /**
52
+ * @internal
53
+ */
54
+ protected onOptionChanged(opts?: Record<string, any>): void;
55
+ }
56
+ export type ResizableOptions = {
57
+ /**
58
+ * handle的宽高,默认8
59
+ */
60
+ handleSize?: number;
61
+ /**
62
+ * 拖动元素的最小size,如果是数组,表示 [width,height]
63
+ */
64
+ minSize?: number | Array<number>;
65
+ /**
66
+ * 拖动元素的最大size,如果是数组,表示 [width,height]
67
+ */
68
+ maxSize?: number | Array<number>;
69
+ /**
70
+ * resizable方向,默认[n,s,e,w,ne,nw,se,sw]
71
+ */
72
+ dir?: string[];
73
+ /**
74
+ * handle所在元素的位置偏移,负数向内,正数向外。默认0
75
+ */
76
+ offset?: number;
77
+ /**
78
+ * 宽高比,小数
79
+ */
80
+ aspectRatio?: number;
81
+ /**
82
+ * 开启ghost模式后,拖动元素时会自动创建元素副本并拖动副本,当拖动结束后,副本销毁并且元素移动到最后位置。默认false
83
+ */
84
+ ghost?: boolean | Function;
85
+ ghostClass?: string;
86
+ onStart?: (w: number, h: number) => void;
87
+ onResize?: (w: number, h: number) => void;
88
+ onEnd?: (w: number, h: number) => void;
89
+ onClone?: (cloneDom: HTMLElement, ev: MouseEvent) => void;
90
+ };
91
+ export type SplittableOptions = {
92
+ /**
93
+ * handle宽/高,默认10
94
+ */
95
+ handleSize?: number;
96
+ /**
97
+ * 最小区域,如果是数组可以按顺序定义分割区域,默认0
98
+ */
99
+ minSize?: number | number[];
100
+ /**
101
+ * 单边模式,只修改单侧元素size,用于flex布局。可选值为 start/end
102
+ */
103
+ oneSideMode?: 'start' | 'end';
104
+ /**
105
+ * 粘性吸附,如果是数组可以按顺序定义分割区域。设置minSize后生效
106
+ */
107
+ sticky?: boolean | boolean[];
108
+ /**
109
+ * 自动创建的handle是否在元素内部插入,默认false
110
+ */
111
+ inside?: boolean;
112
+ /**
113
+ * 开启ghost模式后,拖动元素时会自动创建元素副本并拖动副本,当拖动结束后,副本销毁且元素移动到最后位置。默认false
114
+ */
115
+ ghost?: boolean;
116
+ ghostClass?: string;
117
+ /**
118
+ * 自定义handle选择器,多个使用空格分隔。handle元素可以是与分割元素平级或在分割元素内
119
+ */
120
+ handle?: string;
121
+ onStart?: (size1: number, size2: number) => void;
122
+ onSplit?: (size1: number, size2: number) => void;
123
+ onEnd?: (size1: number, size2: number) => void;
124
+ onSticky?: (size1: number, size2: number, position: 'start' | 'end' | 'none') => void;
125
+ onClone?: (cloneDom: HTMLElement, ev: MouseEvent) => void;
126
+ };
127
+ export type DraggableOptions = {
128
+ /**
129
+ * 限制活动范围,默认false
130
+ */
131
+ container?: boolean;
132
+ /**
133
+ * 拖动起始阈值,默认0
134
+ */
135
+ threshold?: number;
136
+ /**
137
+ * 实际响应拖动的元素选择器,字符串
138
+ */
139
+ handle?: string;
140
+ /**
141
+ * 禁止触发元素的css选择器
142
+ */
143
+ filter?: string;
144
+ /**
145
+ * 拖动目标,dom/selector数组,用于拖动交互事件
146
+ */
147
+ droppable?: (() => NodeList | HTMLCollection | HTMLElement[]) | string | HTMLElement | HTMLElement[];
148
+ /**
149
+ * 开启ghost模式后,拖动元素时会自动创建元素副本并拖动副本,当拖动结束后,副本销毁并且元素移动到最后位置。默认false,支持函数返回副本元素
150
+ */
151
+ ghost?: ((el: HTMLElement) => HTMLElement) | boolean;
152
+ ghostClass?: string;
153
+ /**
154
+ * 传递v/h可实现单向拖动。默认''
155
+ */
156
+ direction?: 'v' | 'h';
157
+ /**
158
+ * 是否在鼠标到达容器边缘时自动滚动,默认true
159
+ */
160
+ scroll?: boolean;
161
+ /**
162
+ * 滚动速度,默认10
163
+ */
164
+ scrollSpeed?: number;
165
+ /**
166
+ * 拖动时元素的zIndex
167
+ */
168
+ zIndex?: number;
169
+ /**
170
+ * 可将不同的拖动元素编为一组,拖动时会自动管理zIndex
171
+ */
172
+ group?: string;
173
+ /**
174
+ * 拖动时应用的class样式,多个使用空格分开
175
+ */
176
+ classes?: string;
177
+ /**
178
+ * 拖动元素可自动吸附的目标元素选择器。字符串
179
+ */
180
+ snap?: string;
181
+ snapOptions?: {
182
+ /**
183
+ * 吸附元素的移动误差,默认10
184
+ */
185
+ tolerance: number;
186
+ };
187
+ /**
188
+ * 拖动时元素左上角距离指针的距离,支持百分比及负数
189
+ */
190
+ cursorAt?: {
191
+ left: number | string;
192
+ top: number | string;
193
+ };
194
+ /**
195
+ * 可定义拖动时不同状态下的指针,默认move
196
+ */
197
+ cursor?: {
198
+ default?: string;
199
+ active?: string;
200
+ over?: string;
201
+ };
202
+ /**
203
+ * 网格拖动模式,每次移动指定的网格大小。数字或数字数组
204
+ */
205
+ grid?: number | number[];
206
+ /**
207
+ * 拖动类型标识,用于droppable识别交互类型
208
+ */
209
+ type?: string;
210
+ onStart?: (dragDom: HTMLElement, ev: MouseEvent) => void;
211
+ /**
212
+ * 拖动中调用,返回false阻止dom移动
213
+ * @param dragDom
214
+ * @param ev
215
+ * @param offsetX
216
+ * @param offsetY
217
+ * @returns
218
+ */
219
+ onDrag?: (dragDom: HTMLElement, ev: MouseEvent, offsetX: number, offsetY: number, x: number, y: number) => (boolean | void);
220
+ /**
221
+ * 拖动结束后调用,返回false阻止ghost模式下的dom移动
222
+ * @param dragDom
223
+ * @param ev
224
+ * @returns
225
+ */
226
+ onEnd?: (dragDom: HTMLElement, ev: MouseEvent) => (boolean | void);
227
+ onClone?: (cloneDom: HTMLElement, ev: MouseEvent) => void;
228
+ onSnap?: (el: HTMLElement, targetH: HTMLElement, targetV: HTMLElement, hDir: string, vDir: string) => void;
229
+ };
230
+ export type DroppableOptions = {
231
+ /**
232
+ * 当accepts的draggable对象开始拖动时,自动设置该样式。多个样式使用空格分隔
233
+ */
234
+ activeClass?: string;
235
+ /**
236
+ * 当accepts的draggable对象拖动到droppable元素上时,自动设置该样式。多个样式使用空格分隔
237
+ */
238
+ hoverClass?: string;
239
+ /**
240
+ * 定义哪些draggable元素进行交互。如果是字符串,支持不同Draggable对象进行编组
241
+ */
242
+ accepts?: ((ele: Array<HTMLElement>, draggable: HTMLElement) => boolean) | string;
243
+ /**
244
+ * 当accepts的draggable对象开始拖动时触发
245
+ * @param draggable
246
+ * @param ele
247
+ * @returns
248
+ */
249
+ onActive?: (draggable: HTMLElement, ele: Array<HTMLElement>) => void;
250
+ onEnter?: (el: HTMLElement, ev: MouseEvent) => void;
251
+ onOver?: (el: HTMLElement, ev: MouseEvent) => void;
252
+ onLeave?: (el: HTMLElement, ev: MouseEvent) => void;
253
+ onDrop?: (el: HTMLElement, ev: MouseEvent) => void;
254
+ /**
255
+ * 当accepts的draggable对象结束拖动时触发
256
+ * @param draggable
257
+ * @param ele
258
+ * @returns
259
+ */
260
+ onDeactive?: (draggable: HTMLElement, ele: Array<HTMLElement>) => void;
261
+ };
262
+ export type RotatableOptions = {
263
+ /**
264
+ * 可定义拖动时不同状态下的指针,默认crosshair
265
+ */
266
+ cursor?: {
267
+ default?: string;
268
+ active?: string;
269
+ };
270
+ onStart?: (deg: number) => {};
271
+ onRotate?: (deg: number) => {};
272
+ onEnd?: (deg: number) => {};
273
+ };
274
+ export type SelectableOptions = {
275
+ /**
276
+ * 选择器样式字符串,多个使用空格分隔
277
+ */
278
+ class?: string;
279
+ /**
280
+ * 选择器拖动进行中,被选中元素应用的样式字符串,多个使用空格分隔
281
+ */
282
+ selectingClass?: string;
283
+ /**
284
+ * 选择器拖动结束后,被选中元素应用的样式字符串,多个使用空格分隔
285
+ */
286
+ selectedClass?: string;
287
+ /**
288
+ * 容器中可选择的元素。可以是选择器字符串或返回元素数组的函数
289
+ */
290
+ targets?: (() => NodeList | HTMLCollection | HTMLElement[]) | string;
291
+ onStart?: (target: HTMLElement) => void;
292
+ onSelect?: (selection: HTMLElement[]) => void;
293
+ onEnd?: (selection: HTMLElement[]) => void;
294
+ /**
295
+ * 选择模式,默认overlap
296
+ */
297
+ mode?: 'overlap' | 'inclusion';
298
+ /**
299
+ * 是否在鼠标到达容器边缘时自动滚动,默认true
300
+ */
301
+ scroll?: boolean;
302
+ /**
303
+ * 滚动速度,默认10
304
+ */
305
+ scrollSpeed?: number;
306
+ /**
307
+ * 禁止触发元素的css选择器或校验函数,函数返回true表示需要过滤
308
+ */
309
+ filter?: ((el: HTMLElement) => boolean) | string;
310
+ };
311
+ export type CollisionDetectorOptions = {
312
+ container?: Element;
313
+ };
314
+ export type CollisionData = {
315
+ x1: number;
316
+ y1: number;
317
+ x2: number;
318
+ y2: number;
319
+ el?: HTMLElement;
320
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 工具包
3
+ * @author holyhigh2
4
+ */
5
+ /**
6
+ * 获取child相对于parent的offset信息。含border宽度
7
+ * @returns
8
+ */
9
+ export declare function getOffset(child: HTMLElement, parent?: HTMLElement): {
10
+ x: number;
11
+ y: number;
12
+ };
13
+ /**
14
+ * 边缘检测最小内部边距
15
+ */
16
+ export declare const EDGE_THRESHOLD = 5;
17
+ export declare const DRAGGING_RULE = "body * { pointer-events: none; }";
18
+ export declare function lockPage(): void;
19
+ export declare function unlockPage(): void;