flexium 0.10.4 → 0.10.7

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 (150) hide show
  1. package/README.md +5 -5
  2. package/dist/{DrawText-ngwNNh8O.d.ts → DrawText-CVAKQ5wZ.d.cts} +42 -42
  3. package/dist/{DrawText-ccZrs3Xs.d.cts → DrawText-Dlh1L1Ar.d.ts} +42 -42
  4. package/dist/advanced.d.cts +1 -1
  5. package/dist/advanced.d.ts +1 -1
  6. package/dist/advanced.js +1 -1
  7. package/dist/advanced.js.map +1 -1
  8. package/dist/advanced.mjs +1 -1
  9. package/dist/advanced.mjs.map +1 -1
  10. package/dist/canvas.d.cts +5 -6
  11. package/dist/canvas.d.ts +5 -6
  12. package/dist/canvas.js +1 -1
  13. package/dist/canvas.mjs +1 -1
  14. package/dist/chunk-5ICRQIS2.js +3 -0
  15. package/dist/chunk-5ICRQIS2.js.map +1 -0
  16. package/dist/chunk-5K55ASOD.mjs +3 -0
  17. package/dist/chunk-5K55ASOD.mjs.map +1 -0
  18. package/dist/chunk-AZEHBSBG.js +3 -0
  19. package/dist/chunk-AZEHBSBG.js.map +1 -0
  20. package/dist/chunk-BBNYMXE7.mjs +2 -0
  21. package/dist/chunk-BBNYMXE7.mjs.map +1 -0
  22. package/dist/{chunk-WXEHDEIH.js → chunk-DZ7L3SHV.js} +2 -2
  23. package/dist/{chunk-WXEHDEIH.js.map → chunk-DZ7L3SHV.js.map} +1 -1
  24. package/dist/chunk-ECYYIQEX.mjs +3 -0
  25. package/dist/chunk-ECYYIQEX.mjs.map +1 -0
  26. package/dist/chunk-FDMJHFN7.mjs +2 -0
  27. package/dist/chunk-FDMJHFN7.mjs.map +1 -0
  28. package/dist/chunk-GKJQEOP7.mjs +2 -0
  29. package/dist/{chunk-PVPY55Z7.mjs.map → chunk-GKJQEOP7.mjs.map} +1 -1
  30. package/dist/chunk-GYDP6MFV.js +3 -0
  31. package/dist/chunk-GYDP6MFV.js.map +1 -0
  32. package/dist/chunk-HB5VPQTB.mjs +2 -0
  33. package/dist/chunk-HB5VPQTB.mjs.map +1 -0
  34. package/dist/chunk-OPAAGNBO.mjs +2 -0
  35. package/dist/{chunk-HLPVL6EK.mjs.map → chunk-OPAAGNBO.mjs.map} +1 -1
  36. package/dist/chunk-QPCIDSMM.js +2 -0
  37. package/dist/chunk-QPCIDSMM.js.map +1 -0
  38. package/dist/chunk-QZIX4FXS.mjs +2 -0
  39. package/dist/chunk-QZIX4FXS.mjs.map +1 -0
  40. package/dist/{chunk-63AW5ZOC.js → chunk-RMN5IPS5.js} +2 -2
  41. package/dist/{chunk-63AW5ZOC.js.map → chunk-RMN5IPS5.js.map} +1 -1
  42. package/dist/chunk-WWEWRI6S.js +2 -0
  43. package/dist/chunk-WWEWRI6S.js.map +1 -0
  44. package/dist/chunk-XJHWMHKF.js +2 -0
  45. package/dist/chunk-XJHWMHKF.js.map +1 -0
  46. package/dist/chunk-Y6KKAHLS.mjs +3 -0
  47. package/dist/chunk-Y6KKAHLS.mjs.map +1 -0
  48. package/dist/chunk-YPVRQKMW.js +2 -0
  49. package/dist/chunk-YPVRQKMW.js.map +1 -0
  50. package/dist/{components-CxnAnbpI.d.cts → components-BMbqsbMY.d.cts} +5 -5
  51. package/dist/{components-B7KQ8C-i.d.ts → components-C83mBQXW.d.ts} +5 -5
  52. package/dist/{effect-14CxUU8r.d.ts → core-CxHP8991.d.cts} +9 -1
  53. package/dist/{effect-14CxUU8r.d.cts → core-D0ggvjX3.d.ts} +9 -1
  54. package/dist/core.d.cts +2 -80
  55. package/dist/core.d.ts +2 -80
  56. package/dist/core.js +1 -1
  57. package/dist/core.mjs +1 -1
  58. package/dist/dom.d.cts +2 -2
  59. package/dist/dom.d.ts +2 -2
  60. package/dist/dom.js +1 -1
  61. package/dist/dom.js.map +1 -1
  62. package/dist/dom.mjs +1 -1
  63. package/dist/dom.mjs.map +1 -1
  64. package/dist/effect-554ONNZR.js +2 -0
  65. package/dist/{effect-K45UU3N4.js.map → effect-554ONNZR.js.map} +1 -1
  66. package/dist/effect-T2GVIS3T.mjs +2 -0
  67. package/dist/{effect-3LUCHSAZ.mjs.map → effect-T2GVIS3T.mjs.map} +1 -1
  68. package/dist/index.d.cts +1 -1
  69. package/dist/index.d.ts +1 -1
  70. package/dist/index.js +1 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/index.mjs +1 -1
  73. package/dist/index.mjs.map +1 -1
  74. package/dist/interactive.d.cts +5 -5
  75. package/dist/interactive.d.ts +5 -5
  76. package/dist/interactive.js +1 -1
  77. package/dist/interactive.js.map +1 -1
  78. package/dist/interactive.mjs +1 -1
  79. package/dist/interactive.mjs.map +1 -1
  80. package/dist/metafile-cjs.json +1 -1
  81. package/dist/metafile-esm.json +1 -1
  82. package/dist/{portal-NLlE-fNZ.d.cts → portal-BK_0Z0hE.d.cts} +2 -2
  83. package/dist/{portal-CVqrpmHd.d.ts → portal-CbguxtuQ.d.ts} +2 -2
  84. package/dist/primitives/motion.js +1 -1
  85. package/dist/primitives/motion.mjs +1 -1
  86. package/dist/primitives/ui.d.cts +3 -3
  87. package/dist/primitives/ui.d.ts +3 -3
  88. package/dist/primitives/ui.js +1 -1
  89. package/dist/primitives/ui.js.map +1 -1
  90. package/dist/primitives/ui.mjs +1 -1
  91. package/dist/primitives/ui.mjs.map +1 -1
  92. package/dist/primitives.d.cts +4 -5
  93. package/dist/primitives.d.ts +4 -5
  94. package/dist/primitives.js +1 -1
  95. package/dist/primitives.js.map +1 -1
  96. package/dist/primitives.mjs +1 -1
  97. package/dist/primitives.mjs.map +1 -1
  98. package/dist/router.d.cts +3 -3
  99. package/dist/router.d.ts +3 -3
  100. package/dist/router.js +1 -1
  101. package/dist/router.mjs +1 -1
  102. package/dist/server.js +1 -1
  103. package/dist/server.js.map +1 -1
  104. package/dist/server.mjs +1 -1
  105. package/dist/server.mjs.map +1 -1
  106. package/dist/state-DitsMyev.d.cts +96 -0
  107. package/dist/state-DitsMyev.d.ts +96 -0
  108. package/dist/state-RYKSC35A.mjs +2 -0
  109. package/dist/state-RYKSC35A.mjs.map +1 -0
  110. package/dist/state-XUXPMCFJ.js +2 -0
  111. package/dist/state-XUXPMCFJ.js.map +1 -0
  112. package/dist/test-exports.d.cts +37 -7
  113. package/dist/test-exports.d.ts +37 -7
  114. package/dist/test-exports.js +1 -1
  115. package/dist/test-exports.mjs +1 -1
  116. package/package.json +1 -1
  117. package/dist/chunk-3AWR7IKE.js +0 -2
  118. package/dist/chunk-3AWR7IKE.js.map +0 -1
  119. package/dist/chunk-3BQXIHYI.mjs +0 -3
  120. package/dist/chunk-3BQXIHYI.mjs.map +0 -1
  121. package/dist/chunk-5236IK5I.js +0 -2
  122. package/dist/chunk-5236IK5I.js.map +0 -1
  123. package/dist/chunk-6K44QCMT.mjs +0 -3
  124. package/dist/chunk-6K44QCMT.mjs.map +0 -1
  125. package/dist/chunk-7Q4UE442.mjs +0 -2
  126. package/dist/chunk-7Q4UE442.mjs.map +0 -1
  127. package/dist/chunk-AJT35P3Z.js +0 -3
  128. package/dist/chunk-AJT35P3Z.js.map +0 -1
  129. package/dist/chunk-AYQMU7XC.js +0 -3
  130. package/dist/chunk-AYQMU7XC.js.map +0 -1
  131. package/dist/chunk-B7VP6HBY.mjs +0 -2
  132. package/dist/chunk-B7VP6HBY.mjs.map +0 -1
  133. package/dist/chunk-HLPVL6EK.mjs +0 -2
  134. package/dist/chunk-KJPIJNFH.mjs +0 -2
  135. package/dist/chunk-KJPIJNFH.mjs.map +0 -1
  136. package/dist/chunk-PVPY55Z7.mjs +0 -2
  137. package/dist/chunk-Q7WT5IIF.mjs +0 -3
  138. package/dist/chunk-Q7WT5IIF.mjs.map +0 -1
  139. package/dist/chunk-S3EDPCYT.js +0 -3
  140. package/dist/chunk-S3EDPCYT.js.map +0 -1
  141. package/dist/chunk-WOHSSPKD.js +0 -2
  142. package/dist/chunk-WOHSSPKD.js.map +0 -1
  143. package/dist/effect-3LUCHSAZ.mjs +0 -2
  144. package/dist/effect-K45UU3N4.js +0 -2
  145. package/dist/signal-2QUI7H7B.js +0 -2
  146. package/dist/signal-2QUI7H7B.js.map +0 -1
  147. package/dist/signal-C6936A3J.d.cts +0 -175
  148. package/dist/signal-C6936A3J.d.ts +0 -175
  149. package/dist/signal-L3ZWGOVT.mjs +0 -2
  150. package/dist/signal-L3ZWGOVT.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { a as Signal, b as Computed, S as SignalNode } from './signal-C6936A3J.js';
1
+ import { S as StateValue } from './state-DitsMyev.js';
2
2
  import { a as FNodeChild, F as FNode } from './renderer-DSLb-FGg.js';
3
3
 
4
4
  interface Location {
@@ -8,10 +8,10 @@ interface Location {
8
8
  query: Record<string, string>;
9
9
  }
10
10
  interface RouterContext {
11
- location: Signal<Location> | Computed<Location>;
12
- params: Signal<Record<string, string>> | Computed<Record<string, string>>;
11
+ location: StateValue<Location>;
12
+ params: StateValue<Record<string, string>>;
13
13
  navigate: (path: string) => void;
14
- matches: Signal<RouteMatch[]> | Computed<RouteMatch[]>;
14
+ matches: StateValue<RouteMatch[]>;
15
15
  }
16
16
  interface RouteProps {
17
17
  path?: string;
@@ -65,7 +65,7 @@ interface LinkProps {
65
65
  * cleanup();
66
66
  * ```
67
67
  */
68
- declare function createLocation(): [SignalNode<Location>, (path: string) => void, () => void];
68
+ declare function createLocation(): [StateValue<Location>, (path: string) => void, () => void];
69
69
  /**
70
70
  * Check if a path contains unsafe protocols (XSS prevention)
71
71
  * @param path - Path to validate
@@ -1,3 +1,5 @@
1
+ import './state-DitsMyev.cjs';
2
+
1
3
  /**
2
4
  * Creates a side effect that runs when dependencies change
3
5
  *
@@ -20,5 +22,11 @@ declare function effect(fn: () => void | (() => void), options?: {
20
22
  onError?: (error: Error) => void;
21
23
  name?: string;
22
24
  }): () => void;
25
+ /**
26
+ * Registers a cleanup function that runs before the current effect re-runs or is disposed
27
+ *
28
+ * @param fn - Cleanup function
29
+ */
30
+ declare function onCleanup(fn: () => void): void;
23
31
 
24
- export { effect as e };
32
+ export { effect as e, onCleanup as o };
@@ -1,3 +1,5 @@
1
+ import './state-DitsMyev.js';
2
+
1
3
  /**
2
4
  * Creates a side effect that runs when dependencies change
3
5
  *
@@ -20,5 +22,11 @@ declare function effect(fn: () => void | (() => void), options?: {
20
22
  onError?: (error: Error) => void;
21
23
  name?: string;
22
24
  }): () => void;
25
+ /**
26
+ * Registers a cleanup function that runs before the current effect re-runs or is disposed
27
+ *
28
+ * @param fn - Cleanup function
29
+ */
30
+ declare function onCleanup(fn: () => void): void;
23
31
 
24
- export { effect as e };
32
+ export { effect as e, onCleanup as o };
package/dist/core.d.cts CHANGED
@@ -1,80 +1,2 @@
1
- export { e as effect } from './effect-14CxUU8r.cjs';
2
-
3
- interface AutoCleanupConfig {
4
- enabled: boolean;
5
- maxIdleTime: number;
6
- checkInterval: number;
7
- minAccessCount: number;
8
- }
9
- /**
10
- * ------------------------------------------------------------------
11
- * Helper Functions
12
- * ------------------------------------------------------------------
13
- */
14
- type StateKey = string | readonly (string | number | boolean | null | undefined | object)[];
15
- /**
16
- * ------------------------------------------------------------------
17
- * Main State API
18
- * ------------------------------------------------------------------
19
- */
20
- type StateAction<T> = (newValue: T | ((prev: T) => T)) => void;
21
- type StateValue<T> = T & (() => T) & {
22
- peek(): T;
23
- };
24
- type AsyncStatus = 'idle' | 'loading' | 'success' | 'error';
25
- interface StateOptions<P = unknown> {
26
- key?: StateKey;
27
- params?: P;
28
- }
29
- declare function isStateValue(value: unknown): boolean;
30
- declare function equals<T>(stateValue: StateValue<T>, value: T): boolean;
31
- declare function isTruthy<T>(stateValue: StateValue<T>): boolean;
32
- interface StateStats {
33
- total: number;
34
- byNamespace: Record<string, number>;
35
- topNamespaces: Array<{
36
- namespace: string;
37
- count: number;
38
- }>;
39
- averageAccessCount: number;
40
- }
41
- interface NamespaceStats {
42
- namespace: string;
43
- count: number;
44
- totalAccessCount: number;
45
- averageAccessCount: number;
46
- states: Array<{
47
- key: string;
48
- accessCount: number;
49
- createdAt: number;
50
- }>;
51
- }
52
- interface StateFunction {
53
- <T>(initialValue: T, options?: StateOptions): [StateValue<T>, StateAction<T>];
54
- <T, P>(computeFn: (params: P) => T, options: StateOptions<P> & {
55
- params: P;
56
- }): [StateValue<T>];
57
- <T>(computeFn: () => T, options?: StateOptions): [StateValue<T>];
58
- <T, P>(fetcher: (params: P) => Promise<T>, options: StateOptions<P> & {
59
- params: P;
60
- }): [StateValue<T | undefined>, () => void, StateValue<AsyncStatus>, StateValue<unknown>];
61
- <T>(fetcher: () => Promise<T>, options?: StateOptions): [StateValue<T | undefined>, () => void, StateValue<AsyncStatus>, StateValue<unknown>];
62
- delete: (key: StateKey) => boolean;
63
- clear: () => void;
64
- clearByPrefix: (prefix: StateKey) => number;
65
- has: (key: StateKey) => boolean;
66
- readonly size: number;
67
- getStats: () => StateStats;
68
- getNamespaceStats: (prefix: StateKey) => NamespaceStats;
69
- enableAutoCleanup: (config?: Partial<AutoCleanupConfig>) => void;
70
- disableAutoCleanup: () => void;
71
- readonly isAutoCleanupEnabled: boolean;
72
- }
73
- declare const state: StateFunction;
74
-
75
- interface RefObject<T> {
76
- current: T | null;
77
- }
78
- declare function ref<T>(initial: T | null): RefObject<T>;
79
-
80
- export { type AsyncStatus, type RefObject, type StateAction, type StateKey, type StateOptions, type StateValue, equals, isStateValue, isTruthy, ref, state };
1
+ export { A as AsyncStatus, R as RefObject, c as StateAction, d as StateKey, f as StateOptions, S as StateValue, e as equals, b as isStateValue, a as isTruthy, r as ref, s as state } from './state-DitsMyev.cjs';
2
+ export { e as effect } from './core-CxHP8991.cjs';
package/dist/core.d.ts CHANGED
@@ -1,80 +1,2 @@
1
- export { e as effect } from './effect-14CxUU8r.js';
2
-
3
- interface AutoCleanupConfig {
4
- enabled: boolean;
5
- maxIdleTime: number;
6
- checkInterval: number;
7
- minAccessCount: number;
8
- }
9
- /**
10
- * ------------------------------------------------------------------
11
- * Helper Functions
12
- * ------------------------------------------------------------------
13
- */
14
- type StateKey = string | readonly (string | number | boolean | null | undefined | object)[];
15
- /**
16
- * ------------------------------------------------------------------
17
- * Main State API
18
- * ------------------------------------------------------------------
19
- */
20
- type StateAction<T> = (newValue: T | ((prev: T) => T)) => void;
21
- type StateValue<T> = T & (() => T) & {
22
- peek(): T;
23
- };
24
- type AsyncStatus = 'idle' | 'loading' | 'success' | 'error';
25
- interface StateOptions<P = unknown> {
26
- key?: StateKey;
27
- params?: P;
28
- }
29
- declare function isStateValue(value: unknown): boolean;
30
- declare function equals<T>(stateValue: StateValue<T>, value: T): boolean;
31
- declare function isTruthy<T>(stateValue: StateValue<T>): boolean;
32
- interface StateStats {
33
- total: number;
34
- byNamespace: Record<string, number>;
35
- topNamespaces: Array<{
36
- namespace: string;
37
- count: number;
38
- }>;
39
- averageAccessCount: number;
40
- }
41
- interface NamespaceStats {
42
- namespace: string;
43
- count: number;
44
- totalAccessCount: number;
45
- averageAccessCount: number;
46
- states: Array<{
47
- key: string;
48
- accessCount: number;
49
- createdAt: number;
50
- }>;
51
- }
52
- interface StateFunction {
53
- <T>(initialValue: T, options?: StateOptions): [StateValue<T>, StateAction<T>];
54
- <T, P>(computeFn: (params: P) => T, options: StateOptions<P> & {
55
- params: P;
56
- }): [StateValue<T>];
57
- <T>(computeFn: () => T, options?: StateOptions): [StateValue<T>];
58
- <T, P>(fetcher: (params: P) => Promise<T>, options: StateOptions<P> & {
59
- params: P;
60
- }): [StateValue<T | undefined>, () => void, StateValue<AsyncStatus>, StateValue<unknown>];
61
- <T>(fetcher: () => Promise<T>, options?: StateOptions): [StateValue<T | undefined>, () => void, StateValue<AsyncStatus>, StateValue<unknown>];
62
- delete: (key: StateKey) => boolean;
63
- clear: () => void;
64
- clearByPrefix: (prefix: StateKey) => number;
65
- has: (key: StateKey) => boolean;
66
- readonly size: number;
67
- getStats: () => StateStats;
68
- getNamespaceStats: (prefix: StateKey) => NamespaceStats;
69
- enableAutoCleanup: (config?: Partial<AutoCleanupConfig>) => void;
70
- disableAutoCleanup: () => void;
71
- readonly isAutoCleanupEnabled: boolean;
72
- }
73
- declare const state: StateFunction;
74
-
75
- interface RefObject<T> {
76
- current: T | null;
77
- }
78
- declare function ref<T>(initial: T | null): RefObject<T>;
79
-
80
- export { type AsyncStatus, type RefObject, type StateAction, type StateKey, type StateOptions, type StateValue, equals, isStateValue, isTruthy, ref, state };
1
+ export { A as AsyncStatus, R as RefObject, c as StateAction, d as StateKey, f as StateOptions, S as StateValue, e as equals, b as isStateValue, a as isTruthy, r as ref, s as state } from './state-DitsMyev.js';
2
+ export { e as effect } from './core-D0ggvjX3.js';
package/dist/core.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunk3AWR7IKE_js=require('./chunk-3AWR7IKE.js');require('./chunk-5236IK5I.js');var chunkAJT35P3Z_js=require('./chunk-AJT35P3Z.js');Object.defineProperty(exports,"equals",{enumerable:true,get:function(){return chunk3AWR7IKE_js.f}});Object.defineProperty(exports,"isStateValue",{enumerable:true,get:function(){return chunk3AWR7IKE_js.d}});Object.defineProperty(exports,"isTruthy",{enumerable:true,get:function(){return chunk3AWR7IKE_js.g}});Object.defineProperty(exports,"ref",{enumerable:true,get:function(){return chunk3AWR7IKE_js.i}});Object.defineProperty(exports,"state",{enumerable:true,get:function(){return chunk3AWR7IKE_js.h}});Object.defineProperty(exports,"effect",{enumerable:true,get:function(){return chunkAJT35P3Z_js.k}});//# sourceMappingURL=core.js.map
1
+ 'use strict';var chunkXJHWMHKF_js=require('./chunk-XJHWMHKF.js');require('./chunk-YPVRQKMW.js');var chunkWWEWRI6S_js=require('./chunk-WWEWRI6S.js');require('./chunk-GYDP6MFV.js');Object.defineProperty(exports,"equals",{enumerable:true,get:function(){return chunkXJHWMHKF_js.i}});Object.defineProperty(exports,"isStateValue",{enumerable:true,get:function(){return chunkXJHWMHKF_js.f}});Object.defineProperty(exports,"isTruthy",{enumerable:true,get:function(){return chunkXJHWMHKF_js.j}});Object.defineProperty(exports,"ref",{enumerable:true,get:function(){return chunkXJHWMHKF_js.l}});Object.defineProperty(exports,"state",{enumerable:true,get:function(){return chunkXJHWMHKF_js.k}});Object.defineProperty(exports,"effect",{enumerable:true,get:function(){return chunkWWEWRI6S_js.c}});//# sourceMappingURL=core.js.map
2
2
  //# sourceMappingURL=core.js.map
package/dist/core.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export{f as equals,d as isStateValue,g as isTruthy,i as ref,h as state}from'./chunk-7Q4UE442.mjs';import'./chunk-B7VP6HBY.mjs';export{k as effect}from'./chunk-Q7WT5IIF.mjs';//# sourceMappingURL=core.mjs.map
1
+ export{i as equals,f as isStateValue,j as isTruthy,l as ref,k as state}from'./chunk-BBNYMXE7.mjs';import'./chunk-FDMJHFN7.mjs';export{c as effect}from'./chunk-HB5VPQTB.mjs';import'./chunk-ECYYIQEX.mjs';//# sourceMappingURL=core.mjs.map
2
2
  //# sourceMappingURL=core.mjs.map
package/dist/dom.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- export { D as DOMRenderer, F as Fragment, P as Portal, a as createReactiveRoot, c as createRoot, d as domRenderer, f, m as mountReactive, r as render } from './portal-NLlE-fNZ.cjs';
1
+ export { D as DOMRenderer, F as Fragment, P as Portal, a as createReactiveRoot, c as createRoot, d as domRenderer, f, m as mountReactive, r as render } from './portal-BK_0Z0hE.cjs';
2
2
  export { C as CommonProps, R as Renderer } from './renderer-DSLb-FGg.cjs';
3
- import './signal-C6936A3J.cjs';
3
+ import './state-DitsMyev.cjs';
4
4
 
5
5
  /**
6
6
  * Hydration options
package/dist/dom.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export { D as DOMRenderer, F as Fragment, P as Portal, a as createReactiveRoot, c as createRoot, d as domRenderer, f, m as mountReactive, r as render } from './portal-CVqrpmHd.js';
1
+ export { D as DOMRenderer, F as Fragment, P as Portal, a as createReactiveRoot, c as createRoot, d as domRenderer, f, m as mountReactive, r as render } from './portal-CbguxtuQ.js';
2
2
  export { C as CommonProps, R as Renderer } from './renderer-DSLb-FGg.js';
3
- import './signal-C6936A3J.js';
3
+ import './state-DitsMyev.js';
4
4
 
5
5
  /**
6
6
  * Hydration options
package/dist/dom.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkS3EDPCYT_js=require('./chunk-S3EDPCYT.js');require('./chunk-WXEHDEIH.js'),require('./chunk-3AWR7IKE.js');var chunkQ7IWDVJ4_js=require('./chunk-Q7IWDVJ4.js');require('./chunk-WQFQO5LK.js');var chunk5236IK5I_js=require('./chunk-5236IK5I.js'),chunkAJT35P3Z_js=require('./chunk-AJT35P3Z.js');var C={viewBox:"viewBox",preserveAspectRatio:"preserveAspectRatio",strokeWidth:"stroke-width",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",fillOpacity:"fill-opacity",strokeOpacity:"stroke-opacity",stopColor:"stop-color",stopOpacity:"stop-opacity",clipPath:"clip-path",markerEnd:"marker-end",markerStart:"marker-start",markerMid:"marker-mid"};function M(t,e,a={}){let{onMismatch:r,recoverMismatch:n=false}=a,i=(s,l,p)=>{r?r(s,l,p):typeof __DEV__<"u"&&__DEV__&&console.warn(`[Flexium Hydration] ${s}`);};c(t,e.firstChild,{handleMismatch:i,recoverMismatch:n});}function c(t,e,a){if(t==null||t===false)return e;if(!e)return a.handleMismatch("No DOM node found for vnode",e,t),null;if(typeof t=="string"||typeof t=="number")if(e.nodeType===Node.TEXT_NODE){let r=String(t);return e.textContent!==r&&(a.handleMismatch(`Text mismatch: "${e.textContent}" vs "${r}"`,e,t),e.textContent=r),e.nextSibling}else return a.handleMismatch(`Expected text node, got ${e.nodeType}`,e,t),e.nextSibling;if(chunk5236IK5I_js.f(t)&&e.nodeType===Node.TEXT_NODE)return chunkAJT35P3Z_js.k(()=>{e.textContent=String(t.value);}),e.nextSibling;if(typeof t=="function")return chunkAJT35P3Z_js.k(()=>{let r=t();e.nodeType===Node.TEXT_NODE&&(e.textContent=String(r));}),e.nextSibling;if(typeof t.type=="function"){let r=t.type({...t.props,children:t.children});return c(r,e,a)}if(t.type==="fragment"||t.type===null){let r=e,n=t.children||[];for(let i of n)r=c(i,r,a);return r}if(typeof t.type=="string"){if(e.nodeType!==Node.ELEMENT_NODE)return a.handleMismatch(`Expected element node, got ${e.nodeType}`,e,t),e.nextSibling;let r=e,n=r.tagName.toLowerCase();if(n!==t.type.toLowerCase())return a.handleMismatch(`Tag mismatch: "${n}" vs "${t.type}"`,e,t),e.nextSibling;t.props&&b(r,t.props,a);let i=r.firstChild;if(t.children){let s=Array.isArray(t.children)?t.children.flat():[t.children];for(let l of s)l==null||l===false||(i=c(l,i,a));}return r.nextSibling}return e?.nextSibling||null}function b(t,e,a){for(let r in e){let n=e[r];if(r==="children"||r==="key"||r==="ref"){r==="ref"&&typeof n=="function"&&n(t);continue}if(r.startsWith("on")){let i=r.slice(2).toLowerCase();t.addEventListener(i,n);continue}if(chunk5236IK5I_js.f(n)){let i=r==="className"?"class":r;chunkAJT35P3Z_js.k(()=>{if(i==="class")t.setAttribute("class",String(n.value));else if(i==="style"&&typeof n.value=="object")Object.assign(t.style,n.value);else {let s=C[i]||i;i in t&&!(t instanceof SVGElement)?t[i]=n.value:t.setAttribute(s,String(n.value));}});continue}if(typeof __DEV__<"u"&&__DEV__&&(r==="className"||r==="class")){let i=t.getAttribute("class")||"";i!==n&&a.handleMismatch(`Class mismatch on <${t.tagName.toLowerCase()}>: "${i}" vs "${n}"`,t,e);}}}Object.defineProperty(exports,"DOMRenderer",{enumerable:true,get:function(){return chunkS3EDPCYT_js.a}});Object.defineProperty(exports,"Portal",{enumerable:true,get:function(){return chunkS3EDPCYT_js.i}});Object.defineProperty(exports,"createReactiveRoot",{enumerable:true,get:function(){return chunkS3EDPCYT_js.f}});Object.defineProperty(exports,"createRoot",{enumerable:true,get:function(){return chunkS3EDPCYT_js.h}});Object.defineProperty(exports,"domRenderer",{enumerable:true,get:function(){return chunkS3EDPCYT_js.b}});Object.defineProperty(exports,"mountReactive",{enumerable:true,get:function(){return chunkS3EDPCYT_js.e}});Object.defineProperty(exports,"render",{enumerable:true,get:function(){return chunkS3EDPCYT_js.g}});Object.defineProperty(exports,"Fragment",{enumerable:true,get:function(){return chunkQ7IWDVJ4_js.b}});Object.defineProperty(exports,"f",{enumerable:true,get:function(){return chunkQ7IWDVJ4_js.a}});exports.hydrate=M;//# sourceMappingURL=dom.js.map
1
+ 'use strict';var chunk5ICRQIS2_js=require('./chunk-5ICRQIS2.js');require('./chunk-DZ7L3SHV.js');var chunkXJHWMHKF_js=require('./chunk-XJHWMHKF.js');require('./chunk-YPVRQKMW.js');var chunkQ7IWDVJ4_js=require('./chunk-Q7IWDVJ4.js');require('./chunk-WQFQO5LK.js');var chunkWWEWRI6S_js=require('./chunk-WWEWRI6S.js');require('./chunk-GYDP6MFV.js');var C={viewBox:"viewBox",preserveAspectRatio:"preserveAspectRatio",strokeWidth:"stroke-width",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",fillOpacity:"fill-opacity",strokeOpacity:"stroke-opacity",stopColor:"stop-color",stopOpacity:"stop-opacity",clipPath:"clip-path",markerEnd:"marker-end",markerStart:"marker-start",markerMid:"marker-mid"};function M(t,e,s={}){let{onMismatch:n,recoverMismatch:i=false}=s,r=(a,o,p)=>{n?n(a,o,p):typeof __DEV__<"u"&&__DEV__&&console.warn(`[Flexium Hydration] ${a}`);};c(t,e.firstChild,{handleMismatch:r,recoverMismatch:i});}function c(t,e,s){if(t==null||t===false)return e;if(!e)return s.handleMismatch("No DOM node found for vnode",e,t),null;if(typeof t=="string"||typeof t=="number")if(e.nodeType===Node.TEXT_NODE){let n=String(t);return e.textContent!==n&&(s.handleMismatch(`Text mismatch: "${e.textContent}" vs "${n}"`,e,t),e.textContent=n),e.nextSibling}else return s.handleMismatch(`Expected text node, got ${e.nodeType}`,e,t),e.nextSibling;if(chunkXJHWMHKF_js.g(t)&&e.nodeType===Node.TEXT_NODE)return chunkWWEWRI6S_js.c(()=>{e.textContent=String(t());}),e.nextSibling;if(typeof t=="function")return chunkWWEWRI6S_js.c(()=>{let n=t();e.nodeType===Node.TEXT_NODE&&(e.textContent=String(n));}),e.nextSibling;if(typeof t.type=="function"){let n=t.type({...t.props,children:t.children});return c(n,e,s)}if(t.type==="fragment"||t.type===null){let n=e,i=t.children||[];for(let r of i)n=c(r,n,s);return n}if(typeof t.type=="string"){if(e.nodeType!==Node.ELEMENT_NODE)return s.handleMismatch(`Expected element node, got ${e.nodeType}`,e,t),e.nextSibling;let n=e,i=n.tagName.toLowerCase();if(i!==t.type.toLowerCase())return s.handleMismatch(`Tag mismatch: "${i}" vs "${t.type}"`,e,t),e.nextSibling;t.props&&b(n,t.props,s);let r=n.firstChild;if(t.children){let a=Array.isArray(t.children)?t.children.flat():[t.children];for(let o of a)o==null||o===false||(r=c(o,r,s));}return n.nextSibling}return e?.nextSibling||null}function b(t,e,s){for(let n in e){let i=e[n];if(n==="children"||n==="key"||n==="ref"){n==="ref"&&typeof i=="function"&&i(t);continue}if(n.startsWith("on")){let r=n.slice(2).toLowerCase();t.addEventListener(r,i);continue}if(chunkXJHWMHKF_js.g(i)){let r=n==="className"?"class":n;chunkWWEWRI6S_js.c(()=>{let a=i();if(r==="class")t.setAttribute("class",String(a));else if(r==="style"&&typeof a=="object")Object.assign(t.style,a);else {let o=C[r]||r;r in t&&!(t instanceof SVGElement)?t[r]=a:t.setAttribute(o,String(a));}});continue}if(typeof __DEV__<"u"&&__DEV__&&(n==="className"||n==="class")){let r=t.getAttribute("class")||"";r!==i&&s.handleMismatch(`Class mismatch on <${t.tagName.toLowerCase()}>: "${r}" vs "${i}"`,t,e);}}}Object.defineProperty(exports,"DOMRenderer",{enumerable:true,get:function(){return chunk5ICRQIS2_js.a}});Object.defineProperty(exports,"Portal",{enumerable:true,get:function(){return chunk5ICRQIS2_js.i}});Object.defineProperty(exports,"createReactiveRoot",{enumerable:true,get:function(){return chunk5ICRQIS2_js.f}});Object.defineProperty(exports,"createRoot",{enumerable:true,get:function(){return chunk5ICRQIS2_js.h}});Object.defineProperty(exports,"domRenderer",{enumerable:true,get:function(){return chunk5ICRQIS2_js.b}});Object.defineProperty(exports,"mountReactive",{enumerable:true,get:function(){return chunk5ICRQIS2_js.e}});Object.defineProperty(exports,"render",{enumerable:true,get:function(){return chunk5ICRQIS2_js.g}});Object.defineProperty(exports,"Fragment",{enumerable:true,get:function(){return chunkQ7IWDVJ4_js.b}});Object.defineProperty(exports,"f",{enumerable:true,get:function(){return chunkQ7IWDVJ4_js.a}});exports.hydrate=M;//# sourceMappingURL=dom.js.map
2
2
  //# sourceMappingURL=dom.js.map
package/dist/dom.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/renderers/dom/hydrate.ts"],"names":["SVG_ATTR_MAP","hydrate","vnode","container","options","onMismatch","recoverMismatch","handleMismatch","message","domNode","vn","hydrateNode","ctx","text","isSignal","effect","value","result","currentNode","children","child","el","tagName","hydrateProps","childDom","props","key","eventName","propName","attrName","domClass"],"mappings":"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","file":"dom.js","sourcesContent":["import { isSignal } from '../../core/signal'\nimport { effect } from '../../core/effect'\n\n/**\n * SVG Attribute Case Mapping\n * React-like camelCase to SVG case-sensitive attributes\n */\nconst SVG_ATTR_MAP: Record<string, string> = {\n viewBox: 'viewBox',\n preserveAspectRatio: 'preserveAspectRatio',\n strokeWidth: 'stroke-width',\n strokeLinecap: 'stroke-linecap',\n strokeLinejoin: 'stroke-linejoin',\n strokeDasharray: 'stroke-dasharray',\n strokeDashoffset: 'stroke-dashoffset',\n fillOpacity: 'fill-opacity',\n strokeOpacity: 'stroke-opacity',\n stopColor: 'stop-color',\n stopOpacity: 'stop-opacity',\n clipPath: 'clip-path',\n markerEnd: 'marker-end',\n markerStart: 'marker-start',\n markerMid: 'marker-mid',\n}\n\n/**\n * Hydration options\n */\nexport interface HydrateOptions {\n /** Called when hydration encounters a mismatch */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMismatch?: (message: string, domNode: Node | null, vnode: any) => void\n /** Whether to recover from mismatches by re-rendering */\n recoverMismatch?: boolean\n}\n\n/**\n * Hydrate server-rendered HTML with client-side interactivity\n *\n * This function walks the existing DOM tree and attaches event handlers,\n * sets up signal bindings, and validates that the DOM matches the expected vnode structure.\n *\n * @param vnode - Virtual node to hydrate against\n * @param container - Container element with server-rendered HTML\n * @param options - Hydration options\n *\n * @example\n * ```tsx\n * // Server rendered HTML in #app\n * hydrate(<App />, document.getElementById('app'));\n * ```\n */\nexport function hydrate(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n container: Element,\n options: HydrateOptions = {}\n) {\n const { onMismatch, recoverMismatch = false } = options\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleMismatch = (message: string, domNode: Node | null, vn: any) => {\n if (onMismatch) {\n onMismatch(message, domNode, vn)\n } else if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n console.warn(`[Flexium Hydration] ${message}`)\n }\n }\n\n hydrateNode(vnode, container.firstChild as Node, {\n handleMismatch,\n recoverMismatch,\n })\n}\n\ninterface HydrateContext {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleMismatch: (message: string, domNode: Node | null, vnode: any) => void\n recoverMismatch: boolean\n}\n\nfunction hydrateNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n domNode: Node | null,\n ctx: HydrateContext\n): Node | null {\n if (vnode === null || vnode === undefined || vnode === false) {\n return domNode\n }\n\n if (!domNode) {\n ctx.handleMismatch('No DOM node found for vnode', domNode, vnode)\n return null\n }\n\n // Handle text/number primitives\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n if (domNode.nodeType === Node.TEXT_NODE) {\n const text = String(vnode)\n if (domNode.textContent !== text) {\n ctx.handleMismatch(\n `Text mismatch: \"${domNode.textContent}\" vs \"${text}\"`,\n domNode,\n vnode\n )\n domNode.textContent = text\n }\n return domNode.nextSibling\n } else {\n ctx.handleMismatch(\n `Expected text node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n }\n\n // Handle signals - create reactive binding\n if (isSignal(vnode)) {\n if (domNode.nodeType === Node.TEXT_NODE) {\n effect(() => {\n domNode.textContent = String(vnode.value)\n })\n return domNode.nextSibling\n }\n }\n\n // Handle computed values\n if (typeof vnode === 'function') {\n // Create reactive binding for computed/derived values\n effect(() => {\n const value = vnode()\n if (domNode.nodeType === Node.TEXT_NODE) {\n domNode.textContent = String(value)\n }\n })\n return domNode.nextSibling\n }\n\n // Handle function components\n if (typeof vnode.type === 'function') {\n const result = vnode.type({ ...vnode.props, children: vnode.children })\n return hydrateNode(result, domNode, ctx)\n }\n\n // Handle fragments\n if (vnode.type === 'fragment' || vnode.type === null) {\n let currentNode: Node | null = domNode\n const children = vnode.children || []\n for (const child of children) {\n currentNode = hydrateNode(child, currentNode, ctx)\n }\n return currentNode\n }\n\n // Handle element vnodes\n if (typeof vnode.type === 'string') {\n if (domNode.nodeType !== Node.ELEMENT_NODE) {\n ctx.handleMismatch(\n `Expected element node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n const el = domNode as Element\n const tagName = el.tagName.toLowerCase()\n\n if (tagName !== vnode.type.toLowerCase()) {\n ctx.handleMismatch(\n `Tag mismatch: \"${tagName}\" vs \"${vnode.type}\"`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n // Hydrate props\n if (vnode.props) {\n hydrateProps(el, vnode.props, ctx)\n }\n\n // Hydrate children\n let childDom = el.firstChild\n if (vnode.children) {\n const children = Array.isArray(vnode.children)\n ? vnode.children.flat()\n : [vnode.children]\n for (const child of children) {\n if (child === null || child === undefined || child === false) continue\n childDom = hydrateNode(child, childDom, ctx) as ChildNode | null\n }\n }\n\n return el.nextSibling\n }\n\n return domNode?.nextSibling || null\n}\n\n/**\n * Hydrate element props - attach events, set up reactive bindings\n */\nfunction hydrateProps(\n el: Element,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: Record<string, any>,\n ctx: HydrateContext\n): void {\n for (const key in props) {\n const value = props[key]\n\n if (key === 'children' || key === 'key' || key === 'ref') {\n // Handle ref callback\n if (key === 'ref' && typeof value === 'function') {\n value(el)\n }\n continue\n }\n\n // Event handlers\n if (key.startsWith('on')) {\n const eventName = key.slice(2).toLowerCase()\n el.addEventListener(eventName, value)\n continue\n }\n\n // Reactive props (signals)\n if (isSignal(value)) {\n const propName = key === 'className' ? 'class' : key\n effect(() => {\n if (propName === 'class') {\n el.setAttribute('class', String(value.value))\n } else if (propName === 'style' && typeof value.value === 'object') {\n Object.assign((el as HTMLElement).style, value.value)\n } else {\n // Handle SVG attributes\n const attrName = SVG_ATTR_MAP[propName] || propName\n\n if (propName in el && !(el instanceof SVGElement)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ; (el as any)[propName] = value.value\n } else {\n el.setAttribute(attrName, String(value.value))\n }\n }\n })\n continue\n }\n\n // Validate static props match (in development)\n if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n if (key === 'className' || key === 'class') {\n const domClass = el.getAttribute('class') || ''\n if (domClass !== value) {\n ctx.handleMismatch(\n `Class mismatch on <${el.tagName.toLowerCase()}>: \"${domClass}\" vs \"${value}\"`,\n el,\n props\n )\n }\n }\n }\n }\n}\n\n// Declare global __DEV__ for development mode detection\ndeclare global {\n const __DEV__: boolean | undefined\n}\n"]}
1
+ {"version":3,"sources":["../src/renderers/dom/hydrate.ts"],"names":["SVG_ATTR_MAP","hydrate","vnode","container","options","onMismatch","recoverMismatch","handleMismatch","message","domNode","vn","hydrateNode","ctx","text","isSignal","effect","value","result","currentNode","children","child","el","tagName","hydrateProps","childDom","props","key","eventName","propName","val","attrName","domClass"],"mappings":"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","file":"dom.js","sourcesContent":["import { isSignal } from '../../core/state'\nimport { effect } from '../../core/effect'\n\n/**\n * SVG Attribute Case Mapping\n * React-like camelCase to SVG case-sensitive attributes\n */\nconst SVG_ATTR_MAP: Record<string, string> = {\n viewBox: 'viewBox',\n preserveAspectRatio: 'preserveAspectRatio',\n strokeWidth: 'stroke-width',\n strokeLinecap: 'stroke-linecap',\n strokeLinejoin: 'stroke-linejoin',\n strokeDasharray: 'stroke-dasharray',\n strokeDashoffset: 'stroke-dashoffset',\n fillOpacity: 'fill-opacity',\n strokeOpacity: 'stroke-opacity',\n stopColor: 'stop-color',\n stopOpacity: 'stop-opacity',\n clipPath: 'clip-path',\n markerEnd: 'marker-end',\n markerStart: 'marker-start',\n markerMid: 'marker-mid',\n}\n\n/**\n * Hydration options\n */\nexport interface HydrateOptions {\n /** Called when hydration encounters a mismatch */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMismatch?: (message: string, domNode: Node | null, vnode: any) => void\n /** Whether to recover from mismatches by re-rendering */\n recoverMismatch?: boolean\n}\n\n/**\n * Hydrate server-rendered HTML with client-side interactivity\n *\n * This function walks the existing DOM tree and attaches event handlers,\n * sets up signal bindings, and validates that the DOM matches the expected vnode structure.\n *\n * @param vnode - Virtual node to hydrate against\n * @param container - Container element with server-rendered HTML\n * @param options - Hydration options\n *\n * @example\n * ```tsx\n * // Server rendered HTML in #app\n * hydrate(<App />, document.getElementById('app'));\n * ```\n */\nexport function hydrate(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n container: Element,\n options: HydrateOptions = {}\n) {\n const { onMismatch, recoverMismatch = false } = options\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleMismatch = (message: string, domNode: Node | null, vn: any) => {\n if (onMismatch) {\n onMismatch(message, domNode, vn)\n } else if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n console.warn(`[Flexium Hydration] ${message}`)\n }\n }\n\n hydrateNode(vnode, container.firstChild as Node, {\n handleMismatch,\n recoverMismatch,\n })\n}\n\ninterface HydrateContext {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleMismatch: (message: string, domNode: Node | null, vnode: any) => void\n recoverMismatch: boolean\n}\n\nfunction hydrateNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n domNode: Node | null,\n ctx: HydrateContext\n): Node | null {\n if (vnode === null || vnode === undefined || vnode === false) {\n return domNode\n }\n\n if (!domNode) {\n ctx.handleMismatch('No DOM node found for vnode', domNode, vnode)\n return null\n }\n\n // Handle text/number primitives\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n if (domNode.nodeType === Node.TEXT_NODE) {\n const text = String(vnode)\n if (domNode.textContent !== text) {\n ctx.handleMismatch(\n `Text mismatch: \"${domNode.textContent}\" vs \"${text}\"`,\n domNode,\n vnode\n )\n domNode.textContent = text\n }\n return domNode.nextSibling\n } else {\n ctx.handleMismatch(\n `Expected text node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n }\n\n // Handle signals - create reactive binding\n if (isSignal(vnode)) {\n if (domNode.nodeType === Node.TEXT_NODE) {\n effect(() => {\n domNode.textContent = String((vnode as any)())\n })\n return domNode.nextSibling\n }\n }\n\n // Handle computed values\n if (typeof vnode === 'function') {\n // Create reactive binding for computed/derived values\n effect(() => {\n const value = vnode()\n if (domNode.nodeType === Node.TEXT_NODE) {\n domNode.textContent = String(value)\n }\n })\n return domNode.nextSibling\n }\n\n // Handle function components\n if (typeof vnode.type === 'function') {\n const result = vnode.type({ ...vnode.props, children: vnode.children })\n return hydrateNode(result, domNode, ctx)\n }\n\n // Handle fragments\n if (vnode.type === 'fragment' || vnode.type === null) {\n let currentNode: Node | null = domNode\n const children = vnode.children || []\n for (const child of children) {\n currentNode = hydrateNode(child, currentNode, ctx)\n }\n return currentNode\n }\n\n // Handle element vnodes\n if (typeof vnode.type === 'string') {\n if (domNode.nodeType !== Node.ELEMENT_NODE) {\n ctx.handleMismatch(\n `Expected element node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n const el = domNode as Element\n const tagName = el.tagName.toLowerCase()\n\n if (tagName !== vnode.type.toLowerCase()) {\n ctx.handleMismatch(\n `Tag mismatch: \"${tagName}\" vs \"${vnode.type}\"`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n // Hydrate props\n if (vnode.props) {\n hydrateProps(el, vnode.props, ctx)\n }\n\n // Hydrate children\n let childDom = el.firstChild\n if (vnode.children) {\n const children = Array.isArray(vnode.children)\n ? vnode.children.flat()\n : [vnode.children]\n for (const child of children) {\n if (child === null || child === undefined || child === false) continue\n childDom = hydrateNode(child, childDom, ctx) as ChildNode | null\n }\n }\n\n return el.nextSibling\n }\n\n return domNode?.nextSibling || null\n}\n\n/**\n * Hydrate element props - attach events, set up reactive bindings\n */\nfunction hydrateProps(\n el: Element,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: Record<string, any>,\n ctx: HydrateContext\n): void {\n for (const key in props) {\n const value = props[key]\n\n if (key === 'children' || key === 'key' || key === 'ref') {\n // Handle ref callback\n if (key === 'ref' && typeof value === 'function') {\n value(el)\n }\n continue\n }\n\n // Event handlers\n if (key.startsWith('on')) {\n const eventName = key.slice(2).toLowerCase()\n el.addEventListener(eventName, value)\n continue\n }\n\n // Reactive props (signals)\n if (isSignal(value)) {\n const propName = key === 'className' ? 'class' : key\n effect(() => {\n const val = (value as any)()\n if (propName === 'class') {\n el.setAttribute('class', String(val))\n } else if (propName === 'style' && typeof val === 'object') {\n Object.assign((el as HTMLElement).style, val)\n } else {\n // Handle SVG attributes\n const attrName = SVG_ATTR_MAP[propName] || propName\n\n if (propName in el && !(el instanceof SVGElement)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ; (el as any)[propName] = val\n } else {\n el.setAttribute(attrName, String(val))\n }\n }\n })\n continue\n }\n\n // Validate static props match (in development)\n if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n if (key === 'className' || key === 'class') {\n const domClass = el.getAttribute('class') || ''\n if (domClass !== value) {\n ctx.handleMismatch(\n `Class mismatch on <${el.tagName.toLowerCase()}>: \"${domClass}\" vs \"${value}\"`,\n el,\n props\n )\n }\n }\n }\n }\n}\n\n// Declare global __DEV__ for development mode detection\ndeclare global {\n const __DEV__: boolean | undefined\n}\n"]}
package/dist/dom.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export{a as DOMRenderer,i as Portal,f as createReactiveRoot,h as createRoot,b as domRenderer,e as mountReactive,g as render}from'./chunk-6K44QCMT.mjs';import'./chunk-HLPVL6EK.mjs';import'./chunk-7Q4UE442.mjs';export{b as Fragment,a as f}from'./chunk-WVEJT7HD.mjs';import'./chunk-KNF5ERPK.mjs';import {f}from'./chunk-B7VP6HBY.mjs';import {k}from'./chunk-Q7WT5IIF.mjs';var C={viewBox:"viewBox",preserveAspectRatio:"preserveAspectRatio",strokeWidth:"stroke-width",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",fillOpacity:"fill-opacity",strokeOpacity:"stroke-opacity",stopColor:"stop-color",stopOpacity:"stop-opacity",clipPath:"clip-path",markerEnd:"marker-end",markerStart:"marker-start",markerMid:"marker-mid"};function M(t,e,a={}){let{onMismatch:r,recoverMismatch:n=false}=a,i=(s,l,p)=>{r?r(s,l,p):typeof __DEV__<"u"&&__DEV__&&console.warn(`[Flexium Hydration] ${s}`);};c(t,e.firstChild,{handleMismatch:i,recoverMismatch:n});}function c(t,e,a){if(t==null||t===false)return e;if(!e)return a.handleMismatch("No DOM node found for vnode",e,t),null;if(typeof t=="string"||typeof t=="number")if(e.nodeType===Node.TEXT_NODE){let r=String(t);return e.textContent!==r&&(a.handleMismatch(`Text mismatch: "${e.textContent}" vs "${r}"`,e,t),e.textContent=r),e.nextSibling}else return a.handleMismatch(`Expected text node, got ${e.nodeType}`,e,t),e.nextSibling;if(f(t)&&e.nodeType===Node.TEXT_NODE)return k(()=>{e.textContent=String(t.value);}),e.nextSibling;if(typeof t=="function")return k(()=>{let r=t();e.nodeType===Node.TEXT_NODE&&(e.textContent=String(r));}),e.nextSibling;if(typeof t.type=="function"){let r=t.type({...t.props,children:t.children});return c(r,e,a)}if(t.type==="fragment"||t.type===null){let r=e,n=t.children||[];for(let i of n)r=c(i,r,a);return r}if(typeof t.type=="string"){if(e.nodeType!==Node.ELEMENT_NODE)return a.handleMismatch(`Expected element node, got ${e.nodeType}`,e,t),e.nextSibling;let r=e,n=r.tagName.toLowerCase();if(n!==t.type.toLowerCase())return a.handleMismatch(`Tag mismatch: "${n}" vs "${t.type}"`,e,t),e.nextSibling;t.props&&b(r,t.props,a);let i=r.firstChild;if(t.children){let s=Array.isArray(t.children)?t.children.flat():[t.children];for(let l of s)l==null||l===false||(i=c(l,i,a));}return r.nextSibling}return e?.nextSibling||null}function b(t,e,a){for(let r in e){let n=e[r];if(r==="children"||r==="key"||r==="ref"){r==="ref"&&typeof n=="function"&&n(t);continue}if(r.startsWith("on")){let i=r.slice(2).toLowerCase();t.addEventListener(i,n);continue}if(f(n)){let i=r==="className"?"class":r;k(()=>{if(i==="class")t.setAttribute("class",String(n.value));else if(i==="style"&&typeof n.value=="object")Object.assign(t.style,n.value);else {let s=C[i]||i;i in t&&!(t instanceof SVGElement)?t[i]=n.value:t.setAttribute(s,String(n.value));}});continue}if(typeof __DEV__<"u"&&__DEV__&&(r==="className"||r==="class")){let i=t.getAttribute("class")||"";i!==n&&a.handleMismatch(`Class mismatch on <${t.tagName.toLowerCase()}>: "${i}" vs "${n}"`,t,e);}}}export{M as hydrate};//# sourceMappingURL=dom.mjs.map
1
+ export{a as DOMRenderer,i as Portal,f as createReactiveRoot,h as createRoot,b as domRenderer,e as mountReactive,g as render}from'./chunk-Y6KKAHLS.mjs';import'./chunk-OPAAGNBO.mjs';import {g}from'./chunk-BBNYMXE7.mjs';import'./chunk-FDMJHFN7.mjs';export{b as Fragment,a as f}from'./chunk-WVEJT7HD.mjs';import'./chunk-KNF5ERPK.mjs';import {c as c$1}from'./chunk-HB5VPQTB.mjs';import'./chunk-ECYYIQEX.mjs';var C={viewBox:"viewBox",preserveAspectRatio:"preserveAspectRatio",strokeWidth:"stroke-width",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",fillOpacity:"fill-opacity",strokeOpacity:"stroke-opacity",stopColor:"stop-color",stopOpacity:"stop-opacity",clipPath:"clip-path",markerEnd:"marker-end",markerStart:"marker-start",markerMid:"marker-mid"};function M(t,e,s={}){let{onMismatch:n,recoverMismatch:i=false}=s,r=(a,o,p)=>{n?n(a,o,p):typeof __DEV__<"u"&&__DEV__&&console.warn(`[Flexium Hydration] ${a}`);};c(t,e.firstChild,{handleMismatch:r,recoverMismatch:i});}function c(t,e,s){if(t==null||t===false)return e;if(!e)return s.handleMismatch("No DOM node found for vnode",e,t),null;if(typeof t=="string"||typeof t=="number")if(e.nodeType===Node.TEXT_NODE){let n=String(t);return e.textContent!==n&&(s.handleMismatch(`Text mismatch: "${e.textContent}" vs "${n}"`,e,t),e.textContent=n),e.nextSibling}else return s.handleMismatch(`Expected text node, got ${e.nodeType}`,e,t),e.nextSibling;if(g(t)&&e.nodeType===Node.TEXT_NODE)return c$1(()=>{e.textContent=String(t());}),e.nextSibling;if(typeof t=="function")return c$1(()=>{let n=t();e.nodeType===Node.TEXT_NODE&&(e.textContent=String(n));}),e.nextSibling;if(typeof t.type=="function"){let n=t.type({...t.props,children:t.children});return c(n,e,s)}if(t.type==="fragment"||t.type===null){let n=e,i=t.children||[];for(let r of i)n=c(r,n,s);return n}if(typeof t.type=="string"){if(e.nodeType!==Node.ELEMENT_NODE)return s.handleMismatch(`Expected element node, got ${e.nodeType}`,e,t),e.nextSibling;let n=e,i=n.tagName.toLowerCase();if(i!==t.type.toLowerCase())return s.handleMismatch(`Tag mismatch: "${i}" vs "${t.type}"`,e,t),e.nextSibling;t.props&&b(n,t.props,s);let r=n.firstChild;if(t.children){let a=Array.isArray(t.children)?t.children.flat():[t.children];for(let o of a)o==null||o===false||(r=c(o,r,s));}return n.nextSibling}return e?.nextSibling||null}function b(t,e,s){for(let n in e){let i=e[n];if(n==="children"||n==="key"||n==="ref"){n==="ref"&&typeof i=="function"&&i(t);continue}if(n.startsWith("on")){let r=n.slice(2).toLowerCase();t.addEventListener(r,i);continue}if(g(i)){let r=n==="className"?"class":n;c$1(()=>{let a=i();if(r==="class")t.setAttribute("class",String(a));else if(r==="style"&&typeof a=="object")Object.assign(t.style,a);else {let o=C[r]||r;r in t&&!(t instanceof SVGElement)?t[r]=a:t.setAttribute(o,String(a));}});continue}if(typeof __DEV__<"u"&&__DEV__&&(n==="className"||n==="class")){let r=t.getAttribute("class")||"";r!==i&&s.handleMismatch(`Class mismatch on <${t.tagName.toLowerCase()}>: "${r}" vs "${i}"`,t,e);}}}export{M as hydrate};//# sourceMappingURL=dom.mjs.map
2
2
  //# sourceMappingURL=dom.mjs.map
package/dist/dom.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/renderers/dom/hydrate.ts"],"names":["SVG_ATTR_MAP","hydrate","vnode","container","options","onMismatch","recoverMismatch","handleMismatch","message","domNode","vn","hydrateNode","ctx","text","isSignal","effect","value","result","currentNode","children","child","el","tagName","hydrateProps","childDom","props","key","eventName","propName","attrName","domClass"],"mappings":"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","file":"dom.mjs","sourcesContent":["import { isSignal } from '../../core/signal'\nimport { effect } from '../../core/effect'\n\n/**\n * SVG Attribute Case Mapping\n * React-like camelCase to SVG case-sensitive attributes\n */\nconst SVG_ATTR_MAP: Record<string, string> = {\n viewBox: 'viewBox',\n preserveAspectRatio: 'preserveAspectRatio',\n strokeWidth: 'stroke-width',\n strokeLinecap: 'stroke-linecap',\n strokeLinejoin: 'stroke-linejoin',\n strokeDasharray: 'stroke-dasharray',\n strokeDashoffset: 'stroke-dashoffset',\n fillOpacity: 'fill-opacity',\n strokeOpacity: 'stroke-opacity',\n stopColor: 'stop-color',\n stopOpacity: 'stop-opacity',\n clipPath: 'clip-path',\n markerEnd: 'marker-end',\n markerStart: 'marker-start',\n markerMid: 'marker-mid',\n}\n\n/**\n * Hydration options\n */\nexport interface HydrateOptions {\n /** Called when hydration encounters a mismatch */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMismatch?: (message: string, domNode: Node | null, vnode: any) => void\n /** Whether to recover from mismatches by re-rendering */\n recoverMismatch?: boolean\n}\n\n/**\n * Hydrate server-rendered HTML with client-side interactivity\n *\n * This function walks the existing DOM tree and attaches event handlers,\n * sets up signal bindings, and validates that the DOM matches the expected vnode structure.\n *\n * @param vnode - Virtual node to hydrate against\n * @param container - Container element with server-rendered HTML\n * @param options - Hydration options\n *\n * @example\n * ```tsx\n * // Server rendered HTML in #app\n * hydrate(<App />, document.getElementById('app'));\n * ```\n */\nexport function hydrate(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n container: Element,\n options: HydrateOptions = {}\n) {\n const { onMismatch, recoverMismatch = false } = options\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleMismatch = (message: string, domNode: Node | null, vn: any) => {\n if (onMismatch) {\n onMismatch(message, domNode, vn)\n } else if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n console.warn(`[Flexium Hydration] ${message}`)\n }\n }\n\n hydrateNode(vnode, container.firstChild as Node, {\n handleMismatch,\n recoverMismatch,\n })\n}\n\ninterface HydrateContext {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleMismatch: (message: string, domNode: Node | null, vnode: any) => void\n recoverMismatch: boolean\n}\n\nfunction hydrateNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n domNode: Node | null,\n ctx: HydrateContext\n): Node | null {\n if (vnode === null || vnode === undefined || vnode === false) {\n return domNode\n }\n\n if (!domNode) {\n ctx.handleMismatch('No DOM node found for vnode', domNode, vnode)\n return null\n }\n\n // Handle text/number primitives\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n if (domNode.nodeType === Node.TEXT_NODE) {\n const text = String(vnode)\n if (domNode.textContent !== text) {\n ctx.handleMismatch(\n `Text mismatch: \"${domNode.textContent}\" vs \"${text}\"`,\n domNode,\n vnode\n )\n domNode.textContent = text\n }\n return domNode.nextSibling\n } else {\n ctx.handleMismatch(\n `Expected text node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n }\n\n // Handle signals - create reactive binding\n if (isSignal(vnode)) {\n if (domNode.nodeType === Node.TEXT_NODE) {\n effect(() => {\n domNode.textContent = String(vnode.value)\n })\n return domNode.nextSibling\n }\n }\n\n // Handle computed values\n if (typeof vnode === 'function') {\n // Create reactive binding for computed/derived values\n effect(() => {\n const value = vnode()\n if (domNode.nodeType === Node.TEXT_NODE) {\n domNode.textContent = String(value)\n }\n })\n return domNode.nextSibling\n }\n\n // Handle function components\n if (typeof vnode.type === 'function') {\n const result = vnode.type({ ...vnode.props, children: vnode.children })\n return hydrateNode(result, domNode, ctx)\n }\n\n // Handle fragments\n if (vnode.type === 'fragment' || vnode.type === null) {\n let currentNode: Node | null = domNode\n const children = vnode.children || []\n for (const child of children) {\n currentNode = hydrateNode(child, currentNode, ctx)\n }\n return currentNode\n }\n\n // Handle element vnodes\n if (typeof vnode.type === 'string') {\n if (domNode.nodeType !== Node.ELEMENT_NODE) {\n ctx.handleMismatch(\n `Expected element node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n const el = domNode as Element\n const tagName = el.tagName.toLowerCase()\n\n if (tagName !== vnode.type.toLowerCase()) {\n ctx.handleMismatch(\n `Tag mismatch: \"${tagName}\" vs \"${vnode.type}\"`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n // Hydrate props\n if (vnode.props) {\n hydrateProps(el, vnode.props, ctx)\n }\n\n // Hydrate children\n let childDom = el.firstChild\n if (vnode.children) {\n const children = Array.isArray(vnode.children)\n ? vnode.children.flat()\n : [vnode.children]\n for (const child of children) {\n if (child === null || child === undefined || child === false) continue\n childDom = hydrateNode(child, childDom, ctx) as ChildNode | null\n }\n }\n\n return el.nextSibling\n }\n\n return domNode?.nextSibling || null\n}\n\n/**\n * Hydrate element props - attach events, set up reactive bindings\n */\nfunction hydrateProps(\n el: Element,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: Record<string, any>,\n ctx: HydrateContext\n): void {\n for (const key in props) {\n const value = props[key]\n\n if (key === 'children' || key === 'key' || key === 'ref') {\n // Handle ref callback\n if (key === 'ref' && typeof value === 'function') {\n value(el)\n }\n continue\n }\n\n // Event handlers\n if (key.startsWith('on')) {\n const eventName = key.slice(2).toLowerCase()\n el.addEventListener(eventName, value)\n continue\n }\n\n // Reactive props (signals)\n if (isSignal(value)) {\n const propName = key === 'className' ? 'class' : key\n effect(() => {\n if (propName === 'class') {\n el.setAttribute('class', String(value.value))\n } else if (propName === 'style' && typeof value.value === 'object') {\n Object.assign((el as HTMLElement).style, value.value)\n } else {\n // Handle SVG attributes\n const attrName = SVG_ATTR_MAP[propName] || propName\n\n if (propName in el && !(el instanceof SVGElement)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ; (el as any)[propName] = value.value\n } else {\n el.setAttribute(attrName, String(value.value))\n }\n }\n })\n continue\n }\n\n // Validate static props match (in development)\n if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n if (key === 'className' || key === 'class') {\n const domClass = el.getAttribute('class') || ''\n if (domClass !== value) {\n ctx.handleMismatch(\n `Class mismatch on <${el.tagName.toLowerCase()}>: \"${domClass}\" vs \"${value}\"`,\n el,\n props\n )\n }\n }\n }\n }\n}\n\n// Declare global __DEV__ for development mode detection\ndeclare global {\n const __DEV__: boolean | undefined\n}\n"]}
1
+ {"version":3,"sources":["../src/renderers/dom/hydrate.ts"],"names":["SVG_ATTR_MAP","hydrate","vnode","container","options","onMismatch","recoverMismatch","handleMismatch","message","domNode","vn","hydrateNode","ctx","text","isSignal","effect","value","result","currentNode","children","child","el","tagName","hydrateProps","childDom","props","key","eventName","propName","val","attrName","domClass"],"mappings":"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","file":"dom.mjs","sourcesContent":["import { isSignal } from '../../core/state'\nimport { effect } from '../../core/effect'\n\n/**\n * SVG Attribute Case Mapping\n * React-like camelCase to SVG case-sensitive attributes\n */\nconst SVG_ATTR_MAP: Record<string, string> = {\n viewBox: 'viewBox',\n preserveAspectRatio: 'preserveAspectRatio',\n strokeWidth: 'stroke-width',\n strokeLinecap: 'stroke-linecap',\n strokeLinejoin: 'stroke-linejoin',\n strokeDasharray: 'stroke-dasharray',\n strokeDashoffset: 'stroke-dashoffset',\n fillOpacity: 'fill-opacity',\n strokeOpacity: 'stroke-opacity',\n stopColor: 'stop-color',\n stopOpacity: 'stop-opacity',\n clipPath: 'clip-path',\n markerEnd: 'marker-end',\n markerStart: 'marker-start',\n markerMid: 'marker-mid',\n}\n\n/**\n * Hydration options\n */\nexport interface HydrateOptions {\n /** Called when hydration encounters a mismatch */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onMismatch?: (message: string, domNode: Node | null, vnode: any) => void\n /** Whether to recover from mismatches by re-rendering */\n recoverMismatch?: boolean\n}\n\n/**\n * Hydrate server-rendered HTML with client-side interactivity\n *\n * This function walks the existing DOM tree and attaches event handlers,\n * sets up signal bindings, and validates that the DOM matches the expected vnode structure.\n *\n * @param vnode - Virtual node to hydrate against\n * @param container - Container element with server-rendered HTML\n * @param options - Hydration options\n *\n * @example\n * ```tsx\n * // Server rendered HTML in #app\n * hydrate(<App />, document.getElementById('app'));\n * ```\n */\nexport function hydrate(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n container: Element,\n options: HydrateOptions = {}\n) {\n const { onMismatch, recoverMismatch = false } = options\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleMismatch = (message: string, domNode: Node | null, vn: any) => {\n if (onMismatch) {\n onMismatch(message, domNode, vn)\n } else if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n console.warn(`[Flexium Hydration] ${message}`)\n }\n }\n\n hydrateNode(vnode, container.firstChild as Node, {\n handleMismatch,\n recoverMismatch,\n })\n}\n\ninterface HydrateContext {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleMismatch: (message: string, domNode: Node | null, vnode: any) => void\n recoverMismatch: boolean\n}\n\nfunction hydrateNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vnode: any,\n domNode: Node | null,\n ctx: HydrateContext\n): Node | null {\n if (vnode === null || vnode === undefined || vnode === false) {\n return domNode\n }\n\n if (!domNode) {\n ctx.handleMismatch('No DOM node found for vnode', domNode, vnode)\n return null\n }\n\n // Handle text/number primitives\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n if (domNode.nodeType === Node.TEXT_NODE) {\n const text = String(vnode)\n if (domNode.textContent !== text) {\n ctx.handleMismatch(\n `Text mismatch: \"${domNode.textContent}\" vs \"${text}\"`,\n domNode,\n vnode\n )\n domNode.textContent = text\n }\n return domNode.nextSibling\n } else {\n ctx.handleMismatch(\n `Expected text node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n }\n\n // Handle signals - create reactive binding\n if (isSignal(vnode)) {\n if (domNode.nodeType === Node.TEXT_NODE) {\n effect(() => {\n domNode.textContent = String((vnode as any)())\n })\n return domNode.nextSibling\n }\n }\n\n // Handle computed values\n if (typeof vnode === 'function') {\n // Create reactive binding for computed/derived values\n effect(() => {\n const value = vnode()\n if (domNode.nodeType === Node.TEXT_NODE) {\n domNode.textContent = String(value)\n }\n })\n return domNode.nextSibling\n }\n\n // Handle function components\n if (typeof vnode.type === 'function') {\n const result = vnode.type({ ...vnode.props, children: vnode.children })\n return hydrateNode(result, domNode, ctx)\n }\n\n // Handle fragments\n if (vnode.type === 'fragment' || vnode.type === null) {\n let currentNode: Node | null = domNode\n const children = vnode.children || []\n for (const child of children) {\n currentNode = hydrateNode(child, currentNode, ctx)\n }\n return currentNode\n }\n\n // Handle element vnodes\n if (typeof vnode.type === 'string') {\n if (domNode.nodeType !== Node.ELEMENT_NODE) {\n ctx.handleMismatch(\n `Expected element node, got ${domNode.nodeType}`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n const el = domNode as Element\n const tagName = el.tagName.toLowerCase()\n\n if (tagName !== vnode.type.toLowerCase()) {\n ctx.handleMismatch(\n `Tag mismatch: \"${tagName}\" vs \"${vnode.type}\"`,\n domNode,\n vnode\n )\n return domNode.nextSibling\n }\n\n // Hydrate props\n if (vnode.props) {\n hydrateProps(el, vnode.props, ctx)\n }\n\n // Hydrate children\n let childDom = el.firstChild\n if (vnode.children) {\n const children = Array.isArray(vnode.children)\n ? vnode.children.flat()\n : [vnode.children]\n for (const child of children) {\n if (child === null || child === undefined || child === false) continue\n childDom = hydrateNode(child, childDom, ctx) as ChildNode | null\n }\n }\n\n return el.nextSibling\n }\n\n return domNode?.nextSibling || null\n}\n\n/**\n * Hydrate element props - attach events, set up reactive bindings\n */\nfunction hydrateProps(\n el: Element,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n props: Record<string, any>,\n ctx: HydrateContext\n): void {\n for (const key in props) {\n const value = props[key]\n\n if (key === 'children' || key === 'key' || key === 'ref') {\n // Handle ref callback\n if (key === 'ref' && typeof value === 'function') {\n value(el)\n }\n continue\n }\n\n // Event handlers\n if (key.startsWith('on')) {\n const eventName = key.slice(2).toLowerCase()\n el.addEventListener(eventName, value)\n continue\n }\n\n // Reactive props (signals)\n if (isSignal(value)) {\n const propName = key === 'className' ? 'class' : key\n effect(() => {\n const val = (value as any)()\n if (propName === 'class') {\n el.setAttribute('class', String(val))\n } else if (propName === 'style' && typeof val === 'object') {\n Object.assign((el as HTMLElement).style, val)\n } else {\n // Handle SVG attributes\n const attrName = SVG_ATTR_MAP[propName] || propName\n\n if (propName in el && !(el instanceof SVGElement)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ; (el as any)[propName] = val\n } else {\n el.setAttribute(attrName, String(val))\n }\n }\n })\n continue\n }\n\n // Validate static props match (in development)\n if (typeof __DEV__ !== 'undefined' ? __DEV__ : false) {\n if (key === 'className' || key === 'class') {\n const domClass = el.getAttribute('class') || ''\n if (domClass !== value) {\n ctx.handleMismatch(\n `Class mismatch on <${el.tagName.toLowerCase()}>: \"${domClass}\" vs \"${value}\"`,\n el,\n props\n )\n }\n }\n }\n }\n}\n\n// Declare global __DEV__ for development mode detection\ndeclare global {\n const __DEV__: boolean | undefined\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWWEWRI6S_js=require('./chunk-WWEWRI6S.js');require('./chunk-GYDP6MFV.js');Object.defineProperty(exports,"EffectNode",{enumerable:true,get:function(){return chunkWWEWRI6S_js.b}});Object.defineProperty(exports,"effect",{enumerable:true,get:function(){return chunkWWEWRI6S_js.c}});Object.defineProperty(exports,"onCleanup",{enumerable:true,get:function(){return chunkWWEWRI6S_js.d}});//# sourceMappingURL=effect-554ONNZR.js.map
2
+ //# sourceMappingURL=effect-554ONNZR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"effect-K45UU3N4.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"effect-554ONNZR.js"}
@@ -0,0 +1,2 @@
1
+ export{b as EffectNode,c as effect,d as onCleanup}from'./chunk-HB5VPQTB.mjs';import'./chunk-ECYYIQEX.mjs';//# sourceMappingURL=effect-T2GVIS3T.mjs.map
2
+ //# sourceMappingURL=effect-T2GVIS3T.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"effect-3LUCHSAZ.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"effect-T2GVIS3T.mjs"}
package/dist/index.d.cts CHANGED
@@ -21,6 +21,6 @@
21
21
  * import { Router, Route, Link } from 'flexium/router'
22
22
  * ```
23
23
  */
24
- declare const VERSION = "0.10.4";
24
+ declare const VERSION = "0.10.7";
25
25
 
26
26
  export { VERSION };
package/dist/index.d.ts CHANGED
@@ -21,6 +21,6 @@
21
21
  * import { Router, Route, Link } from 'flexium/router'
22
22
  * ```
23
23
  */
24
- declare const VERSION = "0.10.4";
24
+ declare const VERSION = "0.10.7";
25
25
 
26
26
  export { VERSION };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var o="0.10.4";exports.VERSION=o;//# sourceMappingURL=index.js.map
1
+ 'use strict';var o="0.10.7";exports.VERSION=o;//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["VERSION"],"mappings":"aAwBO,IAAMA,CAAAA,CAAU","file":"index.js","sourcesContent":["/**\n * Flexium - Next-generation UI/UX library\n *\n * Please use explicit imports from submodules:\n *\n * @example\n * ```tsx\n * // Core reactivity\n * import { state, effect } from 'flexium/core'\n *\n * // DOM rendering\n * import { render, createRoot, Portal } from 'flexium/dom'\n *\n * // Canvas rendering\n * import { Canvas, Rect, Circle } from 'flexium/canvas'\n *\n * // Cross-platform primitives\n * import { Row, Column, Text } from 'flexium/primitives'\n *\n * // Router\n * import { Router, Route, Link } from 'flexium/router'\n * ```\n */\n\nexport const VERSION = '0.10.4'\n\n// Intentionally empty - use explicit submodule imports\n// flexium/core, flexium/dom, flexium/canvas, flexium/primitives, flexium/router\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["VERSION"],"mappings":"aAwBO,IAAMA,CAAAA,CAAU","file":"index.js","sourcesContent":["/**\n * Flexium - Next-generation UI/UX library\n *\n * Please use explicit imports from submodules:\n *\n * @example\n * ```tsx\n * // Core reactivity\n * import { state, effect } from 'flexium/core'\n *\n * // DOM rendering\n * import { render, createRoot, Portal } from 'flexium/dom'\n *\n * // Canvas rendering\n * import { Canvas, Rect, Circle } from 'flexium/canvas'\n *\n * // Cross-platform primitives\n * import { Row, Column, Text } from 'flexium/primitives'\n *\n * // Router\n * import { Router, Route, Link } from 'flexium/router'\n * ```\n */\n\nexport const VERSION = '0.10.7'\n\n// Intentionally empty - use explicit submodule imports\n// flexium/core, flexium/dom, flexium/canvas, flexium/primitives, flexium/router\n"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var o="0.10.4";export{o as VERSION};//# sourceMappingURL=index.mjs.map
1
+ var o="0.10.7";export{o as VERSION};//# sourceMappingURL=index.mjs.map
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["VERSION"],"mappings":"AAwBO,IAAMA,CAAAA,CAAU","file":"index.mjs","sourcesContent":["/**\n * Flexium - Next-generation UI/UX library\n *\n * Please use explicit imports from submodules:\n *\n * @example\n * ```tsx\n * // Core reactivity\n * import { state, effect } from 'flexium/core'\n *\n * // DOM rendering\n * import { render, createRoot, Portal } from 'flexium/dom'\n *\n * // Canvas rendering\n * import { Canvas, Rect, Circle } from 'flexium/canvas'\n *\n * // Cross-platform primitives\n * import { Row, Column, Text } from 'flexium/primitives'\n *\n * // Router\n * import { Router, Route, Link } from 'flexium/router'\n * ```\n */\n\nexport const VERSION = '0.10.4'\n\n// Intentionally empty - use explicit submodule imports\n// flexium/core, flexium/dom, flexium/canvas, flexium/primitives, flexium/router\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["VERSION"],"mappings":"AAwBO,IAAMA,CAAAA,CAAU","file":"index.mjs","sourcesContent":["/**\n * Flexium - Next-generation UI/UX library\n *\n * Please use explicit imports from submodules:\n *\n * @example\n * ```tsx\n * // Core reactivity\n * import { state, effect } from 'flexium/core'\n *\n * // DOM rendering\n * import { render, createRoot, Portal } from 'flexium/dom'\n *\n * // Canvas rendering\n * import { Canvas, Rect, Circle } from 'flexium/canvas'\n *\n * // Cross-platform primitives\n * import { Row, Column, Text } from 'flexium/primitives'\n *\n * // Router\n * import { Router, Route, Link } from 'flexium/router'\n * ```\n */\n\nexport const VERSION = '0.10.7'\n\n// Intentionally empty - use explicit submodule imports\n// flexium/core, flexium/dom, flexium/canvas, flexium/primitives, flexium/router\n"]}
@@ -1,4 +1,4 @@
1
- import { S as SignalNode } from './signal-C6936A3J.cjs';
1
+ import { S as StateValue } from './state-DitsMyev.cjs';
2
2
 
3
3
  /**
4
4
  * Loop - Core animation/game loop implementation with delta time and fixed timestep
@@ -50,7 +50,7 @@ interface KeyboardState {
50
50
  * Reactive set of all currently pressed keys
51
51
  * @deprecated Use isPressed() or getPressed() instead for better performance
52
52
  */
53
- keys: SignalNode<Set<string>>;
53
+ keys: StateValue<Set<string>>;
54
54
  /** Clear all state at end of frame */
55
55
  clearFrameState(): void;
56
56
  /** Remove event listeners */
@@ -116,9 +116,9 @@ interface Vec2 {
116
116
  }
117
117
  interface MouseState {
118
118
  /** Current mouse position relative to target */
119
- readonly position: SignalNode<Vec2>;
119
+ readonly position: StateValue<Vec2>;
120
120
  /** Mouse position delta since last frame */
121
- readonly delta: SignalNode<Vec2>;
121
+ readonly delta: StateValue<Vec2>;
122
122
  /** Check if a mouse button is pressed (0=left, 1=middle, 2=right) */
123
123
  isPressed(button: number): boolean;
124
124
  /** Check if left mouse button is pressed */
@@ -128,7 +128,7 @@ interface MouseState {
128
128
  /** Check if middle mouse button is pressed */
129
129
  isMiddlePressed(): boolean;
130
130
  /** Wheel delta (positive = scroll down) */
131
- readonly wheelDelta: SignalNode<number>;
131
+ readonly wheelDelta: StateValue<number>;
132
132
  /** Clear frame state (call at end of frame) */
133
133
  clearFrameState(): void;
134
134
  /** Cleanup event listeners */
@@ -1,4 +1,4 @@
1
- import { S as SignalNode } from './signal-C6936A3J.js';
1
+ import { S as StateValue } from './state-DitsMyev.js';
2
2
 
3
3
  /**
4
4
  * Loop - Core animation/game loop implementation with delta time and fixed timestep
@@ -50,7 +50,7 @@ interface KeyboardState {
50
50
  * Reactive set of all currently pressed keys
51
51
  * @deprecated Use isPressed() or getPressed() instead for better performance
52
52
  */
53
- keys: SignalNode<Set<string>>;
53
+ keys: StateValue<Set<string>>;
54
54
  /** Clear all state at end of frame */
55
55
  clearFrameState(): void;
56
56
  /** Remove event listeners */
@@ -116,9 +116,9 @@ interface Vec2 {
116
116
  }
117
117
  interface MouseState {
118
118
  /** Current mouse position relative to target */
119
- readonly position: SignalNode<Vec2>;
119
+ readonly position: StateValue<Vec2>;
120
120
  /** Mouse position delta since last frame */
121
- readonly delta: SignalNode<Vec2>;
121
+ readonly delta: StateValue<Vec2>;
122
122
  /** Check if a mouse button is pressed (0=left, 1=middle, 2=right) */
123
123
  isPressed(button: number): boolean;
124
124
  /** Check if left mouse button is pressed */
@@ -128,7 +128,7 @@ interface MouseState {
128
128
  /** Check if middle mouse button is pressed */
129
129
  isMiddlePressed(): boolean;
130
130
  /** Wheel delta (positive = scroll down) */
131
- readonly wheelDelta: SignalNode<number>;
131
+ readonly wheelDelta: StateValue<number>;
132
132
  /** Clear frame state (call at end of frame) */
133
133
  clearFrameState(): void;
134
134
  /** Cleanup event listeners */