@jalvin/runtime 2.0.38 → 2.0.39

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 (53) hide show
  1. package/dist/bibi.d.ts +4 -0
  2. package/dist/bibi.d.ts.map +1 -1
  3. package/dist/bibi.js +11 -9
  4. package/dist/bibi.js.map +1 -1
  5. package/dist/coroutines.js +22 -47
  6. package/dist/coroutines.js.map +1 -1
  7. package/dist/dom.d.ts +15 -0
  8. package/dist/dom.d.ts.map +1 -0
  9. package/dist/dom.js +212 -0
  10. package/dist/dom.js.map +1 -0
  11. package/dist/index.d.ts +3 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +18 -224
  14. package/dist/index.js.map +1 -1
  15. package/dist/stateflow.js +8 -19
  16. package/dist/stateflow.js.map +1 -1
  17. package/dist/stdlib/collections.js +55 -108
  18. package/dist/stdlib/collections.js.map +1 -1
  19. package/dist/stdlib/conversions.d.ts +2 -0
  20. package/dist/stdlib/conversions.d.ts.map +1 -1
  21. package/dist/stdlib/conversions.js +17 -29
  22. package/dist/stdlib/conversions.js.map +1 -1
  23. package/dist/stdlib/delegates.js +14 -28
  24. package/dist/stdlib/delegates.js.map +1 -1
  25. package/dist/stdlib/equality.js +1 -4
  26. package/dist/stdlib/equality.js.map +1 -1
  27. package/dist/stdlib/index.js +12 -28
  28. package/dist/stdlib/index.js.map +1 -1
  29. package/dist/stdlib/io.js +2 -6
  30. package/dist/stdlib/io.js.map +1 -1
  31. package/dist/stdlib/math.js +29 -37
  32. package/dist/stdlib/math.js.map +1 -1
  33. package/dist/stdlib/random.js +3 -8
  34. package/dist/stdlib/random.js.map +1 -1
  35. package/dist/stdlib/regex.js +4 -8
  36. package/dist/stdlib/regex.js.map +1 -1
  37. package/dist/stdlib/result.js +3 -9
  38. package/dist/stdlib/result.js.map +1 -1
  39. package/dist/stdlib/strings.js +24 -51
  40. package/dist/stdlib/strings.js.map +1 -1
  41. package/dist/stdlib/timing.js +3 -8
  42. package/dist/stdlib/timing.js.map +1 -1
  43. package/dist/stdlib/types.js +13 -29
  44. package/dist/stdlib/types.js.map +1 -1
  45. package/dist/ui.d.ts +12 -69
  46. package/dist/ui.d.ts.map +1 -1
  47. package/dist/ui.js +130 -228
  48. package/dist/ui.js.map +1 -1
  49. package/package.json +4 -12
  50. package/dist/utils.d.ts +0 -375
  51. package/dist/utils.d.ts.map +0 -1
  52. package/dist/utils.js +0 -1180
  53. package/dist/utils.js.map +0 -1
package/dist/ui.js CHANGED
@@ -1,271 +1,173 @@
1
- "use strict";
2
1
  // ─────────────────────────────────────────────────────────────────────────────
3
- // Jalvin UI runtime — React hooks for StateFlow, ViewModel, remember, mutableStateOf
4
- //
5
- // These are the companion hooks that make Jalvin's UI primitives
6
- // work inside React components.
7
- //
8
- // `component fun` blocks compiled to React components call these hooks.
2
+ // Jalvin UI runtime — Vanilla DOM reactivity system
9
3
  // ─────────────────────────────────────────────────────────────────────────────
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.mutableStateOf = mutableStateOf;
12
- exports.remember = remember;
13
- exports.rememberMutableStateOf = rememberMutableStateOf;
14
- exports.collectAsState = collectAsState;
15
- exports.useViewModel = useViewModel;
16
- exports.LaunchedEffect = LaunchedEffect;
17
- exports.DisposableEffect = DisposableEffect;
18
- exports.SideEffect = SideEffect;
19
- exports.widthToSizeClass = widthToSizeClass;
20
- exports.heightToSizeClass = heightToSizeClass;
21
- exports.WindowSizeClassProvider = WindowSizeClassProvider;
22
- exports.calculateWindowSizeClass = calculateWindowSizeClass;
23
- let _react = null;
24
- function getReact() {
25
- if (_react)
26
- return _react;
27
- try {
28
- // Dynamic require keeps this file tree-shakeable in non-React builds
29
- // eslint-disable-next-line @typescript-eslint/no-var-requires
30
- _react = require("react");
31
- return _react;
4
+ let activeSubscriber = null;
5
+ let stateHolderIdCounter = 0;
6
+ class StateHolder {
7
+ _value;
8
+ subscribers = new Set();
9
+ id = ++stateHolderIdCounter;
10
+ constructor(initial) {
11
+ this._value = initial;
32
12
  }
33
- catch {
34
- throw new Error("[jalvin/runtime] React is required for component functions. " +
35
- "Install react@>=18 and add it to your peer dependencies.");
13
+ get value() {
14
+ if (activeSubscriber) {
15
+ // console.log(`[State ${this.id}] Subscribing active render loop.`);
16
+ this.subscribers.add(activeSubscriber);
17
+ }
18
+ return this._value;
36
19
  }
37
- }
38
- const stateflow_js_1 = require("./stateflow.js");
39
- /**
40
- * Hoisted `mutableStateOf(initial)` inside a `component fun`.
41
- * Returns a mutable object whose `.value` setter triggers a re-render.
42
- *
43
- * Compiled output:
44
- * val count = mutableStateOf(0)
45
- * → const count = mutableStateOf(0);
46
- * // count.value to read; count.value = x to update
47
- */
48
- function mutableStateOf(initial) {
49
- const R = getReact();
50
- const [v, setV] = R.useState(initial);
51
- // stateRef tracks the latest React state value. Updated on every render so
52
- // the value getter always returns the current value, not the initial one.
53
- const stateRef = R.useRef(v);
54
- const holderRef = R.useRef(null);
55
- stateRef.current = v;
56
- if (holderRef.current === null) {
57
- const holder = {};
58
- Object.defineProperties(holder, {
59
- value: {
60
- get() { return stateRef.current; },
61
- set(next) {
62
- if (!Object.is(stateRef.current, next))
63
- setV(next);
64
- },
65
- enumerable: true,
66
- configurable: false,
67
- },
68
- });
69
- holderRef.current = holder;
20
+ set value(next) {
21
+ if (!Object.is(this._value, next)) {
22
+ console.log(`[State ${this.id}] Value changing:`, this._value, "->", next, "| Notifying", this.subscribers.size, "subscribers");
23
+ this._value = next;
24
+ this.notify();
25
+ }
70
26
  }
71
- return holderRef.current;
27
+ notify() {
28
+ for (const sub of Array.from(this.subscribers)) {
29
+ sub();
30
+ }
31
+ }
32
+ }
33
+ // -- Hook System ------------------------------------------------------------
34
+ let currentHookIndex = 0;
35
+ let hookState = [];
36
+ /** Reset the hook pointer (called at the start of every render). */
37
+ function resetHooks() {
38
+ currentHookIndex = 0;
72
39
  }
73
- // ---------------------------------------------------------------------------
74
- // remember { } — memoised value across recompositions
75
- // ---------------------------------------------------------------------------
76
40
  /**
77
- * Compute an expensive value once and remember it.
78
- *
79
- * val scope = remember { CoroutineScope() }
41
+ * Returns a reactive state holder.
80
42
  */
81
- function remember(compute, deps = []) {
82
- const R = getReact();
83
- return R.useMemo(compute, deps);
43
+ export function mutableStateOf(initial) {
44
+ return new StateHolder(initial);
84
45
  }
85
46
  /**
86
- * `remember { mutableStateOf(0) }` — convenience wrapper.
47
+ * Persists a value across re-renders.
87
48
  */
88
- function rememberMutableStateOf(initial) {
89
- const R = getReact();
90
- // eslint-disable-next-line react-hooks/exhaustive-deps
91
- return R.useMemo(() => mutableStateOf(initial), []);
49
+ export function remember(compute, deps = []) {
50
+ const idx = currentHookIndex++;
51
+ const existing = hookState[idx];
52
+ let depsChanged = !existing || !existing.deps || existing.deps.length !== deps.length;
53
+ if (!depsChanged && existing) {
54
+ for (let i = 0; i < deps.length; i++) {
55
+ if (!Object.is(deps[i], existing.deps[i])) {
56
+ depsChanged = true;
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ if (depsChanged) {
62
+ hookState[idx] = { value: compute(), deps };
63
+ }
64
+ return hookState[idx].value;
92
65
  }
93
- // ---------------------------------------------------------------------------
94
- // collectAsState — subscribe to a StateFlow inside a component
95
- // ---------------------------------------------------------------------------
96
66
  /**
97
- * Collects a StateFlow into React state. The component re-renders when
98
- * the flow emits a new value.
99
- *
100
- * val currentName by viewModel.name.collectAsState()
67
+ * Convenience wrapper.
101
68
  */
102
- function collectAsState(flow) {
103
- const R = getReact();
104
- const [value, setValue] = R.useState(flow.value);
105
- R.useEffect(() => {
106
- const unsub = flow.collect((v) => setValue(v));
107
- return unsub;
108
- // eslint-disable-next-line react-hooks/exhaustive-deps
109
- }, [flow]);
110
- return value;
69
+ export function rememberMutableStateOf(initial) {
70
+ return remember(() => mutableStateOf(initial));
111
71
  }
112
- // ---------------------------------------------------------------------------
113
- // useViewModel — get or create a ViewModel scoped to a component subtree
114
- // ---------------------------------------------------------------------------
115
72
  /**
116
- * Returns a shared ViewModel instance for the given key.
117
- *
118
- * val vm = useViewModel("CounterVm") { CounterViewModel() }
73
+ * Collects a StateFlow into reactive state, persisting the subscription across renders.
119
74
  */
120
- function useViewModel(key, factory) {
121
- const R = getReact();
122
- const vm = R.useMemo(() => (0, stateflow_js_1.viewModel)(key, factory), []);
123
- R.useEffect(() => {
124
- return () => (0, stateflow_js_1.clearViewModel)(key);
125
- // Only clear when the component truly unmounts from root
126
- // eslint-disable-next-line react-hooks/exhaustive-deps
127
- }, []);
128
- return vm;
75
+ export function collectAsState(flow) {
76
+ const state = remember(() => {
77
+ const s = mutableStateOf(flow.value);
78
+ flow.collect((v) => { s.value = v; });
79
+ return s;
80
+ }, [flow]);
81
+ return state.value;
129
82
  }
130
- // ---------------------------------------------------------------------------
131
- // LaunchedEffect — run a suspend block tied to component lifecycle
132
- // ---------------------------------------------------------------------------
133
83
  /**
134
- * Runs a suspend block when deps change. Cancels on unmount.
135
- *
136
- * LaunchedEffect(Unit) {
137
- * repeat(10) { delay(1_000) }
138
- * }
84
+ * Runs an effect tied to "component" execution.
139
85
  */
140
- function LaunchedEffect(deps, fn) {
141
- const R = getReact();
142
- R.useEffect(() => {
143
- let cancelled = false;
144
- const guard = async () => {
145
- if (!cancelled)
146
- await fn();
147
- };
148
- guard();
149
- return () => { cancelled = true; };
150
- // eslint-disable-next-line react-hooks/exhaustive-deps
86
+ export function LaunchedEffect(deps, fn) {
87
+ remember(() => {
88
+ fn();
89
+ return true;
151
90
  }, deps);
152
91
  }
153
- // ---------------------------------------------------------------------------
154
- // DisposableEffect — run setup/teardown on deps change
155
- // ---------------------------------------------------------------------------
156
- function DisposableEffect(deps, fn) {
157
- const R = getReact();
158
- R.useEffect(() => {
159
- const cleanup = fn();
160
- return cleanup;
161
- // eslint-disable-next-line react-hooks/exhaustive-deps
92
+ export function DisposableEffect(deps, fn) {
93
+ remember(() => {
94
+ fn();
95
+ return true;
162
96
  }, deps);
163
97
  }
164
- // ---------------------------------------------------------------------------
165
- // SideEffect — run a non-suspending effect every recomposition
166
- // ---------------------------------------------------------------------------
167
- function SideEffect(fn) {
168
- const R = getReact();
169
- R.useEffect(fn);
98
+ export function SideEffect(fn) {
99
+ fn();
170
100
  }
171
- /** @internal exported for testing */
172
- function widthToSizeClass(widthPx) {
101
+ export function widthToSizeClass(widthPx) {
173
102
  if (widthPx < 600)
174
103
  return "Compact";
175
104
  if (widthPx < 840)
176
105
  return "Medium";
177
106
  return "Expanded";
178
107
  }
179
- /** @internal exported for testing */
180
- function heightToSizeClass(heightPx) {
108
+ export function heightToSizeClass(heightPx) {
181
109
  if (heightPx < 480)
182
110
  return "Compact";
183
111
  if (heightPx < 900)
184
112
  return "Medium";
185
113
  return "Expanded";
186
114
  }
187
- // ---------------------------------------------------------------------------
188
- // WindowSizeClassProvider single resize listener for the whole tree
189
- //
190
- // Mount this once at the app root. All calls to calculateWindowSizeClass()
191
- // read from this context, so a single resize event produces exactly one
192
- // coordinated state update regardless of how many components call the hook.
193
- // ---------------------------------------------------------------------------
194
- const DEFAULT_WINDOW_SIZE_CLASS = {
195
- widthSizeClass: "Expanded",
196
- heightSizeClass: "Medium",
197
- };
198
- // Lazily created so the module remains usable in non-React (Node) builds.
199
- let _WindowSizeClassContext = null;
200
- function getWindowSizeClassContext() {
201
- if (!_WindowSizeClassContext) {
202
- _WindowSizeClassContext = getReact().createContext(DEFAULT_WINDOW_SIZE_CLASS);
203
- }
204
- return _WindowSizeClassContext;
205
- }
206
- /**
207
- * Mount once at the app root. Registers a single `resize` listener and
208
- * distributes the current {@link WindowSizeClassState} to all descendants
209
- * that call {@link calculateWindowSizeClass}.
210
- *
211
- * The vite-plugin entry module wraps the root component in this provider
212
- * automatically when the `entry` option is used.
213
- *
214
- * @example
215
- * ```jalvin
216
- * // main entry
217
- * root.render(
218
- * WindowSizeClassProvider { MyApp() }
219
- * )
220
- * ```
221
- */
222
- function WindowSizeClassProvider({ children }) {
223
- const R = getReact();
224
- const getState = () => ({
225
- widthSizeClass: widthToSizeClass(typeof window !== "undefined" ? window.innerWidth : 1280),
226
- heightSizeClass: heightToSizeClass(typeof window !== "undefined" ? window.innerHeight : 800),
227
- });
228
- const [state, setState] = R.useState(getState);
229
- R.useEffect(() => {
230
- const onResize = () => {
231
- const next = getState();
232
- setState(prev => prev.widthSizeClass === next.widthSizeClass &&
233
- prev.heightSizeClass === next.heightSizeClass
234
- ? prev
235
- : next);
115
+ const windowSizeState = new StateHolder({
116
+ widthSizeClass: widthToSizeClass(typeof window !== "undefined" ? window.innerWidth : 1280),
117
+ heightSizeClass: heightToSizeClass(typeof window !== "undefined" ? window.innerHeight : 800),
118
+ });
119
+ if (typeof window !== "undefined") {
120
+ window.addEventListener("resize", () => {
121
+ windowSizeState.value = {
122
+ widthSizeClass: widthToSizeClass(window.innerWidth),
123
+ heightSizeClass: heightToSizeClass(window.innerHeight),
236
124
  };
237
- window.addEventListener("resize", onResize);
238
- return () => window.removeEventListener("resize", onResize);
239
- // eslint-disable-next-line react-hooks/exhaustive-deps
240
- }, []);
241
- const ctx = getWindowSizeClassContext();
242
- return R.createElement(ctx.Provider, { value: state }, children);
125
+ });
126
+ }
127
+ export function calculateWindowSizeClass() {
128
+ return windowSizeState.value;
129
+ }
130
+ export function WindowSizeClassProvider({ children }) {
131
+ return children;
243
132
  }
133
+ // -- ViewModels -------------------------------------------------------------
134
+ export { viewModel as useViewModel } from "./stateflow.js";
135
+ // -- Root Rendering ---------------------------------------------------------
136
+ let renderCount = 0;
137
+ import { patch } from "./dom.js";
244
138
  /**
245
- * Returns the current {@link WindowSizeClassState}. Re-renders only when the
246
- * window crosses a breakpoint boundary.
247
- *
248
- * Requires {@link WindowSizeClassProvider} to be mounted somewhere above this
249
- * component in the tree (the vite-plugin does this automatically). If no
250
- * provider is found the hook falls back to "Expanded/Medium" and logs a
251
- * warning in development.
252
- *
253
- * Mirrors `calculateWindowSizeClass()` from Compose Material3 Adaptive.
254
- *
255
- * @example
256
- * ```jalvin
257
- * component fun AdaptiveLayout() {
258
- * val windowSize = calculateWindowSizeClass()
259
- * if (windowSize.widthSizeClass == "Compact") {
260
- * MobileLayout()
261
- * } else {
262
- * DesktopLayout()
263
- * }
264
- * }
265
- * ```
139
+ * Mounts a Jalvin component to the DOM and sets up the re-render loop.
266
140
  */
267
- function calculateWindowSizeClass() {
268
- const R = getReact();
269
- return R.useContext(getWindowSizeClassContext());
141
+ export function render(rootComponent, container) {
142
+ // Store the last rendered VNode on the container
143
+ let oldVNode = container._jalvin_vnode || null;
144
+ const update = () => {
145
+ renderCount++;
146
+ console.log(`[RENDER] Cycle ${renderCount} starting...`);
147
+ activeSubscriber = update;
148
+ resetHooks();
149
+ // Save current active element (focus) and selection
150
+ let activeId = "";
151
+ if (document.activeElement && document.activeElement.id) {
152
+ activeId = document.activeElement.id;
153
+ }
154
+ else if (document.activeElement && document.activeElement.tagName === "INPUT") {
155
+ activeId = document.activeElement.name;
156
+ }
157
+ const newVNode = rootComponent();
158
+ // Patch the DOM instead of recreating it
159
+ patch(container, newVNode, oldVNode);
160
+ oldVNode = newVNode;
161
+ container._jalvin_vnode = oldVNode;
162
+ // Restore focus if possible
163
+ if (activeId) {
164
+ const toFocus = document.getElementById(activeId) || document.querySelector(`input[name="${activeId}"]`);
165
+ if (toFocus)
166
+ toFocus.focus();
167
+ }
168
+ activeSubscriber = null;
169
+ console.log(`[RENDER] Cycle ${renderCount} finished.`);
170
+ };
171
+ update();
270
172
  }
271
173
  //# sourceMappingURL=ui.js.map
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,qFAAqF;AACrF,EAAE;AACF,iEAAiE;AACjE,gCAAgC;AAChC,EAAE;AACF,wEAAwE;AACxE,gFAAgF;;AAyChF,wCA0BC;AAWD,4BAGC;AAKD,wDAIC;AAYD,wCASC;AAWD,oCAYC;AAaD,wCAcC;AAMD,4CAUC;AAMD,gCAGC;AAcD,4CAIC;AAGD,8CAIC;AA8CD,0DA6BC;AAyBD,4DAGC;AAtTD,IAAI,MAAM,GAAuB,IAAI,CAAC;AAEtC,SAAS,QAAQ;IACf,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,CAAC;QACH,qEAAqE;QACrE,8DAA8D;QAC9D,MAAM,GAAG,OAAO,CAAC,OAAO,CAAgB,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,8DAA8D;YAC9D,0DAA0D,CAC3D,CAAC;IACJ,CAAC;AACH,CAAC;AAGD,iDAAkF;AAUlF;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAAI,OAAU;IAC1C,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAI,OAAO,CAAC,CAAC;IACzC,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAI,CAAC,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAyB,IAAI,CAAC,CAAC;IAEzD,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;IAErB,IAAI,SAAS,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,EAAqB,CAAC;QACrC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE;YAC9B,KAAK,EAAE;gBACL,GAAG,KAAK,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBAClC,GAAG,CAAC,IAAO;oBACT,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;wBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrD,CAAC;gBACD,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,KAAK;aACpB;SACF,CAAC,CAAC;QACH,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC,OAAO,CAAC;AAC3B,CAAC;AAED,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAE9E;;;;GAIG;AACH,SAAgB,QAAQ,CAAI,OAAgB,EAAE,OAA2B,EAAE;IACzE,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAI,OAAU;IAClD,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,uDAAuD;IACvD,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,+DAA+D;AAC/D,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAgB,cAAc,CAAI,IAAkB;IAClD,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC;QACf,uDAAuD;IACvD,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACX,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,yEAAyE;AACzE,8EAA8E;AAE9E;;;;GAIG;AACH,SAAgB,YAAY,CAC1B,GAAW,EACX,OAAgB;IAEhB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAA,wBAAQ,EAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;QACf,OAAO,GAAG,EAAE,CAAC,IAAA,6BAAc,EAAC,GAAG,CAAC,CAAC;QACnC,yDAAyD;QACzD,uDAAuD;IACvD,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAE9E;;;;;;GAMG;AACH,SAAgB,cAAc,CAC5B,IAAwB,EACxB,EAAuB;IAEvB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;QACf,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;YACvB,IAAI,CAAC,SAAS;gBAAE,MAAM,EAAE,EAAE,CAAC;QAC7B,CAAC,CAAC;QACF,KAAK,EAAE,CAAC;QACR,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,uDAAuD;IACvD,CAAC,EAAE,IAAI,CAAC,CAAC;AACX,CAAC;AAED,8EAA8E;AAC9E,uDAAuD;AACvD,8EAA8E;AAE9E,SAAgB,gBAAgB,CAC9B,IAAwB,EACxB,EAAsB;IAEtB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;QACf,MAAM,OAAO,GAAG,EAAE,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC;QACjB,uDAAuD;IACvD,CAAC,EAAE,IAAI,CAAC,CAAC;AACX,CAAC;AAED,8EAA8E;AAC9E,+DAA+D;AAC/D,8EAA8E;AAE9E,SAAgB,UAAU,CAAC,EAAc;IACvC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAaD,uCAAuC;AACvC,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IACnC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,uCAAuC;AACvC,SAAgB,iBAAiB,CAAC,QAAgB;IAChD,IAAI,QAAQ,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,QAAQ,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IACpC,OAAO,UAAU,CAAC;AACpB,CAAC;AAOD,8EAA8E;AAC9E,sEAAsE;AACtE,EAAE;AACF,2EAA2E;AAC3E,wEAAwE;AACxE,4EAA4E;AAC5E,8EAA8E;AAE9E,MAAM,yBAAyB,GAAyB;IACtD,cAAc,EAAE,UAAU;IAC1B,eAAe,EAAE,QAAQ;CAC1B,CAAC;AAEF,0EAA0E;AAC1E,IAAI,uBAAuB,GAAyD,IAAI,CAAC;AAEzF,SAAS,yBAAyB;IAChC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC7B,uBAAuB,GAAG,QAAQ,EAAE,CAAC,aAAa,CAAuB,yBAAyB,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,uBAAuB,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,uBAAuB,CACrC,EAAE,QAAQ,EAA4C;IAEtD,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IAErB,MAAM,QAAQ,GAAG,GAAyB,EAAE,CAAC,CAAC;QAC5C,cAAc,EAAG,gBAAgB,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAE,CAAC,CAAC,IAAI,CAAC;QAC5F,eAAe,EAAE,iBAAiB,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;KAC7F,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAuB,QAAQ,CAAC,CAAC;IAErE,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;QACf,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,CACd,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,cAAc;gBAC3C,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,eAAe;gBAC3C,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,IAAI,CACT,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9D,uDAAuD;IACvD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,GAAG,GAAG,yBAAyB,EAAE,CAAC;IACxC,OAAO,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,SAAgB,wBAAwB;IACtC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;IACrB,OAAO,CAAC,CAAC,UAAU,CAAC,yBAAyB,EAAE,CAAC,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@jalvin/runtime",
3
- "version": "2.0.38",
4
- "description": "Jalvin runtime — Bibi HTTP client, coroutines, StateFlow, ViewModel, UI hooks",
3
+ "version": "2.0.39",
4
+ "description": "Jalvin runtime — Bibi HTTP client, coroutines, StateFlow, ViewModel, UI reactivity",
5
+ "type": "module",
5
6
  "main": "dist/index.js",
6
7
  "module": "dist/index.js",
7
8
  "types": "dist/index.d.ts",
@@ -18,19 +19,10 @@
18
19
  "files": [
19
20
  "dist"
20
21
  ],
21
- "peerDependencies": {
22
- "react": ">=18.0.0"
23
- },
24
- "peerDependenciesMeta": {
25
- "react": {
26
- "optional": true
27
- }
28
- },
29
22
  "devDependencies": {
30
- "typescript": "^5.4.0",
31
23
  "@types/node": "^20.0.0",
32
- "@types/react": "^18.0.0",
33
24
  "@vitest/coverage-v8": "^2.1.9",
25
+ "typescript": "^5.4.0",
34
26
  "vitest": "^2.1.9"
35
27
  },
36
28
  "scripts": {