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.
@@ -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"}
@@ -206,7 +206,7 @@ function generatePackageJson(opts) {
206
206
  },
207
207
  dependencies: {
208
208
  postgres: '^3.4.0',
209
- 'stellar-drive': '^1.2.2'
209
+ 'stellar-drive': '^1.2.3'
210
210
  },
211
211
  type: 'module'
212
212
  }, null, 2) + '\n');
@@ -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"}
@@ -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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stellar-drive",
3
- "version": "1.2.2",
3
+ "version": "1.2.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",