ziko 0.50.1 → 0.51.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.
Files changed (50) hide show
  1. package/dist/ziko.cjs +772 -898
  2. package/dist/ziko.js +509 -240
  3. package/dist/ziko.min.js +2 -2
  4. package/dist/ziko.mjs +506 -241
  5. package/package.json +1 -1
  6. package/src/__helpers__/checkers/index.js +1 -0
  7. package/src/data/api/fetchdom.js +27 -11
  8. package/src/events/binders/coordinates-based-event.js +25 -0
  9. package/src/events/binders/custom-event.js +1 -1
  10. package/src/events/binders/index.js +45 -12
  11. package/src/events/custom-events-registry/index.js +3 -1
  12. package/src/events/custom-events-registry/swipe.js +41 -23
  13. package/src/events/custom-events-registry/view.js +50 -19
  14. package/src/events/customizers/normalise-coordinates.js +0 -0
  15. package/src/events/details-setter/index.js +3 -1
  16. package/src/events/details-setter/mouse.js +35 -0
  17. package/src/events/details-setter/pointer.js +33 -31
  18. package/src/events/details-setter/touch.js +37 -0
  19. package/src/events/events-map/index.js +13 -5
  20. package/src/events/utils.js +31 -0
  21. package/src/events/ziko-event.js +59 -117
  22. package/src/router/file-based-router/index.js +46 -0
  23. package/src/router/index.js +2 -0
  24. package/src/router/utils/dynamic-routes-parser.js +76 -0
  25. package/src/router/utils/get-root.js +16 -0
  26. package/src/router/utils/index.js +5 -0
  27. package/src/router/utils/normalize-path.js +17 -0
  28. package/src/router/utils/routes-grouper.js +22 -0
  29. package/src/router/utils/routes-matcher.js +60 -0
  30. package/src/ui/__methods__/dom.js +0 -20
  31. package/src/ui/__methods__/events.js +8 -4
  32. package/src/ui/__methods__/index.js +3 -0
  33. package/src/ui/__methods__/lifecycle.js +54 -0
  34. package/src/ui/constructors/UIElement.js +4 -30
  35. package/src/ui/{constructors/UIElement-lite.js → mini/UIElement.js} +1 -1
  36. package/src/ui/suspense/index.js +1 -2
  37. package/types/data/api/index.d.ts +15 -0
  38. package/types/data/index.d.ts +1 -0
  39. package/types/data/string/checkers.d.ts +51 -0
  40. package/types/data/string/converters.d.ts +101 -0
  41. package/types/data/string/index.d.ts +2 -0
  42. package/types/index.d.ts +3 -1
  43. package/types/router/file-based-router/index.d.ts +20 -0
  44. package/types/router/index.d.ts +2 -0
  45. package/types/router/utils/dynamic-routes-parser.d.ts +14 -0
  46. package/types/router/utils/get-root.d.ts +11 -0
  47. package/types/router/utils/index.d.ts +5 -0
  48. package/types/router/utils/normalize-path.d.ts +15 -0
  49. package/types/router/utils/routes-grouper.d.ts +29 -0
  50. package/types/router/utils/routes-matcher.d.ts +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ziko",
3
- "version": "0.50.1",
3
+ "version": "0.51.0",
4
4
  "description": "A versatile JavaScript library offering a rich set of Hyperscript Based UI components, advanced mathematical utilities, interactivity ,animations, client side routing and more ...",
5
5
  "keywords": [
6
6
  "front-end",
@@ -1 +1,2 @@
1
1
  export const is_primitive = value => typeof value !== 'object' && typeof value !== 'function' || value === null;
2
+ export const is_async = fn => fn && fn.constructor && fn.constructor.name === "AsyncFunction";
@@ -1,14 +1,30 @@
1
- import { preload } from "./preload"
1
+ import { preload } from "./preload";
2
2
 
3
- async function fetchdom(url='https://github.com/zakarialaoui10'){
4
- const data=await fetch(url)
5
- const html=await data.text()
6
- const dom= new DOMParser().parseFromString(html,'text/xml')
7
- return dom.documentElement
3
+ async function fetchdom(url='https://github.com/zakarialaoui10') {
4
+ try {
5
+ const response = await fetch(url);
6
+ if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
7
+ const html = await response.text();
8
+ const dom = new DOMParser().parseFromString(html, 'text/html');
9
+ return dom.documentElement;
10
+ } catch (err) {
11
+ console.error('Failed to fetch DOM:', err);
12
+ throw err;
13
+ }
8
14
  }
9
- function fetchdomSync(url='https://github.com/zakarialaoui10'){
10
- const data=preload(url);
11
- const dom= new DOMParser().parseFromString(data,'text/xml')
12
- return dom.documentElement;
15
+
16
+ function fetchdomSync(url='https://github.com/zakarialaoui10') {
17
+ try {
18
+ const data = preload(url);
19
+ const dom = new DOMParser().parseFromString(data, 'text/html');
20
+ return dom.documentElement;
21
+ } catch (err) {
22
+ console.error('Failed to fetch DOM synchronously:', err);
23
+ throw err;
24
+ }
13
25
  }
14
- export {fetchdom,fetchdomSync}
26
+
27
+ export {
28
+ fetchdom,
29
+ fetchdomSync
30
+ };
@@ -0,0 +1,25 @@
1
+ import { ZikoEvent } from "../ziko-event.js";
2
+
3
+ export class CoordinatesBasedEvent extends ZikoEvent{
4
+ constructor(signature, target = null, Events = [], details_setter, customizer){
5
+ super(signature, target, Events, details_setter, customizer)
6
+ Object.assign(this.cache,{
7
+ useNormalisedCoordinates : false
8
+ })
9
+ this.isDown = false;
10
+ this.isMoving = false;
11
+ this.dx = 0;
12
+ this.dy = 0;
13
+ this.mx = 0;
14
+ this.my = 0;
15
+ this.ux = 0;
16
+ this.uy = 0;
17
+ }
18
+ get isDragging(){
19
+ return this.isDown && this.isMoving
20
+ }
21
+ useNormalisedCoordinates(enable = true){
22
+ this.cache.useNormalisedCoordinates = enable;
23
+ return this;
24
+ }
25
+ }
@@ -1,7 +1,7 @@
1
1
  import { ZikoEvent } from "../ziko-event.js";
2
2
  class ZikoCustomEvent extends ZikoEvent{
3
3
  constructor(target, events, customizer){
4
- super(target, events, details_setter, customizer)
4
+ super('custom', target, events, details_setter, customizer)
5
5
  }
6
6
  _register_events(events){
7
7
  super._register_events(events, null, null, false);
@@ -2,13 +2,23 @@ import { ZikoEvent } from "../ziko-event.js";
2
2
  import { EventsMap } from "../events-map/index.js";
3
3
  import {
4
4
  ptr_details_setter,
5
- key_details_setter
5
+ key_details_setter,
6
+ mouse_details_setter,
7
+ touch_details_setter
6
8
  } from '../details-setter/index.js'
7
- import { register_click_away_event } from "../custom-events-registry/click-away.js";
9
+ import {
10
+ CoordinatesBasedEvent
11
+ } from './coordinates-based-event.js'
12
+ import {
13
+ register_click_away_event,
14
+ register_view_event,
15
+ register_swipe_event
16
+ } from "../custom-events-registry/index.js";
8
17
 
9
18
  export const bind_click_event = (target, customizer) => {
10
19
  register_click_away_event(target.element)
11
20
  return new ZikoEvent(
21
+ 'click',
12
22
  target,
13
23
  EventsMap.Click,
14
24
  null,
@@ -16,57 +26,80 @@ export const bind_click_event = (target, customizer) => {
16
26
  );
17
27
  }
18
28
  export const bind_clipboard_event = (target, customizer) => new ZikoEvent(
29
+ 'clipboard',
19
30
  target,
20
31
  EventsMap.Clipboard,
21
32
  null,
22
33
  customizer
23
34
  );
24
35
  export const bind_drag_event = (target, customizer) => new ZikoEvent(
36
+ 'drag',
25
37
  target,
26
38
  EventsMap.Drag,
27
39
  null,
28
40
  customizer
29
41
  );
30
42
  export const bind_focus_event = (target, customizer) => new ZikoEvent(
43
+ 'focus',
31
44
  target,
32
45
  EventsMap.Focus,
33
46
  null,
34
47
  customizer
35
48
  );
36
49
  export const bind_key_event = (target, customizer) => new ZikoEvent(
50
+ 'key',
37
51
  target,
38
52
  EventsMap.Key,
39
53
  key_details_setter,
40
54
  customizer
41
55
  );
42
- export const bind_mouse_event = (target, customizer) => new ZikoEvent(
56
+ export const bind_mouse_event = (target, customizer) => new CoordinatesBasedEvent(
57
+ 'mouse',
43
58
  target,
44
59
  EventsMap.Mouse,
45
- null,
60
+ mouse_details_setter,
46
61
  customizer
47
62
  );
48
- export const bind_pointer_event = (target, customizer) => new ZikoEvent(
63
+ export const bind_pointer_event = (target, customizer) => new CoordinatesBasedEvent(
64
+ 'ptr',
49
65
  target,
50
66
  EventsMap.Ptr,
51
67
  ptr_details_setter,
52
68
  customizer
53
69
  );
54
- export const bind_touch_event = (target, customizer) => new ZikoEvent(
70
+ export const bind_touch_event = (target, customizer) => new CoordinatesBasedEvent(
71
+ 'touch',
55
72
  target,
56
73
  EventsMap.Touch,
57
- null,
74
+ touch_details_setter,
58
75
  customizer
59
76
  );
60
77
  export const bind_wheel_event = (target, customizer) => new ZikoEvent(
78
+ 'wheel',
61
79
  target,
62
80
  EventsMap.Wheel,
63
81
  null,
64
82
  customizer
65
83
  );
66
84
 
85
+ export const bind_view_event = (target, customizer) => {
86
+ register_view_event(target.element)
87
+ return new ZikoEvent(
88
+ 'view',
89
+ target,
90
+ EventsMap.View,
91
+ null,
92
+ customizer
93
+ )
94
+ }
67
95
 
68
- // function details_setter(){
69
- // if(this.currentEvent==="click") this.dx = 0
70
- // else this.dx = 1
71
- // // console.log(this.currentEvent)
72
- // }
96
+ export const bind_swipe_event = (target, customizer) => {
97
+ register_swipe_event(target.element)
98
+ return new ZikoEvent(
99
+ 'swipe',
100
+ target,
101
+ EventsMap.Swipe,
102
+ null,
103
+ customizer
104
+ )
105
+ }
@@ -1 +1,3 @@
1
- export * from './click-away.js'
1
+ export * from './click-away.js'
2
+ export * from './view.js'
3
+ export * from './swipe.js'
@@ -1,58 +1,76 @@
1
- class SwipeEvent extends Event {
2
- constructor(type, direction, distX, distY, originalEvent) {
3
- super(type, { bubbles: true, cancelable: true });
4
- this.direction = direction; // "left" | "right" | "up" | "down"
5
- this.distX = distX;
6
- this.distY = distY;
7
- this.originalEvent = originalEvent;
1
+ class SwipeEvent extends CustomEvent {
2
+ constructor(type, detail) {
3
+ super(type, {
4
+ detail,
5
+ bubbles: true,
6
+ cancelable: true
7
+ });
8
8
  }
9
9
  }
10
10
 
11
- function register_swipe_event(element, threshold = 50, restraint = 100, allowedTime = 500) {
12
- let startX, startY, startTime, isPointerDown = false;
11
+ function register_swipe_event(
12
+ element,
13
+ threshold = 50,
14
+ restraint = 100,
15
+ allowedTime = 500
16
+ ) {
17
+ let startX = 0,
18
+ startY = 0,
19
+ startTime = 0,
20
+ isPointerDown = false;
21
+
13
22
  function onPointerDown(e) {
14
23
  startX = e.clientX;
15
24
  startY = e.clientY;
16
- startTime = Date.now();
25
+ startTime = performance.now();
17
26
  isPointerDown = true;
18
27
  }
28
+
19
29
  function onPointerUp(e) {
20
30
  if (!isPointerDown) return;
21
31
  isPointerDown = false;
22
32
 
23
33
  const distX = e.clientX - startX;
24
34
  const distY = e.clientY - startY;
25
- const elapsedTime = Date.now() - startTime;
35
+ const elapsed = performance.now() - startTime;
36
+
26
37
  let direction = null;
27
38
  let eventName = null;
28
39
 
29
- if (elapsedTime <= allowedTime) {
40
+ if (elapsed <= allowedTime) {
30
41
  if (Math.abs(distX) >= threshold && Math.abs(distY) <= restraint) {
31
42
  direction = distX < 0 ? "left" : "right";
32
43
  eventName = "swipe" + direction;
33
- } else if (Math.abs(distY) >= threshold && Math.abs(distX) <= restraint) {
44
+ }
45
+ else if (Math.abs(distY) >= threshold && Math.abs(distX) <= restraint) {
34
46
  direction = distY < 0 ? "up" : "down";
35
47
  eventName = "swipe" + direction;
36
48
  }
37
49
  }
38
50
 
39
- if (eventName && direction) {
51
+ // Emit event
52
+ if (eventName) {
40
53
  element.dispatchEvent(
41
- new SwipeEvent(eventName, direction, distX, distY, e),
54
+ new SwipeEvent(eventName, {
55
+ direction,
56
+ distX,
57
+ distY,
58
+ originalEvent: e
59
+ })
42
60
  );
43
61
  }
44
62
  }
45
63
 
46
- element.addEventListener("pointerdown", onPointerDown, false);
47
- element.addEventListener("pointerup", onPointerUp, false);
64
+ element.addEventListener("pointerdown", onPointerDown, { passive: true });
65
+ element.addEventListener("pointerup", onPointerUp, { passive: true });
48
66
 
49
67
  return () => {
50
- element.removeEventListener("pointerdown", onPointerDown, false);
51
- element.removeEventListener("pointerup", onPointerUp, false);
68
+ element.removeEventListener("pointerdown", onPointerDown);
69
+ element.removeEventListener("pointerup", onPointerUp);
52
70
  };
53
71
  }
54
72
 
55
- export{
56
- SwipeEvent,
57
- register_swipe_event
58
- }
73
+ export {
74
+ SwipeEvent,
75
+ register_swipe_event
76
+ };
@@ -1,30 +1,61 @@
1
- class ViewEvent extends Event {
2
- constructor(type, detail) {
3
- super(type, { bubbles: true, cancelable: true });
4
- this.detail = detail;
1
+ import { throttle } from "../../time/decorators/index.js";
2
+ class ViewEvent extends CustomEvent {
3
+ constructor(type, detail, { bubbles = true, cancelable = true } = {}) {
4
+ super(type, { detail, bubbles, cancelable });
5
5
  }
6
6
  }
7
7
 
8
- function register_view_event(element, { intersection = true, resize = true, threshold = 0 } = {}) {
8
+ function register_view_event(
9
+ element,
10
+ {
11
+ intersection = true,
12
+ resize = true,
13
+ threshold = 0,
14
+ throttleResize = 100,
15
+ throttleEnterExit = 0
16
+ } = {}
17
+ ) {
9
18
  let intersectionObserver, resizeObserver;
10
- if (intersection) {
11
- intersectionObserver = new IntersectionObserver(entries => {
12
- for (let entry of entries) {
13
- const type = entry.isIntersecting ? "enterView" : "exitView";
19
+ const resizeCallback = entries => {
20
+ for (let entry of entries) {
21
+ const { width, height } = entry.contentRect;
22
+
23
+ element.dispatchEvent(
24
+ new ViewEvent("resizeview", {
25
+ width,
26
+ height,
27
+ entry
28
+ })
29
+ );
30
+ }
31
+ };
32
+
33
+ const throttledResize = throttleResize > 0
34
+ ? throttle(resizeCallback, throttleResize)
35
+ : resizeCallback;
36
+
37
+ const intersectionCallback = entries => {
38
+ for (let entry of entries) {
39
+ const type = entry.isIntersecting ? "enterview" : "exitview";
14
40
  element.dispatchEvent(new ViewEvent(type, entry));
15
- }
16
- }, { threshold });
41
+ }
42
+ };
43
+
44
+ const throttledIntersections = throttleEnterExit > 0
45
+ ? throttle(intersectionCallback, throttleEnterExit)
46
+ : intersectionCallback;
47
+
48
+ if (intersection) {
49
+ intersectionObserver = new IntersectionObserver(throttledIntersections, { threshold });
17
50
  intersectionObserver.observe(element);
18
51
  }
52
+
19
53
  if (resize) {
20
- resizeObserver = new ResizeObserver(entries => {
21
- for (let entry of entries) {
22
- const { width, height } = entry.contentRect;
23
- element.dispatchEvent(new ViewEvent("resizeView", { width, height, entry }));
24
- }
25
- });
54
+ resizeObserver = new ResizeObserver(throttledResize);
26
55
  resizeObserver.observe(element);
27
56
  }
57
+
58
+ // ---- UNREGISTER ----
28
59
  return () => {
29
60
  if (intersectionObserver) {
30
61
  intersectionObserver.unobserve(element);
@@ -37,7 +68,7 @@ function register_view_event(element, { intersection = true, resize = true, thre
37
68
  };
38
69
  }
39
70
 
40
- export{
71
+ export {
41
72
  ViewEvent,
42
73
  register_view_event
43
- }
74
+ };
@@ -1,2 +1,4 @@
1
1
  export * from './key.js'
2
- export * from './pointer.js'
2
+ export * from './pointer.js'
3
+ export * from './mouse.js'
4
+ export * from './touch.js'
@@ -0,0 +1,35 @@
1
+ export function mouse_details_setter() {
2
+ const rect = this.targetElement.getBoundingClientRect();
3
+ const e = this.event;
4
+ let x = (e.clientX - rect.left) | 0;
5
+ let y = (e.clientY - rect.top) | 0;
6
+
7
+ if(this.cache.useNormalisedCoordinates){
8
+ const w = this.targetElement.clientWidth;
9
+ const h = this.targetElement.clientHeight;
10
+ x = +((x / w) * 2 - 1).toFixed(8);
11
+ y = +((y / h) * -2 + 1).toFixed(8);
12
+ }
13
+
14
+ switch (this.currentEvent) {
15
+
16
+ case "mousedown":
17
+ this.dx = x;
18
+ this.dy = y;
19
+ this.isDown = true;
20
+ break;
21
+
22
+ case "mousemove":
23
+ this.mx = x;
24
+ this.my = y;
25
+ this.isMoving = true;
26
+ break;
27
+
28
+ case "mouserup":
29
+ this.ux = x;
30
+ this.uy = y;
31
+ this.isDown = false;
32
+ this.isMoving = false;
33
+ break;
34
+ }
35
+ }
@@ -1,33 +1,35 @@
1
- export function ptr_details_setter(){
2
- switch(this.currentEvent){
3
- case "pointerdown" : {
4
- this.dx = parseInt(this.event.offsetX);
5
- this.dy = parseInt(this.event.offsetY);
6
- this.isDown = true
7
- }; break;
8
- case "pointermove" : {
9
- this.mx = parseInt(this.event.offsetX);
10
- this.my = parseInt(this.event.offsetY);
11
- this.isMoving = true
12
- }; break;
13
- case "pointerup" : {
14
- this.ux = parseInt(this.event.offsetX);
15
- this.uy = parseInt(this.event.offsetY);
1
+ export function ptr_details_setter() {
2
+ const rect = this.targetElement.getBoundingClientRect();
3
+ const e = this.event;
4
+ let x = (e.clientX - rect.left) | 0;
5
+ let y = (e.clientY - rect.top) | 0;
6
+
7
+ if(this.cache.useNormalisedCoordinates){
8
+ const w = this.targetElement.clientWidth;
9
+ const h = this.targetElement.clientHeight;
10
+ x = +((x / w) * 2 - 1).toFixed(8);
11
+ y = +((y / h) * -2 + 1).toFixed(8);
12
+ }
13
+ switch (this.currentEvent) {
14
+
15
+ case "pointerdown":
16
+ this.dx = x;
17
+ this.dy = y;
18
+ this.isDown = true;
19
+ break;
20
+
21
+ case "pointermove":
22
+ this.mx = x;
23
+ this.my = y;
24
+ this.isMoving = true;
25
+ break;
26
+
27
+ case "pointerup":
28
+ this.ux = x;
29
+ this.uy = y;
16
30
  this.isDown = false;
17
- console.log(this.target.width)
18
- const delta_x=(this.ux-this.dx)/this.target.width;
19
- const delta_y=(this.dy-this.uy)/this.target.height;
20
- const HORIZONTAL_SWIPPE=(delta_x<0)?"left":(delta_x>0)?"right":"none";
21
- const VERTICAL_SWIPPE=(delta_y<0)?"bottom":(delta_y>0)?"top":"none";
22
- this.swippe={
23
- h:HORIZONTAL_SWIPPE,
24
- v:VERTICAL_SWIPPE,
25
- delta_x,
26
- delta_y
27
- }
28
- }; break;
31
+ this.isMoving = false;
32
+ break;
29
33
  }
30
- // if(this.currentEvent==="click") this.dx = 0
31
- // else this.dx = 1
32
- // console.log(this.currentEvent)
33
- }
34
+ }
35
+
@@ -0,0 +1,37 @@
1
+ export function touch_details_setter() {
2
+ const e = this.event;
3
+ const touch = e.touches?.[0] || e.changedTouches?.[0];
4
+
5
+ if (!touch) return; // should never happen but safe
6
+
7
+ const rect = this.targetElement.getBoundingClientRect();
8
+ let x = touch.clientX - rect.left;
9
+ let y = touch.clientY - rect.top;
10
+
11
+ if(this.cache.useNormalisedCoordinates){
12
+ const w = this.targetElement.clientWidth;
13
+ const h = this.targetElement.clientHeight;
14
+ x = +((x / w) * 2 - 1).toFixed(8);
15
+ y = +((y / h) * -2 + 1).toFixed(8);
16
+ }
17
+
18
+ switch (this.currentEvent) {
19
+ case "touchstart":
20
+ this.dx = x;
21
+ this.dy = y;
22
+ this.isDown = true;
23
+ break;
24
+
25
+ case "touchmove":
26
+ this.mx = x;
27
+ this.my = y;
28
+ this.isMoving = true;
29
+ break;
30
+
31
+ case "touchend":
32
+ this.ux = x;
33
+ this.uy = y;
34
+ this.isDown = false;
35
+ break;
36
+ }
37
+ }
@@ -1,8 +1,4 @@
1
1
  const EventsMap = {
2
- 'Custom' : [
3
- 'emit',
4
- 'on'
5
- ],
6
2
  'Click' : [
7
3
  'Click',
8
4
  'DblClick',
@@ -48,13 +44,25 @@ const EventsMap = {
48
44
  ],
49
45
  'Wheel': [
50
46
  'Wheel'
51
- ]
47
+ ],
52
48
  // 'Media':[
53
49
 
54
50
  // ],
55
51
  // 'Hash':[
56
52
  // "HashChange"
57
53
  // ]
54
+
55
+ 'View':[
56
+ 'EnterView',
57
+ 'ExitView',
58
+ 'ResizeView'
59
+ ],
60
+ 'Swipe':[
61
+ 'SwipeLeft',
62
+ 'SwipeUp',
63
+ 'SwipeRight',
64
+ 'SwipeDown'
65
+ ]
58
66
  }
59
67
 
60
68
  export {
@@ -1,3 +1,34 @@
1
+ export function event_controller(e, event_name, details_setter, customizer) {
2
+ this.cache.currentEvent = event_name;
3
+ this.cache.event = e;
4
+
5
+ details_setter?.call(this);
6
+ if (customizer?.hasOwnProperty('prototype')) customizer?.call(this);
7
+ else customizer?.call(null, this);
8
+
9
+ if (this.cache.preventDefault[event_name]) e.preventDefault();
10
+ if (this.cache.stopPropagation[event_name]) e.stopPropagation();
11
+ if (this.cache.stopImmediatePropagation[event_name]) e.stopImmediatePropagation();
12
+
13
+ // Call the single callback if it exists
14
+ this.cache.callbacks[event_name]?.(this);
15
+ }
16
+
17
+ export function toggle_event_listener(method, ...events) {
18
+ const keys = events.length === 0
19
+ ? Object.keys(this.cache.paused)
20
+ : events;
21
+ keys.forEach(key => {
22
+ if (!this.cache.paused.hasOwnProperty(key)) return;
23
+ this.targetElement?.[method](
24
+ key,
25
+ this.cache.__controllers__[key],
26
+ this.cache.options[key]
27
+ );
28
+ this.cache.paused[key] = method === 'removeEventListener';
29
+ });
30
+ return this;
31
+ }
1
32
  const getEvent=(event = "")=>{
2
33
  if(event.startsWith("Ptr"))return `pointer${event.split("Ptr")[1].toLowerCase()}`;
3
34
  return event.toLowerCase()