sibujs 1.0.9 → 1.2.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 (62) hide show
  1. package/dist/browser.cjs +1 -1
  2. package/dist/browser.js +4 -4
  3. package/dist/build.cjs +53 -18
  4. package/dist/build.js +17 -10
  5. package/dist/cdn.global.js +6 -6
  6. package/dist/chunk-23VV7YD3.js +107 -0
  7. package/dist/chunk-3ARAQO7B.js +398 -0
  8. package/dist/chunk-6SA3QQES.js +61 -0
  9. package/dist/chunk-7BF6TK55.js +1097 -0
  10. package/dist/chunk-B7SWRFUT.js +332 -0
  11. package/dist/chunk-BW3WT46K.js +937 -0
  12. package/dist/chunk-C6KFWOFV.js +616 -0
  13. package/dist/chunk-EVCZO745.js +365 -0
  14. package/dist/chunk-GCOK2LC3.js +282 -0
  15. package/dist/chunk-L6JRBDNS.js +60 -0
  16. package/dist/chunk-LA6KQEDU.js +712 -0
  17. package/dist/chunk-MK4ERFYL.js +2249 -0
  18. package/dist/chunk-NHUC2QWH.js +282 -0
  19. package/dist/chunk-OUZZEE4S.js +365 -0
  20. package/dist/chunk-P6W3STU4.js +2249 -0
  21. package/dist/chunk-RQGQSLQK.js +725 -0
  22. package/dist/chunk-TNQWPPE6.js +37 -0
  23. package/dist/chunk-UNXCEF6S.js +21 -0
  24. package/dist/chunk-V2XTI523.js +347 -0
  25. package/dist/chunk-VMVDTCXB.js +712 -0
  26. package/dist/chunk-WADYRCO2.js +304 -0
  27. package/dist/chunk-WILQZRO4.js +282 -0
  28. package/dist/chunk-WR5D4EGH.js +26 -0
  29. package/dist/chunk-WUHJISPP.js +298 -0
  30. package/dist/chunk-YUTWTI4B.js +654 -0
  31. package/dist/chunk-Z6POF5YC.js +975 -0
  32. package/dist/chunk-ZBJP6WFL.js +482 -0
  33. package/dist/data.cjs +1 -1
  34. package/dist/data.js +6 -6
  35. package/dist/devtools.cjs +1 -1
  36. package/dist/devtools.js +4 -4
  37. package/dist/ecosystem.cjs +46 -18
  38. package/dist/ecosystem.js +7 -7
  39. package/dist/extras.cjs +53 -19
  40. package/dist/extras.js +21 -21
  41. package/dist/index.cjs +46 -18
  42. package/dist/index.d.cts +24 -8
  43. package/dist/index.d.ts +24 -8
  44. package/dist/index.js +10 -10
  45. package/dist/motion.cjs +1 -1
  46. package/dist/motion.js +3 -3
  47. package/dist/patterns.cjs +8 -2
  48. package/dist/patterns.js +5 -5
  49. package/dist/performance.cjs +1 -1
  50. package/dist/performance.js +3 -3
  51. package/dist/plugins.cjs +46 -18
  52. package/dist/plugins.js +9 -9
  53. package/dist/ssr-3RXHP5ES.js +38 -0
  54. package/dist/ssr.cjs +46 -18
  55. package/dist/ssr.d.cts +9 -0
  56. package/dist/ssr.d.ts +9 -0
  57. package/dist/ssr.js +8 -8
  58. package/dist/ui.cjs +1 -1
  59. package/dist/ui.js +6 -6
  60. package/dist/widgets.cjs +1 -1
  61. package/dist/widgets.js +5 -5
  62. package/package.json +1 -1
package/dist/extras.cjs CHANGED
@@ -292,7 +292,7 @@ module.exports = __toCommonJS(extras_exports);
292
292
 
293
293
  // src/core/dev.ts
294
294
  function isDev() {
295
- return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : true;
295
+ return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
296
296
  }
297
297
  var _isDev = isDev();
298
298
  function devAssert(condition, message) {
@@ -2309,7 +2309,13 @@ function globalStore(config) {
2309
2309
  if (!actionFn) throw new Error(`Unknown action: ${String(action)}`);
2310
2310
  const execute = () => {
2311
2311
  const current = getState();
2312
- const patch = actionFn(current, payload);
2312
+ const rawPatch = actionFn(current, payload);
2313
+ const patch = {};
2314
+ for (const key of Object.keys(rawPatch)) {
2315
+ if (key !== "__proto__" && key !== "constructor" && key !== "prototype") {
2316
+ patch[key] = rawPatch[key];
2317
+ }
2318
+ }
2313
2319
  setState({ ...current, ...patch });
2314
2320
  const newState = getState();
2315
2321
  for (const listener of listeners) {
@@ -5094,11 +5100,11 @@ function bindChildNode(placeholder, getter) {
5094
5100
  if (_isDev6) devWarn(`bindChildNode: getter threw: ${err instanceof Error ? err.message : String(err)}`);
5095
5101
  return;
5096
5102
  }
5097
- for (let i2 = 0; i2 < lastNodes.length; i2++) {
5098
- const node = lastNodes[i2];
5099
- if (node.parentNode) node.parentNode.removeChild(node);
5100
- }
5101
5103
  if (result == null || typeof result === "boolean") {
5104
+ for (let i2 = 0; i2 < lastNodes.length; i2++) {
5105
+ const node = lastNodes[i2];
5106
+ if (node.parentNode) node.parentNode.removeChild(node);
5107
+ }
5102
5108
  lastNodes.length = 0;
5103
5109
  return;
5104
5110
  }
@@ -5107,24 +5113,46 @@ function bindChildNode(placeholder, getter) {
5107
5113
  lastNodes.length = 0;
5108
5114
  return;
5109
5115
  }
5110
- const anchor = placeholder.nextSibling;
5111
- let count = 0;
5116
+ let newNodes;
5112
5117
  if (Array.isArray(result)) {
5113
- if (lastNodes.length < result.length) lastNodes = new Array(result.length);
5118
+ newNodes = [];
5114
5119
  for (let i2 = 0; i2 < result.length; i2++) {
5115
5120
  const item = result[i2];
5116
5121
  if (item == null || typeof item === "boolean") continue;
5117
- const node = item instanceof Node ? item : document.createTextNode(String(item));
5118
- parent.insertBefore(node, anchor);
5119
- lastNodes[count++] = node;
5122
+ newNodes.push(item instanceof Node ? item : document.createTextNode(String(item)));
5120
5123
  }
5121
5124
  } else {
5122
- if (lastNodes.length < 1) lastNodes = [null];
5123
5125
  const node = result instanceof Node ? result : document.createTextNode(String(result));
5124
- parent.insertBefore(node, anchor);
5125
- lastNodes[count++] = node;
5126
+ newNodes = [node];
5127
+ }
5128
+ const reused = lastNodes.length > 0 && newNodes.length > 0 ? /* @__PURE__ */ new Set() : void 0;
5129
+ if (reused) {
5130
+ for (let i2 = 0; i2 < newNodes.length; i2++) {
5131
+ for (let j = 0; j < lastNodes.length; j++) {
5132
+ if (newNodes[i2] === lastNodes[j]) {
5133
+ reused.add(newNodes[i2]);
5134
+ break;
5135
+ }
5136
+ }
5137
+ }
5126
5138
  }
5127
- lastNodes.length = count;
5139
+ for (let i2 = 0; i2 < lastNodes.length; i2++) {
5140
+ const node = lastNodes[i2];
5141
+ if (reused?.has(node)) continue;
5142
+ if (node.parentNode) node.parentNode.removeChild(node);
5143
+ }
5144
+ const anchor = placeholder.nextSibling;
5145
+ for (let i2 = 0; i2 < newNodes.length; i2++) {
5146
+ const node = newNodes[i2];
5147
+ if (reused?.has(node) && node.parentNode === parent) {
5148
+ if (node.nextSibling !== anchor) {
5149
+ parent.insertBefore(node, anchor);
5150
+ }
5151
+ } else {
5152
+ parent.insertBefore(node, anchor);
5153
+ }
5154
+ }
5155
+ lastNodes = newNodes;
5128
5156
  }
5129
5157
  return track(commit);
5130
5158
  }
@@ -5315,12 +5343,18 @@ var tagFactory = (tag, ns) => (first, second) => {
5315
5343
  // already handled above / below
5316
5344
  default: {
5317
5345
  const value = props[key];
5318
- if (value == null || value === false) continue;
5346
+ if (value == null) continue;
5319
5347
  if (key[0] === "o" && key[1] === "n") continue;
5320
5348
  if (typeof value === "function") {
5321
5349
  registerDisposer(el, bindAttribute(el, key, value));
5322
- } else if (value === true) {
5323
- el.setAttribute(key, "");
5350
+ } else if (typeof value === "boolean") {
5351
+ if (key in el && (key === "checked" || key === "disabled" || key === "selected")) {
5352
+ el[key] = value;
5353
+ } else if (value) {
5354
+ el.setAttribute(key, "");
5355
+ } else {
5356
+ el.removeAttribute(key);
5357
+ }
5324
5358
  } else {
5325
5359
  const str = String(value);
5326
5360
  el.setAttribute(key, isUrlAttribute(key) ? sanitizeUrl(str) : str);
package/dist/extras.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  optimisticList,
9
9
  persisted,
10
10
  timeline
11
- } from "./chunk-Y6GP4QGG.js";
11
+ } from "./chunk-WILQZRO4.js";
12
12
  import {
13
13
  DOMPool,
14
14
  Features,
@@ -44,7 +44,7 @@ import {
44
44
  transitionState,
45
45
  uniqueId,
46
46
  yieldToMain
47
- } from "./chunk-HGMJFBC7.js";
47
+ } from "./chunk-YUTWTI4B.js";
48
48
  import {
49
49
  VERSION,
50
50
  bundlerMetadata,
@@ -65,7 +65,7 @@ import {
65
65
  preloadCritical,
66
66
  prerenderRoutes,
67
67
  satisfies
68
- } from "./chunk-OF7UZIVB.js";
68
+ } from "./chunk-RQGQSLQK.js";
69
69
  import {
70
70
  Head,
71
71
  clearWasmCache,
@@ -90,7 +90,7 @@ import {
90
90
  wasm,
91
91
  worker,
92
92
  workerFn
93
- } from "./chunk-7V26P53V.js";
93
+ } from "./chunk-VMVDTCXB.js";
94
94
  import {
95
95
  FocusTrap,
96
96
  VirtualList,
@@ -130,7 +130,7 @@ import {
130
130
  toast,
131
131
  withScopedStyle,
132
132
  zipMask
133
- } from "./chunk-6LSNVCS2.js";
133
+ } from "./chunk-BW3WT46K.js";
134
134
  import {
135
135
  RenderProp,
136
136
  assertType,
@@ -158,7 +158,7 @@ import {
158
158
  select,
159
159
  tabs,
160
160
  tooltip
161
- } from "./chunk-PBHF5WKN.js";
161
+ } from "./chunk-C6KFWOFV.js";
162
162
  import {
163
163
  collectStream,
164
164
  deserializeState,
@@ -176,7 +176,7 @@ import {
176
176
  ssrSuspense,
177
177
  suspenseSwapScript,
178
178
  trustHTML
179
- } from "./chunk-AZ3ISID5.js";
179
+ } from "./chunk-WUHJISPP.js";
180
180
  import {
181
181
  battery,
182
182
  clipboard,
@@ -193,7 +193,7 @@ import {
193
193
  resize,
194
194
  scroll,
195
195
  title
196
- } from "./chunk-4EI4AG32.js";
196
+ } from "./chunk-ZBJP6WFL.js";
197
197
  import {
198
198
  calculateDelay,
199
199
  clearQueryCache,
@@ -215,7 +215,7 @@ import {
215
215
  syncAdapter,
216
216
  throttle,
217
217
  withRetry
218
- } from "./chunk-QBMDLBU2.js";
218
+ } from "./chunk-Z6POF5YC.js";
219
219
  import {
220
220
  SibuError,
221
221
  checkLeaks,
@@ -251,7 +251,7 @@ import {
251
251
  trackCleanup,
252
252
  walkDependencyGraph,
253
253
  withErrorTracking
254
- } from "./chunk-NMRUZALC.js";
254
+ } from "./chunk-7BF6TK55.js";
255
255
  import {
256
256
  antdAdapter,
257
257
  chakraAdapter,
@@ -261,7 +261,7 @@ import {
261
261
  mobXAdapter,
262
262
  reduxAdapter,
263
263
  zustandAdapter
264
- } from "./chunk-G3BOQPVO.js";
264
+ } from "./chunk-OUZZEE4S.js";
265
265
  import {
266
266
  createPlugin,
267
267
  inject,
@@ -271,13 +271,13 @@ import {
271
271
  triggerPluginMount,
272
272
  triggerPluginUnmount
273
273
  } from "./chunk-K5ZUMYVS.js";
274
- import "./chunk-EWFVA3TJ.js";
275
- import "./chunk-CZUGLNJS.js";
276
- import "./chunk-Z65KYU7I.js";
277
- import "./chunk-MDVXJWFN.js";
278
- import "./chunk-SDLZDHKP.js";
279
- import "./chunk-FGOEVHY3.js";
280
- import "./chunk-PZEGYCF5.js";
274
+ import "./chunk-GCOK2LC3.js";
275
+ import "./chunk-TNQWPPE6.js";
276
+ import "./chunk-WR5D4EGH.js";
277
+ import "./chunk-B7SWRFUT.js";
278
+ import "./chunk-23VV7YD3.js";
279
+ import "./chunk-L6JRBDNS.js";
280
+ import "./chunk-6SA3QQES.js";
281
281
  import "./chunk-CHJ27IGK.js";
282
282
  import {
283
283
  TransitionGroup,
@@ -300,9 +300,9 @@ import {
300
300
  stagger,
301
301
  transition,
302
302
  viewTransition
303
- } from "./chunk-6HLLIF3K.js";
304
- import "./chunk-YECR7UIA.js";
305
- import "./chunk-4MYMUBRS.js";
303
+ } from "./chunk-3ARAQO7B.js";
304
+ import "./chunk-V2XTI523.js";
305
+ import "./chunk-UNXCEF6S.js";
306
306
  import "./chunk-MLKGABMK.js";
307
307
  export {
308
308
  DOMPool,
package/dist/index.cjs CHANGED
@@ -220,7 +220,7 @@ module.exports = __toCommonJS(index_exports);
220
220
 
221
221
  // src/core/dev.ts
222
222
  function isDev() {
223
- return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : true;
223
+ return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
224
224
  }
225
225
  var _isDev = isDev();
226
226
  function devAssert(condition, message) {
@@ -601,11 +601,11 @@ function bindChildNode(placeholder, getter) {
601
601
  if (_isDev4) devWarn(`bindChildNode: getter threw: ${err instanceof Error ? err.message : String(err)}`);
602
602
  return;
603
603
  }
604
- for (let i2 = 0; i2 < lastNodes.length; i2++) {
605
- const node = lastNodes[i2];
606
- if (node.parentNode) node.parentNode.removeChild(node);
607
- }
608
604
  if (result == null || typeof result === "boolean") {
605
+ for (let i2 = 0; i2 < lastNodes.length; i2++) {
606
+ const node = lastNodes[i2];
607
+ if (node.parentNode) node.parentNode.removeChild(node);
608
+ }
609
609
  lastNodes.length = 0;
610
610
  return;
611
611
  }
@@ -614,24 +614,46 @@ function bindChildNode(placeholder, getter) {
614
614
  lastNodes.length = 0;
615
615
  return;
616
616
  }
617
- const anchor = placeholder.nextSibling;
618
- let count = 0;
617
+ let newNodes;
619
618
  if (Array.isArray(result)) {
620
- if (lastNodes.length < result.length) lastNodes = new Array(result.length);
619
+ newNodes = [];
621
620
  for (let i2 = 0; i2 < result.length; i2++) {
622
621
  const item = result[i2];
623
622
  if (item == null || typeof item === "boolean") continue;
624
- const node = item instanceof Node ? item : document.createTextNode(String(item));
625
- parent.insertBefore(node, anchor);
626
- lastNodes[count++] = node;
623
+ newNodes.push(item instanceof Node ? item : document.createTextNode(String(item)));
627
624
  }
628
625
  } else {
629
- if (lastNodes.length < 1) lastNodes = [null];
630
626
  const node = result instanceof Node ? result : document.createTextNode(String(result));
631
- parent.insertBefore(node, anchor);
632
- lastNodes[count++] = node;
627
+ newNodes = [node];
628
+ }
629
+ const reused = lastNodes.length > 0 && newNodes.length > 0 ? /* @__PURE__ */ new Set() : void 0;
630
+ if (reused) {
631
+ for (let i2 = 0; i2 < newNodes.length; i2++) {
632
+ for (let j = 0; j < lastNodes.length; j++) {
633
+ if (newNodes[i2] === lastNodes[j]) {
634
+ reused.add(newNodes[i2]);
635
+ break;
636
+ }
637
+ }
638
+ }
639
+ }
640
+ for (let i2 = 0; i2 < lastNodes.length; i2++) {
641
+ const node = lastNodes[i2];
642
+ if (reused?.has(node)) continue;
643
+ if (node.parentNode) node.parentNode.removeChild(node);
633
644
  }
634
- lastNodes.length = count;
645
+ const anchor = placeholder.nextSibling;
646
+ for (let i2 = 0; i2 < newNodes.length; i2++) {
647
+ const node = newNodes[i2];
648
+ if (reused?.has(node) && node.parentNode === parent) {
649
+ if (node.nextSibling !== anchor) {
650
+ parent.insertBefore(node, anchor);
651
+ }
652
+ } else {
653
+ parent.insertBefore(node, anchor);
654
+ }
655
+ }
656
+ lastNodes = newNodes;
635
657
  }
636
658
  return track(commit);
637
659
  }
@@ -852,12 +874,18 @@ var tagFactory = (tag, ns) => (first, second) => {
852
874
  // already handled above / below
853
875
  default: {
854
876
  const value = props[key];
855
- if (value == null || value === false) continue;
877
+ if (value == null) continue;
856
878
  if (key[0] === "o" && key[1] === "n") continue;
857
879
  if (typeof value === "function") {
858
880
  registerDisposer(el, bindAttribute(el, key, value));
859
- } else if (value === true) {
860
- el.setAttribute(key, "");
881
+ } else if (typeof value === "boolean") {
882
+ if (key in el && (key === "checked" || key === "disabled" || key === "selected")) {
883
+ el[key] = value;
884
+ } else if (value) {
885
+ el.setAttribute(key, "");
886
+ } else {
887
+ el.removeAttribute(key);
888
+ }
861
889
  } else {
862
890
  const str = String(value);
863
891
  el.setAttribute(key, isUrlAttribute(key) ? sanitizeUrl(str) : str);
package/dist/index.d.cts CHANGED
@@ -514,8 +514,24 @@ declare function dispose(node: Node): void;
514
514
  */
515
515
  declare function checkLeaks(warnThreshold?: number): number;
516
516
 
517
+ declare const __accessor: unique symbol;
518
+ /**
519
+ * A reactive signal getter returned by signal(), derived(), memo(), and similar primitives.
520
+ *
521
+ * Pass an Accessor directly into reactive prop positions — never call it there:
522
+ * ```ts
523
+ * const [count, setCount] = signal(0);
524
+ *
525
+ * div({ nodes: count }) // ✓ reactive — Accessor passed directly
526
+ * div({ nodes: () => count() }) // ✓ reactive — explicit arrow wrapper
527
+ * div({ nodes: count() }) // ✗ static — evaluated once, not reactive
528
+ * ```
529
+ */
530
+ type Accessor<T> = (() => T) & {
531
+ readonly [__accessor]?: never;
532
+ };
517
533
  type SetState<T> = (next: T | ((prev: T) => T)) => void;
518
- type StateTuple<T> = [() => T, SetState<T>];
534
+ type StateTuple<T> = [Accessor<T>, SetState<T>];
519
535
  /** Options for signal */
520
536
  interface SignalOptions<T = unknown> {
521
537
  /** Debug name for devtools inspection. Only used in development. */
@@ -579,7 +595,7 @@ declare function effect(effectFn: () => void, options?: EffectOptions): () => vo
579
595
  */
580
596
  declare function derived<T>(getter: () => T, options?: {
581
597
  name?: string;
582
- }): () => T;
598
+ }): Accessor<T>;
583
599
 
584
600
  /**
585
601
  * Watches a reactive getter and calls callback with (newValue, oldValue) when it changes.
@@ -663,7 +679,7 @@ declare function ref<T = undefined>(): Ref<T | undefined>;
663
679
  * @param factory Function that computes the memoized value
664
680
  * @returns Getter function that returns the memoized value
665
681
  */
666
- declare function memo<T>(factory: () => T): () => T;
682
+ declare function memo<T>(factory: () => T): Accessor<T>;
667
683
 
668
684
  /**
669
685
  * memoFn returns a memoized callback function that only updates
@@ -673,7 +689,7 @@ declare function memo<T>(factory: () => T): () => T;
673
689
  * @param callback The callback function to memoize
674
690
  * @returns Getter that returns the current memoized callback
675
691
  */
676
- declare function memoFn<T extends (...args: any[]) => any>(callback: () => T): () => T;
692
+ declare function memoFn<T extends (...args: any[]) => any>(callback: () => T): Accessor<T>;
677
693
 
678
694
  /**
679
695
  * Reactive array hook. Provides common array operations that
@@ -722,7 +738,7 @@ interface ArrayActions<T> {
722
738
  /** Clear all items */
723
739
  clear(): void;
724
740
  }
725
- declare function array<T>(initial?: T[]): [() => T[], ArrayActions<T>];
741
+ declare function array<T>(initial?: T[]): [Accessor<T[]>, ArrayActions<T>];
726
742
  /**
727
743
  * Optimized reactive array hook. Uses in-place mutations with a version
728
744
  * counter to avoid full array copies on every operation.
@@ -745,7 +761,7 @@ declare function array<T>(initial?: T[]): [() => T[], ArrayActions<T>];
745
761
  * clear(); // []
746
762
  * ```
747
763
  */
748
- declare function reactiveArray<T>(initial?: T[]): [() => readonly T[], ArrayActions<T>];
764
+ declare function reactiveArray<T>(initial?: T[]): [Accessor<readonly T[]>, ArrayActions<T>];
749
765
 
750
766
  /**
751
767
  * Deep equality comparison for objects and arrays.
@@ -805,7 +821,7 @@ declare function deepSignal<T>(initial: T): [() => T, (next: T | ((prev: T) => T
805
821
  */
806
822
  declare function writable<T>(get: () => T, set: (value: T) => void, options?: {
807
823
  name?: string;
808
- }): [() => T, (value: T) => void];
824
+ }): [Accessor<T>, (value: T) => void];
809
825
 
810
826
  /**
811
827
  * Lifecycle hooks for SibuJS components.
@@ -1087,4 +1103,4 @@ interface LoadingProps {
1087
1103
  */
1088
1104
  declare function Loading(props?: LoadingProps): HTMLElement;
1089
1105
 
1090
- export { type ActionFn, type ArrayActions, type Context, DynamicComponent, type EffectOptions, ErrorBoundary, type ErrorBoundaryProps, Fragment, KeepAlive, type KeepAliveOptions, Loading, type LoadingProps, type LongPressOptions, NodeChild, NodeChildren, Portal, type Ref, type SignalOptions, type SlotFn, type Slots, type StoreActions, Suspense, type SuspenseProps, TagProps, a, abbr, action, address, area, array, article, aside, audio, autoResize, b, base, batch, bdi, bdo, bindDynamic, blockquote, body, br, button, canvas, caption, catchError, catchErrorAsync, center, checkLeaks, circle, cite, clickOutside, clipPath, code, col, colgroup, context, copyOnClick, customElement, data, datalist, dd, deepEqual, deepSignal, defs, del, derived, details, dfn, dialog, disableSSR, dispose, div, dl, dt, each, effect, ellipse, em, embed, enableSSR, enqueueBatchedSignal, fieldset, figcaption, figure, font, footer, form, g, getSlot, h1, h2, h3, h4, h5, h6, head, header, hr, html, i, iframe, img, input, ins, isBatching, isSSR, kbd, label, lazy, legend, li, line, linearGradient, link, longPress, main, map, mark, marker, marquee, mask, match, math, memo, memoFn, menu, meta, meter, mount, nav, noscript, object, ol, on, onCleanup, onMount, onUnmount, optgroup, option, output, p, param, path, pattern, picture, polygon, polyline, portal, pre, progress, q, radialGradient, reactiveArray, rect, ref, registerComponent, registerDisposer, resolveComponent, rp, rt, ruby, s, samp, script, section, select, setGlobalErrorHandler, show, signal, slot, small, source, span, stop, store, strong, style, sub, summary, sup, svg, symbol, table, tbody, td, template, text, textarea, tfoot, th, thead, time, title, tr, track, trapFocus, tspan, u, ul, unregisterComponent, untracked, use, var_, video, watch, when, withSSR, writable };
1106
+ export { type Accessor, type ActionFn, type ArrayActions, type Context, DynamicComponent, type EffectOptions, ErrorBoundary, type ErrorBoundaryProps, Fragment, KeepAlive, type KeepAliveOptions, Loading, type LoadingProps, type LongPressOptions, NodeChild, NodeChildren, Portal, type Ref, type SignalOptions, type SlotFn, type Slots, type StoreActions, Suspense, type SuspenseProps, TagProps, a, abbr, action, address, area, array, article, aside, audio, autoResize, b, base, batch, bdi, bdo, bindDynamic, blockquote, body, br, button, canvas, caption, catchError, catchErrorAsync, center, checkLeaks, circle, cite, clickOutside, clipPath, code, col, colgroup, context, copyOnClick, customElement, data, datalist, dd, deepEqual, deepSignal, defs, del, derived, details, dfn, dialog, disableSSR, dispose, div, dl, dt, each, effect, ellipse, em, embed, enableSSR, enqueueBatchedSignal, fieldset, figcaption, figure, font, footer, form, g, getSlot, h1, h2, h3, h4, h5, h6, head, header, hr, html, i, iframe, img, input, ins, isBatching, isSSR, kbd, label, lazy, legend, li, line, linearGradient, link, longPress, main, map, mark, marker, marquee, mask, match, math, memo, memoFn, menu, meta, meter, mount, nav, noscript, object, ol, on, onCleanup, onMount, onUnmount, optgroup, option, output, p, param, path, pattern, picture, polygon, polyline, portal, pre, progress, q, radialGradient, reactiveArray, rect, ref, registerComponent, registerDisposer, resolveComponent, rp, rt, ruby, s, samp, script, section, select, setGlobalErrorHandler, show, signal, slot, small, source, span, stop, store, strong, style, sub, summary, sup, svg, symbol, table, tbody, td, template, text, textarea, tfoot, th, thead, time, title, tr, track, trapFocus, tspan, u, ul, unregisterComponent, untracked, use, var_, video, watch, when, withSSR, writable };
package/dist/index.d.ts CHANGED
@@ -514,8 +514,24 @@ declare function dispose(node: Node): void;
514
514
  */
515
515
  declare function checkLeaks(warnThreshold?: number): number;
516
516
 
517
+ declare const __accessor: unique symbol;
518
+ /**
519
+ * A reactive signal getter returned by signal(), derived(), memo(), and similar primitives.
520
+ *
521
+ * Pass an Accessor directly into reactive prop positions — never call it there:
522
+ * ```ts
523
+ * const [count, setCount] = signal(0);
524
+ *
525
+ * div({ nodes: count }) // ✓ reactive — Accessor passed directly
526
+ * div({ nodes: () => count() }) // ✓ reactive — explicit arrow wrapper
527
+ * div({ nodes: count() }) // ✗ static — evaluated once, not reactive
528
+ * ```
529
+ */
530
+ type Accessor<T> = (() => T) & {
531
+ readonly [__accessor]?: never;
532
+ };
517
533
  type SetState<T> = (next: T | ((prev: T) => T)) => void;
518
- type StateTuple<T> = [() => T, SetState<T>];
534
+ type StateTuple<T> = [Accessor<T>, SetState<T>];
519
535
  /** Options for signal */
520
536
  interface SignalOptions<T = unknown> {
521
537
  /** Debug name for devtools inspection. Only used in development. */
@@ -579,7 +595,7 @@ declare function effect(effectFn: () => void, options?: EffectOptions): () => vo
579
595
  */
580
596
  declare function derived<T>(getter: () => T, options?: {
581
597
  name?: string;
582
- }): () => T;
598
+ }): Accessor<T>;
583
599
 
584
600
  /**
585
601
  * Watches a reactive getter and calls callback with (newValue, oldValue) when it changes.
@@ -663,7 +679,7 @@ declare function ref<T = undefined>(): Ref<T | undefined>;
663
679
  * @param factory Function that computes the memoized value
664
680
  * @returns Getter function that returns the memoized value
665
681
  */
666
- declare function memo<T>(factory: () => T): () => T;
682
+ declare function memo<T>(factory: () => T): Accessor<T>;
667
683
 
668
684
  /**
669
685
  * memoFn returns a memoized callback function that only updates
@@ -673,7 +689,7 @@ declare function memo<T>(factory: () => T): () => T;
673
689
  * @param callback The callback function to memoize
674
690
  * @returns Getter that returns the current memoized callback
675
691
  */
676
- declare function memoFn<T extends (...args: any[]) => any>(callback: () => T): () => T;
692
+ declare function memoFn<T extends (...args: any[]) => any>(callback: () => T): Accessor<T>;
677
693
 
678
694
  /**
679
695
  * Reactive array hook. Provides common array operations that
@@ -722,7 +738,7 @@ interface ArrayActions<T> {
722
738
  /** Clear all items */
723
739
  clear(): void;
724
740
  }
725
- declare function array<T>(initial?: T[]): [() => T[], ArrayActions<T>];
741
+ declare function array<T>(initial?: T[]): [Accessor<T[]>, ArrayActions<T>];
726
742
  /**
727
743
  * Optimized reactive array hook. Uses in-place mutations with a version
728
744
  * counter to avoid full array copies on every operation.
@@ -745,7 +761,7 @@ declare function array<T>(initial?: T[]): [() => T[], ArrayActions<T>];
745
761
  * clear(); // []
746
762
  * ```
747
763
  */
748
- declare function reactiveArray<T>(initial?: T[]): [() => readonly T[], ArrayActions<T>];
764
+ declare function reactiveArray<T>(initial?: T[]): [Accessor<readonly T[]>, ArrayActions<T>];
749
765
 
750
766
  /**
751
767
  * Deep equality comparison for objects and arrays.
@@ -805,7 +821,7 @@ declare function deepSignal<T>(initial: T): [() => T, (next: T | ((prev: T) => T
805
821
  */
806
822
  declare function writable<T>(get: () => T, set: (value: T) => void, options?: {
807
823
  name?: string;
808
- }): [() => T, (value: T) => void];
824
+ }): [Accessor<T>, (value: T) => void];
809
825
 
810
826
  /**
811
827
  * Lifecycle hooks for SibuJS components.
@@ -1087,4 +1103,4 @@ interface LoadingProps {
1087
1103
  */
1088
1104
  declare function Loading(props?: LoadingProps): HTMLElement;
1089
1105
 
1090
- export { type ActionFn, type ArrayActions, type Context, DynamicComponent, type EffectOptions, ErrorBoundary, type ErrorBoundaryProps, Fragment, KeepAlive, type KeepAliveOptions, Loading, type LoadingProps, type LongPressOptions, NodeChild, NodeChildren, Portal, type Ref, type SignalOptions, type SlotFn, type Slots, type StoreActions, Suspense, type SuspenseProps, TagProps, a, abbr, action, address, area, array, article, aside, audio, autoResize, b, base, batch, bdi, bdo, bindDynamic, blockquote, body, br, button, canvas, caption, catchError, catchErrorAsync, center, checkLeaks, circle, cite, clickOutside, clipPath, code, col, colgroup, context, copyOnClick, customElement, data, datalist, dd, deepEqual, deepSignal, defs, del, derived, details, dfn, dialog, disableSSR, dispose, div, dl, dt, each, effect, ellipse, em, embed, enableSSR, enqueueBatchedSignal, fieldset, figcaption, figure, font, footer, form, g, getSlot, h1, h2, h3, h4, h5, h6, head, header, hr, html, i, iframe, img, input, ins, isBatching, isSSR, kbd, label, lazy, legend, li, line, linearGradient, link, longPress, main, map, mark, marker, marquee, mask, match, math, memo, memoFn, menu, meta, meter, mount, nav, noscript, object, ol, on, onCleanup, onMount, onUnmount, optgroup, option, output, p, param, path, pattern, picture, polygon, polyline, portal, pre, progress, q, radialGradient, reactiveArray, rect, ref, registerComponent, registerDisposer, resolveComponent, rp, rt, ruby, s, samp, script, section, select, setGlobalErrorHandler, show, signal, slot, small, source, span, stop, store, strong, style, sub, summary, sup, svg, symbol, table, tbody, td, template, text, textarea, tfoot, th, thead, time, title, tr, track, trapFocus, tspan, u, ul, unregisterComponent, untracked, use, var_, video, watch, when, withSSR, writable };
1106
+ export { type Accessor, type ActionFn, type ArrayActions, type Context, DynamicComponent, type EffectOptions, ErrorBoundary, type ErrorBoundaryProps, Fragment, KeepAlive, type KeepAliveOptions, Loading, type LoadingProps, type LongPressOptions, NodeChild, NodeChildren, Portal, type Ref, type SignalOptions, type SlotFn, type Slots, type StoreActions, Suspense, type SuspenseProps, TagProps, a, abbr, action, address, area, array, article, aside, audio, autoResize, b, base, batch, bdi, bdo, bindDynamic, blockquote, body, br, button, canvas, caption, catchError, catchErrorAsync, center, checkLeaks, circle, cite, clickOutside, clipPath, code, col, colgroup, context, copyOnClick, customElement, data, datalist, dd, deepEqual, deepSignal, defs, del, derived, details, dfn, dialog, disableSSR, dispose, div, dl, dt, each, effect, ellipse, em, embed, enableSSR, enqueueBatchedSignal, fieldset, figcaption, figure, font, footer, form, g, getSlot, h1, h2, h3, h4, h5, h6, head, header, hr, html, i, iframe, img, input, ins, isBatching, isSSR, kbd, label, lazy, legend, li, line, linearGradient, link, longPress, main, map, mark, marker, marquee, mask, match, math, memo, memoFn, menu, meta, meter, mount, nav, noscript, object, ol, on, onCleanup, onMount, onUnmount, optgroup, option, output, p, param, path, pattern, picture, polygon, polyline, portal, pre, progress, q, radialGradient, reactiveArray, rect, ref, registerComponent, registerDisposer, resolveComponent, rp, rt, ruby, s, samp, script, section, select, setGlobalErrorHandler, show, signal, slot, small, source, span, stop, store, strong, style, sub, summary, sup, svg, symbol, table, tbody, td, template, text, textarea, tfoot, th, thead, time, title, tr, track, trapFocus, tspan, u, ul, unregisterComponent, untracked, use, var_, video, watch, when, withSSR, writable };
package/dist/index.js CHANGED
@@ -38,7 +38,7 @@ import {
38
38
  unregisterComponent,
39
39
  when,
40
40
  writable
41
- } from "./chunk-MQ5GOYPH.js";
41
+ } from "./chunk-P6W3STU4.js";
42
42
  import {
43
43
  a,
44
44
  abbr,
@@ -176,30 +176,30 @@ import {
176
176
  use,
177
177
  var_,
178
178
  video
179
- } from "./chunk-EWFVA3TJ.js";
179
+ } from "./chunk-GCOK2LC3.js";
180
180
  import {
181
181
  watch
182
- } from "./chunk-CZUGLNJS.js";
182
+ } from "./chunk-TNQWPPE6.js";
183
183
  import {
184
184
  context
185
- } from "./chunk-Z65KYU7I.js";
185
+ } from "./chunk-WR5D4EGH.js";
186
186
  import {
187
187
  SVG_NS,
188
188
  checkLeaks,
189
189
  dispose,
190
190
  registerDisposer,
191
191
  tagFactory
192
- } from "./chunk-MDVXJWFN.js";
192
+ } from "./chunk-B7SWRFUT.js";
193
193
  import {
194
194
  bindDynamic
195
- } from "./chunk-SDLZDHKP.js";
195
+ } from "./chunk-23VV7YD3.js";
196
196
  import {
197
197
  derived
198
- } from "./chunk-FGOEVHY3.js";
198
+ } from "./chunk-L6JRBDNS.js";
199
199
  import {
200
200
  effect,
201
201
  on
202
- } from "./chunk-PZEGYCF5.js";
202
+ } from "./chunk-6SA3QQES.js";
203
203
  import {
204
204
  disableSSR,
205
205
  enableSSR,
@@ -212,8 +212,8 @@ import {
212
212
  isBatching,
213
213
  signal,
214
214
  untracked
215
- } from "./chunk-YECR7UIA.js";
216
- import "./chunk-4MYMUBRS.js";
215
+ } from "./chunk-V2XTI523.js";
216
+ import "./chunk-UNXCEF6S.js";
217
217
  import "./chunk-MLKGABMK.js";
218
218
  export {
219
219
  DynamicComponent,
package/dist/motion.cjs CHANGED
@@ -267,7 +267,7 @@ async function sequence(steps) {
267
267
 
268
268
  // src/core/dev.ts
269
269
  function isDev() {
270
- return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : true;
270
+ return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
271
271
  }
272
272
  var _isDev = isDev();
273
273
  function devWarn(message) {
package/dist/motion.js CHANGED
@@ -19,9 +19,9 @@ import {
19
19
  stagger,
20
20
  transition,
21
21
  viewTransition
22
- } from "./chunk-6HLLIF3K.js";
23
- import "./chunk-YECR7UIA.js";
24
- import "./chunk-4MYMUBRS.js";
22
+ } from "./chunk-3ARAQO7B.js";
23
+ import "./chunk-V2XTI523.js";
24
+ import "./chunk-UNXCEF6S.js";
25
25
  import "./chunk-MLKGABMK.js";
26
26
  export {
27
27
  TransitionGroup,
package/dist/patterns.cjs CHANGED
@@ -49,7 +49,7 @@ module.exports = __toCommonJS(patterns_exports);
49
49
 
50
50
  // src/core/dev.ts
51
51
  function isDev() {
52
- return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : true;
52
+ return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
53
53
  }
54
54
  var _isDev = isDev();
55
55
  function devAssert(condition, message) {
@@ -606,7 +606,13 @@ function globalStore(config) {
606
606
  if (!actionFn) throw new Error(`Unknown action: ${String(action)}`);
607
607
  const execute = () => {
608
608
  const current = getState();
609
- const patch = actionFn(current, payload);
609
+ const rawPatch = actionFn(current, payload);
610
+ const patch = {};
611
+ for (const key of Object.keys(rawPatch)) {
612
+ if (key !== "__proto__" && key !== "constructor" && key !== "prototype") {
613
+ patch[key] = rawPatch[key];
614
+ }
615
+ }
610
616
  setState({ ...current, ...patch });
611
617
  const newState = getState();
612
618
  for (const listener of listeners) {
package/dist/patterns.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  optimisticList,
9
9
  persisted,
10
10
  timeline
11
- } from "./chunk-Y6GP4QGG.js";
11
+ } from "./chunk-WILQZRO4.js";
12
12
  import {
13
13
  RenderProp,
14
14
  assertType,
@@ -26,11 +26,11 @@ import {
26
26
  withProps,
27
27
  withWrapper
28
28
  } from "./chunk-XYU6TZOW.js";
29
- import "./chunk-FGOEVHY3.js";
30
- import "./chunk-PZEGYCF5.js";
29
+ import "./chunk-L6JRBDNS.js";
30
+ import "./chunk-6SA3QQES.js";
31
31
  import "./chunk-CHJ27IGK.js";
32
- import "./chunk-YECR7UIA.js";
33
- import "./chunk-4MYMUBRS.js";
32
+ import "./chunk-V2XTI523.js";
33
+ import "./chunk-UNXCEF6S.js";
34
34
  import "./chunk-MLKGABMK.js";
35
35
  export {
36
36
  RenderProp,
@@ -186,7 +186,7 @@ async function processInChunks(items, processor, chunkSize = 50) {
186
186
 
187
187
  // src/core/dev.ts
188
188
  function isDev() {
189
- return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : true;
189
+ return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
190
190
  }
191
191
  var _isDev = isDev();
192
192
  function devWarn(message) {