@operato/utils 8.1.0 → 9.0.0-beta.10
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/CHANGELOG.md +76 -7
- package/dist/src/async-lock.js +12 -1
- package/dist/src/async-lock.js.map +1 -1
- package/dist/src/context-path.d.ts +0 -1
- package/dist/src/context-path.js +3 -4
- package/dist/src/context-path.js.map +1 -1
- package/dist/src/gesture-helper.d.ts +35 -0
- package/dist/src/gesture-helper.js +152 -0
- package/dist/src/gesture-helper.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mixins/gesture-mixin.d.ts +393 -0
- package/dist/src/mixins/gesture-mixin.js +154 -0
- package/dist/src/mixins/gesture-mixin.js.map +1 -0
- package/dist/src/mixins/index.d.ts +1 -0
- package/dist/src/mixins/index.js +1 -0
- package/dist/src/mixins/index.js.map +1 -1
- package/dist/src/mixins/infinite-scrollable.js +30 -20
- package/dist/src/mixins/infinite-scrollable.js.map +1 -1
- package/dist/src/reactive-controllers/tooltip-reactive-controller.js +56 -23
- package/dist/src/reactive-controllers/tooltip-reactive-controller.js.map +1 -1
- package/dist/src/timecapsule/snapshot-taker.d.ts +1 -1
- package/dist/src/timecapsule/snapshot-taker.js +25 -3
- package/dist/src/timecapsule/snapshot-taker.js.map +1 -1
- package/dist/src/timecapsule/timecapsule.d.ts +1 -1
- package/dist/src/timecapsule/timecapsule.js +25 -5
- package/dist/src/timecapsule/timecapsule.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -10
package/CHANGELOG.md
CHANGED
@@ -3,16 +3,60 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
5
5
|
|
6
|
-
## [
|
6
|
+
## [9.0.0-beta.10](https://github.com/hatiolab/operato/compare/v9.0.0-beta.9...v9.0.0-beta.10) (2025-01-25)
|
7
7
|
|
8
8
|
|
9
|
-
### :
|
9
|
+
### :bug: Bug Fix
|
10
|
+
|
11
|
+
* tweak tsconfig.json ([3c424b1](https://github.com/hatiolab/operato/commit/3c424b18d046f95d5619076d113d49a4b4dc9bbb))
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
## [9.0.0-beta.6](https://github.com/hatiolab/operato/compare/v9.0.0-beta.5...v9.0.0-beta.6) (2025-01-20)
|
16
|
+
|
17
|
+
|
18
|
+
### :bug: Bug Fix
|
19
|
+
|
20
|
+
* esm module ([9642b97](https://github.com/hatiolab/operato/commit/9642b97650623d9ce71f6db0fd1995a2379205b5))
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
## [9.0.0-beta.4](https://github.com/hatiolab/operato/compare/v9.0.0-beta.3...v9.0.0-beta.4) (2025-01-20)
|
25
|
+
|
26
|
+
|
27
|
+
### :bug: Bug Fix
|
28
|
+
|
29
|
+
* esm module ([0402232](https://github.com/hatiolab/operato/commit/04022327fa47eac64eaf3c56eeec55b9ace13e0e))
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
## [9.0.0-beta.0](https://github.com/hatiolab/operato/compare/v8.0.0-beta.11...v9.0.0-beta.0) (2025-01-13)
|
34
|
+
|
35
|
+
**Note:** Version bump only for package @operato/utils
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
## [8.0.0-beta.2](https://github.com/hatiolab/operato/compare/v8.0.0-beta.1...v8.0.0-beta.2) (2025-01-08)
|
42
|
+
|
43
|
+
|
44
|
+
### :bug: Bug Fix
|
45
|
+
|
46
|
+
* typo .npmignore ([d9c0c8c](https://github.com/hatiolab/operato/commit/d9c0c8c79abc688c3c2cfb6c37fcb689483a5977))
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
## [8.0.0-beta.1](https://github.com/hatiolab/operato/compare/v8.0.0-beta.0...v8.0.0-beta.1) (2025-01-08)
|
51
|
+
|
52
|
+
|
53
|
+
### :bug: Bug Fix
|
10
54
|
|
11
|
-
*
|
55
|
+
* missing .npmignore ([be05985](https://github.com/hatiolab/operato/commit/be05985abfae4af53501f718dd52932099f7fbcb))
|
12
56
|
|
13
57
|
|
14
58
|
|
15
|
-
## [8.0.0](https://github.com/hatiolab/operato/compare/
|
59
|
+
## [8.0.0-beta.0](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.56...v8.0.0-beta.0) (2025-01-07)
|
16
60
|
|
17
61
|
**Note:** Version bump only for package @operato/utils
|
18
62
|
|
@@ -20,13 +64,38 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
|
|
20
64
|
|
21
65
|
|
22
66
|
|
23
|
-
|
67
|
+
## [8.0.0-alpha.37](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.36...v8.0.0-alpha.37) (2024-10-20)
|
24
68
|
|
25
69
|
|
26
70
|
### :bug: Bug Fix
|
27
71
|
|
28
|
-
*
|
29
|
-
*
|
72
|
+
* pointer-event & pointer-event for ox-image-marker ([c503d0a](https://github.com/hatiolab/operato/commit/c503d0a235ddadd97fdcd84ae98a303a7ffe7a6f))
|
73
|
+
* update dev-dependencies version ([d6fe342](https://github.com/hatiolab/operato/commit/d6fe342de738c6bad3528550a862b5a1d2573161))
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
## [8.0.0-alpha.33](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.32...v8.0.0-alpha.33) (2024-10-14)
|
78
|
+
|
79
|
+
**Note:** Version bump only for package @operato/utils
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
## [8.0.0-alpha.29](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.28...v8.0.0-alpha.29) (2024-10-10)
|
86
|
+
|
87
|
+
|
88
|
+
### :bug: Bug Fix
|
89
|
+
|
90
|
+
* apply pointer-event ([ecc73a1](https://github.com/hatiolab/operato/commit/ecc73a1d2df0d8ce7ba462965062a91461c504c3))
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
## [8.0.0-alpha.0](https://github.com/hatiolab/operato/compare/v7.1.1...v8.0.0-alpha.0) (2024-09-01)
|
95
|
+
|
96
|
+
**Note:** Version bump only for package @operato/utils
|
97
|
+
|
98
|
+
|
30
99
|
|
31
100
|
|
32
101
|
|
package/dist/src/async-lock.js
CHANGED
@@ -9,7 +9,18 @@ export class AsyncLock {
|
|
9
9
|
* @param {boolean} [lock=false] - Optional parameter to lock the instance immediately upon creation.
|
10
10
|
*/
|
11
11
|
constructor(lock = false) {
|
12
|
-
|
12
|
+
Object.defineProperty(this, "unlock", {
|
13
|
+
enumerable: true,
|
14
|
+
configurable: true,
|
15
|
+
writable: true,
|
16
|
+
value: void 0
|
17
|
+
});
|
18
|
+
Object.defineProperty(this, "promise", {
|
19
|
+
enumerable: true,
|
20
|
+
configurable: true,
|
21
|
+
writable: true,
|
22
|
+
value: new Promise(resolve => (this.unlock = resolve))
|
23
|
+
});
|
13
24
|
if (lock) {
|
14
25
|
this.lock();
|
15
26
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"async-lock.js","sourceRoot":"","sources":["../../src/async-lock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,SAAS;IAIpB;;;;OAIG;IACH,YAAY,OAAgB,KAAK;
|
1
|
+
{"version":3,"file":"async-lock.js","sourceRoot":"","sources":["../../src/async-lock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,SAAS;IAIpB;;;;OAIG;IACH,YAAY,OAAgB,KAAK;QARjC;;;;;WAAY;QACZ;;;;mBAAW,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;WAAA;QAQxD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,EAAE,CAAA;QACb,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAA;IAChE,CAAC;CACF","sourcesContent":["/**\n * A simple asynchronous lock utility class that allows controlling access to a critical section.\n * It provides a mechanism to create a lock and wait for its release using promises.\n */\nexport class AsyncLock {\n unlock?: any\n promise? = new Promise(resolve => (this.unlock = resolve))\n\n /**\n * Creates an instance of the AsyncLock class.\n *\n * @param {boolean} [lock=false] - Optional parameter to lock the instance immediately upon creation.\n */\n constructor(lock: boolean = false) {\n if (lock) {\n this.lock()\n }\n }\n\n /**\n * Locks the instance, making it awaitable until unlocked.\n * A new promise is created for the lock, and the existing unlock function is replaced with a new one.\n */\n lock() {\n this.promise = new Promise(resolve => (this.unlock = resolve))\n }\n}\n"]}
|
package/dist/src/context-path.js
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
* It captures the contextPath, prefix, domain, and path.
|
4
4
|
* Example: /contextPathPrefix/domain/path/to/resource
|
5
5
|
*/
|
6
|
-
var CONTEXT_PATH_PREFIX = 'domain';
|
6
|
+
var CONTEXT_PATH_PREFIX = 'domain|business';
|
7
7
|
/**
|
8
8
|
* Parses the given pathname and extracts information about the contextPath, prefix, domain, and path.
|
9
9
|
*
|
@@ -25,7 +25,6 @@ export function getPathInfo(pathname) {
|
|
25
25
|
contextPath,
|
26
26
|
prefix,
|
27
27
|
domain,
|
28
|
-
subdomain: domain,
|
29
28
|
path
|
30
29
|
};
|
31
30
|
}
|
@@ -35,7 +34,7 @@ export function getPathInfo(pathname) {
|
|
35
34
|
* @param {string} contextPathPrefix - The new context path prefix to set.
|
36
35
|
*/
|
37
36
|
export function setContextPathPrefix(contextPathPrefix) {
|
38
|
-
console.log('context-path-prefix was just set to ', `'${contextPathPrefix || 'domain'}'`);
|
39
|
-
CONTEXT_PATH_PREFIX = contextPathPrefix || 'domain';
|
37
|
+
console.log('context-path-prefix was just set to ', `'${contextPathPrefix || 'domain|business'}'`);
|
38
|
+
CONTEXT_PATH_PREFIX = contextPathPrefix || 'domain|business';
|
40
39
|
}
|
41
40
|
//# sourceMappingURL=context-path.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"context-path.js","sourceRoot":"","sources":["../../src/context-path.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,IAAI,mBAAmB,GAAG,
|
1
|
+
{"version":3,"file":"context-path.js","sourceRoot":"","sources":["../../src/context-path.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,IAAI,mBAAmB,GAAG,iBAAiB,CAAA;AAE3C;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,mBAAmB,mBAAmB,CAAC,CAAA;IACrE,IAAI,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACpC,IAAI,WAAW,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,CAAC,CAAC,KAAI,EAAE,CAAA;IACpC,IAAI,MAAM,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,CAAC,CAAC,KAAI,EAAE,CAAA;IAC/B,IAAI,MAAM,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,CAAC,CAAC,KAAI,EAAE,CAAA;IAC/B,IAAI,IAAI,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,CAAC,CAAC,CAAA;IAEvB,OAAO;QACL,WAAW;QACX,MAAM;QACN,MAAM;QACN,IAAI;KACL,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,iBAA0B;IAC7D,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,IAAI,iBAAiB,IAAI,iBAAiB,GAAG,CAAC,CAAA;IAClG,mBAAmB,GAAG,iBAAiB,IAAI,iBAAiB,CAAA;AAC9D,CAAC","sourcesContent":["/**\n * A regular expression pattern used to parse the pathname into different parts.\n * It captures the contextPath, prefix, domain, and path.\n * Example: /contextPathPrefix/domain/path/to/resource\n */\nvar CONTEXT_PATH_PREFIX = 'domain|business'\n\n/**\n * Parses the given pathname and extracts information about the contextPath, prefix, domain, and path.\n *\n * @param {string} pathname - The pathname to parse.\n * @returns {object} - An object containing the parsed information:\n * - contextPath: The context path portion of the pathname.\n * - prefix: The prefix portion of the pathname.\n * - domain: The domain portion of the pathname.\n * - path: The remaining path after contextPath, prefix, and domain.\n */\nexport function getPathInfo(pathname: string) {\n var regexp = new RegExp(`(/(${CONTEXT_PATH_PREFIX})/([^/]+))?(/?.*)`)\n var matched = pathname.match(regexp)\n var contextPath = matched?.[1] || ''\n var prefix = matched?.[2] || ''\n var domain = matched?.[3] || ''\n var path = matched?.[4]\n\n return {\n contextPath,\n prefix,\n domain,\n path\n }\n}\n\n/**\n * Sets the context path prefix used for parsing pathnames.\n *\n * @param {string} contextPathPrefix - The new context path prefix to set.\n */\nexport function setContextPathPrefix(contextPathPrefix?: string) {\n console.log('context-path-prefix was just set to ', `'${contextPathPrefix || 'domain|business'}'`)\n CONTEXT_PATH_PREFIX = contextPathPrefix || 'domain|business'\n}\n"]}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
export type GestureEventPinch = CustomEvent<{
|
2
|
+
scale: number;
|
3
|
+
centerX: number;
|
4
|
+
centerY: number;
|
5
|
+
}>;
|
6
|
+
export type GestureEventDrag = CustomEvent<{
|
7
|
+
deltaX: number;
|
8
|
+
deltaY: number;
|
9
|
+
clientX: number;
|
10
|
+
clientY: number;
|
11
|
+
end: boolean;
|
12
|
+
}>;
|
13
|
+
export type GestureEventDoubleTap = CustomEvent<{
|
14
|
+
x: number;
|
15
|
+
y: number;
|
16
|
+
}>;
|
17
|
+
export declare class GestureHelper {
|
18
|
+
private __pointers;
|
19
|
+
private __lastTapTime;
|
20
|
+
private __lastPinchDistance;
|
21
|
+
private __dragStart;
|
22
|
+
private element;
|
23
|
+
constructor(element: Element);
|
24
|
+
private init;
|
25
|
+
dispose(): void;
|
26
|
+
private handlePointerDown;
|
27
|
+
private handlePointerMove;
|
28
|
+
private handlePointerUp;
|
29
|
+
private handlePinch;
|
30
|
+
private handleDrag;
|
31
|
+
private handleTap;
|
32
|
+
private getDistance;
|
33
|
+
private addGlobalListeners;
|
34
|
+
private removeGlobalListeners;
|
35
|
+
}
|
@@ -0,0 +1,152 @@
|
|
1
|
+
export class GestureHelper {
|
2
|
+
constructor(element) {
|
3
|
+
Object.defineProperty(this, "__pointers", {
|
4
|
+
enumerable: true,
|
5
|
+
configurable: true,
|
6
|
+
writable: true,
|
7
|
+
value: new Map()
|
8
|
+
});
|
9
|
+
Object.defineProperty(this, "__lastTapTime", {
|
10
|
+
enumerable: true,
|
11
|
+
configurable: true,
|
12
|
+
writable: true,
|
13
|
+
value: 0
|
14
|
+
});
|
15
|
+
Object.defineProperty(this, "__lastPinchDistance", {
|
16
|
+
enumerable: true,
|
17
|
+
configurable: true,
|
18
|
+
writable: true,
|
19
|
+
value: 0
|
20
|
+
});
|
21
|
+
Object.defineProperty(this, "__dragStart", {
|
22
|
+
enumerable: true,
|
23
|
+
configurable: true,
|
24
|
+
writable: true,
|
25
|
+
value: null
|
26
|
+
});
|
27
|
+
Object.defineProperty(this, "element", {
|
28
|
+
enumerable: true,
|
29
|
+
configurable: true,
|
30
|
+
writable: true,
|
31
|
+
value: void 0
|
32
|
+
});
|
33
|
+
Object.defineProperty(this, "handlePointerDown", {
|
34
|
+
enumerable: true,
|
35
|
+
configurable: true,
|
36
|
+
writable: true,
|
37
|
+
value: (e) => {
|
38
|
+
e.preventDefault();
|
39
|
+
const point = { x: e.clientX, y: e.clientY };
|
40
|
+
this.__pointers.set(e.pointerId, point);
|
41
|
+
this.addGlobalListeners();
|
42
|
+
}
|
43
|
+
});
|
44
|
+
Object.defineProperty(this, "handlePointerMove", {
|
45
|
+
enumerable: true,
|
46
|
+
configurable: true,
|
47
|
+
writable: true,
|
48
|
+
value: (e) => {
|
49
|
+
e.preventDefault();
|
50
|
+
const point = { x: e.clientX, y: e.clientY };
|
51
|
+
this.__pointers.set(e.pointerId, point);
|
52
|
+
if (this.__pointers.size === 2) {
|
53
|
+
this.handlePinch();
|
54
|
+
}
|
55
|
+
else if (this.__pointers.size === 1) {
|
56
|
+
this.handleDrag(point, false);
|
57
|
+
}
|
58
|
+
}
|
59
|
+
});
|
60
|
+
Object.defineProperty(this, "handlePointerUp", {
|
61
|
+
enumerable: true,
|
62
|
+
configurable: true,
|
63
|
+
writable: true,
|
64
|
+
value: (e) => {
|
65
|
+
const point = { x: e.clientX, y: e.clientY };
|
66
|
+
this.__pointers.delete(e.pointerId);
|
67
|
+
if (this.__dragStart) {
|
68
|
+
this.handleDrag(point, true);
|
69
|
+
}
|
70
|
+
if (this.__pointers.size === 0) {
|
71
|
+
this.removeGlobalListeners();
|
72
|
+
this.__dragStart = null;
|
73
|
+
this.__lastPinchDistance = 0;
|
74
|
+
this.handleTap(point);
|
75
|
+
}
|
76
|
+
}
|
77
|
+
});
|
78
|
+
this.element = element;
|
79
|
+
this.init();
|
80
|
+
}
|
81
|
+
init() {
|
82
|
+
this.element.addEventListener('pointerdown', this.handlePointerDown);
|
83
|
+
}
|
84
|
+
dispose() {
|
85
|
+
this.element.removeEventListener('pointerdown', this.handlePointerDown);
|
86
|
+
this.removeGlobalListeners();
|
87
|
+
}
|
88
|
+
handlePinch() {
|
89
|
+
const pointers = Array.from(this.__pointers.values());
|
90
|
+
const currentDistance = this.getDistance(pointers[0], pointers[1]);
|
91
|
+
if (this.__lastPinchDistance) {
|
92
|
+
const scale = currentDistance / this.__lastPinchDistance;
|
93
|
+
const center = {
|
94
|
+
x: (pointers[0].x + pointers[1].x) / 2,
|
95
|
+
y: (pointers[0].y + pointers[1].y) / 2
|
96
|
+
};
|
97
|
+
this.element.dispatchEvent(new CustomEvent('pinch', {
|
98
|
+
detail: { scale, centerX: center.x, centerY: center.y }
|
99
|
+
}));
|
100
|
+
}
|
101
|
+
this.__lastPinchDistance = currentDistance;
|
102
|
+
}
|
103
|
+
handleDrag(point, end) {
|
104
|
+
if (this.__dragStart) {
|
105
|
+
const deltaX = point.x - this.__dragStart.x;
|
106
|
+
const deltaY = point.y - this.__dragStart.y;
|
107
|
+
this.element.dispatchEvent(new CustomEvent('drag', {
|
108
|
+
detail: { deltaX, deltaY, clientX: point.x, clientY: point.y, end }
|
109
|
+
}));
|
110
|
+
if (end) {
|
111
|
+
this.__dragStart = null;
|
112
|
+
}
|
113
|
+
else {
|
114
|
+
this.__dragStart = point;
|
115
|
+
}
|
116
|
+
}
|
117
|
+
else if (!end && this.__pointers.size === 1) {
|
118
|
+
/* dragging을 시작하려면, pointer 개수가 1개인 것을 (지연)확인해야한다. */
|
119
|
+
setTimeout(() => {
|
120
|
+
if (this.__pointers.size === 1 && !this.__dragStart) {
|
121
|
+
this.__dragStart = point;
|
122
|
+
}
|
123
|
+
}, 30);
|
124
|
+
}
|
125
|
+
}
|
126
|
+
handleTap(point) {
|
127
|
+
const currentTime = performance.now();
|
128
|
+
const timeSinceLastTap = currentTime - this.__lastTapTime;
|
129
|
+
if (timeSinceLastTap < 300) {
|
130
|
+
this.element.dispatchEvent(new CustomEvent('doubletap', {
|
131
|
+
detail: { x: point.x, y: point.y }
|
132
|
+
}));
|
133
|
+
}
|
134
|
+
this.__lastTapTime = currentTime;
|
135
|
+
}
|
136
|
+
getDistance(p1, p2) {
|
137
|
+
const dx = p1.x - p2.x;
|
138
|
+
const dy = p1.y - p2.y;
|
139
|
+
return Math.sqrt(dx * dx + dy * dy);
|
140
|
+
}
|
141
|
+
addGlobalListeners() {
|
142
|
+
document.addEventListener('pointermove', this.handlePointerMove);
|
143
|
+
document.addEventListener('pointerup', this.handlePointerUp);
|
144
|
+
document.addEventListener('pointercancel', this.handlePointerUp);
|
145
|
+
}
|
146
|
+
removeGlobalListeners() {
|
147
|
+
document.removeEventListener('pointermove', this.handlePointerMove);
|
148
|
+
document.removeEventListener('pointerup', this.handlePointerUp);
|
149
|
+
document.removeEventListener('pointercancel', this.handlePointerUp);
|
150
|
+
}
|
151
|
+
}
|
152
|
+
//# sourceMappingURL=gesture-helper.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"gesture-helper.js","sourceRoot":"","sources":["../../src/gesture-helper.ts"],"names":[],"mappings":"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","sourcesContent":["export type GestureEventPinch = CustomEvent<{ scale: number; centerX: number; centerY: number }>\nexport type GestureEventDrag = CustomEvent<{\n deltaX: number\n deltaY: number\n clientX: number\n clientY: number\n end: boolean\n}>\nexport type GestureEventDoubleTap = CustomEvent<{ x: number; y: number }>\n\nexport class GestureHelper {\n private __pointers = new Map<number, { x: number; y: number }>()\n private __lastTapTime = 0\n private __lastPinchDistance = 0\n private __dragStart: { x: number; y: number } | null = null\n private element: Element\n\n constructor(element: Element) {\n this.element = element\n this.init()\n }\n\n private init() {\n this.element.addEventListener('pointerdown', this.handlePointerDown as EventListener)\n }\n\n dispose() {\n this.element.removeEventListener('pointerdown', this.handlePointerDown as EventListener)\n this.removeGlobalListeners()\n }\n\n private handlePointerDown = (e: PointerEvent) => {\n e.preventDefault()\n const point = { x: e.clientX, y: e.clientY }\n this.__pointers.set(e.pointerId, point)\n\n this.addGlobalListeners()\n }\n\n private handlePointerMove = (e: PointerEvent) => {\n e.preventDefault()\n const point = { x: e.clientX, y: e.clientY }\n this.__pointers.set(e.pointerId, point)\n\n if (this.__pointers.size === 2) {\n this.handlePinch()\n } else if (this.__pointers.size === 1) {\n this.handleDrag(point, false)\n }\n }\n\n private handlePointerUp = (e: PointerEvent) => {\n const point = { x: e.clientX, y: e.clientY }\n this.__pointers.delete(e.pointerId)\n\n if (this.__dragStart) {\n this.handleDrag(point, true)\n }\n\n if (this.__pointers.size === 0) {\n this.removeGlobalListeners()\n this.__dragStart = null\n this.__lastPinchDistance = 0\n this.handleTap(point)\n }\n }\n\n private handlePinch() {\n const pointers = Array.from(this.__pointers.values()) as { x: number; y: number }[]\n const currentDistance = this.getDistance(pointers[0], pointers[1])\n\n if (this.__lastPinchDistance) {\n const scale = currentDistance / this.__lastPinchDistance\n const center = {\n x: (pointers[0].x + pointers[1].x) / 2,\n y: (pointers[0].y + pointers[1].y) / 2\n }\n\n this.element.dispatchEvent(\n new CustomEvent('pinch', {\n detail: { scale, centerX: center.x, centerY: center.y }\n })\n )\n }\n\n this.__lastPinchDistance = currentDistance\n }\n\n private handleDrag(point: { x: number; y: number }, end: boolean) {\n if (this.__dragStart) {\n const deltaX = point.x - this.__dragStart.x\n const deltaY = point.y - this.__dragStart.y\n\n this.element.dispatchEvent(\n new CustomEvent('drag', {\n detail: { deltaX, deltaY, clientX: point.x, clientY: point.y, end }\n })\n )\n\n if (end) {\n this.__dragStart = null\n } else {\n this.__dragStart = point\n }\n } else if (!end && this.__pointers.size === 1) {\n /* dragging을 시작하려면, pointer 개수가 1개인 것을 (지연)확인해야한다. */\n setTimeout(() => {\n if (this.__pointers.size === 1 && !this.__dragStart) {\n this.__dragStart = point\n }\n }, 30)\n }\n }\n\n private handleTap(point: { x: number; y: number }) {\n const currentTime = performance.now()\n const timeSinceLastTap = currentTime - this.__lastTapTime\n\n if (timeSinceLastTap < 300) {\n this.element.dispatchEvent(\n new CustomEvent('doubletap', {\n detail: { x: point.x, y: point.y }\n })\n )\n }\n\n this.__lastTapTime = currentTime\n }\n\n private getDistance(p1: { x: number; y: number }, p2: { x: number; y: number }): number {\n const dx = p1.x - p2.x\n const dy = p1.y - p2.y\n return Math.sqrt(dx * dx + dy * dy)\n }\n\n private addGlobalListeners() {\n document.addEventListener('pointermove', this.handlePointerMove as EventListener)\n document.addEventListener('pointerup', this.handlePointerUp as EventListener)\n document.addEventListener('pointercancel', this.handlePointerUp as EventListener)\n }\n\n private removeGlobalListeners() {\n document.removeEventListener('pointermove', this.handlePointerMove as EventListener)\n document.removeEventListener('pointerup', this.handlePointerUp as EventListener)\n document.removeEventListener('pointercancel', this.handlePointerUp as EventListener)\n }\n}\n"]}
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.js
CHANGED
@@ -21,5 +21,5 @@ export * from './cookie.js';
|
|
21
21
|
export * from './number-parser.js';
|
22
22
|
export * from './longpressable.js';
|
23
23
|
export * from './decode-html.js';
|
24
|
-
export * from './reactive-controllers';
|
24
|
+
export * from './reactive-controllers/index.js';
|
25
25
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA,CAAC,kCAAkC;AACvE,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAEhC,cAAc,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA,CAAC,kCAAkC;AACvE,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAEhC,cAAc,iCAAiC,CAAA","sourcesContent":["export * from './sleep.js'\nexport * from './async-lock.js'\nexport * from './file-drop-helper.js'\nexport * from './context-path.js'\nexport * from './os.js'\nexport * from './swipe-listener.js'\nexport * from './fullscreen.js'\nexport * from './parse-jwt.js'\nexport * from './password-pattern.js'\nexport * from './closest-element.js'\nexport * from './detect-overflow.js' /* deprecated by 'has-overflow' */\nexport * from './has-overflow.js'\nexport * from './timecapsule/index.js'\nexport * from './clipboard.js'\nexport * from './format.js'\nexport * from './adjust-list-param.js'\nexport * from './is-unvalued.js'\nexport * from './stringify-bignum.js'\nexport * from './encode-form-params.js'\nexport * from './cookie.js'\nexport * from './number-parser.js'\nexport * from './longpressable.js'\nexport * from './decode-html.js'\n\nexport * from './reactive-controllers/index.js'\n"]}
|