xote 6.1.2 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -10
- package/dist/xote.cjs +10 -10
- package/dist/xote.mjs +1491 -1330
- package/dist/xote.umd.js +8 -8
- package/package.json +16 -1
- package/rescript.json +2 -0
- package/src/Html.res +13 -13
- package/src/Html.res.mjs +13 -13
- package/src/Hydration.res +134 -79
- package/src/Hydration.res.mjs +255 -186
- package/src/Node.res +2 -594
- package/src/Node.res.mjs +31 -535
- package/src/Prop.res +16 -0
- package/src/Prop.res.mjs +35 -0
- package/src/ReactiveProp.res +2 -14
- package/src/ReactiveProp.res.mjs +7 -20
- package/src/Route.res +4 -0
- package/src/Route.res.mjs +9 -0
- package/src/Router.res +25 -49
- package/src/Router.res.mjs +22 -34
- package/src/RuntimeAttr.res +21 -0
- package/src/RuntimeAttr.res.mjs +42 -0
- package/src/RuntimeDom.res +95 -0
- package/src/RuntimeDom.res.mjs +101 -0
- package/src/RuntimeHtml.res +27 -0
- package/src/RuntimeHtml.res.mjs +34 -0
- package/src/RuntimeHydrationMarkers.res +24 -0
- package/src/RuntimeHydrationMarkers.res.mjs +68 -0
- package/src/RuntimeJsxProp.res +46 -0
- package/src/RuntimeJsxProp.res.mjs +52 -0
- package/src/RuntimeOwner.res +43 -0
- package/src/RuntimeOwner.res.mjs +51 -0
- package/src/SSR.res +25 -93
- package/src/SSR.res.mjs +59 -126
- package/src/SSRState.res +3 -0
- package/src/SSRState.res.mjs +8 -2
- package/src/View.res +599 -0
- package/src/View.res.mjs +614 -0
- package/src/XoteJSX.res +64 -118
- package/src/XoteJSX.res.mjs +79 -118
package/src/View.res.mjs
ADDED
|
@@ -0,0 +1,614 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Effect$Xote from "./Effect.res.mjs";
|
|
4
|
+
import * as Signal$Xote from "./Signal.res.mjs";
|
|
5
|
+
import * as Stdlib_Dict from "@rescript/runtime/lib/es6/Stdlib_Dict.js";
|
|
6
|
+
import * as Computed$Xote from "./Computed.res.mjs";
|
|
7
|
+
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
8
|
+
import * as RuntimeDom$Xote from "./RuntimeDom.res.mjs";
|
|
9
|
+
import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
|
|
10
|
+
import * as RuntimeOwner$Xote from "./RuntimeOwner.res.mjs";
|
|
11
|
+
|
|
12
|
+
function $$static(key, value) {
|
|
13
|
+
return [
|
|
14
|
+
key,
|
|
15
|
+
{
|
|
16
|
+
TAG: "Static",
|
|
17
|
+
_0: value
|
|
18
|
+
}
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function signal(key, signal$1) {
|
|
23
|
+
return [
|
|
24
|
+
key,
|
|
25
|
+
{
|
|
26
|
+
TAG: "SignalValue",
|
|
27
|
+
_0: signal$1
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function computed(key, compute) {
|
|
33
|
+
return [
|
|
34
|
+
key,
|
|
35
|
+
{
|
|
36
|
+
TAG: "Compute",
|
|
37
|
+
_0: compute
|
|
38
|
+
}
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
let Attributes = {
|
|
43
|
+
$$static: $$static,
|
|
44
|
+
signal: signal,
|
|
45
|
+
computed: computed
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
let Attr = {
|
|
49
|
+
string: $$static,
|
|
50
|
+
signal: signal,
|
|
51
|
+
compute: computed
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
function disposeElement(el) {
|
|
55
|
+
let owner = RuntimeOwner$Xote.getOwner(el);
|
|
56
|
+
if (owner !== undefined) {
|
|
57
|
+
RuntimeOwner$Xote.disposeOwner(owner);
|
|
58
|
+
}
|
|
59
|
+
let childNodes = (Array.from(el.childNodes || []));
|
|
60
|
+
childNodes.forEach(disposeElement);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function shallowEqualIdentity(a, b) {
|
|
64
|
+
if (a === b) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
if (typeof a !== "object" || typeof b !== "object") {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
let keysA = Object.keys(a);
|
|
71
|
+
let keysB = Object.keys(b);
|
|
72
|
+
if (keysA.length !== keysB.length) {
|
|
73
|
+
return false;
|
|
74
|
+
} else {
|
|
75
|
+
return keysA.every(key => {
|
|
76
|
+
let match = a[key];
|
|
77
|
+
let match$1 = b[key];
|
|
78
|
+
if (match !== undefined && match$1 !== undefined) {
|
|
79
|
+
return Primitive_option.valFromOption(match) === Primitive_option.valFromOption(match$1);
|
|
80
|
+
} else {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function clearKeyedItems(keyedItems) {
|
|
88
|
+
Object.keys(keyedItems).forEach(key => {
|
|
89
|
+
Stdlib_Dict.$$delete(keyedItems, key);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function getKeyedChildren(children) {
|
|
94
|
+
let keyedChildren = [];
|
|
95
|
+
let allKeyed = {
|
|
96
|
+
contents: true
|
|
97
|
+
};
|
|
98
|
+
children.forEach(child => {
|
|
99
|
+
if (child.TAG !== "Keyed") {
|
|
100
|
+
allKeyed.contents = false;
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
keyedChildren.push({
|
|
104
|
+
key: child.key,
|
|
105
|
+
identity: child.identity,
|
|
106
|
+
child: child.child
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
if (allKeyed.contents) {
|
|
110
|
+
return keyedChildren;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function reconcileKeyedChildren(keyedChildren, keyedItems, parent) {
|
|
115
|
+
let newKeyMap = {};
|
|
116
|
+
keyedChildren.forEach(child => {
|
|
117
|
+
newKeyMap[child.key] = child;
|
|
118
|
+
});
|
|
119
|
+
let keysToRemove = [];
|
|
120
|
+
Object.keys(keyedItems).forEach(key => {
|
|
121
|
+
let match = newKeyMap[key];
|
|
122
|
+
if (match !== undefined) {
|
|
123
|
+
return;
|
|
124
|
+
} else {
|
|
125
|
+
keysToRemove.push(key);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
keysToRemove.forEach(key => {
|
|
130
|
+
let keyedItem = keyedItems[key];
|
|
131
|
+
if (keyedItem !== undefined) {
|
|
132
|
+
disposeElement(keyedItem.element);
|
|
133
|
+
keyedItem.element.remove();
|
|
134
|
+
Stdlib_Dict.$$delete(keyedItems, key);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
let newOrder = [];
|
|
139
|
+
let elementsToReplace = {};
|
|
140
|
+
keyedChildren.forEach(keyedChild => {
|
|
141
|
+
let existing = keyedItems[keyedChild.key];
|
|
142
|
+
if (existing !== undefined) {
|
|
143
|
+
if (shallowEqualIdentity(existing.item, keyedChild.identity)) {
|
|
144
|
+
newOrder.push(existing);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
let element = render(keyedChild.child);
|
|
148
|
+
let keyedItem_key = keyedChild.key;
|
|
149
|
+
let keyedItem_item = keyedChild.identity;
|
|
150
|
+
let keyedItem = {
|
|
151
|
+
key: keyedItem_key,
|
|
152
|
+
item: keyedItem_item,
|
|
153
|
+
element: element
|
|
154
|
+
};
|
|
155
|
+
elementsToReplace[keyedChild.key] = existing.element;
|
|
156
|
+
newOrder.push(keyedItem);
|
|
157
|
+
keyedItems[keyedChild.key] = keyedItem;
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
let element$1 = render(keyedChild.child);
|
|
161
|
+
let keyedItem_key$1 = keyedChild.key;
|
|
162
|
+
let keyedItem_item$1 = keyedChild.identity;
|
|
163
|
+
let keyedItem$1 = {
|
|
164
|
+
key: keyedItem_key$1,
|
|
165
|
+
item: keyedItem_item$1,
|
|
166
|
+
element: element$1
|
|
167
|
+
};
|
|
168
|
+
newOrder.push(keyedItem$1);
|
|
169
|
+
keyedItems[keyedChild.key] = keyedItem$1;
|
|
170
|
+
});
|
|
171
|
+
let node = parent.firstChild;
|
|
172
|
+
let marker = {
|
|
173
|
+
contents: !(node == null) ? Primitive_option.some(node) : undefined
|
|
174
|
+
};
|
|
175
|
+
newOrder.forEach(keyedItem => {
|
|
176
|
+
let currentElement = marker.contents;
|
|
177
|
+
if (currentElement !== undefined) {
|
|
178
|
+
let elem = Primitive_option.valFromOption(currentElement);
|
|
179
|
+
if (elem === keyedItem.element) {
|
|
180
|
+
marker.contents = Primitive_option.fromNullable(elem.nextSibling);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
let previousElement = elementsToReplace[keyedItem.key];
|
|
184
|
+
if (previousElement !== undefined) {
|
|
185
|
+
let previousElement$1 = Primitive_option.valFromOption(previousElement);
|
|
186
|
+
if (elem === previousElement$1) {
|
|
187
|
+
disposeElement(previousElement$1);
|
|
188
|
+
parent.replaceChild(keyedItem.element, previousElement$1);
|
|
189
|
+
marker.contents = Primitive_option.fromNullable(keyedItem.element.nextSibling);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
parent.insertBefore(keyedItem.element, elem);
|
|
194
|
+
marker.contents = Primitive_option.fromNullable(keyedItem.element.nextSibling);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
let previousElement$2 = elementsToReplace[keyedItem.key];
|
|
198
|
+
if (previousElement$2 !== undefined) {
|
|
199
|
+
let previousElement$3 = Primitive_option.valFromOption(previousElement$2);
|
|
200
|
+
disposeElement(previousElement$3);
|
|
201
|
+
previousElement$3.remove();
|
|
202
|
+
parent.appendChild(keyedItem.element);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
parent.appendChild(keyedItem.element);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function render(_node) {
|
|
210
|
+
while (true) {
|
|
211
|
+
let node = _node;
|
|
212
|
+
switch (node.TAG) {
|
|
213
|
+
case "Element" :
|
|
214
|
+
let children = node.children;
|
|
215
|
+
let events = node.events;
|
|
216
|
+
let attrs = node.attrs;
|
|
217
|
+
let tag = node.tag;
|
|
218
|
+
let el = RuntimeDom$Xote.createElementForTag(tag);
|
|
219
|
+
let owner = RuntimeOwner$Xote.createOwner();
|
|
220
|
+
RuntimeOwner$Xote.setOwner(el, owner);
|
|
221
|
+
RuntimeOwner$Xote.runWithOwner(owner, () => {
|
|
222
|
+
let shouldDeferAttrUntilAfterChildren = param => {
|
|
223
|
+
if (tag === "select") {
|
|
224
|
+
return param[0] === "value";
|
|
225
|
+
} else {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
let applyAttr = param => {
|
|
230
|
+
let value = param[1];
|
|
231
|
+
let key = param[0];
|
|
232
|
+
switch (value.TAG) {
|
|
233
|
+
case "Static" :
|
|
234
|
+
return RuntimeDom$Xote.setAttrOrProp(el, key, value._0);
|
|
235
|
+
case "SignalValue" :
|
|
236
|
+
let signal = value._0;
|
|
237
|
+
RuntimeDom$Xote.setAttrOrProp(el, key, Signal$Xote.peek(signal));
|
|
238
|
+
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
239
|
+
RuntimeDom$Xote.setAttrOrProp(el, key, Signal$Xote.get(signal));
|
|
240
|
+
}, undefined);
|
|
241
|
+
return RuntimeOwner$Xote.addDisposer(owner, disposer);
|
|
242
|
+
case "Compute" :
|
|
243
|
+
let compute = value._0;
|
|
244
|
+
let disposer$1 = Effect$Xote.runWithDisposer(() => {
|
|
245
|
+
RuntimeDom$Xote.setAttrOrProp(el, key, compute());
|
|
246
|
+
}, undefined);
|
|
247
|
+
return RuntimeOwner$Xote.addDisposer(owner, disposer$1);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
attrs.forEach(attr => {
|
|
251
|
+
if (!shouldDeferAttrUntilAfterChildren(attr)) {
|
|
252
|
+
return applyAttr(attr);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
events.forEach(param => {
|
|
256
|
+
el.addEventListener(param[0], param[1]);
|
|
257
|
+
});
|
|
258
|
+
children.forEach(child => {
|
|
259
|
+
let childEl = render(child);
|
|
260
|
+
el.appendChild(childEl);
|
|
261
|
+
});
|
|
262
|
+
attrs.forEach(attr => {
|
|
263
|
+
if (shouldDeferAttrUntilAfterChildren(attr)) {
|
|
264
|
+
return applyAttr(attr);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
return el;
|
|
269
|
+
case "Text" :
|
|
270
|
+
return document.createTextNode(node._0);
|
|
271
|
+
case "SignalText" :
|
|
272
|
+
let signal = node._0;
|
|
273
|
+
let textNode = document.createTextNode(Signal$Xote.peek(signal));
|
|
274
|
+
let owner$1 = RuntimeOwner$Xote.createOwner();
|
|
275
|
+
RuntimeOwner$Xote.setOwner(textNode, owner$1);
|
|
276
|
+
RuntimeOwner$Xote.runWithOwner(owner$1, () => {
|
|
277
|
+
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
278
|
+
textNode.textContent = Signal$Xote.get(signal);
|
|
279
|
+
}, undefined);
|
|
280
|
+
RuntimeOwner$Xote.addDisposer(owner$1, disposer);
|
|
281
|
+
});
|
|
282
|
+
return textNode;
|
|
283
|
+
case "Fragment" :
|
|
284
|
+
let fragment = document.createDocumentFragment();
|
|
285
|
+
node._0.forEach(child => {
|
|
286
|
+
let childEl = render(child);
|
|
287
|
+
fragment.appendChild(childEl);
|
|
288
|
+
});
|
|
289
|
+
return fragment;
|
|
290
|
+
case "SignalFragment" :
|
|
291
|
+
let signal$1 = node._0;
|
|
292
|
+
let owner$2 = RuntimeOwner$Xote.createOwner();
|
|
293
|
+
let container = document.createElement("div");
|
|
294
|
+
container.setAttribute("style", "display: contents");
|
|
295
|
+
RuntimeOwner$Xote.setOwner(container, owner$2);
|
|
296
|
+
let keyedItems = {};
|
|
297
|
+
RuntimeOwner$Xote.runWithOwner(owner$2, () => {
|
|
298
|
+
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
299
|
+
let children = Signal$Xote.get(signal$1);
|
|
300
|
+
let keyedChildren = getKeyedChildren(children);
|
|
301
|
+
if (keyedChildren !== undefined) {
|
|
302
|
+
reconcileKeyedChildren(keyedChildren, keyedItems, container);
|
|
303
|
+
} else {
|
|
304
|
+
clearKeyedItems(keyedItems);
|
|
305
|
+
let childNodes = (Array.from(container.childNodes || []));
|
|
306
|
+
childNodes.forEach(disposeElement);
|
|
307
|
+
container.innerHTML = "";
|
|
308
|
+
children.forEach(child => {
|
|
309
|
+
let childEl = render(child);
|
|
310
|
+
container.appendChild(childEl);
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}, undefined);
|
|
314
|
+
RuntimeOwner$Xote.addDisposer(owner$2, disposer);
|
|
315
|
+
});
|
|
316
|
+
return container;
|
|
317
|
+
case "Keyed" :
|
|
318
|
+
_node = node.child;
|
|
319
|
+
continue;
|
|
320
|
+
case "LazyComponent" :
|
|
321
|
+
let owner$3 = RuntimeOwner$Xote.createOwner();
|
|
322
|
+
let childNode = RuntimeOwner$Xote.runWithOwner(owner$3, node._0);
|
|
323
|
+
let el$1 = render(childNode);
|
|
324
|
+
RuntimeOwner$Xote.setOwner(el$1, owner$3);
|
|
325
|
+
return el$1;
|
|
326
|
+
case "KeyedList" :
|
|
327
|
+
let renderItem = node.renderItem;
|
|
328
|
+
let keyFn = node.keyFn;
|
|
329
|
+
let signal$2 = node.signal;
|
|
330
|
+
let owner$4 = RuntimeOwner$Xote.createOwner();
|
|
331
|
+
let startAnchor = document.createComment(" keyed-list-start ");
|
|
332
|
+
let endAnchor = document.createComment(" keyed-list-end ");
|
|
333
|
+
RuntimeOwner$Xote.setOwner(startAnchor, owner$4);
|
|
334
|
+
let keyedItems$1 = {};
|
|
335
|
+
let reconcile = () => {
|
|
336
|
+
let parentOpt = endAnchor.parentNode;
|
|
337
|
+
if (parentOpt == null) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
let newItems = Signal$Xote.get(signal$2);
|
|
341
|
+
let newKeyMap = {};
|
|
342
|
+
newItems.forEach(item => {
|
|
343
|
+
newKeyMap[keyFn(item)] = item;
|
|
344
|
+
});
|
|
345
|
+
let keysToRemove = [];
|
|
346
|
+
Object.keys(keyedItems$1).forEach(key => {
|
|
347
|
+
let match = newKeyMap[key];
|
|
348
|
+
if (match !== undefined) {
|
|
349
|
+
return;
|
|
350
|
+
} else {
|
|
351
|
+
keysToRemove.push(key);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
keysToRemove.forEach(key => {
|
|
356
|
+
let keyedItem = keyedItems$1[key];
|
|
357
|
+
if (keyedItem !== undefined) {
|
|
358
|
+
disposeElement(keyedItem.element);
|
|
359
|
+
keyedItem.element.remove();
|
|
360
|
+
Stdlib_Dict.$$delete(keyedItems$1, key);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
let newOrder = [];
|
|
365
|
+
let elementsToReplace = {};
|
|
366
|
+
newItems.forEach(item => {
|
|
367
|
+
let key = keyFn(item);
|
|
368
|
+
let existing = keyedItems$1[key];
|
|
369
|
+
if (existing !== undefined) {
|
|
370
|
+
if (existing.item !== item) {
|
|
371
|
+
elementsToReplace[key] = true;
|
|
372
|
+
let node = renderItem(item);
|
|
373
|
+
let element = render(node);
|
|
374
|
+
let keyedItem = {
|
|
375
|
+
key: key,
|
|
376
|
+
item: item,
|
|
377
|
+
element: element
|
|
378
|
+
};
|
|
379
|
+
newOrder.push(keyedItem);
|
|
380
|
+
keyedItems$1[key] = keyedItem;
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
newOrder.push(existing);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
let node$1 = renderItem(item);
|
|
387
|
+
let element$1 = render(node$1);
|
|
388
|
+
let keyedItem$1 = {
|
|
389
|
+
key: key,
|
|
390
|
+
item: item,
|
|
391
|
+
element: element$1
|
|
392
|
+
};
|
|
393
|
+
newOrder.push(keyedItem$1);
|
|
394
|
+
keyedItems$1[key] = keyedItem$1;
|
|
395
|
+
});
|
|
396
|
+
let marker = {
|
|
397
|
+
contents: startAnchor.nextSibling
|
|
398
|
+
};
|
|
399
|
+
newOrder.forEach(keyedItem => {
|
|
400
|
+
let currentElement = marker.contents;
|
|
401
|
+
if (currentElement == null) {
|
|
402
|
+
parentOpt.insertBefore(keyedItem.element, endAnchor);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
if (currentElement === endAnchor) {
|
|
406
|
+
parentOpt.insertBefore(keyedItem.element, endAnchor);
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
if (currentElement === keyedItem.element) {
|
|
410
|
+
marker.contents = currentElement.nextSibling;
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
let needsReplacement = Stdlib_Option.getOr(elementsToReplace[keyedItem.key], false);
|
|
414
|
+
if (needsReplacement) {
|
|
415
|
+
disposeElement(currentElement);
|
|
416
|
+
parentOpt.replaceChild(keyedItem.element, currentElement);
|
|
417
|
+
marker.contents = keyedItem.element.nextSibling;
|
|
418
|
+
} else {
|
|
419
|
+
parentOpt.insertBefore(keyedItem.element, currentElement);
|
|
420
|
+
marker.contents = keyedItem.element.nextSibling;
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
};
|
|
424
|
+
let fragment$1 = document.createDocumentFragment();
|
|
425
|
+
fragment$1.appendChild(startAnchor);
|
|
426
|
+
let initialItems = Signal$Xote.peek(signal$2);
|
|
427
|
+
initialItems.forEach(item => {
|
|
428
|
+
let key = keyFn(item);
|
|
429
|
+
let node = renderItem(item);
|
|
430
|
+
let element = render(node);
|
|
431
|
+
let keyedItem = {
|
|
432
|
+
key: key,
|
|
433
|
+
item: item,
|
|
434
|
+
element: element
|
|
435
|
+
};
|
|
436
|
+
keyedItems$1[key] = keyedItem;
|
|
437
|
+
fragment$1.appendChild(element);
|
|
438
|
+
});
|
|
439
|
+
fragment$1.appendChild(endAnchor);
|
|
440
|
+
RuntimeOwner$Xote.runWithOwner(owner$4, () => {
|
|
441
|
+
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
442
|
+
reconcile();
|
|
443
|
+
}, undefined);
|
|
444
|
+
RuntimeOwner$Xote.addDisposer(owner$4, disposer);
|
|
445
|
+
});
|
|
446
|
+
return fragment$1;
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
let Render = {
|
|
452
|
+
disposeElement: disposeElement,
|
|
453
|
+
shallowEqualIdentity: shallowEqualIdentity,
|
|
454
|
+
clearKeyedItems: clearKeyedItems,
|
|
455
|
+
getKeyedChildren: getKeyedChildren,
|
|
456
|
+
reconcileKeyedChildren: reconcileKeyedChildren,
|
|
457
|
+
render: render
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
function text(content) {
|
|
461
|
+
return {
|
|
462
|
+
TAG: "Text",
|
|
463
|
+
_0: content
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
function signalText(compute) {
|
|
468
|
+
let signal = Computed$Xote.make(compute, undefined, undefined);
|
|
469
|
+
return {
|
|
470
|
+
TAG: "SignalText",
|
|
471
|
+
_0: signal
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
function signalInt(compute) {
|
|
476
|
+
let signal = Computed$Xote.make(() => compute().toString(), undefined, undefined);
|
|
477
|
+
return {
|
|
478
|
+
TAG: "SignalText",
|
|
479
|
+
_0: signal
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
function signalFloat(compute) {
|
|
484
|
+
let signal = Computed$Xote.make(() => compute().toString(), undefined, undefined);
|
|
485
|
+
return {
|
|
486
|
+
TAG: "SignalText",
|
|
487
|
+
_0: signal
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
function int(value) {
|
|
492
|
+
return {
|
|
493
|
+
TAG: "Text",
|
|
494
|
+
_0: value.toString()
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
function float(value) {
|
|
499
|
+
return {
|
|
500
|
+
TAG: "Text",
|
|
501
|
+
_0: value.toString()
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
function fragment(children) {
|
|
506
|
+
return {
|
|
507
|
+
TAG: "Fragment",
|
|
508
|
+
_0: children
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
function signalFragment(signal) {
|
|
513
|
+
return {
|
|
514
|
+
TAG: "SignalFragment",
|
|
515
|
+
_0: signal
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
function each(signal, renderItem) {
|
|
520
|
+
let nodesSignal = Computed$Xote.make(() => Signal$Xote.get(signal).map(renderItem), undefined, undefined);
|
|
521
|
+
return {
|
|
522
|
+
TAG: "SignalFragment",
|
|
523
|
+
_0: nodesSignal
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
function eachWithKey(signal, keyFn, renderItem) {
|
|
528
|
+
return {
|
|
529
|
+
TAG: "KeyedList",
|
|
530
|
+
signal: signal,
|
|
531
|
+
keyFn: keyFn,
|
|
532
|
+
renderItem: renderItem
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
function element(tag, attrsOpt, eventsOpt, childrenOpt, param) {
|
|
537
|
+
let attrs = attrsOpt !== undefined ? attrsOpt : [].map(x => x);
|
|
538
|
+
let events = eventsOpt !== undefined ? eventsOpt : [].map(x => x);
|
|
539
|
+
let children = childrenOpt !== undefined ? childrenOpt : [].map(x => x);
|
|
540
|
+
return {
|
|
541
|
+
TAG: "Element",
|
|
542
|
+
tag: tag,
|
|
543
|
+
attrs: attrs,
|
|
544
|
+
events: events,
|
|
545
|
+
children: children
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
function $$null() {
|
|
550
|
+
return {
|
|
551
|
+
TAG: "Text",
|
|
552
|
+
_0: ""
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
function mount(node, container) {
|
|
557
|
+
let el = render(node);
|
|
558
|
+
container.appendChild(el);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
function mountById(node, containerId) {
|
|
562
|
+
let container = document.getElementById(containerId);
|
|
563
|
+
if (container == null) {
|
|
564
|
+
console.error("Container element not found: " + containerId);
|
|
565
|
+
return;
|
|
566
|
+
} else {
|
|
567
|
+
return mount(node, container);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
let DOM;
|
|
572
|
+
|
|
573
|
+
let Reactivity;
|
|
574
|
+
|
|
575
|
+
let attr = $$static;
|
|
576
|
+
|
|
577
|
+
let signalAttr = signal;
|
|
578
|
+
|
|
579
|
+
let computedAttr = computed;
|
|
580
|
+
|
|
581
|
+
let list = each;
|
|
582
|
+
|
|
583
|
+
let keyedList = eachWithKey;
|
|
584
|
+
|
|
585
|
+
let empty = $$null;
|
|
586
|
+
|
|
587
|
+
export {
|
|
588
|
+
DOM,
|
|
589
|
+
Reactivity,
|
|
590
|
+
Attributes,
|
|
591
|
+
attr,
|
|
592
|
+
signalAttr,
|
|
593
|
+
computedAttr,
|
|
594
|
+
Attr,
|
|
595
|
+
Render,
|
|
596
|
+
text,
|
|
597
|
+
signalText,
|
|
598
|
+
signalInt,
|
|
599
|
+
signalFloat,
|
|
600
|
+
int,
|
|
601
|
+
float,
|
|
602
|
+
fragment,
|
|
603
|
+
signalFragment,
|
|
604
|
+
each,
|
|
605
|
+
list,
|
|
606
|
+
eachWithKey,
|
|
607
|
+
keyedList,
|
|
608
|
+
element,
|
|
609
|
+
$$null,
|
|
610
|
+
empty,
|
|
611
|
+
mount,
|
|
612
|
+
mountById,
|
|
613
|
+
}
|
|
614
|
+
/* RuntimeDom-Xote Not a pure module */
|