sibujs 1.5.0 → 2.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.
Files changed (207) hide show
  1. package/dist/browser.cjs +238 -69
  2. package/dist/browser.d.cts +5 -0
  3. package/dist/browser.d.ts +5 -0
  4. package/dist/browser.js +6 -6
  5. package/dist/build.cjs +916 -292
  6. package/dist/build.js +15 -13
  7. package/dist/cdn.global.js +17 -16
  8. package/dist/chunk-2RA7SHDA.js +65 -0
  9. package/dist/chunk-2UPRY23K.js +80 -0
  10. package/dist/chunk-3JHCYHWN.js +125 -0
  11. package/dist/{chunk-VAPYJN4X.js → chunk-3LR7GLWQ.js} +93 -23
  12. package/dist/{chunk-RJ46C3CS.js → chunk-3NSGB5JN.js} +71 -20
  13. package/dist/{chunk-XUEEGU5O.js → chunk-52YJLLRO.js} +16 -4
  14. package/dist/{chunk-XHK6BDAJ.js → chunk-54EDRCEF.js} +25 -8
  15. package/dist/chunk-7JDB7I65.js +1327 -0
  16. package/dist/{chunk-WZSPOOER.js → chunk-CC65Y57T.js} +8 -5
  17. package/dist/{chunk-23VV7YD3.js → chunk-DFPFITST.js} +25 -30
  18. package/dist/{chunk-BGN5ZMP4.js → chunk-GTBNNBJ6.js} +14 -2
  19. package/dist/chunk-HB24TBAF.js +121 -0
  20. package/dist/{chunk-CZUGLNJS.js → chunk-ITX6OO3F.js} +3 -3
  21. package/dist/{chunk-BGTHZHJ5.js → chunk-JA6667UN.js} +188 -44
  22. package/dist/{chunk-7GRNSCFT.js → chunk-JXMMDLBY.js} +306 -183
  23. package/dist/{chunk-3X2YG6YM.js → chunk-JYD2PWXH.js} +59 -28
  24. package/dist/{chunk-SFKNRVCU.js → chunk-KLRMB5ZS.js} +135 -79
  25. package/dist/{chunk-5X6PP2UK.js → chunk-LMLD24FC.js} +2 -2
  26. package/dist/{chunk-M4NLBH4I.js → chunk-LYTCUZ7H.js} +3 -2
  27. package/dist/{chunk-BMPL52BF.js → chunk-MIUAXB7K.js} +118 -66
  28. package/dist/{chunk-JCDUJN2F.js → chunk-ND2664SF.js} +486 -153
  29. package/dist/{chunk-VQDZK23A.js → chunk-O2MNQFLP.js} +181 -66
  30. package/dist/{chunk-NHUC2QWH.js → chunk-R73P76YZ.js} +1 -1
  31. package/dist/{chunk-2BYQDGN3.js → chunk-SAHNHTFC.js} +234 -63
  32. package/dist/chunk-UCS6AMJ7.js +79 -0
  33. package/dist/{chunk-K4G4ZQNR.js → chunk-VLPPXTYG.js} +84 -38
  34. package/dist/{chunk-OUZZEE4S.js → chunk-WOMYAHHI.js} +17 -11
  35. package/dist/{customElement-BL3Uo8dL.d.cts → customElement-CPfIrbvg.d.cts} +14 -10
  36. package/dist/{customElement-BL3Uo8dL.d.ts → customElement-CPfIrbvg.d.ts} +14 -10
  37. package/dist/data.cjs +410 -99
  38. package/dist/data.d.cts +20 -2
  39. package/dist/data.d.ts +20 -2
  40. package/dist/data.js +11 -9
  41. package/dist/devtools.cjs +513 -223
  42. package/dist/devtools.d.cts +1 -1
  43. package/dist/devtools.d.ts +1 -1
  44. package/dist/devtools.js +12 -6
  45. package/dist/ecosystem.cjs +475 -144
  46. package/dist/ecosystem.d.cts +9 -7
  47. package/dist/ecosystem.d.ts +9 -7
  48. package/dist/ecosystem.js +12 -11
  49. package/dist/extras.cjs +3355 -1541
  50. package/dist/extras.d.cts +9 -9
  51. package/dist/extras.d.ts +9 -9
  52. package/dist/extras.js +58 -45
  53. package/dist/index.cjs +920 -292
  54. package/dist/index.d.cts +71 -8
  55. package/dist/index.d.ts +71 -8
  56. package/dist/index.js +28 -16
  57. package/dist/{introspect-BumjnBKr.d.cts → introspect-BWNjNw64.d.cts} +22 -2
  58. package/dist/{introspect-CZrlcaYy.d.ts → introspect-cY2pg9pW.d.ts} +22 -2
  59. package/dist/motion.cjs +77 -34
  60. package/dist/motion.js +4 -4
  61. package/dist/patterns.cjs +335 -69
  62. package/dist/patterns.d.cts +11 -12
  63. package/dist/patterns.d.ts +11 -12
  64. package/dist/patterns.js +7 -7
  65. package/dist/performance.cjs +279 -108
  66. package/dist/performance.d.cts +23 -16
  67. package/dist/performance.d.ts +23 -16
  68. package/dist/performance.js +13 -8
  69. package/dist/plugin-D30wlGW5.d.cts +71 -0
  70. package/dist/plugin-D30wlGW5.d.ts +71 -0
  71. package/dist/plugins.cjs +635 -260
  72. package/dist/plugins.d.cts +10 -3
  73. package/dist/plugins.d.ts +10 -3
  74. package/dist/plugins.js +106 -38
  75. package/dist/{ssr-Do_SiVoL.d.cts → ssr-CrVNy6Pa.d.cts} +9 -15
  76. package/dist/{ssr-Do_SiVoL.d.ts → ssr-CrVNy6Pa.d.ts} +9 -15
  77. package/dist/{ssr-4PBXAOO3.js → ssr-FXD2PPMC.js} +4 -3
  78. package/dist/ssr.cjs +642 -222
  79. package/dist/ssr.d.cts +26 -6
  80. package/dist/ssr.d.ts +26 -6
  81. package/dist/ssr.js +12 -11
  82. package/dist/{tagFactory-DaJ0YWX6.d.cts → tagFactory-S17H2qxu.d.cts} +9 -1
  83. package/dist/{tagFactory-DaJ0YWX6.d.ts → tagFactory-S17H2qxu.d.ts} +9 -1
  84. package/dist/testing.cjs +252 -63
  85. package/dist/testing.d.cts +17 -4
  86. package/dist/testing.d.ts +17 -4
  87. package/dist/testing.js +100 -44
  88. package/dist/ui.cjs +463 -137
  89. package/dist/ui.d.cts +1 -1
  90. package/dist/ui.d.ts +1 -1
  91. package/dist/ui.js +20 -17
  92. package/dist/widgets.cjs +977 -94
  93. package/dist/widgets.d.cts +104 -2
  94. package/dist/widgets.d.ts +104 -2
  95. package/dist/widgets.js +9 -7
  96. package/package.json +8 -2
  97. package/dist/chunk-32DY64NT.js +0 -282
  98. package/dist/chunk-3AIRKM3B.js +0 -1263
  99. package/dist/chunk-3ARAQO7B.js +0 -398
  100. package/dist/chunk-3CRQALYP.js +0 -877
  101. package/dist/chunk-4EI4AG32.js +0 -482
  102. package/dist/chunk-4MYMUBRS.js +0 -21
  103. package/dist/chunk-5ZYQ6KDD.js +0 -154
  104. package/dist/chunk-6BMPXPUW.js +0 -26
  105. package/dist/chunk-6HLLIF3K.js +0 -398
  106. package/dist/chunk-6LSNVCS2.js +0 -937
  107. package/dist/chunk-6SA3QQES.js +0 -61
  108. package/dist/chunk-77L6NL3X.js +0 -1097
  109. package/dist/chunk-7BF6TK55.js +0 -1097
  110. package/dist/chunk-7TQKR4PP.js +0 -294
  111. package/dist/chunk-7V26P53V.js +0 -712
  112. package/dist/chunk-AZ3ISID5.js +0 -298
  113. package/dist/chunk-B7SWRFUT.js +0 -332
  114. package/dist/chunk-BTU3TJDS.js +0 -365
  115. package/dist/chunk-BW3WT46K.js +0 -937
  116. package/dist/chunk-C6KFWOFV.js +0 -616
  117. package/dist/chunk-CHF5OHIA.js +0 -61
  118. package/dist/chunk-CHJ27IGK.js +0 -26
  119. package/dist/chunk-CMBFNA7L.js +0 -27
  120. package/dist/chunk-DAHRH4ON.js +0 -331
  121. package/dist/chunk-DKOHBI74.js +0 -924
  122. package/dist/chunk-DTCOOBMX.js +0 -725
  123. package/dist/chunk-EBGIRKQY.js +0 -616
  124. package/dist/chunk-EUZND3CB.js +0 -27
  125. package/dist/chunk-EVCZO745.js +0 -365
  126. package/dist/chunk-EWFVA3TJ.js +0 -282
  127. package/dist/chunk-F3FA4F32.js +0 -292
  128. package/dist/chunk-FGOEVHY3.js +0 -60
  129. package/dist/chunk-G3BOQPVO.js +0 -365
  130. package/dist/chunk-GCOK2LC3.js +0 -282
  131. package/dist/chunk-GJPXRJ45.js +0 -37
  132. package/dist/chunk-HGMJFBC7.js +0 -654
  133. package/dist/chunk-JAKHTMQU.js +0 -1000
  134. package/dist/chunk-JCI5M6U6.js +0 -956
  135. package/dist/chunk-K5ZUMYVS.js +0 -89
  136. package/dist/chunk-KQPDEVVS.js +0 -398
  137. package/dist/chunk-L6JRBDNS.js +0 -60
  138. package/dist/chunk-LA6KQEDU.js +0 -712
  139. package/dist/chunk-MB6QFH3I.js +0 -2776
  140. package/dist/chunk-MDVXJWFN.js +0 -304
  141. package/dist/chunk-MEZVEBPN.js +0 -2008
  142. package/dist/chunk-MK4ERFYL.js +0 -2249
  143. package/dist/chunk-MLKGABMK.js +0 -9
  144. package/dist/chunk-MQ5GOYPH.js +0 -2249
  145. package/dist/chunk-MYRV7VDM.js +0 -742
  146. package/dist/chunk-N6IZB6KJ.js +0 -567
  147. package/dist/chunk-NEKUBFPT.js +0 -60
  148. package/dist/chunk-NMRUZALC.js +0 -1097
  149. package/dist/chunk-NYVAC6P5.js +0 -37
  150. package/dist/chunk-NZIIMDWI.js +0 -84
  151. package/dist/chunk-OF7UZIVB.js +0 -725
  152. package/dist/chunk-P3XWXJZU.js +0 -282
  153. package/dist/chunk-P6W3STU4.js +0 -2249
  154. package/dist/chunk-PBHF5WKN.js +0 -616
  155. package/dist/chunk-PDZQY43A.js +0 -616
  156. package/dist/chunk-PTQJDMRT.js +0 -146
  157. package/dist/chunk-PZEGYCF5.js +0 -61
  158. package/dist/chunk-QBMDLBU2.js +0 -975
  159. package/dist/chunk-QWZG56ET.js +0 -2744
  160. package/dist/chunk-RQGQSLQK.js +0 -725
  161. package/dist/chunk-SDLZDHKP.js +0 -107
  162. package/dist/chunk-TDGZL5CU.js +0 -365
  163. package/dist/chunk-TNQWPPE6.js +0 -37
  164. package/dist/chunk-TSOKIX5Z.js +0 -654
  165. package/dist/chunk-UHNL42EF.js +0 -2730
  166. package/dist/chunk-UNXCEF6S.js +0 -21
  167. package/dist/chunk-V2XTI523.js +0 -347
  168. package/dist/chunk-VAU366PN.js +0 -2241
  169. package/dist/chunk-VMVDTCXB.js +0 -712
  170. package/dist/chunk-VQNQZCWJ.js +0 -61
  171. package/dist/chunk-VRW3FULF.js +0 -725
  172. package/dist/chunk-WADYRCO2.js +0 -304
  173. package/dist/chunk-WILQZRO4.js +0 -282
  174. package/dist/chunk-WR5D4EGH.js +0 -26
  175. package/dist/chunk-WUHJISPP.js +0 -298
  176. package/dist/chunk-XYU6TZOW.js +0 -182
  177. package/dist/chunk-Y6GP4QGG.js +0 -276
  178. package/dist/chunk-YECR7UIA.js +0 -347
  179. package/dist/chunk-YUTWTI4B.js +0 -654
  180. package/dist/chunk-Z65KYU7I.js +0 -26
  181. package/dist/chunk-Z6POF5YC.js +0 -975
  182. package/dist/chunk-ZBJP6WFL.js +0 -482
  183. package/dist/chunk-ZD6OAMTH.js +0 -277
  184. package/dist/chunk-ZWKZCBO6.js +0 -317
  185. package/dist/contracts-DDrwxvJ-.d.cts +0 -245
  186. package/dist/contracts-DDrwxvJ-.d.ts +0 -245
  187. package/dist/contracts-DOrhwbke.d.cts +0 -245
  188. package/dist/contracts-DOrhwbke.d.ts +0 -245
  189. package/dist/contracts-xo5ckdRP.d.cts +0 -240
  190. package/dist/contracts-xo5ckdRP.d.ts +0 -240
  191. package/dist/customElement-BKQfbSZQ.d.cts +0 -262
  192. package/dist/customElement-BKQfbSZQ.d.ts +0 -262
  193. package/dist/customElement-D2DJp_xn.d.cts +0 -313
  194. package/dist/customElement-D2DJp_xn.d.ts +0 -313
  195. package/dist/customElement-yz8uyk-0.d.cts +0 -308
  196. package/dist/customElement-yz8uyk-0.d.ts +0 -308
  197. package/dist/introspect-Cb0zgpi2.d.cts +0 -477
  198. package/dist/introspect-Y2xNXGSf.d.ts +0 -477
  199. package/dist/plugin-Bek4RhJY.d.cts +0 -43
  200. package/dist/plugin-Bek4RhJY.d.ts +0 -43
  201. package/dist/ssr-3RXHP5ES.js +0 -38
  202. package/dist/ssr-6GIMY5MX.js +0 -38
  203. package/dist/ssr-BA6sxxUd.d.cts +0 -135
  204. package/dist/ssr-BA6sxxUd.d.ts +0 -135
  205. package/dist/ssr-WKUPVSSK.js +0 -36
  206. package/dist/tagFactory-Dl8QCLga.d.cts +0 -23
  207. package/dist/tagFactory-Dl8QCLga.d.ts +0 -23
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  devWarn,
3
3
  isDev
4
- } from "./chunk-5X6PP2UK.js";
4
+ } from "./chunk-LMLD24FC.js";
5
5
 
6
6
  // src/reactivity/track.ts
7
7
  var _isDev = isDev();
@@ -9,11 +9,11 @@ var subscriberStack = new Array(32);
9
9
  var stackCapacity = 32;
10
10
  var stackTop = -1;
11
11
  var currentSubscriber = null;
12
- var signalSubscribers = /* @__PURE__ */ new WeakMap();
13
12
  var SUBS = "__s";
14
13
  var notifyDepth = 0;
15
14
  var pendingQueue = [];
16
15
  var pendingSet = /* @__PURE__ */ new Set();
16
+ var propagateStack = [];
17
17
  function safeInvoke(sub) {
18
18
  try {
19
19
  sub();
@@ -23,6 +23,15 @@ function safeInvoke(sub) {
23
23
  }
24
24
  var suspendDepth = 0;
25
25
  var trackingSuspended = false;
26
+ function retrack(effectFn, subscriber) {
27
+ const prev = currentSubscriber;
28
+ currentSubscriber = subscriber;
29
+ try {
30
+ effectFn();
31
+ } finally {
32
+ currentSubscriber = prev;
33
+ }
34
+ }
26
35
  function track(effectFn, subscriber) {
27
36
  if (!subscriber) subscriber = effectFn;
28
37
  cleanup(subscriber);
@@ -90,7 +99,6 @@ function recordDependency(signal) {
90
99
  let subs = signal[SUBS];
91
100
  if (!subs) {
92
101
  subs = /* @__PURE__ */ new Set();
93
- signalSubscribers.set(signal, subs);
94
102
  signal[SUBS] = subs;
95
103
  }
96
104
  subs.add(currentSubscriber);
@@ -112,17 +120,17 @@ function queueSignalNotification(signal) {
112
120
  }
113
121
  }
114
122
  }
115
- var MAX_DRAIN_ITERATIONS = 1e3;
123
+ var maxDrainIterations = 1e5;
116
124
  function drainNotificationQueue() {
117
125
  if (notifyDepth > 0) return;
118
126
  notifyDepth++;
119
127
  try {
120
128
  let i = 0;
121
129
  while (i < pendingQueue.length) {
122
- if (i >= MAX_DRAIN_ITERATIONS) {
130
+ if (i >= maxDrainIterations) {
123
131
  if (typeof console !== "undefined") {
124
132
  console.error(
125
- `[SibuJS] Notification queue exceeded ${MAX_DRAIN_ITERATIONS} iterations \u2014 likely an effect that writes to a signal it reads. Breaking to prevent infinite loop.`
133
+ `[SibuJS] Notification queue exceeded ${maxDrainIterations} iterations \u2014 likely an effect that writes to a signal it reads. Breaking to prevent infinite loop.`
126
134
  );
127
135
  }
128
136
  break;
@@ -131,47 +139,52 @@ function drainNotificationQueue() {
131
139
  i++;
132
140
  }
133
141
  } finally {
134
- pendingQueue.length = 0;
135
- pendingSet.clear();
136
142
  notifyDepth--;
143
+ if (notifyDepth === 0) {
144
+ pendingQueue.length = 0;
145
+ pendingSet.clear();
146
+ }
137
147
  }
138
148
  }
139
149
  function propagateDirty(sub) {
140
150
  sub();
141
- let sig = sub._sig;
142
- while (sig) {
151
+ const rootSig = sub._sig;
152
+ if (!rootSig) return;
153
+ const stack = propagateStack;
154
+ const baseLen = stack.length;
155
+ stack.push(rootSig);
156
+ while (stack.length > baseLen) {
157
+ const sig = stack.pop();
143
158
  const first = sig.__f;
144
159
  if (first) {
145
160
  if (first._c) {
146
161
  const nSig = first._sig;
147
- nSig._d = true;
148
- sig = nSig;
149
- continue;
150
- }
151
- if (!pendingSet.has(first)) {
162
+ if (!nSig._d) {
163
+ nSig._d = true;
164
+ stack.push(nSig);
165
+ }
166
+ } else if (!pendingSet.has(first)) {
152
167
  pendingSet.add(first);
153
168
  pendingQueue.push(first);
154
169
  }
155
- break;
170
+ continue;
156
171
  }
157
172
  const subs = sig[SUBS];
158
- if (!subs) break;
159
- let nextSig;
173
+ if (!subs) continue;
160
174
  for (const s of subs) {
161
175
  if (s._c) {
162
- s();
163
176
  const nSig = s._sig;
164
- if (nSig && !nextSig) {
165
- nextSig = nSig;
166
- } else if (nSig) {
167
- propagateDirty(s);
177
+ if (nSig && !nSig._d) {
178
+ nSig._d = true;
179
+ stack.push(nSig);
180
+ } else if (!nSig) {
181
+ s();
168
182
  }
169
183
  } else if (!pendingSet.has(s)) {
170
184
  pendingSet.add(s);
171
185
  pendingQueue.push(s);
172
186
  }
173
187
  }
174
- sig = nextSig;
175
188
  }
176
189
  }
177
190
  function notifySubscribers(signal) {
@@ -195,13 +208,23 @@ function notifySubscribers(signal) {
195
208
  }
196
209
  let i = 0;
197
210
  while (i < pendingQueue.length) {
211
+ if (i >= maxDrainIterations) {
212
+ if (typeof console !== "undefined") {
213
+ console.error(
214
+ `[SibuJS] Notification queue exceeded ${maxDrainIterations} iterations \u2014 likely an effect that writes to a signal it reads. Breaking to prevent infinite loop.`
215
+ );
216
+ }
217
+ break;
218
+ }
198
219
  safeInvoke(pendingQueue[i]);
199
220
  i++;
200
221
  }
201
222
  } finally {
202
- pendingQueue.length = 0;
203
- pendingSet.clear();
204
223
  notifyDepth--;
224
+ if (notifyDepth === 0) {
225
+ pendingQueue.length = 0;
226
+ pendingSet.clear();
227
+ }
205
228
  }
206
229
  return;
207
230
  }
@@ -221,30 +244,48 @@ function notifySubscribers(signal) {
221
244
  notifyDepth++;
222
245
  try {
223
246
  let directCount = 0;
247
+ let hasComputedSub = false;
224
248
  for (const sub of subs) {
249
+ if (sub._c) hasComputedSub = true;
225
250
  pendingQueue[directCount++] = sub;
226
251
  }
227
- for (let i2 = 0; i2 < directCount; i2++) {
228
- if (pendingQueue[i2]._c) {
229
- propagateDirty(pendingQueue[i2]);
252
+ if (!hasComputedSub) {
253
+ for (let i2 = 0; i2 < directCount; i2++) {
254
+ safeInvoke(pendingQueue[i2]);
230
255
  }
231
- }
232
- for (let i2 = 0; i2 < directCount; i2++) {
233
- if (!pendingQueue[i2]._c) {
234
- if (!pendingSet.has(pendingQueue[i2])) {
235
- safeInvoke(pendingQueue[i2]);
256
+ } else {
257
+ for (let i2 = 0; i2 < directCount; i2++) {
258
+ if (pendingQueue[i2]._c) {
259
+ propagateDirty(pendingQueue[i2]);
260
+ }
261
+ }
262
+ for (let i2 = 0; i2 < directCount; i2++) {
263
+ const sub = pendingQueue[i2];
264
+ if (!sub._c && !pendingSet.has(sub)) {
265
+ pendingSet.add(sub);
266
+ safeInvoke(sub);
236
267
  }
237
268
  }
238
269
  }
239
270
  let i = directCount;
240
271
  while (i < pendingQueue.length) {
272
+ if (i - directCount >= maxDrainIterations) {
273
+ if (typeof console !== "undefined") {
274
+ console.error(
275
+ `[SibuJS] Notification queue exceeded ${maxDrainIterations} iterations \u2014 likely an effect that writes to a signal it reads. Breaking to prevent infinite loop.`
276
+ );
277
+ }
278
+ break;
279
+ }
241
280
  safeInvoke(pendingQueue[i]);
242
281
  i++;
243
282
  }
244
283
  } finally {
245
- pendingQueue.length = 0;
246
- pendingSet.clear();
247
284
  notifyDepth--;
285
+ if (notifyDepth === 0) {
286
+ pendingQueue.length = 0;
287
+ pendingSet.clear();
288
+ }
248
289
  }
249
290
  }
250
291
  function cleanup(subscriber) {
@@ -255,7 +296,9 @@ function cleanup(subscriber) {
255
296
  if (subs) {
256
297
  subs.delete(subscriber);
257
298
  if (singleDep.__f === subscriber) {
258
- singleDep.__f = void 0;
299
+ singleDep.__f = subs.size === 1 ? subs.values().next().value : void 0;
300
+ } else if (subs.size === 1 && singleDep.__f === void 0) {
301
+ singleDep.__f = subs.values().next().value;
259
302
  }
260
303
  }
261
304
  sub._dep = void 0;
@@ -268,7 +311,9 @@ function cleanup(subscriber) {
268
311
  if (subs) {
269
312
  subs.delete(subscriber);
270
313
  if (signal.__f === subscriber) {
271
- signal.__f = void 0;
314
+ signal.__f = subs.size === 1 ? subs.values().next().value : void 0;
315
+ } else if (subs.size === 1 && signal.__f === void 0) {
316
+ signal.__f = subs.values().next().value;
272
317
  }
273
318
  }
274
319
  }
@@ -277,6 +322,7 @@ function cleanup(subscriber) {
277
322
 
278
323
  export {
279
324
  trackingSuspended,
325
+ retrack,
280
326
  track,
281
327
  untracked,
282
328
  recordDependency,
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  createPlugin
3
- } from "./chunk-K5ZUMYVS.js";
3
+ } from "./chunk-3JHCYHWN.js";
4
4
  import {
5
5
  tagFactory
6
- } from "./chunk-B7SWRFUT.js";
6
+ } from "./chunk-KLRMB5ZS.js";
7
7
  import {
8
8
  derived
9
- } from "./chunk-L6JRBDNS.js";
9
+ } from "./chunk-54EDRCEF.js";
10
10
  import {
11
11
  effect
12
- } from "./chunk-6SA3QQES.js";
12
+ } from "./chunk-HB24TBAF.js";
13
13
  import {
14
14
  batch,
15
15
  signal
16
- } from "./chunk-V2XTI523.js";
16
+ } from "./chunk-CC65Y57T.js";
17
17
 
18
18
  // src/ecosystem/adapters/mobx.ts
19
19
  function mobXAdapter(options) {
@@ -21,7 +21,7 @@ function mobXAdapter(options) {
21
21
  const { autorun } = options;
22
22
  const disposers = [];
23
23
  function fromMobX(expression) {
24
- const [getValue, setValue] = signal(expression());
24
+ const [getValue, setValue] = signal(void 0);
25
25
  const disposer = autorun(() => {
26
26
  const newValue = expression();
27
27
  batch(() => {
@@ -29,7 +29,13 @@ function mobXAdapter(options) {
29
29
  });
30
30
  });
31
31
  disposers.push(disposer);
32
- return getValue;
32
+ const getter = (() => getValue());
33
+ getter.dispose = () => {
34
+ const i = disposers.indexOf(disposer);
35
+ if (i >= 0) disposers.splice(i, 1);
36
+ disposer();
37
+ };
38
+ return getter;
33
39
  }
34
40
  function toMobX(sibuGetter, callback) {
35
41
  return effect(() => {
@@ -57,12 +63,12 @@ function reduxAdapter(options) {
57
63
  setState(store.getState());
58
64
  });
59
65
  });
60
- function useSelector(selector) {
66
+ function select(selector) {
61
67
  return derived(() => selector(getState()));
62
68
  }
63
69
  const api = {
64
70
  getState,
65
- useSelector,
71
+ select,
66
72
  dispatch: store.dispatch.bind(store),
67
73
  destroy: unsubscribe
68
74
  };
@@ -80,12 +86,12 @@ function zustandAdapter(options) {
80
86
  setSibuState(state);
81
87
  });
82
88
  });
83
- function useSelector(selector) {
89
+ function select(selector) {
84
90
  return derived(() => selector(getState()));
85
91
  }
86
92
  const api = {
87
93
  getState,
88
- useSelector,
94
+ select,
89
95
  setState: store.setState.bind(store),
90
96
  destroy() {
91
97
  unsubscribe();
@@ -114,7 +114,7 @@ interface MaskOptions {
114
114
  declare function inputMask(options: MaskOptions): {
115
115
  value: () => string;
116
116
  rawValue: () => string;
117
- bind: (input: HTMLInputElement) => void;
117
+ bind: (input: HTMLInputElement) => () => void;
118
118
  };
119
119
  /** Phone number mask: (999) 999-9999 */
120
120
  declare function phoneMask(): MaskOptions;
@@ -140,7 +140,7 @@ declare function focus(): {
140
140
  isFocused: () => boolean;
141
141
  focus: () => void;
142
142
  blur: () => void;
143
- bind: (element: HTMLElement) => void;
143
+ bind: (element: HTMLElement) => () => void;
144
144
  };
145
145
  /**
146
146
  * FocusTrap traps focus within a container element.
@@ -152,7 +152,12 @@ declare function FocusTrap(nodes: HTMLElement, options?: {
152
152
  }): HTMLElement;
153
153
  /**
154
154
  * hotkey registers a keyboard shortcut handler.
155
- * Returns a cleanup function.
155
+ *
156
+ * Returns a `dispose()` cleanup function — call it from the owning
157
+ * component's unmount path to remove the `keydown` listener from
158
+ * `document`. The returned function is idempotent only via the
159
+ * browser's default `removeEventListener` semantics, so callers
160
+ * should invoke it exactly once.
156
161
  *
157
162
  * Supports two calling styles:
158
163
  * - String combo: hotkey("ctrl+shift+z", handler)
@@ -165,9 +170,6 @@ declare function hotkey(combo: string, handler: (e: KeyboardEvent) => void, opti
165
170
  meta?: boolean;
166
171
  preventDefault?: boolean;
167
172
  }): () => void;
168
- /**
169
- * announce creates a screen reader announcement using ARIA live regions.
170
- */
171
173
  declare function announce(message: string, priority?: "polite" | "assertive"): void;
172
174
 
173
175
  /**
@@ -214,11 +216,13 @@ declare function bindBoolAttr(el: HTMLElement, attr: string, getter: boolean | (
214
216
  declare function bindData(el: HTMLElement, key: string, getter: string | (() => string)): () => void;
215
217
 
216
218
  /**
217
- * dialog provides reactive dialog state management with escape-to-close support.
219
+ * Test-only helper to reset the module-level stack between specs. Client-only:
220
+ * in SSR dialog() is never meaningfully invoked. In production the stack is
221
+ * bounded by open dialog count and cleaned via removeFromStack/dispose.
218
222
  *
219
- * Call `dispose()` when the owning component unmounts to ensure the global
220
- * keydown listener is removed even if the dialog is still open.
223
+ * @internal
221
224
  */
225
+ declare function __resetDialogStack(): void;
222
226
  declare function dialog(): {
223
227
  open: () => void;
224
228
  close: () => void;
@@ -315,4 +319,4 @@ declare function defineElement(name: string, component: (props: Record<string, u
315
319
  */
316
320
  declare function svgElement(tag: string, props?: Record<string, unknown>, ...nodes: (SVGElement | string)[]): SVGElement;
317
321
 
318
- export { lazyLoad as A, type BoundFieldProps as B, type CustomElementOptions as C, matchesPattern as D, max as E, type FieldConfig as F, maxLength as G, min as H, type IntersectionResult as I, minLength as J, pagination as K, phoneMask as L, type MaskOptions as M, removeScopedStyle as N, required as O, scopedStyle as P, ssnMask as Q, svgElement as R, timeMask as S, type Toast as T, toast as U, type ValidatorFn as V, withScopedStyle as W, zipMask as X, FocusTrap as a, type FormConfig as b, type FormField as c, type FormReturn as d, type ToastInstance as e, VirtualList as f, type VirtualListProps as g, announce as h, aria as i, bindAttrs as j, bindBoolAttr as k, bindData as l, bindField as m, creditCardMask as n, custom as o, dateMask as p, defineElement as q, dialog as r, email as s, eventBus as t, focus as u, form as v, hotkey as w, infiniteScroll as x, inputMask as y, intersection as z };
322
+ export { lazyLoad as A, type BoundFieldProps as B, type CustomElementOptions as C, matchesPattern as D, max as E, type FieldConfig as F, maxLength as G, min as H, type IntersectionResult as I, minLength as J, pagination as K, phoneMask as L, type MaskOptions as M, removeScopedStyle as N, required as O, scopedStyle as P, ssnMask as Q, svgElement as R, timeMask as S, type Toast as T, toast as U, type ValidatorFn as V, withScopedStyle as W, zipMask as X, __resetDialogStack as _, FocusTrap as a, type FormConfig as b, type FormField as c, type FormReturn as d, type ToastInstance as e, VirtualList as f, type VirtualListProps as g, announce as h, aria as i, bindAttrs as j, bindBoolAttr as k, bindData as l, bindField as m, creditCardMask as n, custom as o, dateMask as p, defineElement as q, dialog as r, email as s, eventBus as t, focus as u, form as v, hotkey as w, infiniteScroll as x, inputMask as y, intersection as z };
@@ -114,7 +114,7 @@ interface MaskOptions {
114
114
  declare function inputMask(options: MaskOptions): {
115
115
  value: () => string;
116
116
  rawValue: () => string;
117
- bind: (input: HTMLInputElement) => void;
117
+ bind: (input: HTMLInputElement) => () => void;
118
118
  };
119
119
  /** Phone number mask: (999) 999-9999 */
120
120
  declare function phoneMask(): MaskOptions;
@@ -140,7 +140,7 @@ declare function focus(): {
140
140
  isFocused: () => boolean;
141
141
  focus: () => void;
142
142
  blur: () => void;
143
- bind: (element: HTMLElement) => void;
143
+ bind: (element: HTMLElement) => () => void;
144
144
  };
145
145
  /**
146
146
  * FocusTrap traps focus within a container element.
@@ -152,7 +152,12 @@ declare function FocusTrap(nodes: HTMLElement, options?: {
152
152
  }): HTMLElement;
153
153
  /**
154
154
  * hotkey registers a keyboard shortcut handler.
155
- * Returns a cleanup function.
155
+ *
156
+ * Returns a `dispose()` cleanup function — call it from the owning
157
+ * component's unmount path to remove the `keydown` listener from
158
+ * `document`. The returned function is idempotent only via the
159
+ * browser's default `removeEventListener` semantics, so callers
160
+ * should invoke it exactly once.
156
161
  *
157
162
  * Supports two calling styles:
158
163
  * - String combo: hotkey("ctrl+shift+z", handler)
@@ -165,9 +170,6 @@ declare function hotkey(combo: string, handler: (e: KeyboardEvent) => void, opti
165
170
  meta?: boolean;
166
171
  preventDefault?: boolean;
167
172
  }): () => void;
168
- /**
169
- * announce creates a screen reader announcement using ARIA live regions.
170
- */
171
173
  declare function announce(message: string, priority?: "polite" | "assertive"): void;
172
174
 
173
175
  /**
@@ -214,11 +216,13 @@ declare function bindBoolAttr(el: HTMLElement, attr: string, getter: boolean | (
214
216
  declare function bindData(el: HTMLElement, key: string, getter: string | (() => string)): () => void;
215
217
 
216
218
  /**
217
- * dialog provides reactive dialog state management with escape-to-close support.
219
+ * Test-only helper to reset the module-level stack between specs. Client-only:
220
+ * in SSR dialog() is never meaningfully invoked. In production the stack is
221
+ * bounded by open dialog count and cleaned via removeFromStack/dispose.
218
222
  *
219
- * Call `dispose()` when the owning component unmounts to ensure the global
220
- * keydown listener is removed even if the dialog is still open.
223
+ * @internal
221
224
  */
225
+ declare function __resetDialogStack(): void;
222
226
  declare function dialog(): {
223
227
  open: () => void;
224
228
  close: () => void;
@@ -315,4 +319,4 @@ declare function defineElement(name: string, component: (props: Record<string, u
315
319
  */
316
320
  declare function svgElement(tag: string, props?: Record<string, unknown>, ...nodes: (SVGElement | string)[]): SVGElement;
317
321
 
318
- export { lazyLoad as A, type BoundFieldProps as B, type CustomElementOptions as C, matchesPattern as D, max as E, type FieldConfig as F, maxLength as G, min as H, type IntersectionResult as I, minLength as J, pagination as K, phoneMask as L, type MaskOptions as M, removeScopedStyle as N, required as O, scopedStyle as P, ssnMask as Q, svgElement as R, timeMask as S, type Toast as T, toast as U, type ValidatorFn as V, withScopedStyle as W, zipMask as X, FocusTrap as a, type FormConfig as b, type FormField as c, type FormReturn as d, type ToastInstance as e, VirtualList as f, type VirtualListProps as g, announce as h, aria as i, bindAttrs as j, bindBoolAttr as k, bindData as l, bindField as m, creditCardMask as n, custom as o, dateMask as p, defineElement as q, dialog as r, email as s, eventBus as t, focus as u, form as v, hotkey as w, infiniteScroll as x, inputMask as y, intersection as z };
322
+ export { lazyLoad as A, type BoundFieldProps as B, type CustomElementOptions as C, matchesPattern as D, max as E, type FieldConfig as F, maxLength as G, min as H, type IntersectionResult as I, minLength as J, pagination as K, phoneMask as L, type MaskOptions as M, removeScopedStyle as N, required as O, scopedStyle as P, ssnMask as Q, svgElement as R, timeMask as S, type Toast as T, toast as U, type ValidatorFn as V, withScopedStyle as W, zipMask as X, __resetDialogStack as _, FocusTrap as a, type FormConfig as b, type FormField as c, type FormReturn as d, type ToastInstance as e, VirtualList as f, type VirtualListProps as g, announce as h, aria as i, bindAttrs as j, bindBoolAttr as k, bindData as l, bindField as m, creditCardMask as n, custom as o, dateMask as p, defineElement as q, dialog as r, email as s, eventBus as t, focus as u, form as v, hotkey as w, infiniteScroll as x, inputMask as y, intersection as z };