@jalvin/runtime 2.0.43 → 2.0.45
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.
- package/dist/bibi.d.ts +4 -0
- package/dist/bibi.d.ts.map +1 -1
- package/dist/bibi.js +11 -9
- package/dist/bibi.js.map +1 -1
- package/dist/coroutines.js +22 -47
- package/dist/coroutines.js.map +1 -1
- package/dist/dom.d.ts +15 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +212 -0
- package/dist/dom.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -224
- package/dist/index.js.map +1 -1
- package/dist/nav.d.ts +48 -0
- package/dist/nav.d.ts.map +1 -0
- package/dist/nav.js +136 -0
- package/dist/nav.js.map +1 -0
- package/dist/stateflow.js +8 -19
- package/dist/stateflow.js.map +1 -1
- package/dist/stdlib/collections.js +55 -108
- package/dist/stdlib/collections.js.map +1 -1
- package/dist/stdlib/conversions.d.ts +2 -0
- package/dist/stdlib/conversions.d.ts.map +1 -1
- package/dist/stdlib/conversions.js +17 -29
- package/dist/stdlib/conversions.js.map +1 -1
- package/dist/stdlib/delegates.js +14 -28
- package/dist/stdlib/delegates.js.map +1 -1
- package/dist/stdlib/equality.js +1 -4
- package/dist/stdlib/equality.js.map +1 -1
- package/dist/stdlib/index.js +12 -28
- package/dist/stdlib/index.js.map +1 -1
- package/dist/stdlib/io.js +2 -6
- package/dist/stdlib/io.js.map +1 -1
- package/dist/stdlib/math.js +29 -37
- package/dist/stdlib/math.js.map +1 -1
- package/dist/stdlib/random.js +3 -8
- package/dist/stdlib/random.js.map +1 -1
- package/dist/stdlib/regex.js +4 -8
- package/dist/stdlib/regex.js.map +1 -1
- package/dist/stdlib/result.js +3 -9
- package/dist/stdlib/result.js.map +1 -1
- package/dist/stdlib/strings.js +24 -51
- package/dist/stdlib/strings.js.map +1 -1
- package/dist/stdlib/timing.js +3 -8
- package/dist/stdlib/timing.js.map +1 -1
- package/dist/stdlib/types.js +13 -29
- package/dist/stdlib/types.js.map +1 -1
- package/dist/ui.d.ts +12 -69
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +127 -228
- package/dist/ui.js.map +1 -1
- package/package.json +1 -1
package/dist/ui.js
CHANGED
|
@@ -1,271 +1,170 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
3
|
-
// Jalvin UI runtime —
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
+
this._value = next;
|
|
23
|
+
this.notify();
|
|
24
|
+
}
|
|
70
25
|
}
|
|
71
|
-
|
|
26
|
+
notify() {
|
|
27
|
+
for (const sub of Array.from(this.subscribers)) {
|
|
28
|
+
sub();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// -- Hook System ------------------------------------------------------------
|
|
33
|
+
let currentHookIndex = 0;
|
|
34
|
+
let hookState = [];
|
|
35
|
+
/** Reset the hook pointer (called at the start of every render). */
|
|
36
|
+
function resetHooks() {
|
|
37
|
+
currentHookIndex = 0;
|
|
72
38
|
}
|
|
73
|
-
// ---------------------------------------------------------------------------
|
|
74
|
-
// remember { } — memoised value across recompositions
|
|
75
|
-
// ---------------------------------------------------------------------------
|
|
76
39
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* val scope = remember { CoroutineScope() }
|
|
40
|
+
* Returns a reactive state holder.
|
|
80
41
|
*/
|
|
81
|
-
function
|
|
82
|
-
|
|
83
|
-
return R.useMemo(compute, deps);
|
|
42
|
+
export function mutableStateOf(initial) {
|
|
43
|
+
return new StateHolder(initial);
|
|
84
44
|
}
|
|
85
45
|
/**
|
|
86
|
-
*
|
|
46
|
+
* Persists a value across re-renders.
|
|
87
47
|
*/
|
|
88
|
-
function
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
48
|
+
export function remember(compute, deps = []) {
|
|
49
|
+
const idx = currentHookIndex++;
|
|
50
|
+
const existing = hookState[idx];
|
|
51
|
+
let depsChanged = !existing || !existing.deps || existing.deps.length !== deps.length;
|
|
52
|
+
if (!depsChanged && existing) {
|
|
53
|
+
for (let i = 0; i < deps.length; i++) {
|
|
54
|
+
if (!Object.is(deps[i], existing.deps[i])) {
|
|
55
|
+
depsChanged = true;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (depsChanged) {
|
|
61
|
+
hookState[idx] = { value: compute(), deps };
|
|
62
|
+
}
|
|
63
|
+
return hookState[idx].value;
|
|
92
64
|
}
|
|
93
|
-
// ---------------------------------------------------------------------------
|
|
94
|
-
// collectAsState — subscribe to a StateFlow inside a component
|
|
95
|
-
// ---------------------------------------------------------------------------
|
|
96
65
|
/**
|
|
97
|
-
*
|
|
98
|
-
* the flow emits a new value.
|
|
99
|
-
*
|
|
100
|
-
* val currentName by viewModel.name.collectAsState()
|
|
66
|
+
* Convenience wrapper.
|
|
101
67
|
*/
|
|
102
|
-
function
|
|
103
|
-
|
|
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;
|
|
68
|
+
export function rememberMutableStateOf(initial) {
|
|
69
|
+
return remember(() => mutableStateOf(initial));
|
|
111
70
|
}
|
|
112
|
-
// ---------------------------------------------------------------------------
|
|
113
|
-
// useViewModel — get or create a ViewModel scoped to a component subtree
|
|
114
|
-
// ---------------------------------------------------------------------------
|
|
115
71
|
/**
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
* val vm = useViewModel("CounterVm") { CounterViewModel() }
|
|
72
|
+
* Collects a StateFlow into reactive state, persisting the subscription across renders.
|
|
119
73
|
*/
|
|
120
|
-
function
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
return
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}, []);
|
|
128
|
-
return vm;
|
|
74
|
+
export function collectAsState(flow) {
|
|
75
|
+
const state = remember(() => {
|
|
76
|
+
const s = mutableStateOf(flow.value);
|
|
77
|
+
flow.collect((v) => { s.value = v; });
|
|
78
|
+
return s;
|
|
79
|
+
}, [flow]);
|
|
80
|
+
return state.value;
|
|
129
81
|
}
|
|
130
|
-
// ---------------------------------------------------------------------------
|
|
131
|
-
// LaunchedEffect — run a suspend block tied to component lifecycle
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
82
|
/**
|
|
134
|
-
* Runs
|
|
135
|
-
*
|
|
136
|
-
* LaunchedEffect(Unit) {
|
|
137
|
-
* repeat(10) { delay(1_000) }
|
|
138
|
-
* }
|
|
83
|
+
* Runs an effect tied to "component" execution.
|
|
139
84
|
*/
|
|
140
|
-
function LaunchedEffect(deps, fn) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
|
85
|
+
export function LaunchedEffect(deps, fn) {
|
|
86
|
+
remember(() => {
|
|
87
|
+
fn();
|
|
88
|
+
return true;
|
|
151
89
|
}, deps);
|
|
152
90
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const R = getReact();
|
|
158
|
-
R.useEffect(() => {
|
|
159
|
-
const cleanup = fn();
|
|
160
|
-
return cleanup;
|
|
161
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
91
|
+
export function DisposableEffect(deps, fn) {
|
|
92
|
+
remember(() => {
|
|
93
|
+
fn();
|
|
94
|
+
return true;
|
|
162
95
|
}, deps);
|
|
163
96
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
// ---------------------------------------------------------------------------
|
|
167
|
-
function SideEffect(fn) {
|
|
168
|
-
const R = getReact();
|
|
169
|
-
R.useEffect(fn);
|
|
97
|
+
export function SideEffect(fn) {
|
|
98
|
+
fn();
|
|
170
99
|
}
|
|
171
|
-
|
|
172
|
-
function widthToSizeClass(widthPx) {
|
|
100
|
+
export function widthToSizeClass(widthPx) {
|
|
173
101
|
if (widthPx < 600)
|
|
174
102
|
return "Compact";
|
|
175
103
|
if (widthPx < 840)
|
|
176
104
|
return "Medium";
|
|
177
105
|
return "Expanded";
|
|
178
106
|
}
|
|
179
|
-
|
|
180
|
-
function heightToSizeClass(heightPx) {
|
|
107
|
+
export function heightToSizeClass(heightPx) {
|
|
181
108
|
if (heightPx < 480)
|
|
182
109
|
return "Compact";
|
|
183
110
|
if (heightPx < 900)
|
|
184
111
|
return "Medium";
|
|
185
112
|
return "Expanded";
|
|
186
113
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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);
|
|
114
|
+
const windowSizeState = new StateHolder({
|
|
115
|
+
widthSizeClass: widthToSizeClass(typeof window !== "undefined" ? window.innerWidth : 1280),
|
|
116
|
+
heightSizeClass: heightToSizeClass(typeof window !== "undefined" ? window.innerHeight : 800),
|
|
117
|
+
});
|
|
118
|
+
if (typeof window !== "undefined") {
|
|
119
|
+
window.addEventListener("resize", () => {
|
|
120
|
+
windowSizeState.value = {
|
|
121
|
+
widthSizeClass: widthToSizeClass(window.innerWidth),
|
|
122
|
+
heightSizeClass: heightToSizeClass(window.innerHeight),
|
|
236
123
|
};
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
export function calculateWindowSizeClass() {
|
|
127
|
+
return windowSizeState.value;
|
|
128
|
+
}
|
|
129
|
+
export function WindowSizeClassProvider({ children }) {
|
|
130
|
+
return children;
|
|
243
131
|
}
|
|
132
|
+
// -- ViewModels -------------------------------------------------------------
|
|
133
|
+
export { viewModel as useViewModel } from "./stateflow.js";
|
|
134
|
+
// -- Root Rendering ---------------------------------------------------------
|
|
135
|
+
let renderCount = 0;
|
|
136
|
+
import { patch } from "./dom.js";
|
|
244
137
|
/**
|
|
245
|
-
*
|
|
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
|
-
* ```
|
|
138
|
+
* Mounts a Jalvin component to the DOM and sets up the re-render loop.
|
|
266
139
|
*/
|
|
267
|
-
function
|
|
268
|
-
|
|
269
|
-
|
|
140
|
+
export function render(rootComponent, container) {
|
|
141
|
+
// Store the last rendered VNode on the container
|
|
142
|
+
let oldVNode = container._jalvin_vnode || null;
|
|
143
|
+
const update = () => {
|
|
144
|
+
renderCount++;
|
|
145
|
+
activeSubscriber = update;
|
|
146
|
+
resetHooks();
|
|
147
|
+
// Save current active element (focus) and selection
|
|
148
|
+
let activeId = "";
|
|
149
|
+
if (document.activeElement && document.activeElement.id) {
|
|
150
|
+
activeId = document.activeElement.id;
|
|
151
|
+
}
|
|
152
|
+
else if (document.activeElement && document.activeElement.tagName === "INPUT") {
|
|
153
|
+
activeId = document.activeElement.name;
|
|
154
|
+
}
|
|
155
|
+
const newVNode = rootComponent();
|
|
156
|
+
// Patch the DOM instead of recreating it
|
|
157
|
+
patch(container, newVNode, oldVNode);
|
|
158
|
+
oldVNode = newVNode;
|
|
159
|
+
container._jalvin_vnode = oldVNode;
|
|
160
|
+
// Restore focus if possible
|
|
161
|
+
if (activeId) {
|
|
162
|
+
const toFocus = document.getElementById(activeId) || document.querySelector(`input[name="${activeId}"]`);
|
|
163
|
+
if (toFocus)
|
|
164
|
+
toFocus.focus();
|
|
165
|
+
}
|
|
166
|
+
activeSubscriber = null;
|
|
167
|
+
};
|
|
168
|
+
update();
|
|
270
169
|
}
|
|
271
170
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|