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/src/Node.res.mjs CHANGED
@@ -1,572 +1,65 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
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 Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
3
+ import * as View$Xote from "./View.res.mjs";
9
4
 
10
- let svgNamespace = "http://www.w3.org/2000/svg";
5
+ let DOM = View$Xote.DOM;
11
6
 
12
- let svgTags = [
13
- "svg",
14
- "path",
15
- "circle",
16
- "ellipse",
17
- "line",
18
- "polygon",
19
- "polyline",
20
- "rect",
21
- "g",
22
- "defs",
23
- "clipPath",
24
- "mask",
25
- "pattern",
26
- "marker",
27
- "symbol",
28
- "use",
29
- "text",
30
- "tspan",
31
- "image",
32
- "foreignObject",
33
- "linearGradient",
34
- "radialGradient",
35
- "stop",
36
- "filter",
37
- "feBlend",
38
- "feColorMatrix",
39
- "feComposite",
40
- "feFlood",
41
- "feGaussianBlur",
42
- "feMerge",
43
- "feMergeNode",
44
- "feOffset",
45
- "animate",
46
- "animateTransform",
47
- "desc",
48
- "title",
49
- "metadata"
50
- ];
7
+ let Reactivity = View$Xote.Reactivity;
51
8
 
52
- let d = {};
9
+ let Attributes = View$Xote.Attributes;
53
10
 
54
- svgTags.forEach(tag => {
55
- d[tag] = true;
56
- });
11
+ let attr = View$Xote.attr;
57
12
 
58
- function isSvgTag(tag) {
59
- return Stdlib_Option.isSome(d[tag]);
60
- }
61
-
62
- function setAttrOrProp(el, key, value) {
63
- switch (key) {
64
- case "checked" :
65
- el.checked = value === "true";
66
- return;
67
- case "disabled" :
68
- el.disabled = value === "true";
69
- return;
70
- case "aria-expanded" :
71
- case "aria-hidden" :
72
- case "aria-selected" :
73
- case "autofocus" :
74
- case "contenteditable" :
75
- case "draggable" :
76
- case "hidden" :
77
- case "multiple" :
78
- case "readonly" :
79
- case "required" :
80
- case "spellcheck" :
81
- break;
82
- case "value" :
83
- el.value = value;
84
- return;
85
- default:
86
- el.setAttribute(key, value);
87
- return;
88
- }
89
- if (value === "true") {
90
- el.setAttribute(key, "");
91
- } else {
92
- el.removeAttribute(key);
93
- }
94
- }
95
-
96
- let DOM = {
97
- setAttrOrProp: setAttrOrProp
98
- };
99
-
100
- let currentOwner = {
101
- contents: undefined
102
- };
103
-
104
- function createOwner() {
105
- return {
106
- disposers: [],
107
- computeds: []
108
- };
109
- }
110
-
111
- function runWithOwner(owner, fn) {
112
- let previousOwner = currentOwner.contents;
113
- currentOwner.contents = owner;
114
- let result = fn();
115
- currentOwner.contents = previousOwner;
116
- return result;
117
- }
118
-
119
- function addDisposer(owner, disposer) {
120
- owner.disposers.push(disposer);
121
- }
122
-
123
- function disposeOwner(owner) {
124
- owner.disposers.forEach(disposer => disposer.dispose());
125
- owner.computeds.forEach(Computed$Xote.dispose);
126
- }
127
-
128
- function setOwner(element, owner) {
129
- ((element["__xote_owner__"] = owner));
130
- }
131
-
132
- function getOwner(element) {
133
- return Primitive_option.fromNullable((element["__xote_owner__"]));
134
- }
135
-
136
- let Reactivity = {
137
- currentOwner: currentOwner,
138
- createOwner: createOwner,
139
- runWithOwner: runWithOwner,
140
- addDisposer: addDisposer,
141
- disposeOwner: disposeOwner,
142
- setOwner: setOwner,
143
- getOwner: getOwner
144
- };
145
-
146
- function $$static(key, value) {
147
- return [
148
- key,
149
- {
150
- TAG: "Static",
151
- _0: value
152
- }
153
- ];
154
- }
155
-
156
- function signal(key, signal$1) {
157
- return [
158
- key,
159
- {
160
- TAG: "SignalValue",
161
- _0: signal$1
162
- }
163
- ];
164
- }
13
+ let signalAttr = View$Xote.signalAttr;
165
14
 
166
- function computed(key, compute) {
167
- return [
168
- key,
169
- {
170
- TAG: "Compute",
171
- _0: compute
172
- }
173
- ];
174
- }
15
+ let computedAttr = View$Xote.computedAttr;
175
16
 
176
- let Attributes = {
177
- $$static: $$static,
178
- signal: signal,
179
- computed: computed
180
- };
17
+ let Attr = View$Xote.Attr;
181
18
 
182
- function disposeElement(el) {
183
- let owner = getOwner(el);
184
- if (owner !== undefined) {
185
- disposeOwner(owner);
186
- }
187
- let childNodes = (Array.from(el.childNodes || []));
188
- childNodes.forEach(disposeElement);
189
- }
19
+ let Render = View$Xote.Render;
190
20
 
191
- function render(node) {
192
- switch (node.TAG) {
193
- case "Element" :
194
- let children = node.children;
195
- let events = node.events;
196
- let attrs = node.attrs;
197
- let tag = node.tag;
198
- let el = Stdlib_Option.isSome(d[tag]) ? document.createElementNS(svgNamespace, tag) : document.createElement(tag);
199
- let owner = {
200
- disposers: [],
201
- computeds: []
202
- };
203
- setOwner(el, owner);
204
- runWithOwner(owner, () => {
205
- let shouldDeferAttrUntilAfterChildren = param => {
206
- if (tag === "select") {
207
- return param[0] === "value";
208
- } else {
209
- return false;
210
- }
211
- };
212
- let applyAttr = param => {
213
- let value = param[1];
214
- let key = param[0];
215
- switch (value.TAG) {
216
- case "Static" :
217
- return setAttrOrProp(el, key, value._0);
218
- case "SignalValue" :
219
- let signal = value._0;
220
- setAttrOrProp(el, key, Signal$Xote.peek(signal));
221
- let disposer = Effect$Xote.runWithDisposer(() => {
222
- setAttrOrProp(el, key, Signal$Xote.get(signal));
223
- }, undefined);
224
- return addDisposer(owner, disposer);
225
- case "Compute" :
226
- let compute = value._0;
227
- let disposer$1 = Effect$Xote.runWithDisposer(() => {
228
- setAttrOrProp(el, key, compute());
229
- }, undefined);
230
- return addDisposer(owner, disposer$1);
231
- }
232
- };
233
- attrs.forEach(attr => {
234
- if (!shouldDeferAttrUntilAfterChildren(attr)) {
235
- return applyAttr(attr);
236
- }
237
- });
238
- events.forEach(param => {
239
- el.addEventListener(param[0], param[1]);
240
- });
241
- children.forEach(child => {
242
- let childEl = render(child);
243
- el.appendChild(childEl);
244
- });
245
- attrs.forEach(attr => {
246
- if (shouldDeferAttrUntilAfterChildren(attr)) {
247
- return applyAttr(attr);
248
- }
249
- });
250
- });
251
- return el;
252
- case "Text" :
253
- return document.createTextNode(node._0);
254
- case "SignalText" :
255
- let signal = node._0;
256
- let textNode = document.createTextNode(Signal$Xote.peek(signal));
257
- let owner$1 = {
258
- disposers: [],
259
- computeds: []
260
- };
261
- setOwner(textNode, owner$1);
262
- runWithOwner(owner$1, () => {
263
- let disposer = Effect$Xote.runWithDisposer(() => {
264
- textNode.textContent = Signal$Xote.get(signal);
265
- }, undefined);
266
- addDisposer(owner$1, disposer);
267
- });
268
- return textNode;
269
- case "Fragment" :
270
- let fragment = document.createDocumentFragment();
271
- node._0.forEach(child => {
272
- let childEl = render(child);
273
- fragment.appendChild(childEl);
274
- });
275
- return fragment;
276
- case "SignalFragment" :
277
- let signal$1 = node._0;
278
- let owner$2 = {
279
- disposers: [],
280
- computeds: []
281
- };
282
- let container = document.createElement("div");
283
- container.setAttribute("style", "display: contents");
284
- setOwner(container, owner$2);
285
- runWithOwner(owner$2, () => {
286
- let disposer = Effect$Xote.runWithDisposer(() => {
287
- let children = Signal$Xote.get(signal$1);
288
- let childNodes = (Array.from(container.childNodes || []));
289
- childNodes.forEach(disposeElement);
290
- ((container.innerHTML = ''));
291
- children.forEach(child => {
292
- let childEl = render(child);
293
- container.appendChild(childEl);
294
- });
295
- }, undefined);
296
- addDisposer(owner$2, disposer);
297
- });
298
- return container;
299
- case "LazyComponent" :
300
- let owner$3 = {
301
- disposers: [],
302
- computeds: []
303
- };
304
- let childNode = runWithOwner(owner$3, node._0);
305
- let el$1 = render(childNode);
306
- setOwner(el$1, owner$3);
307
- return el$1;
308
- case "KeyedList" :
309
- let renderItem = node.renderItem;
310
- let keyFn = node.keyFn;
311
- let signal$2 = node.signal;
312
- let owner$4 = {
313
- disposers: [],
314
- computeds: []
315
- };
316
- let startAnchor = document.createComment(" keyed-list-start ");
317
- let endAnchor = document.createComment(" keyed-list-end ");
318
- setOwner(startAnchor, owner$4);
319
- let keyedItems = {};
320
- let reconcile = () => {
321
- let parentOpt = endAnchor.parentNode;
322
- if (parentOpt == null) {
323
- return;
324
- }
325
- let newItems = Signal$Xote.get(signal$2);
326
- let newKeyMap = {};
327
- newItems.forEach(item => {
328
- newKeyMap[keyFn(item)] = item;
329
- });
330
- let keysToRemove = [];
331
- Object.keys(keyedItems).forEach(key => {
332
- let match = newKeyMap[key];
333
- if (match !== undefined) {
334
- return;
335
- } else {
336
- keysToRemove.push(key);
337
- return;
338
- }
339
- });
340
- keysToRemove.forEach(key => {
341
- let keyedItem = keyedItems[key];
342
- if (keyedItem !== undefined) {
343
- disposeElement(keyedItem.element);
344
- ((keyedItem.element.remove()));
345
- Stdlib_Dict.$$delete(keyedItems, key);
346
- return;
347
- }
348
- });
349
- let newOrder = [];
350
- let elementsToReplace = {};
351
- newItems.forEach(item => {
352
- let key = keyFn(item);
353
- let existing = keyedItems[key];
354
- if (existing !== undefined) {
355
- if (existing.item !== item) {
356
- elementsToReplace[key] = true;
357
- let node = renderItem(item);
358
- let element = render(node);
359
- let keyedItem = {
360
- key: key,
361
- item: item,
362
- element: element
363
- };
364
- newOrder.push(keyedItem);
365
- keyedItems[key] = keyedItem;
366
- return;
367
- }
368
- newOrder.push(existing);
369
- return;
370
- }
371
- let node$1 = renderItem(item);
372
- let element$1 = render(node$1);
373
- let keyedItem$1 = {
374
- key: key,
375
- item: item,
376
- element: element$1
377
- };
378
- newOrder.push(keyedItem$1);
379
- keyedItems[key] = keyedItem$1;
380
- });
381
- let marker = {
382
- contents: startAnchor.nextSibling
383
- };
384
- newOrder.forEach(keyedItem => {
385
- let currentElement = marker.contents;
386
- if (currentElement == null) {
387
- parentOpt.insertBefore(keyedItem.element, endAnchor);
388
- return;
389
- }
390
- if (currentElement === endAnchor) {
391
- parentOpt.insertBefore(keyedItem.element, endAnchor);
392
- return;
393
- }
394
- if (currentElement === keyedItem.element) {
395
- marker.contents = currentElement.nextSibling;
396
- return;
397
- }
398
- let needsReplacement = Stdlib_Option.getOr(elementsToReplace[keyedItem.key], false);
399
- if (needsReplacement) {
400
- disposeElement(currentElement);
401
- parentOpt.replaceChild(keyedItem.element, currentElement);
402
- marker.contents = keyedItem.element.nextSibling;
403
- } else {
404
- parentOpt.insertBefore(keyedItem.element, currentElement);
405
- marker.contents = keyedItem.element.nextSibling;
406
- }
407
- });
408
- };
409
- let fragment$1 = document.createDocumentFragment();
410
- fragment$1.appendChild(startAnchor);
411
- let initialItems = Signal$Xote.peek(signal$2);
412
- initialItems.forEach(item => {
413
- let key = keyFn(item);
414
- let node = renderItem(item);
415
- let element = render(node);
416
- let keyedItem = {
417
- key: key,
418
- item: item,
419
- element: element
420
- };
421
- keyedItems[key] = keyedItem;
422
- fragment$1.appendChild(element);
423
- });
424
- fragment$1.appendChild(endAnchor);
425
- runWithOwner(owner$4, () => {
426
- let disposer = Effect$Xote.runWithDisposer(() => {
427
- reconcile();
428
- }, undefined);
429
- addDisposer(owner$4, disposer);
430
- });
431
- return fragment$1;
432
- }
433
- }
21
+ let text = View$Xote.text;
434
22
 
435
- let Render = {
436
- disposeElement: disposeElement,
437
- render: render
438
- };
23
+ let signalText = View$Xote.signalText;
439
24
 
440
- function text(content) {
441
- return {
442
- TAG: "Text",
443
- _0: content
444
- };
445
- }
25
+ let signalInt = View$Xote.signalInt;
446
26
 
447
- function signalText(compute) {
448
- let signal = Computed$Xote.make(compute, undefined, undefined);
449
- return {
450
- TAG: "SignalText",
451
- _0: signal
452
- };
453
- }
27
+ let signalFloat = View$Xote.signalFloat;
454
28
 
455
- function signalInt(compute) {
456
- let signal = Computed$Xote.make(() => compute().toString(), undefined, undefined);
457
- return {
458
- TAG: "SignalText",
459
- _0: signal
460
- };
461
- }
29
+ let int = View$Xote.int;
462
30
 
463
- function signalFloat(compute) {
464
- let signal = Computed$Xote.make(() => compute().toString(), undefined, undefined);
465
- return {
466
- TAG: "SignalText",
467
- _0: signal
468
- };
469
- }
31
+ let float = View$Xote.float;
470
32
 
471
- function int(value) {
472
- return {
473
- TAG: "Text",
474
- _0: value.toString()
475
- };
476
- }
33
+ let fragment = View$Xote.fragment;
477
34
 
478
- function float(value) {
479
- return {
480
- TAG: "Text",
481
- _0: value.toString()
482
- };
483
- }
35
+ let signalFragment = View$Xote.signalFragment;
484
36
 
485
- function fragment(children) {
486
- return {
487
- TAG: "Fragment",
488
- _0: children
489
- };
490
- }
37
+ let each = View$Xote.each;
491
38
 
492
- function signalFragment(signal) {
493
- return {
494
- TAG: "SignalFragment",
495
- _0: signal
496
- };
497
- }
498
-
499
- function list(signal, renderItem) {
500
- let nodesSignal = Computed$Xote.make(() => Signal$Xote.get(signal).map(renderItem), undefined, undefined);
501
- return {
502
- TAG: "SignalFragment",
503
- _0: nodesSignal
504
- };
505
- }
506
-
507
- function keyedList(signal, keyFn, renderItem) {
508
- return {
509
- TAG: "KeyedList",
510
- signal: signal,
511
- keyFn: keyFn,
512
- renderItem: renderItem
513
- };
514
- }
39
+ let list = View$Xote.list;
515
40
 
516
- function element(tag, attrsOpt, eventsOpt, childrenOpt, param) {
517
- let attrs = attrsOpt !== undefined ? attrsOpt : [].map(x => x);
518
- let events = eventsOpt !== undefined ? eventsOpt : [].map(x => x);
519
- let children = childrenOpt !== undefined ? childrenOpt : [].map(x => x);
520
- return {
521
- TAG: "Element",
522
- tag: tag,
523
- attrs: attrs,
524
- events: events,
525
- children: children
526
- };
527
- }
41
+ let eachWithKey = View$Xote.eachWithKey;
528
42
 
529
- function $$null() {
530
- return {
531
- TAG: "Text",
532
- _0: ""
533
- };
534
- }
43
+ let keyedList = View$Xote.keyedList;
535
44
 
536
- function mount(node, container) {
537
- let el = render(node);
538
- container.appendChild(el);
539
- }
540
-
541
- function mountById(node, containerId) {
542
- let container = document.getElementById(containerId);
543
- if (container == null) {
544
- console.error("Container element not found: " + containerId);
545
- return;
546
- } else {
547
- return mount(node, container);
548
- }
549
- }
45
+ let element = View$Xote.element;
550
46
 
551
- let svgTagSet = d;
47
+ let $$null = View$Xote.$$null;
552
48
 
553
- let attr = $$static;
49
+ let empty = View$Xote.empty;
554
50
 
555
- let signalAttr = signal;
51
+ let mount = View$Xote.mount;
556
52
 
557
- let computedAttr = computed;
53
+ let mountById = View$Xote.mountById;
558
54
 
559
55
  export {
560
- svgNamespace,
561
- svgTags,
562
- svgTagSet,
563
- isSvgTag,
564
56
  DOM,
565
57
  Reactivity,
566
58
  Attributes,
567
59
  attr,
568
60
  signalAttr,
569
61
  computedAttr,
62
+ Attr,
570
63
  Render,
571
64
  text,
572
65
  signalText,
@@ -576,11 +69,14 @@ export {
576
69
  float,
577
70
  fragment,
578
71
  signalFragment,
72
+ each,
579
73
  list,
74
+ eachWithKey,
580
75
  keyedList,
581
76
  element,
582
77
  $$null,
78
+ empty,
583
79
  mount,
584
80
  mountById,
585
81
  }
586
- /* Not a pure module */
82
+ /* View-Xote Not a pure module */
package/src/Prop.res ADDED
@@ -0,0 +1,16 @@
1
+ /* Defines a property that can either be a signal (Reactive) or a static value
2
+ (Static) */
3
+ type t<'a> = Reactive(Signal.t<'a>) | Static('a)
4
+
5
+ let get = value =>
6
+ switch value {
7
+ | Reactive(signal) => Signal.get(signal)
8
+ | Static(value) => value
9
+ }
10
+
11
+ /* Helper functions for creating reactive props */
12
+ let static = value => Static(value)
13
+
14
+ let reactive = signal => Reactive(signal)
15
+
16
+ let signal = reactive
@@ -0,0 +1,35 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Signal$Xote from "./Signal.res.mjs";
4
+
5
+ function get(value) {
6
+ if (value.TAG === "Reactive") {
7
+ return Signal$Xote.get(value._0);
8
+ } else {
9
+ return value._0;
10
+ }
11
+ }
12
+
13
+ function $$static(value) {
14
+ return {
15
+ TAG: "Static",
16
+ _0: value
17
+ };
18
+ }
19
+
20
+ function reactive(signal) {
21
+ return {
22
+ TAG: "Reactive",
23
+ _0: signal
24
+ };
25
+ }
26
+
27
+ let signal = reactive;
28
+
29
+ export {
30
+ get,
31
+ $$static,
32
+ reactive,
33
+ signal,
34
+ }
35
+ /* No side effect */
@@ -1,14 +1,2 @@
1
- /* Defines a property that can either be a signal (Reactive) or a static value
2
- (Static) */
3
- type t<'a> = Reactive(Signal.t<'a>) | Static('a)
4
-
5
- let get = value =>
6
- switch value {
7
- | Reactive(signal) => Signal.get(signal)
8
- | Static(value) => value
9
- }
10
-
11
- /* Helper functions for creating reactive props */
12
- let static = value => Static(value)
13
-
14
- let reactive = signal => Reactive(signal)
1
+ @deprecated("Use Prop instead. ReactiveProp is deprecated and will be removed in a future release.")
2
+ include Prop