@msobiecki/react-marauders-path 1.28.0 → 1.30.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/README.md +99 -27
- package/dist/index.d.ts +98 -8
- package/dist/index.js +39 -29
- package/dist/index.js.map +1 -1
- package/dist/use-double-tap/event-guards.js +7 -0
- package/dist/use-double-tap/event-guards.js.map +1 -0
- package/dist/use-double-tap/use-double-tap.js +32 -26
- package/dist/use-double-tap/use-double-tap.js.map +1 -1
- package/dist/use-drag/event-guards.js +7 -0
- package/dist/use-drag/event-guards.js.map +1 -0
- package/dist/use-drag/use-drag.js +72 -53
- package/dist/use-drag/use-drag.js.map +1 -1
- package/dist/use-drag/use-drag.types.js.map +1 -1
- package/dist/use-key/event-guards.js +1 -1
- package/dist/use-key/event-guards.js.map +1 -1
- package/dist/use-key/use-key.js +48 -51
- package/dist/use-key/use-key.js.map +1 -1
- package/dist/use-key/use-key.types.js.map +1 -1
- package/dist/use-mouse/use-mouse.js +100 -0
- package/dist/use-mouse/use-mouse.js.map +1 -0
- package/dist/use-mouse/use-mouse.types.js +23 -0
- package/dist/use-mouse/use-mouse.types.js.map +1 -0
- package/dist/use-pinch/event-guards.js +7 -0
- package/dist/use-pinch/event-guards.js.map +1 -0
- package/dist/use-pinch/use-pinch.js +93 -70
- package/dist/use-pinch/use-pinch.js.map +1 -1
- package/dist/use-pinch/use-pinch.types.js.map +1 -1
- package/dist/use-pointer/event-guards.js +7 -0
- package/dist/use-pointer/event-guards.js.map +1 -0
- package/dist/use-pointer/invoke-pointer-action.js +7 -0
- package/dist/use-pointer/invoke-pointer-action.js.map +1 -0
- package/dist/use-pointer/use-pointer.js +74 -0
- package/dist/use-pointer/use-pointer.js.map +1 -0
- package/dist/use-pointer/use-pointer.types.js +19 -0
- package/dist/use-pointer/use-pointer.types.js.map +1 -0
- package/dist/use-press/event-guards.js +7 -0
- package/dist/use-press/event-guards.js.map +1 -0
- package/dist/use-press/use-press.js +83 -57
- package/dist/use-press/use-press.js.map +1 -1
- package/dist/use-swipe/event-guards.js +7 -0
- package/dist/use-swipe/event-guards.js.map +1 -0
- package/dist/use-swipe/use-swipe.js +81 -62
- package/dist/use-swipe/use-swipe.js.map +1 -1
- package/dist/use-swipe/use-swipe.types.js.map +1 -1
- package/dist/use-tap/event-guards.js +7 -0
- package/dist/use-tap/event-guards.js.map +1 -0
- package/dist/use-tap/use-tap.js +66 -48
- package/dist/use-tap/use-tap.js.map +1 -1
- package/dist/use-wheel/use-wheel.js +1 -1
- package/dist/use-wheel/use-wheel.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { useRef as O, useMemo as y, useCallback as X } from "react";
|
|
2
|
+
import { MouseButtons as d, MouseEventTypes as e } from "./use-mouse.types.js";
|
|
3
|
+
import Y from "../use-pointer/use-pointer.js";
|
|
4
|
+
import { PointerEventPointerTypes as g, PointerEventTypes as s } from "../use-pointer/use-pointer.types.js";
|
|
5
|
+
const R = {
|
|
6
|
+
eventType: [
|
|
7
|
+
e.Move,
|
|
8
|
+
e.Down,
|
|
9
|
+
e.Up,
|
|
10
|
+
e.Click,
|
|
11
|
+
e.DoubleClick
|
|
12
|
+
],
|
|
13
|
+
eventButtons: [d.Left, d.Middle, d.Right],
|
|
14
|
+
eventCapture: !1,
|
|
15
|
+
eventOnce: !1,
|
|
16
|
+
eventStopImmediatePropagation: !1,
|
|
17
|
+
container: { current: null }
|
|
18
|
+
}, S = 300, I = 8, A = (i) => {
|
|
19
|
+
const r = /* @__PURE__ */ new Set();
|
|
20
|
+
return i.forEach((n) => {
|
|
21
|
+
if (n === e.Move) {
|
|
22
|
+
r.add(s.Move);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (n === e.Down) {
|
|
26
|
+
r.add(s.Down);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
(n === e.Up || n === e.Click || n === e.DoubleClick) && r.add(s.Up);
|
|
30
|
+
}), [...r];
|
|
31
|
+
}, F = (i, r = {}) => {
|
|
32
|
+
const {
|
|
33
|
+
eventType: n,
|
|
34
|
+
eventButtons: M,
|
|
35
|
+
eventCapture: T,
|
|
36
|
+
eventOnce: m,
|
|
37
|
+
eventStopImmediatePropagation: D,
|
|
38
|
+
container: v
|
|
39
|
+
} = { ...R, ...r }, f = O(null), h = y(
|
|
40
|
+
() => A(n),
|
|
41
|
+
[n]
|
|
42
|
+
), P = y(
|
|
43
|
+
() => ({
|
|
44
|
+
eventType: h,
|
|
45
|
+
eventPointerTypes: [g.Mouse],
|
|
46
|
+
eventCapture: T,
|
|
47
|
+
eventOnce: m,
|
|
48
|
+
eventStopImmediatePropagation: D,
|
|
49
|
+
container: v
|
|
50
|
+
}),
|
|
51
|
+
[
|
|
52
|
+
v,
|
|
53
|
+
T,
|
|
54
|
+
m,
|
|
55
|
+
D,
|
|
56
|
+
h
|
|
57
|
+
]
|
|
58
|
+
), b = X(
|
|
59
|
+
(t, p, w) => {
|
|
60
|
+
let o = !1;
|
|
61
|
+
const c = t.button, k = p === s.Move, C = M.includes(c);
|
|
62
|
+
if (!k && !C)
|
|
63
|
+
return !1;
|
|
64
|
+
const u = {
|
|
65
|
+
x: w.x,
|
|
66
|
+
y: w.y
|
|
67
|
+
};
|
|
68
|
+
if (p === s.Move && n.includes(e.Move) && (o = i(t, e.Move, c, u) === !0 || o), p === s.Down && n.includes(e.Down) && (o = i(t, e.Down, c, u) === !0 || o), p === s.Up && (n.includes(e.Up) && (o = i(t, e.Up, c, u) === !0 || o), n.includes(e.Click) && (o = i(t, e.Click, c, u) === !0 || o), n.includes(e.DoubleClick))) {
|
|
69
|
+
const a = Date.now(), l = f.current;
|
|
70
|
+
if (l) {
|
|
71
|
+
const x = a - l.time, E = t.clientX - l.x, U = t.clientY - l.y, B = Math.hypot(E, U);
|
|
72
|
+
x <= S && B <= I && t.button === l.button ? (o = i(
|
|
73
|
+
t,
|
|
74
|
+
e.DoubleClick,
|
|
75
|
+
c,
|
|
76
|
+
u
|
|
77
|
+
) === !0 || o, f.current = null) : f.current = {
|
|
78
|
+
time: a,
|
|
79
|
+
x: t.clientX,
|
|
80
|
+
y: t.clientY,
|
|
81
|
+
button: t.button
|
|
82
|
+
};
|
|
83
|
+
} else
|
|
84
|
+
f.current = {
|
|
85
|
+
time: a,
|
|
86
|
+
x: t.clientX,
|
|
87
|
+
y: t.clientY,
|
|
88
|
+
button: t.button
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return !!o;
|
|
92
|
+
},
|
|
93
|
+
[M, n, i]
|
|
94
|
+
);
|
|
95
|
+
Y(b, P);
|
|
96
|
+
};
|
|
97
|
+
export {
|
|
98
|
+
F as default
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=use-mouse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mouse.js","sources":["../../src/use-mouse/use-mouse.ts"],"sourcesContent":["import { useCallback, useMemo, useRef } from \"react\";\nimport {\n MouseData,\n MouseButton,\n MouseButtons,\n MouseEventType,\n MouseEventTypes,\n MouseOptions,\n UseMouseCallback,\n UseMouseOptions,\n} from \"./use-mouse.types\";\nimport { usePointer } from \"../use-pointer\";\nimport {\n PointerData,\n PointerEventPointerTypes,\n PointerEventType,\n PointerEventTypes,\n PointerOptions,\n} from \"../use-pointer/use-pointer.types\";\n\nconst defaultOptions: MouseOptions = {\n eventType: [\n MouseEventTypes.Move,\n MouseEventTypes.Down,\n MouseEventTypes.Up,\n MouseEventTypes.Click,\n MouseEventTypes.DoubleClick,\n ],\n eventButtons: [MouseButtons.Left, MouseButtons.Middle, MouseButtons.Right],\n eventCapture: false,\n eventOnce: false,\n eventStopImmediatePropagation: false,\n container: { current: null },\n};\n\nconst clickThreshold = 300;\nconst clickDistanceThreshold = 8;\n\nconst mapMouseTypesToPointerTypes = (\n eventTypes: MouseEventType[],\n): PointerEventType[] => {\n const pointerTypes = new Set<PointerEventType>();\n\n eventTypes.forEach((type) => {\n if (type === MouseEventTypes.Move) {\n pointerTypes.add(PointerEventTypes.Move);\n return;\n }\n\n if (type === MouseEventTypes.Down) {\n pointerTypes.add(PointerEventTypes.Down);\n return;\n }\n\n if (\n type === MouseEventTypes.Up ||\n type === MouseEventTypes.Click ||\n type === MouseEventTypes.DoubleClick\n ) {\n pointerTypes.add(PointerEventTypes.Up);\n }\n });\n\n return [...pointerTypes];\n};\n\nconst useMouse = (\n mouseCallback: UseMouseCallback,\n options: UseMouseOptions = {},\n) => {\n const {\n eventType,\n eventButtons,\n eventCapture,\n eventOnce,\n eventStopImmediatePropagation,\n container,\n } = { ...defaultOptions, ...options };\n\n const lastClickReference = useRef<{\n time: number;\n x: number;\n y: number;\n button: number;\n } | null>(null);\n\n const pointerEventType = useMemo(\n () => mapMouseTypesToPointerTypes(eventType),\n [eventType],\n );\n\n const pointerOptions = useMemo<Partial<PointerOptions>>(\n () => ({\n eventType: pointerEventType,\n eventPointerTypes: [PointerEventPointerTypes.Mouse],\n eventCapture,\n eventOnce,\n eventStopImmediatePropagation,\n container,\n }),\n [\n container,\n eventCapture,\n eventOnce,\n eventStopImmediatePropagation,\n pointerEventType,\n ],\n );\n\n const handleMouse = useCallback(\n (event: PointerEvent, type: PointerEventType, data: PointerData) => {\n let shouldPrevent = false;\n\n const button = event.button as MouseButton;\n\n const isMoveEvent = type === PointerEventTypes.Move;\n const isAllowedButton = eventButtons.includes(button);\n\n if (!isMoveEvent && !isAllowedButton) {\n return false;\n }\n\n const mouseData: MouseData = {\n x: data.x,\n y: data.y,\n };\n\n if (\n type === PointerEventTypes.Move &&\n eventType.includes(MouseEventTypes.Move)\n ) {\n shouldPrevent =\n mouseCallback(event, MouseEventTypes.Move, button, mouseData) ===\n true || shouldPrevent;\n }\n\n if (\n type === PointerEventTypes.Down &&\n eventType.includes(MouseEventTypes.Down)\n ) {\n shouldPrevent =\n mouseCallback(event, MouseEventTypes.Down, button, mouseData) ===\n true || shouldPrevent;\n }\n\n if (type === PointerEventTypes.Up) {\n if (eventType.includes(MouseEventTypes.Up)) {\n shouldPrevent =\n mouseCallback(event, MouseEventTypes.Up, button, mouseData) ===\n true || shouldPrevent;\n }\n\n if (eventType.includes(MouseEventTypes.Click)) {\n shouldPrevent =\n mouseCallback(event, MouseEventTypes.Click, button, mouseData) ===\n true || shouldPrevent;\n }\n\n if (eventType.includes(MouseEventTypes.DoubleClick)) {\n const now = Date.now();\n const lastClick = lastClickReference.current;\n\n if (lastClick) {\n const deltaTime = now - lastClick.time;\n const deltaX = event.clientX - lastClick.x;\n const deltaY = event.clientY - lastClick.y;\n const distance = Math.hypot(deltaX, deltaY);\n\n if (\n deltaTime <= clickThreshold &&\n distance <= clickDistanceThreshold &&\n event.button === lastClick.button\n ) {\n shouldPrevent =\n mouseCallback(\n event,\n MouseEventTypes.DoubleClick,\n button,\n mouseData,\n ) === true || shouldPrevent;\n\n lastClickReference.current = null;\n } else {\n lastClickReference.current = {\n time: now,\n x: event.clientX,\n y: event.clientY,\n button: event.button,\n };\n }\n } else {\n lastClickReference.current = {\n time: now,\n x: event.clientX,\n y: event.clientY,\n button: event.button,\n };\n }\n }\n }\n\n if (!shouldPrevent) {\n return false;\n }\n\n return true;\n },\n [eventButtons, eventType, mouseCallback],\n );\n\n usePointer(handleMouse, pointerOptions);\n};\n\nexport default useMouse;\n"],"names":["defaultOptions","MouseEventTypes","MouseButtons","clickThreshold","clickDistanceThreshold","mapMouseTypesToPointerTypes","eventTypes","pointerTypes","type","PointerEventTypes","useMouse","mouseCallback","options","eventType","eventButtons","eventCapture","eventOnce","eventStopImmediatePropagation","container","lastClickReference","useRef","pointerEventType","useMemo","pointerOptions","PointerEventPointerTypes","handleMouse","useCallback","event","data","shouldPrevent","button","isMoveEvent","isAllowedButton","mouseData","now","lastClick","deltaTime","deltaX","deltaY","distance","usePointer"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const e = {
|
|
2
|
+
Click: "click",
|
|
3
|
+
ContextMenu: "contextmenu",
|
|
4
|
+
DoubleClick: "dblclick",
|
|
5
|
+
Down: "mousedown",
|
|
6
|
+
Enter: "mouseenter",
|
|
7
|
+
Leave: "mouseleave",
|
|
8
|
+
Move: "mousemove",
|
|
9
|
+
Out: "mouseout",
|
|
10
|
+
Over: "mouseover",
|
|
11
|
+
Up: "mouseup"
|
|
12
|
+
}, o = {
|
|
13
|
+
Left: 0,
|
|
14
|
+
Middle: 1,
|
|
15
|
+
Right: 2,
|
|
16
|
+
Fourth: 3,
|
|
17
|
+
Fifth: 4
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
o as MouseButtons,
|
|
21
|
+
e as MouseEventTypes
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=use-mouse.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mouse.types.js","sources":["../../src/use-mouse/use-mouse.types.ts"],"sourcesContent":["export const MouseEventTypes = {\n Click: \"click\",\n ContextMenu: \"contextmenu\",\n DoubleClick: \"dblclick\",\n Down: \"mousedown\",\n Enter: \"mouseenter\",\n Leave: \"mouseleave\",\n Move: \"mousemove\",\n Out: \"mouseout\",\n Over: \"mouseover\",\n Up: \"mouseup\",\n} as const;\n\nexport type MouseEventType =\n (typeof MouseEventTypes)[keyof typeof MouseEventTypes];\n\nexport const MouseButtons = {\n Left: 0,\n Middle: 1,\n Right: 2,\n Fourth: 3,\n Fifth: 4,\n} as const;\n\nexport type MouseButton = (typeof MouseButtons)[keyof typeof MouseButtons];\n\nexport interface MouseOptions {\n eventType: MouseEventType[];\n eventButtons: MouseButton[];\n eventCapture: boolean;\n eventOnce: boolean;\n eventStopImmediatePropagation: boolean;\n container: { current: EventTarget | null };\n}\n\nexport interface MouseData {\n x: number;\n y: number;\n}\n\nexport type UseMouseCallback =\n | ((\n event: MouseEvent,\n type: MouseEventType,\n button: MouseButton,\n data: MouseData,\n ...properties: unknown[]\n ) => void)\n | ((\n event: MouseEvent,\n type: MouseEventType,\n button: MouseButton,\n data: MouseData,\n ...properties: unknown[]\n ) => boolean);\n\nexport type UseMouseOptions = Partial<MouseOptions>;\n"],"names":["MouseEventTypes","MouseButtons"],"mappings":"AAAO,MAAMA,IAAkB;AAAA,EAC7B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AACN,GAKaC,IAAe;AAAA,EAC1B,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-guards.js","sources":["../../src/use-pinch/event-guards.ts"],"sourcesContent":["import { PinchEventPointerType } from \"./use-pinch.types\";\n\n/**\n * Determines whether a pointer event should be handled based on event options.\n *\n * @param {PointerEvent} event - The pointer event to evaluate\n * @param {Object} options - Event handling options\n * @param {PinchEventPointerType[]} options.eventPointerTypes - Allowed pointer types for the event\n * @returns {boolean} True if the event should be handled, false otherwise\n *\n * @example\n * const shouldHandle = shouldHandleEvent(event, {\n * eventPointerTypes: [PinchEventPointerTypes.Touch]\n * });\n */\nexport const shouldHandleEvent = (\n event: PointerEvent,\n options: {\n eventPointerTypes: PinchEventPointerType[];\n },\n) => {\n if (!event.isPrimary) {\n return false;\n }\n if (\n !options.eventPointerTypes.includes(\n event.pointerType as PinchEventPointerType,\n )\n ) {\n return false;\n }\n\n return true;\n};\n"],"names":["shouldHandleEvent","event","options"],"mappings":"AAeO,MAAMA,IAAoB,CAC/BC,GACAC,MAII,GAACD,EAAM,aAIT,CAACC,EAAQ,kBAAkB;AAAA,EACzBD,EAAM;AAAA;"}
|
|
@@ -1,129 +1,152 @@
|
|
|
1
|
-
import { useRef as
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { useRef as a, useCallback as m, useEffect as F } from "react";
|
|
2
|
+
import { PinchEventPointerTypes as S } from "./use-pinch.types.js";
|
|
3
|
+
import { invokePinchAction as T } from "./invoke-pinch-action.js";
|
|
4
|
+
import { shouldHandleEvent as D } from "./event-guards.js";
|
|
5
|
+
const U = {
|
|
6
|
+
eventPointerTypes: [S.Touch],
|
|
5
7
|
eventCapture: !1,
|
|
6
8
|
eventOnce: !1,
|
|
7
9
|
eventStopImmediatePropagation: !1,
|
|
8
10
|
threshold: 0,
|
|
9
11
|
container: { current: null },
|
|
10
12
|
raf: !1
|
|
11
|
-
},
|
|
13
|
+
}, B = (h, A = {}) => {
|
|
12
14
|
const {
|
|
13
|
-
eventPointerTypes:
|
|
14
|
-
eventCapture:
|
|
15
|
-
eventOnce:
|
|
16
|
-
eventStopImmediatePropagation:
|
|
17
|
-
threshold:
|
|
18
|
-
container:
|
|
19
|
-
raf:
|
|
20
|
-
} = { ...
|
|
15
|
+
eventPointerTypes: r,
|
|
16
|
+
eventCapture: l,
|
|
17
|
+
eventOnce: v,
|
|
18
|
+
eventStopImmediatePropagation: P,
|
|
19
|
+
threshold: L,
|
|
20
|
+
container: g,
|
|
21
|
+
raf: R
|
|
22
|
+
} = { ...U, ...A }, u = a(null), p = a(null), f = a(null), E = a(null), I = a(null), i = a({
|
|
21
23
|
pointers: /* @__PURE__ */ new Map(),
|
|
22
24
|
startDistance: 0,
|
|
23
25
|
lastDistance: 0,
|
|
24
26
|
active: !1
|
|
25
|
-
}),
|
|
26
|
-
|
|
27
|
-
const t =
|
|
28
|
-
!t || !e || (
|
|
29
|
-
stopImmediate:
|
|
30
|
-
once:
|
|
27
|
+
}), M = m(() => {
|
|
28
|
+
f.current = null;
|
|
29
|
+
const t = E.current, e = I.current;
|
|
30
|
+
!t || !e || (T(e, t, h, {
|
|
31
|
+
stopImmediate: P,
|
|
32
|
+
once: v,
|
|
31
33
|
onOnce: () => {
|
|
32
|
-
|
|
34
|
+
p.current?.abort();
|
|
33
35
|
}
|
|
34
|
-
}),
|
|
35
|
-
}, [
|
|
36
|
+
}), E.current = null, I.current = null);
|
|
37
|
+
}, [h, P, v]), X = m(
|
|
36
38
|
(t) => {
|
|
37
|
-
if (!
|
|
39
|
+
if (!D(t, {
|
|
40
|
+
eventPointerTypes: r
|
|
41
|
+
}))
|
|
38
42
|
return;
|
|
39
|
-
const e =
|
|
43
|
+
const e = i.current;
|
|
40
44
|
if (e.pointers.set(t.pointerId, t), e.pointers.size === 2) {
|
|
41
|
-
const [
|
|
42
|
-
e.startDistance =
|
|
45
|
+
const [c, s] = [...e.pointers.values()], d = s.clientX - c.clientX, n = s.clientY - c.clientY, o = Math.hypot(d, n);
|
|
46
|
+
e.startDistance = o, e.lastDistance = o, e.active = !0;
|
|
43
47
|
}
|
|
44
48
|
},
|
|
45
|
-
[
|
|
46
|
-
),
|
|
49
|
+
[r]
|
|
50
|
+
), Y = m(
|
|
47
51
|
(t) => {
|
|
48
|
-
|
|
52
|
+
if (!D(t, {
|
|
53
|
+
eventPointerTypes: r
|
|
54
|
+
}))
|
|
55
|
+
return;
|
|
56
|
+
const e = i.current;
|
|
49
57
|
if (!e.active || !e.pointers.has(t.pointerId) || (e.pointers.set(t.pointerId, t), e.pointers.size < 2))
|
|
50
58
|
return;
|
|
51
|
-
const [
|
|
52
|
-
if (Math.abs(
|
|
59
|
+
const [c, s] = [...e.pointers.values()], d = s.clientX - c.clientX, n = s.clientY - c.clientY, o = Math.hypot(d, n), C = o - e.lastDistance, y = o - e.startDistance;
|
|
60
|
+
if (Math.abs(y) < L)
|
|
53
61
|
return;
|
|
54
|
-
const
|
|
55
|
-
distance:
|
|
62
|
+
const z = o / e.startDistance, O = {
|
|
63
|
+
distance: o,
|
|
56
64
|
delta: C,
|
|
57
|
-
totalDelta:
|
|
58
|
-
scale:
|
|
65
|
+
totalDelta: y,
|
|
66
|
+
scale: z
|
|
59
67
|
};
|
|
60
|
-
if (e.lastDistance =
|
|
61
|
-
|
|
62
|
-
stopImmediate:
|
|
63
|
-
once:
|
|
68
|
+
if (e.lastDistance = o, !R) {
|
|
69
|
+
T(t, O, h, {
|
|
70
|
+
stopImmediate: P,
|
|
71
|
+
once: v,
|
|
64
72
|
onOnce: () => {
|
|
65
|
-
|
|
73
|
+
p.current?.abort();
|
|
66
74
|
}
|
|
67
75
|
});
|
|
68
76
|
return;
|
|
69
77
|
}
|
|
70
|
-
|
|
78
|
+
E.current = O, I.current = t, f.current === null && (f.current = requestAnimationFrame(M));
|
|
71
79
|
},
|
|
72
80
|
[
|
|
73
|
-
|
|
74
|
-
g,
|
|
81
|
+
r,
|
|
75
82
|
v,
|
|
83
|
+
P,
|
|
84
|
+
L,
|
|
85
|
+
R,
|
|
76
86
|
h,
|
|
77
|
-
|
|
78
|
-
R
|
|
87
|
+
M
|
|
79
88
|
]
|
|
80
|
-
),
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
), b = m(
|
|
90
|
+
(t) => {
|
|
91
|
+
if (!D(t, {
|
|
92
|
+
eventPointerTypes: r
|
|
93
|
+
}))
|
|
94
|
+
return;
|
|
95
|
+
const e = i.current;
|
|
96
|
+
e.pointers.delete(t.pointerId), e.pointers.size < 2 && (e.active = !1, e.startDistance = 0, e.lastDistance = 0);
|
|
97
|
+
},
|
|
98
|
+
[r]
|
|
99
|
+
), w = m(
|
|
100
|
+
(t) => {
|
|
101
|
+
if (!D(t, {
|
|
102
|
+
eventPointerTypes: r
|
|
103
|
+
}))
|
|
104
|
+
return;
|
|
105
|
+
const e = i.current;
|
|
106
|
+
e.pointers.delete(t.pointerId), e.active = !1;
|
|
107
|
+
},
|
|
108
|
+
[r]
|
|
109
|
+
);
|
|
110
|
+
F(() => {
|
|
111
|
+
u.current = g?.current ?? globalThis, p.current = new AbortController();
|
|
112
|
+
const { signal: t } = p.current, e = (n) => n instanceof PointerEvent && X(n), c = (n) => n instanceof PointerEvent && Y(n), s = (n) => n instanceof PointerEvent && b(n), d = (n) => n instanceof PointerEvent && w(n);
|
|
113
|
+
return u.current.addEventListener(
|
|
91
114
|
"pointerdown",
|
|
92
115
|
e,
|
|
93
116
|
{
|
|
94
|
-
capture:
|
|
117
|
+
capture: l,
|
|
95
118
|
signal: t
|
|
96
119
|
}
|
|
97
|
-
),
|
|
120
|
+
), u.current.addEventListener(
|
|
98
121
|
"pointermove",
|
|
99
|
-
|
|
122
|
+
c,
|
|
100
123
|
{
|
|
101
|
-
capture:
|
|
124
|
+
capture: l,
|
|
102
125
|
signal: t
|
|
103
126
|
}
|
|
104
|
-
),
|
|
105
|
-
capture:
|
|
127
|
+
), u.current.addEventListener("pointerup", s, {
|
|
128
|
+
capture: l,
|
|
106
129
|
signal: t
|
|
107
|
-
}),
|
|
130
|
+
}), u.current.addEventListener(
|
|
108
131
|
"pointercancel",
|
|
109
132
|
d,
|
|
110
133
|
{
|
|
111
|
-
capture:
|
|
134
|
+
capture: l,
|
|
112
135
|
signal: t
|
|
113
136
|
}
|
|
114
137
|
), () => {
|
|
115
|
-
|
|
138
|
+
p.current?.abort(), i.current.active = !1, i.current.pointers.clear(), f.current !== null && cancelAnimationFrame(f.current);
|
|
116
139
|
};
|
|
117
140
|
}, [
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
M,
|
|
141
|
+
g,
|
|
142
|
+
l,
|
|
121
143
|
X,
|
|
122
144
|
Y,
|
|
123
|
-
b
|
|
145
|
+
b,
|
|
146
|
+
w
|
|
124
147
|
]);
|
|
125
148
|
};
|
|
126
149
|
export {
|
|
127
|
-
|
|
150
|
+
B as default
|
|
128
151
|
};
|
|
129
152
|
//# sourceMappingURL=use-pinch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-pinch.js","sources":["../../src/use-pinch/use-pinch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from \"react\";\nimport {\n PinchState,\n PinchData,\n UsePinchCallback,\n UsePinchOptions,\n PinchOptions,\n PinchEventPointerType,\n} from \"./use-pinch.types\";\nimport { invokePinchAction } from \"./invoke-pinch-action\";\n\nconst defaultOptions: PinchOptions = {\n eventPointerTypes: [\"touch\"],\n eventCapture: false,\n eventOnce: false,\n eventStopImmediatePropagation: false,\n threshold: 0,\n container: { current: null },\n raf: false,\n};\n\nconst usePinch = (\n pinchCallback: UsePinchCallback,\n options: UsePinchOptions = {},\n) => {\n const {\n eventPointerTypes,\n eventCapture,\n eventOnce,\n eventStopImmediatePropagation,\n threshold,\n container,\n raf,\n } = { ...defaultOptions, ...options };\n\n const targetReference = useRef<EventTarget | null>(null);\n const abortControllerReference = useRef<AbortController | null>(null);\n\n const frameReference = useRef<number | null>(null);\n const pendingDataReference = useRef<PinchData | null>(null);\n const pendingEventReference = useRef<PointerEvent | null>(null);\n\n const pinchStateReference = useRef<PinchState>({\n pointers: new Map(),\n startDistance: 0,\n lastDistance: 0,\n active: false,\n });\n\n const flushFrame = useCallback(() => {\n frameReference.current = null;\n\n const data = pendingDataReference.current;\n const event = pendingEventReference.current;\n\n if (!data || !event) {\n return;\n }\n\n invokePinchAction(event, data, pinchCallback, {\n stopImmediate: eventStopImmediatePropagation,\n once: eventOnce,\n onOnce: () => {\n abortControllerReference.current?.abort();\n },\n });\n\n pendingDataReference.current = null;\n pendingEventReference.current = null;\n }, [pinchCallback, eventStopImmediatePropagation, eventOnce]);\n\n const handlePointerDown = useCallback(\n (event: PointerEvent) => {\n if (\n !eventPointerTypes.includes(event.pointerType as PinchEventPointerType)\n ) {\n return;\n }\n\n const state = pinchStateReference.current;\n\n state.pointers.set(event.pointerId, event);\n\n if (state.pointers.size === 2) {\n const [pointer1, pointer2] = [...state.pointers.values()];\n\n const deltaX = pointer2.clientX - pointer1.clientX;\n const deltaY = pointer2.clientY - pointer1.clientY;\n\n const distance = Math.hypot(deltaX, deltaY);\n\n state.startDistance = distance;\n state.lastDistance = distance;\n state.active = true;\n }\n },\n [eventPointerTypes],\n );\n\n const handlePointerMove = useCallback(\n (event: PointerEvent) => {\n const state = pinchStateReference.current;\n if (!state.active) {\n return;\n }\n\n if (!state.pointers.has(event.pointerId)) {\n return;\n }\n\n state.pointers.set(event.pointerId, event);\n\n if (state.pointers.size < 2) {\n return;\n }\n\n const [pointer1, pointer2] = [...state.pointers.values()];\n\n const deltaX = pointer2.clientX - pointer1.clientX;\n const deltaY = pointer2.clientY - pointer1.clientY;\n\n const distance = Math.hypot(deltaX, deltaY);\n\n const delta = distance - state.lastDistance;\n const totalDelta = distance - state.startDistance;\n\n if (Math.abs(totalDelta) < threshold) {\n return;\n }\n\n const scale = distance / state.startDistance;\n\n const data: PinchData = {\n distance,\n delta,\n totalDelta,\n scale,\n };\n\n state.lastDistance = distance;\n\n if (!raf) {\n invokePinchAction(event, data, pinchCallback, {\n stopImmediate: eventStopImmediatePropagation,\n once: eventOnce,\n onOnce: () => {\n abortControllerReference.current?.abort();\n },\n });\n return;\n }\n\n pendingDataReference.current = data;\n pendingEventReference.current = event;\n\n if (frameReference.current === null) {\n frameReference.current = requestAnimationFrame(flushFrame);\n }\n },\n [\n threshold,\n raf,\n pinchCallback,\n eventStopImmediatePropagation,\n eventOnce,\n flushFrame,\n ],\n );\n\n const handlePointerUp = useCallback((event: PointerEvent) => {\n const state = pinchStateReference.current;\n\n state.pointers.delete(event.pointerId);\n\n if (state.pointers.size < 2) {\n state.active = false;\n state.startDistance = 0;\n state.lastDistance = 0;\n }\n }, []);\n\n const handlePointerCancel = useCallback((event: PointerEvent) => {\n const state = pinchStateReference.current;\n\n state.pointers.delete(event.pointerId);\n state.active = false;\n }, []);\n\n useEffect(() => {\n targetReference.current = container?.current ?? globalThis;\n abortControllerReference.current = new AbortController();\n const { signal } = abortControllerReference.current;\n\n const pointerDownListener = (event: Event) =>\n event instanceof PointerEvent && handlePointerDown(event);\n\n const pointerMoveListener = (event: Event) =>\n event instanceof PointerEvent && handlePointerMove(event);\n\n const pointerUpListener = (event: Event) =>\n event instanceof PointerEvent && handlePointerUp(event);\n\n const pointerCancelListener = (event: Event) =>\n event instanceof PointerEvent && handlePointerCancel(event);\n\n targetReference.current.addEventListener(\n \"pointerdown\",\n pointerDownListener,\n {\n capture: eventCapture,\n signal,\n },\n );\n\n targetReference.current.addEventListener(\n \"pointermove\",\n pointerMoveListener,\n {\n capture: eventCapture,\n signal,\n },\n );\n\n targetReference.current.addEventListener(\"pointerup\", pointerUpListener, {\n capture: eventCapture,\n signal,\n });\n\n targetReference.current.addEventListener(\n \"pointercancel\",\n pointerCancelListener,\n {\n capture: eventCapture,\n signal,\n },\n );\n\n return () => {\n abortControllerReference.current?.abort();\n\n pinchStateReference.current.active = false;\n pinchStateReference.current.pointers.clear();\n\n if (frameReference.current !== null) {\n cancelAnimationFrame(frameReference.current);\n }\n };\n }, [\n container,\n eventCapture,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n ]);\n};\n\nexport default usePinch;\n"],"names":["defaultOptions","usePinch","pinchCallback","options","eventPointerTypes","eventCapture","eventOnce","eventStopImmediatePropagation","threshold","container","raf","targetReference","useRef","abortControllerReference","frameReference","pendingDataReference","pendingEventReference","pinchStateReference","flushFrame","useCallback","data","event","invokePinchAction","handlePointerDown","state","pointer1","pointer2","deltaX","deltaY","distance","handlePointerMove","delta","totalDelta","scale","handlePointerUp","handlePointerCancel","useEffect","signal","pointerDownListener","pointerMoveListener","pointerUpListener","pointerCancelListener"],"mappings":";;AAWA,MAAMA,IAA+B;AAAA,EACnC,mBAAmB,CAAC,OAAO;AAAA,EAC3B,cAAc;AAAA,EACd,WAAW;AAAA,EACX,+BAA+B;AAAA,EAC/B,WAAW;AAAA,EACX,WAAW,EAAE,SAAS,KAAA;AAAA,EACtB,KAAK;AACP,GAEMC,IAAW,CACfC,GACAC,IAA2B,OACxB;AACH,QAAM;AAAA,IACJ,mBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,WAAAC;AAAA,IACA,+BAAAC;AAAA,IACA,WAAAC;AAAA,IACA,WAAAC;AAAA,IACA,KAAAC;AAAA,EAAA,IACE,EAAE,GAAGV,GAAgB,GAAGG,EAAA,GAEtBQ,IAAkBC,EAA2B,IAAI,GACjDC,IAA2BD,EAA+B,IAAI,GAE9DE,IAAiBF,EAAsB,IAAI,GAC3CG,IAAuBH,EAAyB,IAAI,GACpDI,IAAwBJ,EAA4B,IAAI,GAExDK,IAAsBL,EAAmB;AAAA,IAC7C,8BAAc,IAAA;AAAA,IACd,eAAe;AAAA,IACf,cAAc;AAAA,IACd,QAAQ;AAAA,EAAA,CACT,GAEKM,IAAaC,EAAY,MAAM;AACnC,IAAAL,EAAe,UAAU;AAEzB,UAAMM,IAAOL,EAAqB,SAC5BM,IAAQL,EAAsB;AAEpC,IAAI,CAACI,KAAQ,CAACC,MAIdC,EAAkBD,GAAOD,GAAMlB,GAAe;AAAA,MAC5C,eAAeK;AAAA,MACf,MAAMD;AAAA,MACN,QAAQ,MAAM;AACZ,QAAAO,EAAyB,SAAS,MAAA;AAAA,MACpC;AAAA,IAAA,CACD,GAEDE,EAAqB,UAAU,MAC/BC,EAAsB,UAAU;AAAA,EAClC,GAAG,CAACd,GAAeK,GAA+BD,CAAS,CAAC,GAEtDiB,IAAoBJ;AAAA,IACxB,CAACE,MAAwB;AACvB,UACE,CAACjB,EAAkB,SAASiB,EAAM,WAAoC;AAEtE;AAGF,YAAMG,IAAQP,EAAoB;AAIlC,UAFAO,EAAM,SAAS,IAAIH,EAAM,WAAWA,CAAK,GAErCG,EAAM,SAAS,SAAS,GAAG;AAC7B,cAAM,CAACC,GAAUC,CAAQ,IAAI,CAAC,GAAGF,EAAM,SAAS,QAAQ,GAElDG,IAASD,EAAS,UAAUD,EAAS,SACrCG,IAASF,EAAS,UAAUD,EAAS,SAErCI,IAAW,KAAK,MAAMF,GAAQC,CAAM;AAE1C,QAAAJ,EAAM,gBAAgBK,GACtBL,EAAM,eAAeK,GACrBL,EAAM,SAAS;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAACpB,CAAiB;AAAA,EAAA,GAGd0B,IAAoBX;AAAA,IACxB,CAACE,MAAwB;AACvB,YAAMG,IAAQP,EAAoB;AAWlC,UAVI,CAACO,EAAM,UAIP,CAACA,EAAM,SAAS,IAAIH,EAAM,SAAS,MAIvCG,EAAM,SAAS,IAAIH,EAAM,WAAWA,CAAK,GAErCG,EAAM,SAAS,OAAO;AACxB;AAGF,YAAM,CAACC,GAAUC,CAAQ,IAAI,CAAC,GAAGF,EAAM,SAAS,QAAQ,GAElDG,IAASD,EAAS,UAAUD,EAAS,SACrCG,IAASF,EAAS,UAAUD,EAAS,SAErCI,IAAW,KAAK,MAAMF,GAAQC,CAAM,GAEpCG,IAAQF,IAAWL,EAAM,cACzBQ,IAAaH,IAAWL,EAAM;AAEpC,UAAI,KAAK,IAAIQ,CAAU,IAAIxB;AACzB;AAGF,YAAMyB,IAAQJ,IAAWL,EAAM,eAEzBJ,IAAkB;AAAA,QACtB,UAAAS;AAAA,QACA,OAAAE;AAAA,QACA,YAAAC;AAAA,QACA,OAAAC;AAAA,MAAA;AAKF,UAFAT,EAAM,eAAeK,GAEjB,CAACnB,GAAK;AACR,QAAAY,EAAkBD,GAAOD,GAAMlB,GAAe;AAAA,UAC5C,eAAeK;AAAA,UACf,MAAMD;AAAA,UACN,QAAQ,MAAM;AACZ,YAAAO,EAAyB,SAAS,MAAA;AAAA,UACpC;AAAA,QAAA,CACD;AACD;AAAA,MACF;AAEA,MAAAE,EAAqB,UAAUK,GAC/BJ,EAAsB,UAAUK,GAE5BP,EAAe,YAAY,SAC7BA,EAAe,UAAU,sBAAsBI,CAAU;AAAA,IAE7D;AAAA,IACA;AAAA,MACEV;AAAA,MACAE;AAAA,MACAR;AAAA,MACAK;AAAA,MACAD;AAAA,MACAY;AAAA,IAAA;AAAA,EACF,GAGIgB,IAAkBf,EAAY,CAACE,MAAwB;AAC3D,UAAMG,IAAQP,EAAoB;AAElC,IAAAO,EAAM,SAAS,OAAOH,EAAM,SAAS,GAEjCG,EAAM,SAAS,OAAO,MACxBA,EAAM,SAAS,IACfA,EAAM,gBAAgB,GACtBA,EAAM,eAAe;AAAA,EAEzB,GAAG,CAAA,CAAE,GAECW,IAAsBhB,EAAY,CAACE,MAAwB;AAC/D,UAAMG,IAAQP,EAAoB;AAElC,IAAAO,EAAM,SAAS,OAAOH,EAAM,SAAS,GACrCG,EAAM,SAAS;AAAA,EACjB,GAAG,CAAA,CAAE;AAEL,EAAAY,EAAU,MAAM;AACd,IAAAzB,EAAgB,UAAUF,GAAW,WAAW,YAChDI,EAAyB,UAAU,IAAI,gBAAA;AACvC,UAAM,EAAE,QAAAwB,MAAWxB,EAAyB,SAEtCyB,IAAsB,CAACjB,MAC3BA,aAAiB,gBAAgBE,EAAkBF,CAAK,GAEpDkB,IAAsB,CAAClB,MAC3BA,aAAiB,gBAAgBS,EAAkBT,CAAK,GAEpDmB,IAAoB,CAACnB,MACzBA,aAAiB,gBAAgBa,EAAgBb,CAAK,GAElDoB,IAAwB,CAACpB,MAC7BA,aAAiB,gBAAgBc,EAAoBd,CAAK;AAE5D,WAAAV,EAAgB,QAAQ;AAAA,MACtB;AAAA,MACA2B;AAAA,MACA;AAAA,QACE,SAASjC;AAAA,QACT,QAAAgC;AAAA,MAAA;AAAA,IACF,GAGF1B,EAAgB,QAAQ;AAAA,MACtB;AAAA,MACA4B;AAAA,MACA;AAAA,QACE,SAASlC;AAAA,QACT,QAAAgC;AAAA,MAAA;AAAA,IACF,GAGF1B,EAAgB,QAAQ,iBAAiB,aAAa6B,GAAmB;AAAA,MACvE,SAASnC;AAAA,MACT,QAAAgC;AAAA,IAAA,CACD,GAED1B,EAAgB,QAAQ;AAAA,MACtB;AAAA,MACA8B;AAAA,MACA;AAAA,QACE,SAASpC;AAAA,QACT,QAAAgC;AAAA,MAAA;AAAA,IACF,GAGK,MAAM;AACX,MAAAxB,EAAyB,SAAS,MAAA,GAElCI,EAAoB,QAAQ,SAAS,IACrCA,EAAoB,QAAQ,SAAS,MAAA,GAEjCH,EAAe,YAAY,QAC7B,qBAAqBA,EAAe,OAAO;AAAA,IAE/C;AAAA,EACF,GAAG;AAAA,IACDL;AAAA,IACAJ;AAAA,IACAkB;AAAA,IACAO;AAAA,IACAI;AAAA,IACAC;AAAA,EAAA,CACD;AACH;"}
|
|
1
|
+
{"version":3,"file":"use-pinch.js","sources":["../../src/use-pinch/use-pinch.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from \"react\";\nimport {\n PinchState,\n PinchData,\n PinchOptions,\n PinchEventPointerTypes,\n UsePinchCallback,\n UsePinchOptions,\n} from \"./use-pinch.types\";\nimport { invokePinchAction } from \"./invoke-pinch-action\";\nimport { shouldHandleEvent } from \"./event-guards\";\n\nconst defaultOptions: PinchOptions = {\n eventPointerTypes: [PinchEventPointerTypes.Touch],\n eventCapture: false,\n eventOnce: false,\n eventStopImmediatePropagation: false,\n threshold: 0,\n container: { current: null },\n raf: false,\n};\n\nconst usePinch = (\n pinchCallback: UsePinchCallback,\n options: UsePinchOptions = {},\n) => {\n const {\n eventPointerTypes,\n eventCapture,\n eventOnce,\n eventStopImmediatePropagation,\n threshold,\n container,\n raf,\n } = { ...defaultOptions, ...options };\n\n const targetReference = useRef<EventTarget | null>(null);\n const abortControllerReference = useRef<AbortController | null>(null);\n\n const frameReference = useRef<number | null>(null);\n const pendingDataReference = useRef<PinchData | null>(null);\n const pendingEventReference = useRef<PointerEvent | null>(null);\n\n const pinchStateReference = useRef<PinchState>({\n pointers: new Map(),\n startDistance: 0,\n lastDistance: 0,\n active: false,\n });\n\n const flushFrame = useCallback(() => {\n frameReference.current = null;\n\n const data = pendingDataReference.current;\n const event = pendingEventReference.current;\n\n if (!data || !event) {\n return;\n }\n\n invokePinchAction(event, data, pinchCallback, {\n stopImmediate: eventStopImmediatePropagation,\n once: eventOnce,\n onOnce: () => {\n abortControllerReference.current?.abort();\n },\n });\n\n pendingDataReference.current = null;\n pendingEventReference.current = null;\n }, [pinchCallback, eventStopImmediatePropagation, eventOnce]);\n\n const handlePointerDown = useCallback(\n (event: PointerEvent) => {\n if (\n !shouldHandleEvent(event, {\n eventPointerTypes,\n })\n ) {\n return;\n }\n\n const state = pinchStateReference.current;\n\n state.pointers.set(event.pointerId, event);\n\n if (state.pointers.size === 2) {\n const [pointer1, pointer2] = [...state.pointers.values()];\n\n const deltaX = pointer2.clientX - pointer1.clientX;\n const deltaY = pointer2.clientY - pointer1.clientY;\n\n const distance = Math.hypot(deltaX, deltaY);\n\n state.startDistance = distance;\n state.lastDistance = distance;\n state.active = true;\n }\n },\n [eventPointerTypes],\n );\n\n const handlePointerMove = useCallback(\n (event: PointerEvent) => {\n if (\n !shouldHandleEvent(event, {\n eventPointerTypes,\n })\n ) {\n return;\n }\n\n const state = pinchStateReference.current;\n if (!state.active) {\n return;\n }\n\n if (!state.pointers.has(event.pointerId)) {\n return;\n }\n\n state.pointers.set(event.pointerId, event);\n\n if (state.pointers.size < 2) {\n return;\n }\n\n const [pointer1, pointer2] = [...state.pointers.values()];\n\n const deltaX = pointer2.clientX - pointer1.clientX;\n const deltaY = pointer2.clientY - pointer1.clientY;\n\n const distance = Math.hypot(deltaX, deltaY);\n\n const delta = distance - state.lastDistance;\n const totalDelta = distance - state.startDistance;\n\n if (Math.abs(totalDelta) < threshold) {\n return;\n }\n\n const scale = distance / state.startDistance;\n\n const data: PinchData = {\n distance,\n delta,\n totalDelta,\n scale,\n };\n\n state.lastDistance = distance;\n\n if (!raf) {\n invokePinchAction(event, data, pinchCallback, {\n stopImmediate: eventStopImmediatePropagation,\n once: eventOnce,\n onOnce: () => {\n abortControllerReference.current?.abort();\n },\n });\n return;\n }\n\n pendingDataReference.current = data;\n pendingEventReference.current = event;\n\n if (frameReference.current === null) {\n frameReference.current = requestAnimationFrame(flushFrame);\n }\n },\n [\n eventPointerTypes,\n eventOnce,\n eventStopImmediatePropagation,\n threshold,\n raf,\n pinchCallback,\n flushFrame,\n ],\n );\n\n const handlePointerUp = useCallback(\n (event: PointerEvent) => {\n if (\n !shouldHandleEvent(event, {\n eventPointerTypes,\n })\n ) {\n return;\n }\n\n const state = pinchStateReference.current;\n\n state.pointers.delete(event.pointerId);\n\n if (state.pointers.size < 2) {\n state.active = false;\n state.startDistance = 0;\n state.lastDistance = 0;\n }\n },\n [eventPointerTypes],\n );\n\n const handlePointerCancel = useCallback(\n (event: PointerEvent) => {\n if (\n !shouldHandleEvent(event, {\n eventPointerTypes,\n })\n ) {\n return;\n }\n\n const state = pinchStateReference.current;\n\n state.pointers.delete(event.pointerId);\n state.active = false;\n },\n [eventPointerTypes],\n );\n\n useEffect(() => {\n targetReference.current = container?.current ?? globalThis;\n abortControllerReference.current = new AbortController();\n const { signal } = abortControllerReference.current;\n\n const pointerDownListener = (event: Event) =>\n event instanceof PointerEvent && handlePointerDown(event);\n\n const pointerMoveListener = (event: Event) =>\n event instanceof PointerEvent && handlePointerMove(event);\n\n const pointerUpListener = (event: Event) =>\n event instanceof PointerEvent && handlePointerUp(event);\n\n const pointerCancelListener = (event: Event) =>\n event instanceof PointerEvent && handlePointerCancel(event);\n\n targetReference.current.addEventListener(\n \"pointerdown\",\n pointerDownListener,\n {\n capture: eventCapture,\n signal,\n },\n );\n\n targetReference.current.addEventListener(\n \"pointermove\",\n pointerMoveListener,\n {\n capture: eventCapture,\n signal,\n },\n );\n\n targetReference.current.addEventListener(\"pointerup\", pointerUpListener, {\n capture: eventCapture,\n signal,\n });\n\n targetReference.current.addEventListener(\n \"pointercancel\",\n pointerCancelListener,\n {\n capture: eventCapture,\n signal,\n },\n );\n\n return () => {\n abortControllerReference.current?.abort();\n\n pinchStateReference.current.active = false;\n pinchStateReference.current.pointers.clear();\n\n if (frameReference.current !== null) {\n cancelAnimationFrame(frameReference.current);\n }\n };\n }, [\n container,\n eventCapture,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n ]);\n};\n\nexport default usePinch;\n"],"names":["defaultOptions","PinchEventPointerTypes","usePinch","pinchCallback","options","eventPointerTypes","eventCapture","eventOnce","eventStopImmediatePropagation","threshold","container","raf","targetReference","useRef","abortControllerReference","frameReference","pendingDataReference","pendingEventReference","pinchStateReference","flushFrame","useCallback","data","event","invokePinchAction","handlePointerDown","shouldHandleEvent","state","pointer1","pointer2","deltaX","deltaY","distance","handlePointerMove","delta","totalDelta","scale","handlePointerUp","handlePointerCancel","useEffect","signal","pointerDownListener","pointerMoveListener","pointerUpListener","pointerCancelListener"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-pinch.types.js","sources":["../../src/use-pinch/use-pinch.types.ts"],"sourcesContent":["export interface PinchState {\n pointers: Map<number, PointerEvent>;\n startDistance: number;\n lastDistance: number;\n active: boolean;\n}\n\nexport const PinchEventPointerTypes = {\n Touch: \"touch\",\n Mouse: \"mouse\",\n Pen: \"pen\",\n} as const;\n\nexport type PinchEventPointerType =\n (typeof PinchEventPointerTypes)[keyof typeof PinchEventPointerTypes];\n\nexport interface PinchOptions {\n eventPointerTypes: PinchEventPointerType[];\n eventCapture: boolean;\n eventOnce: boolean;\n eventStopImmediatePropagation: boolean;\n threshold: number;\n container: { current:
|
|
1
|
+
{"version":3,"file":"use-pinch.types.js","sources":["../../src/use-pinch/use-pinch.types.ts"],"sourcesContent":["export interface PinchState {\n pointers: Map<number, PointerEvent>;\n startDistance: number;\n lastDistance: number;\n active: boolean;\n}\n\nexport const PinchEventPointerTypes = {\n Touch: \"touch\",\n Mouse: \"mouse\",\n Pen: \"pen\",\n} as const;\n\nexport type PinchEventPointerType =\n (typeof PinchEventPointerTypes)[keyof typeof PinchEventPointerTypes];\n\nexport interface PinchOptions {\n eventPointerTypes: PinchEventPointerType[];\n eventCapture: boolean;\n eventOnce: boolean;\n eventStopImmediatePropagation: boolean;\n threshold: number;\n container: { current: EventTarget | null };\n raf: boolean;\n}\n\nexport interface PinchData {\n distance: number;\n delta: number;\n totalDelta: number;\n scale: number;\n}\n\nexport type UsePinchCallback =\n | ((event: PointerEvent, data: PinchData) => boolean)\n | ((event: PointerEvent, data: PinchData) => void);\n\nexport type UsePinchOptions = Partial<PinchOptions>;\n"],"names":["PinchEventPointerTypes"],"mappings":"AAOO,MAAMA,IAAyB;AAAA,EACpC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AACP;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-guards.js","sources":["../../src/use-pointer/event-guards.ts"],"sourcesContent":["import { PointerEventPointerType } from \"./use-pointer.types\";\n\n/**\n * Determines whether a pointer event should be handled based on event options.\n *\n * @param {PointerEvent} event - The pointer event to evaluate\n * @param {Object} options - Event handling options\n * @param {PointerEventPointerType[]} options.eventPointerTypes - Allowed pointer types for the event\n * @returns {boolean} True if the event should be handled, false otherwise\n *\n * @example\n * const shouldHandle = shouldHandleEvent(event, {\n * eventPointerTypes: [PointerEventPointerTypes.Touch]\n * });\n */\nexport const shouldHandleEvent = (\n event: PointerEvent,\n options: {\n eventPointerTypes: PointerEventPointerType[];\n },\n) => {\n if (!event.isPrimary) {\n return false;\n }\n if (\n !options.eventPointerTypes.includes(\n event.pointerType as PointerEventPointerType,\n )\n ) {\n return false;\n }\n\n return true;\n};\n"],"names":["shouldHandleEvent","event","options"],"mappings":"AAeO,MAAMA,IAAoB,CAC/BC,GACAC,MAII,GAACD,EAAM,aAIT,CAACC,EAAQ,kBAAkB;AAAA,EACzBD,EAAM;AAAA;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoke-pointer-action.js","sources":["../../src/use-pointer/invoke-pointer-action.ts"],"sourcesContent":["import { PointerData, PointerEventType } from \"./use-pointer.types\";\n\n/**\n * Invokes a pointer action callback with optional event modifications.\n *\n * Handles pointer event processing including preventing default behavior,\n * stopping immediate propagation, and managing one-time event handlers.\n *\n * @param {PointerEvent} event - The pointer event\n * @param {PointerEventType} type - The type of the pointer event\n * @param {PointerData} data - The normalized pointer data\n * @param {Function} callback - Function to invoke with (event, data). Return true to prevent default.\n * @param {Object} options - Action options\n * @param {boolean} [options.stopImmediate=false] - Whether to stop immediate propagation\n * @param {boolean} [options.once=false] - Whether this is a one-time event\n * @param {Function} [options.onOnce] - Callback to invoke when one-time event fires\n *\n * @example\n * invokePointerAction(event, type, data, (e, d) => {\n * console.log(`Pointer at: ${d.x}, ${d.y}`);\n * return true; // Prevent default\n * }, { stopImmediate: true });\n */\nexport const invokePointerAction = (\n event: PointerEvent,\n type: PointerEventType,\n data: PointerData,\n callback:\n | ((\n event: PointerEvent,\n type: PointerEventType,\n data: PointerData,\n ) => boolean)\n | ((\n event: PointerEvent,\n type: PointerEventType,\n data: PointerData,\n ) => void),\n options: {\n stopImmediate?: boolean;\n once?: boolean;\n onOnce?: () => void;\n },\n) => {\n if (options.stopImmediate) {\n event.stopImmediatePropagation();\n }\n\n const shouldPrevent = callback(event, type, data);\n if (shouldPrevent) {\n event.preventDefault();\n }\n\n if (options.once) {\n options.onOnce?.();\n }\n};\n"],"names":["invokePointerAction","event","type","data","callback","options"],"mappings":"AAuBO,MAAMA,IAAsB,CACjCC,GACAC,GACAC,GACAC,GAWAC,MAKG;AACH,EAAIA,EAAQ,iBACVJ,EAAM,yBAAA,GAGcG,EAASH,GAAOC,GAAMC,CAAI,KAE9CF,EAAM,eAAA,GAGJI,EAAQ,QACVA,EAAQ,SAAA;AAEZ;"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { useRef as P, useCallback as y, useEffect as E } from "react";
|
|
2
|
+
import { PointerEventPointerTypes as c, PointerEventTypes as e } from "./use-pointer.types.js";
|
|
3
|
+
import { invokePointerAction as T } from "./invoke-pointer-action.js";
|
|
4
|
+
import { shouldHandleEvent as O } from "./event-guards.js";
|
|
5
|
+
const b = {
|
|
6
|
+
eventType: [
|
|
7
|
+
e.Move,
|
|
8
|
+
e.Enter,
|
|
9
|
+
e.Leave,
|
|
10
|
+
e.Up,
|
|
11
|
+
e.Down,
|
|
12
|
+
e.Over,
|
|
13
|
+
e.Out,
|
|
14
|
+
e.Cancel
|
|
15
|
+
],
|
|
16
|
+
eventPointerTypes: [
|
|
17
|
+
c.Touch,
|
|
18
|
+
c.Mouse,
|
|
19
|
+
c.Pen
|
|
20
|
+
],
|
|
21
|
+
eventCapture: !1,
|
|
22
|
+
eventOnce: !1,
|
|
23
|
+
eventStopImmediatePropagation: !1,
|
|
24
|
+
container: { current: null }
|
|
25
|
+
}, L = (a, d = {}) => {
|
|
26
|
+
const {
|
|
27
|
+
eventType: i,
|
|
28
|
+
eventPointerTypes: s,
|
|
29
|
+
eventCapture: u,
|
|
30
|
+
eventOnce: l,
|
|
31
|
+
eventStopImmediatePropagation: p,
|
|
32
|
+
container: f
|
|
33
|
+
} = { ...b, ...d }, m = P(null), r = P(null), v = y(
|
|
34
|
+
(t) => {
|
|
35
|
+
if (!O(t, {
|
|
36
|
+
eventPointerTypes: s
|
|
37
|
+
}))
|
|
38
|
+
return;
|
|
39
|
+
const o = {
|
|
40
|
+
x: t.clientX,
|
|
41
|
+
y: t.clientY
|
|
42
|
+
}, n = t.type;
|
|
43
|
+
T(t, n, o, a, {
|
|
44
|
+
stopImmediate: p,
|
|
45
|
+
once: l,
|
|
46
|
+
onOnce: () => {
|
|
47
|
+
r.current?.abort();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
[
|
|
52
|
+
s,
|
|
53
|
+
l,
|
|
54
|
+
p,
|
|
55
|
+
a
|
|
56
|
+
]
|
|
57
|
+
);
|
|
58
|
+
E(() => {
|
|
59
|
+
m.current = f?.current ?? globalThis, r.current = new AbortController();
|
|
60
|
+
const { signal: t } = r.current, o = (n) => n instanceof PointerEvent && v(n);
|
|
61
|
+
return i?.forEach((n) => {
|
|
62
|
+
m.current?.addEventListener(n, o, {
|
|
63
|
+
capture: u,
|
|
64
|
+
signal: t
|
|
65
|
+
});
|
|
66
|
+
}), () => {
|
|
67
|
+
r.current?.abort();
|
|
68
|
+
};
|
|
69
|
+
}, [f, u, i, v]);
|
|
70
|
+
};
|
|
71
|
+
export {
|
|
72
|
+
L as default
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=use-pointer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-pointer.js","sources":["../../src/use-pointer/use-pointer.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from \"react\";\nimport {\n PointerData,\n PointerEventType,\n PointerEventPointerTypes,\n PointerEventTypes,\n PointerOptions,\n UsePointerCallback,\n UsePointerOptions,\n} from \"./use-pointer.types\";\nimport { invokePointerAction } from \"./invoke-pointer-action\";\nimport { shouldHandleEvent } from \"./event-guards\";\n\nconst defaultOptions: PointerOptions = {\n eventType: [\n PointerEventTypes.Move,\n PointerEventTypes.Enter,\n PointerEventTypes.Leave,\n PointerEventTypes.Up,\n PointerEventTypes.Down,\n PointerEventTypes.Over,\n PointerEventTypes.Out,\n PointerEventTypes.Cancel,\n ],\n eventPointerTypes: [\n PointerEventPointerTypes.Touch,\n PointerEventPointerTypes.Mouse,\n PointerEventPointerTypes.Pen,\n ],\n eventCapture: false,\n eventOnce: false,\n eventStopImmediatePropagation: false,\n container: { current: null },\n};\n\nconst usePointer = (\n pointerCallback: UsePointerCallback,\n options: UsePointerOptions = {},\n) => {\n const {\n eventType,\n eventPointerTypes,\n eventCapture,\n eventOnce,\n eventStopImmediatePropagation,\n container,\n } = { ...defaultOptions, ...options };\n\n const targetReference = useRef<EventTarget | null>(null);\n const abortControllerReference = useRef<AbortController | null>(null);\n\n const handlePointer = useCallback(\n (event: PointerEvent) => {\n if (\n !shouldHandleEvent(event, {\n eventPointerTypes,\n })\n ) {\n return;\n }\n\n const data: PointerData = {\n x: event.clientX,\n y: event.clientY,\n };\n\n const type = event.type as PointerEventType;\n\n invokePointerAction(event, type, data, pointerCallback, {\n stopImmediate: eventStopImmediatePropagation,\n once: eventOnce,\n onOnce: () => {\n abortControllerReference.current?.abort();\n },\n });\n },\n [\n eventPointerTypes,\n eventOnce,\n eventStopImmediatePropagation,\n pointerCallback,\n ],\n );\n\n useEffect(() => {\n targetReference.current = container?.current ?? globalThis;\n abortControllerReference.current = new AbortController();\n const { signal } = abortControllerReference.current;\n\n const pointerListener = (event: Event) =>\n event instanceof PointerEvent && handlePointer(event);\n\n eventType?.forEach((type) => {\n targetReference.current?.addEventListener(type, pointerListener, {\n capture: eventCapture,\n signal,\n });\n });\n\n return () => {\n abortControllerReference.current?.abort();\n };\n }, [container, eventCapture, eventType, handlePointer]);\n};\n\nexport default usePointer;\n"],"names":["defaultOptions","PointerEventTypes","PointerEventPointerTypes","usePointer","pointerCallback","options","eventType","eventPointerTypes","eventCapture","eventOnce","eventStopImmediatePropagation","container","targetReference","useRef","abortControllerReference","handlePointer","useCallback","event","shouldHandleEvent","data","type","invokePointerAction","useEffect","signal","pointerListener"],"mappings":";;;;AAaA,MAAMA,IAAiC;AAAA,EACrC,WAAW;AAAA,IACTC,EAAkB;AAAA,IAClBA,EAAkB;AAAA,IAClBA,EAAkB;AAAA,IAClBA,EAAkB;AAAA,IAClBA,EAAkB;AAAA,IAClBA,EAAkB;AAAA,IAClBA,EAAkB;AAAA,IAClBA,EAAkB;AAAA,EAAA;AAAA,EAEpB,mBAAmB;AAAA,IACjBC,EAAyB;AAAA,IACzBA,EAAyB;AAAA,IACzBA,EAAyB;AAAA,EAAA;AAAA,EAE3B,cAAc;AAAA,EACd,WAAW;AAAA,EACX,+BAA+B;AAAA,EAC/B,WAAW,EAAE,SAAS,KAAA;AACxB,GAEMC,IAAa,CACjBC,GACAC,IAA6B,OAC1B;AACH,QAAM;AAAA,IACJ,WAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,WAAAC;AAAA,IACA,+BAAAC;AAAA,IACA,WAAAC;AAAA,EAAA,IACE,EAAE,GAAGX,GAAgB,GAAGK,EAAA,GAEtBO,IAAkBC,EAA2B,IAAI,GACjDC,IAA2BD,EAA+B,IAAI,GAE9DE,IAAgBC;AAAA,IACpB,CAACC,MAAwB;AACvB,UACE,CAACC,EAAkBD,GAAO;AAAA,QACxB,mBAAAV;AAAA,MAAA,CACD;AAED;AAGF,YAAMY,IAAoB;AAAA,QACxB,GAAGF,EAAM;AAAA,QACT,GAAGA,EAAM;AAAA,MAAA,GAGLG,IAAOH,EAAM;AAEnB,MAAAI,EAAoBJ,GAAOG,GAAMD,GAAMf,GAAiB;AAAA,QACtD,eAAeM;AAAA,QACf,MAAMD;AAAA,QACN,QAAQ,MAAM;AACZ,UAAAK,EAAyB,SAAS,MAAA;AAAA,QACpC;AAAA,MAAA,CACD;AAAA,IACH;AAAA,IACA;AAAA,MACEP;AAAA,MACAE;AAAA,MACAC;AAAA,MACAN;AAAA,IAAA;AAAA,EACF;AAGF,EAAAkB,EAAU,MAAM;AACd,IAAAV,EAAgB,UAAUD,GAAW,WAAW,YAChDG,EAAyB,UAAU,IAAI,gBAAA;AACvC,UAAM,EAAE,QAAAS,MAAWT,EAAyB,SAEtCU,IAAkB,CAACP,MACvBA,aAAiB,gBAAgBF,EAAcE,CAAK;AAEtD,WAAAX,GAAW,QAAQ,CAACc,MAAS;AAC3B,MAAAR,EAAgB,SAAS,iBAAiBQ,GAAMI,GAAiB;AAAA,QAC/D,SAAShB;AAAA,QACT,QAAAe;AAAA,MAAA,CACD;AAAA,IACH,CAAC,GAEM,MAAM;AACX,MAAAT,EAAyB,SAAS,MAAA;AAAA,IACpC;AAAA,EACF,GAAG,CAACH,GAAWH,GAAcF,GAAWS,CAAa,CAAC;AACxD;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const e = {
|
|
2
|
+
Move: "pointermove",
|
|
3
|
+
Enter: "pointerenter",
|
|
4
|
+
Leave: "pointerleave",
|
|
5
|
+
Up: "pointerup",
|
|
6
|
+
Down: "pointerdown",
|
|
7
|
+
Over: "pointerover",
|
|
8
|
+
Out: "pointerout",
|
|
9
|
+
Cancel: "pointercancel"
|
|
10
|
+
}, o = {
|
|
11
|
+
Touch: "touch",
|
|
12
|
+
Mouse: "mouse",
|
|
13
|
+
Pen: "pen"
|
|
14
|
+
};
|
|
15
|
+
export {
|
|
16
|
+
o as PointerEventPointerTypes,
|
|
17
|
+
e as PointerEventTypes
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=use-pointer.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-pointer.types.js","sources":["../../src/use-pointer/use-pointer.types.ts"],"sourcesContent":["export const PointerEventTypes = {\n Move: \"pointermove\",\n Enter: \"pointerenter\",\n Leave: \"pointerleave\",\n Up: \"pointerup\",\n Down: \"pointerdown\",\n Over: \"pointerover\",\n Out: \"pointerout\",\n Cancel: \"pointercancel\",\n} as const;\n\nexport type PointerEventType =\n (typeof PointerEventTypes)[keyof typeof PointerEventTypes];\n\nexport const PointerEventPointerTypes = {\n Touch: \"touch\",\n Mouse: \"mouse\",\n Pen: \"pen\",\n} as const;\n\nexport type PointerEventPointerType =\n (typeof PointerEventPointerTypes)[keyof typeof PointerEventPointerTypes];\n\nexport interface PointerOptions {\n eventType: PointerEventType[];\n eventPointerTypes: PointerEventPointerType[];\n eventCapture: boolean;\n eventOnce: boolean;\n eventStopImmediatePropagation: boolean;\n container: { current: EventTarget | null };\n}\n\nexport interface PointerData {\n x: number;\n y: number;\n}\n\nexport type UsePointerCallback =\n | ((\n event: PointerEvent,\n type: PointerEventType,\n data: PointerData,\n ...properties: unknown[]\n ) => void)\n | ((\n event: PointerEvent,\n type: PointerEventType,\n data: PointerData,\n ...properties: unknown[]\n ) => boolean);\n\nexport type UsePointerOptions = Partial<PointerOptions>;\n"],"names":["PointerEventTypes","PointerEventPointerTypes"],"mappings":"AAAO,MAAMA,IAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AACV,GAKaC,IAA2B;AAAA,EACtC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AACP;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-guards.js","sources":["../../src/use-press/event-guards.ts"],"sourcesContent":["import { PressEventPointerType } from \"./use-press.types\";\n\n/**\n * Determines whether a pointer event should be handled based on event options.\n *\n * @param {PointerEvent} event - The pointer event to evaluate\n * @param {Object} options - Event handling options\n * @param {PressEventPointerType[]} options.eventPointerTypes - Allowed pointer types for the event\n * @returns {boolean} True if the event should be handled, false otherwise\n *\n * @example\n * const shouldHandle = shouldHandleEvent(event, {\n * eventPointerTypes: [PressEventPointerTypes.Touch]\n * });\n */\nexport const shouldHandleEvent = (\n event: PointerEvent,\n options: {\n eventPointerTypes: PressEventPointerType[];\n },\n) => {\n if (!event.isPrimary) {\n return false;\n }\n if (\n !options.eventPointerTypes.includes(\n event.pointerType as PressEventPointerType,\n )\n ) {\n return false;\n }\n\n return true;\n};\n"],"names":["shouldHandleEvent","event","options"],"mappings":"AAeO,MAAMA,IAAoB,CAC/BC,GACAC,MAII,GAACD,EAAM,aAIT,CAACC,EAAQ,kBAAkB;AAAA,EACzBD,EAAM;AAAA;"}
|