@joewinke/jatui 0.2.33 → 0.3.1

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,61 @@
1
+ /* dirtyGuard.svelte.js generated by Svelte v5.53.11 */
2
+ import * as $ from 'svelte/internal/client';
3
+ import { untrack } from 'svelte';
4
+
5
+ function defaultEquals(a, b) {
6
+ try {
7
+ return JSON.stringify(a) === JSON.stringify(b);
8
+ } catch {
9
+ return a === b;
10
+ }
11
+ }
12
+
13
+ export function createDirtyGuard(opts) {
14
+ const eq = opts.equals ?? defaultEquals;
15
+ const dirty = $.derived(() => !eq(opts.baseline(), opts.current()));
16
+
17
+ // beforeunload — arm only while dirty (browser-native prompt).
18
+ $.user_effect(() => {
19
+ if (!$.get(dirty)) return;
20
+ if (typeof window === 'undefined') return;
21
+
22
+ function handler(e) {
23
+ e.preventDefault();
24
+ e.returnValue = '';
25
+ }
26
+
27
+ window.addEventListener('beforeunload', handler);
28
+
29
+ return () => window.removeEventListener('beforeunload', handler);
30
+ });
31
+
32
+ // SvelteKit internal navigation — client-side back/next/link nav does not
33
+ // fire beforeunload. Only wire when the caller passed beforeNavigate in.
34
+ if (opts.beforeNavigate) {
35
+ opts.beforeNavigate((nav) => {
36
+ if (!untrack(() => $.get(dirty))) return;
37
+
38
+ // 'leave' is browser tab-close / reload — already handled above.
39
+ if (nav.type === 'leave') return;
40
+
41
+ if (typeof window === 'undefined') return;
42
+
43
+ const prompt = opts.discardPrompt ?? 'Discard unsaved changes?';
44
+
45
+ if (!window.confirm(prompt)) {
46
+ nav.cancel();
47
+ }
48
+ });
49
+ }
50
+
51
+ function cancel() {
52
+ opts.onCancel?.();
53
+ }
54
+
55
+ return {
56
+ get dirty() {
57
+ return $.get(dirty);
58
+ },
59
+ cancel
60
+ };
61
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joewinke/jatui",
3
- "version": "0.2.33",
3
+ "version": "0.3.1",
4
4
  "private": false,
5
5
  "description": "Shared Svelte 5 component library for JAT projects",
6
6
  "type": "module",