@studiometa/js-toolkit 3.0.0-alpha.9 → 3.0.0-beta.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 (88) hide show
  1. package/Base/Base.js +2 -2
  2. package/Base/Base.js.map +2 -2
  3. package/Base/features.d.ts +1 -0
  4. package/Base/features.js +1 -0
  5. package/Base/features.js.map +2 -2
  6. package/Base/managers/EventsManager.js +2 -4
  7. package/Base/managers/EventsManager.js.map +2 -2
  8. package/Base/managers/OptionsManager.d.ts +2 -2
  9. package/Base/managers/OptionsManager.js +8 -8
  10. package/Base/managers/OptionsManager.js.map +2 -2
  11. package/Base/managers/RefsManager.js.map +2 -2
  12. package/Base/utils.d.ts +4 -0
  13. package/Base/utils.js +7 -3
  14. package/Base/utils.js.map +2 -2
  15. package/decorators/withBreakpointObserver.js +14 -9
  16. package/decorators/withBreakpointObserver.js.map +2 -2
  17. package/decorators/withDrag.d.ts +1 -1
  18. package/decorators/withDrag.js.map +1 -1
  19. package/decorators/withRelativePointer.d.ts +1 -1
  20. package/decorators/withRelativePointer.js.map +1 -1
  21. package/decorators/withResponsiveOptions.d.ts +3 -1
  22. package/decorators/withResponsiveOptions.js +22 -2
  23. package/decorators/withResponsiveOptions.js.map +2 -2
  24. package/helpers/createApp.js +5 -1
  25. package/helpers/createApp.js.map +2 -2
  26. package/package.json +1 -1
  27. package/services/AbstractService.d.ts +98 -0
  28. package/services/AbstractService.js +115 -0
  29. package/services/AbstractService.js.map +7 -0
  30. package/services/DragService.d.ts +124 -0
  31. package/services/DragService.js +217 -0
  32. package/services/DragService.js.map +7 -0
  33. package/services/KeyService.d.ts +29 -0
  34. package/services/KeyService.js +48 -0
  35. package/services/KeyService.js.map +7 -0
  36. package/services/LoadService.d.ts +15 -0
  37. package/services/LoadService.js +19 -0
  38. package/services/LoadService.js.map +7 -0
  39. package/services/PointerService.d.ts +56 -0
  40. package/services/PointerService.js +129 -0
  41. package/services/PointerService.js.map +7 -0
  42. package/services/RafService.d.ts +19 -0
  43. package/services/RafService.js +45 -0
  44. package/services/RafService.js.map +7 -0
  45. package/services/ResizeService.d.ts +29 -0
  46. package/services/ResizeService.js +66 -0
  47. package/services/ResizeService.js.map +7 -0
  48. package/services/{scroll.d.ts → ScrollService.d.ts} +14 -3
  49. package/services/ScrollService.js +90 -0
  50. package/services/ScrollService.js.map +7 -0
  51. package/services/index.d.ts +8 -41
  52. package/services/index.js +8 -18
  53. package/services/index.js.map +3 -3
  54. package/services/utils.d.ts +14 -0
  55. package/services/utils.js +11 -0
  56. package/services/utils.js.map +7 -0
  57. package/tsconfig.build.tsbuildinfo +1 -0
  58. package/utils/index.d.ts +1 -0
  59. package/utils/index.js +1 -0
  60. package/utils/index.js.map +2 -2
  61. package/utils/loadElement.d.ts +42 -0
  62. package/utils/loadElement.js +33 -0
  63. package/utils/loadElement.js.map +7 -0
  64. package/utils/tween.js +1 -1
  65. package/utils/tween.js.map +2 -2
  66. package/services/drag.d.ts +0 -75
  67. package/services/drag.js +0 -199
  68. package/services/drag.js.map +0 -7
  69. package/services/key.d.ts +0 -21
  70. package/services/key.js +0 -65
  71. package/services/key.js.map +0 -7
  72. package/services/load.d.ts +0 -11
  73. package/services/load.js +0 -38
  74. package/services/load.js.map +0 -7
  75. package/services/pointer.d.ts +0 -32
  76. package/services/pointer.js +0 -123
  77. package/services/pointer.js.map +0 -7
  78. package/services/raf.d.ts +0 -9
  79. package/services/raf.js +0 -56
  80. package/services/raf.js.map +0 -7
  81. package/services/resize.d.ts +0 -15
  82. package/services/resize.js +0 -67
  83. package/services/resize.js.map +0 -7
  84. package/services/scroll.js +0 -105
  85. package/services/scroll.js.map +0 -7
  86. package/services/service.d.ts +0 -16
  87. package/services/service.js +0 -47
  88. package/services/service.js.map +0 -7
@@ -1,75 +0,0 @@
1
- import type { ServiceInterface } from './index.js';
2
- export type DragService = ServiceInterface<DragServiceProps>;
3
- type DragLifecycle = 'start' | 'drag' | 'drop' | 'inertia' | 'stop';
4
- export interface DragServiceProps {
5
- /**
6
- * The current mode of the dragging logic.
7
- */
8
- mode: DragLifecycle;
9
- /**
10
- * The target element of the drag.
11
- */
12
- target: HTMLElement;
13
- /**
14
- * Whether the user is currently grabbing the targeted element or not.
15
- */
16
- isGrabbing: boolean;
17
- /**
18
- * Whether the drag currently has inertia or not.
19
- */
20
- hasInertia: boolean;
21
- /**
22
- * The current horizontal position in the viewport.
23
- */
24
- x: number;
25
- /**
26
- * The current vertical position in the viewport.
27
- */
28
- y: number;
29
- /**
30
- * The delta between the current position and the last.
31
- */
32
- delta: {
33
- x: number;
34
- y: number;
35
- };
36
- /**
37
- * The initial position where the dragging started.
38
- */
39
- origin: {
40
- x: number;
41
- y: number;
42
- };
43
- /**
44
- * The distance from the current position to the origin.
45
- */
46
- distance: {
47
- x: number;
48
- y: number;
49
- };
50
- /**
51
- * The final position that will be reached at the end of the inertia.
52
- */
53
- final: {
54
- x: number;
55
- y: number;
56
- };
57
- }
58
- export interface DragServiceOptions {
59
- dampFactor?: number;
60
- dragTreshold?: number;
61
- }
62
- /**
63
- * Use the drag service.
64
- *
65
- * ```js
66
- * import { useDrag } from '@studiometa/js-toolkit/services';
67
- * const { add, remove, props } = useDrag();
68
- * const draggableElement = document.querySelector('.draggable');
69
- * add(draggableElement, (props) => {}, { factor: 0.8 });
70
- * remove(draggableElement);
71
- * props(draggableElement);
72
- * ```
73
- */
74
- export default function useDrag(target: HTMLElement, options: DragServiceOptions): DragService;
75
- export {};
package/services/drag.js DELETED
@@ -1,199 +0,0 @@
1
- import { useService } from "./service.js";
2
- import useRaf from "./raf.js";
3
- import inertiaFinalValue from "../utils/math/inertiaFinalValue.js";
4
- import { isDefined } from "../utils/index.js";
5
- const MODES = {
6
- START: "start",
7
- DRAG: "drag",
8
- DROP: "drop",
9
- INERTIA: "inertia",
10
- STOP: "stop"
11
- };
12
- let count = 0;
13
- const targetEvents = ["pointerdown"];
14
- const windowEvents = ["pointerup", "touchend"];
15
- const passiveEventOptions = { passive: true };
16
- function getEventPosition(event) {
17
- const eventOrTouch = isDefined(event.touches) ? event.touches[0] : event;
18
- return {
19
- x: eventOrTouch.clientX,
20
- y: eventOrTouch.clientY
21
- };
22
- }
23
- function createDragService(target, { dampFactor = 0.85, dragTreshold = 10 } = {}) {
24
- count += 1;
25
- const id = `drag-${count}`;
26
- let previousEvent;
27
- function shouldPreventClick() {
28
- return Math.abs(props.distance.x) > dragTreshold || Math.abs(props.distance.y) > dragTreshold;
29
- }
30
- function start(x, y) {
31
- if (props.isGrabbing) {
32
- return;
33
- }
34
- props.x = x;
35
- props.y = y;
36
- props.origin.x = x;
37
- props.origin.y = y;
38
- props.delta.x = 0;
39
- props.delta.y = 0;
40
- props.distance.x = 0;
41
- props.distance.y = 0;
42
- props.final.x = x;
43
- props.final.y = y;
44
- props.mode = MODES.START;
45
- props.isGrabbing = true;
46
- trigger(props);
47
- document.addEventListener("touchmove", handleEvent, passiveEventOptions);
48
- document.addEventListener("mousemove", handleEvent, passiveEventOptions);
49
- }
50
- function drop() {
51
- document.removeEventListener("touchmove", handleEvent);
52
- document.removeEventListener("mousemove", handleEvent);
53
- props.isGrabbing = false;
54
- props.mode = MODES.DROP;
55
- props.hasInertia = true;
56
- props.final.x = inertiaFinalValue(props.x, props.delta.x, dampFactor);
57
- props.final.y = inertiaFinalValue(props.y, props.delta.y, dampFactor);
58
- trigger(props);
59
- setTimeout(() => {
60
- const raf = useRaf();
61
- raf.remove(id);
62
- raf.add(id, rafHandler);
63
- }, 0);
64
- }
65
- function stop() {
66
- useRaf().remove(id);
67
- props.isGrabbing = false;
68
- props.hasInertia = false;
69
- props.mode = MODES.STOP;
70
- trigger(props);
71
- }
72
- function rafHandler() {
73
- if (!props.isGrabbing) {
74
- props.x += props.delta.x;
75
- props.y += props.delta.y;
76
- props.distance.x = props.x - props.origin.x;
77
- props.distance.y = props.y - props.origin.y;
78
- props.delta.x *= dampFactor;
79
- props.delta.y *= dampFactor;
80
- if (props.mode !== MODES.INERTIA) {
81
- props.mode = MODES.INERTIA;
82
- }
83
- trigger(props);
84
- if (Math.abs(props.delta.x) < 0.1 && Math.abs(props.delta.y) < 0.1) {
85
- stop();
86
- }
87
- }
88
- }
89
- function drag(event) {
90
- if (props.isGrabbing) {
91
- const position = getEventPosition(event);
92
- props.x = position.x;
93
- props.y = position.y;
94
- if (previousEvent) {
95
- const previousPosition = getEventPosition(previousEvent);
96
- props.delta.x = position.x - previousPosition.x;
97
- props.delta.y = position.y - previousPosition.y;
98
- }
99
- props.final.x = position.x;
100
- props.final.y = position.y;
101
- props.distance.x = props.x - props.origin.x;
102
- props.distance.y = props.y - props.origin.y;
103
- if (props.mode !== MODES.DRAG) {
104
- props.mode = MODES.DRAG;
105
- }
106
- trigger(props);
107
- previousEvent = event;
108
- }
109
- }
110
- function handleEvent(event) {
111
- switch (event.type) {
112
- case "dragstart":
113
- event.preventDefault();
114
- break;
115
- case "click":
116
- if (shouldPreventClick()) {
117
- event.stopImmediatePropagation();
118
- event.stopPropagation();
119
- event.preventDefault();
120
- }
121
- break;
122
- case "pointerup":
123
- case "touchend":
124
- drop();
125
- break;
126
- case "touchmove":
127
- case "mousemove":
128
- drag(event);
129
- break;
130
- default:
131
- if (event.button === 0) {
132
- start(event.x, event.y);
133
- }
134
- }
135
- }
136
- const { add, remove, has, trigger, props } = useService({
137
- props: {
138
- target,
139
- mode: void 0,
140
- isGrabbing: false,
141
- hasInertia: false,
142
- x: 0,
143
- y: 0,
144
- delta: {
145
- x: 0,
146
- y: 0
147
- },
148
- origin: {
149
- x: 0,
150
- y: 0
151
- },
152
- distance: {
153
- x: 0,
154
- y: 0
155
- },
156
- final: {
157
- x: 0,
158
- y: 0
159
- }
160
- },
161
- init() {
162
- for (const event of targetEvents) {
163
- target.addEventListener(event, handleEvent, passiveEventOptions);
164
- }
165
- for (const event of windowEvents) {
166
- window.addEventListener(event, handleEvent, passiveEventOptions);
167
- }
168
- target.addEventListener("dragstart", handleEvent, { capture: true });
169
- target.addEventListener("click", handleEvent, { capture: true });
170
- },
171
- kill() {
172
- for (const event of targetEvents) {
173
- target.removeEventListener(event, handleEvent);
174
- }
175
- for (const event of windowEvents) {
176
- window.removeEventListener(event, handleEvent);
177
- }
178
- target.removeEventListener("dragstart", handleEvent);
179
- target.removeEventListener("click", handleEvent);
180
- }
181
- });
182
- return {
183
- add,
184
- remove,
185
- has,
186
- props: () => props
187
- };
188
- }
189
- const instances = /* @__PURE__ */ new WeakMap();
190
- function useDrag(target, options) {
191
- if (!instances.has(target)) {
192
- instances.set(target, createDragService(target, options));
193
- }
194
- return instances.get(target);
195
- }
196
- export {
197
- useDrag as default
198
- };
199
- //# sourceMappingURL=drag.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../packages/js-toolkit/services/drag.ts"],
4
- "sourcesContent": ["/* eslint-disable no-use-before-define, @typescript-eslint/no-use-before-define */\nimport { useService } from './service.js';\nimport useRaf from './raf.js';\nimport inertiaFinalValue from '../utils/math/inertiaFinalValue.js';\nimport { isDefined } from '../utils/index.js';\nimport type { ServiceInterface } from './index.js';\n\nexport type DragService = ServiceInterface<DragServiceProps>;\n\ntype DragLifecycle = 'start' | 'drag' | 'drop' | 'inertia' | 'stop';\n\nexport interface DragServiceProps {\n /**\n * The current mode of the dragging logic.\n */\n mode: DragLifecycle;\n /**\n * The target element of the drag.\n */\n target: HTMLElement;\n /**\n * Whether the user is currently grabbing the targeted element or not.\n */\n isGrabbing: boolean;\n /**\n * Whether the drag currently has inertia or not.\n */\n hasInertia: boolean;\n /**\n * The current horizontal position in the viewport.\n */\n x: number;\n /**\n * The current vertical position in the viewport.\n */\n y: number;\n /**\n * The delta between the current position and the last.\n */\n delta: { x: number; y: number };\n /**\n * The initial position where the dragging started.\n */\n origin: { x: number; y: number };\n /**\n * The distance from the current position to the origin.\n */\n distance: { x: number; y: number };\n /**\n * The final position that will be reached at the end of the inertia.\n */\n final: { x: number; y: number };\n}\n\nexport interface DragServiceOptions {\n dampFactor?: number;\n dragTreshold?: number;\n}\n\nconst MODES: Record<Uppercase<DragLifecycle>, DragLifecycle> = {\n START: 'start',\n DRAG: 'drag',\n DROP: 'drop',\n INERTIA: 'inertia',\n STOP: 'stop',\n};\n\nlet count = 0;\nconst targetEvents = ['pointerdown'];\nconst windowEvents = ['pointerup', 'touchend'];\nconst passiveEventOptions = { passive: true };\n\n/**\n * Get the client value for the given axis.\n */\nfunction getEventPosition(event: MouseEvent | TouchEvent): { x: number; y: number } {\n // @ts-ignore\n const eventOrTouch = isDefined(event.touches) ? event.touches[0] : event;\n return {\n x: eventOrTouch.clientX,\n y: eventOrTouch.clientY,\n };\n}\n\n/**\n * Get drag service.\n */\nfunction createDragService(\n target: HTMLElement,\n { dampFactor = 0.85, dragTreshold = 10 }: DragServiceOptions = {},\n): DragService {\n count += 1;\n const id = `drag-${count}`;\n let previousEvent;\n\n /**\n * Test if we should allow click on links and buttons.\n */\n function shouldPreventClick(): boolean {\n return Math.abs(props.distance.x) > dragTreshold || Math.abs(props.distance.y) > dragTreshold;\n }\n\n /**\n * Start the drag.\n *\n * @param {number} x The initial horizontal position.\n * @param {number} y The initial vertical position.\n * @returns {void}\n */\n function start(x: number, y: number) {\n if (props.isGrabbing) {\n return;\n }\n\n // Reset state\n props.x = x;\n props.y = y;\n props.origin.x = x;\n props.origin.y = y;\n props.delta.x = 0;\n props.delta.y = 0;\n props.distance.x = 0;\n props.distance.y = 0;\n props.final.x = x;\n props.final.y = y;\n\n props.mode = MODES.START;\n\n // Enable grabbing\n props.isGrabbing = true;\n\n trigger(props);\n\n document.addEventListener('touchmove', handleEvent, passiveEventOptions);\n document.addEventListener('mousemove', handleEvent, passiveEventOptions);\n }\n\n /**\n * Stop the drag, or drop.\n */\n function drop() {\n document.removeEventListener('touchmove', handleEvent);\n document.removeEventListener('mousemove', handleEvent);\n props.isGrabbing = false;\n props.mode = MODES.DROP;\n\n props.hasInertia = true;\n props.final.x = inertiaFinalValue(props.x, props.delta.x, dampFactor);\n props.final.y = inertiaFinalValue(props.y, props.delta.y, dampFactor);\n\n trigger(props);\n\n setTimeout(() => {\n const raf = useRaf();\n raf.remove(id);\n raf.add(id, rafHandler);\n }, 0);\n }\n\n /**\n * Stop the drag.\n */\n function stop() {\n useRaf().remove(id);\n props.isGrabbing = false;\n props.hasInertia = false;\n props.mode = MODES.STOP;\n trigger(props);\n }\n\n /**\n * Raf service handler.\n */\n function rafHandler() {\n if (!props.isGrabbing) {\n props.x += props.delta.x;\n props.y += props.delta.y;\n props.distance.x = props.x - props.origin.x;\n props.distance.y = props.y - props.origin.y;\n\n props.delta.x *= dampFactor;\n props.delta.y *= dampFactor;\n\n if (props.mode !== MODES.INERTIA) {\n props.mode = MODES.INERTIA;\n }\n\n trigger(props);\n\n if (Math.abs(props.delta.x) < 0.1 && Math.abs(props.delta.y) < 0.1) {\n stop();\n }\n }\n }\n\n /**\n * Pointer service handler.\n */\n function drag(event: TouchEvent | MouseEvent) {\n if (props.isGrabbing) {\n const position = getEventPosition(event);\n props.x = position.x;\n props.y = position.y;\n\n if (previousEvent) {\n const previousPosition = getEventPosition(previousEvent);\n props.delta.x = position.x - previousPosition.x;\n props.delta.y = position.y - previousPosition.y;\n }\n\n props.final.x = position.x;\n props.final.y = position.y;\n props.distance.x = props.x - props.origin.x;\n props.distance.y = props.y - props.origin.y;\n\n if (props.mode !== MODES.DRAG) {\n props.mode = MODES.DRAG;\n }\n\n trigger(props);\n previousEvent = event;\n }\n }\n\n /**\n * Handle any event.\n */\n function handleEvent(event: MouseEvent | PointerEvent | DragEvent) {\n switch (event.type) {\n case 'dragstart':\n event.preventDefault();\n break;\n case 'click':\n if (shouldPreventClick()) {\n event.stopImmediatePropagation();\n event.stopPropagation();\n event.preventDefault();\n }\n break;\n case 'pointerup':\n case 'touchend':\n drop();\n break;\n case 'touchmove':\n case 'mousemove':\n drag(event);\n break;\n default:\n if (event.button === 0) {\n start(event.x, event.y);\n }\n }\n }\n\n const { add, remove, has, trigger, props } = useService({\n props: {\n target,\n mode: undefined,\n isGrabbing: false,\n hasInertia: false,\n x: 0,\n y: 0,\n delta: {\n x: 0,\n y: 0,\n },\n origin: {\n x: 0,\n y: 0,\n },\n distance: {\n x: 0,\n y: 0,\n },\n final: {\n x: 0,\n y: 0,\n },\n } as DragServiceProps,\n init() {\n for (const event of targetEvents) {\n target.addEventListener(event, handleEvent, passiveEventOptions);\n }\n for (const event of windowEvents) {\n window.addEventListener(event, handleEvent, passiveEventOptions);\n }\n target.addEventListener('dragstart', handleEvent, { capture: true });\n target.addEventListener('click', handleEvent, { capture: true });\n },\n kill() {\n for (const event of targetEvents) {\n target.removeEventListener(event, handleEvent);\n }\n for (const event of windowEvents) {\n window.removeEventListener(event, handleEvent);\n }\n target.removeEventListener('dragstart', handleEvent);\n target.removeEventListener('click', handleEvent);\n },\n });\n\n return {\n add,\n remove,\n has,\n props: () => props,\n };\n}\n\nconst instances: WeakMap<HTMLElement, DragService | undefined> = new WeakMap();\n\n/**\n * Use the drag service.\n *\n * ```js\n * import { useDrag } from '@studiometa/js-toolkit/services';\n * const { add, remove, props } = useDrag();\n * const draggableElement = document.querySelector('.draggable');\n * add(draggableElement, (props) => {}, { factor: 0.8 });\n * remove(draggableElement);\n * props(draggableElement);\n * ```\n */\nexport default function useDrag(target: HTMLElement, options: DragServiceOptions): DragService {\n if (!instances.has(target)) {\n instances.set(target, createDragService(target, options));\n }\n\n return instances.get(target);\n}\n"],
5
- "mappings": "AACA,SAAS,kBAAkB;AAC3B,OAAO,YAAY;AACnB,OAAO,uBAAuB;AAC9B,SAAS,iBAAiB;AAuD1B,MAAM,QAAyD;AAAA,EAC7D,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AACR;AAEA,IAAI,QAAQ;AACZ,MAAM,eAAe,CAAC,aAAa;AACnC,MAAM,eAAe,CAAC,aAAa,UAAU;AAC7C,MAAM,sBAAsB,EAAE,SAAS,KAAK;AAK5C,SAAS,iBAAiB,OAA0D;AAElF,QAAM,eAAe,UAAU,MAAM,OAAO,IAAI,MAAM,QAAQ,CAAC,IAAI;AACnE,SAAO;AAAA,IACL,GAAG,aAAa;AAAA,IAChB,GAAG,aAAa;AAAA,EAClB;AACF;AAKA,SAAS,kBACP,QACA,EAAE,aAAa,MAAM,eAAe,GAAG,IAAwB,CAAC,GACnD;AACb,WAAS;AACT,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI;AAKJ,WAAS,qBAA8B;AACrC,WAAO,KAAK,IAAI,MAAM,SAAS,CAAC,IAAI,gBAAgB,KAAK,IAAI,MAAM,SAAS,CAAC,IAAI;AAAA,EACnF;AASA,WAAS,MAAM,GAAW,GAAW;AACnC,QAAI,MAAM,YAAY;AACpB;AAAA,IACF;AAGA,UAAM,IAAI;AACV,UAAM,IAAI;AACV,UAAM,OAAO,IAAI;AACjB,UAAM,OAAO,IAAI;AACjB,UAAM,MAAM,IAAI;AAChB,UAAM,MAAM,IAAI;AAChB,UAAM,SAAS,IAAI;AACnB,UAAM,SAAS,IAAI;AACnB,UAAM,MAAM,IAAI;AAChB,UAAM,MAAM,IAAI;AAEhB,UAAM,OAAO,MAAM;AAGnB,UAAM,aAAa;AAEnB,YAAQ,KAAK;AAEb,aAAS,iBAAiB,aAAa,aAAa,mBAAmB;AACvE,aAAS,iBAAiB,aAAa,aAAa,mBAAmB;AAAA,EACzE;AAKA,WAAS,OAAO;AACd,aAAS,oBAAoB,aAAa,WAAW;AACrD,aAAS,oBAAoB,aAAa,WAAW;AACrD,UAAM,aAAa;AACnB,UAAM,OAAO,MAAM;AAEnB,UAAM,aAAa;AACnB,UAAM,MAAM,IAAI,kBAAkB,MAAM,GAAG,MAAM,MAAM,GAAG,UAAU;AACpE,UAAM,MAAM,IAAI,kBAAkB,MAAM,GAAG,MAAM,MAAM,GAAG,UAAU;AAEpE,YAAQ,KAAK;AAEb,eAAW,MAAM;AACf,YAAM,MAAM,OAAO;AACnB,UAAI,OAAO,EAAE;AACb,UAAI,IAAI,IAAI,UAAU;AAAA,IACxB,GAAG,CAAC;AAAA,EACN;AAKA,WAAS,OAAO;AACd,WAAO,EAAE,OAAO,EAAE;AAClB,UAAM,aAAa;AACnB,UAAM,aAAa;AACnB,UAAM,OAAO,MAAM;AACnB,YAAQ,KAAK;AAAA,EACf;AAKA,WAAS,aAAa;AACpB,QAAI,CAAC,MAAM,YAAY;AACrB,YAAM,KAAK,MAAM,MAAM;AACvB,YAAM,KAAK,MAAM,MAAM;AACvB,YAAM,SAAS,IAAI,MAAM,IAAI,MAAM,OAAO;AAC1C,YAAM,SAAS,IAAI,MAAM,IAAI,MAAM,OAAO;AAE1C,YAAM,MAAM,KAAK;AACjB,YAAM,MAAM,KAAK;AAEjB,UAAI,MAAM,SAAS,MAAM,SAAS;AAChC,cAAM,OAAO,MAAM;AAAA,MACrB;AAEA,cAAQ,KAAK;AAEb,UAAI,KAAK,IAAI,MAAM,MAAM,CAAC,IAAI,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC,IAAI,KAAK;AAClE,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAKA,WAAS,KAAK,OAAgC;AAC5C,QAAI,MAAM,YAAY;AACpB,YAAM,WAAW,iBAAiB,KAAK;AACvC,YAAM,IAAI,SAAS;AACnB,YAAM,IAAI,SAAS;AAEnB,UAAI,eAAe;AACjB,cAAM,mBAAmB,iBAAiB,aAAa;AACvD,cAAM,MAAM,IAAI,SAAS,IAAI,iBAAiB;AAC9C,cAAM,MAAM,IAAI,SAAS,IAAI,iBAAiB;AAAA,MAChD;AAEA,YAAM,MAAM,IAAI,SAAS;AACzB,YAAM,MAAM,IAAI,SAAS;AACzB,YAAM,SAAS,IAAI,MAAM,IAAI,MAAM,OAAO;AAC1C,YAAM,SAAS,IAAI,MAAM,IAAI,MAAM,OAAO;AAE1C,UAAI,MAAM,SAAS,MAAM,MAAM;AAC7B,cAAM,OAAO,MAAM;AAAA,MACrB;AAEA,cAAQ,KAAK;AACb,sBAAgB;AAAA,IAClB;AAAA,EACF;AAKA,WAAS,YAAY,OAA8C;AACjE,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,cAAM,eAAe;AACrB;AAAA,MACF,KAAK;AACH,YAAI,mBAAmB,GAAG;AACxB,gBAAM,yBAAyB;AAC/B,gBAAM,gBAAgB;AACtB,gBAAM,eAAe;AAAA,QACvB;AACA;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,aAAK;AACL;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,aAAK,KAAK;AACV;AAAA,MACF;AACE,YAAI,MAAM,WAAW,GAAG;AACtB,gBAAM,MAAM,GAAG,MAAM,CAAC;AAAA,QACxB;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,EAAE,KAAK,QAAQ,KAAK,SAAS,MAAM,IAAI,WAAW;AAAA,IACtD,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA,UAAU;AAAA,QACR,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IACF;AAAA,IACA,OAAO;AACL,iBAAW,SAAS,cAAc;AAChC,eAAO,iBAAiB,OAAO,aAAa,mBAAmB;AAAA,MACjE;AACA,iBAAW,SAAS,cAAc;AAChC,eAAO,iBAAiB,OAAO,aAAa,mBAAmB;AAAA,MACjE;AACA,aAAO,iBAAiB,aAAa,aAAa,EAAE,SAAS,KAAK,CAAC;AACnE,aAAO,iBAAiB,SAAS,aAAa,EAAE,SAAS,KAAK,CAAC;AAAA,IACjE;AAAA,IACA,OAAO;AACL,iBAAW,SAAS,cAAc;AAChC,eAAO,oBAAoB,OAAO,WAAW;AAAA,MAC/C;AACA,iBAAW,SAAS,cAAc;AAChC,eAAO,oBAAoB,OAAO,WAAW;AAAA,MAC/C;AACA,aAAO,oBAAoB,aAAa,WAAW;AACnD,aAAO,oBAAoB,SAAS,WAAW;AAAA,IACjD;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AACF;AAEA,MAAM,YAA2D,oBAAI,QAAQ;AAc9D,SAAR,QAAyB,QAAqB,SAA0C;AAC7F,MAAI,CAAC,UAAU,IAAI,MAAM,GAAG;AAC1B,cAAU,IAAI,QAAQ,kBAAkB,QAAQ,OAAO,CAAC;AAAA,EAC1D;AAEA,SAAO,UAAU,IAAI,MAAM;AAC7B;",
6
- "names": []
7
- }
package/services/key.d.ts DELETED
@@ -1,21 +0,0 @@
1
- import type { ServiceInterface } from './index.js';
2
- export type KeyService = ServiceInterface<KeyServiceProps>;
3
- export interface KeyServiceProps {
4
- event: KeyboardEvent;
5
- triggered: number;
6
- direction: 'up' | 'down' | 'none';
7
- isUp: boolean;
8
- isDown: boolean;
9
- ENTER: boolean;
10
- SPACE: boolean;
11
- TAB: boolean;
12
- ESC: boolean;
13
- LEFT: boolean;
14
- UP: boolean;
15
- RIGHT: boolean;
16
- DOWN: boolean;
17
- }
18
- /**
19
- * Use the keyboard service.
20
- */
21
- export default function useKey(): KeyService;
package/services/key.js DELETED
@@ -1,65 +0,0 @@
1
- import { useService } from "./service.js";
2
- import keyCodes from "../utils/keyCodes.js";
3
- function getInitialKeyCodes() {
4
- return Object.fromEntries(Object.keys(keyCodes).map((key2) => [key2, false]));
5
- }
6
- function createKeyService() {
7
- let previousEvent;
8
- function updateProps(event) {
9
- props.event = event;
10
- for (const [name, code] of Object.entries(keyCodes)) {
11
- props[name] = code === event.keyCode;
12
- }
13
- if (!previousEvent) {
14
- props.triggered = 0;
15
- }
16
- if (props.event.type === "keydown" && previousEvent?.type === "keydown") {
17
- props.triggered += 1;
18
- } else {
19
- props.triggered = 1;
20
- }
21
- previousEvent = props.event;
22
- props.direction = props.event.type === "keydown" ? "down" : "up";
23
- props.isUp = props.event.type === "keyup";
24
- props.isDown = props.event.type === "keydown";
25
- return props;
26
- }
27
- function onKey(event) {
28
- trigger(updateProps(event));
29
- }
30
- const { add, remove, has, trigger, props } = useService({
31
- props: {
32
- event: null,
33
- triggered: 0,
34
- isUp: false,
35
- isDown: false,
36
- direction: "none",
37
- ...getInitialKeyCodes()
38
- },
39
- init() {
40
- document.addEventListener("keydown", onKey);
41
- document.addEventListener("keyup", onKey);
42
- },
43
- kill() {
44
- document.removeEventListener("keydown", onKey);
45
- document.removeEventListener("keyup", onKey);
46
- }
47
- });
48
- return {
49
- add,
50
- remove,
51
- has,
52
- props: () => props
53
- };
54
- }
55
- let key;
56
- function useKey() {
57
- if (!key) {
58
- key = createKeyService();
59
- }
60
- return key;
61
- }
62
- export {
63
- useKey as default
64
- };
65
- //# sourceMappingURL=key.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../packages/js-toolkit/services/key.ts"],
4
- "sourcesContent": ["/* eslint-disable no-use-before-define, @typescript-eslint/no-use-before-define */\nimport { useService } from './service.js';\nimport keyCodes from '../utils/keyCodes.js';\nimport type { ServiceInterface } from './index.js';\n\n/**\n * Get initial key codes.\n */\nfunction getInitialKeyCodes(): Record<keyof typeof keyCodes, false> {\n return Object.fromEntries(Object.keys(keyCodes).map((key) => [key, false])) as Record<\n keyof typeof keyCodes,\n false\n >;\n}\n\nexport type KeyService = ServiceInterface<KeyServiceProps>;\n\nexport interface KeyServiceProps {\n event: KeyboardEvent;\n triggered: number;\n direction: 'up' | 'down' | 'none';\n isUp: boolean;\n isDown: boolean;\n ENTER: boolean;\n SPACE: boolean;\n TAB: boolean;\n ESC: boolean;\n LEFT: boolean;\n UP: boolean;\n RIGHT: boolean;\n DOWN: boolean;\n}\n\n/**\n * Create key service.\n */\nfunction createKeyService(): KeyService {\n let previousEvent;\n\n /**\n * Update props.\n */\n function updateProps(event: KeyboardEvent): KeyServiceProps {\n props.event = event;\n\n for (const [name, code] of Object.entries(keyCodes)) {\n props[name] = code === event.keyCode;\n }\n\n if (!previousEvent) {\n props.triggered = 0;\n }\n\n if (props.event.type === 'keydown' && previousEvent?.type === 'keydown') {\n props.triggered += 1;\n } else {\n props.triggered = 1;\n }\n\n previousEvent = props.event;\n\n props.direction = props.event.type === 'keydown' ? 'down' : 'up';\n props.isUp = props.event.type === 'keyup';\n props.isDown = props.event.type === 'keydown';\n\n return props;\n }\n\n /**\n * Trigger callbacks on keyboard event.\n */\n function onKey(event: KeyboardEvent) {\n trigger(updateProps(event));\n }\n\n const { add, remove, has, trigger, props } = useService({\n props: {\n event: null,\n triggered: 0,\n isUp: false,\n isDown: false,\n direction: 'none',\n ...getInitialKeyCodes(),\n } as KeyServiceProps,\n init() {\n document.addEventListener('keydown', onKey);\n document.addEventListener('keyup', onKey);\n },\n kill() {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('keyup', onKey);\n },\n });\n\n return {\n add,\n remove,\n has,\n props: () => props,\n };\n}\n\nlet key;\n\n/**\n * Use the keyboard service.\n */\nexport default function useKey(): KeyService {\n if (!key) {\n key = createKeyService();\n }\n\n return key;\n}\n"],
5
- "mappings": "AACA,SAAS,kBAAkB;AAC3B,OAAO,cAAc;AAMrB,SAAS,qBAA2D;AAClE,SAAO,OAAO,YAAY,OAAO,KAAK,QAAQ,EAAE,IAAI,CAACA,SAAQ,CAACA,MAAK,KAAK,CAAC,CAAC;AAI5E;AAuBA,SAAS,mBAA+B;AACtC,MAAI;AAKJ,WAAS,YAAY,OAAuC;AAC1D,UAAM,QAAQ;AAEd,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,YAAM,IAAI,IAAI,SAAS,MAAM;AAAA,IAC/B;AAEA,QAAI,CAAC,eAAe;AAClB,YAAM,YAAY;AAAA,IACpB;AAEA,QAAI,MAAM,MAAM,SAAS,aAAa,eAAe,SAAS,WAAW;AACvE,YAAM,aAAa;AAAA,IACrB,OAAO;AACL,YAAM,YAAY;AAAA,IACpB;AAEA,oBAAgB,MAAM;AAEtB,UAAM,YAAY,MAAM,MAAM,SAAS,YAAY,SAAS;AAC5D,UAAM,OAAO,MAAM,MAAM,SAAS;AAClC,UAAM,SAAS,MAAM,MAAM,SAAS;AAEpC,WAAO;AAAA,EACT;AAKA,WAAS,MAAM,OAAsB;AACnC,YAAQ,YAAY,KAAK,CAAC;AAAA,EAC5B;AAEA,QAAM,EAAE,KAAK,QAAQ,KAAK,SAAS,MAAM,IAAI,WAAW;AAAA,IACtD,OAAO;AAAA,MACL,OAAO;AAAA,MACP,WAAW;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,GAAG,mBAAmB;AAAA,IACxB;AAAA,IACA,OAAO;AACL,eAAS,iBAAiB,WAAW,KAAK;AAC1C,eAAS,iBAAiB,SAAS,KAAK;AAAA,IAC1C;AAAA,IACA,OAAO;AACL,eAAS,oBAAoB,WAAW,KAAK;AAC7C,eAAS,oBAAoB,SAAS,KAAK;AAAA,IAC7C;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AACF;AAEA,IAAI;AAKW,SAAR,SAAsC;AAC3C,MAAI,CAAC,KAAK;AACR,UAAM,iBAAiB;AAAA,EACzB;AAEA,SAAO;AACT;",
6
- "names": ["key"]
7
- }
@@ -1,11 +0,0 @@
1
- import type { ServiceInterface } from './index.js';
2
- export type LoadService = ServiceInterface<LoadServiceProps>;
3
- export interface LoadServiceProps {
4
- time: DOMHighResTimeStamp;
5
- }
6
- /**
7
- * Use the load service.
8
- *
9
- * @returns {LoadService}
10
- */
11
- export default function useLoad(): any;
package/services/load.js DELETED
@@ -1,38 +0,0 @@
1
- import { useService } from "./service.js";
2
- function createLoadService() {
3
- function onLoad() {
4
- props.time = window.performance.now();
5
- trigger(props);
6
- }
7
- const { add, remove, has, props, trigger } = useService({
8
- /**
9
- * @type {LoadServiceProps}
10
- */
11
- props: {
12
- time: performance.now()
13
- },
14
- init() {
15
- window.addEventListener("load", onLoad);
16
- },
17
- kill() {
18
- window.removeEventListener("load", onLoad);
19
- }
20
- });
21
- return {
22
- add,
23
- remove,
24
- has,
25
- props: () => props
26
- };
27
- }
28
- let load;
29
- function useLoad() {
30
- if (!load) {
31
- load = createLoadService();
32
- }
33
- return load;
34
- }
35
- export {
36
- useLoad as default
37
- };
38
- //# sourceMappingURL=load.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../packages/js-toolkit/services/load.ts"],
4
- "sourcesContent": ["/* eslint-disable no-use-before-define, @typescript-eslint/no-use-before-define */\nimport { useService } from './service.js';\nimport type { ServiceInterface } from './index.js';\n\nexport type LoadService = ServiceInterface<LoadServiceProps>;\n\nexport interface LoadServiceProps {\n time: DOMHighResTimeStamp;\n}\n\n/**\n * Get load service.\n *\n * @returns {LoadService}\n */\nfunction createLoadService() {\n /**\n * Trigger on load\n *\n * @returns {void}\n */\n function onLoad() {\n // eslint-disable-next-line no-use-before-define\n props.time = window.performance.now();\n // eslint-disable-next-line no-use-before-define\n trigger(props);\n }\n\n const { add, remove, has, props, trigger } = useService({\n /**\n * @type {LoadServiceProps}\n */\n props: {\n time: performance.now(),\n },\n init() {\n window.addEventListener('load', onLoad);\n },\n kill() {\n window.removeEventListener('load', onLoad);\n },\n });\n\n return {\n add,\n remove,\n has,\n props: () => props,\n };\n}\n\nlet load;\n\n/**\n * Use the load service.\n *\n * @returns {LoadService}\n */\nexport default function useLoad() {\n if (!load) {\n load = createLoadService();\n }\n\n return load;\n}\n"],
5
- "mappings": "AACA,SAAS,kBAAkB;AAc3B,SAAS,oBAAoB;AAM3B,WAAS,SAAS;AAEhB,UAAM,OAAO,OAAO,YAAY,IAAI;AAEpC,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,EAAE,KAAK,QAAQ,KAAK,OAAO,QAAQ,IAAI,WAAW;AAAA;AAAA;AAAA;AAAA,IAItD,OAAO;AAAA,MACL,MAAM,YAAY,IAAI;AAAA,IACxB;AAAA,IACA,OAAO;AACL,aAAO,iBAAiB,QAAQ,MAAM;AAAA,IACxC;AAAA,IACA,OAAO;AACL,aAAO,oBAAoB,QAAQ,MAAM;AAAA,IAC3C;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AACF;AAEA,IAAI;AAOW,SAAR,UAA2B;AAChC,MAAI,CAAC,MAAM;AACT,WAAO,kBAAkB;AAAA,EAC3B;AAEA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,32 +0,0 @@
1
- import type { ServiceInterface } from './index.js';
2
- export type PointerService = ServiceInterface<PointerServiceProps>;
3
- export interface PointerServiceProps {
4
- event: MouseEvent | TouchEvent;
5
- isDown: boolean;
6
- x: number;
7
- y: number;
8
- changed: {
9
- x: boolean;
10
- y: boolean;
11
- };
12
- last: {
13
- x: number;
14
- y: number;
15
- };
16
- delta: {
17
- x: number;
18
- y: number;
19
- };
20
- progress: {
21
- x: number;
22
- y: number;
23
- };
24
- max: {
25
- x: number;
26
- y: number;
27
- };
28
- }
29
- /**
30
- * Use the pointer service.
31
- */
32
- export default function usePointer(target?: HTMLElement): PointerService;
@@ -1,123 +0,0 @@
1
- import { useService } from "./service.js";
2
- import { isDefined } from "../utils/index.js";
3
- function isTouchEvent(event) {
4
- return typeof TouchEvent !== "undefined" && event instanceof TouchEvent;
5
- }
6
- const events = ["mousemove", "touchmove", "mousedown", "touchstart", "mouseup", "touchend"];
7
- function createPointerService(target) {
8
- function getTargetSize() {
9
- return isDefined(target) ? target.getBoundingClientRect() : {
10
- width: window.innerWidth,
11
- height: window.innerHeight,
12
- x: 0,
13
- y: 0
14
- };
15
- }
16
- function updateProps(event) {
17
- props.event = event;
18
- const yLast = props.y;
19
- const xLast = props.x;
20
- const targetSize2 = getTargetSize();
21
- let y = isTouchEvent(event) ? event.touches[0]?.clientY : event.clientY;
22
- y -= targetSize2.y;
23
- if (y !== props.y) {
24
- props.y = y;
25
- }
26
- let x = isTouchEvent(event) ? event.touches[0]?.clientX : event.clientX;
27
- x -= targetSize2.x;
28
- if (x !== props.x) {
29
- props.x = x;
30
- }
31
- props.changed.x = props.x !== xLast;
32
- props.changed.y = props.y !== yLast;
33
- props.last.x = xLast;
34
- props.last.y = yLast;
35
- props.delta.x = props.x - xLast;
36
- props.delta.y = props.y - yLast;
37
- props.max.x = targetSize2.width;
38
- props.max.y = targetSize2.height;
39
- props.progress.x = props.x / props.max.x;
40
- props.progress.y = props.y / props.max.y;
41
- return props;
42
- }
43
- function handleEvent(event) {
44
- switch (event.type) {
45
- case "mouseenter":
46
- case "mousemove":
47
- case "touchmove":
48
- trigger(updateProps(event));
49
- break;
50
- case "mousedown":
51
- case "touchstart":
52
- props.isDown = true;
53
- trigger(props);
54
- break;
55
- case "mouseup":
56
- case "touchend":
57
- props.isDown = false;
58
- trigger(props);
59
- break;
60
- }
61
- }
62
- const targetSize = getTargetSize();
63
- const { add, remove, has, trigger, props } = useService({
64
- props: {
65
- event: null,
66
- isDown: false,
67
- x: targetSize.x / 2,
68
- y: targetSize.y / 2,
69
- changed: {
70
- x: false,
71
- y: false
72
- },
73
- last: {
74
- x: targetSize.x / 2,
75
- y: targetSize.y / 2
76
- },
77
- delta: {
78
- x: 0,
79
- y: 0
80
- },
81
- progress: {
82
- x: 0.5,
83
- y: 0.5
84
- },
85
- max: {
86
- x: targetSize.width,
87
- y: targetSize.height
88
- }
89
- },
90
- init() {
91
- document.documentElement.addEventListener("mouseenter", handleEvent, {
92
- once: true,
93
- capture: true
94
- });
95
- const options = { passive: true, capture: true };
96
- for (const event of events) {
97
- document.addEventListener(event, handleEvent, options);
98
- }
99
- },
100
- kill() {
101
- for (const event of events) {
102
- document.removeEventListener(event, handleEvent);
103
- }
104
- }
105
- });
106
- return {
107
- add,
108
- remove,
109
- has,
110
- props: () => props
111
- };
112
- }
113
- const instances = /* @__PURE__ */ new Map();
114
- function usePointer(target) {
115
- if (!instances.has(target ?? window)) {
116
- instances.set(target ?? window, createPointerService(target));
117
- }
118
- return instances.get(target ?? window);
119
- }
120
- export {
121
- usePointer as default
122
- };
123
- //# sourceMappingURL=pointer.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../packages/js-toolkit/services/pointer.ts"],
4
- "sourcesContent": ["/* eslint-disable no-use-before-define, @typescript-eslint/no-use-before-define */\nimport { useService } from './service.js';\nimport type { ServiceInterface } from './index.js';\nimport { isDefined } from '../utils/index.js';\n\nexport type PointerService = ServiceInterface<PointerServiceProps>;\n\nexport interface PointerServiceProps {\n event: MouseEvent | TouchEvent;\n isDown: boolean;\n x: number;\n y: number;\n changed: { x: boolean; y: boolean };\n last: { x: number; y: number };\n delta: { x: number; y: number };\n progress: { x: number; y: number };\n max: { x: number; y: number };\n}\n\n/**\n * Test if an event is an instance of TouchEvent.\n */\nfunction isTouchEvent(event: TouchEvent | MouseEvent): boolean {\n return typeof TouchEvent !== 'undefined' && event instanceof TouchEvent;\n}\n\nconst events = ['mousemove', 'touchmove', 'mousedown', 'touchstart', 'mouseup', 'touchend'];\n\n/**\n * Get pointer service.\n */\nfunction createPointerService(target: HTMLElement | undefined): PointerService {\n function getTargetSize() {\n return isDefined(target)\n ? target.getBoundingClientRect()\n : {\n width: window.innerWidth,\n height: window.innerHeight,\n x: 0,\n y: 0,\n };\n }\n\n /**\n * Update the pointer positions.\n */\n function updateProps(event: MouseEvent | TouchEvent): PointerServiceProps {\n props.event = event;\n const yLast = props.y;\n const xLast = props.x;\n\n const targetSize = getTargetSize();\n\n // Check pointer Y\n // We either get data from a touch event `event.touches[0].clientY` or from\n // a mouse event `event.clientY`.\n let y = isTouchEvent(event)\n ? (event as TouchEvent).touches[0]?.clientY\n : (event as MouseEvent).clientY;\n y -= targetSize.y;\n if (y !== props.y) {\n props.y = y;\n }\n\n // Check pointer X\n // We either get data from a touch event `event.touches[0].clientX` or from\n // a mouse event `event.clientX`.\n let x = isTouchEvent(event)\n ? (event as TouchEvent).touches[0]?.clientX\n : (event as MouseEvent).clientX;\n x -= targetSize.x;\n if (x !== props.x) {\n props.x = x;\n }\n\n props.changed.x = props.x !== xLast;\n props.changed.y = props.y !== yLast;\n\n props.last.x = xLast;\n props.last.y = yLast;\n\n props.delta.x = props.x - xLast;\n props.delta.y = props.y - yLast;\n\n props.max.x = targetSize.width;\n props.max.y = targetSize.height;\n\n props.progress.x = props.x / props.max.x;\n props.progress.y = props.y / props.max.y;\n\n return props;\n }\n\n /**\n * Handle events.\n *\n * @todo handle scroll as well\n */\n function handleEvent(event: MouseEvent | TouchEvent) {\n // eslint-disable-next-line default-case\n switch (event.type) {\n case 'mouseenter':\n case 'mousemove':\n case 'touchmove':\n trigger(updateProps(event));\n break;\n case 'mousedown':\n case 'touchstart':\n props.isDown = true;\n trigger(props);\n break;\n case 'mouseup':\n case 'touchend':\n props.isDown = false;\n trigger(props);\n break;\n }\n }\n\n const targetSize = getTargetSize();\n const { add, remove, has, trigger, props } = useService({\n props: {\n event: null,\n isDown: false,\n x: targetSize.x / 2,\n y: targetSize.y / 2,\n changed: {\n x: false,\n y: false,\n },\n last: {\n x: targetSize.x / 2,\n y: targetSize.y / 2,\n },\n delta: {\n x: 0,\n y: 0,\n },\n progress: {\n x: 0.5,\n y: 0.5,\n },\n max: {\n x: targetSize.width,\n y: targetSize.height,\n },\n } as PointerServiceProps,\n init() {\n document.documentElement.addEventListener('mouseenter', handleEvent, {\n once: true,\n capture: true,\n });\n\n const options = { passive: true, capture: true };\n for (const event of events) {\n document.addEventListener(event, handleEvent, options);\n }\n },\n kill() {\n for (const event of events) {\n document.removeEventListener(event, handleEvent);\n }\n },\n });\n\n return {\n add,\n remove,\n has,\n props: () => props,\n };\n}\n\nconst instances = new Map<HTMLElement | Window, PointerService>();\n\n/**\n * Use the pointer service.\n */\nexport default function usePointer(target?: HTMLElement): PointerService {\n if (!instances.has(target ?? window)) {\n instances.set(target ?? window, createPointerService(target));\n }\n return instances.get(target ?? window) as PointerService;\n}\n"],
5
- "mappings": "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",
6
- "names": ["targetSize"]
7
- }
package/services/raf.d.ts DELETED
@@ -1,9 +0,0 @@
1
- import type { ServiceInterface } from './index.js';
2
- export type RafService = ServiceInterface<RafServiceProps>;
3
- export interface RafServiceProps {
4
- time: DOMHighResTimeStamp;
5
- }
6
- /**
7
- * Use the RequestAnimationFrame (raf) service.
8
- */
9
- export default function useRaf(): RafService;