@thienvu18/designable-shared 2.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/LICENSE.md +20 -0
- package/README.md +1 -0
- package/esm/animation.d.ts +2 -0
- package/esm/animation.js +33 -0
- package/esm/array.d.ts +37 -0
- package/esm/array.js +111 -0
- package/esm/clone.d.ts +4 -0
- package/esm/clone.js +97 -0
- package/esm/compose.d.ts +1 -0
- package/esm/compose.js +7 -0
- package/esm/coordinate.d.ts +106 -0
- package/esm/coordinate.js +473 -0
- package/esm/element.d.ts +6 -0
- package/esm/element.js +135 -0
- package/esm/event.d.ts +96 -0
- package/esm/event.js +212 -0
- package/esm/globalThisPolyfill.d.ts +1 -0
- package/esm/globalThisPolyfill.js +22 -0
- package/esm/index.d.ts +17 -0
- package/esm/index.js +17 -0
- package/esm/instanceof.d.ts +1 -0
- package/esm/instanceof.js +11 -0
- package/esm/keycode.d.ts +147 -0
- package/esm/keycode.js +150 -0
- package/esm/lru.d.ts +73 -0
- package/esm/lru.js +293 -0
- package/esm/observer.d.ts +9 -0
- package/esm/observer.js +43 -0
- package/esm/request-idle.d.ts +10 -0
- package/esm/request-idle.js +8 -0
- package/esm/scroller.d.ts +10 -0
- package/esm/scroller.js +82 -0
- package/esm/subscribable.d.ts +14 -0
- package/esm/subscribable.js +48 -0
- package/esm/types.d.ts +13 -0
- package/esm/types.js +21 -0
- package/esm/uid.d.ts +1 -0
- package/esm/uid.js +9 -0
- package/lib/animation.d.ts +2 -0
- package/lib/animation.js +38 -0
- package/lib/array.d.ts +37 -0
- package/lib/array.js +125 -0
- package/lib/clone.d.ts +4 -0
- package/lib/clone.js +102 -0
- package/lib/compose.d.ts +1 -0
- package/lib/compose.js +11 -0
- package/lib/coordinate.d.ts +106 -0
- package/lib/coordinate.js +502 -0
- package/lib/element.d.ts +6 -0
- package/lib/element.js +143 -0
- package/lib/event.d.ts +96 -0
- package/lib/event.js +217 -0
- package/lib/globalThisPolyfill.d.ts +1 -0
- package/lib/globalThisPolyfill.js +25 -0
- package/lib/index.d.ts +17 -0
- package/lib/index.js +33 -0
- package/lib/instanceof.d.ts +1 -0
- package/lib/instanceof.js +15 -0
- package/lib/keycode.d.ts +147 -0
- package/lib/keycode.js +154 -0
- package/lib/lru.d.ts +73 -0
- package/lib/lru.js +297 -0
- package/lib/observer.d.ts +9 -0
- package/lib/observer.js +47 -0
- package/lib/request-idle.d.ts +10 -0
- package/lib/request-idle.js +13 -0
- package/lib/scroller.d.ts +10 -0
- package/lib/scroller.js +88 -0
- package/lib/subscribable.d.ts +14 -0
- package/lib/subscribable.js +52 -0
- package/lib/types.d.ts +13 -0
- package/lib/types.js +29 -0
- package/lib/uid.d.ts +1 -0
- package/lib/uid.js +13 -0
- package/package.json +36 -0
package/lib/scroller.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scrollAnimate = exports.updateScrollValue = exports.calcAutoScrollBasicInfo = void 0;
|
|
4
|
+
const animation_1 = require("./animation");
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
const MAX_SPEED = 80; // px/s
|
|
7
|
+
const calcAutoScrollBasicInfo = (point, axis, viewport, maxSpeed = MAX_SPEED) => {
|
|
8
|
+
const { left, right, top, bottom } = viewport;
|
|
9
|
+
const { x, y } = point;
|
|
10
|
+
let begin;
|
|
11
|
+
let end;
|
|
12
|
+
let pos;
|
|
13
|
+
let speedFactor;
|
|
14
|
+
if (axis === 'x') {
|
|
15
|
+
begin = left;
|
|
16
|
+
end = right;
|
|
17
|
+
pos = x;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
begin = top;
|
|
21
|
+
end = bottom;
|
|
22
|
+
pos = y;
|
|
23
|
+
}
|
|
24
|
+
const scrollerSize = end - begin;
|
|
25
|
+
const moveDistance = scrollerSize > 400 ? 100 : scrollerSize / 3;
|
|
26
|
+
if (end - pos < moveDistance) {
|
|
27
|
+
return {
|
|
28
|
+
direction: 'end',
|
|
29
|
+
speedFactor,
|
|
30
|
+
speed: maxSpeed * (0, animation_1.calcSpeedFactor)(end - pos, moveDistance),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
else if (pos - begin < moveDistance) {
|
|
34
|
+
return {
|
|
35
|
+
direction: 'begin',
|
|
36
|
+
speedFactor,
|
|
37
|
+
speed: maxSpeed * (0, animation_1.calcSpeedFactor)(pos - begin, moveDistance),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
};
|
|
42
|
+
exports.calcAutoScrollBasicInfo = calcAutoScrollBasicInfo;
|
|
43
|
+
const updateScrollValue = (element, axis, value, callback) => {
|
|
44
|
+
if (element) {
|
|
45
|
+
if (!(0, types_1.isWindow)(element)) {
|
|
46
|
+
if (axis === 'x') {
|
|
47
|
+
if (element.scrollLeft + value > element.scrollWidth)
|
|
48
|
+
return;
|
|
49
|
+
element.scrollLeft += value;
|
|
50
|
+
if ((0, types_1.isFn)(callback)) {
|
|
51
|
+
callback(element.scrollLeft);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
if (element.scrollTop + value > element.scrollHeight)
|
|
56
|
+
return;
|
|
57
|
+
element.scrollTop += value;
|
|
58
|
+
if ((0, types_1.isFn)(callback)) {
|
|
59
|
+
callback(element.scrollTop);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
if (axis === 'x') {
|
|
65
|
+
element.scrollBy({
|
|
66
|
+
left: value,
|
|
67
|
+
behavior: 'smooth',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
element.scrollBy({
|
|
72
|
+
top: value,
|
|
73
|
+
behavior: 'smooth',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if ((0, types_1.isFn)(callback)) {
|
|
77
|
+
callback(value);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
exports.updateScrollValue = updateScrollValue;
|
|
83
|
+
const scrollAnimate = (element, axis, direction, speed, callback) => {
|
|
84
|
+
return (0, animation_1.createUniformSpeedAnimation)(speed, (delta) => {
|
|
85
|
+
(0, exports.updateScrollValue)(element, axis, direction === 'begin' ? 0 - delta : delta, callback);
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
exports.scrollAnimate = scrollAnimate;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
declare const UNSUBSCRIBE_ID_SYMBOL: unique symbol;
|
|
2
|
+
export interface ISubscriber<Payload = any> {
|
|
3
|
+
(payload: Payload): void | boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare class Subscribable<ExtendsType = any> {
|
|
6
|
+
private subscribers;
|
|
7
|
+
dispatch<T extends ExtendsType = any>(event: T, context?: any): boolean;
|
|
8
|
+
subscribe(subscriber: ISubscriber): {
|
|
9
|
+
(): void;
|
|
10
|
+
[UNSUBSCRIBE_ID_SYMBOL]: number;
|
|
11
|
+
};
|
|
12
|
+
unsubscribe: (id?: number | string | (() => void)) => void;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Subscribable = void 0;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
const UNSUBSCRIBE_ID_SYMBOL = Symbol('UNSUBSCRIBE_ID_SYMBOL');
|
|
6
|
+
class Subscribable {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.subscribers = {
|
|
9
|
+
index: 0,
|
|
10
|
+
};
|
|
11
|
+
this.unsubscribe = (id) => {
|
|
12
|
+
if (id === undefined || id === null) {
|
|
13
|
+
for (const key in this.subscribers) {
|
|
14
|
+
this.unsubscribe(key);
|
|
15
|
+
}
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (!(0, types_1.isFn)(id)) {
|
|
19
|
+
delete this.subscribers[id];
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
delete this.subscribers[id[UNSUBSCRIBE_ID_SYMBOL]];
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
dispatch(event, context) {
|
|
27
|
+
let interrupted = false;
|
|
28
|
+
for (const key in this.subscribers) {
|
|
29
|
+
if ((0, types_1.isFn)(this.subscribers[key])) {
|
|
30
|
+
event['context'] = context;
|
|
31
|
+
if (this.subscribers[key](event) === false) {
|
|
32
|
+
interrupted = true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return interrupted ? false : true;
|
|
37
|
+
}
|
|
38
|
+
subscribe(subscriber) {
|
|
39
|
+
let id;
|
|
40
|
+
if ((0, types_1.isFn)(subscriber)) {
|
|
41
|
+
id = this.subscribers.index + 1;
|
|
42
|
+
this.subscribers[id] = subscriber;
|
|
43
|
+
this.subscribers.index++;
|
|
44
|
+
}
|
|
45
|
+
const unsubscribe = () => {
|
|
46
|
+
this.unsubscribe(id);
|
|
47
|
+
};
|
|
48
|
+
unsubscribe[UNSUBSCRIBE_ID_SYMBOL] = id;
|
|
49
|
+
return unsubscribe;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.Subscribable = Subscribable;
|
package/lib/types.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const getType: (obj: any) => any;
|
|
2
|
+
export declare const isFn: (obj: unknown) => obj is (...args: any[]) => any;
|
|
3
|
+
export declare const isWindow: (obj: unknown) => obj is Window;
|
|
4
|
+
export declare const isHTMLElement: (obj: any) => obj is HTMLElement;
|
|
5
|
+
export declare const isArr: (arg: any) => arg is any[];
|
|
6
|
+
export declare const isPlainObj: (obj: unknown) => obj is object;
|
|
7
|
+
export declare const isStr: (obj: unknown) => obj is string;
|
|
8
|
+
export declare const isBool: (obj: unknown) => obj is boolean;
|
|
9
|
+
export declare const isNum: (obj: unknown) => obj is number;
|
|
10
|
+
export declare const isObj: (val: unknown) => val is object;
|
|
11
|
+
export declare const isRegExp: (obj: unknown) => obj is RegExp;
|
|
12
|
+
export declare const isValid: (val: any) => boolean;
|
|
13
|
+
export declare const isValidNumber: (val: any) => val is number;
|
package/lib/types.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isValidNumber = exports.isValid = exports.isRegExp = exports.isObj = exports.isNum = exports.isBool = exports.isStr = exports.isPlainObj = exports.isArr = exports.isHTMLElement = exports.isWindow = exports.isFn = exports.getType = void 0;
|
|
4
|
+
const isType = (type) => (obj) => obj != null &&
|
|
5
|
+
(Array.isArray(type) ? type : [type]).some((t) => (0, exports.getType)(obj) === `[object ${t}]`);
|
|
6
|
+
const getType = (obj) => Object.prototype.toString.call(obj);
|
|
7
|
+
exports.getType = getType;
|
|
8
|
+
exports.isFn = isType([
|
|
9
|
+
'Function',
|
|
10
|
+
'AsyncFunction',
|
|
11
|
+
'GeneratorFunction',
|
|
12
|
+
]);
|
|
13
|
+
exports.isWindow = isType('Window');
|
|
14
|
+
const isHTMLElement = (obj) => {
|
|
15
|
+
return obj?.['nodeName'] || obj?.['tagName'];
|
|
16
|
+
};
|
|
17
|
+
exports.isHTMLElement = isHTMLElement;
|
|
18
|
+
exports.isArr = Array.isArray;
|
|
19
|
+
exports.isPlainObj = isType('Object');
|
|
20
|
+
exports.isStr = isType('String');
|
|
21
|
+
exports.isBool = isType('Boolean');
|
|
22
|
+
exports.isNum = isType('Number');
|
|
23
|
+
const isObj = (val) => typeof val === 'object';
|
|
24
|
+
exports.isObj = isObj;
|
|
25
|
+
exports.isRegExp = isType('RegExp');
|
|
26
|
+
const isValid = (val) => val !== null && val !== undefined;
|
|
27
|
+
exports.isValid = isValid;
|
|
28
|
+
const isValidNumber = (val) => !isNaN(val) && (0, exports.isNum)(val);
|
|
29
|
+
exports.isValidNumber = isValidNumber;
|
package/lib/uid.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function uid(len?: number): string;
|
package/lib/uid.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.uid = void 0;
|
|
4
|
+
let IDX = 36, HEX = '';
|
|
5
|
+
while (IDX--)
|
|
6
|
+
HEX += IDX.toString(36);
|
|
7
|
+
function uid(len) {
|
|
8
|
+
let str = '', num = len || 11;
|
|
9
|
+
while (num--)
|
|
10
|
+
str += HEX[(Math.random() * 36) | 0];
|
|
11
|
+
return str;
|
|
12
|
+
}
|
|
13
|
+
exports.uid = uid;
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@thienvu18/designable-shared",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"module": "esm/index.js",
|
|
7
|
+
"types": "esm/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"lib",
|
|
10
|
+
"esm",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE.md"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=20 <25"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/thienvu18/designable.git"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/thienvu18/designable/issues"
|
|
23
|
+
},
|
|
24
|
+
"homepage": "https://github.com/thienvu18/designable#readme",
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "rimraf -rf lib esm && npm run build:cjs && npm run build:esm",
|
|
27
|
+
"build:cjs": "tsc --project tsconfig.build.json --outDir lib",
|
|
28
|
+
"build:esm": "tsc --project tsconfig.build.json --module es2020 --outDir esm"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"requestidlecallback": "^0.3.0"
|
|
35
|
+
}
|
|
36
|
+
}
|