stellar-drive 1.2.2 → 1.2.3
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/dist/actions/scrollGuard.d.ts +14 -0
- package/dist/actions/scrollGuard.d.ts.map +1 -0
- package/dist/actions/scrollGuard.js +75 -0
- package/dist/actions/scrollGuard.js.map +1 -0
- package/dist/bin/install-pwa.js +1 -1
- package/dist/entries/actions.d.ts +1 -0
- package/dist/entries/actions.d.ts.map +1 -1
- package/dist/entries/actions.js +7 -0
- package/dist/entries/actions.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte action that prevents accidental click/tap events during scroll.
|
|
3
|
+
*
|
|
4
|
+
* On mobile, a touch interaction that starts as a tap but becomes a scroll
|
|
5
|
+
* can still fire a synthetic click event. This action detects when the finger
|
|
6
|
+
* moves beyond a threshold during a touch and suppresses the resulting click.
|
|
7
|
+
*
|
|
8
|
+
* Usage: `<main use:scrollGuard>` on any scrollable container (typically the
|
|
9
|
+
* root layout's `<main>` element so all pages are protected).
|
|
10
|
+
*/
|
|
11
|
+
export declare function scrollGuard(node: HTMLElement): {
|
|
12
|
+
destroy(): void;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=scrollGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollGuard.d.ts","sourceRoot":"","sources":["../../src/actions/scrollGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW;;EAoE5C"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte action that prevents accidental click/tap events during scroll.
|
|
3
|
+
*
|
|
4
|
+
* On mobile, a touch interaction that starts as a tap but becomes a scroll
|
|
5
|
+
* can still fire a synthetic click event. This action detects when the finger
|
|
6
|
+
* moves beyond a threshold during a touch and suppresses the resulting click.
|
|
7
|
+
*
|
|
8
|
+
* Usage: `<main use:scrollGuard>` on any scrollable container (typically the
|
|
9
|
+
* root layout's `<main>` element so all pages are protected).
|
|
10
|
+
*/
|
|
11
|
+
const MOVE_THRESHOLD = 10; // px — movement beyond this means scroll, not tap
|
|
12
|
+
export function scrollGuard(node) {
|
|
13
|
+
let startX = 0;
|
|
14
|
+
let startY = 0;
|
|
15
|
+
let didScroll = false;
|
|
16
|
+
// Track the pending suppressor so we can clear it if a new touch starts
|
|
17
|
+
let pendingHandler = null;
|
|
18
|
+
let pendingTimeout = null;
|
|
19
|
+
function clearPendingSuppressor() {
|
|
20
|
+
if (pendingHandler) {
|
|
21
|
+
node.removeEventListener('click', pendingHandler, true);
|
|
22
|
+
pendingHandler = null;
|
|
23
|
+
}
|
|
24
|
+
if (pendingTimeout) {
|
|
25
|
+
clearTimeout(pendingTimeout);
|
|
26
|
+
pendingTimeout = null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function onTouchStart(e) {
|
|
30
|
+
// A new touch means the user is starting a fresh gesture —
|
|
31
|
+
// clear any leftover suppressor from a previous scroll so it
|
|
32
|
+
// doesn't eat a legitimate tap.
|
|
33
|
+
clearPendingSuppressor();
|
|
34
|
+
const touch = e.touches[0];
|
|
35
|
+
startX = touch.clientX;
|
|
36
|
+
startY = touch.clientY;
|
|
37
|
+
didScroll = false;
|
|
38
|
+
}
|
|
39
|
+
function onTouchMove(e) {
|
|
40
|
+
if (didScroll)
|
|
41
|
+
return;
|
|
42
|
+
const touch = e.touches[0];
|
|
43
|
+
const dx = Math.abs(touch.clientX - startX);
|
|
44
|
+
const dy = Math.abs(touch.clientY - startY);
|
|
45
|
+
if (dx > MOVE_THRESHOLD || dy > MOVE_THRESHOLD) {
|
|
46
|
+
didScroll = true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function onTouchEnd() {
|
|
50
|
+
if (!didScroll)
|
|
51
|
+
return;
|
|
52
|
+
// Suppress the synthetic click that browsers fire after touchend
|
|
53
|
+
const handler = (e) => {
|
|
54
|
+
e.stopPropagation();
|
|
55
|
+
e.preventDefault();
|
|
56
|
+
clearPendingSuppressor();
|
|
57
|
+
};
|
|
58
|
+
pendingHandler = handler;
|
|
59
|
+
node.addEventListener('click', handler, true);
|
|
60
|
+
// Safety: remove if click never fires (e.g. iOS edge cases)
|
|
61
|
+
pendingTimeout = setTimeout(() => clearPendingSuppressor(), 400);
|
|
62
|
+
}
|
|
63
|
+
node.addEventListener('touchstart', onTouchStart, { passive: true });
|
|
64
|
+
node.addEventListener('touchmove', onTouchMove, { passive: true });
|
|
65
|
+
node.addEventListener('touchend', onTouchEnd, { passive: true });
|
|
66
|
+
return {
|
|
67
|
+
destroy() {
|
|
68
|
+
clearPendingSuppressor();
|
|
69
|
+
node.removeEventListener('touchstart', onTouchStart);
|
|
70
|
+
node.removeEventListener('touchmove', onTouchMove);
|
|
71
|
+
node.removeEventListener('touchend', onTouchEnd);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=scrollGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollGuard.js","sourceRoot":"","sources":["../../src/actions/scrollGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,cAAc,GAAG,EAAE,CAAC,CAAC,kDAAkD;AAE7E,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,wEAAwE;IACxE,IAAI,cAAc,GAAgC,IAAI,CAAC;IACvD,IAAI,cAAc,GAAyC,IAAI,CAAC;IAEhE,SAAS,sBAAsB;QAC7B,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YACxD,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,cAAc,EAAE,CAAC;YACnB,YAAY,CAAC,cAAc,CAAC,CAAC;YAC7B,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,SAAS,YAAY,CAAC,CAAa;QACjC,2DAA2D;QAC3D,6DAA6D;QAC7D,gCAAgC;QAChC,sBAAsB,EAAE,CAAC;QAEzB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QACvB,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QACvB,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,SAAS,WAAW,CAAC,CAAa;QAChC,IAAI,SAAS;YAAE,OAAO;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;QAC5C,IAAI,EAAE,GAAG,cAAc,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC;YAC/C,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAED,SAAS,UAAU;QACjB,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,iEAAiE;QACjE,MAAM,OAAO,GAAG,CAAC,CAAQ,EAAE,EAAE;YAC3B,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,sBAAsB,EAAE,CAAC;QAC3B,CAAC,CAAC;QACF,cAAc,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9C,4DAA4D;QAC5D,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,OAAO;QACL,OAAO;YACL,sBAAsB,EAAE,CAAC;YACzB,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YACrD,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACnD,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/bin/install-pwa.js
CHANGED
|
@@ -13,4 +13,5 @@
|
|
|
13
13
|
*/
|
|
14
14
|
export { remoteChangeAnimation, trackEditing, triggerLocalAnimation } from '../actions/remoteChange';
|
|
15
15
|
export { truncateTooltip } from '../actions/truncateTooltip';
|
|
16
|
+
export { scrollGuard } from '../actions/scrollGuard';
|
|
16
17
|
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/entries/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/entries/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAS7D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/entries/actions.js
CHANGED
|
@@ -26,4 +26,11 @@ export { remoteChangeAnimation, trackEditing, triggerLocalAnimation } from '../a
|
|
|
26
26
|
// A Svelte action that detects CSS text-overflow (ellipsis) on an element and
|
|
27
27
|
// attaches a native `title` tooltip showing the full text when truncated.
|
|
28
28
|
export { truncateTooltip } from '../actions/truncateTooltip';
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// Scroll Guard
|
|
31
|
+
// =============================================================================
|
|
32
|
+
// A Svelte action that prevents accidental click/tap events during scroll on
|
|
33
|
+
// mobile. Apply to a scrollable container (e.g. `<main use:scrollGuard>`) so
|
|
34
|
+
// that touches that turn into scrolls never fire child onclick handlers.
|
|
35
|
+
export { scrollGuard } from '../actions/scrollGuard';
|
|
29
36
|
//# sourceMappingURL=actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/entries/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAChF,gFAAgF;AAChF,8EAA8E;AAC9E,yEAAyE;AACzE,4EAA4E;AAC5E,gEAAgE;AAEhE,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAEjC,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAChF,8EAA8E;AAC9E,0EAA0E;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/entries/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAChF,gFAAgF;AAChF,8EAA8E;AAC9E,yEAAyE;AACzE,4EAA4E;AAC5E,gEAAgE;AAEhE,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAEjC,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAChF,8EAA8E;AAC9E,0EAA0E;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAChF,6EAA6E;AAC7E,6EAA6E;AAC7E,yEAAyE;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|