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/widgets.cjs CHANGED
@@ -54,7 +54,7 @@ function devWarn(message) {
54
54
  }
55
55
  }
56
56
 
57
- // src/reactivity/track.ts
57
+ // src/reactivity/track-core.ts
58
58
  var _isDev2 = isDev();
59
59
  var POOL_MAX = 4096;
60
60
  var nodePool = [];
@@ -168,6 +168,17 @@ function resumeTracking() {
168
168
  trackingSuspended = false;
169
169
  }
170
170
  }
171
+ function isTrackingSuspended() {
172
+ return trackingSuspended;
173
+ }
174
+ function untracked(fn) {
175
+ suspendTracking();
176
+ try {
177
+ return fn();
178
+ } finally {
179
+ resumeTracking();
180
+ }
181
+ }
171
182
  var subscriberEpochCounter = 0;
172
183
  function retrack(effectFn, subscriber) {
173
184
  const prev = currentSubscriber;
@@ -277,6 +288,16 @@ function cleanup(subscriber) {
277
288
  var maxSubscriberRepeats = 50;
278
289
  var maxDrainIterations = 1e6;
279
290
  var drainEpoch = 0;
291
+ function setMaxSubscriberRepeats(n) {
292
+ const prev = maxSubscriberRepeats;
293
+ if (Number.isFinite(n) && n > 0) maxSubscriberRepeats = Math.floor(n);
294
+ return prev;
295
+ }
296
+ function setMaxDrainIterations(n) {
297
+ const prev = maxDrainIterations;
298
+ if (Number.isFinite(n) && n > 0) maxDrainIterations = Math.floor(n);
299
+ return prev;
300
+ }
280
301
  function tickRepeat(sub) {
281
302
  const s = sub;
282
303
  if (s._runEpoch !== drainEpoch) {
@@ -425,6 +446,85 @@ function notifySubscribers(signal2) {
425
446
  }
426
447
  }
427
448
  }
449
+ function getSubscriberCount(signal2) {
450
+ return signal2.__sc ?? 0;
451
+ }
452
+ function getSubscriberDeps(subscriber) {
453
+ const sub = subscriber;
454
+ const out = [];
455
+ let node = sub.depsHead ?? null;
456
+ while (node) {
457
+ if (node.sig) out.push(node.sig);
458
+ node = node.subNext;
459
+ }
460
+ return out;
461
+ }
462
+ function forEachSubscriber(signal2, visit) {
463
+ let node = signal2.subsHead ?? null;
464
+ while (node) {
465
+ const s = node.sub;
466
+ if (s) visit(s);
467
+ node = node.sigNext;
468
+ }
469
+ }
470
+
471
+ // src/reactivity/track.ts
472
+ var _isDev3 = isDev();
473
+ var _runtimeVersion = true ? "3.3.2" : "dev";
474
+ var REGISTRY_KEY = /* @__PURE__ */ Symbol.for("sibujs.reactive.v1");
475
+ function resolveReactiveApi() {
476
+ const g = globalThis;
477
+ const existing = g[REGISTRY_KEY];
478
+ if (existing) {
479
+ if (_isDev3 && !existing.__dupWarned) {
480
+ existing.__dupWarned = true;
481
+ devWarn(
482
+ `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']).`
483
+ );
484
+ }
485
+ return existing;
486
+ }
487
+ const local = {
488
+ suspendTracking,
489
+ resumeTracking,
490
+ isTrackingSuspended,
491
+ untracked,
492
+ retrack,
493
+ track,
494
+ reactiveBinding,
495
+ recordDependency,
496
+ cleanup,
497
+ setMaxSubscriberRepeats,
498
+ setMaxDrainIterations,
499
+ drainNotificationQueue,
500
+ queueSignalNotification,
501
+ notifySubscribers,
502
+ getSubscriberCount,
503
+ getSubscriberDeps,
504
+ forEachSubscriber,
505
+ version: _runtimeVersion
506
+ };
507
+ g[REGISTRY_KEY] = local;
508
+ return local;
509
+ }
510
+ var API = resolveReactiveApi();
511
+ var suspendTracking2 = API.suspendTracking;
512
+ var resumeTracking2 = API.resumeTracking;
513
+ var isTrackingSuspended2 = API.isTrackingSuspended;
514
+ var untracked2 = API.untracked;
515
+ var retrack2 = API.retrack;
516
+ var track2 = API.track;
517
+ var reactiveBinding2 = API.reactiveBinding;
518
+ var recordDependency2 = API.recordDependency;
519
+ var cleanup2 = API.cleanup;
520
+ var setMaxSubscriberRepeats2 = API.setMaxSubscriberRepeats;
521
+ var setMaxDrainIterations2 = API.setMaxDrainIterations;
522
+ var drainNotificationQueue2 = API.drainNotificationQueue;
523
+ var queueSignalNotification2 = API.queueSignalNotification;
524
+ var notifySubscribers2 = API.notifySubscribers;
525
+ var getSubscriberCount2 = API.getSubscriberCount;
526
+ var getSubscriberDeps2 = API.getSubscriberDeps;
527
+ var forEachSubscriber2 = API.forEachSubscriber;
428
528
 
429
529
  // src/core/signals/derived.ts
430
530
  function derived(getter, options) {
@@ -448,7 +548,7 @@ function derived(getter, options) {
448
548
  cs._d = false;
449
549
  cs._init = true;
450
550
  };
451
- track(() => {
551
+ track2(() => {
452
552
  let threw = true;
453
553
  try {
454
554
  cs._v = getter();
@@ -467,12 +567,12 @@ function derived(getter, options) {
467
567
  `[SibuJS] Circular dependency detected in derived${debugName ? ` "${debugName}"` : ""}. A derived signal cannot read itself (directly or through a chain).`
468
568
  );
469
569
  }
470
- if (trackingSuspended) {
570
+ if (isTrackingSuspended2()) {
471
571
  if (cs._d) {
472
572
  const prev = cs._v;
473
573
  evaluating = true;
474
574
  try {
475
- retrack(recompute, markDirty);
575
+ retrack2(recompute, markDirty);
476
576
  if (!Object.is(prev, cs._v)) cs.__v++;
477
577
  } finally {
478
578
  evaluating = false;
@@ -480,12 +580,12 @@ function derived(getter, options) {
480
580
  }
481
581
  return cs._v;
482
582
  }
483
- recordDependency(cs);
583
+ recordDependency2(cs);
484
584
  if (cs._d) {
485
585
  const oldValue = cs._v;
486
586
  evaluating = true;
487
587
  try {
488
- retrack(recompute, markDirty);
588
+ retrack2(recompute, markDirty);
489
589
  if (!Object.is(oldValue, cs._v)) cs.__v++;
490
590
  } finally {
491
591
  evaluating = false;
@@ -506,23 +606,29 @@ function derived(getter, options) {
506
606
  }
507
607
 
508
608
  // src/core/ssr-context.ts
509
- var als = null;
510
- try {
511
- if (typeof process !== "undefined" && process.versions && process.versions.node) {
512
- let mod = null;
513
- const getBuiltin = process.getBuiltinModule;
514
- if (typeof getBuiltin === "function") {
515
- mod = getBuiltin("node:async_hooks");
516
- } else {
517
- const req = Function("return typeof require==='function'?require:null")();
518
- if (req) mod = req("node:async_hooks");
609
+ var SSR_KEY = /* @__PURE__ */ Symbol.for("sibujs.ssr.v1");
610
+ function detectSSRShared() {
611
+ let detected = null;
612
+ try {
613
+ if (typeof process !== "undefined" && process.versions && process.versions.node) {
614
+ let mod = null;
615
+ const getBuiltin = process.getBuiltinModule;
616
+ if (typeof getBuiltin === "function") {
617
+ mod = getBuiltin("node:async_hooks");
618
+ } else {
619
+ const req = Function("return typeof require==='function'?require:null")();
620
+ if (req) mod = req("node:async_hooks");
621
+ }
622
+ if (mod) detected = new mod.AsyncLocalStorage();
519
623
  }
520
- if (mod) als = new mod.AsyncLocalStorage();
624
+ } catch {
625
+ detected = null;
521
626
  }
522
- } catch {
523
- als = null;
627
+ return { als: detected, fallbackStore: { ssr: false, suspenseIdCounter: 0 } };
524
628
  }
525
- var fallbackStore = { ssr: false, suspenseIdCounter: 0 };
629
+ var _shared = globalThis[SSR_KEY] ?? (globalThis[SSR_KEY] = detectSSRShared());
630
+ var als = _shared.als;
631
+ var fallbackStore = _shared.fallbackStore;
526
632
  function getSSRStore() {
527
633
  if (als) {
528
634
  const s = als.getStore();
@@ -554,7 +660,7 @@ function drainReruns(ctx) {
554
660
  do {
555
661
  ctx.rerunPending = false;
556
662
  if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
557
- retrack(ctx.bodyFn, ctx.subscriber);
663
+ retrack2(ctx.bodyFn, ctx.subscriber);
558
664
  } while (ctx.rerunPending && ++reruns <= MAX_RERUNS);
559
665
  if (ctx.rerunPending) {
560
666
  ctx.rerunPending = false;
@@ -583,7 +689,7 @@ function disposeEffect(ctx) {
583
689
  }
584
690
  }
585
691
  try {
586
- cleanup(ctx.subscriber);
692
+ cleanup2(ctx.subscriber);
587
693
  } catch (err) {
588
694
  if (typeof console !== "undefined") {
589
695
  console.warn("[SibuJS effect] dispose threw:", err);
@@ -628,7 +734,7 @@ function effect(effectFn, options) {
628
734
  try {
629
735
  ctx.rerunPending = false;
630
736
  if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
631
- retrack(ctx.bodyFn, sub);
737
+ retrack2(ctx.bodyFn, sub);
632
738
  if (ctx.rerunPending) drainReruns(ctx);
633
739
  } finally {
634
740
  ctx.running = false;
@@ -644,7 +750,7 @@ function effect(effectFn, options) {
644
750
  ctx.subscriber = sub;
645
751
  ctx.running = true;
646
752
  try {
647
- retrack(ctx.bodyFn, ctx.subscriber);
753
+ retrack2(ctx.bodyFn, ctx.subscriber);
648
754
  if (ctx.rerunPending) drainReruns(ctx);
649
755
  } finally {
650
756
  ctx.running = false;
@@ -658,7 +764,7 @@ function effect(effectFn, options) {
658
764
  // src/reactivity/batch.ts
659
765
  var batchDepth = 0;
660
766
  var pendingSignals = /* @__PURE__ */ new Set();
661
- function batch(fn) {
767
+ function batchImpl(fn) {
662
768
  batchDepth++;
663
769
  try {
664
770
  return fn();
@@ -669,25 +775,45 @@ function batch(fn) {
669
775
  }
670
776
  }
671
777
  }
672
- function enqueueBatchedSignal(signal2) {
778
+ function enqueueBatchedSignalImpl(signal2) {
673
779
  if (batchDepth === 0) return false;
674
780
  pendingSignals.add(signal2);
675
781
  return true;
676
782
  }
783
+ function isBatchingImpl() {
784
+ return batchDepth > 0;
785
+ }
677
786
  function flushBatch() {
678
787
  try {
679
788
  for (const signal2 of pendingSignals) {
680
- queueSignalNotification(signal2);
789
+ queueSignalNotification2(signal2);
681
790
  }
682
791
  } finally {
683
792
  pendingSignals.clear();
684
793
  }
685
- drainNotificationQueue();
794
+ drainNotificationQueue2();
795
+ }
796
+ var BATCH_REGISTRY_KEY = /* @__PURE__ */ Symbol.for("sibujs.reactive.batch.v1");
797
+ function resolveBatchApi() {
798
+ const g = globalThis;
799
+ const existing = g[BATCH_REGISTRY_KEY];
800
+ if (existing) return existing;
801
+ const local = {
802
+ batch: batchImpl,
803
+ enqueueBatchedSignal: enqueueBatchedSignalImpl,
804
+ isBatching: isBatchingImpl
805
+ };
806
+ g[BATCH_REGISTRY_KEY] = local;
807
+ return local;
686
808
  }
809
+ var API2 = resolveBatchApi();
810
+ var batch = API2.batch;
811
+ var enqueueBatchedSignal = API2.enqueueBatchedSignal;
812
+ var isBatching = API2.isBatching;
687
813
 
688
814
  // src/core/signals/signal.ts
689
815
  var _g2 = globalThis;
690
- var _isDev3 = isDev();
816
+ var _isDev4 = isDev();
691
817
  function signal(initial, options) {
692
818
  const state = {
693
819
  value: initial,
@@ -698,11 +824,11 @@ function signal(initial, options) {
698
824
  __activeNode: null,
699
825
  __name: void 0
700
826
  };
701
- const debugName = _isDev3 ? options?.name : void 0;
827
+ const debugName = _isDev4 ? options?.name : void 0;
702
828
  const equalsFn = options?.equals;
703
829
  if (debugName) state.__name = debugName;
704
830
  function get() {
705
- recordDependency(state);
831
+ recordDependency2(state);
706
832
  return state.value;
707
833
  }
708
834
  get.__signal = state;
@@ -715,15 +841,15 @@ function signal(initial, options) {
715
841
  if (equalsFn(prev, newValue)) return;
716
842
  state.value = newValue;
717
843
  state.__v++;
718
- if (_isDev3) {
844
+ if (_isDev4) {
719
845
  const hook = _g2.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
720
846
  if (hook) hook.emit("signal:update", { signal: state, name: debugName, oldValue: prev, newValue });
721
847
  }
722
848
  if (!enqueueBatchedSignal(state)) {
723
- notifySubscribers(state);
849
+ notifySubscribers2(state);
724
850
  }
725
851
  };
726
- } else if (_isDev3) {
852
+ } else if (_isDev4) {
727
853
  set = (next) => {
728
854
  const prev = state.value;
729
855
  const newValue = typeof next === "function" ? next(prev) : next;
@@ -733,7 +859,7 @@ function signal(initial, options) {
733
859
  const hook = _g2.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
734
860
  if (hook) hook.emit("signal:update", { signal: state, name: debugName, oldValue: prev, newValue });
735
861
  if (!enqueueBatchedSignal(state)) {
736
- notifySubscribers(state);
862
+ notifySubscribers2(state);
737
863
  }
738
864
  };
739
865
  } else {
@@ -744,11 +870,11 @@ function signal(initial, options) {
744
870
  state.value = newValue;
745
871
  state.__v++;
746
872
  if (!enqueueBatchedSignal(state)) {
747
- notifySubscribers(state);
873
+ notifySubscribers2(state);
748
874
  }
749
875
  };
750
876
  }
751
- if (_isDev3) {
877
+ if (_isDev4) {
752
878
  const hook = _g2.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
753
879
  if (hook) hook.emit("signal:create", { signal: state, name: debugName, getter: get, initial });
754
880
  }
@@ -773,15 +899,15 @@ function watch(getter, callback) {
773
899
  if (!Object.is(newValue, oldValue)) {
774
900
  const prev = oldValue;
775
901
  oldValue = newValue;
776
- suspendTracking();
902
+ suspendTracking2();
777
903
  try {
778
904
  callback(newValue, prev);
779
905
  } finally {
780
- resumeTracking();
906
+ resumeTracking2();
781
907
  }
782
908
  }
783
909
  };
784
- const teardown = track(subscriber);
910
+ const teardown = track2(subscriber);
785
911
  return teardown;
786
912
  }
787
913
 
package/dist/widgets.js CHANGED
@@ -8,14 +8,14 @@ import {
8
8
  select,
9
9
  tabs,
10
10
  tooltip
11
- } from "./chunk-4WXWJ4SW.js";
12
- import "./chunk-F4UM7QBJ.js";
13
- import "./chunk-CVMMULHO.js";
11
+ } from "./chunk-FJO2ZL4Q.js";
12
+ import "./chunk-RLTFJYDN.js";
13
+ import "./chunk-G6N3LMO2.js";
14
14
  import "./chunk-L3GAGWCC.js";
15
- import "./chunk-7JHWAGRQ.js";
16
- import "./chunk-GOJMFRBL.js";
17
- import "./chunk-5K72I3UQ.js";
18
- import "./chunk-X3NHE2DK.js";
15
+ import "./chunk-N5TQVEKE.js";
16
+ import "./chunk-S3NFJO6L.js";
17
+ import "./chunk-JCQG2I2G.js";
18
+ import "./chunk-4NJEAPLI.js";
19
19
  import "./chunk-COY6PUD2.js";
20
20
  export {
21
21
  accordion,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sibujs",
3
- "version": "3.3.0",
3
+ "version": "3.3.2",
4
4
  "description": "A lightweight, function-based frontend framework that combines the best of React, Svelte, and Vue — with zero VDOM and maximum simplicity. Designed for developers who want fine-grained reactivity and full control without compilation or magic.",
5
5
  "keywords": [
6
6
  "frontend",
@@ -1,14 +0,0 @@
1
- // src/core/rendering/createId.ts
2
- var idCounter = 0;
3
- function createId(prefix = "sibu") {
4
- idCounter++;
5
- return `${prefix}-${idCounter}`;
6
- }
7
- function __resetIdCounter() {
8
- idCounter = 0;
9
- }
10
-
11
- export {
12
- createId,
13
- __resetIdCounter
14
- };