creo 0.0.4-dev → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +276 -1
  2. package/dist/functional/assert.d.ts +1 -0
  3. package/dist/functional/key.d.ts +2 -0
  4. package/dist/functional/lis.d.ts +11 -0
  5. package/dist/functional/maybe.d.ts +8 -0
  6. package/dist/functional/maybe_promise.d.ts +1 -0
  7. package/dist/functional/shallow_equal.d.ts +2 -0
  8. package/dist/index.d.ts +20 -0
  9. package/dist/index.js +1357 -0
  10. package/dist/index.js.map +25 -0
  11. package/dist/internal/engine.d.ts +24 -0
  12. package/dist/internal/internal_view.d.ts +29 -0
  13. package/dist/internal/orchestrator.d.ts +16 -0
  14. package/dist/public/app.d.ts +19 -0
  15. package/dist/public/event_handle.d.ts +32 -0
  16. package/dist/public/primitive.d.ts +20 -0
  17. package/dist/public/primitives/primitives.d.ts +318 -0
  18. package/dist/public/state.d.ts +37 -0
  19. package/dist/public/store.d.ts +35 -0
  20. package/dist/public/view.d.ts +33 -0
  21. package/dist/render/canvas_render.d.ts +1 -0
  22. package/dist/render/html_render.d.ts +22 -0
  23. package/dist/render/json_render.d.ts +19 -0
  24. package/dist/render/render_interface.d.ts +9 -0
  25. package/dist/render/stream_render.d.ts +1 -0
  26. package/dist/render/string_render.d.ts +22 -0
  27. package/dist/structures/indexed_list.d.ts +46 -0
  28. package/dist/structures/list.d.ts +68 -0
  29. package/package.json +23 -11
  30. package/.env.development +0 -1
  31. package/.github/workflows/main.yml +0 -24
  32. package/TODOS.md +0 -2
  33. package/index.html +0 -13
  34. package/index.ts +0 -1
  35. package/src/DOM/Context.ts +0 -36
  36. package/src/DOM/DomEngine.ts +0 -106
  37. package/src/DOM/IRenderCycle.ts +0 -9
  38. package/src/DOM/Key.ts +0 -1
  39. package/src/DOM/Node.ts +0 -472
  40. package/src/DOM/Registry.ts +0 -53
  41. package/src/creo.ts +0 -134
  42. package/src/data-structures/assert/assert.ts +0 -12
  43. package/src/data-structures/indexed-map/IndexedMap.ts +0 -281
  44. package/src/data-structures/linked-map/LinkedMap.spec.ts +0 -67
  45. package/src/data-structures/linked-map/LinkedMap.ts +0 -198
  46. package/src/data-structures/list/List.spec.ts +0 -181
  47. package/src/data-structures/list/List.ts +0 -195
  48. package/src/data-structures/maybe/Maybe.ts +0 -25
  49. package/src/data-structures/null/null.ts +0 -3
  50. package/src/data-structures/record/IsRecordLike.spec.ts +0 -29
  51. package/src/data-structures/record/IsRecordLike.ts +0 -3
  52. package/src/data-structures/record/Record.spec.ts +0 -240
  53. package/src/data-structures/record/Record.ts +0 -145
  54. package/src/data-structures/shalllowEqual/shallowEqual.ts +0 -26
  55. package/src/data-structures/simpleKey/simpleKey.ts +0 -8
  56. package/src/examples/SimpleTodoList/SimpleTodoList.ts +0 -53
  57. package/src/examples/simple.ts +0 -0
  58. package/src/globals.d.ts +0 -1
  59. package/src/main.ts +0 -24
  60. package/src/style.css +0 -41
  61. package/src/ui/html/Block.ts +0 -10
  62. package/src/ui/html/Button.ts +0 -12
  63. package/src/ui/html/HStack.ts +0 -10
  64. package/src/ui/html/Inline.ts +0 -12
  65. package/src/ui/html/List.ts +0 -10
  66. package/src/ui/html/Text.ts +0 -9
  67. package/src/ui/html/VStack.ts +0 -11
  68. package/src/vite-env.d.ts +0 -1
  69. package/tsconfig.json +0 -23
  70. package/vite.config.js +0 -10
  71. /package/{src/data-structures/wildcard/wildcard.ts → dist/internal/wildcard.d.ts} +0 -0
package/dist/index.js ADDED
@@ -0,0 +1,1357 @@
1
+ // src/internal/internal_view.ts
2
+ var F_PENDING = 1;
3
+ var F_DIRTY = 1 << 1;
4
+ var F_MOVED = 1 << 2;
5
+ var F_QUICK_RERENDER = 1 << 3;
6
+ var F_PRIMITIVE = 1 << 4;
7
+ var F_TEXT_CONTENT = 1 << 5;
8
+ function hasScStructuralChange(prev, next) {
9
+ const prevLen = prev?.length ?? 0;
10
+ const nextLen = next?.length ?? 0;
11
+ if (prevLen === 0 && nextLen === 0)
12
+ return false;
13
+ if (!prev || !next)
14
+ return true;
15
+ if (prev.length !== next.length)
16
+ return true;
17
+ for (let i = 0;i < next.length; i++) {
18
+ if (next[i].viewFn !== prev[i].viewFn)
19
+ return true;
20
+ if (next[i].userKey !== prev[i].userKey)
21
+ return true;
22
+ }
23
+ return false;
24
+ }
25
+
26
+ // src/public/primitive.ts
27
+ var $primitive = Symbol("primitive");
28
+
29
+ // src/public/state.ts
30
+ class State {
31
+ #current;
32
+ #schedule;
33
+ constructor(initial, schedule) {
34
+ this.#current = initial;
35
+ this.#schedule = schedule;
36
+ }
37
+ get() {
38
+ return this.#current;
39
+ }
40
+ set(value) {
41
+ this.#current = value;
42
+ this.#schedule();
43
+ }
44
+ update(fn) {
45
+ const result = fn(this.#current);
46
+ if (result instanceof Promise) {
47
+ result.then((value) => {
48
+ this.#current = value;
49
+ this.#schedule();
50
+ });
51
+ } else {
52
+ this.#current = result;
53
+ this.#schedule();
54
+ }
55
+ }
56
+ }
57
+
58
+ // src/public/store.ts
59
+ var $store = Symbol("store");
60
+
61
+ class Store {
62
+ [$store] = true;
63
+ #current;
64
+ #subscribers = new Set;
65
+ constructor(initial) {
66
+ this.#current = initial;
67
+ }
68
+ get() {
69
+ return this.#current;
70
+ }
71
+ set(value) {
72
+ this.#current = value;
73
+ this.#notify();
74
+ }
75
+ update(fn) {
76
+ const result = fn(this.#current);
77
+ if (result instanceof Promise) {
78
+ result.then((value) => {
79
+ this.#current = value;
80
+ this.#notify();
81
+ });
82
+ } else {
83
+ this.#current = result;
84
+ this.#notify();
85
+ }
86
+ }
87
+ subscribe(cb) {
88
+ this.#subscribers.add(cb);
89
+ return () => {
90
+ this.#subscribers.delete(cb);
91
+ };
92
+ }
93
+ #notify() {
94
+ for (const sub of this.#subscribers) {
95
+ sub();
96
+ }
97
+ }
98
+ }
99
+ function isStore(value) {
100
+ return value != null && typeof value === "object" && $store in value;
101
+ }
102
+ var store = {
103
+ new(initial) {
104
+ return new Store(initial);
105
+ }
106
+ };
107
+
108
+ // src/functional/shallow_equal.ts
109
+ function shallowEqual(a, b) {
110
+ if (a === b)
111
+ return true;
112
+ if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
113
+ return false;
114
+ }
115
+ let countA = 0;
116
+ for (const key in a) {
117
+ countA++;
118
+ if (!Object.is(a[key], b[key]))
119
+ return false;
120
+ }
121
+ let countB = 0;
122
+ for (const _ in b)
123
+ countB++;
124
+ return countA === countB;
125
+ }
126
+
127
+ // src/functional/lis.ts
128
+ function lis(arr) {
129
+ const len = arr.length;
130
+ if (len === 0)
131
+ return new Set;
132
+ const tails = [];
133
+ const prev = new Array(len).fill(-1);
134
+ for (let i = 0;i < len; i++) {
135
+ if (arr[i] < 0)
136
+ continue;
137
+ const val = arr[i];
138
+ let lo = 0;
139
+ let hi = tails.length;
140
+ while (lo < hi) {
141
+ const mid = lo + hi >> 1;
142
+ if (arr[tails[mid]] < val)
143
+ lo = mid + 1;
144
+ else
145
+ hi = mid;
146
+ }
147
+ if (lo > 0)
148
+ prev[i] = tails[lo - 1];
149
+ tails[lo] = i;
150
+ }
151
+ const result = new Set;
152
+ if (tails.length === 0)
153
+ return result;
154
+ let idx = tails[tails.length - 1];
155
+ for (let k = tails.length - 1;k >= 0; k--) {
156
+ result.add(idx);
157
+ idx = prev[idx];
158
+ }
159
+ return result;
160
+ }
161
+
162
+ // src/internal/orchestrator.ts
163
+ class Orchestrator {
164
+ #currentEngine;
165
+ setCurrentEngine(engine) {
166
+ this.#currentEngine = engine;
167
+ }
168
+ currentEngine() {
169
+ return this.#currentEngine;
170
+ }
171
+ }
172
+ var orchestrator = new Orchestrator;
173
+
174
+ // src/internal/engine.ts
175
+ class Engine {
176
+ renderer;
177
+ #dirtyQueue = new Set;
178
+ #collector;
179
+ #collectFor;
180
+ #scheduler;
181
+ #renderScheduled = false;
182
+ #rendering = false;
183
+ constructor(renderer, scheduler) {
184
+ this.renderer = renderer;
185
+ this.#scheduler = scheduler ?? ((cb) => queueMicrotask(cb));
186
+ renderer.engine = this;
187
+ }
188
+ newView(viewFn, parent, props, slot, userKey) {
189
+ const res = {
190
+ viewFn,
191
+ userKey,
192
+ props,
193
+ slot,
194
+ body: null,
195
+ sc: null,
196
+ renderRef: null,
197
+ flags: F_PENDING | (viewFn[$primitive] != null ? F_PRIMITIVE : 0),
198
+ children: null,
199
+ keyToView: null,
200
+ unsubscribe: null,
201
+ parent,
202
+ scHost: null
203
+ };
204
+ if (slot) {
205
+ res.sc = this.#collect(slot, [], res);
206
+ }
207
+ return res;
208
+ }
209
+ view(viewFn, props, slot, userKey) {
210
+ const view = this.newView(viewFn, this.#collectFor, props, slot, userKey);
211
+ this.#collector?.push(view);
212
+ return view;
213
+ }
214
+ views(views) {
215
+ if (views)
216
+ this.#collector?.push(...views);
217
+ }
218
+ initViewBody(view) {
219
+ if (!(view.flags & F_PENDING))
220
+ return;
221
+ view.flags &= ~F_PENDING;
222
+ if (view.flags & F_PRIMITIVE) {
223
+ const engine = this;
224
+ view.body = {
225
+ render() {
226
+ engine.views(view.sc);
227
+ }
228
+ };
229
+ return;
230
+ }
231
+ view.body = view.viewFn({
232
+ props: () => view.props,
233
+ use: (storeOrState) => {
234
+ if (!isStore(storeOrState)) {
235
+ return new State(storeOrState, () => this.markDirty(view));
236
+ }
237
+ const s = storeOrState;
238
+ const unsub = s.subscribe(() => this.markDirty(view));
239
+ if (!view.unsubscribe)
240
+ view.unsubscribe = [];
241
+ view.unsubscribe.push(unsub);
242
+ return s;
243
+ },
244
+ slot: () => {
245
+ if (!view.sc)
246
+ return;
247
+ view.scHost = this.#collectFor ?? view;
248
+ for (const child of view.sc) {
249
+ child.parent = this.#collectFor ?? view;
250
+ this.#collector?.push(child);
251
+ }
252
+ }
253
+ });
254
+ }
255
+ createRoot(children, props) {
256
+ orchestrator.setCurrentEngine(this);
257
+ const view = this.newView(({ slot }) => ({
258
+ render() {
259
+ slot();
260
+ }
261
+ }), null, props, children, null);
262
+ this.markDirty(view);
263
+ return view;
264
+ }
265
+ markDirty(view) {
266
+ if (view.flags & F_DIRTY) {
267
+ return;
268
+ }
269
+ view.flags |= F_DIRTY;
270
+ this.#dirtyQueue.add(view);
271
+ this.schedule();
272
+ }
273
+ markMoved(view) {
274
+ if (view.flags & F_MOVED) {
275
+ return;
276
+ }
277
+ view.flags |= F_MOVED;
278
+ this.#dirtyQueue.add(view);
279
+ this.schedule();
280
+ }
281
+ schedule() {
282
+ if (this.#renderScheduled)
283
+ return;
284
+ this.#renderScheduled = true;
285
+ this.#scheduler(() => {
286
+ this.#renderScheduled = false;
287
+ this.render();
288
+ });
289
+ }
290
+ #collect(render, collector, parent) {
291
+ const before = this.#collector;
292
+ const beforeParent = this.#collectFor;
293
+ this.#collector = collector;
294
+ this.#collectFor = parent;
295
+ render();
296
+ this.#collector = before;
297
+ this.#collectFor = beforeParent;
298
+ return collector;
299
+ }
300
+ nextProps(view, nextProps, nextSlot, preCollectedSc) {
301
+ const prevSc = view.sc;
302
+ view.slot = nextSlot;
303
+ if (preCollectedSc) {
304
+ for (const child of preCollectedSc)
305
+ child.parent = view;
306
+ view.sc = preCollectedSc;
307
+ } else {
308
+ view.sc = nextSlot ? this.#collect(nextSlot, [], view) : null;
309
+ }
310
+ const structChanged = hasScStructuralChange(prevSc, view.sc);
311
+ const shouldUpdate = view.body?.shouldUpdate ? view.body.shouldUpdate(nextProps) : !shallowEqual(view.props, nextProps);
312
+ if (shouldUpdate || structChanged) {
313
+ view.props = nextProps;
314
+ this.markDirty(view);
315
+ } else if (view.sc && view.scHost?.children) {
316
+ this.#propagateScProps(view);
317
+ } else if (view.sc && prevSc) {
318
+ for (let i = 0;i < view.sc.length; i++) {
319
+ if (view.sc[i].props !== prevSc[i].props) {
320
+ this.markDirty(view);
321
+ break;
322
+ }
323
+ }
324
+ }
325
+ }
326
+ #propagateScProps(owner) {
327
+ const host = owner.scHost;
328
+ const sc = owner.sc;
329
+ if (!host?.children || !sc)
330
+ return;
331
+ if (host.keyToView) {
332
+ for (const item of sc) {
333
+ if (item.userKey != null) {
334
+ const live = host.keyToView.get(item.userKey);
335
+ if (live && live.viewFn === item.viewFn) {
336
+ this.nextProps(live, item.props, item.slot);
337
+ }
338
+ }
339
+ }
340
+ } else {
341
+ const len = Math.min(sc.length, host.children.length);
342
+ for (let i = 0;i < len; i++) {
343
+ const live = host.children[i];
344
+ if (live.viewFn === sc[i].viewFn) {
345
+ this.nextProps(live, sc[i].props, sc[i].slot);
346
+ }
347
+ }
348
+ }
349
+ }
350
+ reconcile(view) {
351
+ let pendingChildren = null;
352
+ if (view.body?.render) {
353
+ pendingChildren = this.#collect(view.body.render, [], view);
354
+ }
355
+ if (pendingChildren == null || pendingChildren.length === 0) {
356
+ if (view.children)
357
+ for (const child of view.children)
358
+ this.dispose(child);
359
+ return;
360
+ }
361
+ if (view.children == null) {
362
+ view.children = pendingChildren;
363
+ for (const child of pendingChildren) {
364
+ this.initViewBody(child);
365
+ this.markDirty(child);
366
+ if (child.userKey != null) {
367
+ if (!view.keyToView)
368
+ view.keyToView = new Map;
369
+ view.keyToView.set(child.userKey, child);
370
+ }
371
+ }
372
+ return;
373
+ }
374
+ const hasKeys = pendingChildren.some((c) => c.userKey != null);
375
+ if (hasKeys) {
376
+ this.#reconcileKeyed(view, view.children, pendingChildren);
377
+ } else {
378
+ this.#reconcileNonKeyed(view, view.children, pendingChildren);
379
+ }
380
+ }
381
+ #reconcileNonKeyed(view, oldChildren, pending) {
382
+ const oldLen = oldChildren.length;
383
+ const newLen = pending.length;
384
+ const minLen = Math.min(oldLen, newLen);
385
+ for (let i = 0;i < minLen; i++) {
386
+ const old = oldChildren[i];
387
+ const pend = pending[i];
388
+ this.#patchOrReplace(view, oldChildren, i, old, pend);
389
+ }
390
+ for (let i = oldLen;i < newLen; i++) {
391
+ oldChildren[i] = pending[i];
392
+ this.initViewBody(pending[i]);
393
+ this.markDirty(pending[i]);
394
+ }
395
+ for (let i = newLen;i < oldLen; i++) {
396
+ this.dispose(oldChildren[i]);
397
+ }
398
+ oldChildren.length = newLen;
399
+ }
400
+ #reconcileKeyed(view, oldChildren, pending) {
401
+ let i = 0;
402
+ let oldEnd = oldChildren.length - 1;
403
+ let newEnd = pending.length - 1;
404
+ while (i <= oldEnd && i <= newEnd) {
405
+ const oldView = oldChildren[i];
406
+ const pendView = pending[i];
407
+ if (oldView.userKey !== pendView.userKey)
408
+ break;
409
+ this.#patchOrReplace(view, oldChildren, i, oldView, pendView);
410
+ i++;
411
+ }
412
+ while (oldEnd >= i && newEnd >= i) {
413
+ const oldView = oldChildren[oldEnd];
414
+ const pendView = pending[newEnd];
415
+ if (oldView.userKey !== pendView.userKey)
416
+ break;
417
+ this.#patchOrReplace(view, oldChildren, oldEnd, oldView, pendView);
418
+ oldEnd--;
419
+ newEnd--;
420
+ }
421
+ if (i > oldEnd) {
422
+ for (let j = i;j <= newEnd; j++) {
423
+ this.initViewBody(pending[j]);
424
+ this.markDirty(pending[j]);
425
+ if (pending[j].userKey != null) {
426
+ if (!view.keyToView)
427
+ view.keyToView = new Map;
428
+ view.keyToView.set(pending[j].userKey, pending[j]);
429
+ }
430
+ }
431
+ view.children = [
432
+ ...oldChildren.slice(0, i),
433
+ ...pending.slice(i, newEnd + 1),
434
+ ...oldChildren.slice(i, oldEnd + 1)
435
+ ];
436
+ return;
437
+ }
438
+ if (i > newEnd) {
439
+ for (let j = i;j <= oldEnd; j++) {
440
+ this.dispose(oldChildren[j]);
441
+ }
442
+ view.children = [
443
+ ...oldChildren.slice(0, i),
444
+ ...oldChildren.slice(oldEnd + 1)
445
+ ];
446
+ return;
447
+ }
448
+ const newKeyToIndex = new Map;
449
+ for (let j = i;j <= newEnd; j++) {
450
+ const key = pending[j].userKey;
451
+ if (key != null)
452
+ newKeyToIndex.set(key, j);
453
+ }
454
+ const middleLen = newEnd - i + 1;
455
+ const newIdxToOldIdx = new Array(middleLen).fill(-1);
456
+ const matched = new Set;
457
+ for (let j = i;j <= oldEnd; j++) {
458
+ const oldView = oldChildren[j];
459
+ const key = oldView.userKey;
460
+ if (key != null && newKeyToIndex.has(key)) {
461
+ const newIdx = newKeyToIndex.get(key);
462
+ newIdxToOldIdx[newIdx - i] = j;
463
+ matched.add(j);
464
+ }
465
+ }
466
+ for (let j = i;j <= oldEnd; j++) {
467
+ if (!matched.has(j)) {
468
+ this.dispose(oldChildren[j]);
469
+ }
470
+ }
471
+ const stable = lis(newIdxToOldIdx);
472
+ const newChildren = new Array(middleLen);
473
+ for (let j = middleLen - 1;j >= 0; j--) {
474
+ const newIdx = i + j;
475
+ const pendView = pending[newIdx];
476
+ if (newIdxToOldIdx[j] === -1) {
477
+ this.initViewBody(pendView);
478
+ this.markDirty(pendView);
479
+ if (pendView.userKey != null) {
480
+ if (!view.keyToView)
481
+ view.keyToView = new Map;
482
+ view.keyToView.set(pendView.userKey, pendView);
483
+ }
484
+ newChildren[j] = pendView;
485
+ } else {
486
+ const oldView = oldChildren[newIdxToOldIdx[j]];
487
+ this.#patchOrReplace(view, oldChildren, newIdxToOldIdx[j], oldView, pendView);
488
+ if (!stable.has(j)) {
489
+ this.markMoved(oldView);
490
+ }
491
+ newChildren[j] = oldView;
492
+ }
493
+ }
494
+ const head = oldChildren.slice(0, i);
495
+ const tail = oldChildren.slice(oldEnd + 1);
496
+ view.children = [...head, ...newChildren, ...tail];
497
+ }
498
+ #patchOrReplace(parent, oldChildren, idx, oldView, pendView) {
499
+ if (oldView.viewFn === pendView.viewFn) {
500
+ this.nextProps(oldView, pendView.props, pendView.slot, pendView.sc);
501
+ } else {
502
+ this.dispose(oldView);
503
+ oldChildren[idx] = pendView;
504
+ this.initViewBody(pendView);
505
+ this.markDirty(pendView);
506
+ if (pendView.userKey != null) {
507
+ if (!parent.keyToView)
508
+ parent.keyToView = new Map;
509
+ parent.keyToView.set(pendView.userKey, pendView);
510
+ }
511
+ }
512
+ }
513
+ dispose(view) {
514
+ const isPrimitiveWithDom = view.flags & F_PRIMITIVE && view.renderRef;
515
+ if (view.children) {
516
+ for (const child of view.children) {
517
+ if (isPrimitiveWithDom) {
518
+ this.#disposeVirtual(child);
519
+ } else {
520
+ this.dispose(child);
521
+ }
522
+ }
523
+ }
524
+ if (view.unsubscribe)
525
+ for (const unsub of view.unsubscribe)
526
+ unsub();
527
+ if (view.userKey != null)
528
+ view.parent?.keyToView?.delete(view.userKey);
529
+ this.renderer.unmount(view);
530
+ this.#dirtyQueue.delete(view);
531
+ }
532
+ #disposeVirtual(view) {
533
+ if (view.children) {
534
+ for (const child of view.children)
535
+ this.#disposeVirtual(child);
536
+ }
537
+ if (view.unsubscribe)
538
+ for (const unsub of view.unsubscribe)
539
+ unsub();
540
+ if (view.userKey != null)
541
+ view.parent?.keyToView?.delete(view.userKey);
542
+ view.renderRef = undefined;
543
+ this.#dirtyQueue.delete(view);
544
+ }
545
+ render() {
546
+ if (this.#rendering)
547
+ return;
548
+ orchestrator.setCurrentEngine(this);
549
+ this.#rendering = true;
550
+ try {
551
+ const cbs = [];
552
+ for (const view of this.#dirtyQueue) {
553
+ this.initViewBody(view);
554
+ const isNew = !view.renderRef;
555
+ if (!isNew)
556
+ view.body?.onUpdateBefore?.();
557
+ if (view.flags & F_DIRTY) {
558
+ this.reconcile(view);
559
+ this.renderer.render(view);
560
+ view.flags &= ~F_DIRTY;
561
+ view.flags &= ~F_MOVED;
562
+ if (isNew && view.body?.onMount) {
563
+ const b = view.body;
564
+ cbs.push(() => b.onMount());
565
+ } else if (!isNew && view.body?.onUpdateAfter) {
566
+ const b = view.body;
567
+ cbs.push(() => b.onUpdateAfter());
568
+ }
569
+ } else {
570
+ this.renderer.render(view);
571
+ view.flags &= ~F_MOVED;
572
+ }
573
+ }
574
+ this.#dirtyQueue.clear();
575
+ orchestrator.setCurrentEngine(null);
576
+ this.#rendering = false;
577
+ for (const cb of cbs)
578
+ cb();
579
+ } catch (e) {
580
+ orchestrator.setCurrentEngine(null);
581
+ this.#rendering = false;
582
+ throw e;
583
+ }
584
+ }
585
+ }
586
+
587
+ // src/public/app.ts
588
+ function createApp(slot, renderer, options) {
589
+ return {
590
+ mount(props) {
591
+ const engine = new Engine(renderer, options?.scheduler);
592
+ engine.createRoot(slot, props ?? {});
593
+ engine.render();
594
+ return { engine };
595
+ }
596
+ };
597
+ }
598
+ // src/public/view.ts
599
+ function view(body) {
600
+ return (props, slot) => {
601
+ orchestrator.currentEngine().view(body, props, slot, maybeGetUserKey(props));
602
+ };
603
+ }
604
+ function maybeGetUserKey(params) {
605
+ if (params != null && typeof params === "object" && "key" in params && params.key != null && (typeof params.key === "string" || typeof params.key === "number")) {
606
+ return params.key;
607
+ }
608
+ }
609
+ // src/public/primitives/primitives.ts
610
+ function html(tag) {
611
+ const fn = ({
612
+ slot
613
+ }) => ({
614
+ render() {
615
+ slot();
616
+ }
617
+ });
618
+ fn[$primitive] = tag;
619
+ return view(fn);
620
+ }
621
+ var textViewFn = Object.assign(() => ({ render() {} }), { [$primitive]: "text" });
622
+ function text(content) {
623
+ orchestrator.currentEngine().view(textViewFn, content, null, null);
624
+ }
625
+ var div = html("div");
626
+ var span = html("span");
627
+ var section = html("section");
628
+ var article = html("article");
629
+ var aside = html("aside");
630
+ var nav = html("nav");
631
+ var header = html("header");
632
+ var footer = html("footer");
633
+ var main = html("main");
634
+ var p = html("p");
635
+ var h1 = html("h1");
636
+ var h2 = html("h2");
637
+ var h3 = html("h3");
638
+ var h4 = html("h4");
639
+ var h5 = html("h5");
640
+ var h6 = html("h6");
641
+ var pre = html("pre");
642
+ var code = html("code");
643
+ var em = html("em");
644
+ var strong = html("strong");
645
+ var small = html("small");
646
+ var br = html("br");
647
+ var hr = html("hr");
648
+ var a = html("a");
649
+ var blockquote = html("blockquote");
650
+ var label = html("label");
651
+ var ul = html("ul");
652
+ var ol = html("ol");
653
+ var li = html("li");
654
+ var table = html("table");
655
+ var thead = html("thead");
656
+ var tbody = html("tbody");
657
+ var tfoot = html("tfoot");
658
+ var tr = html("tr");
659
+ var th = html("th");
660
+ var td = html("td");
661
+ var form = html("form");
662
+ var button = html("button");
663
+ var input = html("input");
664
+ var textarea = html("textarea");
665
+ var select = html("select");
666
+ var option = html("option");
667
+ var fieldset = html("fieldset");
668
+ var legend = html("legend");
669
+ var img = html("img");
670
+ var video = html("video");
671
+ var audio = html("audio");
672
+ var canvas = html("canvas");
673
+ var source = html("source");
674
+ var details = html("details");
675
+ var summary = html("summary");
676
+ var dialog = html("dialog");
677
+ var menu = html("menu");
678
+ var iframe = html("iframe");
679
+ var embed = html("embed");
680
+ var object = html("object");
681
+ var picture = html("picture");
682
+ var portal = html("portal");
683
+ var svg = html("svg");
684
+ var script = html("script");
685
+ var noscript = html("noscript");
686
+ var template = html("template");
687
+ var slot = html("slot");
688
+ var address = html("address");
689
+ var hgroup = html("hgroup");
690
+ var search = html("search");
691
+ var abbr = html("abbr");
692
+ var b = html("b");
693
+ var bdi = html("bdi");
694
+ var bdo = html("bdo");
695
+ var cite = html("cite");
696
+ var data = html("data");
697
+ var dfn = html("dfn");
698
+ var i = html("i");
699
+ var kbd = html("kbd");
700
+ var mark = html("mark");
701
+ var q = html("q");
702
+ var rp = html("rp");
703
+ var rt = html("rt");
704
+ var ruby = html("ruby");
705
+ var s = html("s");
706
+ var samp = html("samp");
707
+ var sub = html("sub");
708
+ var sup = html("sup");
709
+ var time = html("time");
710
+ var u = html("u");
711
+ var varEl = html("var");
712
+ var wbr = html("wbr");
713
+ var del = html("del");
714
+ var ins = html("ins");
715
+ var caption = html("caption");
716
+ var colgroup = html("colgroup");
717
+ var col = html("col");
718
+ var datalist = html("datalist");
719
+ var optgroup = html("optgroup");
720
+ var output = html("output");
721
+ var progress = html("progress");
722
+ var meter = html("meter");
723
+ var figure = html("figure");
724
+ var figcaption = html("figcaption");
725
+ var dd = html("dd");
726
+ var dl = html("dl");
727
+ var dt = html("dt");
728
+ var track = html("track");
729
+ var map = html("map");
730
+ var area = html("area");
731
+ // src/render/html_render.ts
732
+ function isEventProp(key) {
733
+ return key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.charCodeAt(2) >= 65 && key.charCodeAt(2) <= 90;
734
+ }
735
+ var DOM_EVENT = {
736
+ Click: "click",
737
+ Dblclick: "dblclick",
738
+ PointerDown: "pointerdown",
739
+ PointerUp: "pointerup",
740
+ PointerMove: "pointermove",
741
+ Input: "input",
742
+ Change: "change",
743
+ KeyDown: "keydown",
744
+ KeyUp: "keyup",
745
+ Focus: "focus",
746
+ Blur: "blur"
747
+ };
748
+ var $EV = Symbol.for("creo.ev");
749
+ var containerState = new WeakMap;
750
+ function getState(container) {
751
+ let state = containerState.get(container);
752
+ if (!state) {
753
+ state = {
754
+ counts: new Map,
755
+ handler(e) {
756
+ const domEvent = e.type;
757
+ let dom = e.target;
758
+ while (dom && dom !== container) {
759
+ const evObj = dom[$EV];
760
+ if (evObj) {
761
+ const handler = evObj[domEvent];
762
+ if (handler) {
763
+ handler(mapEventData(domEvent, e));
764
+ if (e.cancelBubble)
765
+ return;
766
+ }
767
+ }
768
+ dom = dom.parentElement;
769
+ }
770
+ }
771
+ };
772
+ containerState.set(container, state);
773
+ }
774
+ return state;
775
+ }
776
+ function ensureDelegated(container, domEvent) {
777
+ const state = getState(container);
778
+ const count = state.counts.get(domEvent) ?? 0;
779
+ if (count === 0) {
780
+ container.addEventListener(domEvent, state.handler);
781
+ }
782
+ state.counts.set(domEvent, count + 1);
783
+ }
784
+ function removeDelegated(container, domEvent) {
785
+ const state = getState(container);
786
+ const count = state.counts.get(domEvent) ?? 0;
787
+ if (count <= 1) {
788
+ state.counts.delete(domEvent);
789
+ container.removeEventListener(domEvent, state.handler);
790
+ } else {
791
+ state.counts.set(domEvent, count - 1);
792
+ }
793
+ }
794
+ function mapEventData(domEvent, e) {
795
+ let data2;
796
+ if (domEvent === "click" || domEvent === "dblclick" || domEvent === "pointerdown" || domEvent === "pointerup" || domEvent === "pointermove") {
797
+ const pe = e;
798
+ data2 = { x: pe.clientX, y: pe.clientY };
799
+ } else if (domEvent === "input" || domEvent === "change") {
800
+ data2 = { value: e.target.value };
801
+ } else if (domEvent === "keydown" || domEvent === "keyup") {
802
+ const ke = e;
803
+ data2 = { key: ke.key, code: ke.code };
804
+ } else {
805
+ data2 = {};
806
+ }
807
+ data2.stopPropagation = () => e.stopPropagation();
808
+ data2.preventDefault = () => e.preventDefault();
809
+ return data2;
810
+ }
811
+ var DOM_PROPERTIES = new Set([
812
+ "value",
813
+ "checked",
814
+ "selected",
815
+ "indeterminate"
816
+ ]);
817
+
818
+ class HtmlRender {
819
+ container;
820
+ engine;
821
+ constructor(container) {
822
+ this.container = container;
823
+ }
824
+ render(view2) {
825
+ if (!view2.renderRef) {
826
+ if (view2.flags & F_PRIMITIVE) {
827
+ const parentNode = this.findParentDom(view2);
828
+ const refNode = this.findInsertionPoint(view2);
829
+ const tag = view2.viewFn[$primitive];
830
+ if (tag === "text") {
831
+ const textNode = document.createTextNode(String(view2.props));
832
+ view2.renderRef = { element: textNode, prevProps: null };
833
+ parentNode.insertBefore(textNode, refNode);
834
+ } else {
835
+ const element = document.createElement(tag);
836
+ const props = view2.props;
837
+ const domRef = { element, prevProps: null };
838
+ view2.renderRef = domRef;
839
+ this.setAttributes(element, props);
840
+ if (view2.children?.length === 1) {
841
+ const child = view2.children[0];
842
+ if (child.flags & F_PRIMITIVE && child.viewFn[$primitive] === "text") {
843
+ element.textContent = String(child.props);
844
+ child.renderRef = { element, prevProps: null };
845
+ child.flags |= F_TEXT_CONTENT;
846
+ }
847
+ }
848
+ parentNode.insertBefore(element, refNode);
849
+ }
850
+ } else {
851
+ view2.renderRef = true;
852
+ }
853
+ return;
854
+ }
855
+ if (view2.flags & F_MOVED) {
856
+ const parentNode = this.findParentDom(view2);
857
+ const refNode = this.findInsertionPoint(view2);
858
+ if (view2.flags & F_PRIMITIVE) {
859
+ const ref2 = view2.renderRef;
860
+ parentNode.insertBefore(ref2.element, refNode);
861
+ } else {
862
+ this.moveDomNodes(view2, parentNode, refNode);
863
+ }
864
+ }
865
+ if (!(view2.flags & F_PRIMITIVE))
866
+ return;
867
+ const ref = view2.renderRef;
868
+ if (view2.flags & F_TEXT_CONTENT) {
869
+ const parentEl = ref.element;
870
+ const nextText = String(view2.props);
871
+ if (parentEl.textContent !== nextText) {
872
+ parentEl.textContent = nextText;
873
+ }
874
+ return;
875
+ }
876
+ if (ref.element instanceof Text) {
877
+ const nextText = String(view2.props);
878
+ if (ref.element.textContent !== nextText) {
879
+ ref.element.textContent = nextText;
880
+ }
881
+ return;
882
+ }
883
+ const nextProps = view2.props;
884
+ if (!ref.prevProps) {
885
+ this.setAttributes(ref.element, nextProps);
886
+ } else if (ref.prevProps !== nextProps) {
887
+ this.diffAttributes(ref.element, ref.prevProps, nextProps);
888
+ }
889
+ ref.prevProps = nextProps;
890
+ }
891
+ unmount(view2) {
892
+ if (view2.flags & F_PRIMITIVE) {
893
+ this.removeDomNodes(view2);
894
+ }
895
+ view2.renderRef = undefined;
896
+ }
897
+ findParentDom(view2) {
898
+ let parent = view2.parent;
899
+ while (parent) {
900
+ if (parent.flags & F_PRIMITIVE) {
901
+ const ref = parent.renderRef;
902
+ if (ref && ref.element instanceof HTMLElement)
903
+ return ref.element;
904
+ }
905
+ parent = parent.parent;
906
+ }
907
+ return this.container;
908
+ }
909
+ findInsertionPoint(view2) {
910
+ const parent = view2.parent;
911
+ if (!parent?.children)
912
+ return null;
913
+ const children = parent.children;
914
+ if (children[children.length - 1] === view2) {
915
+ return this.#parentEndAnchor(parent);
916
+ }
917
+ const idx = children.indexOf(view2);
918
+ for (let i2 = idx + 1;i2 < children.length; i2++) {
919
+ const dom = this.getFirstDomNode(children[i2]);
920
+ if (dom)
921
+ return dom;
922
+ }
923
+ return this.#parentEndAnchor(parent);
924
+ }
925
+ #parentEndAnchor(parent) {
926
+ if (parent.flags & F_PRIMITIVE)
927
+ return null;
928
+ return this.findInsertionPoint(parent);
929
+ }
930
+ setAttributes(element, props) {
931
+ for (const key in props) {
932
+ const value = props[key];
933
+ if (key === "key" || value == null)
934
+ continue;
935
+ if (isEventProp(key)) {
936
+ this.bindEvent(element, key, value);
937
+ continue;
938
+ }
939
+ this.setAttribute(element, key, value);
940
+ }
941
+ }
942
+ diffAttributes(element, prev, next) {
943
+ for (const key in prev) {
944
+ if (key === "key")
945
+ continue;
946
+ if (!(key in next) || next[key] == null) {
947
+ if (isEventProp(key)) {
948
+ this.unbindEvent(element, key);
949
+ } else {
950
+ this.removeAttribute(element, key);
951
+ }
952
+ }
953
+ }
954
+ for (const key in next) {
955
+ const value = next[key];
956
+ if (key === "key" || value == null)
957
+ continue;
958
+ if (prev[key] === value)
959
+ continue;
960
+ if (isEventProp(key)) {
961
+ const creoName = key.slice(2);
962
+ const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();
963
+ const evObj = element[$EV];
964
+ if (evObj) {
965
+ evObj[domEvent] = value;
966
+ } else {
967
+ this.bindEvent(element, key, value);
968
+ }
969
+ } else {
970
+ this.setAttribute(element, key, value);
971
+ }
972
+ }
973
+ }
974
+ bindEvent(element, prop, handler) {
975
+ const creoName = prop.slice(2);
976
+ const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();
977
+ const evObj = element[$EV] ?? (element[$EV] = {});
978
+ evObj[domEvent] = handler;
979
+ ensureDelegated(this.container, domEvent);
980
+ }
981
+ unbindEvent(element, prop) {
982
+ const creoName = prop.slice(2);
983
+ const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();
984
+ const evObj = element[$EV];
985
+ if (evObj) {
986
+ delete evObj[domEvent];
987
+ }
988
+ removeDelegated(this.container, domEvent);
989
+ }
990
+ setAttribute(element, key, value) {
991
+ if (key === "class") {
992
+ element.className = String(value);
993
+ } else if (key === "style") {
994
+ element.style.cssText = String(value);
995
+ } else if (DOM_PROPERTIES.has(key)) {
996
+ element[key] = value;
997
+ } else if (typeof value === "boolean") {
998
+ if (value)
999
+ element.setAttribute(key, "");
1000
+ else
1001
+ element.removeAttribute(key);
1002
+ } else {
1003
+ element.setAttribute(key, String(value));
1004
+ }
1005
+ }
1006
+ removeAttribute(element, key) {
1007
+ if (key === "class") {
1008
+ element.className = "";
1009
+ } else if (key === "style") {
1010
+ element.style.cssText = "";
1011
+ } else if (DOM_PROPERTIES.has(key)) {
1012
+ element[key] = key === "value" ? "" : false;
1013
+ } else {
1014
+ element.removeAttribute(key);
1015
+ }
1016
+ }
1017
+ getFirstDomNode(view2) {
1018
+ if (!view2.renderRef)
1019
+ return null;
1020
+ if (view2.flags & F_PRIMITIVE)
1021
+ return view2.renderRef.element;
1022
+ if (view2.children) {
1023
+ for (const child of view2.children) {
1024
+ const dom = this.getFirstDomNode(child);
1025
+ if (dom)
1026
+ return dom;
1027
+ }
1028
+ }
1029
+ return null;
1030
+ }
1031
+ moveDomNodes(view2, parentNode, insertBefore) {
1032
+ if (!view2.renderRef)
1033
+ return;
1034
+ if (view2.flags & F_PRIMITIVE) {
1035
+ parentNode.insertBefore(view2.renderRef.element, insertBefore);
1036
+ } else if (view2.children) {
1037
+ for (const child of view2.children) {
1038
+ this.moveDomNodes(child, parentNode, insertBefore);
1039
+ }
1040
+ }
1041
+ }
1042
+ removeDomNodes(view2) {
1043
+ const ref = view2.renderRef;
1044
+ if (!ref || !(view2.flags & F_PRIMITIVE))
1045
+ return;
1046
+ const evObj = ref.element[$EV];
1047
+ if (evObj) {
1048
+ for (const domEvent in evObj) {
1049
+ removeDelegated(this.container, domEvent);
1050
+ }
1051
+ delete ref.element[$EV];
1052
+ }
1053
+ ref.element.parentNode?.removeChild(ref.element);
1054
+ }
1055
+ }
1056
+ // src/render/json_render.ts
1057
+ class JsonRender {
1058
+ root;
1059
+ engine;
1060
+ constructor() {
1061
+ this.root = null;
1062
+ }
1063
+ render(view2) {
1064
+ const existing = view2.renderRef;
1065
+ if (!existing) {
1066
+ const node = this.buildNode(view2);
1067
+ if (!view2.parent) {
1068
+ this.root = node;
1069
+ return;
1070
+ }
1071
+ const parentNode = view2.parent.renderRef;
1072
+ if (parentNode) {
1073
+ const idx = view2.parent.children ? view2.parent.children.indexOf(view2) : -1;
1074
+ if (idx >= 0 && idx < parentNode.children.length) {
1075
+ parentNode.children.splice(idx, 0, node);
1076
+ } else {
1077
+ parentNode.children.push(node);
1078
+ }
1079
+ }
1080
+ return;
1081
+ }
1082
+ if (view2.parent) {
1083
+ const parentNode = view2.parent.renderRef;
1084
+ if (parentNode) {
1085
+ const oldIdx = parentNode.children.indexOf(existing);
1086
+ const targetIdx = view2.parent.children ? view2.parent.children.indexOf(view2) : -1;
1087
+ if (oldIdx !== -1 && targetIdx !== -1 && oldIdx !== targetIdx) {
1088
+ parentNode.children.splice(oldIdx, 1);
1089
+ parentNode.children.splice(Math.min(targetIdx, parentNode.children.length), 0, existing);
1090
+ }
1091
+ }
1092
+ }
1093
+ const tag = view2.viewFn[$primitive];
1094
+ existing.props = tag === "text" ? { content: view2.props } : { ...view2.props };
1095
+ }
1096
+ unmount(view2) {
1097
+ const childNode = view2.renderRef;
1098
+ if (!childNode || !view2.parent)
1099
+ return;
1100
+ const parentNode = view2.parent.renderRef;
1101
+ if (parentNode) {
1102
+ const idx = parentNode.children.indexOf(childNode);
1103
+ if (idx !== -1)
1104
+ parentNode.children.splice(idx, 1);
1105
+ }
1106
+ }
1107
+ buildNode(view2) {
1108
+ const tag = view2.viewFn[$primitive];
1109
+ const props = tag === "text" ? { content: view2.props } : { ...view2.props };
1110
+ const node = {
1111
+ type: tag ?? "composite",
1112
+ props,
1113
+ children: []
1114
+ };
1115
+ if (view2.userKey != null)
1116
+ node.key = view2.userKey;
1117
+ view2.renderRef = node;
1118
+ return node;
1119
+ }
1120
+ }
1121
+ // src/render/string_render.ts
1122
+ var VOID_TAGS = new Set([
1123
+ "br",
1124
+ "hr",
1125
+ "img",
1126
+ "input",
1127
+ "source",
1128
+ "track",
1129
+ "embed",
1130
+ "area",
1131
+ "col",
1132
+ "wbr"
1133
+ ]);
1134
+ var DOM_PROPERTIES2 = new Set(["value", "checked", "selected", "indeterminate"]);
1135
+ function isEventProp2(key) {
1136
+ return key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.charCodeAt(2) >= 65 && key.charCodeAt(2) <= 90;
1137
+ }
1138
+ function escapeHtml(str) {
1139
+ return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
1140
+ }
1141
+ function escapeAttr(str) {
1142
+ return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
1143
+ }
1144
+
1145
+ class HtmlStringRender {
1146
+ root = null;
1147
+ engine;
1148
+ render(view2) {
1149
+ if (!view2.parent) {
1150
+ this.root = view2;
1151
+ }
1152
+ }
1153
+ unmount(_view) {}
1154
+ renderToString() {
1155
+ if (!this.root)
1156
+ return "";
1157
+ return this.buildString(this.root);
1158
+ }
1159
+ buildString(rec) {
1160
+ const tag = rec.viewFn[$primitive];
1161
+ if (tag != null) {
1162
+ if (tag === "text") {
1163
+ return escapeHtml(String(rec.props));
1164
+ }
1165
+ const attrs = this.buildAttrs(rec.props);
1166
+ if (VOID_TAGS.has(tag)) {
1167
+ return `<${tag}${attrs}>`;
1168
+ }
1169
+ return `<${tag}${attrs}>${this.buildChildren(rec)}</${tag}>`;
1170
+ }
1171
+ return this.buildChildren(rec);
1172
+ }
1173
+ buildAttrs(props) {
1174
+ let result = "";
1175
+ for (const key in props) {
1176
+ const value = props[key];
1177
+ if (key === "key" || value == null)
1178
+ continue;
1179
+ if (isEventProp2(key))
1180
+ continue;
1181
+ if (DOM_PROPERTIES2.has(key))
1182
+ continue;
1183
+ if (key === "style") {
1184
+ let css = String(value);
1185
+ css = css.trim();
1186
+ if (css && !css.endsWith(";"))
1187
+ css += ";";
1188
+ result += ` style="${escapeAttr(css)}"`;
1189
+ continue;
1190
+ }
1191
+ if (typeof value === "boolean") {
1192
+ if (value)
1193
+ result += ` ${key}=""`;
1194
+ } else {
1195
+ const attrName = key === "class" ? "class" : key;
1196
+ result += ` ${attrName}="${escapeAttr(String(value))}"`;
1197
+ }
1198
+ }
1199
+ return result;
1200
+ }
1201
+ buildChildren(rec) {
1202
+ if (!rec.children)
1203
+ return "";
1204
+ let result = "";
1205
+ for (const child of rec.children) {
1206
+ result += this.buildString(child);
1207
+ }
1208
+ return result;
1209
+ }
1210
+ }
1211
+ var StringRender = HtmlStringRender;
1212
+ // src/functional/maybe.ts
1213
+ function just(maybe, errorMessage) {
1214
+ if (maybe == null) {
1215
+ throw new TypeError(errorMessage ?? "Expected Just, received None as Maybe");
1216
+ }
1217
+ }
1218
+ function withDefault(v, alternative) {
1219
+ if (v != null) {
1220
+ return v;
1221
+ }
1222
+ return alternative;
1223
+ }
1224
+ var _ = undefined;
1225
+ // src/functional/assert.ts
1226
+ function assertNever(x) {
1227
+ throw new Error(`Unhandled case: ${x}`);
1228
+ }
1229
+ export {
1230
+ withDefault,
1231
+ wbr,
1232
+ view,
1233
+ video,
1234
+ varEl,
1235
+ ul,
1236
+ u,
1237
+ track,
1238
+ tr,
1239
+ time,
1240
+ thead,
1241
+ th,
1242
+ tfoot,
1243
+ textarea,
1244
+ text,
1245
+ template,
1246
+ td,
1247
+ tbody,
1248
+ table,
1249
+ svg,
1250
+ sup,
1251
+ summary,
1252
+ sub,
1253
+ strong,
1254
+ store,
1255
+ span,
1256
+ source,
1257
+ small,
1258
+ slot,
1259
+ shallowEqual,
1260
+ select,
1261
+ section,
1262
+ search,
1263
+ script,
1264
+ samp,
1265
+ s,
1266
+ ruby,
1267
+ rt,
1268
+ rp,
1269
+ q,
1270
+ progress,
1271
+ pre,
1272
+ portal,
1273
+ picture,
1274
+ p,
1275
+ output,
1276
+ option,
1277
+ optgroup,
1278
+ ol,
1279
+ object,
1280
+ noscript,
1281
+ nav,
1282
+ meter,
1283
+ menu,
1284
+ mark,
1285
+ map,
1286
+ main,
1287
+ li,
1288
+ legend,
1289
+ label,
1290
+ kbd,
1291
+ just,
1292
+ isStore,
1293
+ ins,
1294
+ input,
1295
+ img,
1296
+ iframe,
1297
+ i,
1298
+ html,
1299
+ hr,
1300
+ hgroup,
1301
+ header,
1302
+ h6,
1303
+ h5,
1304
+ h4,
1305
+ h3,
1306
+ h2,
1307
+ h1,
1308
+ form,
1309
+ footer,
1310
+ figure,
1311
+ figcaption,
1312
+ fieldset,
1313
+ embed,
1314
+ em,
1315
+ dt,
1316
+ dl,
1317
+ div,
1318
+ dialog,
1319
+ dfn,
1320
+ details,
1321
+ del,
1322
+ dd,
1323
+ datalist,
1324
+ data,
1325
+ createApp,
1326
+ colgroup,
1327
+ col,
1328
+ code,
1329
+ cite,
1330
+ caption,
1331
+ canvas,
1332
+ button,
1333
+ br,
1334
+ blockquote,
1335
+ bdo,
1336
+ bdi,
1337
+ b,
1338
+ audio,
1339
+ assertNever,
1340
+ aside,
1341
+ article,
1342
+ area,
1343
+ address,
1344
+ abbr,
1345
+ a,
1346
+ _,
1347
+ StringRender,
1348
+ Store,
1349
+ State,
1350
+ JsonRender,
1351
+ HtmlStringRender,
1352
+ HtmlRender,
1353
+ Engine,
1354
+ $primitive
1355
+ };
1356
+
1357
+ //# debugId=3138F663141CF77564756E2164756E21