@sveltia/ui 0.39.0 → 0.39.2

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.
@@ -27,7 +27,8 @@
27
27
  } = $props();
28
28
 
29
29
  /** @type {number} */
30
- let loadedItemSize = $derived(itemChunkSize);
30
+ // svelte-ignore state_referenced_locally
31
+ let loadedItemSize = $state(itemChunkSize);
31
32
 
32
33
  /** @type {HTMLElement | undefined} */
33
34
  let spinner = $state(undefined);
@@ -59,6 +59,14 @@
59
59
  let setOpenClass = $state(false);
60
60
  let setActiveClass = $state(false);
61
61
  let showContent = $state(false);
62
+ /**
63
+ * Monotonically increasing counter used to detect stale async operations. Incremented at the
64
+ * start of each `openDialog`/`closeDialog` call; any suspended continuation that finds its
65
+ * captured value no longer matches the current counter knows it has been superseded and exits
66
+ * without mutating state.
67
+ * @type {number}
68
+ */
69
+ let generation = 0;
62
70
 
63
71
  /**
64
72
  * Resolve once the transition is complete.
@@ -88,13 +96,19 @@
88
96
  return;
89
97
  }
90
98
 
99
+ generation += 1;
100
+
101
+ const gen = generation;
102
+
91
103
  onOpening?.(new CustomEvent('Opening'));
92
104
  showContent = true;
93
105
  dialog.showModal();
94
106
  onOpen?.(new CustomEvent('Open'));
95
107
  await sleep(0);
108
+ if (gen !== generation) return;
96
109
  setOpenClass = true;
97
110
  await waitForTransition();
111
+ if (gen !== generation) return;
98
112
  setActiveClass = true;
99
113
  };
100
114
 
@@ -106,6 +120,10 @@
106
120
  return;
107
121
  }
108
122
 
123
+ generation += 1;
124
+
125
+ const gen = generation;
126
+ const wasOpen = setOpenClass;
109
127
  const { returnValue } = dialog;
110
128
 
111
129
  onClosing?.(new CustomEvent('Closing'));
@@ -115,7 +133,16 @@
115
133
  document.body.inert = false;
116
134
  setActiveClass = false;
117
135
  setOpenClass = false;
118
- await waitForTransition();
136
+
137
+ // Only wait for the closing transition if the dialog was visually open (i.e. the `.open` CSS
138
+ // class was set). If the dialog was closed before the opening transition even started, there is
139
+ // no CSS transition in progress and `transitionend` will never fire.
140
+ if (wasOpen) {
141
+ await waitForTransition();
142
+ }
143
+
144
+ if (gen !== generation) return;
145
+
119
146
  showContent = false;
120
147
 
121
148
  if (returnValue === 'ok') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltia/ui",
3
- "version": "0.39.0",
3
+ "version": "0.39.2",
4
4
  "description": "A collection of Svelte components and utilities for building user interfaces.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -49,14 +49,14 @@
49
49
  "@sveltia/utils": "^0.10.6",
50
50
  "lexical": "^0.44.0",
51
51
  "prismjs": "^1.30.0",
52
- "yaml": "^2.8.4"
52
+ "yaml": "^2.9.0"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@sveltejs/adapter-auto": "^7.0.1",
56
- "@sveltejs/kit": "^2.59.1",
56
+ "@sveltejs/kit": "^2.60.1",
57
57
  "@sveltejs/package": "^2.5.7",
58
58
  "@sveltejs/vite-plugin-svelte": "^7.1.2",
59
- "@vitest/coverage-v8": "^4.1.5",
59
+ "@vitest/coverage-v8": "^4.1.6",
60
60
  "cspell": "^10.0.0",
61
61
  "eslint": "^9.39.4",
62
62
  "eslint-config-airbnb-extended": "^3.1.0",
@@ -67,21 +67,21 @@
67
67
  "eslint-plugin-svelte": "^3.17.1",
68
68
  "globals": "^17.6.0",
69
69
  "happy-dom": "^20.9.0",
70
- "oxlint": "^1.63.0",
70
+ "oxlint": "^1.65.0",
71
71
  "postcss": "^8.5.14",
72
72
  "postcss-html": "^1.8.1",
73
73
  "prettier": "^3.8.3",
74
- "prettier-plugin-svelte": "^3.5.1",
74
+ "prettier-plugin-svelte": "^3.5.2",
75
75
  "sass": "^1.99.0",
76
- "stylelint": "^17.11.0",
76
+ "stylelint": "^17.11.1",
77
77
  "stylelint-config-recommended-scss": "^17.0.1",
78
- "stylelint-scss": "^7.0.0",
79
- "svelte": "^5.55.5",
78
+ "stylelint-scss": "^7.1.1",
79
+ "svelte": "^5.55.7",
80
80
  "svelte-check": "^4.4.8",
81
81
  "svelte-preprocess": "^6.0.3",
82
82
  "tslib": "^2.8.1",
83
- "vite": "^8.0.11",
84
- "vitest": "^4.1.5"
83
+ "vite": "^8.0.13",
84
+ "vitest": "^4.1.6"
85
85
  },
86
86
  "peerDependencies": {
87
87
  "svelte": "^5.0.0"