@mantine/hooks 9.0.0-alpha.6 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/use-local-storage/use-local-storage.cjs.map +1 -1
- package/cjs/use-session-storage/use-session-storage.cjs.map +1 -1
- package/esm/use-focus-trap/use-focus-trap.mjs +2 -0
- package/esm/use-focus-trap/use-focus-trap.mjs.map +1 -1
- package/esm/use-local-storage/use-local-storage.mjs.map +1 -1
- package/esm/use-session-storage/use-session-storage.mjs.map +1 -1
- package/lib/use-local-storage/use-local-storage.d.ts +13 -3
- package/lib/use-session-storage/use-session-storage.d.ts +13 -3
- package/package.json +1 -1
- package/cjs/use-drag/use-drag.cjs +0 -266
- package/cjs/use-drag/use-drag.cjs.map +0 -1
- package/cjs/use-mask/use-mask.cjs +0 -457
- package/cjs/use-mask/use-mask.cjs.map +0 -1
- package/cjs/use-roving-index/use-roving-index.cjs +0 -200
- package/cjs/use-roving-index/use-roving-index.cjs.map +0 -1
- package/cjs/use-splitter/use-splitter.cjs +0 -433
- package/cjs/use-splitter/use-splitter.cjs.map +0 -1
- package/esm/use-drag/use-drag.mjs +0 -266
- package/esm/use-drag/use-drag.mjs.map +0 -1
- package/esm/use-mask/use-mask.mjs +0 -453
- package/esm/use-mask/use-mask.mjs.map +0 -1
- package/esm/use-roving-index/use-roving-index.mjs +0 -200
- package/esm/use-roving-index/use-roving-index.mjs.map +0 -1
- package/esm/use-splitter/use-splitter.mjs +0 -433
- package/esm/use-splitter/use-splitter.mjs.map +0 -1
- package/lib/use-drag/use-drag.d.ts +0 -60
- package/lib/use-mask/use-mask.d.ts +0 -60
- package/lib/use-roving-index/use-roving-index.d.ts +0 -49
- package/lib/use-splitter/use-splitter.d.ts +0 -94
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-local-storage.cjs","names":["createStorage","readValue"],"sources":["../../src/use-local-storage/use-local-storage.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"use-local-storage.cjs","names":["createStorage","readValue"],"sources":["../../src/use-local-storage/use-local-storage.ts"],"sourcesContent":["import {\n createStorage,\n readValue,\n UseStorageOptions,\n UseStorageReturnValue,\n} from './create-storage';\n\nexport function useLocalStorage<T = string>(\n props: UseStorageOptions<T> & { defaultValue: T }\n): UseStorageReturnValue<T>;\nexport function useLocalStorage<T = string>(\n props: UseStorageOptions<T>\n): UseStorageReturnValue<T | undefined>;\nexport function useLocalStorage<T = string>(props: UseStorageOptions<T>) {\n return createStorage<T>('localStorage', 'use-local-storage')(props);\n}\n\ninterface ReadStorageValue {\n <T>(options: UseStorageOptions<T> & { defaultValue: T }): T;\n <T>(options: UseStorageOptions<T>): T | undefined;\n}\n\nexport const readLocalStorageValue: ReadStorageValue = readValue('localStorage');\n"],"mappings":";;;AAaA,SAAgB,gBAA4B,OAA6B;AACvE,QAAOA,uBAAAA,cAAiB,gBAAgB,oBAAoB,CAAC,MAAM;;AAQrE,MAAa,wBAA0CC,uBAAAA,UAAU,eAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-session-storage.cjs","names":["createStorage","readValue"],"sources":["../../src/use-session-storage/use-session-storage.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"use-session-storage.cjs","names":["createStorage","readValue"],"sources":["../../src/use-session-storage/use-session-storage.ts"],"sourcesContent":["import {\n createStorage,\n readValue,\n UseStorageOptions,\n UseStorageReturnValue,\n} from '../use-local-storage/create-storage';\n\nexport function useSessionStorage<T = string>(\n props: UseStorageOptions<T> & { defaultValue: T }\n): UseStorageReturnValue<T>;\nexport function useSessionStorage<T = string>(\n props: UseStorageOptions<T>\n): UseStorageReturnValue<T | undefined>;\nexport function useSessionStorage<T = string>(props: UseStorageOptions<T>) {\n return createStorage<T>('sessionStorage', 'use-session-storage')(props);\n}\n\ninterface ReadStorageValue {\n <T>(options: UseStorageOptions<T> & { defaultValue: T }): T;\n <T>(options: UseStorageOptions<T>): T | undefined;\n}\n\nexport const readSessionStorageValue: ReadStorageValue = readValue('sessionStorage');\n"],"mappings":";;;AAaA,SAAgB,kBAA8B,OAA6B;AACzE,QAAOA,uBAAAA,cAAiB,kBAAkB,sBAAsB,CAAC,MAAM;;AAQzE,MAAa,0BAA4CC,uBAAAA,UAAU,iBAAiB"}
|
|
@@ -13,6 +13,7 @@ function useFocusTrap(active = true) {
|
|
|
13
13
|
if (!focusElement && focusable(node)) focusElement = node;
|
|
14
14
|
}
|
|
15
15
|
if (focusElement) focusElement.focus({ preventScroll: true });
|
|
16
|
+
else console.warn("[@mantine/hooks/use-focus-trap] Failed to find focusable element within provided node", node);
|
|
16
17
|
};
|
|
17
18
|
const setRef = useCallback((node) => {
|
|
18
19
|
if (!active) return;
|
|
@@ -21,6 +22,7 @@ function useFocusTrap(active = true) {
|
|
|
21
22
|
if (node) {
|
|
22
23
|
setTimeout(() => {
|
|
23
24
|
if (node.getRootNode()) focusNode(node);
|
|
25
|
+
else console.warn("[@mantine/hooks/use-focus-trap] Ref node is not part of the dom", node);
|
|
24
26
|
});
|
|
25
27
|
ref.current = node;
|
|
26
28
|
} else ref.current = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-focus-trap.mjs","names":[],"sources":["../../src/use-focus-trap/use-focus-trap.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { scopeTab } from './scope-tab';\nimport { FOCUS_SELECTOR, focusable, tabbable } from './tabbable';\n\nexport function useFocusTrap(active = true): React.RefCallback<HTMLElement | null> {\n const ref = useRef<HTMLElement>(null);\n\n const focusNode = (node: HTMLElement) => {\n let focusElement: HTMLElement | null = node.querySelector('[data-autofocus]');\n\n if (!focusElement) {\n const children = Array.from<HTMLElement>(node.querySelectorAll(FOCUS_SELECTOR));\n focusElement = children.find(tabbable) || children.find(focusable) || null;\n if (!focusElement && focusable(node)) {\n focusElement = node;\n }\n }\n\n if (focusElement) {\n focusElement.focus({ preventScroll: true });\n } else if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn(\n '[@mantine/hooks/use-focus-trap] Failed to find focusable element within provided node',\n node\n );\n }\n };\n\n const setRef = useCallback(\n (node: HTMLElement | null) => {\n if (!active) {\n return;\n }\n\n if (node === null) {\n return;\n }\n\n if (ref.current === node) {\n return;\n }\n\n if (node) {\n // Delay processing the HTML node by a frame. This ensures focus is assigned correctly.\n setTimeout(() => {\n if (node.getRootNode()) {\n focusNode(node);\n } else if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn('[@mantine/hooks/use-focus-trap] Ref node is not part of the dom', node);\n }\n });\n\n ref.current = node;\n } else {\n ref.current = null;\n }\n },\n [active]\n );\n\n useEffect(() => {\n if (!active) {\n return undefined;\n }\n\n ref.current && setTimeout(() => focusNode(ref.current!));\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Tab' && ref.current) {\n scopeTab(ref.current, event);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [active]);\n\n return setRef;\n}\n"],"mappings":";;;;;AAIA,SAAgB,aAAa,SAAS,MAA6C;CACjF,MAAM,MAAM,OAAoB,KAAK;CAErC,MAAM,aAAa,SAAsB;EACvC,IAAI,eAAmC,KAAK,cAAc,mBAAmB;AAE7E,MAAI,CAAC,cAAc;GACjB,MAAM,WAAW,MAAM,KAAkB,KAAK,iBAAiB,eAAe,CAAC;AAC/E,kBAAe,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,UAAU,IAAI;AACtE,OAAI,CAAC,gBAAgB,UAAU,KAAK,CAClC,gBAAe;;AAInB,MAAI,aACF,cAAa,MAAM,EAAE,eAAe,MAAM,CAAC;;
|
|
1
|
+
{"version":3,"file":"use-focus-trap.mjs","names":[],"sources":["../../src/use-focus-trap/use-focus-trap.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { scopeTab } from './scope-tab';\nimport { FOCUS_SELECTOR, focusable, tabbable } from './tabbable';\n\nexport function useFocusTrap(active = true): React.RefCallback<HTMLElement | null> {\n const ref = useRef<HTMLElement>(null);\n\n const focusNode = (node: HTMLElement) => {\n let focusElement: HTMLElement | null = node.querySelector('[data-autofocus]');\n\n if (!focusElement) {\n const children = Array.from<HTMLElement>(node.querySelectorAll(FOCUS_SELECTOR));\n focusElement = children.find(tabbable) || children.find(focusable) || null;\n if (!focusElement && focusable(node)) {\n focusElement = node;\n }\n }\n\n if (focusElement) {\n focusElement.focus({ preventScroll: true });\n } else if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn(\n '[@mantine/hooks/use-focus-trap] Failed to find focusable element within provided node',\n node\n );\n }\n };\n\n const setRef = useCallback(\n (node: HTMLElement | null) => {\n if (!active) {\n return;\n }\n\n if (node === null) {\n return;\n }\n\n if (ref.current === node) {\n return;\n }\n\n if (node) {\n // Delay processing the HTML node by a frame. This ensures focus is assigned correctly.\n setTimeout(() => {\n if (node.getRootNode()) {\n focusNode(node);\n } else if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn('[@mantine/hooks/use-focus-trap] Ref node is not part of the dom', node);\n }\n });\n\n ref.current = node;\n } else {\n ref.current = null;\n }\n },\n [active]\n );\n\n useEffect(() => {\n if (!active) {\n return undefined;\n }\n\n ref.current && setTimeout(() => focusNode(ref.current!));\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Tab' && ref.current) {\n scopeTab(ref.current, event);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [active]);\n\n return setRef;\n}\n"],"mappings":";;;;;AAIA,SAAgB,aAAa,SAAS,MAA6C;CACjF,MAAM,MAAM,OAAoB,KAAK;CAErC,MAAM,aAAa,SAAsB;EACvC,IAAI,eAAmC,KAAK,cAAc,mBAAmB;AAE7E,MAAI,CAAC,cAAc;GACjB,MAAM,WAAW,MAAM,KAAkB,KAAK,iBAAiB,eAAe,CAAC;AAC/E,kBAAe,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,UAAU,IAAI;AACtE,OAAI,CAAC,gBAAgB,UAAU,KAAK,CAClC,gBAAe;;AAInB,MAAI,aACF,cAAa,MAAM,EAAE,eAAe,MAAM,CAAC;MAG3C,SAAQ,KACN,yFACA,KACD;;CAIL,MAAM,SAAS,aACZ,SAA6B;AAC5B,MAAI,CAAC,OACH;AAGF,MAAI,SAAS,KACX;AAGF,MAAI,IAAI,YAAY,KAClB;AAGF,MAAI,MAAM;AAER,oBAAiB;AACf,QAAI,KAAK,aAAa,CACpB,WAAU,KAAK;QAGf,SAAQ,KAAK,mEAAmE,KAAK;KAEvF;AAEF,OAAI,UAAU;QAEd,KAAI,UAAU;IAGlB,CAAC,OAAO,CACT;AAED,iBAAgB;AACd,MAAI,CAAC,OACH;AAGF,MAAI,WAAW,iBAAiB,UAAU,IAAI,QAAS,CAAC;EAExD,MAAM,iBAAiB,UAAyB;AAC9C,OAAI,MAAM,QAAQ,SAAS,IAAI,QAC7B,UAAS,IAAI,SAAS,MAAM;;AAIhC,WAAS,iBAAiB,WAAW,cAAc;AACnD,eAAa,SAAS,oBAAoB,WAAW,cAAc;IAClE,CAAC,OAAO,CAAC;AAEZ,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-local-storage.mjs","names":[],"sources":["../../src/use-local-storage/use-local-storage.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"use-local-storage.mjs","names":[],"sources":["../../src/use-local-storage/use-local-storage.ts"],"sourcesContent":["import {\n createStorage,\n readValue,\n UseStorageOptions,\n UseStorageReturnValue,\n} from './create-storage';\n\nexport function useLocalStorage<T = string>(\n props: UseStorageOptions<T> & { defaultValue: T }\n): UseStorageReturnValue<T>;\nexport function useLocalStorage<T = string>(\n props: UseStorageOptions<T>\n): UseStorageReturnValue<T | undefined>;\nexport function useLocalStorage<T = string>(props: UseStorageOptions<T>) {\n return createStorage<T>('localStorage', 'use-local-storage')(props);\n}\n\ninterface ReadStorageValue {\n <T>(options: UseStorageOptions<T> & { defaultValue: T }): T;\n <T>(options: UseStorageOptions<T>): T | undefined;\n}\n\nexport const readLocalStorageValue: ReadStorageValue = readValue('localStorage');\n"],"mappings":";;;AAaA,SAAgB,gBAA4B,OAA6B;AACvE,QAAO,cAAiB,gBAAgB,oBAAoB,CAAC,MAAM;;AAQrE,MAAa,wBAA0C,UAAU,eAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-session-storage.mjs","names":[],"sources":["../../src/use-session-storage/use-session-storage.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"use-session-storage.mjs","names":[],"sources":["../../src/use-session-storage/use-session-storage.ts"],"sourcesContent":["import {\n createStorage,\n readValue,\n UseStorageOptions,\n UseStorageReturnValue,\n} from '../use-local-storage/create-storage';\n\nexport function useSessionStorage<T = string>(\n props: UseStorageOptions<T> & { defaultValue: T }\n): UseStorageReturnValue<T>;\nexport function useSessionStorage<T = string>(\n props: UseStorageOptions<T>\n): UseStorageReturnValue<T | undefined>;\nexport function useSessionStorage<T = string>(props: UseStorageOptions<T>) {\n return createStorage<T>('sessionStorage', 'use-session-storage')(props);\n}\n\ninterface ReadStorageValue {\n <T>(options: UseStorageOptions<T> & { defaultValue: T }): T;\n <T>(options: UseStorageOptions<T>): T | undefined;\n}\n\nexport const readSessionStorageValue: ReadStorageValue = readValue('sessionStorage');\n"],"mappings":";;;AAaA,SAAgB,kBAA8B,OAA6B;AACzE,QAAO,cAAiB,kBAAkB,sBAAsB,CAAC,MAAM;;AAQzE,MAAa,0BAA4C,UAAU,iBAAiB"}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
import { UseStorageOptions } from './create-storage';
|
|
2
|
-
export declare function useLocalStorage<T = string>(props: UseStorageOptions<T>
|
|
3
|
-
|
|
1
|
+
import { UseStorageOptions, UseStorageReturnValue } from './create-storage';
|
|
2
|
+
export declare function useLocalStorage<T = string>(props: UseStorageOptions<T> & {
|
|
3
|
+
defaultValue: T;
|
|
4
|
+
}): UseStorageReturnValue<T>;
|
|
5
|
+
export declare function useLocalStorage<T = string>(props: UseStorageOptions<T>): UseStorageReturnValue<T | undefined>;
|
|
6
|
+
interface ReadStorageValue {
|
|
7
|
+
<T>(options: UseStorageOptions<T> & {
|
|
8
|
+
defaultValue: T;
|
|
9
|
+
}): T;
|
|
10
|
+
<T>(options: UseStorageOptions<T>): T | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare const readLocalStorageValue: ReadStorageValue;
|
|
13
|
+
export {};
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
import { UseStorageOptions } from '../use-local-storage/create-storage';
|
|
2
|
-
export declare function useSessionStorage<T = string>(props: UseStorageOptions<T>
|
|
3
|
-
|
|
1
|
+
import { UseStorageOptions, UseStorageReturnValue } from '../use-local-storage/create-storage';
|
|
2
|
+
export declare function useSessionStorage<T = string>(props: UseStorageOptions<T> & {
|
|
3
|
+
defaultValue: T;
|
|
4
|
+
}): UseStorageReturnValue<T>;
|
|
5
|
+
export declare function useSessionStorage<T = string>(props: UseStorageOptions<T>): UseStorageReturnValue<T | undefined>;
|
|
6
|
+
interface ReadStorageValue {
|
|
7
|
+
<T>(options: UseStorageOptions<T> & {
|
|
8
|
+
defaultValue: T;
|
|
9
|
+
}): T;
|
|
10
|
+
<T>(options: UseStorageOptions<T>): T | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare const readSessionStorageValue: ReadStorageValue;
|
|
13
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
let react = require("react");
|
|
3
|
-
//#region packages/@mantine/hooks/src/use-drag/use-drag.ts
|
|
4
|
-
const VELOCITY_DECAY_MS = 100;
|
|
5
|
-
function sign(n) {
|
|
6
|
-
if (n > 0) return 1;
|
|
7
|
-
if (n < 0) return -1;
|
|
8
|
-
return 0;
|
|
9
|
-
}
|
|
10
|
-
function getThresholdVector(threshold) {
|
|
11
|
-
const t = threshold ?? 0;
|
|
12
|
-
if (typeof t === "number") return [t, t];
|
|
13
|
-
return t;
|
|
14
|
-
}
|
|
15
|
-
function createInitialState() {
|
|
16
|
-
return {
|
|
17
|
-
isActive: false,
|
|
18
|
-
pointerId: -1,
|
|
19
|
-
startXY: [0, 0],
|
|
20
|
-
prevXY: [0, 0],
|
|
21
|
-
startTimestamp: 0,
|
|
22
|
-
prevTimestamp: 0,
|
|
23
|
-
thresholdMet: false,
|
|
24
|
-
firstFired: false,
|
|
25
|
-
lockedAxis: null,
|
|
26
|
-
canceled: false,
|
|
27
|
-
lastVelocity: [0, 0]
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
function useDrag(handler, options = {}) {
|
|
31
|
-
const [active, setActive] = (0, react.useState)(false);
|
|
32
|
-
const handlerRef = (0, react.useRef)(handler);
|
|
33
|
-
handlerRef.current = handler;
|
|
34
|
-
const optionsRef = (0, react.useRef)(options);
|
|
35
|
-
optionsRef.current = options;
|
|
36
|
-
const stateRef = (0, react.useRef)(createInitialState());
|
|
37
|
-
const documentControllerRef = (0, react.useRef)(null);
|
|
38
|
-
return {
|
|
39
|
-
ref: (0, react.useCallback)((node) => {
|
|
40
|
-
if (!node) return;
|
|
41
|
-
const elementController = new AbortController();
|
|
42
|
-
const applyAxisConstraint = (v) => {
|
|
43
|
-
const opts = optionsRef.current;
|
|
44
|
-
const s = stateRef.current;
|
|
45
|
-
if (opts.axis === "x") return [v[0], 0];
|
|
46
|
-
if (opts.axis === "y") return [0, v[1]];
|
|
47
|
-
if (opts.axis === "lock") {
|
|
48
|
-
if (s.lockedAxis === null) {
|
|
49
|
-
const t = opts.axisThreshold ?? 1;
|
|
50
|
-
if (Math.abs(v[0]) > t || Math.abs(v[1]) > t) s.lockedAxis = Math.abs(v[0]) >= Math.abs(v[1]) ? "x" : "y";
|
|
51
|
-
}
|
|
52
|
-
if (s.lockedAxis === "x") return [v[0], 0];
|
|
53
|
-
if (s.lockedAxis === "y") return [0, v[1]];
|
|
54
|
-
}
|
|
55
|
-
return v;
|
|
56
|
-
};
|
|
57
|
-
const resetDrag = () => {
|
|
58
|
-
const s = stateRef.current;
|
|
59
|
-
s.isActive = false;
|
|
60
|
-
s.pointerId = -1;
|
|
61
|
-
s.thresholdMet = false;
|
|
62
|
-
s.firstFired = false;
|
|
63
|
-
s.lockedAxis = null;
|
|
64
|
-
s.canceled = false;
|
|
65
|
-
setActive(false);
|
|
66
|
-
document.body.style.userSelect = "";
|
|
67
|
-
document.body.style.webkitUserSelect = "";
|
|
68
|
-
documentControllerRef.current?.abort();
|
|
69
|
-
documentControllerRef.current = null;
|
|
70
|
-
};
|
|
71
|
-
const cancel = () => {
|
|
72
|
-
if (stateRef.current.isActive) {
|
|
73
|
-
stateRef.current.canceled = true;
|
|
74
|
-
resetDrag();
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
const activateDrag = () => {
|
|
78
|
-
setActive(true);
|
|
79
|
-
document.body.style.userSelect = "none";
|
|
80
|
-
document.body.style.webkitUserSelect = "none";
|
|
81
|
-
};
|
|
82
|
-
const onPointerDown = (event) => {
|
|
83
|
-
if (optionsRef.current.enabled === false) return;
|
|
84
|
-
if (event.button !== 0) return;
|
|
85
|
-
if (stateRef.current.isActive) return;
|
|
86
|
-
const s = stateRef.current;
|
|
87
|
-
s.isActive = true;
|
|
88
|
-
s.pointerId = event.pointerId;
|
|
89
|
-
s.startXY = [event.clientX, event.clientY];
|
|
90
|
-
s.prevXY = [event.clientX, event.clientY];
|
|
91
|
-
s.startTimestamp = event.timeStamp;
|
|
92
|
-
s.prevTimestamp = event.timeStamp;
|
|
93
|
-
s.thresholdMet = false;
|
|
94
|
-
s.firstFired = false;
|
|
95
|
-
s.lockedAxis = null;
|
|
96
|
-
s.canceled = false;
|
|
97
|
-
s.lastVelocity = [0, 0];
|
|
98
|
-
const [tx, ty] = getThresholdVector(optionsRef.current.threshold);
|
|
99
|
-
if (tx === 0 && ty === 0) {
|
|
100
|
-
s.thresholdMet = true;
|
|
101
|
-
s.firstFired = true;
|
|
102
|
-
activateDrag();
|
|
103
|
-
handlerRef.current({
|
|
104
|
-
xy: [event.clientX, event.clientY],
|
|
105
|
-
initial: [event.clientX, event.clientY],
|
|
106
|
-
movement: [0, 0],
|
|
107
|
-
delta: [0, 0],
|
|
108
|
-
distance: [0, 0],
|
|
109
|
-
direction: [0, 0],
|
|
110
|
-
velocity: [0, 0],
|
|
111
|
-
elapsedTime: 0,
|
|
112
|
-
first: true,
|
|
113
|
-
last: false,
|
|
114
|
-
active: true,
|
|
115
|
-
tap: false,
|
|
116
|
-
canceled: false,
|
|
117
|
-
cancel,
|
|
118
|
-
event
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
documentControllerRef.current?.abort();
|
|
122
|
-
documentControllerRef.current = new AbortController();
|
|
123
|
-
const sig = documentControllerRef.current.signal;
|
|
124
|
-
document.addEventListener("pointermove", onPointerMove, { signal: sig });
|
|
125
|
-
document.addEventListener("pointerup", onPointerUp, { signal: sig });
|
|
126
|
-
document.addEventListener("pointercancel", onPointerCancel, { signal: sig });
|
|
127
|
-
};
|
|
128
|
-
const onPointerMove = (event) => {
|
|
129
|
-
const s = stateRef.current;
|
|
130
|
-
if (!s.isActive || event.pointerId !== s.pointerId) return;
|
|
131
|
-
const rawMovement = [event.clientX - s.startXY[0], event.clientY - s.startXY[1]];
|
|
132
|
-
if (!s.thresholdMet) {
|
|
133
|
-
const [tx, ty] = getThresholdVector(optionsRef.current.threshold);
|
|
134
|
-
if (Math.abs(rawMovement[0]) < tx && Math.abs(rawMovement[1]) < ty) {
|
|
135
|
-
s.prevXY = [event.clientX, event.clientY];
|
|
136
|
-
s.prevTimestamp = event.timeStamp;
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
s.thresholdMet = true;
|
|
140
|
-
activateDrag();
|
|
141
|
-
}
|
|
142
|
-
const movement = applyAxisConstraint(rawMovement);
|
|
143
|
-
const delta = applyAxisConstraint([event.clientX - s.prevXY[0], event.clientY - s.prevXY[1]]);
|
|
144
|
-
const timeDelta = event.timeStamp - s.prevTimestamp;
|
|
145
|
-
const velocity = timeDelta > 0 ? [Math.abs(delta[0]) / timeDelta, Math.abs(delta[1]) / timeDelta] : s.lastVelocity;
|
|
146
|
-
s.lastVelocity = velocity;
|
|
147
|
-
const isFirst = !s.firstFired;
|
|
148
|
-
s.firstFired = true;
|
|
149
|
-
s.prevXY = [event.clientX, event.clientY];
|
|
150
|
-
s.prevTimestamp = event.timeStamp;
|
|
151
|
-
handlerRef.current({
|
|
152
|
-
xy: [event.clientX, event.clientY],
|
|
153
|
-
initial: [...s.startXY],
|
|
154
|
-
movement,
|
|
155
|
-
delta,
|
|
156
|
-
distance: [Math.abs(movement[0]), Math.abs(movement[1])],
|
|
157
|
-
direction: [sign(delta[0]), sign(delta[1])],
|
|
158
|
-
velocity,
|
|
159
|
-
elapsedTime: event.timeStamp - s.startTimestamp,
|
|
160
|
-
first: isFirst,
|
|
161
|
-
last: false,
|
|
162
|
-
active: true,
|
|
163
|
-
tap: false,
|
|
164
|
-
canceled: false,
|
|
165
|
-
cancel,
|
|
166
|
-
event
|
|
167
|
-
});
|
|
168
|
-
};
|
|
169
|
-
const onPointerUp = (event) => {
|
|
170
|
-
const s = stateRef.current;
|
|
171
|
-
if (!s.isActive || event.pointerId !== s.pointerId) return;
|
|
172
|
-
const opts = optionsRef.current;
|
|
173
|
-
if (!s.thresholdMet) {
|
|
174
|
-
if (opts.filterTaps) {
|
|
175
|
-
const mov = applyAxisConstraint([event.clientX - s.startXY[0], event.clientY - s.startXY[1]]);
|
|
176
|
-
const dist = [Math.abs(mov[0]), Math.abs(mov[1])];
|
|
177
|
-
const isTap = Math.max(dist[0], dist[1]) < (opts.tapThreshold ?? 3);
|
|
178
|
-
handlerRef.current({
|
|
179
|
-
xy: [event.clientX, event.clientY],
|
|
180
|
-
initial: [...s.startXY],
|
|
181
|
-
movement: mov,
|
|
182
|
-
delta: mov,
|
|
183
|
-
distance: dist,
|
|
184
|
-
direction: [sign(mov[0]), sign(mov[1])],
|
|
185
|
-
velocity: [0, 0],
|
|
186
|
-
elapsedTime: event.timeStamp - s.startTimestamp,
|
|
187
|
-
first: true,
|
|
188
|
-
last: true,
|
|
189
|
-
active: false,
|
|
190
|
-
tap: isTap,
|
|
191
|
-
canceled: false,
|
|
192
|
-
cancel,
|
|
193
|
-
event
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
resetDrag();
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
const movement = applyAxisConstraint([event.clientX - s.startXY[0], event.clientY - s.startXY[1]]);
|
|
200
|
-
const distance = [Math.abs(movement[0]), Math.abs(movement[1])];
|
|
201
|
-
const delta = applyAxisConstraint([event.clientX - s.prevXY[0], event.clientY - s.prevXY[1]]);
|
|
202
|
-
const velocity = event.timeStamp - s.prevTimestamp > VELOCITY_DECAY_MS ? [0, 0] : s.lastVelocity;
|
|
203
|
-
const maxDistance = Math.max(distance[0], distance[1]);
|
|
204
|
-
const tap = opts.filterTaps === true && maxDistance < (opts.tapThreshold ?? 3);
|
|
205
|
-
handlerRef.current({
|
|
206
|
-
xy: [event.clientX, event.clientY],
|
|
207
|
-
initial: [...s.startXY],
|
|
208
|
-
movement,
|
|
209
|
-
delta,
|
|
210
|
-
distance,
|
|
211
|
-
direction: [sign(delta[0]), sign(delta[1])],
|
|
212
|
-
velocity,
|
|
213
|
-
elapsedTime: event.timeStamp - s.startTimestamp,
|
|
214
|
-
first: !s.firstFired,
|
|
215
|
-
last: true,
|
|
216
|
-
active: false,
|
|
217
|
-
tap,
|
|
218
|
-
canceled: false,
|
|
219
|
-
cancel,
|
|
220
|
-
event
|
|
221
|
-
});
|
|
222
|
-
resetDrag();
|
|
223
|
-
};
|
|
224
|
-
const onPointerCancel = (event) => {
|
|
225
|
-
const s = stateRef.current;
|
|
226
|
-
if (!s.isActive || event.pointerId !== s.pointerId) return;
|
|
227
|
-
const movement = applyAxisConstraint([event.clientX - s.startXY[0], event.clientY - s.startXY[1]]);
|
|
228
|
-
handlerRef.current({
|
|
229
|
-
xy: [event.clientX, event.clientY],
|
|
230
|
-
initial: [...s.startXY],
|
|
231
|
-
movement,
|
|
232
|
-
delta: [0, 0],
|
|
233
|
-
distance: [Math.abs(movement[0]), Math.abs(movement[1])],
|
|
234
|
-
direction: [0, 0],
|
|
235
|
-
velocity: [0, 0],
|
|
236
|
-
elapsedTime: event.timeStamp - s.startTimestamp,
|
|
237
|
-
first: !s.firstFired,
|
|
238
|
-
last: true,
|
|
239
|
-
active: false,
|
|
240
|
-
tap: false,
|
|
241
|
-
canceled: true,
|
|
242
|
-
cancel,
|
|
243
|
-
event
|
|
244
|
-
});
|
|
245
|
-
resetDrag();
|
|
246
|
-
};
|
|
247
|
-
node.addEventListener("pointerdown", onPointerDown, { signal: elementController.signal });
|
|
248
|
-
return () => {
|
|
249
|
-
elementController.abort();
|
|
250
|
-
documentControllerRef.current?.abort();
|
|
251
|
-
documentControllerRef.current = null;
|
|
252
|
-
if (stateRef.current.isActive) {
|
|
253
|
-
stateRef.current.isActive = false;
|
|
254
|
-
setActive(false);
|
|
255
|
-
document.body.style.userSelect = "";
|
|
256
|
-
document.body.style.webkitUserSelect = "";
|
|
257
|
-
}
|
|
258
|
-
};
|
|
259
|
-
}, []),
|
|
260
|
-
active
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
//#endregion
|
|
264
|
-
exports.useDrag = useDrag;
|
|
265
|
-
|
|
266
|
-
//# sourceMappingURL=use-drag.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-drag.cjs","names":[],"sources":["../../src/use-drag/use-drag.ts"],"sourcesContent":["// Required to disable for webkit-user-select, although deprecated, it is still required for Safari support\n/* eslint-disable @typescript-eslint/no-deprecated */\nimport { useCallback, useRef, useState } from 'react';\n\ntype Vector2 = [number, number];\n\nexport interface UseDragState {\n /** Current pointer position [x, y] */\n xy: Vector2;\n\n /** Position where the gesture started [x, y] */\n initial: Vector2;\n\n /** Displacement from start [x, y], respects axis constraint */\n movement: Vector2;\n\n /** Change since previous event [x, y] */\n delta: Vector2;\n\n /** Absolute distance per axis [x, y] */\n distance: Vector2;\n\n /** Movement direction per axis: -1, 0, or 1 */\n direction: Vector2;\n\n /** Speed per axis in px/ms */\n velocity: Vector2;\n\n /** Time since drag started in ms */\n elapsedTime: number;\n\n /** `true` on the first handler call after the threshold is met */\n first: boolean;\n\n /** `true` on the last handler call (pointer released or canceled) */\n last: boolean;\n\n /** `true` while the gesture is ongoing */\n active: boolean;\n\n /** `true` when the gesture qualifies as a tap (requires `filterTaps: true`) */\n tap: boolean;\n\n /** `true` when the gesture was interrupted by a `pointercancel` event */\n canceled: boolean;\n\n /** Function to programmatically cancel the current gesture */\n cancel: () => void;\n\n /** The source `PointerEvent` */\n event: PointerEvent;\n}\n\nexport interface UseDragOptions {\n /** Constrain movement to a specific axis. `'lock'` locks to whichever axis has more movement after `axisThreshold` is exceeded. */\n axis?: 'x' | 'y' | 'lock';\n\n /** Movement in px required to determine axis when `axis` is `'lock'`, `1` by default */\n axisThreshold?: number;\n\n /** When `true`, the last state includes `tap: true` when total distance is below `tapThreshold`, `false` by default */\n filterTaps?: boolean;\n\n /** Max displacement in px to still be considered a tap, `3` by default */\n tapThreshold?: number;\n\n /** Minimum displacement in px before the drag activates. Can be a number (both axes) or `[x, y]`. `0` by default */\n threshold?: number | Vector2;\n\n /** Enable or disable the hook, `true` by default */\n enabled?: boolean;\n}\n\nexport interface UseDragReturnValue<T extends HTMLElement = any> {\n /** Ref callback to attach to the draggable element */\n ref: React.RefCallback<T | null>;\n\n /** `true` while the element is being dragged */\n active: boolean;\n}\n\nconst VELOCITY_DECAY_MS = 100;\n\nfunction sign(n: number): -1 | 0 | 1 {\n if (n > 0) {\n return 1;\n }\n if (n < 0) {\n return -1;\n }\n return 0;\n}\n\nfunction getThresholdVector(threshold: number | Vector2 | undefined): Vector2 {\n const t = threshold ?? 0;\n if (typeof t === 'number') {\n return [t, t];\n }\n return t;\n}\n\ninterface DragInternalState {\n isActive: boolean;\n pointerId: number;\n startXY: Vector2;\n prevXY: Vector2;\n startTimestamp: number;\n prevTimestamp: number;\n thresholdMet: boolean;\n firstFired: boolean;\n lockedAxis: 'x' | 'y' | null;\n canceled: boolean;\n lastVelocity: Vector2;\n}\n\nfunction createInitialState(): DragInternalState {\n return {\n isActive: false,\n pointerId: -1,\n startXY: [0, 0],\n prevXY: [0, 0],\n startTimestamp: 0,\n prevTimestamp: 0,\n thresholdMet: false,\n firstFired: false,\n lockedAxis: null,\n canceled: false,\n lastVelocity: [0, 0],\n };\n}\n\nexport function useDrag<T extends HTMLElement = any>(\n handler: (state: UseDragState) => void,\n options: UseDragOptions = {}\n): UseDragReturnValue<T> {\n const [active, setActive] = useState(false);\n\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const stateRef = useRef<DragInternalState>(createInitialState());\n const documentControllerRef = useRef<AbortController | null>(null);\n\n const refCallback: React.RefCallback<T | null> = useCallback((node) => {\n if (!node) {\n return undefined;\n }\n\n const elementController = new AbortController();\n\n const applyAxisConstraint = (v: Vector2): Vector2 => {\n const opts = optionsRef.current;\n const s = stateRef.current;\n\n if (opts.axis === 'x') {\n return [v[0], 0];\n }\n if (opts.axis === 'y') {\n return [0, v[1]];\n }\n if (opts.axis === 'lock') {\n if (s.lockedAxis === null) {\n const t = opts.axisThreshold ?? 1;\n if (Math.abs(v[0]) > t || Math.abs(v[1]) > t) {\n s.lockedAxis = Math.abs(v[0]) >= Math.abs(v[1]) ? 'x' : 'y';\n }\n }\n if (s.lockedAxis === 'x') {\n return [v[0], 0];\n }\n if (s.lockedAxis === 'y') {\n return [0, v[1]];\n }\n }\n return v;\n };\n\n const resetDrag = () => {\n const s = stateRef.current;\n s.isActive = false;\n s.pointerId = -1;\n s.thresholdMet = false;\n s.firstFired = false;\n s.lockedAxis = null;\n s.canceled = false;\n setActive(false);\n document.body.style.userSelect = '';\n document.body.style.webkitUserSelect = '';\n documentControllerRef.current?.abort();\n documentControllerRef.current = null;\n };\n\n const cancel = () => {\n if (stateRef.current.isActive) {\n stateRef.current.canceled = true;\n resetDrag();\n }\n };\n\n const activateDrag = () => {\n setActive(true);\n document.body.style.userSelect = 'none';\n document.body.style.webkitUserSelect = 'none';\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (optionsRef.current.enabled === false) {\n return;\n }\n if (event.button !== 0) {\n return;\n }\n if (stateRef.current.isActive) {\n return;\n }\n\n const s = stateRef.current;\n s.isActive = true;\n s.pointerId = event.pointerId;\n s.startXY = [event.clientX, event.clientY];\n s.prevXY = [event.clientX, event.clientY];\n s.startTimestamp = event.timeStamp;\n s.prevTimestamp = event.timeStamp;\n s.thresholdMet = false;\n s.firstFired = false;\n s.lockedAxis = null;\n s.canceled = false;\n s.lastVelocity = [0, 0];\n\n const [tx, ty] = getThresholdVector(optionsRef.current.threshold);\n if (tx === 0 && ty === 0) {\n s.thresholdMet = true;\n s.firstFired = true;\n activateDrag();\n\n handlerRef.current({\n xy: [event.clientX, event.clientY],\n initial: [event.clientX, event.clientY],\n movement: [0, 0],\n delta: [0, 0],\n distance: [0, 0],\n direction: [0, 0],\n velocity: [0, 0],\n elapsedTime: 0,\n first: true,\n last: false,\n active: true,\n tap: false,\n canceled: false,\n cancel,\n event,\n });\n }\n\n documentControllerRef.current?.abort();\n documentControllerRef.current = new AbortController();\n const sig = documentControllerRef.current.signal;\n\n document.addEventListener('pointermove', onPointerMove, { signal: sig });\n document.addEventListener('pointerup', onPointerUp, { signal: sig });\n document.addEventListener('pointercancel', onPointerCancel, { signal: sig });\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const s = stateRef.current;\n if (!s.isActive || event.pointerId !== s.pointerId) {\n return;\n }\n\n const rawMovement: Vector2 = [event.clientX - s.startXY[0], event.clientY - s.startXY[1]];\n\n if (!s.thresholdMet) {\n const [tx, ty] = getThresholdVector(optionsRef.current.threshold);\n if (Math.abs(rawMovement[0]) < tx && Math.abs(rawMovement[1]) < ty) {\n s.prevXY = [event.clientX, event.clientY];\n s.prevTimestamp = event.timeStamp;\n return;\n }\n s.thresholdMet = true;\n activateDrag();\n }\n\n const movement = applyAxisConstraint(rawMovement);\n const rawDelta: Vector2 = [event.clientX - s.prevXY[0], event.clientY - s.prevXY[1]];\n const delta = applyAxisConstraint(rawDelta);\n const timeDelta = event.timeStamp - s.prevTimestamp;\n const velocity: Vector2 =\n timeDelta > 0\n ? [Math.abs(delta[0]) / timeDelta, Math.abs(delta[1]) / timeDelta]\n : s.lastVelocity;\n\n s.lastVelocity = velocity;\n const isFirst = !s.firstFired;\n s.firstFired = true;\n s.prevXY = [event.clientX, event.clientY];\n s.prevTimestamp = event.timeStamp;\n\n handlerRef.current({\n xy: [event.clientX, event.clientY],\n initial: [...s.startXY],\n movement,\n delta,\n distance: [Math.abs(movement[0]), Math.abs(movement[1])],\n direction: [sign(delta[0]), sign(delta[1])],\n velocity,\n elapsedTime: event.timeStamp - s.startTimestamp,\n first: isFirst,\n last: false,\n active: true,\n tap: false,\n canceled: false,\n cancel,\n event,\n });\n };\n\n const onPointerUp = (event: PointerEvent) => {\n const s = stateRef.current;\n if (!s.isActive || event.pointerId !== s.pointerId) {\n return;\n }\n\n const opts = optionsRef.current;\n\n if (!s.thresholdMet) {\n if (opts.filterTaps) {\n const rawMov: Vector2 = [event.clientX - s.startXY[0], event.clientY - s.startXY[1]];\n const mov = applyAxisConstraint(rawMov);\n const dist: Vector2 = [Math.abs(mov[0]), Math.abs(mov[1])];\n const maxDist = Math.max(dist[0], dist[1]);\n const isTap = maxDist < (opts.tapThreshold ?? 3);\n\n handlerRef.current({\n xy: [event.clientX, event.clientY],\n initial: [...s.startXY],\n movement: mov,\n delta: mov,\n distance: dist,\n direction: [sign(mov[0]), sign(mov[1])],\n velocity: [0, 0],\n elapsedTime: event.timeStamp - s.startTimestamp,\n first: true,\n last: true,\n active: false,\n tap: isTap,\n canceled: false,\n cancel,\n event,\n });\n }\n resetDrag();\n return;\n }\n\n const rawMovement: Vector2 = [event.clientX - s.startXY[0], event.clientY - s.startXY[1]];\n const movement = applyAxisConstraint(rawMovement);\n const distance: Vector2 = [Math.abs(movement[0]), Math.abs(movement[1])];\n const rawDelta: Vector2 = [event.clientX - s.prevXY[0], event.clientY - s.prevXY[1]];\n const delta = applyAxisConstraint(rawDelta);\n\n const timeSinceLastMove = event.timeStamp - s.prevTimestamp;\n const velocity: Vector2 = timeSinceLastMove > VELOCITY_DECAY_MS ? [0, 0] : s.lastVelocity;\n\n const maxDistance = Math.max(distance[0], distance[1]);\n const tap = opts.filterTaps === true && maxDistance < (opts.tapThreshold ?? 3);\n\n handlerRef.current({\n xy: [event.clientX, event.clientY],\n initial: [...s.startXY],\n movement,\n delta,\n distance,\n direction: [sign(delta[0]), sign(delta[1])],\n velocity,\n elapsedTime: event.timeStamp - s.startTimestamp,\n first: !s.firstFired,\n last: true,\n active: false,\n tap,\n canceled: false,\n cancel,\n event,\n });\n\n resetDrag();\n };\n\n const onPointerCancel = (event: PointerEvent) => {\n const s = stateRef.current;\n if (!s.isActive || event.pointerId !== s.pointerId) {\n return;\n }\n\n const rawMovement: Vector2 = [event.clientX - s.startXY[0], event.clientY - s.startXY[1]];\n const movement = applyAxisConstraint(rawMovement);\n\n handlerRef.current({\n xy: [event.clientX, event.clientY],\n initial: [...s.startXY],\n movement,\n delta: [0, 0],\n distance: [Math.abs(movement[0]), Math.abs(movement[1])],\n direction: [0, 0],\n velocity: [0, 0],\n elapsedTime: event.timeStamp - s.startTimestamp,\n first: !s.firstFired,\n last: true,\n active: false,\n tap: false,\n canceled: true,\n cancel,\n event,\n });\n\n resetDrag();\n };\n\n node.addEventListener('pointerdown', onPointerDown, {\n signal: elementController.signal,\n });\n\n return () => {\n elementController.abort();\n documentControllerRef.current?.abort();\n documentControllerRef.current = null;\n if (stateRef.current.isActive) {\n stateRef.current.isActive = false;\n setActive(false);\n document.body.style.userSelect = '';\n document.body.style.webkitUserSelect = '';\n }\n };\n }, []);\n\n return { ref: refCallback, active };\n}\n\nexport namespace useDrag {\n export type State = UseDragState;\n export type Options = UseDragOptions;\n export type ReturnValue<T extends HTMLElement = any> = UseDragReturnValue<T>;\n}\n"],"mappings":"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"}
|