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/motion.cjs CHANGED
@@ -303,8 +303,9 @@ function devWarn(message) {
303
303
  }
304
304
  }
305
305
 
306
- // src/reactivity/track.ts
306
+ // src/reactivity/track-core.ts
307
307
  var _isDev2 = isDev();
308
+ var POOL_MAX = 4096;
308
309
  var nodePool = [];
309
310
  function createNode() {
310
311
  return {
@@ -332,6 +333,16 @@ function allocNode(sig, sub, epoch) {
332
333
  fresh.epoch = epoch;
333
334
  return fresh;
334
335
  }
336
+ function freeNode(node) {
337
+ node.sig = null;
338
+ node.sub = null;
339
+ node.sigPrev = null;
340
+ node.sigNext = null;
341
+ node.subPrev = null;
342
+ node.subNext = null;
343
+ node.prevActive = null;
344
+ if (nodePool.length < POOL_MAX) nodePool.push(node);
345
+ }
335
346
  function linkSignal(sig, node) {
336
347
  const oldHead = sig.subsHead ?? null;
337
348
  node.sigPrev = null;
@@ -341,6 +352,22 @@ function linkSignal(sig, node) {
341
352
  sig.subsHead = node;
342
353
  sig.__sc = (sig.__sc ?? 0) + 1;
343
354
  }
355
+ function unlinkSignal(node) {
356
+ const sig = node.sig;
357
+ if (!sig) return;
358
+ const prev = node.sigPrev;
359
+ const next = node.sigNext;
360
+ if (prev) prev.sigNext = next;
361
+ else sig.subsHead = next;
362
+ if (next) next.sigPrev = prev;
363
+ else sig.subsTail = prev;
364
+ sig.__sc = (sig.__sc ?? 1) - 1;
365
+ if (sig.__activeNode === node) sig.__activeNode = node.prevActive;
366
+ if (sig.__sc === 0) {
367
+ sig.subsHead = null;
368
+ sig.subsTail = null;
369
+ }
370
+ }
344
371
  function linkSub(sub, node) {
345
372
  const oldTail = sub.depsTail ?? null;
346
373
  node.subPrev = oldTail;
@@ -349,7 +376,18 @@ function linkSub(sub, node) {
349
376
  else sub.depsHead = node;
350
377
  sub.depsTail = node;
351
378
  }
379
+ function unlinkSub(node) {
380
+ const sub = node.sub;
381
+ if (!sub) return;
382
+ const prev = node.subPrev;
383
+ const next = node.subNext;
384
+ if (prev) prev.subNext = next;
385
+ else sub.depsHead = next;
386
+ if (next) next.subPrev = prev;
387
+ else sub.depsTail = prev;
388
+ }
352
389
  var currentSubscriber = null;
390
+ var suspendSavedSub = null;
353
391
  var notifyDepth = 0;
354
392
  var pendingQueue = [];
355
393
  var pendingSet = /* @__PURE__ */ new Set();
@@ -361,6 +399,112 @@ function safeInvoke(sub) {
361
399
  if (_isDev2) devWarn(`Subscriber threw during notification: ${err instanceof Error ? err.message : String(err)}`);
362
400
  }
363
401
  }
402
+ var suspendDepth = 0;
403
+ var trackingSuspended = false;
404
+ function suspendTracking() {
405
+ if (suspendDepth === 0) {
406
+ suspendSavedSub = currentSubscriber;
407
+ currentSubscriber = null;
408
+ trackingSuspended = true;
409
+ }
410
+ suspendDepth++;
411
+ }
412
+ function resumeTracking() {
413
+ suspendDepth--;
414
+ if (suspendDepth === 0) {
415
+ currentSubscriber = suspendSavedSub;
416
+ suspendSavedSub = null;
417
+ trackingSuspended = false;
418
+ }
419
+ }
420
+ function isTrackingSuspended() {
421
+ return trackingSuspended;
422
+ }
423
+ function untracked(fn) {
424
+ suspendTracking();
425
+ try {
426
+ return fn();
427
+ } finally {
428
+ resumeTracking();
429
+ }
430
+ }
431
+ var subscriberEpochCounter = 0;
432
+ function retrack(effectFn, subscriber) {
433
+ const prev = currentSubscriber;
434
+ currentSubscriber = subscriber;
435
+ const sub = subscriber;
436
+ const epoch = ++subscriberEpochCounter;
437
+ sub._epoch = epoch;
438
+ sub._structDirty = false;
439
+ for (let n = sub.depsHead ?? null; n !== null; n = n.subNext) {
440
+ const sig = n.sig;
441
+ n.prevActive = sig.__activeNode ?? null;
442
+ sig.__activeNode = n;
443
+ }
444
+ try {
445
+ effectFn();
446
+ } finally {
447
+ currentSubscriber = prev;
448
+ let node = sub.depsHead ?? null;
449
+ while (node !== null) {
450
+ const next = node.subNext;
451
+ const sig = node.sig;
452
+ sig.__activeNode = node.prevActive;
453
+ node.prevActive = null;
454
+ if (node.epoch !== epoch) {
455
+ unlinkSub(node);
456
+ unlinkSignal(node);
457
+ freeNode(node);
458
+ }
459
+ node = next;
460
+ }
461
+ }
462
+ }
463
+ function track(effectFn, subscriber) {
464
+ if (!subscriber) return reactiveBinding(effectFn);
465
+ cleanup(subscriber);
466
+ const prev = currentSubscriber;
467
+ currentSubscriber = subscriber;
468
+ try {
469
+ effectFn();
470
+ } finally {
471
+ currentSubscriber = prev;
472
+ const sub2 = subscriber;
473
+ for (let n = sub2.depsHead ?? null; n !== null; n = n.subNext) {
474
+ const sig = n.sig;
475
+ sig.__activeNode = n.prevActive;
476
+ n.prevActive = null;
477
+ }
478
+ }
479
+ const sub = subscriber;
480
+ return sub._dispose ?? (sub._dispose = () => cleanup(subscriber));
481
+ }
482
+ function reactiveBinding(commit) {
483
+ const run = () => {
484
+ const s = subscriber;
485
+ if (s._disposed || s._reentrant) return;
486
+ s._reentrant = true;
487
+ try {
488
+ retrack(commit, subscriber);
489
+ } finally {
490
+ s._reentrant = false;
491
+ }
492
+ };
493
+ const subscriber = run;
494
+ subscriber.depsHead = null;
495
+ subscriber.depsTail = null;
496
+ subscriber._epoch = 0;
497
+ subscriber._structDirty = false;
498
+ subscriber._runEpoch = 0;
499
+ subscriber._runs = 0;
500
+ subscriber._reentrant = false;
501
+ subscriber._disposed = false;
502
+ run();
503
+ return subscriber._dispose ?? (subscriber._dispose = () => {
504
+ subscriber._disposed = true;
505
+ cleanup(subscriber);
506
+ });
507
+ }
364
508
  function recordDependency(signal2) {
365
509
  if (!currentSubscriber) return;
366
510
  const sub = currentSubscriber;
@@ -378,9 +522,31 @@ function recordDependency(signal2) {
378
522
  linkSignal(sig, node);
379
523
  sub._structDirty = true;
380
524
  }
525
+ function cleanup(subscriber) {
526
+ const sub = subscriber;
527
+ let node = sub.depsHead ?? null;
528
+ sub.depsHead = null;
529
+ sub.depsTail = null;
530
+ while (node) {
531
+ const next = node.subNext;
532
+ unlinkSignal(node);
533
+ freeNode(node);
534
+ node = next;
535
+ }
536
+ }
381
537
  var maxSubscriberRepeats = 50;
382
538
  var maxDrainIterations = 1e6;
383
539
  var drainEpoch = 0;
540
+ function setMaxSubscriberRepeats(n) {
541
+ const prev = maxSubscriberRepeats;
542
+ if (Number.isFinite(n) && n > 0) maxSubscriberRepeats = Math.floor(n);
543
+ return prev;
544
+ }
545
+ function setMaxDrainIterations(n) {
546
+ const prev = maxDrainIterations;
547
+ if (Number.isFinite(n) && n > 0) maxDrainIterations = Math.floor(n);
548
+ return prev;
549
+ }
384
550
  function tickRepeat(sub) {
385
551
  const s = sub;
386
552
  if (s._runEpoch !== drainEpoch) {
@@ -422,6 +588,20 @@ function drainQueue() {
422
588
  safeInvoke(sub);
423
589
  }
424
590
  }
591
+ function drainNotificationQueue() {
592
+ if (notifyDepth > 0) return;
593
+ notifyDepth++;
594
+ drainEpoch++;
595
+ try {
596
+ drainQueue();
597
+ } finally {
598
+ notifyDepth--;
599
+ if (notifyDepth === 0) {
600
+ pendingQueue.length = 0;
601
+ pendingSet.clear();
602
+ }
603
+ }
604
+ }
425
605
  function propagateDirty(sub) {
426
606
  sub();
427
607
  const rootSig = sub._sig;
@@ -454,6 +634,22 @@ function propagateDirty(sub) {
454
634
  }
455
635
  }
456
636
  }
637
+ function queueSignalNotification(signal2) {
638
+ const sig = signal2;
639
+ let node = sig.subsHead ?? null;
640
+ while (node) {
641
+ const s = node.sub;
642
+ if (s) {
643
+ if (s._c) {
644
+ propagateDirty(s);
645
+ } else if (!pendingSet.has(s)) {
646
+ pendingSet.add(s);
647
+ pendingQueue.push(s);
648
+ }
649
+ }
650
+ node = node.sigNext;
651
+ }
652
+ }
457
653
  function notifySubscribers(signal2) {
458
654
  const sig = signal2;
459
655
  const head = sig.subsHead;
@@ -499,19 +695,139 @@ function notifySubscribers(signal2) {
499
695
  }
500
696
  }
501
697
  }
698
+ function getSubscriberCount(signal2) {
699
+ return signal2.__sc ?? 0;
700
+ }
701
+ function getSubscriberDeps(subscriber) {
702
+ const sub = subscriber;
703
+ const out = [];
704
+ let node = sub.depsHead ?? null;
705
+ while (node) {
706
+ if (node.sig) out.push(node.sig);
707
+ node = node.subNext;
708
+ }
709
+ return out;
710
+ }
711
+ function forEachSubscriber(signal2, visit) {
712
+ let node = signal2.subsHead ?? null;
713
+ while (node) {
714
+ const s = node.sub;
715
+ if (s) visit(s);
716
+ node = node.sigNext;
717
+ }
718
+ }
719
+
720
+ // src/reactivity/track.ts
721
+ var _isDev3 = isDev();
722
+ var _runtimeVersion = true ? "3.3.2" : "dev";
723
+ var REGISTRY_KEY = /* @__PURE__ */ Symbol.for("sibujs.reactive.v1");
724
+ function resolveReactiveApi() {
725
+ const g = globalThis;
726
+ const existing = g[REGISTRY_KEY];
727
+ if (existing) {
728
+ if (_isDev3 && !existing.__dupWarned) {
729
+ existing.__dupWarned = true;
730
+ devWarn(
731
+ `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']).`
732
+ );
733
+ }
734
+ return existing;
735
+ }
736
+ const local = {
737
+ suspendTracking,
738
+ resumeTracking,
739
+ isTrackingSuspended,
740
+ untracked,
741
+ retrack,
742
+ track,
743
+ reactiveBinding,
744
+ recordDependency,
745
+ cleanup,
746
+ setMaxSubscriberRepeats,
747
+ setMaxDrainIterations,
748
+ drainNotificationQueue,
749
+ queueSignalNotification,
750
+ notifySubscribers,
751
+ getSubscriberCount,
752
+ getSubscriberDeps,
753
+ forEachSubscriber,
754
+ version: _runtimeVersion
755
+ };
756
+ g[REGISTRY_KEY] = local;
757
+ return local;
758
+ }
759
+ var API = resolveReactiveApi();
760
+ var suspendTracking2 = API.suspendTracking;
761
+ var resumeTracking2 = API.resumeTracking;
762
+ var isTrackingSuspended2 = API.isTrackingSuspended;
763
+ var untracked2 = API.untracked;
764
+ var retrack2 = API.retrack;
765
+ var track2 = API.track;
766
+ var reactiveBinding2 = API.reactiveBinding;
767
+ var recordDependency2 = API.recordDependency;
768
+ var cleanup2 = API.cleanup;
769
+ var setMaxSubscriberRepeats2 = API.setMaxSubscriberRepeats;
770
+ var setMaxDrainIterations2 = API.setMaxDrainIterations;
771
+ var drainNotificationQueue2 = API.drainNotificationQueue;
772
+ var queueSignalNotification2 = API.queueSignalNotification;
773
+ var notifySubscribers2 = API.notifySubscribers;
774
+ var getSubscriberCount2 = API.getSubscriberCount;
775
+ var getSubscriberDeps2 = API.getSubscriberDeps;
776
+ var forEachSubscriber2 = API.forEachSubscriber;
502
777
 
503
778
  // src/reactivity/batch.ts
504
779
  var batchDepth = 0;
505
780
  var pendingSignals = /* @__PURE__ */ new Set();
506
- function enqueueBatchedSignal(signal2) {
781
+ function batchImpl(fn) {
782
+ batchDepth++;
783
+ try {
784
+ return fn();
785
+ } finally {
786
+ batchDepth--;
787
+ if (batchDepth === 0) {
788
+ flushBatch();
789
+ }
790
+ }
791
+ }
792
+ function enqueueBatchedSignalImpl(signal2) {
507
793
  if (batchDepth === 0) return false;
508
794
  pendingSignals.add(signal2);
509
795
  return true;
510
796
  }
797
+ function isBatchingImpl() {
798
+ return batchDepth > 0;
799
+ }
800
+ function flushBatch() {
801
+ try {
802
+ for (const signal2 of pendingSignals) {
803
+ queueSignalNotification2(signal2);
804
+ }
805
+ } finally {
806
+ pendingSignals.clear();
807
+ }
808
+ drainNotificationQueue2();
809
+ }
810
+ var BATCH_REGISTRY_KEY = /* @__PURE__ */ Symbol.for("sibujs.reactive.batch.v1");
811
+ function resolveBatchApi() {
812
+ const g = globalThis;
813
+ const existing = g[BATCH_REGISTRY_KEY];
814
+ if (existing) return existing;
815
+ const local = {
816
+ batch: batchImpl,
817
+ enqueueBatchedSignal: enqueueBatchedSignalImpl,
818
+ isBatching: isBatchingImpl
819
+ };
820
+ g[BATCH_REGISTRY_KEY] = local;
821
+ return local;
822
+ }
823
+ var API2 = resolveBatchApi();
824
+ var batch = API2.batch;
825
+ var enqueueBatchedSignal = API2.enqueueBatchedSignal;
826
+ var isBatching = API2.isBatching;
511
827
 
512
828
  // src/core/signals/signal.ts
513
829
  var _g = globalThis;
514
- var _isDev3 = isDev();
830
+ var _isDev4 = isDev();
515
831
  function signal(initial, options) {
516
832
  const state = {
517
833
  value: initial,
@@ -522,11 +838,11 @@ function signal(initial, options) {
522
838
  __activeNode: null,
523
839
  __name: void 0
524
840
  };
525
- const debugName = _isDev3 ? options?.name : void 0;
841
+ const debugName = _isDev4 ? options?.name : void 0;
526
842
  const equalsFn = options?.equals;
527
843
  if (debugName) state.__name = debugName;
528
844
  function get() {
529
- recordDependency(state);
845
+ recordDependency2(state);
530
846
  return state.value;
531
847
  }
532
848
  get.__signal = state;
@@ -539,15 +855,15 @@ function signal(initial, options) {
539
855
  if (equalsFn(prev, newValue)) return;
540
856
  state.value = newValue;
541
857
  state.__v++;
542
- if (_isDev3) {
858
+ if (_isDev4) {
543
859
  const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
544
860
  if (hook) hook.emit("signal:update", { signal: state, name: debugName, oldValue: prev, newValue });
545
861
  }
546
862
  if (!enqueueBatchedSignal(state)) {
547
- notifySubscribers(state);
863
+ notifySubscribers2(state);
548
864
  }
549
865
  };
550
- } else if (_isDev3) {
866
+ } else if (_isDev4) {
551
867
  set = (next) => {
552
868
  const prev = state.value;
553
869
  const newValue = typeof next === "function" ? next(prev) : next;
@@ -557,7 +873,7 @@ function signal(initial, options) {
557
873
  const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
558
874
  if (hook) hook.emit("signal:update", { signal: state, name: debugName, oldValue: prev, newValue });
559
875
  if (!enqueueBatchedSignal(state)) {
560
- notifySubscribers(state);
876
+ notifySubscribers2(state);
561
877
  }
562
878
  };
563
879
  } else {
@@ -568,11 +884,11 @@ function signal(initial, options) {
568
884
  state.value = newValue;
569
885
  state.__v++;
570
886
  if (!enqueueBatchedSignal(state)) {
571
- notifySubscribers(state);
887
+ notifySubscribers2(state);
572
888
  }
573
889
  };
574
890
  }
575
- if (_isDev3) {
891
+ if (_isDev4) {
576
892
  const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
577
893
  if (hook) hook.emit("signal:create", { signal: state, name: debugName, getter: get, initial });
578
894
  }
@@ -595,7 +911,7 @@ function TransitionGroup(options) {
595
911
  }
596
912
  setElements((prev) => prev.filter((e) => e !== el));
597
913
  }
598
- function track(newElements) {
914
+ function track3(newElements) {
599
915
  const oldPositions = /* @__PURE__ */ new Map();
600
916
  for (const el of elements()) {
601
917
  if (typeof el.getBoundingClientRect === "function") {
@@ -637,7 +953,7 @@ function TransitionGroup(options) {
637
953
  }
638
954
  }
639
955
  }
640
- return { add, remove, track };
956
+ return { add, remove, track: track3 };
641
957
  }
642
958
 
643
959
  // src/ui/viewTransition.ts
package/dist/motion.js CHANGED
@@ -19,9 +19,9 @@ import {
19
19
  stagger,
20
20
  transition,
21
21
  viewTransition
22
- } from "./chunk-XQ7XSGYP.js";
23
- import "./chunk-5K72I3UQ.js";
24
- import "./chunk-X3NHE2DK.js";
22
+ } from "./chunk-IQJ36UTJ.js";
23
+ import "./chunk-JCQG2I2G.js";
24
+ import "./chunk-4NJEAPLI.js";
25
25
  import "./chunk-COY6PUD2.js";
26
26
  export {
27
27
  TransitionGroup,