sibujs 3.3.0 → 3.3.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.
Files changed (60) hide show
  1. package/dist/browser.cjs +230 -40
  2. package/dist/browser.js +5 -5
  3. package/dist/build.cjs +240 -108
  4. package/dist/build.js +13 -13
  5. package/dist/cdn.global.js +7 -7
  6. package/dist/{chunk-BEIKESVL.js → chunk-2ARSB7NG.js} +36 -13
  7. package/dist/{chunk-X3NHE2DK.js → chunk-4NJEAPLI.js} +83 -17
  8. package/dist/{chunk-JBXNCZSC.js → chunk-5VH3GIDX.js} +1 -1
  9. package/dist/{chunk-6G6UNHZI.js → chunk-62V653X2.js} +16 -21
  10. package/dist/{chunk-S4FHR5ZZ.js → chunk-655B7MMR.js} +3 -3
  11. package/dist/{chunk-24DBWDTK.js → chunk-6TCOWMGY.js} +1 -1
  12. package/dist/{chunk-USDR2GFV.js → chunk-A7CZH3GN.js} +3 -3
  13. package/dist/{chunk-SLCUP2EK.js → chunk-AEOLHSSQ.js} +3 -3
  14. package/dist/chunk-CCSJMTRN.js +15 -0
  15. package/dist/{chunk-R3QEDXFS.js → chunk-EX77FXTT.js} +1 -1
  16. package/dist/{chunk-ZUVLC7TM.js → chunk-FJIRS3FM.js} +1 -1
  17. package/dist/{chunk-4WXWJ4SW.js → chunk-FJO2ZL4Q.js} +4 -4
  18. package/dist/{chunk-CVMMULHO.js → chunk-G6N3LMO2.js} +4 -4
  19. package/dist/{chunk-XQ7XSGYP.js → chunk-IQJ36UTJ.js} +1 -1
  20. package/dist/{chunk-5K72I3UQ.js → chunk-JCQG2I2G.js} +21 -4
  21. package/dist/{chunk-7JHWAGRQ.js → chunk-N5TQVEKE.js} +2 -2
  22. package/dist/{chunk-IHBVTURX.js → chunk-P7C7SEJV.js} +4 -4
  23. package/dist/{chunk-M6WSIGYW.js → chunk-Q46YIQYW.js} +2 -2
  24. package/dist/{chunk-Q2ERM6NT.js → chunk-QCFBIVIQ.js} +1 -1
  25. package/dist/{chunk-F4UM7QBJ.js → chunk-RLTFJYDN.js} +2 -2
  26. package/dist/{chunk-GOJMFRBL.js → chunk-S3NFJO6L.js} +20 -14
  27. package/dist/{chunk-MWZFOIBG.js → chunk-YUBEOWII.js} +5 -5
  28. package/dist/{chunk-WVJJUFPC.js → chunk-YUR5SX7F.js} +2 -2
  29. package/dist/{chunk-NUWKIEHE.js → chunk-ZEUP4TUD.js} +2 -2
  30. package/dist/data.cjs +181 -37
  31. package/dist/data.js +7 -7
  32. package/dist/devtools.cjs +265 -45
  33. package/dist/devtools.js +5 -5
  34. package/dist/ecosystem.cjs +203 -59
  35. package/dist/ecosystem.js +8 -8
  36. package/dist/extras.cjs +216 -116
  37. package/dist/extras.js +22 -22
  38. package/dist/index.cjs +242 -108
  39. package/dist/index.d.cts +78 -14
  40. package/dist/index.d.ts +78 -14
  41. package/dist/index.js +17 -13
  42. package/dist/motion.cjs +329 -13
  43. package/dist/motion.js +3 -3
  44. package/dist/patterns.cjs +181 -37
  45. package/dist/patterns.js +6 -6
  46. package/dist/performance.cjs +278 -37
  47. package/dist/performance.js +6 -6
  48. package/dist/plugins.cjs +353 -153
  49. package/dist/plugins.js +95 -94
  50. package/dist/{ssr-6D67RAVB.js → ssr-2PPULEK2.js} +2 -2
  51. package/dist/ssr.cjs +203 -58
  52. package/dist/ssr.js +9 -9
  53. package/dist/testing.cjs +416 -19
  54. package/dist/testing.js +3 -3
  55. package/dist/ui.cjs +256 -65
  56. package/dist/ui.js +8 -8
  57. package/dist/widgets.cjs +166 -40
  58. package/dist/widgets.js +7 -7
  59. package/package.json +1 -1
  60. package/dist/chunk-YT6HQ6AM.js +0 -14
package/dist/build.cjs CHANGED
@@ -1136,6 +1136,7 @@ __export(index_exports, {
1136
1136
  footer: () => footer,
1137
1137
  form: () => form,
1138
1138
  g: () => g,
1139
+ getAction: () => getAction,
1139
1140
  getRequestScopedCache: () => getRequestScopedCache,
1140
1141
  getSSRStore: () => getSSRStore,
1141
1142
  getSlot: () => getSlot,
@@ -1204,10 +1205,11 @@ __export(index_exports, {
1204
1205
  reactiveArray: () => reactiveArray,
1205
1206
  rect: () => rect,
1206
1207
  ref: () => ref,
1208
+ registerAction: () => registerAction,
1207
1209
  registerComponent: () => registerComponent,
1208
1210
  registerDisposer: () => registerDisposer,
1209
1211
  resolveComponent: () => resolveComponent,
1210
- retrack: () => retrack,
1212
+ retrack: () => retrack2,
1211
1213
  rp: () => rp,
1212
1214
  rt: () => rt,
1213
1215
  ruby: () => ruby,
@@ -1218,7 +1220,7 @@ __export(index_exports, {
1218
1220
  section: () => section,
1219
1221
  select: () => select,
1220
1222
  setGlobalErrorHandler: () => setGlobalErrorHandler,
1221
- setMaxDrainIterations: () => setMaxDrainIterations,
1223
+ setMaxDrainIterations: () => setMaxDrainIterations2,
1222
1224
  show: () => show,
1223
1225
  signal: () => signal,
1224
1226
  slot: () => slot,
@@ -1250,7 +1252,7 @@ __export(index_exports, {
1250
1252
  time: () => time,
1251
1253
  title: () => title,
1252
1254
  tr: () => tr,
1253
- track: () => track2,
1255
+ track: () => track3,
1254
1256
  transition: () => transition,
1255
1257
  trapFocus: () => trapFocus,
1256
1258
  trustHTML: () => trustHTML,
@@ -1258,7 +1260,7 @@ __export(index_exports, {
1258
1260
  u: () => u,
1259
1261
  ul: () => ul,
1260
1262
  unregisterComponent: () => unregisterComponent,
1261
- untracked: () => untracked,
1263
+ untracked: () => untracked2,
1262
1264
  use: () => use,
1263
1265
  var_: () => var_,
1264
1266
  video: () => video,
@@ -1375,7 +1377,7 @@ function sanitizeAttributeString(attr, value) {
1375
1377
  return value;
1376
1378
  }
1377
1379
 
1378
- // src/reactivity/track.ts
1380
+ // src/reactivity/track-core.ts
1379
1381
  var _isDev2 = isDev();
1380
1382
  var POOL_MAX = 4096;
1381
1383
  var nodePool = [];
@@ -1489,6 +1491,9 @@ function resumeTracking() {
1489
1491
  trackingSuspended = false;
1490
1492
  }
1491
1493
  }
1494
+ function isTrackingSuspended() {
1495
+ return trackingSuspended;
1496
+ }
1492
1497
  function untracked(fn) {
1493
1498
  suspendTracking();
1494
1499
  try {
@@ -1606,6 +1611,11 @@ function cleanup(subscriber) {
1606
1611
  var maxSubscriberRepeats = 50;
1607
1612
  var maxDrainIterations = 1e6;
1608
1613
  var drainEpoch = 0;
1614
+ function setMaxSubscriberRepeats(n) {
1615
+ const prev = maxSubscriberRepeats;
1616
+ if (Number.isFinite(n) && n > 0) maxSubscriberRepeats = Math.floor(n);
1617
+ return prev;
1618
+ }
1609
1619
  function setMaxDrainIterations(n) {
1610
1620
  const prev = maxDrainIterations;
1611
1621
  if (Number.isFinite(n) && n > 0) maxDrainIterations = Math.floor(n);
@@ -1759,15 +1769,94 @@ function notifySubscribers(signal2) {
1759
1769
  }
1760
1770
  }
1761
1771
  }
1772
+ function getSubscriberCount(signal2) {
1773
+ return signal2.__sc ?? 0;
1774
+ }
1775
+ function getSubscriberDeps(subscriber) {
1776
+ const sub2 = subscriber;
1777
+ const out = [];
1778
+ let node = sub2.depsHead ?? null;
1779
+ while (node) {
1780
+ if (node.sig) out.push(node.sig);
1781
+ node = node.subNext;
1782
+ }
1783
+ return out;
1784
+ }
1785
+ function forEachSubscriber(signal2, visit) {
1786
+ let node = signal2.subsHead ?? null;
1787
+ while (node) {
1788
+ const s2 = node.sub;
1789
+ if (s2) visit(s2);
1790
+ node = node.sigNext;
1791
+ }
1792
+ }
1762
1793
 
1763
- // src/reactivity/bindAttribute.ts
1794
+ // src/reactivity/track.ts
1764
1795
  var _isDev3 = isDev();
1796
+ var _runtimeVersion = true ? "3.3.2" : "dev";
1797
+ var REGISTRY_KEY = /* @__PURE__ */ Symbol.for("sibujs.reactive.v1");
1798
+ function resolveReactiveApi() {
1799
+ const g2 = globalThis;
1800
+ const existing = g2[REGISTRY_KEY];
1801
+ if (existing) {
1802
+ if (_isDev3 && !existing.__dupWarned) {
1803
+ existing.__dupWarned = true;
1804
+ devWarn(
1805
+ `Multiple instances of the reactive runtime detected on this page (active: ${existing.version}, duplicate: ${_runtimeVersion}). Reactivity still works \u2014 all copies share the first one \u2014 but de-duplicate sibujs in your bundler (e.g. Vite optimizeDeps.exclude: ['sibujs'] or resolve.dedupe: ['sibujs']).`
1806
+ );
1807
+ }
1808
+ return existing;
1809
+ }
1810
+ const local = {
1811
+ suspendTracking,
1812
+ resumeTracking,
1813
+ isTrackingSuspended,
1814
+ untracked,
1815
+ retrack,
1816
+ track,
1817
+ reactiveBinding,
1818
+ recordDependency,
1819
+ cleanup,
1820
+ setMaxSubscriberRepeats,
1821
+ setMaxDrainIterations,
1822
+ drainNotificationQueue,
1823
+ queueSignalNotification,
1824
+ notifySubscribers,
1825
+ getSubscriberCount,
1826
+ getSubscriberDeps,
1827
+ forEachSubscriber,
1828
+ version: _runtimeVersion
1829
+ };
1830
+ g2[REGISTRY_KEY] = local;
1831
+ return local;
1832
+ }
1833
+ var API = resolveReactiveApi();
1834
+ var suspendTracking2 = API.suspendTracking;
1835
+ var resumeTracking2 = API.resumeTracking;
1836
+ var isTrackingSuspended2 = API.isTrackingSuspended;
1837
+ var untracked2 = API.untracked;
1838
+ var retrack2 = API.retrack;
1839
+ var track2 = API.track;
1840
+ var reactiveBinding2 = API.reactiveBinding;
1841
+ var recordDependency2 = API.recordDependency;
1842
+ var cleanup2 = API.cleanup;
1843
+ var setMaxSubscriberRepeats2 = API.setMaxSubscriberRepeats;
1844
+ var setMaxDrainIterations2 = API.setMaxDrainIterations;
1845
+ var drainNotificationQueue2 = API.drainNotificationQueue;
1846
+ var queueSignalNotification2 = API.queueSignalNotification;
1847
+ var notifySubscribers2 = API.notifySubscribers;
1848
+ var getSubscriberCount2 = API.getSubscriberCount;
1849
+ var getSubscriberDeps2 = API.getSubscriberDeps;
1850
+ var forEachSubscriber2 = API.forEachSubscriber;
1851
+
1852
+ // src/reactivity/bindAttribute.ts
1853
+ var _isDev4 = isDev();
1765
1854
  function setProp(el, key, val) {
1766
1855
  el[key] = val;
1767
1856
  }
1768
1857
  function bindAttribute(el, attr, getter) {
1769
1858
  if (isEventHandlerAttr(attr)) {
1770
- if (_isDev3)
1859
+ if (_isDev4)
1771
1860
  devWarn(
1772
1861
  `bindAttribute: refusing to bind event-handler attribute "${attr}". Use on:{ ${attr.slice(2)}: fn } instead.`
1773
1862
  );
@@ -1779,7 +1868,7 @@ function bindAttribute(el, attr, getter) {
1779
1868
  try {
1780
1869
  value = getter();
1781
1870
  } catch (err) {
1782
- if (_isDev3)
1871
+ if (_isDev4)
1783
1872
  devWarn(`bindAttribute: getter for "${attr}" threw: ${err instanceof Error ? err.message : String(err)}`);
1784
1873
  return;
1785
1874
  }
@@ -1800,7 +1889,7 @@ function bindAttribute(el, attr, getter) {
1800
1889
  el.setAttribute(attr, sanitizeAttributeString(attr, str));
1801
1890
  }
1802
1891
  }
1803
- return reactiveBinding(commit);
1892
+ return reactiveBinding2(commit);
1804
1893
  }
1805
1894
  function bindDynamic(el, nameGetter, valueGetter) {
1806
1895
  let prevName = null;
@@ -1809,14 +1898,14 @@ function bindDynamic(el, nameGetter, valueGetter) {
1809
1898
  try {
1810
1899
  name = typeof nameGetter === "function" ? nameGetter() : nameGetter;
1811
1900
  } catch (err) {
1812
- if (_isDev3) devWarn(`bindDynamic: name getter threw: ${err instanceof Error ? err.message : String(err)}`);
1901
+ if (_isDev4) devWarn(`bindDynamic: name getter threw: ${err instanceof Error ? err.message : String(err)}`);
1813
1902
  return;
1814
1903
  }
1815
1904
  let value;
1816
1905
  try {
1817
1906
  value = typeof valueGetter === "function" ? valueGetter() : valueGetter;
1818
1907
  } catch (err) {
1819
- if (_isDev3) devWarn(`bindDynamic: value getter threw: ${err instanceof Error ? err.message : String(err)}`);
1908
+ if (_isDev4) devWarn(`bindDynamic: value getter threw: ${err instanceof Error ? err.message : String(err)}`);
1820
1909
  return;
1821
1910
  }
1822
1911
  if (isEventHandlerAttr(name)) return;
@@ -1831,7 +1920,7 @@ function bindDynamic(el, nameGetter, valueGetter) {
1831
1920
  }
1832
1921
  prevName = name;
1833
1922
  }
1834
- const teardown = reactiveBinding(commit);
1923
+ const teardown = reactiveBinding2(commit);
1835
1924
  return () => {
1836
1925
  teardown();
1837
1926
  if (prevName !== null) {
@@ -1842,7 +1931,7 @@ function bindDynamic(el, nameGetter, valueGetter) {
1842
1931
 
1843
1932
  // src/core/rendering/dispose.ts
1844
1933
  var elementDisposers = /* @__PURE__ */ new WeakMap();
1845
- var _isDev4 = isDev();
1934
+ var _isDev5 = isDev();
1846
1935
  var activeBindingCount = 0;
1847
1936
  function registerDisposer(node, teardown) {
1848
1937
  let disposers = elementDisposers.get(node);
@@ -1851,7 +1940,7 @@ function registerDisposer(node, teardown) {
1851
1940
  elementDisposers.set(node, disposers);
1852
1941
  }
1853
1942
  disposers.push(teardown);
1854
- if (_isDev4) activeBindingCount++;
1943
+ if (_isDev5) activeBindingCount++;
1855
1944
  }
1856
1945
  function dispose(node) {
1857
1946
  const stack = [node];
@@ -1870,12 +1959,12 @@ function dispose(node) {
1870
1959
  if (disposers) {
1871
1960
  const snapshot = disposers.slice();
1872
1961
  elementDisposers.delete(current);
1873
- if (_isDev4) activeBindingCount -= snapshot.length;
1962
+ if (_isDev5) activeBindingCount -= snapshot.length;
1874
1963
  for (const d of snapshot) {
1875
1964
  try {
1876
1965
  d();
1877
1966
  } catch (err) {
1878
- if (_isDev4 && typeof console !== "undefined") {
1967
+ if (_isDev5 && typeof console !== "undefined") {
1879
1968
  console.warn("[SibuJS] Disposer threw during cleanup:", err);
1880
1969
  }
1881
1970
  }
@@ -1886,12 +1975,12 @@ function dispose(node) {
1886
1975
  if (!added || added.length === 0) break;
1887
1976
  const moreSnapshot = added.slice();
1888
1977
  elementDisposers.delete(current);
1889
- if (_isDev4) activeBindingCount -= moreSnapshot.length;
1978
+ if (_isDev5) activeBindingCount -= moreSnapshot.length;
1890
1979
  for (const d of moreSnapshot) {
1891
1980
  try {
1892
1981
  d();
1893
1982
  } catch (err) {
1894
- if (_isDev4 && typeof console !== "undefined") {
1983
+ if (_isDev5 && typeof console !== "undefined") {
1895
1984
  console.warn("[SibuJS] Disposer threw during cleanup:", err);
1896
1985
  }
1897
1986
  }
@@ -1901,7 +1990,7 @@ function dispose(node) {
1901
1990
  }
1902
1991
  }
1903
1992
  function checkLeaks(warnThreshold = 0) {
1904
- if (!_isDev4) return 0;
1993
+ if (!_isDev5) return 0;
1905
1994
  if (warnThreshold > 0 && activeBindingCount > warnThreshold) {
1906
1995
  devWarn(
1907
1996
  `checkLeaks: ${activeBindingCount} active DOM bindings detected. Expected \u2264${warnThreshold}. This may indicate a component was removed from the DOM without calling dispose().`
@@ -1911,7 +2000,7 @@ function checkLeaks(warnThreshold = 0) {
1911
2000
  }
1912
2001
 
1913
2002
  // src/reactivity/bindChildNode.ts
1914
- var _isDev5 = isDev();
2003
+ var _isDev6 = isDev();
1915
2004
  function bindChildNode(placeholder, getter) {
1916
2005
  let lastNodes = [];
1917
2006
  function commit() {
@@ -1919,7 +2008,7 @@ function bindChildNode(placeholder, getter) {
1919
2008
  try {
1920
2009
  result = getter();
1921
2010
  } catch (err) {
1922
- if (_isDev5) devWarn(`bindChildNode: getter threw: ${err instanceof Error ? err.message : String(err)}`);
2011
+ if (_isDev6) devWarn(`bindChildNode: getter threw: ${err instanceof Error ? err.message : String(err)}`);
1923
2012
  return;
1924
2013
  }
1925
2014
  if (result == null || typeof result === "boolean") {
@@ -1945,7 +2034,7 @@ function bindChildNode(placeholder, getter) {
1945
2034
  if (item == null || typeof item === "boolean") continue;
1946
2035
  const node = item instanceof Node ? item : document.createTextNode(String(item));
1947
2036
  if (seen.has(node)) {
1948
- if (_isDev5)
2037
+ if (_isDev6)
1949
2038
  devWarn("bindChildNode: duplicate node reference in array \u2014 only the first occurrence is rendered.");
1950
2039
  continue;
1951
2040
  }
@@ -1980,12 +2069,12 @@ function bindChildNode(placeholder, getter) {
1980
2069
  }
1981
2070
  lastNodes = newNodes;
1982
2071
  }
1983
- return reactiveBinding(commit);
2072
+ return reactiveBinding2(commit);
1984
2073
  }
1985
2074
 
1986
2075
  // src/core/rendering/tagFactory.ts
1987
2076
  var SVG_NS = "http://www.w3.org/2000/svg";
1988
- var _isDev6 = isDev();
2077
+ var _isDev7 = isDev();
1989
2078
  var BLOCKED_TAGS = /* @__PURE__ */ new Set(["script", "iframe", "object", "embed", "frame", "frameset"]);
1990
2079
  function isBlockedTag(tag) {
1991
2080
  return BLOCKED_TAGS.has(tag.toLowerCase());
@@ -2028,7 +2117,7 @@ function toKebab(prop) {
2028
2117
  }
2029
2118
  function applyStyle(el, style2) {
2030
2119
  if (typeof style2 === "function") {
2031
- const teardown = track(() => {
2120
+ const teardown = track2(() => {
2032
2121
  el.setAttribute("style", style2());
2033
2122
  });
2034
2123
  registerDisposer(el, teardown);
@@ -2044,7 +2133,7 @@ function applyStyle(el, style2) {
2044
2133
  const name = toKebab(prop);
2045
2134
  if (typeof val === "function") {
2046
2135
  const getter = val;
2047
- const teardown = track(() => {
2136
+ const teardown = track2(() => {
2048
2137
  htmlEl.style.setProperty(name, sanitizeCSSValue(String(getter())));
2049
2138
  });
2050
2139
  registerDisposer(el, teardown);
@@ -2059,7 +2148,7 @@ function applyClass(el, cls) {
2059
2148
  return;
2060
2149
  }
2061
2150
  if (typeof cls === "function") {
2062
- const teardown = track(() => {
2151
+ const teardown = track2(() => {
2063
2152
  el.setAttribute("class", cls());
2064
2153
  });
2065
2154
  registerDisposer(el, teardown);
@@ -2086,7 +2175,7 @@ function applyClass(el, cls) {
2086
2175
  }
2087
2176
  el.setAttribute("class", r);
2088
2177
  };
2089
- const teardown = track(update);
2178
+ const teardown = track2(update);
2090
2179
  registerDisposer(el, teardown);
2091
2180
  } else {
2092
2181
  el.setAttribute("class", result);
@@ -2156,7 +2245,7 @@ var tagFactory = (tag, ns) => {
2156
2245
  appendChildren(el, second);
2157
2246
  return el;
2158
2247
  }
2159
- if (_isDev6 && looksLikeClassList(first)) {
2248
+ if (_isDev7 && looksLikeClassList(first)) {
2160
2249
  devWarn(
2161
2250
  `tagFactory: lone string "${first}" looks like a class list but is being rendered as TEXT. For a class, use ${tag}({ class: "${first}" }) \u2014 or ${tag}("${first}", children) to set the class AND add children.`
2162
2251
  );
@@ -2177,7 +2266,7 @@ var tagFactory = (tag, ns) => {
2177
2266
  if (pClass != null) applyClass(el, pClass);
2178
2267
  const pId = props.id;
2179
2268
  if (pId != null) {
2180
- if (_isDev6 && typeof pId === "string" && CLOBBER_RISKY_IDS.has(pId.toLowerCase())) {
2269
+ if (_isDev7 && typeof pId === "string" && CLOBBER_RISKY_IDS.has(pId.toLowerCase())) {
2181
2270
  devWarn(
2182
2271
  `tagFactory: element id="${pId}" matches a common global and may cause DOM clobbering. Avoid setting ids from untrusted input.`
2183
2272
  );
@@ -2192,7 +2281,7 @@ var tagFactory = (tag, ns) => {
2192
2281
  const handler = pOn[ev];
2193
2282
  if (typeof handler === "function") {
2194
2283
  el.addEventListener(ev, handler);
2195
- } else if (_isDev6) {
2284
+ } else if (_isDev7) {
2196
2285
  devWarn(
2197
2286
  `tagFactory: on.${ev} handler is not a function (got ${typeof handler}). Event listener was not attached.`
2198
2287
  );
@@ -2305,7 +2394,7 @@ var area = tagFactory("area");
2305
2394
  var audio = tagFactory("audio");
2306
2395
  var img = tagFactory("img");
2307
2396
  var map = tagFactory("map");
2308
- var track2 = tagFactory("track");
2397
+ var track3 = tagFactory("track");
2309
2398
  var video = tagFactory("video");
2310
2399
  var embed = tagFactory("embed");
2311
2400
  var iframe = tagFactory("iframe");
@@ -2381,7 +2470,7 @@ var marquee = tagFactory("marquee");
2381
2470
  var customElement = (tagName) => tagFactory(tagName);
2382
2471
 
2383
2472
  // src/core/rendering/htm.ts
2384
- var _isDev7 = isDev();
2473
+ var _isDev8 = isDev();
2385
2474
  var RAW_TEXT_TAGS = /* @__PURE__ */ new Set(["script", "style"]);
2386
2475
  var VOID_ELEMENTS3 = /* @__PURE__ */ new Set([
2387
2476
  "area",
@@ -2677,7 +2766,7 @@ function executeElement(tmpl, values) {
2677
2766
  const fn = values[attr.idx];
2678
2767
  if (typeof fn === "function") {
2679
2768
  el.addEventListener(attr.name, fn);
2680
- } else if (_isDev7) {
2769
+ } else if (_isDev8) {
2681
2770
  devWarn(
2682
2771
  `html: on:${attr.name} handler is not a function (got ${typeof fn}). Event listener was not attached.`
2683
2772
  );
@@ -2805,7 +2894,7 @@ function mount(component, container) {
2805
2894
  }
2806
2895
 
2807
2896
  // src/core/rendering/each.ts
2808
- var _isDev8 = isDev();
2897
+ var _isDev9 = isDev();
2809
2898
  function resolveNodeChild(child) {
2810
2899
  if (typeof child === "function") {
2811
2900
  return resolveNodeChild(child());
@@ -2890,7 +2979,7 @@ function each(getArray, render, options) {
2890
2979
  workMap.clear();
2891
2980
  keyIndexMap.clear();
2892
2981
  for (let i2 = 0; i2 < newLen; i2++) {
2893
- if (_isDev8 && keyIndexMap.has(newKeys[i2])) {
2982
+ if (_isDev9 && keyIndexMap.has(newKeys[i2])) {
2894
2983
  devWarn(
2895
2984
  `each: duplicate key "${String(newKeys[i2])}" at index ${i2} (first seen at ${keyIndexMap.get(newKeys[i2])}). Keys must be unique \u2014 duplicates cause rows to be dropped or mis-ordered.`
2896
2985
  );
@@ -2905,12 +2994,12 @@ function each(getArray, render, options) {
2905
2994
  node = existing;
2906
2995
  } else {
2907
2996
  const itemKey = key;
2908
- const itemGetter = () => untracked(() => getArray()[keyIndexMap.get(itemKey)]);
2997
+ const itemGetter = () => untracked2(() => getArray()[keyIndexMap.get(itemKey)]);
2909
2998
  const indexGetter = () => keyIndexMap.get(itemKey);
2910
2999
  try {
2911
3000
  node = resolveNodeChild(render(itemGetter, indexGetter));
2912
3001
  } catch (err) {
2913
- if (_isDev8) {
3002
+ if (_isDev9) {
2914
3003
  devWarn(
2915
3004
  `each: render threw for item at index ${i2} (key="${newKeys[i2]}"): ${err instanceof Error ? err.message : String(err)}`
2916
3005
  );
@@ -2924,7 +3013,7 @@ function each(getArray, render, options) {
2924
3013
  target.dispatchEvent(
2925
3014
  new CustomEvent("sibu:error-propagate", { bubbles: true, detail: { error: errorObj } })
2926
3015
  );
2927
- } else if (_isDev8) {
3016
+ } else if (_isDev9) {
2928
3017
  devWarn(`each: error not surfaced \u2014 anchor detached: ${errorObj.message}`);
2929
3018
  }
2930
3019
  } catch {
@@ -2998,7 +3087,7 @@ function each(getArray, render, options) {
2998
3087
  workMap = tmp;
2999
3088
  initialized = true;
3000
3089
  };
3001
- const untrack = track(update);
3090
+ const untrack = track2(update);
3002
3091
  registerDisposer(anchor, untrack);
3003
3092
  if (!initialized) {
3004
3093
  queueMicrotask(() => {
@@ -3111,7 +3200,7 @@ function DynamicComponent(is) {
3111
3200
  }
3112
3201
  container.replaceChildren(el);
3113
3202
  }
3114
- const untrack = track(render);
3203
+ const untrack = track2(render);
3115
3204
  registerDisposer(container, untrack);
3116
3205
  return container;
3117
3206
  }
@@ -3126,7 +3215,7 @@ function show(condition, element) {
3126
3215
  const update = () => {
3127
3216
  element.style.display = condition() ? "" : "none";
3128
3217
  };
3129
- registerDisposer(element, track(update));
3218
+ registerDisposer(element, track2(update));
3130
3219
  return element;
3131
3220
  }
3132
3221
  function when(condition, thenBranch, elseBranch) {
@@ -3153,7 +3242,7 @@ function when(condition, thenBranch, elseBranch) {
3153
3242
  }
3154
3243
  initialized = true;
3155
3244
  };
3156
- registerDisposer(anchor, track(update));
3245
+ registerDisposer(anchor, track2(update));
3157
3246
  if (!initialized) {
3158
3247
  queueMicrotask(() => {
3159
3248
  if (!initialized && anchor.parentNode) update();
@@ -3188,7 +3277,7 @@ function match(value, cases, fallback) {
3188
3277
  }
3189
3278
  initialized = true;
3190
3279
  };
3191
- registerDisposer(anchor, track(update));
3280
+ registerDisposer(anchor, track2(update));
3192
3281
  if (!initialized) {
3193
3282
  queueMicrotask(() => {
3194
3283
  if (!initialized && anchor.parentNode) update();
@@ -3257,7 +3346,7 @@ function KeepAlive(activeKey, cases, options) {
3257
3346
  currentNode = node;
3258
3347
  initialized = true;
3259
3348
  };
3260
- const untrack = track(update);
3349
+ const untrack = track2(update);
3261
3350
  if (!initialized) {
3262
3351
  queueMicrotask(() => {
3263
3352
  if (!initialized && anchor.parentNode) update();
@@ -3278,10 +3367,24 @@ function KeepAlive(activeKey, cases, options) {
3278
3367
  }
3279
3368
 
3280
3369
  // src/core/rendering/action.ts
3281
- function action(element, actionFn, param2) {
3282
- const cleanup2 = actionFn(element, param2);
3283
- if (typeof cleanup2 === "function") {
3284
- registerDisposer(element, cleanup2);
3370
+ var ACTIONS_KEY = /* @__PURE__ */ Symbol.for("sibujs.actions.v1");
3371
+ var _actions = globalThis[ACTIONS_KEY] ?? (globalThis[ACTIONS_KEY] = /* @__PURE__ */ new Map());
3372
+ function registerAction(name, fn) {
3373
+ _actions.set(name, fn);
3374
+ }
3375
+ function getAction(name) {
3376
+ return _actions.get(name);
3377
+ }
3378
+ function action(element, action2, param2) {
3379
+ const actionFn = typeof action2 === "string" ? getAction(action2) : action2;
3380
+ if (!actionFn) {
3381
+ throw new Error(
3382
+ `[SibuJS] No action registered under the name "${action2}". Register it with registerAction() before applying it by name.`
3383
+ );
3384
+ }
3385
+ const cleanup3 = actionFn(element, param2);
3386
+ if (typeof cleanup3 === "function") {
3387
+ registerDisposer(element, cleanup3);
3285
3388
  }
3286
3389
  }
3287
3390
  var clickOutside = (element, callback) => {
@@ -3355,6 +3458,11 @@ var trapFocus = (element) => {
3355
3458
  element.addEventListener("keydown", handler);
3356
3459
  return () => element.removeEventListener("keydown", handler);
3357
3460
  };
3461
+ registerAction("clickOutside", clickOutside);
3462
+ registerAction("longPress", longPress);
3463
+ registerAction("copyOnClick", copyOnClick);
3464
+ registerAction("autoResize", autoResize);
3465
+ registerAction("trapFocus", trapFocus);
3358
3466
 
3359
3467
  // src/core/rendering/catch.ts
3360
3468
  var globalErrorHandler = null;
@@ -3403,19 +3511,20 @@ function setGlobalErrorHandler(handler) {
3403
3511
  }
3404
3512
 
3405
3513
  // src/core/rendering/createId.ts
3406
- var idCounter = 0;
3514
+ var COUNTER_KEY = /* @__PURE__ */ Symbol.for("sibujs.createId.v1");
3515
+ var _counter = globalThis[COUNTER_KEY] ?? (globalThis[COUNTER_KEY] = { n: 0 });
3407
3516
  function createId(prefix = "sibu") {
3408
- idCounter++;
3409
- return `${prefix}-${idCounter}`;
3517
+ _counter.n++;
3518
+ return `${prefix}-${_counter.n}`;
3410
3519
  }
3411
3520
  function __resetIdCounter() {
3412
- idCounter = 0;
3521
+ _counter.n = 0;
3413
3522
  }
3414
3523
 
3415
3524
  // src/reactivity/batch.ts
3416
3525
  var batchDepth = 0;
3417
3526
  var pendingSignals = /* @__PURE__ */ new Set();
3418
- function batch(fn) {
3527
+ function batchImpl(fn) {
3419
3528
  batchDepth++;
3420
3529
  try {
3421
3530
  return fn();
@@ -3426,28 +3535,45 @@ function batch(fn) {
3426
3535
  }
3427
3536
  }
3428
3537
  }
3429
- function enqueueBatchedSignal(signal2) {
3538
+ function enqueueBatchedSignalImpl(signal2) {
3430
3539
  if (batchDepth === 0) return false;
3431
3540
  pendingSignals.add(signal2);
3432
3541
  return true;
3433
3542
  }
3434
- function isBatching() {
3543
+ function isBatchingImpl() {
3435
3544
  return batchDepth > 0;
3436
3545
  }
3437
3546
  function flushBatch() {
3438
3547
  try {
3439
3548
  for (const signal2 of pendingSignals) {
3440
- queueSignalNotification(signal2);
3549
+ queueSignalNotification2(signal2);
3441
3550
  }
3442
3551
  } finally {
3443
3552
  pendingSignals.clear();
3444
3553
  }
3445
- drainNotificationQueue();
3554
+ drainNotificationQueue2();
3555
+ }
3556
+ var BATCH_REGISTRY_KEY = /* @__PURE__ */ Symbol.for("sibujs.reactive.batch.v1");
3557
+ function resolveBatchApi() {
3558
+ const g2 = globalThis;
3559
+ const existing = g2[BATCH_REGISTRY_KEY];
3560
+ if (existing) return existing;
3561
+ const local = {
3562
+ batch: batchImpl,
3563
+ enqueueBatchedSignal: enqueueBatchedSignalImpl,
3564
+ isBatching: isBatchingImpl
3565
+ };
3566
+ g2[BATCH_REGISTRY_KEY] = local;
3567
+ return local;
3446
3568
  }
3569
+ var API2 = resolveBatchApi();
3570
+ var batch = API2.batch;
3571
+ var enqueueBatchedSignal = API2.enqueueBatchedSignal;
3572
+ var isBatching = API2.isBatching;
3447
3573
 
3448
3574
  // src/core/signals/signal.ts
3449
3575
  var _g = globalThis;
3450
- var _isDev9 = isDev();
3576
+ var _isDev10 = isDev();
3451
3577
  function signal(initial, options) {
3452
3578
  const state = {
3453
3579
  value: initial,
@@ -3458,11 +3584,11 @@ function signal(initial, options) {
3458
3584
  __activeNode: null,
3459
3585
  __name: void 0
3460
3586
  };
3461
- const debugName = _isDev9 ? options?.name : void 0;
3587
+ const debugName = _isDev10 ? options?.name : void 0;
3462
3588
  const equalsFn = options?.equals;
3463
3589
  if (debugName) state.__name = debugName;
3464
3590
  function get() {
3465
- recordDependency(state);
3591
+ recordDependency2(state);
3466
3592
  return state.value;
3467
3593
  }
3468
3594
  get.__signal = state;
@@ -3475,15 +3601,15 @@ function signal(initial, options) {
3475
3601
  if (equalsFn(prev, newValue)) return;
3476
3602
  state.value = newValue;
3477
3603
  state.__v++;
3478
- if (_isDev9) {
3604
+ if (_isDev10) {
3479
3605
  const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
3480
3606
  if (hook) hook.emit("signal:update", { signal: state, name: debugName, oldValue: prev, newValue });
3481
3607
  }
3482
3608
  if (!enqueueBatchedSignal(state)) {
3483
- notifySubscribers(state);
3609
+ notifySubscribers2(state);
3484
3610
  }
3485
3611
  };
3486
- } else if (_isDev9) {
3612
+ } else if (_isDev10) {
3487
3613
  set = (next) => {
3488
3614
  const prev = state.value;
3489
3615
  const newValue = typeof next === "function" ? next(prev) : next;
@@ -3493,7 +3619,7 @@ function signal(initial, options) {
3493
3619
  const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
3494
3620
  if (hook) hook.emit("signal:update", { signal: state, name: debugName, oldValue: prev, newValue });
3495
3621
  if (!enqueueBatchedSignal(state)) {
3496
- notifySubscribers(state);
3622
+ notifySubscribers2(state);
3497
3623
  }
3498
3624
  };
3499
3625
  } else {
@@ -3504,11 +3630,11 @@ function signal(initial, options) {
3504
3630
  state.value = newValue;
3505
3631
  state.__v++;
3506
3632
  if (!enqueueBatchedSignal(state)) {
3507
- notifySubscribers(state);
3633
+ notifySubscribers2(state);
3508
3634
  }
3509
3635
  };
3510
3636
  }
3511
- if (_isDev9) {
3637
+ if (_isDev10) {
3512
3638
  const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
3513
3639
  if (hook) hook.emit("signal:create", { signal: state, name: debugName, getter: get, initial });
3514
3640
  }
@@ -3516,23 +3642,29 @@ function signal(initial, options) {
3516
3642
  }
3517
3643
 
3518
3644
  // src/core/ssr-context.ts
3519
- var als = null;
3520
- try {
3521
- if (typeof process !== "undefined" && process.versions && process.versions.node) {
3522
- let mod = null;
3523
- const getBuiltin = process.getBuiltinModule;
3524
- if (typeof getBuiltin === "function") {
3525
- mod = getBuiltin("node:async_hooks");
3526
- } else {
3527
- const req = Function("return typeof require==='function'?require:null")();
3528
- if (req) mod = req("node:async_hooks");
3645
+ var SSR_KEY = /* @__PURE__ */ Symbol.for("sibujs.ssr.v1");
3646
+ function detectSSRShared() {
3647
+ let detected = null;
3648
+ try {
3649
+ if (typeof process !== "undefined" && process.versions && process.versions.node) {
3650
+ let mod = null;
3651
+ const getBuiltin = process.getBuiltinModule;
3652
+ if (typeof getBuiltin === "function") {
3653
+ mod = getBuiltin("node:async_hooks");
3654
+ } else {
3655
+ const req = Function("return typeof require==='function'?require:null")();
3656
+ if (req) mod = req("node:async_hooks");
3657
+ }
3658
+ if (mod) detected = new mod.AsyncLocalStorage();
3529
3659
  }
3530
- if (mod) als = new mod.AsyncLocalStorage();
3660
+ } catch {
3661
+ detected = null;
3531
3662
  }
3532
- } catch {
3533
- als = null;
3663
+ return { als: detected, fallbackStore: { ssr: false, suspenseIdCounter: 0 } };
3534
3664
  }
3535
- var fallbackStore = { ssr: false, suspenseIdCounter: 0 };
3665
+ var _shared = globalThis[SSR_KEY] ?? (globalThis[SSR_KEY] = detectSSRShared());
3666
+ var als = _shared.als;
3667
+ var fallbackStore = _shared.fallbackStore;
3536
3668
  function getSSRStore() {
3537
3669
  if (als) {
3538
3670
  const s2 = als.getStore();
@@ -3597,11 +3729,11 @@ function on(deps, handler) {
3597
3729
  if (first) {
3598
3730
  first = false;
3599
3731
  prev = value;
3600
- untracked(() => handler(value, void 0));
3732
+ untracked2(() => handler(value, void 0));
3601
3733
  } else {
3602
3734
  const p2 = prev;
3603
3735
  prev = value;
3604
- untracked(() => handler(value, p2));
3736
+ untracked2(() => handler(value, p2));
3605
3737
  }
3606
3738
  };
3607
3739
  }
@@ -3623,7 +3755,7 @@ function drainReruns(ctx) {
3623
3755
  do {
3624
3756
  ctx.rerunPending = false;
3625
3757
  if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
3626
- retrack(ctx.bodyFn, ctx.subscriber);
3758
+ retrack2(ctx.bodyFn, ctx.subscriber);
3627
3759
  } while (ctx.rerunPending && ++reruns <= MAX_RERUNS);
3628
3760
  if (ctx.rerunPending) {
3629
3761
  ctx.rerunPending = false;
@@ -3652,7 +3784,7 @@ function disposeEffect(ctx) {
3652
3784
  }
3653
3785
  }
3654
3786
  try {
3655
- cleanup(ctx.subscriber);
3787
+ cleanup2(ctx.subscriber);
3656
3788
  } catch (err) {
3657
3789
  if (typeof console !== "undefined") {
3658
3790
  console.warn("[SibuJS effect] dispose threw:", err);
@@ -3697,7 +3829,7 @@ function effect(effectFn, options) {
3697
3829
  try {
3698
3830
  ctx.rerunPending = false;
3699
3831
  if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
3700
- retrack(ctx.bodyFn, sub2);
3832
+ retrack2(ctx.bodyFn, sub2);
3701
3833
  if (ctx.rerunPending) drainReruns(ctx);
3702
3834
  } finally {
3703
3835
  ctx.running = false;
@@ -3713,7 +3845,7 @@ function effect(effectFn, options) {
3713
3845
  ctx.subscriber = sub2;
3714
3846
  ctx.running = true;
3715
3847
  try {
3716
- retrack(ctx.bodyFn, ctx.subscriber);
3848
+ retrack2(ctx.bodyFn, ctx.subscriber);
3717
3849
  if (ctx.rerunPending) drainReruns(ctx);
3718
3850
  } finally {
3719
3851
  ctx.running = false;
@@ -3746,7 +3878,7 @@ function derived(getter, options) {
3746
3878
  cs._d = false;
3747
3879
  cs._init = true;
3748
3880
  };
3749
- track(() => {
3881
+ track2(() => {
3750
3882
  let threw = true;
3751
3883
  try {
3752
3884
  cs._v = getter();
@@ -3765,12 +3897,12 @@ function derived(getter, options) {
3765
3897
  `[SibuJS] Circular dependency detected in derived${debugName ? ` "${debugName}"` : ""}. A derived signal cannot read itself (directly or through a chain).`
3766
3898
  );
3767
3899
  }
3768
- if (trackingSuspended) {
3900
+ if (isTrackingSuspended2()) {
3769
3901
  if (cs._d) {
3770
3902
  const prev = cs._v;
3771
3903
  evaluating = true;
3772
3904
  try {
3773
- retrack(recompute, markDirty);
3905
+ retrack2(recompute, markDirty);
3774
3906
  if (!Object.is(prev, cs._v)) cs.__v++;
3775
3907
  } finally {
3776
3908
  evaluating = false;
@@ -3778,12 +3910,12 @@ function derived(getter, options) {
3778
3910
  }
3779
3911
  return cs._v;
3780
3912
  }
3781
- recordDependency(cs);
3913
+ recordDependency2(cs);
3782
3914
  if (cs._d) {
3783
3915
  const oldValue = cs._v;
3784
3916
  evaluating = true;
3785
3917
  try {
3786
- retrack(recompute, markDirty);
3918
+ retrack2(recompute, markDirty);
3787
3919
  if (!Object.is(oldValue, cs._v)) cs.__v++;
3788
3920
  } finally {
3789
3921
  evaluating = false;
@@ -3821,15 +3953,15 @@ function watch(getter, callback) {
3821
3953
  if (!Object.is(newValue, oldValue)) {
3822
3954
  const prev = oldValue;
3823
3955
  oldValue = newValue;
3824
- suspendTracking();
3956
+ suspendTracking2();
3825
3957
  try {
3826
3958
  callback(newValue, prev);
3827
3959
  } finally {
3828
- resumeTracking();
3960
+ resumeTracking2();
3829
3961
  }
3830
3962
  }
3831
3963
  };
3832
- const teardown = track(subscriber);
3964
+ const teardown = track2(subscriber);
3833
3965
  return teardown;
3834
3966
  }
3835
3967
 
@@ -3892,11 +4024,11 @@ function store(initialState) {
3892
4024
  first = false;
3893
4025
  return;
3894
4026
  }
3895
- suspendTracking();
4027
+ suspendTracking2();
3896
4028
  try {
3897
4029
  callback(snapshot);
3898
4030
  } finally {
3899
- resumeTracking();
4031
+ resumeTracking2();
3900
4032
  }
3901
4033
  });
3902
4034
  };
@@ -3913,11 +4045,11 @@ function store(initialState) {
3913
4045
  if (!Object.is(current, prev)) {
3914
4046
  const oldPrev = prev;
3915
4047
  prev = current;
3916
- suspendTracking();
4048
+ suspendTracking2();
3917
4049
  try {
3918
4050
  callback(current, oldPrev);
3919
4051
  } finally {
3920
- resumeTracking();
4052
+ resumeTracking2();
3921
4053
  }
3922
4054
  }
3923
4055
  });
@@ -4019,11 +4151,11 @@ function reactiveArray(initial = []) {
4019
4151
  function notify() {
4020
4152
  snapshot = null;
4021
4153
  if (!enqueueBatchedSignal(signal2)) {
4022
- notifySubscribers(signal2);
4154
+ notifySubscribers2(signal2);
4023
4155
  }
4024
4156
  }
4025
4157
  function get() {
4026
- recordDependency(signal2);
4158
+ recordDependency2(signal2);
4027
4159
  if (snapshot === null) {
4028
4160
  const copy = data2.slice();
4029
4161
  snapshot = Object.freeze(copy);
@@ -4279,9 +4411,9 @@ function safeCall(cb, hookName) {
4279
4411
  }
4280
4412
  }
4281
4413
  function runMountCallback(callback, hookName, element) {
4282
- const cleanup2 = safeCall(callback, hookName);
4283
- if (typeof cleanup2 === "function" && element) {
4284
- registerDisposer(element, cleanup2);
4414
+ const cleanup3 = safeCall(callback, hookName);
4415
+ if (typeof cleanup3 === "function" && element) {
4416
+ registerDisposer(element, cleanup3);
4285
4417
  }
4286
4418
  }
4287
4419
  var mountWatchers = /* @__PURE__ */ new WeakMap();
@@ -4597,7 +4729,7 @@ function defer(getter) {
4597
4729
  }
4598
4730
  });
4599
4731
  };
4600
- const teardown = track(() => {
4732
+ const teardown = track2(() => {
4601
4733
  latest = getter();
4602
4734
  schedule();
4603
4735
  });
@@ -4749,14 +4881,14 @@ function Suspense({ nodes, fallback }) {
4749
4881
  }
4750
4882
 
4751
4883
  // src/platform/ssr.ts
4752
- var _isDev10 = isDev();
4884
+ var _isDev11 = isDev();
4753
4885
  function trustHTML(html3) {
4754
4886
  return html3;
4755
4887
  }
4756
4888
  var DEFAULT_MAX_SSR_BYTES = 1024 * 1024;
4757
4889
 
4758
4890
  // src/components/ErrorDisplay.ts
4759
- var _isDev11 = isDev();
4891
+ var _isDev12 = isDev();
4760
4892
  var STYLES = `
4761
4893
  .sibu-error-display {
4762
4894
  border: 1px solid var(--sibu-err-border, #e5484d);
@@ -5067,7 +5199,7 @@ function ErrorDisplay(props) {
5067
5199
  injectStyles();
5068
5200
  const severity = props.severity ?? "error";
5069
5201
  const normalized = normalizeError(props.error);
5070
- const showDetails = props.alwaysShowDetails ?? _isDev11;
5202
+ const showDetails = props.alwaysShowDetails ?? _isDev12;
5071
5203
  const headline = props.title ?? normalized.message;
5072
5204
  const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19);
5073
5205
  const [copyLabel, setCopyLabel] = signal("Copy");